Forum: Compiler & IDEs Probleme beim Debuggen von Interrupts mit WINAVR 4.


von Roger K. (roschee)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin Neuling und taste mich gerade an die Timer heran.
Aktuell habe ich ein Problem mit dem Debugger von WINAVR 4.15.
In meinem Main() Programm gibt es eine While Endlos Schleife die nichts 
tut und nur auf Interrupts wartet. Wenn ein Capture Compare Interrupt 
ausgeloest wird, dann springt er in die Interrupt Routine und nach 
Ausfuehren des reti() Befehls springt er nicht wie von mir erwartet in 
die while Schleife sondern an den Anfang von main. Das ist dumm, da hier 
dann meine Startwerte wieder initalisiert werden.

Nun haette ich gerne gewusst warum, das so ist ?
Ich war der Meinung, dass nach Beenden des Interrupts der Reti Befehl 
genau dahin zurueckspringt von dort er zuvor in den Interrupt gesprungen 
ist.

Als zweite Frage hatte ich noch folgendes, was ich nicht ganz verstanden 
habe, obwohl ich unzaehlige Forenbeitraege durchgelesen habe.
Muss ich in der Interrupt Routine die Befehle cli und sei ausfuehren. 
Ich will naemlich dass wenn gerade die Interrupt Routine ausgefuehrt 
wird, kein neuer Interrupt meinen Laufenden Interrupt unterbricht.


Im voraus schon meinen besten Dank

Roger

von Johannes M. (johnny-m)


Lesenswert?

Bitte lies das AVR-GCC-Tutorial! In C gibt es kein reti(). Außerdem 
ist es unsinnig, für nicht aktivierte Interrupts Handler anzulegen. Und 
nein, in die Interrupt Handler kommt kein cli() und sei() rein. Das 
macht die Hardware automatisch. Außerdem ist die Schreibweise mit 
0bXXXXXXXX für Steuerregister wenig geeignet. Steht aber alles im 
Tutorial und im Artikel Bitmanipulation.

von Johannes M. (johnny-m)


Lesenswert?

Ach ja, ein "WINAVR 4.15" gibt es ebenfalls nicht. 
WINAVR-Versionsnummern bestehen immer aus dem Release-Datum. Was Du 
meinst ist vermutlich AVRStudio 4.15, das aber zunächst nichts mit 
WINAVR zu tun hat.

von Roger K. (roschee)


Lesenswert?

Besten Dank fuer die schnelle und gute Info.


So nun habe ich die reti() Funktion herausgenommen. Ich benutze aktuell 
den AT90s8515 auf meinem STK500 board.
Nun tritt aber das Problem auf, dass nur noch die Interrupt Routine 
ISR(TIMER1_COMPA_vect) ausgefuehrt wird und nicht mehr zurueck zu der 
while Schleife gesprungen wird.

Zu den beiden angesprochenen Punkten, habe ich folgende Erklaerung :

Ich habe deswegen alle anderen Interrupt Funktionen in meinem Code 
stehen, damit ich sehen kann, ob er vielleicht in die falsche Interrupt 
Routine springt.

Zu dem Punkt WINAVR war dies ein Fehler meiner Seits. Ich meinte das AVR 
Studio 4.15


Gruss

Roger

von Johannes M. (johnny-m)


Lesenswert?

Ist in den Configuration Options und im Simulator der richtige 
Controller eingestellt? BTW: Der 90S8515 ist schon fast historisch 
wertvoll. Nimm bei Gelegenheit mal was aktuelleres...

von Johannes M. (johnny-m)


Lesenswert?

> TIFR |= 0b01000000; // Output compare Flag reset
Das ist übrigens nicht gut. Die Anweisung löscht alle eventuell 
gesetzten Flags in TIFR. Zugriffe auf Interrupt-Flag-Register macht man 
nicht mit Read-Modify-Write-Operationen, sondern durch ein einfaches 
direktes Hineinschreiben der Maske. Also das "|" vor dem "=" weglassen.

Ein "|=" liest immer den aktuellen Zustand ein, verODERt den Wert mit 
dem anderen Operanden und schreibt das Ergebnis zurück. Alle Bits, in 
denen beim Einlesen eine 1 stand, werden auch mit einer 1 
zurückgeschrieben. Eine 1 in ein Interrupt Flag schreiben heißt aber, 
dass das Flag gelöscht wird. Und das ist in dem Zusammenhang nicht immer 
erwünscht...

von Roger K. (roschee)


Lesenswert?

Ich wollte eigentlich nur dieses eine Flag loeschen, hatte aber an 
diesen Zusammenhang nicht gedacht.

Ist es richtig, dass ich dieses Flag wieder zuruecksetzen muss, falls 
ich will, das beim naechsten Capture Compare Erfolg ein erneuter 
Interrupt ausgeloest wird.


Gruss

Roger

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Nein, fast alle der Interruptflags werden beim Eintritt in die ISR
von der Hardware selbst gelöscht.  (Die wenigen Ausnahmen sind bei
der jeweiligen Baugruppe im Datenblatt dann erläutert.  UART und
TWI fallen mir auf Anhieb ein.)

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.