Tutorials - PIC 

 

PIC16F526


Il TIMER0 e OPTION_REG

Il TIMER0 è il classico contatore/timer presente in tutti i PIC. In questa versione, il suo registro di conteggio è a 8 bit, quindi esso conta da 000 a 255 (FFh), a crescere, per ogni impulso applicato all' ingresso.
Il clock che lo alimenta può essere derivato da due fonti:

  • il clock interno Fosc/4
  • un segnale esterno applicato all' ingresso T0CKI

TIMER0 è sempre attivo, quindi, fino a che è presente il clock scelto, il conteggio prosegue e non può essere arrestato. 
Il registro di conteggio va in overflow al 256esimo impulso, dopo di che ricomincia a contare da 0.

Il timer dispone di un pre divisore per il clock: si tratta di un ripple counter che può dividere il segnale di ingresso per multipli di 2 fino a 256. Ad esempio, con il clock 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 (la scelta di avere o meno WDT dipende dal CONFIG che vedremo più avanti)

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. 

Da notare che OPTION non fa parte della mappa di memoria RAM, in quanto è un registro particolare, a sola scrittura, la quale è possibile unicamente attraverso una speciale istruzione option, tipica dei Baseline.

La sua  struttura è la seguente:

OPTION

bit

7 6 5 4 3 2 1 0

nome

!RBWU

!RBPU

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
  • bit 7  !RBWU   : Enable Wake-up on Pin Change bit (PORTB)
                    1 = disabilitato
                    0 = abilitato

  • bit 6  !RBPU   : Enable Weak Pull-ups bit (PORTB)
                    1 = disabilitato
                    0 = abilitato

  • bit 5  T0CS  : Selezione sorgente del clock
                  1 = Transizione sul pin T0CKI (overrides la selezione del TRIS)
                  0 = Transizione sul clock interno, FOSC/4

  • bit 4  T0SE  : Selezione del fronte
                  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    : Assegnazione prescaler
                  1 =  prescaler assegnato al WDT
                  0 =  prescaler assegnato al timer

  • bit 2:0 PS2:0 : fattore di divisione del prescaler
                   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 più completa di TIMER0 la trovate qui.

Durante le esercitazioni, comunque, questi concetti saranno ripresi ed applicati. Per ora limitiamoci ad indicare una prima delle "trappole" citate:

Va notato che impostando T0CS(OPTION_REG,5) = 1, questa selezione sovrascrive quanto designato nel registro TRIS per RC5
Siccome al reset tutti i bit di OPTION_REG sono di default a 1, per usare RC5 occorre ricordarsi di porre T0CS=0.

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.

Da osservare che, mancando una gestione interrupt nei PIC Baseline, anche l' overflow di Timer0 non genera interrupt.


 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 18/10/13.