Free running counter
De input-capture en output-compare functies in de micro-controller zijn
gebaseerd op een free-running counter. De free-running counter is een
16-bits register, waarvan de inhoud door de micro-controller regelmatig
met één wordt verhoogd.

De snelheid waarmee de teller verhoogd wordt, is in te stellen met
behulp van de PR1 en PR0 bits in het TMSK2 register. Deze twee bits
bepalen de deelfactor van het interne klok-signaal. De interne klok is op
de SIMPLEX 2 MHz. Deze 2 MHz klok kan door de voordeler door 1, 4, 8 of 16
gedeeld worden. Hierdoor wordt de vrijlopende teller geklokt volgens de
volgende tabel:
|
PR1
|
PR0
|
resolutie
|
tijd om tot 65536 te tellen
|
|
0
|
0
|
0.5µs
|
32.768 ms
|
|
0
|
1
|
2µs
|
131.072 ms
|
|
1
|
0
|
4µs
|
262.144 ms
|
|
1
|
1
|
8µs
|
524.288 ms
|
Direct na een 'reset' zal de deelfactor op 1 staan.
Timer overflow
Wanneer het vrijlopende teller register op $FFFF (65535) is aangekomen,
wordt het de volgende keer weer terug op $0000 gezet. Dit noemt men een
'overflow'. Daarbij kan een interrupt gegenereerd worden (hiertoe moet het
TOI bit in het TMSK2 register een '1' gemaakt worden.) Tevens maakt de
micro-controller het TOF bit in het TFLG2 register een '1'. Dit bit kan
worden teruggezet op '0' door op deze plaats in het TFLG2 register een '1'
te schrijven.
Timer-overflows kan men gebruiken om tijden te meten die langer zijn
dan een volledige cyclus van de free-running counter. Het aantal overflows
wordt dan onder interrupt door de software bijgehouden. Hierdoor wordt de
teller a.h.w. verlengd.
Teller stand
De stand van de free-running counter kan gelezen worden via het TCNT
register met behulp van instructies die 16 bits tegelijk lezen, zoals LDD,
LDX of LDY instructies. Het is niet mogelijk een nieuwe waarde naar dit
register te schrijven.
De teller loopt altijd door, ook wanneer de stand van de teller door
een instructie wordt uitgelezen. Het risico zou bestaan dat de stand van
de teller verandert tijdens het uitlezen (uitlezen gebeurt in twee slagen
van elk één byte, waarbij het meest significante byte het eerst gelezen
wordt.) Als tijdens het uitlezen de tellerstand bijvoorbeeld van $00FF
naar $0100 gaat, wordt als meest significante byte $00 gelezen (vlak
voordat de teller van $00FF naar $0100 gaat), en als minst significante
byte wordt $00 gelezen (vlak nadat de teller van $00FF naar $0100 ging.)
Het incorrecte resultaat zou dan $0000 zijn in plaats van de correcte
waarde $0100. Om dit te voorkomen wordt door de hardware in de
micro-controller het minst significante byte van de teller tijdelijk in
een latch opgeslagen op het moment dat het meest significante byte gelezen
wordt. Deze latch houdt zijn waarde lang genoeg vast (1 cycle) om een
16-bits instructie de tijd te geven ook het minst significante byte
correct te lezen. Het minst significante byte wordt uit de latch gelezen,
en niet uit het teller register. De waarde in de latch wordt maar
gedurende 1 cycle vastgehouden, daarom mag alleen met 16-bits instructies
de inhoud van de teller gelezen worden (zoals LDD, LDX of LDY
instructies.)
Registers voor de besturing van de vrijlopende teller
De I/O registers die de bits bevatten voor de besturing van de
vrijlopende teller zijn:
TMSK2 $1024
|
toi
|
rtii
|
paovi
|
Paii
|
-
|
-
|
pr1
|
pr0
|
TFLG2 $1025
|
tof
|
rtif
|
paovf
|
Paif
|
-
|
-
|
-
|
-
|
TCNT $100E, $100F
|
bit15
|
bit14
|
bit13
|
bit12
|
bit11
|
bit10
|
bit9
|
bit8
|
|
bit7
|
bit6
|
bit5
|
bit4
|
bit3
|
bit2
|
bit1
|
bit0
|
|