Tutorials - PIC peripherals

 

TIMER1

 


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.  

 


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 08/04/13.