Hallo,
Ich möchte mit zwei Schieberegistern 16 Buttons auswerten. Dazu habe ich folgenden Sketch geschrieben:
uint8_t dataInPin = 8;
uint8_t dataOutPin = 9;
uint8_t latchPin = 10;
uint8_t clockPin = 11;
void setup() {
Serial.begin(9600);
pinMode(latchPin, OUTPUT);
pinMode(dataOutPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataInPin, INPUT);
}
void loop() {
for (uint16_t test_bit = 1; test_bit > 0; (test_bit = test_bit << 1)) { //schiebe die 1 durch alle 16 bits.
digitalWrite(latchPin, 0);
shiftOut(dataOutPin, clockPin, MSBFIRST, (test_bit >> 8)); //Highbyte schieben
shiftOut(dataOutPin, clockPin, MSBFIRST, test_bit); //Lowbyte schieben
digitalWrite(latchPin, 1);
if (digitalRead(dataInPin)) { // prüfe ob der aktuell High geschaltete Ausgang zum Eingang zurück geführt wird
Serial.print(test_bit, BIN); // btw: eine fertige Funktion die Binärwerte mit führenden Nullen ausgibt hat Serial nicht, oder? (selbst schreiben ist den Aufwand hier nicht wert)
Serial.println(" ist gedrückt");
}
}
}
Die Schalung ist aufgebaut wie im Anhang und funktioniert grundsätzlich. Es werden alle Buttons korrekt erkannt. Auch mehrere gleichzeitig gedrückte Buttons werden erkannt. Außer beim ersten Button, der "1 ist gedrückt" ausgibt. Wenn dieser gedrückt ist werden alle anderen Buttons ignoriert. Why is this? Da alle Buttons identisch angeschlossen sind liegt der fehler vermutlich im Code, aber ich komme nicht drauf.
Frage am Rande, was mir eben beim zeichnen aufgefallen ist: Wenn mehrere Buttons gedrückt sind sind ja High und Low geschaltete Ausgänge der M74HC595 verbunden. Darf man das überhaupt? Sollte da eine Strombegrenzung, oder besser noch Dioden dazwischen? - Eine Stunde Testlauf haben die Register bisher überlebt.
Danke, deine Antwort kam schneller als ich editieren konnte. Das "=" hatte ich zuletzt eingefügt und noch nicht getestet. Natürlich kann das nicht funktionieren, weil die Abbruchbedingung ja niemals erreicht wird. Ist auch schon wieder raus aus dem Sketch.
Das hat mit dem Problem aber leider nicht zu tun.
Ich weiß nicht was Du mit dem Kurzschließen von Ausgängen mittels Tastern bezwecken willst.
Wenn Du die Tasterzustände einlesen willst brauchst Du ein PISO (Paralell IN Serial OUT) Shift-Register zB 74HC165 und nicht ein SIPO.
Grüße Uwe
Nö, braucht es nicht, geht wunderbar mit SIPO, siehe Schaltplan.
Man legt alle Schalter parallel auf einen einzigen digitalIn. Dann legt man mit dem Schieberegister nacheinander jeweils einen Schalter auf +5V und alle anderen auf GND und prüft ob am digitalIn etwas ankommt, daraus kann man schließen ob der Schalter gedrückt ist oder nicht.
Was das kurzschließen angeht: zur Not müsste wohl eine Diode rein, da bin ich mir nicht sicher.Geht auch ohne, keine Ahnung obs irgendwann abraucht.
oK, jetzt hab ich verstanden.
Kurze Gegenfrage: Was passiert wenn 2 Taster GLEICHZEITIG gedrückt sind?
Nimm 165 Schieberegister und basta. Du bruchst noch Pullup oder Pulldown-Widerstände. Deine Schaltung ist höchst gefährlich.
Du hast Recht, mit einer Diode pro Taster kann man das entschärfen aber wieso macht man sich die Arbeit wenn es ohne Dioden und zusätzlichen digitalen Eingang und ein simples Widerstandsnetzwerk geht.
Hauptsächlich weil ich nicht der Typ bin der in den Laden geht und die einfachste fertige Lösung kauft. Eigentlich will ich nur aus den Registern die hier rumliegen etwas basteln. LED Matrizen und Würfel habe ich schon genügend gebaut, will mal was anderes daraus machen. Ob diese Schaltung überhaupt jemals zum Einsatz kommt weiß ich nicht. In einem anderen Projekt vielleicht, aber das ist ein DUE mit momentan genügend freien Pins um alle 16 Buttons sogar einzeln anzuschließen, mal sehen.
Ein Pulldown ist vorhanden, ganz rechts unten eingezeichnet.
Wenn zwei Schalter gleichzeitig gedrückt werden gibt es einen Kurzschluss zwischen Vcc und GND, ist mir wie gesagt auch erst beim Zeichnen aufgefallen, nachdem die Schaltung schon über eine Stunde erfolgreich lief.
Ich denke dass es Widerstände statt Dioden eigentlich schon tun müssten. Zusammen mit dem Pulldown ergibt sich dann zwar ein Spannungsteiler, aber beispielsweise 2k Ohm zwischen Register und Schalter sollten als Strombegrenzung genügen und noch genug Pegel geben um als digital High erkannt zu werden.
Je mehr ich darüber nachdenke, desto mehr vermute ich dass dieser Kurzschluss auch die Ursache meines Problems sein könnte. Zwar seltsam dass sämtliche Tastenkombinationen, selbst mit 15 Buttons gleichzeitig, korrekt erkannt werden, und nur Button 1 Probleme macht, aber könnte sein. Ich werde nun mal Widerstände einbauen und testen.