Hallo,
ich habe an einem Nano zwei Schieberegister 74HC595 in Reihe geschaltet, über die ich einen Barcode mit 16 LED ansteuere. An einem analogen Eingang habe ich ein Poti angeschlossen. Ich will nun analog zur Potistellung am Eingang eine entsprechende Anzahl von LED leuchten lassen.
Ich habe dazu ein Sketch geschrieben, zunächst mit digitalWrite-Befehlen, hier der Teil der Datenübergabe ans Register (ledCount ist hier 16):
for (int i = 0; i < ledCount; i++) {
resetPins(); // Pin-Reset zur Vorbereitung für Takt-Flankensteuerung
digitalWrite(datenPin, ledArray[i]);
digitalWrite(taktPin, HIGH);
Serial.println(ledArray[i]); //Anzeige der Zustände der Array-Ausgänge
}
digitalWrite(speicherPin, HIGH); //Aktivierung der Ausgänge des Schieberegisters
delay(200);
}
//Reset des Takt- und Speicherpins zur Vorbereitung der neuen Datenübergabe:
void resetPins() {
digitalWrite(taktPin, LOW);
digitalWrite(speicherPin, LOW);
}
Das funktioniert tadellos, am seriellen Monitor werden die jeweiligen Bits des Array (=Ausgänge Schieberegister) entsprechend dem ausgelesenen Rohwert am Poti-Eingang korrekt angezeigt und die LEDs leuchten auch so.
Wenn ich im oberen Code die beiden Zeilen
digitalWrite(datenPin, ledArray[i]);
digitalWrite(taktPin, HIGH);
durch
shiftOut(datenPin, taktPin, MSBFIRST, ledArray[i]);
ersetze, werden mir am seriellen Monitor die selben Werte angezeigt (also eigentlich alles ok), aber es werden nur die jeweils ersten LED an den beiden Schieberegistern bei Maximalwerten am analogen Eingang angesteuert. Sobald der Wert unter 14 (von 16 LED) geht, leuchtet keine mehr.
Nun bin ich etwas ratlos, anscheinend interpretiere ich die Funktionsweise des shiftOut-Befehls nicht richtig. Weiß jemand einen Rat?
fragt:
der Lutze
im Anhang der komplette Sketch.
Poti_ShiftReg_BarGr_mit_map_u_mehr_Reg_ShiftOut.ino (2.33 KB)