elomax

[ Techniek ] [ Shop ] [ Site map
[ TCNT ] Capture (IC) ] Compare (OC) ] OC Voorbeeld 1 ] OC Voorbeeld 2 ] OC Voorbeeld 3 ] IC Voorbeeld 1 ]

Terug
Omhoog

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


Volgende ]

© 2005...2008 Elomax [Voorwaarden ]