Forum: Mikrocontroller und Digitale Elektronik Interrupts


von Günter König (Gast)


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

von Jonas Diemer (Gast)


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

von Günter König (Gast)


Angehängte Dateien:

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

von Jonas Diemer (Gast)


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.

von Günter König (Gast)


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

von Jonas Diemer (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.