AVR: External Interrupt Flag Register (EIFR) löschen

Gast #4774381
Lesenswert?

Hallo,

ich hab eine vielleicht etwas blöde Fragen zum löschen von Flags im 
External Interrupt Flag Register (EIFR) eines AVRs (konkret at90can128). 
Ich möchte das Register pollen um Änderungen an Pins zu detektieren 
(setzen wir mal voraus, dass es in dem konkreten Kontext Sinn macht, 
hier keine ISR zu triggern). Ich habe das Datenblatt soweit verstanden, 
dass ich ein Flag in diesem Register lösche, indem ich es setze ("[...] 
the flag can be cleared by writing a logical one to it."). Angenommen 
ich möchte das komplette Register nach dem Auslesen zurücksetzen, 
schreibe ich dann

a) seinen unmittelbar vormaligen Zustand in das Register zurück, sodass 
nur dort das Flag gelöscht wird, wo es vormals gesetzt war

oder

b) kann ich einfach 0xFF in das Register schreiben und somit alle Flags 
löschen, also auch die, die vorher nicht gesetzt waren.

Die Frage ist dabei natürlich, welche Funktion eine zurückgeschriebene 0 
für das Flag hat.

Kann jemand dazu etwas sagen?

Vielen Dank!
#4774401
Lesenswert?

mpunkt schrieb:
> a) seinen unmittelbar vormaligen Zustand in das Register zurück, sodass
> nur dort das Flag gelöscht wird, wo es vormals gesetzt war

Ja. Man löscht mit gesetzen Bit genau jene, die man bearbeitet hat und 
löschen will.

> b) kann ich einfach 0xFF in das Register schreiben und somit alle Flags
> löschen, also auch die, die vorher nicht gesetzt waren.

Ja, das geht auch. Aber man löscht dann wirklich alle.

> Die Frage ist dabei natürlich, welche Funktion eine zurückgeschriebene 0
> für das Flag hat.

Keine.

Der Sinn des zunächst irritierenden Verfahrens liegt darin, nur jene 
Flags zu löschen, die man schon als gesetzt identifiziert hat. Löscht 
man mit 0xFF alle, dann löscht man auch jene, die seit dem Auslesen neu 
gesetzt wurden. Die gehen dann verloren.
Gast #4774456
Lesenswert?

Es ist schon manchmal günstig, Interrupt-Flags als Merker
für stattgefundene Ereignisse zu nutzen.
So z.B. wenn eine anderere Interruptroutine mit minimaler
Verzögerung bearbeitet werden soll.

Ein weiterer Vorteil des Flag-Löschens ist, dass bei der Freigabe
eines Interrupts dieser nicht sofort durch veraltete Ereignisse
ausgelöst wird.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren