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