Forum: Mikrocontroller und Digitale Elektronik Was passiert ohne sei(), wenn dies im Programm gesetzt wird


von Daniel (Gast)


Lesenswert?

Hallo,

Prozessor AVR Atmega8

ich habe eine Frage.
Angenommen ich habe ein ICP Interrupt, schalte aber die globalen 
Interrupts nicht frei, also schreibe im Code kein sei();
Interrupt Vektor ist konfiguriert auf eine Flanke.

Was passiert im Prozessor? Wird das Interrupt Flag im Interrupt Status 
Register für das Input Capture gesetzt?

Konkreter:
Im Programm treten ICP Interrupts auf, aber globale Interrupts sind 
nicht freigeschaltet. Nun schaltet das Programm aber die globalen 
Interrupts irgendwann frei. Wird das Interrupt dann direkt ausgeführt 
(weil evtl. im Status Register das Flag gesetzt wurde) oder erst beim 
nächsten Interrupt-Auftritt?

von Thomas E. (thomase)


Lesenswert?

Daniel schrieb:
> Wird das Interrupt Flag im Interrupt Status
> Register für das Input Capture gesetzt?
Ja.
Das bleibt dann solange stehen, bis es gelöscht wird. Also üblicherweise 
beim Sprung auf den Interruptvektor.

> Wird das Interrupt dann direkt ausgeführt
> (weil evtl. im Status Register das Flag gesetzt wurde)
Ja.
Wenn du das verhindern willst, musst du das Flag vor dem Aufruf von 
sei() löschen(1 reinschreiben).

mfg.

von Peter D. (peda)


Lesenswert?

Überlege mal logisch.
Interrupts sind in der Regel nicht nur höllisch eilig, sondern auch 
höllisch wichtig.
Und da wäre es doch saublöd, wenn bei zeitweiliger Interruptsperre (z.B. 
atomarer Zugriff) alle Interrupts verloren gingen.

Auch muß man Interruptereignisse nicht unbedingt in einem Interrupt 
behandeln. Man kann auch das Interrupt-Pending-Flag per Code testen, 
rücksetzen und behandeln. Das nennt sich dann Polling.


Peter

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