Forum: Mikrocontroller und Digitale Elektronik Durch HW-Interrupt im Quellcode springen


von Johannes H. (serverone)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von Johannes H. (serverone)


Lesenswert?

Hallo,

Danke für die Antworten.

Dann werde ich es so machen: entprellen, Variablen setzen, öfter im 
Hauptprogramm den Status der Variablen vergleichen.

Jojo

von Falk B. (falk)


Lesenswert?

Siehe auch Multitasking

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
Noch kein Account? Hier anmelden.