Was muss bei einer Interrupt-Routine alles gerettet werden??

Gast #100822
Lesenswert?
• ▲
▼
Hallo allerseits,

ich programmiere momentan gerade einen Atmel AT90S2313. In meinem
Programm möchte ich gerne eine Interrupt-Routine laufen lassen. Nun
stehe ich vor dem Problem, dass ich in der I-Routine eine
Programmverzweigung benötige.
Hierfür ist es doch erforderlich bestimmte Register per POP & PUSH zu
sichern, oder?? Kann mir jemand sagen, wie ich es hinbekomme, dass nach
dem Sprung das Programm an der richtigen Stelle abläuft??

Folgenden Code habe ich:

int0_handler:
in temp, pind
sbrc temp, 4
rcall rueck

vorwaerts:
adiw Messwertl, 1
rcall serout
reti

rueck:
sbiw Messwertl, 1
rcall serout
reti

Problem: Wenn das Unterprogramm rueck ausgeführt wird, wird nicht die
Interrupt-Routine verlassen, sondern bei vorwaerts eingesprungen.

Gruß Michi
Gast #100823
Lesenswert?
• ▲
▼
Hallo Michi,

wenn Du in int0_handler einen cal auf rueck machst, dann springt der
ret aus rueck auch dorthin wieder zurück. Danach fehlt der reti um
wieder ins Hauptprogramm zurückzukehren.

Aber wenn ich das richtig verstehe, dann sollte ein rjmp rueck anstelle
rcall rueck das machen was Du möchtest.

Was retten:
Alles das was das Hauptprogramm nicht gewünscht beeinflußt. Also im
Detail:
- Das Statusregister (da i.d.R. Flags geändert werden)
- Alle Register die verwendet werden.

Volkmar
Gast #100825
Lesenswert?
• ▲
▼
Aus der Erinnerung heraus (habe schon lange nichts mehr mit Assembler
gemacht):

push r16
in r16, SREG
push r16

und dann zum Abschluß:
pop r16
out SREG, r16
pop r16
reti

Man muß ein Register dafür misbrauchen. Und dieses muß dann vorher
gesichert werden, da es verändert wird.

Volkmar
Gast #100830
Lesenswert?
• ▲
▼
Einfach alles sichern würde zuviel Performance kosten. "Soweit er davon
weiß" setze ich mit "Solange alles in C geschrieben ist" gleich. D.h.
das was GCC selber verursacht ist ihm bekannt und kann er auch sichern.

Wenn die ISR komplett in Assembler geschrieben ist, wird man es selber
machen müssen. Wenn Du inline Assembler in einer ISR benutzt, bin ich,
ehrlich gesagt, überfragt. Zur Not mit einem kleinen Testprogramm
selber ausprobieren ;-)

Volkmar

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.