Hallo Gemeinde, als Anfänger habe ich ein leichtes Interrupt Problem. Auch nach lange Googlesuche bin ich auf keine Lösung gekommen. Beschreibung: Drehe ich am Encoder, steigen, bzw. fallen die Werte im Display. Drücke ich aber die Taste, geht nichts mehr. Erst nach einem Reset kann man die Werte durch drehen wieder ändern. Für Ratschläge und Hilfe wäre ich sehr dankbar. Grüße Martin
Martin D. schrieb: > Drücke > ich aber die Taste, geht nichts mehr. LCD-Ausgaben sind nicht reentrant, d.h. dürfen nicht durch eine weitere Instanz von sich selbst unterbrochen werden. LCD-Ausgaben im Interrupt sind daher verboten.
Martin D. schrieb: > Für Ratschläge und Hilfe wäre ich sehr dankbar. In deiner Interrupt-Routine <void setzen()> druckst du auf das LCD. Das könnte zuviel Zeit verbraten. Versuche das zu vermeiden indem du dort nur ein globales Flag setzt und die Ausgabe deines Ereignisses in der Hauptschleife machst (Flag, volatile, zurücksetzen nicht vergessen).
Martin D. schrieb: > Erst nach einem Reset kann man die > Werte durch drehen wieder ändern. Wire benötigt selber Interrupts. Diese werden in deiner ISR abgeschaltet. Stehen dann nicht zur Verfügung. Folge: Der I2C Bus bleibt stehen.
Sobald man nur ein paar Sekunden seine Gedanken sortiert kommt ein PeDa daher und weiss es schneller ....
Hallo PeterD, vielen Dank, Problem gelöst. Grüße Martin
Ruft man da nicht in der Timer_isr encoder->service() auf und holt sich in der main mit encoder->getButton() den Zustand des kNopfes? (gedrückt, losgelassen, doppelklick usw.)? Also im mitgelieferten Beispiel machen die das so. https://github.com/grappendorf/arduino-framework/blob/master/ClickEncoder/examples/ClickEncoderTest/ClickEncoderTest.ino edit: kopf = Knopf
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.