Tutorials - PIC18 by Data Sheet

 
 

pag.127 - TMR1


TIMER1

Il Timer1 è comune a quasi tutti i PIC ed assume, oltre alle funzioni di timer/counter, anche quelle di oscillatore secondario. Le caratteristiche principali 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
  • flag di stato

Inoltre , come per tutte le sorgenti di interrupt della serie PIC18, anche Timer1 può essere impostato per generare richieste di interrupt a due livelli di priorità.

Il registro T1CON è la via per controllare  le funzioni del Timer1, compreso il prescaler :

T1CON bit RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN !T1SYNC TMR1CS TMR1ON
funzione R/W R 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     T1RUN : Timer 1 status
                 1 = clock derivato dall' oscillatore esterno
                 0 = clock derivato da un' altra sorgente
  • bit 5-4  T1CKPS1:0 : prescaler
                 11 =  1 : 8
                 10 =  1 : 4
                 01 =  1 : 2
                 00 =  1 : 1
  • bit 3     T1OSCEN : abilitazione dell' oscillatore
                 1 =  abilitato
                 0 =  disabilitato
  • bit 2    !T1SYBC  :  selezione sincronizzazione
                 con TMR1CS = 1
                 1 =  clock esterno non sincronizzato
                 0 =  clock esterno sincronizzato
                 con  TMR1CS = 0
                  bit disabilitato
  • bit 1      TMR1CS : selezione sorgente clock
                 1 =
    clock esterno da RC0/T1OSO/T13CKI
                 0 =
    clock interno
  • bit 6     TMR1ON  : abilitazione Timer 1
                 1 =
    timer abilitato
                 0 =
    timer disabilitato
        

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
PIR1 - - - - -   TMR1IF -
PIE1 - - - - -   TMR1IE -
IPR1 - - -  - -   TMR1IP -

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.


Registri di conteggio di TIMER1

I diagrammi seguenti schematizzano il funzionamento di Timer0 nel funzionamento di default con due istruzioni a 8 bit per caricare i registri di conteggio TMR1H:L :


e in quello con una unica operazione a 16 bit :

Il conteggio viene immagazzinato in una coppia di registri, TMR1H:L. Sono programmabili due modi per leggere e scrivere questi registri:

  • Il primo modo, default al POR, prevede che TMR1H e TMR1L sia 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, ovvero portando il bit RD16 (T1CON<7>) a 1, l' indirizzo del registro TMR1H è mappato in buffer. Una lettura di TMR1L carica il contenuto del counter alto nel buffer in modo da evitare problemi di lettura con il timer in funzione. Analogamente, la scrittura di TMR1H avviene nel buffer, che sarà trasferito al registro di conteggio al momento della scrittura di TMR1L. 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 TMR1L, 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. 

Timer1 include un proprio oscillatore da completare con componenti esterni (condensatori, cristallo, resistenza) che può servire sia da sorgente del clock per il timer stesso sia da clock alternativo per l' intero sistema. In questo caso, la sua funzione è fornire un clock a basso consumo per operazioni RTC.

Una Silicon Errata comunica che, quando TImer1 viene avviato o aggiornato,  richiede che ci sia una transizione alto basso del clock prima iniziare il conteggio sul fronte di salita successivo; se l' aggiornamento dei registri del timer non è completato prima del fronte di discesa, andrà perso un impulso.
Per evitare questo problema occorre aggiornare i registri del timer prima del fronte di discesa del clock oppure attendere che TMR1L sia incrementato e quindi aggiornare immediatamente i registri.
Per questo motivo non è consigliato usare Timer1 in interrupt a bassa priorità quando la correttezza del conteggio è critica, in quanto un eventuale interrupt ad alta priorità potrebbe intervenire ad alterare il corretto processo di scrittura dei registri.

Timer1 può operare come timer come counter sincronizzato o asincrono. Il modo è determinato da TMR1CS (T1CON<1>). Quando questo bit è 0 il timer incrementa ad ogni ciclo del clock interno (Fosc/4). Quando il bit è a 1 il timer incrementa ad ogni fronte di salita (rising edge) dell' ingresso esterno del clock o del suo oscillatore.
 


L' oscillatore esterno di TIMER1

Se viene abilitato il circuito di clock, i pin GPIO RC0 e RC1 diventano rispettivamente T1OSI e T1OSO, indipendentemente dal valore assegnato a TRISC1:0 .

L' oscillatore di Timer1 è abilitato con T1OSCEN (T1CON<3>). Il circuito  è il seguente :
Microchip intende questo oscillatore come utilizzabile con quarzi per RTC, tipicamente 32768 Hz. 
 
Non ci sono però indicazioni sulla massima frequenza utilizzabile, che, probabilmente, può raggiungere valori maggiori. 

Questo, però è poco significativo, in quanto l' oscillatore di Timer 1 ha funzioni alternative a quello primario proprio per il contenimento del consumo, che si ottiene generando una frequenza minore di quella dell' oscillatore primario.

Nulla viene specificato nei fogli dati riguardo all' uso del pin T1OSI che , stando agli schemi, può essere usato anche come ingresso per una sorgente di clock completamente esterna al processore. In questo caso, da T1OSO si ottiene la stessa frequenza in uscita.

Viene invece evidenziato come il valore dei condensatori applicati al cristallo o risonatore sia significativo sulla stabilità (maggior capacità, maggiore stabilità) , ma anche sul tempo di assestamento dell' oscillatore, ovvero del tempo necessario ad ottenere il clock corretto dal momento della messa in servizio dell' oscillatore (maggiore la capacità, maggiore il tempo di assestamento) 

Nelle modalità a gestione del consumo, i bit SCS1:0 (OSCON<1:0>) configurati al valore 01 permettono il passaggio sull' oscillatore di Timer 1 come fonte del clock del suistema : CPU e periferiche saranno alimentate da questo clock.
Se il bit IDLEN (OSCON<7>)  è a zero e viene eseguita una istruzione SLEEP, il sistema entra in modalità SEC_IDLE .

Fino a che il clock di Timer1 è operativo, il flag T1RUN (T1CON<6>) è a livello 1 e questo può essere usato per verificare quale sia la sorgente del clock al momento. Indica anche che la sorgenet del clcok è usata dal Fail Safe Clock Monitor.. Se il CLock Monitor è abilitato e l' oscillatore di Timer 1 ha problemi, la verifica di T1RUN indica se il clock è fornito dal timer o da un' altra sorgente.

