TIMER 0
La maggior parte dei PIC disponibili oggi sul mercato, dispone di uno o più moduli TIMER; nonostante ci sia della familiarità nella configurazione dei vari timer, in questa sezione verrà illustrato il funzionamento del TIMER 0 in quanto è, come detto, il modulo presente praticamente sempre.
Sulla maggior parte dei PIC. il TIMER 0 (spesso indicato anche come TMR0) è rappresentato da un registro a 8 bit che va ad incrementarsi da un valore precaricato sino a 255 (in notazione esadecimale 0xFF oppure FFh). L'overflow, ossia il superamento del valore 0xFF provoca un azzeramento del contenuto del registro e la generazione di una segnalazione a mezzo del flag T0IF (Timer 0 Interreupt Flag).
L'utilizzo del TIMER 0 può avvenire sia con la gestione degli interrupt sia in polling, ossia con la continua osservazione dell'evento di segnalazione (T0IF=1). Questo è il caso che si vuole analizzare nel seguito lasciando la parte riguardante l'interrupt del timer per un'altra sezione.
Conmideriamo, per semplicità, di utilizzare il PIC 16F84A; lo schema a blocchi del TMR0 è illustrato in figura 1.
Il timer può lavorare con sorgente esterna, fornendo un segnale ad onda quadra TTL sul pin RA4 (va specificato il fronte che incrementa il timer, configurando il flag T0SE Timer 0 Source Edge) oppure utilizzando la frequenza di clock di sistema che vale Fosc/4. Il modulo mette a disposizione un prescaler (ossia un divisore) programmabile con 8 valori, da 1:1 a 1:128. Il segnale a questo punto si sincronizza con il clock di sismema (con due cicli di ritardo) e poi finalmente incrementa il registro TMR0.
Il codice che segue, configura il TMR0 per avere un overflow ogni 8.2ms; facendo l'ipotesi di disporre di un quarzo da 4MHz.
Fosc = 4 MHz
Fcy = Fosc/4 = 1 MHz
T0CS= 0
T0SE = 0
Prescaler 1:32 -> PSA = 1, PS0 = 0, PS1 = 0, PS2 =1
- Codice: Seleziona tutto
MOVLW B'11000100' ;Config. modulo timer TMR0: prescaler 1:32, clock interno, no prescaler wdt
MOVWF OPTION_REG
Per la gestione del TMR0 è sufficiente caricare in W un valore da 0 a 255 e chiamare la rotuine
- Codice: Seleziona tutto
MOVLW 0
CALL DELAY
Con W=0 si ha il massimo ritardo (pari a 8.2 ms); con W > 0 si possono avere valori di timer inferiori, con passo 32us
- Codice: Seleziona tutto
;----------------------------------------------------
; DELAY
; Routine di ritardo che sfrutta il timer TMR0
; in W c'é il valore da caricare in TMR0: variandolo
; da 0 a 255 il ritardo cala rispettivamente da 8.2ms
; a 32us col quarzo a 4MHz.
; Si presuppone che il TMR0 abbia prescaler 1:32
;----------------------------------------------------
DELAY
MOVWF TMR0
BCF INTCON,T0IF
DELAY1
BTFSS INTCON,T0IF
GOTO DELAY1
RETURN
Ciao.
Paolo

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)




