3 Schieberegister über Adruino ansteuern - Aber wie???

Fragen zu Schaltungen, Elektronik, Elektrik usw.

Moderator: T.Hoffmann

Antworten
decke
User
User
Beiträge: 12
Registriert: Do, 17.01.13, 01:00

Fr, 05.04.13, 18:42

Hallo,
ich bin jetzt schon ein paar Stunden am nachdenken und versuchen ein drittes Schieberegister vom Typ 74HC595 in meine Schaltung einzubauen.
Ich habe es schon mit 2 Registern geschafft. Wie ein Schieberegister arbeitet habe ich verstanden, hoffe ich zumindest :P.

Zum Test wollte ich einen 3 Byte Zähler mit 24 LEDs aufbauen, mit 16 klappte es wie gesagt bereits.
Wie das jetzt aussieht wenn noch ein drittes hinzukommt kann ich mir nur teilweise vorstellen.

Ausschnitt meines Codes:

Code: Alles auswählen

void loop(){
  wert = 0;
  for(int i = 0; i < 16777216; i++){
    digitalWrite(speicherPin, LOW);
    shiftOut(datenPin, taktPin, MSBFIRST, wert >> 16);
    shiftOut(datenPin, taktPin, MSBFIRST, wert & 65280);
    shiftOut(datenPin, taktPin, MSBFIRST, wert >> 8);
    shiftOut(datenPin, taktPin, MSBFIRST, wert & 255);
    digitalWrite(speicherPin, HIGH);
    wert = wert++;
    delay(2);
  }
}
Kann mir einer vielleicht sagen ob ich hier irgendetwas am Code falsch gemacht habe?
Danke schonmal für die Antworten :)

decke
decke
User
User
Beiträge: 12
Registriert: Do, 17.01.13, 01:00

Sa, 06.04.13, 17:16

Weiß keiner wie das funktioniert? :(
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 06.04.13, 19:24

Ich denke mal es liegt daran, dass C hier nicht so geläufig ist. Bei Basic hättest du schon mindestens eine Antwort.
Ich kann in deinem Schnipsel oben zwar grob erkennen, was passiert, aber zur Fehlersuche reichts lange nicht.

Eine Gegenfrage wäre auch: Was funktioniert denn nicht? Bekommst du nicht die Anzeige die du willst, oder gar keine? Ein Schieberegister schiebt Bit für Bit, wenn vorn ein neues reinkommt. Wenn zwei funktionieren, dann weißt du anscheinend, wie die Pins zum kaskadieren angeschlossen werden. Da sollte der Fehler deshalb wohl nicht sein.

Von den 74HC595 hab ich schon 9 Stück kaskadiert. Gehen tuts auf jeden Fall :wink:
decke
User
User
Beiträge: 12
Registriert: Do, 17.01.13, 01:00

Sa, 06.04.13, 20:40

Ich habe die drei Register angeschlossen und miteinander verbunden,
jetzt Zählt funktioniert der Zähler aber nur bis 16 Bit danach fängt es von vorn an, als ob das dritte Schieberegister nicht existieren würde.
Ich werde mal ein anderen Sketch auf mein Arduino aufspielen, welcher mir eine 3 Byte-Zahl anzeigt und schauen ob das funktioniert. Wenn das nicht geht muss ich ja irgendwo ein Fehler in der Schaltung haben...
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Sa, 06.04.13, 21:09

Wie ist denn die Variable 'wert' typisiert? Wenn das nur eine 16 Bit Variable ist, kann es ja auch nur 16 Bit (und nicht 24 oder 32Bit) Werte zählen...
decke
User
User
Beiträge: 12
Registriert: Do, 17.01.13, 01:00

Sa, 06.04.13, 21:24

die "wert"-Variable hat den Datentyp Integer
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Sa, 06.04.13, 21:25

Ich kenne jetzt auch den C Dialekt für den Arduino nicht genau. Aber in den meisten Sprachen ist ein integer eine 16Bit variable. Gibt es auch 'long'? Das ist meist 32Bit...
decke
User
User
Beiträge: 12
Registriert: Do, 17.01.13, 01:00

Sa, 06.04.13, 22:28

ja das stimmt habs jetzt geändert allerdings funktoiniert es immer noch nicht bzw. nur bis 2 Byte.
Ich habe jetzt wert als Integer deklariert und i ebenfalls.
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 06.04.13, 22:38

Schiebe doch einfach mal nur ein byte raus und schaue, ob es durch alle drei Schieberegister wandert. Dann weisst du schonmal, dass die Hardware stimmt.
Ich weiss auch nicht was die Arduino-Software kann, aber bei sowas würde ich mit nem byte-Array arbeiten. Pro Register ein byte und dann weiß man immer genau was man hat.
decke
User
User
Beiträge: 12
Registriert: Do, 17.01.13, 01:00

Sa, 06.04.13, 23:07

Also ich habe pro Schieberegister 8 LEDs an die Q-Ausgänge geschaltet, bin jetzt auch soweit, dass wenn ich den Sketch neu hochlade, dass das dritte Byte auch kurz aufleuchtet.

Was genau meinst du mit "einem Byte reinschieben und gucken ob es durch die anderen Register läuft?"



Und das ist jetzt der komplette Sketch. (Soll nur eine Zahl ausgeben) --> B 1111 1111 1111 1111 1111 1111

Code: Alles auswählen

int taktPin = 8;
int speicherPin = 9;
int datenPin = 10;
long wert = 16777215;


void setup(){
  pinMode(taktPin, OUTPUT);
  pinMode(speicherPin, OUTPUT);
  pinMode(datenPin, OUTPUT);
}

void loop(){
    digitalWrite(speicherPin, LOW);
    shiftOut(datenPin, taktPin, MSBFIRST, wert >> 16);
    shiftOut(datenPin, taktPin, MSBFIRST, wert & 65280);
    shiftOut(datenPin, taktPin, MSBFIRST, wert >> 8);
    shiftOut(datenPin, taktPin, MSBFIRST, wert & 255);
    digitalWrite(speicherPin, HIGH);
}
Benutzeravatar
Achim H
Star-Admin
Star-Admin
Beiträge: 13067
Registriert: Mi, 14.11.07, 02:14
Wohnort: Herdecke (NRW)
Kontaktdaten:

So, 07.04.13, 12:11

C ist ähnlich wie php. Und von php habe ich etwas Ahnung.

8bit = 256
Wenn 0 mitgezählt werden soll, entsprechend n-1 = 255

Schieberegister 1 --> 0 - 255
Schieberegister 2 --> 256 - 65535 (256 x 256 - 1)
Schieberegister 3 --> 65536 - 16777215 (256 x 256 x 256 - 1)
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

So, 07.04.13, 13:54

Probier mal:

Code: Alles auswählen

    int taktPin = 8;
    int speicherPin = 9;
    int datenPin = 10;
    unsigned long wert = 16777215;


    void setup(){
      pinMode(taktPin, OUTPUT);
      pinMode(speicherPin, OUTPUT);
      pinMode(datenPin, OUTPUT);
    }

    void loop(){
        digitalWrite(speicherPin, LOW);
        shiftOut(datenPin, taktPin, MSBFIRST, wert >> 16);
        shiftOut(datenPin, taktPin, MSBFIRST, wert >> 8);
        shiftOut(datenPin, taktPin, MSBFIRST, wert);
        digitalWrite(speicherPin, HIGH);
    }
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

So, 07.04.13, 14:30

decke hat geschrieben: Was genau meinst du mit "einem Byte reinschieben und gucken ob es durch die anderen Register läuft?"
Wenn Du 1 bit in den Eingang des ersten Schieberegisters schiebst, dann schiebt das Regsister alle seine aktuellen Bits um ein weiter, damit das neue Bit vorne Platz hat. Das letzte Bit würde jetzt bei einem einzigen Schieberegister einfach wegfallen. Wenn dort aber ein zweites angeschlossen ist, dann geht das Bit nicht verloren, sondern steht nun im Platz 1 des zweiten Registers.

Wenn Du nun ein Byte (8 bits) raussendest, dann füllt dieses das erste Register. Sendest Du nach z.B. 2 Sec ein zweites, dann wird das vorherige ins zweite Register geschoben, das neu gesendete steht im ersten. Sendest Du nach weiteren 2 Sec ein drittes Byte, wandert das erste, was aktuell im zweiten Register steht, ins dritte Register. Das als zweites gesendete Byte wandert nun ins zweite Register und das gerade eben gesendete steht nun im ersten Register.

Auch auf die Gefahr hin, dass ich jetzt erklärt habe, was Du eh schon weist. Aber das mein ich damit.
Antworten