Offline
Newbie
Karma: 0
Posts: 2
|
 |
« on: January 10, 2013, 09:35:19 am » |
hallo zusammen, ich hab dieses turtorial zum einstieg in die welt der ernsthaften arduino programmierung und bastellei gemacht und soweit erfolgreich als dass alles funktioniert. http://arduino.cc/en/Tutorial/ShiftOutnun habe ich allerdings das problem, dass ich keine ahnung habe, wie ich bei zwei in reihe geschaltete shift registern jeden output einzeln ansteuern kann. ist das überhaupt möglich? ich möchte es schaffen dass ich mittels konsole einen wert von 0 bis 15 eingebe und die jeweilige pin leuchtet. ich habe dafür diesen codeschnipsel genommen: allerdings leuchten dann auf jedem shift register jeweils eine led. http://arduino.cc/en/Tutorial/ShftOut12was muss ich am code ändern? liebe grüße briziel
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
BZ (I)
Offline
Brattain Member
Karma: 162
Posts: 15760
+39 349 2158303
|
 |
« Reply #1 on: January 10, 2013, 09:38:44 am » |
Du schaltest die 595 hintereinander und gibst 2 mal eine 8 Bit Zahl mittels Shiftout aus (eine für das eine 595 und die zweite für das 2. 595). wie auf http://arduino.cc/en/Tutorial/ShiftOut unter 1. Add a second shift register. beschrieben. shiftOut(dataPin, clockPin, dataGREEN); shiftOut(dataPin, clockPin, dataRED); grüße Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Edison Member
Karma: 18
Posts: 1297
|
 |
« Reply #2 on: January 10, 2013, 09:47:35 am » |
Der Beispielcode den Du verlinkt hast ist ja nur für ein Register, poste doch mal Deinen Code den Du verwendest. Unabhängig davon musst Du aber immer ALLE Werte übertragen. Und zwar immer das Byte zuerst für das letzte Shiftregister in der Kette. Danach dann den Wert für das zweitletzte Register und so weiter. Nehmen wir mal an, die LEDs an den Shiftregistern wären von 0 bis 15 durchnummeriert und die Nummer "0" ist die LED die am nächsten am Arduino dran ist. Dann sind die Bits 0 bis 7 für das erste und die Bits 8 bis 15 für das zweite Shiftregister. Willst Du die 9 einschalten, dann sind die Bits 0 bis 7 alle Null und damit das Byte für das erste Register auch = 0. Die 9 ist dann das 2. Bit des zweiten Registers (9-7=2) also sowas B00000010 = 2. Da man das letzte Byte zuerst übertragen muss, musst Du nun per shiftOut() erst das zweite Byte (Wert 2) und danach das erste Byte (Wert 0) in die Schieberegister schieben.
|
|
|
|
|
Logged
|
|
|
|
|
Wien
Offline
God Member
Karma: 9
Posts: 793
|
 |
« Reply #3 on: January 10, 2013, 10:42:10 am » |
hi,
und ich weiß nicht, ob Du das mit dem reinschieben der bytes schon richtig verstehst, deshalb vorsichtshalber, schreibe nicht: shiftOut(dataPin, clockPin, 12); shiftOut(dataPin, clockPin, 47);
sondern
shiftOut(dataPin, clockPin, B00001100); shiftOut(dataPin, clockPin, B00101111);
das sind die gleichen bytes, aber in binärdarstellung, und wo die einsen sind, leuchten die leds. entschuldige den hinweis, wenn Dir das klar war, aber das ist meistens das verständnisproblem...
gruß stefan
|
|
|
|
|
Logged
|
|
|
|
|
AREA COLOGNE
Offline
God Member
Karma: 12
Posts: 809
I am 1 of 10 who understands binary
|
 |
