Hallo, ich habe mal etwas mit Interrupts rumgebastelt. Das wenn ich einen Taster drücke, eine LED z.B. kurz aufleuchtet, geht ohne Probleme. Nun soll bei einem Interrupt (durch Tastendruck an PCINT0 ausgelöst) in der ISR die Anweisung zum Sprung an den Anfang einer Endlosschleife (ca. 30 Sekunden Dauer) gegeben werden, falls eben der Tastendruck vor einem vollen Durchlauf der Schleife geschieht. Der ATmega168 kann nicht komplett resettet werden, weil am Anfang ein Init abläuft. Wie kann man das am besten lösen? Wenn ich eine per volatile initialisierte Variable in der ISR setze, müsste ja praktisch vor jeder Anweisung in der Endlosschleife überprüft werden, ob die Variable gesetzt ist und wenn, zum Start gesprungen werden. Aber die Aufgabe von Interrupts ist ja Polling zu umgehen, so weit ich das mal gelernt habe. Oder gibt es da einen ganz anderen, sinnvolleren Weg, durch ein Tastenereignis zu einer bestimmten Stelle zu springen? Beitrag "Aus Interrupt springen ohne an "Auslösepunkt" zu gelangen" hier wird wohl anfangs die Manipulation der eigentlichen Rücksprungadresse im Stack gesprochen. Wenn ich mir aus der erstellten Assembler-Datei (arbeite mit C) die Startadresse der Schleife hole, könnte das dann so gehen? - So langsam ergibt es vielleicht doch Sinn, dass wir Assembler in Grundzügen gelernt haben ;) . Vielen Dank für Antworten Jojo
setjmp, longjmp Aber generell verschlechtert man dadurch die Wartbarkeit und Erweiterbarkeit des Codes drastisch. Daher kann man setjmp, longjmp in den meisten Programmen nichtmal mit der Lupe finden. Bessere Lösung, man erstellt erstmal einen Programmablaufplan und programmiert dann. Tip: Der Mensch ist schnarchlahm gegenüber dem MC. Daher kann man ruhig noch 300ms was anderes geordnet beenden und die Reaktion wird trotzdem als sofort empfunden. Es reicht also in 99,99% aller Programme, im Interrupt die Taste zu entprellen, ein Flag zu setzen und dieses dann an einer oder wenigen Stellen in der Mainloop auszuwerten. Peter
@ Johannes Höntsch (serverone) >Wie kann man das am besten lösen? Mit einer Variablen, wie du schon festgestellt hast. Siehe Interrupt. > Wenn ich eine per volatile >initialisierte Variable in der ISR setze, müsste ja praktisch vor jeder >Anweisung in der Endlosschleife überprüft werden, ob die Variable >gesetzt ist und wenn, zum Start gesprungen werden. Aber die Aufgabe von >Interrupts ist ja Polling zu umgehen, so weit ich das mal gelernt habe. Das Abfragen einer Variablen ist kein Polling. >Oder gibt es da einen ganz anderen, sinnvolleren Weg, durch ein >Tastenereignis zu einer bestimmten Stelle zu springen? KEIN Goto!!! >hier wird wohl anfangs die Manipulation der eigentlichen >Rücksprungadresse im Stack gesprochen. Noch größerer Murks! > Wenn ich mir aus der erstellten >Assembler-Datei (arbeite mit C) die Startadresse der Schleife hole, >könnte das dann so gehen? Ohje! Nein! Mach es RICHTIG! Mit einer Variablen und deren Abfrage im Hauptprogramm. MFG Falk
Hallo, Danke für die Antworten. Dann werde ich es so machen: entprellen, Variablen setzen, öfter im Hauptprogramm den Status der Variablen vergleichen. Jojo
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.