mikrocontroller.net

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


Autor: Johannes Höntsch (serverone)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes Höntsch (serverone)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe auch Multitasking

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.