Interrupts

Gast #4497
Lesenswert?
• ▲
▼
Hi liebe Leute,

mal eine allgemeine Frage zu Interrupts:

.org $0000
rjmp initio
rjmp alarm
rjmp testo

.org $000f

main:
ldi r27,$00
ldi r28,$70
rjmp main

Dies ist das Beispiel-Hauptprogramm und die Interrupttabelle. Alle 
Register zum Auslösen der externen Interrupts sind gesetzt.
Nach dem Auslösen des Interrupts INT1 wird die Routine "testo" 
angesprungen:

testo:
in r0,$3f
push r0
nop
nop
.....
.....
rcall abc
rcall efg
nop
.....
rjmp rde
rjmp ztr
.....

irq_end:

pop r0
out $3f,r0
reti

Aus dieser Interruptroutine wird ja nun weiter in Sub-Routinen 
gesprungen, z.B nach rde. Aus den Sub-Routinen nach dem Sprung wird 
entweder mit ret oder mit rjmp und Branch-Befehlen nach "irq_end" 
zurückgehüpft. Eigentlich sollte dann das Hauptprogramm normal 
weiterlaufen bis zum nächsten Interrupt, aber das tut es nicht. Es 
funktioniert nur ein einziges mal......

Warum nur?
Ich danke euch.

Gruß,
Günter
Gast #4498
Lesenswert?
• ▲
▼
das kann eigentlich nur daran liegen, dass du den stack versaust. :-)

1) prüfe, ob push und pop "balanciert" sind... also genausooft pushen, 
wie poppen.

2) wenn du mit rcall in eine unterroutine springst, MUSST du mit ret 
zurückkehren, sonst liegt die rücksprungadresse noch aufm stack. (wenn 
du unbedingt rjumpen willst dann poppe vorher die rücksprungadresse).

ansonsten schau dir das ganze dochmal im simulator an... dort müsstest 
du eigentlich sehen, was schiefläuft.

cu
Gast #4499
Lesenswert?
• ▲
▼
Tag auch Jonas,

sehr seltsam das Ganze. Push und Pop sind O.K.. Dort wo mit rcall 
hingesprungen wird, gehts auch mit ret wieder zurück. Und im Simulator 
(AVR Studio4) bleibt er bei "TX_READY" hängen.
Die Routinen sind einzeln lauffähig, nur mit dem Interrupt will es nicht 
klappen.

Ich habe den "Erguss" mal diesem Beitrag hinzugefügt, Vielleicht kannst 
du ihn dir ja mal anschauen.

Gruß,
Günter
Angehängte Dateien:
Gast #4500
Lesenswert?
• ▲
▼
momentan recht wenig zeit, beim überfliegen ist mir nix verdächtiges 
aufgefallen...

nimm tx ready raus zum testen (gleich wieder mit ret zurück). klar dass 
er dort hängen bleibt, ohne hardware...

dann startest du im sim und löst dann manuell den interrupt aus. sollte 
dann auffallen, was nicht hinhaut.
Gast #4501
Lesenswert?
• ▲
▼
Moin moin Jonas,

so tat ich wie mir geheißen.......,

Ergebniss: im AVR Studio läuft das Programm durch. Wobei im ersten Lauf 
die Interrupts nicht aktiviert sind. Alle Init-Routinen werden 
abgearbeitet und landet dann im "Main Programm" in einer Schleife.
Aufgefallen ist mir nur, das WCOL-Flag wird gesetzt und das bleibt auch 
so.

Löse ich einen Interrupt aus, wird verzweigt, abgearbeitet und landet 
letztlich wieder in der Schleife.

Der Stackpointer ist zu Beginn auf $015F gesetzt. Nach dem Abarbeiten 
der Routinen (Programm befindet sich wieder in der Schleife) steht der 
Pointer wieder auf $015F. Das bedeutet doch, das alle Subroutinen und 
Verzweigungen korrekt abgeschlossen wurden und auch die Interruptroutine 
ist sauber abgeschlossen worden, odertäusche ich mich da?

Die grauen Haare sprießen.......

Gruß und Dank,
Günter
Gast #4502
Lesenswert?
• ▲
▼
eigentlich sollte das so laufen... komisch.

in der schaltung wird nur 1mal in den interrupt gegangen, richtig? zum 
debuggen könntest du noch folgendes versuchen (um rauszubekommen, an 
welcher stelle es hakt):

schließ eine oder mehrere leds an und schalte sie im interrupt an 
verschiedenen stellen an. dann siehste evtl, wo er stehen bleibt. 
vielleicht liegts ja wirklich an txready?

viel glück beim debuggen!

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.