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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.