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
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
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
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.
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
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!
Eine eigene Frage?
Dieser Thread ist über 24 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.