mikrocontroller.net

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


Autor: Roger Koller (roschee)
Datum:
Angehängte Dateien:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Roger Koller (roschee)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Roger Koller (roschee)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

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.