Forum: Mikrocontroller und Digitale Elektronik Arduino mit Schieberegister 74HC595 + LEDs , warum funktioiert dieses Programm nicht?


von t800w (Gast)


Lesenswert?

Hallo,
ich habe mit meinem Freund eine Schaltung aufgebaut, die aus zwei 
Schieberegister 74HC595, und an diesen sind LEDs angeschlossen, um die 
Signalausgabe zu kontrollieren. Die Schieberegister und die LEDs 
funktionieren mit anderen Codes Bsp. 0B0101010101010101 perfekt. Doch 
jetzt lassen wir den Code hochzählen. Dabei sind die letzten 8 Ziffern 
gleich. Nachdem die 8 Ziffern gemeinsam den Wert 11111111 erreicht haben 
Schaltet der vorhergehende Code eins hoch. Die ersten vier Ziffern 
bleiben dabei immer konstant.

Somit lautet die Zusammensetzung folgendermaßen:

0B   1001          0000         0001       0001
   konstant    Mothercode     zwei gleiche Codes

dazu die Tabelle des Arduinos zur Veranschaulichung:

=====================================
MotherCode: 0
=====================================
1001000000000000
1001000000010001
1001000000100010
1001000000110011
1001000001000100
1001000001010101
1001000001100110
1001000001110111
1001000010001000
1001000010011001
1001000010101010
1001000010111011
1001000011001100
1001000011011101
1001000011101110
1001000011111111
=====================================
MotherCode: 1
=====================================
1001000100000000
1001000100010001
1001000100100010
1001000100110011
1001000101000100
1001000101010101
1001000101100110
1001000101110111
1001000110001000
1001000110011001
1001000110101010
1001000110111011
1001000111001100
1001000111011101
1001000111101110
1001000111111111
=====================================
MotherCode: 10
=====================================
1001001000000000
1001001000010001
1001001000100010
1001001000110011
1001001001000100
1001001001010101
1001001001100110
1001001001110111
1001001010001000
1001001010011001
1001001010101010
1001001010111011
1001001011001100
1001001011011101
1001001011101110
1001001011111111
=====================================
MotherCode: 11
=====================================
1001001100000000
1001001100010001
1001001100100010
1001001100110011
1001001101000100
1001001101010101
1001001101100110
1001001101110111
1001001110001000
1001001110011001
1001001110101010
1001001110111011
1001001111001100
1001001111011101
1001001111101110
1001001111111111


Doch wenn ich diesen Code zum Schieberegister schicke, werden alle LEDs 
auf HIGH gesetzt, woran liegt das?
Das ist das Programm:

---------------------------------------------------------


int speicherPin = 10;
int taktPin     = 11;
int datenPin    = 9;
long motherCode = 0;

void setup() {

  Serial.begin(9600);

}

void loop() {

  Serial.println("=====================================");
  Serial.print("MotherCode: ");
  Serial.println(motherCode, BIN);
  Serial.println("=====================================");

  sendBytes(65499);
  delay(1000);

  for(int regalCodeCounter = 0; regalCodeCounter < 16; 
regalCodeCounter++) {

    long fullCode = (0B1001 << 4) + motherCode;  // 1001 + motherCode
    fullCode = fullCode << 8;                   // 1001 + motherCode + 
0000 0000
    fullCode += getRegalCode(regalCodeCounter); // 1001 + motherCode + 
regalCode


    sendBytes(fullCode);
    Serial.println(fullCode,BIN);
    delay(1000);


  }

  delay(1000);   // Eine Sekunde Verzögerung für jeden neuen MotherCode

  motherCode++; // MotherCode hochzählen

  if(motherCode == 16) // MotherCode zurücksetzen
    motherCode = 0;

}

// Generiere den RegalCode, welcher aus zwei identischen Zahlen besteht
int getRegalCode(long regalCodeCounter) {

  long sendRegalCode = 0B11111111;

  sendRegalCode = regalCodeCounter << 4;
  sendRegalCode += regalCodeCounter;

  return sendRegalCode;

}

void sendBytes(long data) {

  digitalWrite(speicherPin, LOW);
  shiftOut(datenPin, taktPin, MSBFIRST, data >> 8);
  shiftOut(datenPin, taktPin, MSBFIRST, data & 255);
  digitalWrite(speicherPin, HIGH);

}

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

t800w schrieb:
> Doch wenn ich diesen Code zum Schieberegister schicke, werden alle LEDs
> auf HIGH gesetzt, woran liegt das?
1
   pinMode(speicherPin, OUTPUT);
2
   pinMode(taktPin, OUTPUT);
3
   pinMode(datenPin, OUTPUT);

 Daran.

von Peter D. (peda)


Lesenswert?

Es ist ziemlich verwirrend, wenn Du Variablen und Parameter als long 
(32Bit) deklarierst, aber davon nur 16Bit verwendest.

Vorzugsweise nimmt man eindeutige Typen, wie z.B. uint16_t.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.