ich hab dieses turtorial zum einstieg in die welt der ernsthaften arduino programmierung und bastellei gemacht und soweit erfolgreich als dass alles funktioniert.
nun 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.
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.
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.
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);
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...
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
}
}
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.
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);
}
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.