mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupts


Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günter König (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Günter König (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas Diemer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.