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.
PS2 |
PS1 |
PS0 |
Divisore |
Frequenza in uscita al prescaler (Hz) |
0 |
0 |
0 |
2 |
500.000 |
0 |
0 |
1 |
4 |
250.000 |
0 |
1 |
0 |
8 |
125.000 |
0 |
1 |
1 |
16 |
62.500 |
1 |
0 |
0 |
32 |
31.250 |
1 |
0 |
1 |
64 |
15.625 |
1 |
1 |
0 |
128 |
7.813 |
1 |
1 |
1 |
256 |
3.906 |
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. |