© Harry Broeders.
Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Academie voor Technology, Innovation & Society Delft.
Lees eerst: Bitn..... voor beginners.
Bij bepaalde gebeurtenissen (events) zal de AVR microcontroller een bit in een van de I/O registers 1 maken. De programmeur kan de waarde van dit bitje testen om te kijken of de gebeurtenis is opgetreden. Het is ook mogelijk om de AVR bij zo'n gebeurtenis een interrupt op te laten wekken maar we gaan er hier vanuit dat dit niet gedaan is. Een bit dat gebruikt wordt om een bepaalde gebeurtenis aan te geven wordt meestal een vlag (Engels: flag) genoemd. Al in de Romeinse tijd werden vlaggen namelijk gebruikt voor het doorgeven van signalen (gebeurtenissen) en ook nu worden vlaggen nog vaak gebruikt om signalen (gebeurtenissen) door te geven. Hieronder zie je een paar voorbeelden:
|
|
|
Als de vlag die door de AVR gehesen is, is opgemerkt door het programma dan moet het programma de vlag weer strijken (de bit moet weer 0 worden). Zodat de vlag bij de volgende gebeurtenis weer geset kan worden. Een vlag in een van de I/O register van de AVR kan gereset (gestreken) worden door een 1 naar de vlag te schrijven. Raar maar waar!
De Timer/Counter0 van de AVR maakt de TOV0
vlag in het
TIFR
register 1 als het TCNT0
register "overloopt"
van 0xFF
naar 0x00
.
Als de TOV0
vlag door de Timer/Counter0 1 gemaakt is dan kan
de vlag weer 0 gemaakt worden door er een 1 naar toe te schrijven.
Je zou misschien verwachten dat dit geprogrammeerd moet worden als:
TIFR |= 0x01; /* onjuiste code! */
Je wilt toch alleen het TOV0
bitje
setten?
Stel dat zowel de TOV0
als de TOV1
flag geset is.
Het TIFR
I/O register bevat dan de waarde 0x05
.
Als we nu de bovenstaande instructie uitvoeren dan wordt de waarde 0x05
| 0x01 = 0x05
naar het TIFR
I/O register geschreven.
Omdat een vlag bitje gereset wordt als er een 1 naar toe geschreven wordt,
wordt nu dus niet alleen de TOV0
vlag maar ook de
TOV1
vlag gereset. Dat is natuurlijk niet de bedoeling!
De juiste code om alleen de TOV0
flag te resetten is:
TIFR = 0x01; /* juiste code! */
Stel dat zowel de TOV0
als de TOV1
flag geset is.
Het TIFR
I/O register bevat dan de waarde 0x05
.
Als we nu de bovenstaande instructie uitvoeren dan wordt de waarde
0x01
naar het TIFR
I/O register geschreven. Omdat
een vlag bitje gereset wordt als er een 1 naar toe geschreven wordt, wordt
nu dus alleen de TOV0
vlag gereset.
Zo kun je een vlag ook strijken ;-)