Forum: Mikrocontroller und Digitale Elektronik Atmega 8 - Interrupt flags


von Interrupts (Gast)


Lesenswert?

Hallo allerseits,

ich habe eine Frage zu den externen Interrutps beim Atmega 8.

Und zwar ist mir nicht ganz klar, was ich mit den INTF1 und INTF2 aus 
dem Register GIFR anstellen muss.

Werden diese Flags automatisch resettet, wenn die
ISR(INT0_vect){;}
aufgerufen wird, oder muss ich beim verlassen der Interruptroutine die 
Flags eigenhändig löschen?


Dabei bin ich auch über ein Detail gestolpert:

und zwar habe ich hier im Forum gelesen, dass die Interrutp-Flags bei 
einer '0' gesetzt wären und bei einer '1' resettet. Im Datenblatt habe 
ich auf Seite 15 im zweiten Absatz gleichlautendes gefunden, dort steht:

>>Interrupt Flags can also be cleared by writing
>>a logic one to the flag
>>bit position(s) to be cleared


Wenn ich mir aber nun die Initial-Values aus dem Register GIFR ansehe, 
dann stehen die dort bereits auf '0'... d.h. die Interrupts wären 
demnach doch von Anfang an ausgelöst...

Außerdem steht in den Erläuterungen zu diesem Register, dass die Flags 
bei einer '1'


mfg

von Michael B. (mb_)


Lesenswert?

Interrupts schrieb:
> Werden diese Flags automatisch resettet, wenn die
> ISR(INT0_vect){;}

Ja. Steht auch so im Datenblatt.

>>>Interrupt Flags can also be cleared by writing
>>>a logic one to the flag
>>>bit position(s) to be cleared
>
>
> Wenn ich mir aber nun die Initial-Values aus dem Register GIFR ansehe,
> dann stehen die dort bereits auf '0'... d.h. die Interrupts wären
> demnach doch von Anfang an ausgelöst...

Sie werden mit dem Schreiben einer 1 resetted. Das sagt noch nichts 
darüber aus, was eine gelesene 1 bedeutet.

Wenn man eine 1 in das Register schreibt, liest man eine 0 zurück.

von Helfer (Gast)


Lesenswert?

> Wenn ich mir aber nun die Initial-Values aus dem Register GIFR ansehe,
> dann stehen die dort bereits auf '0'... d.h. die Interrupts wären
> demnach doch von Anfang an ausgelöst...

Wieso meinst du denn das? Wenn das Interruptflag 0 ist, ist der 
Interrupt nicht aufgetreten. Wenn das Interruptflag 1 ist, ist der 
Interrupt aufgetreten.

> Werden diese Flags automatisch resettet, wenn die ISR(INT0_vect)
> aufgerufen wird, oder muss ich beim verlassen der Interruptroutine die
> Flags eigenhändig löschen?

INTF1 und INTF2 haben mit dem externen Interrupt INT0 nichts zu tun. Bei 
INT0 wird INTF0 verwendet. INTF2 gibt es beim Atmega8 nicht.

Das Flag wird beim Einspringen in die ISR gelöscht. Du musst bei 
Interrupts im Hinterkopf behalten "Wo einer ist, kommen leicht noch 
mehr". Wenn du ein vermeindliches Flag-wird-nicht-gelöscht beobachtest, 
kann es sein, dass das Flag schon vom nächsten Interrupt gleicher Sorte 
gesetzt wurde.

Deshalb kann es Sinn machen nach dem Abschalten (disable) einer 
Interruptquelle (z.B. in der ISR) zur Sicherheit ein inzwischen 
aufgelaufenes Interruptflag zu löschen. Alternativ löscht man zur 
Sicherheit das Interruptflag unmittelbar bevor man eine Interruptquelle 
aktiviert (enable).

Das Löschen eines Interruptflags an sich funktioniert durch Beschreiben 
mit dem Bit 1. Wichtig ist dabei die absolute Schreibzuweisung; man 
sollte dort nicht mit der bei PINs/PORTs etc. üblichen Bitmanipulation 
ODER arbeiten, weil mit dem ODER auch andere Bits nachteilig beeinflusst 
werden!

von Interrupts (Gast)


Lesenswert?

äh ja, ich meinte die INTF0 und INTF1.

Löschen:
GIFR = (1<<INF1);

Setzen: (wohl unnötig soetwas softwareseitig machen zu wollen?)
GIFR = ~(1<<INTF1);


danke und fg

von spess53 (Gast)


Lesenswert?

Hi

>Setzen: (wohl unnötig soetwas softwareseitig machen zu wollen?)
>GIFR = ~(1<<INTF1);

Setzen geht nicht.

MfG Spess

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.