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