Probleme beim Debuggen von Interrupts mit WINAVR 4.

OP #1206616
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
Angehängte Dateien:
#1206663
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.
OP #1206706
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
#1206751
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...
OP #1206789
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren