Bitn..... in C voor gevorderden.

© Harry Broeders.

Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Academie voor Technology, Innovation & Society Delft.

Lees eerst: Bitn..... voor beginners.

Het strijken van de vlag.

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!

Voorbeeld.

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 ;-)