L' oscillatore di Timer 1 può essere programmato per due livelli di consumo. Se il bit LPT1OSC è a 1, l' oscillatore funziona alla minima potenza, mentre se è a 0 (default) opera a potenza normale. In modalità low power c'è una maggiore sensibilità ai disturbi, che possono alterare il funzionamento dell' oscillatore. Per un consumo minore, le impedenze in gioco dovranno essere maggiori e questo riduce l' immunità ai disturbi : in particolare dovrà essere curata la struttura del circuito stampato, ad esempio prevedendo anelli di massa per schermare i pin dell' oscillatore da eventuali circuiti ad alta frequenza vicini (ad esempio l' ingresso degli impulsi CCP1 o PWM).

In base a quanto notato, allora, la corretta sequenza di lettura sarà quella di leggere prima TMR1L e poi  TMR1H, mentre per la scrittura, si scriverà prima TMR1H e poi TMR1L. E' sottinteso che se se viene scritto solo  TMR1H senza riscrivere anche TMR1L, il trasferimento del valore impostato per  TMR1H non avrà effetto. Così pure leggendo prima  TMR1H non si avrà il giusto valore conteggiato in quel momento.


Il Prescaler

Il prescaler di Timer1 è interamente dedicato a questo timer e non è condiviso con altre funzioni. Non necessita di bit di abilitazione in quanto, a differenza di quello di Timer0, dispone della scelta di un "divisore" 1:1. I bit TCKPSA1:0 (T1CON<5:4>) permettono la selezione di 4  valori del rapporto

Il prescaler, sia come assegnazione che come divisore, è interamente sotto controllo del software e può essere variato a piacere durante l' esecuzione del programma.


Interrupt

Timer1 può essere una fonte di richiesta di interrupt, che è generato quando il registro di conteggio passa da 0xFF a 0x00 in modo a 8 bit o da 0xFFF a 0x0000 in modo 16 bit.

Questo overflow setta il bit TMR1IF (PIR1<1>). La richiesta di interrupt può essere mascherata con il bit TMR1IE (PIE1<1>). Prima di riabilitare l' interrupt, TMR1IF deve essere portato a zero da programma.

Timer1 è in funzione anche in modalità Sleep e può essere una sorgente di wake-up

La gestione interrupt del Timer1 richiede :

  • l' abilitazione del bit TMR1IE (PIE1<1>), che va posto a 1 se si desidera attivare l' interrupt 
  • Il bit di selezione della priorità dell' interrupt è TMR1IP (IPIR1<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 TMR1IP è indifferente.
  • Il flag di identificazione è TMR1IF (PIR1<1>) che va a 1 a seguito all' overflow del counter e va cancellato da software.

L' interrupt di Timer1 fa riferimento al registro PIR1 e quindi è considerata una interruzione periferica  e quindi sono dipendenti per l' abilitazione da PEIE.

 


Una applicazione RTC

Il foglio dati propone una applicazione RTC del Timer1 , usato con un cristalli da 32768 Hz. Questo permette di disporre di un orologio senza la necessità di aggiungere periferiche esterne, dato che il basso consumo ed il funzionamento anche nel modo SLEEP permettono l' impiego con batterie u super condensatori.

La routine RTCisr dimostra un metodo semplice per incrementare un contatore ad intervalli di 1 secondo in interrupt. Contatori per minuti, ore e calendario potranno essere aggiunti con facilità.

Poichè si sta lavorando in modalità 16 bit, i registri di conteggio vanno in overflow dopo circa 2 secondi. Per forzare l' overflow ad 1 secondo occorre pre caricare i registri con un valore adeguato. L' aggiustamnento di questo valore correggerà differenze possibili nel valore della frequenza di oscillazione del cristallo.
L' esempio tiene conto del documento Timer1 errata , documento Microchip DS80329A.

RTCinit
   MOVLW   80h          ; Preload TMR1 register pair
   MOVWF   TMR1H        ; for 1 second overflow
   CLRF    TMR1L
   MOVLW   b’00001111’  ; Configure for external clock,
   MOVWF   T1CON        ; Asynchronous operation, external oscillator
   CLRF    secs         ; Initialize timekeeping registers
   CLRF    mins     
   MOVLW   .12
   MOVWF   hours
   BSF     PIE1, TMR1IE ; Enable Timer1 interrupt
   RETURN

RTCisr:
   btfsc   TMR1L, 0     ; wait for TMR1L<0> to become clear
    bra    $-2    
   btfss   TMR1L, 0     ; wait for TMR1L<0> to become set
    bra    $-2 

; If TMR1 update can be completed before clock pulse
; goes low, start update here

Update:
   bsf     TMR1H,7      ; Preload for 1 sec overflow
   BCF     PIR1, TMR1IF ; Clear interrupt flag
   INCF    secs, F      ; Increment seconds
   MOVLW   .59          ; 60 seconds elapsed?
   CPFSGT  secs
   RETURN               ; No, done
  
   CLRF    secs         ; Clear seconds
   INCF    mins, F      ; Increment minutes
   MOVLW   .59          ; 60 minutes elapsed?
   CPFSGT  mins
   RETURN               ; No, done

   CLRF    mins         ; clear minutes
   INCF    hours, F     ; Increment hours
   MOVLW   .23          ; 24 hours elapsed?
   CPFSGT  hours
   RETURN               ; No, done
   CLRF    hours        ; Reset hours
   RETURN               ; Done

 


 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 15/04/11.