Timer sind integrierte Bauteile in den Mikrocontrollern, die in regelmäßigen Abständen hardwaregesteuert um 1 hoch- bzw. runterzählen können,
und das unabhängig vom Programmablauf. Hierfür sind einige Register reserviert, so gut wie jeder Mikrocontroller (μC) besitzt solche Register,
doch abhängig von der Größe des μC kann deren Anzahl jedoch variieren. Es gibt generell zwei Größen von Timern: 8 und 16 Bit.
Generell sieht der Ablauf eines Timers so aus:
Noch einige Anmerkungen zu den einzelnen Punkten:
Dadurch, dass der Prescaler den Standardwert 0, lässt er keinen Takt durch, was dazu führt, dass der Timer inaktiv ist. Zum Aktivieren muss also ein Vorteiler gesetzt werden.
Dies kann man im Register TCCR0
mit den Bits CS00
-CS02
(Clock Select) machen.
CS02 | CS01 | CS00 | Bedeutung |
---|---|---|---|
0 | 0 | 0 | keine (Timer ist angehalten) |
0 | 0 | 1 | Vorteiler: 1 |
0 | 1 | 0 | Vorteiler: 8 |
0 | 1 | 1 | Vorteiler: 64 |
1 | 0 | 0 | Vorteiler: 256 |
1 | 0 | 1 | Vorteiler: 1024 |
1 | 1 | 0 | externer Takt von Pin T0 , fallende Flanke |
1 | 1 | 1 | externer Takt von Pin T0 , steigende Flanke |
Hierfür wird das Register TIMSK0
verwendet. Es beinhaltet zwei Bits, die für zwei Interrupt-Arten stehen:
TOIE0
: overflowOCIE0
: output
Eine komplette Initialisierung eines Timers in Assembler als Beispiel:
Ein vollständiges Beispiel mit einem Overflow-Interrupt:
Hier noch ein Beispiel, wie ein Timer verwendet werden würde, der durch eine fallende Flanke eines externen Signals hoch zählt
und das zudem immer den aktuellen Zählerstand auf PORTB
ausgibt, ohne, dass dabei ein Interrupt ausgelöst wird: