Il TIMER0
Il TIMER0
è il classico contatore/timer presente in tutti i PIC, del tutto analoghi a quanto implementato
nei Baseline e Midrange.
TIMER0 è a 8 bit, sempre attivo.
L' ingresso di conteggio del TIMER0 può essere:
- il clock interno Fosc/4
- l' ingresso esterno T0CKI
- l' uscita del comparatore
L' overflow non genera alcuna azione, per cui l' esaurimento del conteggio del
timer va verificato in polling. Così pure un determinato valore di
conteggio.
Ad esempio, con il clock fisso a 4MHz, un ciclo di istruzione è FOSC/4 = 1
MHz, ovvero un periodo di 1us. Una attesa di 16 ms è determinata da un
conteggio di 250 impulsi con un prescaler 1:64
Come è comune nei Baseline e MidRange, il prescaler è in condivisione tra
TIMER0 e WDT, per cui può essere assegnato
solo all' uno o all' altro.
Occorre non dimenticare che se abilita WDT (scelta da fare nel CONFIG), occorre
inserire
nel programma la periodica ricarica del suo contatore.
WDT allo scadere del conteggio non genera un interrupt, ma un
reset, di cui va individuata la sorgente.
Lo scadere del WDT risveglia in micro dallo sleep. In questo caso non
occorre alcuna azione di cancellazione di flag in quanto è cancellato
automaticamente al momento del wakeup. Questo accade qualunque sia la causa
del wakeup.
Una trattazione completa del TIMER0 la trovate qui.
La gestione di TIMER0
Il TIMER0 non dispone di un registro di
controllo proprio, ma fa capo ad un registro generale detto OPTION
o OPTION_REG che contiene anche altre
funzioni. La sua struttura è la seguente:
OPTION
|
bit
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
nome
|
!GPWU
|
!GPPU
|
T0CS
|
T0SE
|
PSA
|
PS2
|
PS1
|
PSO
|
funzione
|
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
default
|
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
!GPWU
: Enable Wake-up on Pin Change bit (GP0, GP1, GP3)
1 = disabilitato
0 = abilitato
bit 6 !GPPU :
Enable Weak Pull-ups bit (GP0, GP1, GP3)
1 = disabilitato
0 = abilitato
bit 5
T0CS:
Timer0 Clock Source Select bit
1 =
Transizione sul pin T0CKI (overrides la selezione del TRIS)
0 =
Transizione sul clock interno, FOSC/4
bit 4
T0SE
: Timer0 Source Edge Select bit
se
T0CS= 0,
T0SE è
ignorato
se T0CS
= 1
1
= transizione livello basso -> alto (rising) sul pin T0CKI
0 = transizione
livello alto -> basso (falling) sul pin T0CKI
bit 3
PSA :
Prescaler Assignment bit
1 =
prescaler assegnato al WDT
0 =
prescaler assegnato al timer
bit 2:0
PS2:0:
Prescaler Rate Select bits
TIMER0 WDT
000 = 1:2 000 = 1:1
001 = 1:4 000 = 1:2
010 = 1:8 000 = 1:4
011 = 1:16 000 = 1:8
100 = 1:32 000 = 1:16
101 = 1:64 000 = 1:32
110 = 1:128 000 = 1:64
111 = 1:256 000 = 1:128
In particolare:
T1CON |
bit |
Funzione |
Valore
|
T0CS |
5 |
Questo bit seleziona la sorgente del clock di conteggio.
Da notare che la selezione del clock esterno sovra scrive una
eventuale selezione diversa effettuata sul TRIS del pin T0CKI. |
- 1 segnale dal pin T0CKI
(default)
- 0 Fosc/4
|
T0SE |
4 |
Questo bit seleziona il fronte di commutazione del clock sul quale
il contatore incrementa.
E' valido solamente per il clock esterno. |
- 0 falling edge
- 1 rising edge (default)
|
PSA |
3 |
Questo bit seleziona l' assegnazione del prescaler |
- 0 al WDT (default)
- 1 al timer
|
PS2:0 |
2:0 |
Questi tre bit definiscono il fattore di pre divisione.
Da notare che i valori impostati, a parità dei bit PS,
sono diversi nel caso di prescaler applicato al WDT o al timer. |
|
TIMER0 |
WDT |
000 |
1:2 |
1:1 |
001 |
1:4 |
1:2 |
010 |
1:8 |
1:4 |
011 |
1:16 |
1:8 |
100 |
1:32 |
1:16 |
101 |
1:64 |
1:32 |
110 |
1:128 |
1:64 |
111 |
1:256 |
1:128 |
|
Una trattazione completa di TIMER0 la trovate qui.
La funzione di Timer0 è quella, se alimentato dal clock interno o da un
clock esterno, di determinare intervalli di tempo (timer) per generazione di
forme d'onda, ritardi, applicazioni RTC, debounce, ecc.
Se viene alimentato da un segnale esterno, può svolgere la funzione di
conteggio degli impulsi (counter) in arrivo per misure di tempo, frequenza,
ecc.
Va ricordato che
impostando T0CS (OPTION_REG, 5) a 1, questa selezione sovrascrive quanto
designato nel registro TRIS per GP2.
Siccome al reset tutti i bit di OPTION_REG sono di default a 1, per usare
GP2 occorre ricordarsi di impostare T0CS = 0.
|
Mancando una gestione interrupt nei PIC Baseline, anche
l' overflow di Timer0 non genera interrupt.
|