Hallo miteinander!
Meine Baustelle aus meinem vorigen Topic läuft auf einen LED- Streifen hinaus, der radial in einem Fahrradrad montiert rotieren und dabei bspw. Buchstaben anzeigen soll (ähnlich einem Monkeylight oder einer Propelleruhr).
Nach mehreren Fehlversuchen soll das nun mit 595- Schiebregistern laufen. Die Ausgabe von Buchstaben in je mehreren Spalten hintereinander funktioniert.
Zwecks besserer Auflösung hatte ich vor, zwei LED- Streifen an zwei gegenüberliegenden Stellen des Rades zu montieren, zeitversetzt und so am selben Ort anzusteuern. Ich habe mir vorgestellt, dass ich den Inhalt des ersten Streifens etwas zeitversetzt auf dem Zweiten anzeigen kann.
Die Streifen (je 16 LEDs an zwei kaskadierten 595- Registern) funktionieren an sich und auch zeitgleich. Sobald ich zum Beobachten den einen sehr viel später (1/2 bis 1 Sekunde) als den anderen ansteuern will, zeigen sie aber nicht mehr dasselbe an. Es ist, als würden die per shiftOut() über verschiedene Clock- und Data- Pins ausgegebenen Bytes überlagert werden/ durcheinanderkommen.
Im Code rufe ich nacheinander verschiedene Buchstaben auf. Solange der selbe Buchstabe angezeigt werden soll, sollte sich der anzuzeigene Wert nicht ändern, es gibt aber ein paar delay()s, jedoch keine Interrupts.
Daher eine grundsätzliche Frage:
Der Code wird doch grundlegen nacheinander abgearbeitet?! Ich rufe in der Hauptfunktion eine andere auf, die wiederum eine weitere aufruft, danach soll es zurück in die Hauptfunktion gehen.
Kann es sein, dass die Hauptfunktion weiterläuft, während die Unterfunktionen noch nicht fertig sind, weil sie per delay() verzögert werden? Kann daher der darzustellende Wert plötzlich ein anderer sein?
Auch bei beliebigem Zeitversatz sollten die beiden Displays doch trotzdem den gleichen Inhalt zeigen?! Das Muster für Buchstabe B sollte doch erst NACH dem Abarbeiten der ganzen vorigen Funktionen (Darstellung des Buchstaben A) überhaupt abgerufen werden?
Wenn wer eine Idee für eine unkompliziertere Lösung hat, würde ich mich freuen.
Gruß,
Moritz
Mein Code der Länge wegen per Cloud
Ich habe versucht, mein Vorhaben zu skizzieren:
loop() {
Buchstabe('A');
delay(50);
Buchstabe('B');
[...]
}
Buchstabe(char buchst) {
switch (buchst) {
case 'A':
ledWrite(0b10010101); // bin- Werte nur beispielhaft
ledWrite(0b10100101);
ledWrite(0b01001101);
ledWrite(0b00100111);
[....]
}
}
ledWrite(byte var) {
shiftOut(data_1, shift_1, MSBFIRST, var); // erst die Darstellung auf Display 1
digitalWrite(store_1, HIGH);
digitalWrite(store_1, LOW);
delay(500);
shiftOut(data_2, shift_2, MSBFIRST, var); // DANN die Darstellung auf Display 2
digitalWrite(store_2, HIGH);
digitalWrite(store_2, LOW);
}