Lezione 4

Step 2/2

Passo precedenteInizio lezionePasso successivo

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.

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.

 
Home page

PICPOINT, SXPOINT and ELETTROSHOP (C) 1997/98 by Andrea Galizia
For comments on this web site, write to webmaster@picpoint.com
Web design by Tiziano Galizia

Pic by example (c) 1997/98 by Sergio Tanzilli & Tiziano Galizia