Vediamo ora cosa è e come funziona il registro TMR0.

Il registro TMR0 è un contatore, ovvero un particolare tipo di registro
il cui contenuto viene incrementato con cadenza regolare e programmabile direttamente
dall'hardware del PIC. In pratica, a differenza di altri registri, il TMR0 non mantiene
inalterato il valore che gli viene memorizzato, ma lo incrementa continuamente, se ad
esempio scriviamo in esso il valore 10 con le seguenti istruzioni:
movlw 10
movwf TMR0
dopo un tempo pari a quattro cicli macchina, il contenuto del registro
comincia ad essere incrementato a 11, 12, 13 e così via con cadenza costante e del tutto
indipendente dall'esecuzione del resto del programma.
Se, ad esempio, dopo aver inserito un valore nel registro TMR0,
eseguiamo un loop infinito
movlw 10
movwf TMR0
loop
goto loop
il registro TMR0 viene comunque incrementato dall'hardware interno al
PIC contemporaneamente all'esecuzione del loop.
Una volta raggiunto il valore 255 il registro TMR0 viene azzerato
automaticamente riprendendo quindi il conteggio non dal valore originariamente
impostato ma da zero.
La frequenza di conteggio è direttamente proporzionale alla frequenza
di clock applicata al chip e può essere modificata programmando
opportunamente alcuni bit di configurazione.
Nella figura seguente viene riportata la catena di blocchi interni al
PIC che determinano il funzionamento del registro TMR0.
I blocchi Fosc/4 e T0CKI riportati in blu rappresentano le due
possibili sorgenti di segnale per il contatore TMR0.
Fosc/4 è un
segnale generato internamente al PIC dal circuito di clock ed è pari alla frequenza di
clock divisa per quattro.
T0CKI è un
segnale generato da un eventuale circuito esterno ed applicato al pin T0CKI
corrispondente al pin 3 nel PIC16F84.
I blocchi T0CS e PSA riportati in verde sono due commutatori di segnale sulla cui uscita
viene presentato uno dei due segnali in ingresso in base al valore dei bit T0CS
e PSA del registro OPTION.
Il blocco PRESCALER è un divisore
programmabile il cui funzionamento verrà spiegato nel prossimo passo.
Vediamo in pratica come è possibile agire su questi blocchi per
ottenere differenti modalità di conteggio per il registro TMR0.
Iniziamo programmando i bit T0CS a 0 e PSA a 1.
La configurazione di funzionamento che otterremo è rappresentata nella seguente figura:

Le parti in rosso
evidenziano il percorso che effettua il segnale prima di arrivare al contatore TMR0.
Come abbiamo già detto in precedenza, la frequenza Fosc/4 è pari ad un
quarto della frequenza di clock. Utilizzando un quarzo da 4Mhz avremo una Fosc/4 pari ad 1
MHz. Tale frequenza viene inviata direttamente al registro TMR0 senza
subire nessun cambiamento. La cadenza di conteggio che se ne ottiene è quindi pari ad 1
milione di incrementi al secondo del valore presente in TMR0.
Ipotizziamo ora di cambiare lo stato del bit T0CS da 0 a 1
la configurazione che otteniamo è la seguente:
Questa volta sarà il segnale applicato al pin TOCKI del PIC ad essere
inviato direttamente al contatore TMR0 determinandone la frequenza di conteggio.
Applicando ad esempio a questo pin una frequenza pari ad 100Hz otterremo una frequenza di
conteggio pari a cento incrementi al secondo.
La presenza della porta logica XOR (exclusive OR)
all'ingresso TOCKI del PIC consente di determinare tramite il bit T0SE del registro
OPTION se il contatore TMR0 deve essere incrementato in corrispondenza del fronte di
discesa (T0SE=1) o del fronte di salita (T0SE=0) del segnale applicato dall'esterno.
Nella figura seguente viene rappresentata la corrispondenza tra
l'andamento del segnale esterno ed il valore assunto dal contatore TMR0 in entrambe i
casi:

Nel passo successivo vedremo come è possibile
dividere ulteriormente la frequenza di conteggio, interna o esterna, attivando il
PRESCALER. |