Il Timer3 (TMR3) ha un funzionamento analogo al Timer1,
con cui condivide molti aspetti. Le caratteristiche essenziali sono :
- possibilità di selezionare da software operazioni di scrittura/lettura
dei registri a 8 oppure a 16 bit
- selezione del clock interno o esterno
- prescaler programmabile dedicato
- un unico registro di controllo
- reset in seguito ad evento trigger CCP
Inoltre , come per tutte le sorgenti di interrupt della serie PIC18, anche
Timer3 può essere impostato per generare richieste di interrupt a due livelli
di priorità.
Il registro T3CON è la
via per controllare le funzioni del Timer1, compreso il prescaler ; si
presenta in modo molto simile a T1CON
:
T3CON |
bit |
RD16 |
T3CCP2 |
T3CKPS1 |
T3CKPS0 |
T3CCP1 |
!T3SYNC |
TMR3CS |
TMR3ON |
funzione |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
default |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
- bit 7 RD16 :
operazione 16 bit
1
= Timer 1 letto/scritto in una unica operazione
0
= Timer 1 letto/scritto in due operazioni
- bit 6,3 T3CCP2:1 :
abilitazione CCP di Timer 1 e Timer 3
1x = Timer 3 comanda i moduli CCP
01 = Timer 3 comanda CCP2
Timer 1 comanda CCP1
00 = Timer 1 comanda i moduli CCP
I valori di default al POR sono indicati nella tabella.
Inoltre, per il controllo dell'
interrupt, sono disponibili i soliti tre bit IE/IF/IP, secondo la
tabella seguente :
Registro |
Bit
7 |
Bit
6 |
Bit
5 |
Bit
4 |
Bit
3 |
Bit
2 |
Bit
1 |
Bit
0 |
PIR2 |
- |
- |
- |
- |
- |
|
TMR3IF |
- |
PIE2 |
- |
- |
- |
- |
- |
|
TMR3IE |
- |
IPR2 |
- |
- |
- |
- |
- |
|
TMR3IP |
- |
La presenza dei bit di controllo nei registri PIR/PIE/IPIR
indica che si tratta di un interrupt periferico, che necessita per la sua
abilitazione dei entrambi gli switch globali GIE/PEIE.
I registri di conteggio di TIMER3
Il conteggio viene immagazzinato in una coppia di registri,
T
MR3H:L.
Sono programmabili due modi per leggere e scrivere questi registri.
I diagrammi seguenti schematizzano il funzionamento di Timer0 nel
funzionamento con due istruzioni a 8 bit per caricare i registri di conteggio
:
e in quello con una unica operazione a 16 bit :
Il primo modo, default al POR, prevede che
TMR3H.
e TMR3L.
siano due registri separati il cui caricamento o lettura richiede singole
operazioni a 8 bit. Questo rende Timer1 analogo a quello della famiglia
PIC16F.
Nel secondo modo operativo, ovvero portando il bit RD16 (T3CON<7>) a
1, l' indirizzo del registro TMR3H
è mappato in buffer. Una lettura di TMR3L
carica il contenuto del counter alto nel buffer in modo da evitare problemi di
lettura con il timer in funzione. Analogamente, la scrittura di TMR3H
avviene nel buffer, che sarà trasferito al registro di conteggio al momento
della scrittura di TMR3L.
Questo consente di caricare il contatore a 16 bit con una unica operazione,
evitando gli errori che si avrebbero con una operazione in più fasi e il
timer in funzione.
Da notare che il contenuto di conteggio del prescaler viene azzerato alla
scrittura di TMR3L,
iniziando un ciclo di lavoro interamente nuovo.
La modalità a 16 bit va impiegata in quelle situazioni in cui è critica la
precisione nel ri aggiornamento del contenuto dei registri di conteggio.
In ogni caso il contatore viene incrementato ad ogni transizione del clock che
può essere filtrata dal prescaler.
La scrittura di TMR3H
non azzera il contenuto di conteggio del prescaler, mentre questo è attuato
alla scrittura di TMR3L.
Timer3 non include un proprio oscillatore, ma può sfruttare le seguenti
sorgenti di clock :
- il clock interno (Fosc/4)
- il clock generato dall' oscillatore di Timer1 (incremento sul fronte di
salita)
Per utilizzare come clock di Timer3 l' oscillatore di Timer1, questo deve
essere abilitato settando T
1OSCEN
(T1CON<3>)
e deve essere settato anche TMR3CS
(T3CON<1>).
L' interrupt di Timer3
La coppia di registri TMR3H:L
incrementa da 0000h a FFFFh e va in overflow al clock successivo. L' interrupt
è maschjerato da TMR3
IE
(PIE2<1>)
e indicato dal flag TMR3IF
(PIR2<1>).
La gestione interrupt del Timer3 richiede :
- l' abilitazione del bit TMR3IE
(PIE2<1>)
, che
va posto a 1 se si desidera attivare l' interrupt
- Il bit di selezione della
priorità dell' interrupt è TMR3IP
(IPIR2<1>)
. E' a 1 se si desidera
l' alta priorità, altrimenti va a posto a 0. L' abilitazione del modo
interrupt con priorità richiede di aver settato il bit IPEN
(RCON<7>)
; altrimenti viene impiegato un sistema di interrupt senza livelli di
priorità e l' impostazione di TMR3IP
è indifferente.
- Il flag di identificazione è TMR3IF
(PIR2<1>)
che va a 1 a seguito all'
overflow del counter e va cancellato da software.
L' interrupt di Timer1 fa riferimento al registro PIR
e quindi è considerata una interruzione periferica e quindi sono
dipendenti per l' abilitazione non solo da GIE,
ma anche da PEIE.
Uso di Timer3 in CCP
Se almeno uno dei moduli CCP è programmato per utilizzare
Timer3 e generare uno Special Event Trigger in modo Compare (CCP1M3:0 o
CCP2M3:0 = 1011), il segnale resetta i registri del Timer3. Contemporaneamente
viene fatta partire una conversione A/D se il modulo relativo è stato
abilitato.
Si può avere una configurazione come timer o come contatore
sincrono; usando quest' ultimo modo, i registri CCPR2H:L conterranno il
periodo relativo a Timer3.
Nel funzionamento in modo asincrono, l' operazione di reset pò
non funzionare.
Nel caso in cui l' operazione di scrittura dei registri del
Timer3 coincida con lo Special Event Trigger del modulo CCP, la scrittura ha
la precedenza.
Va notato, inoltre, che lo Special Event Trigger dal modulo CCP2 non attiva il
flag di interrupt TMR3IF.