Durch HW-Interrupt im Quellcode springen

OP #1668461
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
#1668729
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
#1668734
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.