Il contatore TMR0 ed il PRESCALERData di pubblicazione: 17-10-2003 | Versione Italiana | (No English Version) Parole chiave: - PIC - |
Il registro contatore TMR0
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 PIC16F84A.
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:
Il Prescaler
L'ultimo blocco rimasto da analizzare per poter utilizzare completamente il registro TMR0 � il PRESCALER.
Se configuriamo il bit PSA del registro OPTION a 0 inviamo al registro TMR0 il segnale in uscita dal PRESCALER
come visibile nella seguente figura:
Il PRESCALER consiste in pratica in un divisore programmabile a 8 bit da utilizzare nel caso la frequenza di conteggio
inviata al contatore TMR0 sia troppo elevata per i nostri scopi.
Nell'esempio riportato al passo precedente abbiamo visto che utilizzando un quarzo da 4Mhz otteniamo una frequenza
di conteggio pari ad 1Mhz che per molte applicazioni potrebbe risultare troppo elevata.
Con l'uso del PRESCALER possiamo dividere ulteriormente la frequenza Fosc/4 configurando opportunamente i bit
PS0, PS1 e PS2 del registro OPTION secondo la seguente tabella.
Proviamo ora ad effettuare un esperimento sul campo per verificare quanto finora appreso.
Nella lezione 2 avevamo realizzato un lampeggiatore a quattro led la cui sequenza di lampeggio
era determinata da una subroutine che introduceva un ritardo software, ovvero un ritardo basato
sul tempo di esecuzione di un ciclo continuo di istruzioni.
Proviamo ora a riscrivere la stessa subroutine per introdurre un ritardo pari ad un secondo utilizzando il registro TMR0.
Le modifiche sono state riportate nel file SEQTMR0.ASM.
Dobbiamo anzitutto programmare il PRESCALER per ottenere una frequenza di conteggio conveniente inserendo le seguenti
istruzioni all'inizio del programma:
movlw 00000100B
movwf OPTION_REG
In pratica dobbiamo programmare bit T0CS a 0 per selezionare come sorgente del conteggio il clock del PIC, il bit PSA a 0 per assegnare
il PRESCALER al registro TRM0 anzich� al Watch Dog Timer (di cui tratteremo in seguito) e i bit di configurazione del PRESCALER a 100
per ottenere una frequenza di divisione pari a 1:32.
La frequenza di conteggio che otterremo sul TRM0 sar� pari a:
Fosc = 1Mhz / 32 = 31.250 Hz
La subrountine Delay dovr� utilizzare opportunamento il registro TMR0 per ottenere un ritardo pari ad un secondo.
Vediamo come. Le prime istruzioni che vengono eseguite nella Delay sono:
movlw 6
movwf TMR0
e
movlw 125
movwf Count
Le prime due memorizzano in TMR0 il valore 6 in modo che il registro TMR0 raggiunga lo zero dopo 250 conteggi (256 - 6 = 250)
ottenendo cos� una frequenza di passaggi per lo zero di TMR0 pari a:
31.250 / 250 = 125 Hz
Le istruzioni seguenti memorizzano in un registro a 8 bit (Count) il valore 125 in modo tale che, decrementando
questo registro di uno per ogni passaggio per lo zero di TMR0, si ottenga una frequenza di passaggi per lo zero del registro Count pari a:
125/125 = 1Hz
Le istruzioni inserite nel loop DelayLoop si occupano quindi di controllare se TMR0 ha raggiunto lo zero,
quindi di reinizializzarlo a 6 e decrementare il valore contenuto in Count. Quando Count raggiunger� anch'esso
lo zero allora sar� trascorso un secondo e la subroutine potr� fare ritorno al programma chiamante.
Segnala questo articolo:
Parole chiave: - PIC -
|