www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ISR-Rücksprung


Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich habe leider das Problem, dass mein Assembler-Code (>10KB) auf
meinem  ATMega16 spinnt, sobald in der Nähe der ISR's auch nur noch
ein einziger NOP-Befehl hinzukommt. Ich habe eingesehen, dass ich jetzt
wohl den mühsamen Weg gehen muss und den ganzen Code auf korrekte
Rücksprünge usw. kontrollieren muss (kein ret nach jmp usw.).
Ich habe auch schon eine Stelle gefunden, welche ein Problem darstellen
kann: In einer ISR will ich am Ende erzwingen, zu einem bestimmten Punkt
im Hauptprogramm zurückzuspringen. Das mache ich zur Zeit mit:
...
sei
jmp loop
...
Ich weiß, eigentlich sollte ich am Ende mit "reti" rausspringen, weil
die Rücksprungadresse noch im Stack gespeichert ist. Gibt es eine
Möglichkeit das eleganter zu machen? Kann ich vielleicht irgendwie eine
fest definierte Rücksprungadresse auf den Stack pushen und wenn ja, wie
geht das?
besten Dank im Voraus,
Oliver

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.

  "In einer ISR will ich am Ende erzwingen, zu einem
  bestimmten Punkt im Hauptprogramm zurückzuspringen."

Wozu macht man sowas?

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Frage taucht regelmäßig auf, aber eben nur bei Anfängern.

Dein Hauptproblem ist eine nicht durchdachte Programmplanung.

Ein Interrupt wird nicht innerhalb des Kontextes aufgerufen, sondern
völlig willkürlich. Deshalb kann er nunmal nicht zum Kontext
zurückkehren.

Und deshalb muß Dein Programm crashen.


Wenn  es gar nicht anders geht, kann man ein Flag setzen, welches in
den jeweiligen Funktionen getestet wird und diese dann vorzeitig
verläßt, bis Du schließlich regulär im gerade aktiven Aufrufbaum an der
gewünschten Stelle angekommen bist und dort das Flag wieder löschst.

Einzige Ausnahme ist der Sprung ausm Interrupt nach 0000
(Software-Reset), d.h. alle Variablen, Peripherie und der Stack werden
wieder neu initialisiert.
Oftmals wird aber kein Sprung gemacht, sondern der Watchdog gestartet
und gewartet, bis er abläuft, dann sind auch sämtliche IO-Register
resettet.


Peter

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rufus
Mein Programm besteht aus 12 Unterprogrammen, welche jeweils eine
Endlosschleife haben. Nur ein Interrupt (ext Int0) kann ein Wechsel von
einem zum anderen Unterprogramm erzwingen, indem ich in seiner ISR das
anzuspringende Unterprogramm adressiere und dann im Hauptprogramm mit
dem ICALL-Befehl dahinspringe.
Das ganze ist also eine Menüsteuerung, welche mittels
Interruptauslösenden Taster realisiert ist. Ich habe es daher gemacht,
weil das Gerät zusätzlich mit diesem Interrupt aus dem Power Save Mode
geholt werden soll.

Autor: Jadeclaw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist trotzdem Murks.
Da es Endlosschleifen sind, sollte es kein Problem sein, im
Interrupthandler die Tastennummer abzulegen, mit RETI da rauszugehen
und in der Programmschleife dann anhand der Tastennummer den Wechsel
auszulösen.
Für solche Aktionen hat der ATmega aber auch einen Speziellen Befehl:
ICALL

Gruss
Jadeclaw.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sehe ich auch ein und bin auch schon gewillt mein Programm
dahingehend zu ändern. Aber kann diese Geschichte auslöser für mein
Problem sein (ein NOP zuviel in der ISR und die Kiste macht nicht mehr
das was sie soll)?
Oliver

Autor: Jadeclaw (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sie ist es.

Gruss
Jadeclaw.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, dann mach ich mich mal an die Arbeit! Alle ISRs erhalten ordentliche
RETIs am Ende. Falls das schlußendlich mein Problem nicht gelöst haben
sollte, lasse ich diesen Thread wieder aufleben.
besten Dank für Eure Hilfe!
Oliver

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.