I registri di controllo del TIMER1
Essi sono:
- T1CON è dedicato, nei Mid-range, al
controllo del TIMER1. Diventa TMR1CON
nei PIC18
.
PIR1 e PIE1
sono utilizzati per i flag di interrupt
T1CON
T1CON contiene solo bit di controllo del
timer. La sua struttura è la seguente:
T1CON
|
bit
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
nome
|
-
|
-
|
T1CKPS1
|
T1CKPS0
|
T1OSCEN
|
!T1SYNC
|
TMR1CS
|
TMR1ON
|
funzione
|
0
|
0
|
R/W
|
R/W
|
R/W
|
R/W
|
R/W
|
R/W
|
default
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
-
bit 7:6 non usati
0
-
bit 5:4 T1CKPS1:0
: Timer1 Input Clock Prescale Select
11
= 1:8
10
= 1:4
01
= 1 :2
00
= 1:1
-
bit 3 T1OSCEN: Timer1
Oscillator ENable
1 =
enabled
0 =
disabled
-
bit 3 !T1SYNC
: Timer1 External Clock Synchronization Select
se
TMR1CS = 0, !T1SYNC è ignorato
se TMR1CS
= 1
1 = non sincronizzato
0 = sincronizzato
bit 1 TMR1CS :
Timer1 Clock Source Select
1
= clock esterno (T1OSO/T1CKI, rising edge)
0
= interno (Fosc/4)
bit 0 TMR1ON:
Timer1 On
1
= on
0
= off
In particolare:
T1CON |
bit |
Funzione |
Valore |
T1CKPS1:0
|
5:4 |
Questi bit selezionano il valore del pre divisone del clock. Siccome
il prescaler è sempre attivo, se non richiesta una pre divisione, va
impostato su 1:1 (default) |
- 00: 1:1
- 01: 1:2
- 10: 1:4
- 11: 1:8
|
T1OSCEN |
3 |
Questo
bit abilita la funzione di oscillatore esterno, con i componenti applicati
a pin T1OSCI/T1OSCO.
Per l' oscillatore esterno occorre aver scelto la modalità nelle
opzioni del __CONFIG.
La disabilitazione dell' oscillatore riduce il consumo di energia. |
- 0: abilitato (default)
- 1: disabilitato
|
!T1SYNC |
2 |
Questo bit indica la
sincronizzazione del clock di ingresso con quello del sistema. La
selezione è valida esclusivamente per un segnale che arriva dall'
esterno, attraverso il pin T1OSO/T1CKI.
|
- 0: sincronizzato (default)
- 1: non sincronizzato
|
TMR1CS |
1 |
Questo
bit abilita la sorgente del clock.
|
- 0: l'
incremento dipende dal clock interno Fosc/4 (default)
- 1: l'
incremento dipende da un segnale esterno (pin T1OSO/T1CKI)
|
TMR1ON |
0 |
Questo bit serve all' accensione del modulo
del Timer1.
Lo spegnimento del modulo riduce il consumo di energia.
|
- 0: disabilitato (default)
- 1: abilitato
|
Quando si utilizza un clock esterno, l' avanzamento del conteggio
avviene per ogni transizione in discesa (rising edge) del segnale. !T1SYNC
a 0 sincronizza l' impulso in ingresso con il clock interno;
questa sincronizzazione è effettuata dopo il prescaler, che è un ripple
counter asincrono.Come per il Timer0, anche il segnale di conteggio esterno
del Timer1 deve avere requisiti minimi che sono indicati sul foglio dati
(parametri 45-47, sezione Electrical Specifications). Il requisito
principale è dovuto alla sincronizzazione con il clock interno (Tosc) e
quindi alla sua fase rispetto al segnale in ingresso. E' quindi probabile che
ci sia un ritardo nel reale incremento dei contatori dopo la sincronizzazione. Se il prescaler è 1:1, l'ingresso del clock esterno
è passato al conteggio senza che il prescaler abbia effetto; il segnale viene
quindi sincronizzato con il clock interno campionando l' uscita del prescaler.
Pertanto è necessario che l' impulso al pin T1CKI abbia durata di almeno 2Tosc,
a cui aggiungere un piccolo ritardo dovuto alle componenti RC. Il
livello basso dovrà avere una durata uguale. Riferimento a parametri 45, 46, e 47 nelle "Specifiche elettriche"
section. Se si utilizza il prescaler, per soddisfare il requisito di campionamento,
è necessario che il pin T1CKI abbia un periodo maggiore di 4Tosc diviso per il valore
prescaler.
Con
il sincronismo abilitato, in modo sleep il timer non incrementa, dato che manca
il clock per il sincronismo. Invece, il prescaler continua a funzionare. |
Se T1SYNC (T1CON <2>) a 1, l'ingresso di clock esterno non è sincronizzato. Il timer continua
incrementare in modo asincrono rispetto alla fase del clock interno. In queste
condizioni il timer continua a funzionare durante lo sleep e può generare un interrupt di overflow che
riattiva il processore.
Tuttavia, particolari precauzioni nel software sono necessari per leggere / scrivere il timer
in modo asincrono.
Timer1 utilizza due registri a 8 bit, TMR1H
e TMR1L; mentre il timer è in funzione
con un clock esterno asincrono, è possibile una lettura valida, che richiede
due operazioni a 8 bit. Tuttavia, va tenuto presente che esiste la
possibilità di avere un overflow tra le due letture.
Nella scrittura dei registri è raccomandato di spegnere il timer e quindi scrivere i valori desiderati.
Nel caso in cui si effettui la scrittura con il timer in funzione c'è a
possibilità che ci si trovi nel registro un valore non prevedibile.
Ecco un esempio consigliato di lettura dei registri di conteggio con il
timer in funzione:
; disabilita interrupt (se attivo)
...
movf TMR1H, W
; legge byte alto
movwf TMPH
; salva
movf TMR1L, W
; legge byte basso
movwf TMPL
; salva
movf TMR1H, W
; legge byte alto
subwf TMPH, W
; verifica con la lettura
precedente
btfsc STATUS,Z ; se non c'è differenza
goto CONTINUE
; la lettura è corretta
; altrimenti TMR1L può esser stato modificato
; La rilettura dei registri riporta ora il valore corretto
movf TMR1H, W
; legge byte alto
movwf TMPH
; salva
movf TMR1L, W
; legge byte basso
movwf TMPL
; salva
; riabilita interrupt (se necessario)
...
CONTINUE
; |
Nell' operazione di scrittura a 16 bit, va scritto prima TMR1H,
poi TMR1L;
questo registro è stato precedentemente azzerato per evitare un avanzamento
indesiderato di TMR1H durante la scrittura:
; disabilita interrupt (se attivo)
...
clrf TMR1L
; esclude
un avanzamento di TMR1H
movlw HI_BYTE
; valore da scrivere in TMR1H
movwf TMR1H, F ;
movlw LO_BYTE
; valore da scrivere in TMR1L
movwf TMR1H, F ;
; riabilita interrupt (se necessario)
... |
Da notare la necessità di arrestare l' interrupt durante queste
operazioni; l' azione dipende dal fatto che il timer continua a contare
fino a che un clock è presente.
Poiché il contatore può funzionare in sleep, Timer1 può essere utilizzato per implementare un
orologio in tempo reale, ma non può essere utilizzato come base temporale per catturare o confrontare
operazioni.
Interrupt
Per abilitare l' interrupt di Timer1 occorre portare a 1 il bit TMR1IE
nel registro PIE1. La posizione del bit
nel registro non è costante nei vari dispositivi.
L' overflow verrà indicato dal flag TMR1IF
nel regsitro PIR1. La posizione
del bit nel registro non è costante nei vari dispositivi.
Va ancora ricordato che, trattandosi di un interrupt periferico,
richiede una abilitazione sia di GIE che
di PEIE
- Il bit TMR1IF
è portato a 1 dall' evento di overflow e va cancellato da programma
una volta servito l' interrupt; l' omissione di questa precauzione fa si che,
appena usciti dall' interrupt, esso venga nuovamente richiamato.
Se l' interrupt non è abilitato, sia a livello di TMR1IE
che di
GIE e PEIE, l' overflow
porta comunque il bit TMR1IF
a 1. Questo è utile per una analisi in polling dello
stato del contatore.
-
Va tenuto presente che il TIMER1, se attivo, potrebbe essere
stato raggiunto un overflow tra il POR e l' inizializzazione del timer;
quindi è opportuno cancellare il flag prima di attivare l' interrupt.
|
|