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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.