> GIFR ist noch nicht ganz klar.. Wenn ein Inerruptanforderung
> vorliegt
> wird ein "1" im GIFR geschrieben. Wenn man aber diese loeschen
> moechte, schreibt man wieder eine "1" rein ? Hmm .. Dann ist ja
> immer
> eine "1" drin ?
GFIR enthält die vom externen Ereignis (Pegelwechsel) gesetzten Flags
für beide Interrupts (INTF0, INTF1). Tritt das in MCUCR (Datenblatt
Mega8, Seite 64) vorgewählte Ereignis ein, dann wird das zugehörige
Flag in GIFR (DB, S. 66) gesetzt. Ist auch das zugehörige Bit in GICR
(DB, S. 65) gesetzt, dann wird der zugehörige Int-Vektor angesprungen,
nachdem die Rücksprungadresse (für RETI) auf dem Stack gesichert wurde.
Durch den Aufruf des Interrupt-Vektors wird das Flag in GIFR wieder
gelöscht (cleared by Hardware).
Will man es manuell löschen, so ist keine 0 in das Bit zu schreiben,
sondern eine 1. Siehe Datenblatt Seite 66.
> "Jobflag"
Ich (nicht nur ich) reserviere mir gern ein Register, in dem ich mir
bis zu 8 Boolsche Variablen zur Programmablaufsteuerung anlege. Das
Register nenne ich bisher "flags", aber der Name "jobs" ist wohl
treffender. Die einzelnen Bits stehen für unterschiedliche zu
erledigenden Aufgaben. Irgendein Programmteil (meist ein Interrupt)
vergibt einen Auftrag, indem das zugehörige Jobflag gesetzt wird.
In der Mainloop werden dann alle Jobflags der Reihe nach abgefragt und
wenn eines gesetzt ist, wird die zugehörige Rüutine aufgerufen. Diese
Routine löscht dann das Jobflag und erledigt den Job.
Dies entlastet Interrupt-Services-Routinen (ISRs), da diese recht kurz
sein müssen.
Dauert die Abarbeitung einer ISR zu lange, können andere in dieser Zeit
auftretende Interrupts nicht bzw. nur verspätet abgearbeitet werden, was
unter Umständen zum Verschlucken von Interrupts führen kann.
Ein Beispiel für den Umgang mit Jobflags findest du hier:
http://www.hanneslux.de/avr/zuenduhr/ZndUhr01.asm
Es ist das Register "flags" (r23), in dem 7 Boolsche Variablen
gehalten werden. Dabei sind die Bits "neusek" und "lcdtakt" als
Jobflags zu sehen, sie werden im Timer-Interrupt gesetzt und beim
Erledigen des Jobs wieder gelöscht.
> Meinst du damit die Do-Loop Hauptscheife
Nunja, bei mir ist das die Mainloop, beginnend mit dem Label
"mainloop:" und endend mit "rjmp mainloop" nach "sleep". Dies
sorgt dafür, dass alle zu erledigenden Jobs ausgeführt werden und
danach in den Sleep-Mode gefallen wird. Ein auftretender Interrupt
weckt den AVR aus dem Sleep-Zustand, führt die ISR aus und springt
danach über den nach sleep stehenden Befehl "rjmp mainloop" die
Hauptschleife aus, bis alle Jobflags gelöscht sind, dann wird wieder
geschlafen, bis der nächste Interrupt "klingelt".
...