« Reply #4 on: January 10, 2013, 12:16:33 pm » |
Ich habe es auch schon mal gemacht. Man kann z.B. mit dieser kleinen Funktion machen Aufbau wäre bei meiner Funktion Arduino===>74HC595====>74HC595 Pins sähen so aus 16,15,14.............3,2,1 byte ShByte1=0; // global Definieren vor void setup Byte 1 für das Shiftregister 1 byte ShByte2=0; //global Definieren vor void setup Byte 2 für das Shiftregister 2
void loop (){
ShiftWrite(13,HIGH); // Schreibt die bei zwei Registern das 13 Pin von Rechts auf High vorrausgesetzt das rechte Reigster ist das zweite in der Reihe digitalWrite(latchPin, LOW); shiftOut(dataPin, clock, LSBFIRST, ShByte1); // Muss in die Loop shiftOut(dataPin, clock, LSBFIRST, ShByte2); // Muss in die Loop digitalWrite(latchPin, HIGH); }
void ShiftWrite(int Pin,boolean State){ if (Pin<=8){ bitWrite(ShByte1,Pin,State); // Damit schreibst du einzelne Bits in den ShiftBytes } if (Pin>=9||Pin<=16){ bitWrite(ShByte2,Pin-8,State); // Damit schreibst du einzelne Bits in den ShiftBytes } }
ungetestet aber müsste funktionieren Gruß Der Dani
|
|
|
|
« Last Edit: January 10, 2013, 12:21:53 pm by volvodani »
|
Logged
|
Eine Glatze ist wohl die AUSGEFALLENste Frisur von allen.
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 2
|
 |
« Reply #5 on: January 14, 2013, 09:33:25 am » |
ich benutze folgenden code aus dem beispiel: bewirkt wird, dass per konsole eine eine zahl zwischen 0 und 7 eingegeben wird und dann die jeweilige led aufleuchtet. nun habe ich 4 shift register in reihe geschaltet und weiß nicht genau wie ich den code so verändere dass ich sie richtig adressiere, bzw wie ich überhaupt adressiere. leider hab ich das beispiel nicht ganz verstanden. da ich ja nun 4 x 8 ausgänge hab muss ich dann shiftOut(dataPin, clockPin, B00001100B00001100B00001100B00001100); schreiben? ich bin totaler anfänger und hab mich leider damit etwas übernommen. wäre tortzdem cool wenn ihr mir das versucht zu erklären. lieben dank vorallem für die bisherigen antworten. /* Shift Register Example for 74HC595 shift register
This sketch turns reads serial input and uses it to set the pins of a 74HC595 shift register.
Hardware: * 74HC595 shift register attached to pins 2, 3, and 4 of the Arduino, as detailed below. * LEDs attached to each of the outputs of the shift register
Created 22 May 2009 Created 23 Mar 2010 by Tom Igoe
*/
//Pin connected to latch pin (ST_CP) of 74HC595 const int latchPin = 8; //Pin connected to clock pin (SH_CP) of 74HC595 const int clockPin = 12; ////Pin connected to Data in (DS) of 74HC595 const int dataPin = 11;
void setup() { //set pins to output because they are addressed in the main loop pinMode(latchPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(clockPin, OUTPUT); Serial.begin(9600); Serial.println("reset"); }
void loop() { if (Serial.available() > 0) { // ASCII '0' through '9' characters are // represented by the values 48 through 57. // so if the user types a number from 0 through 9 in ASCII, // you can subtract 48 to get the actual value: int bitToSet = Serial.read() - 48;
// write to the shift register with the correct bit set high: registerWrite(bitToSet, HIGH); } }
// This method sends bits to the shift register:
void registerWrite(int whichPin, int whichState) { // the bits you want to send byte bitsToSend = 0;
// turn off the output so the pins don't light up // while you're shifting bits: digitalWrite(latchPin, LOW);
// turn on the next highest bit in bitsToSend: bitWrite(bitsToSend, whichPin, whichState);
// shift the bits out: shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend);
// turn on the output so the LEDs can light up: digitalWrite(latchPin, HIGH);
}
|
|
|
|
|
Logged
|
|
|
|
|
Wien
Offline
God Member
Karma: 9
Posts: 793
|
 |
« Reply #6 on: January 14, 2013, 11:05:47 am » |
hi,
nein, Du mußt schreiben:
shiftOut(dataPin, clockPin, MSBFIRST, B00001100); shiftOut(dataPin, clockPin, MSBFIRST, B00001100); shiftOut(dataPin, clockPin, MSBFIRST, B00001100); shiftOut(dataPin, clockPin, MSBFIRST, B00001100);
mit dem ersten shiftout lieferst Du die daten für den letzten IC, weil eben (schieberegister) immer weitergeschoben wird... dann setz' die einsen anders und schau Dir die änderungen an, das gibt dann das AHA-erlebnis.
gruß stefan
|
|
|
|
|
Logged
|
|
|
|
|
Wien
Offline
God Member
Karma: 9
Posts: 793
|
 |
« Reply #7 on: January 14, 2013, 11:12:09 am » |
hab' mir Deinen code erst jetzt angesehen, der macht das ja anders. lösch alles aus der loop und schreibe rein:
digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, B00001100); shiftOut(dataPin, clockPin, MSBFIRST, B00001100); shiftOut(dataPin, clockPin, MSBFIRST, B00001100); shiftOut(dataPin, clockPin, MSBFIRST, B00001100); digitalWrite(latchPin, HIGH); delay(3000);
es geht erstmal ums verständnis, eleganz kommt erst später...
gruß stefan
|
|
|
|
|
Logged
|
|
|
|
|
|