einzelnen output bei mehreren shiftregistern

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.

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.

was muss ich am code ändern?

liebe grüße
briziel

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

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.

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

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

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);

}

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

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