PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt Priorität ändern?



roboter
18.04.2007, 18:38
Hallo,

ich habe ein Problem mit den Interrupts bei meinem Programm.
Ich benutze den ATMega8 und brauche den SIG_OUTPUT_COMPARE2 und den SIG_OVERFLOW0. Ich habe natürlich versucht die Interrupt sehr kurz zu halten, allerdings wird der Compare2 Interrupt sehr häufig aufgerufen. Abundzu wird ein Ausgangspin auf 1 gesetzt und der Timer0 gestartet. Wenn dann der Overflow0 auftritt, soll der Ausgangspin wieder auf 0 gesetzt werden. Allerdings habe ich festgestellt das der Overflow0 manchmal nicht kommt und der Ausgangspin nicht zurückgesetzt wird. Kann es sein das zur gleichen Zeit compare2 und overflow0 auftreten und der oderflow0 mit niedrigerer Priorität nicht ausgeführt wird?
Wie kann man diesen Fehler abfangen?

Könnte ich beim Aufruf von Compare2 einfach den sei() Befehl benutzten, so dass der Overflow0 den compare2 unterbricht? Ich weiß, das ist unschön programmiert, aber im Overflow0 wird nur ein pin auf 0 gesetzt, sollte sich also nicht zu sehr verschachteln...

Hubert.G
19.04.2007, 09:22
Hallo
Wenn du keine Flags veränderst geht kein Interrupt verloren, es wird einer nach dem anderen, in Abhängigkeit der ISR-Adresse abgearbeitet.
Es ist möglich die ISR sofort wieder freizugeben, du musst dir die ISR-Flags ansehen welche du setzen oder löschen musst.
Hubert

jar
19.04.2007, 14:29
Hallo
Wenn du keine Flags veränderst geht kein Interrupt verloren, es wird einer nach dem anderen, in Abhängigkeit der ISR-Adresse abgearbeitet.
Hubert

muss ich nun nach den Addressen schauen , oder kannst du mir die Priorität, Wertikkeit nennen ? ich suche immer noch nach der IRQ Reihenfolge, würde gerne wenn möglich die priorisieren sprich ordnen,
es sind mir halt welche wichtiger und sollen vorrangig bedient werden, andere können später bedient werden

1. ms Timer CTC OCR Flag, werden nur Var erhöht, dürfte keine 2µs dauern, kann ich ja mal messen
2. RC5 grübel ich noch welcher Eingang optimal wäre
3. DCF77, der kann sich fast ewig Zeit lassen, ob ich nun eine Pulsbreite zwischen 100ms-60ms , zwischen 200ms-125ms feststelle ist mir so egal

Pascal
19.04.2007, 14:36
Die Adresse gibt die Rangordnung an. Bei den AVRs kannst du die Reihenfolge nicht ändern, die ist fest vorgegeben.