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.
Gast
#7070472
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).
Gast
#7070475
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.
Gast
#7070476
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.