PIC - Periferiche e Moduli
 
  Box pubblicitario
Come funziona il Timer0

Vedere anche:

Le informazioni contenute in questi appunti si riferiscono principalmente al PIC16F877A (vedi datasheet), ma possono essere applicate a molti altri modelli con periferiche uguali o quasi.
In ogni caso, una lettura del datasheet appropriato, è obbligatoria.

Prove di comportamento del Timer0 senza prescaler

Per vedere il comportamento del registro TMR0 senza prescaler, dobbiamo compilare il programmino ProvaTimer0_1, scritto in mikroBasic Pro for PIC e simularne il funzionamento con MPLAB-SIM.

program ProvaTimer0_1
'16F877A, 8MHz

dim contatore as byte

main:
'               /-> T0CS(clock interno)
'               |/-> T0SE(fronte discesa)
'               ||/-> PSA(senza prescaler)
'               ||| /-> PS2÷PS0(prescaler 1:256)
'               |||_|_
OPTION_REG = %11011111
contatore = 0
TMR0 = 0
nop
nop
nop
nop
while true
  if INTCON.T0IF = 1 then
    inc(contatore)
    INTCON.T0IF = 0
  end if
wend

end.

Con questo programmino possiamo testare il funzionamento del Timer0 e, in particolare, vedere il comportamento del registro TMR0.
Il nostro scopo è quello di incrementare la variabile contatore ogni volta che il bit T0IF del registro INTCON viene impostato al valore 1.

Questa impostazione viene effettuata dal registro TMR0 quando va in overflow (cioè passa dal valore 255 al valore 0).

Il registro OPTION_REG viene impostato per:
sorgente clock interno
fronte discesa (non influente in questo caso)
senza prescaler
prescaler 1:256 (non influente in questo caso)

Le 4 istruzioni NOP (nessuna operazione), sono state inserite per vedere il comportamento del registro TMR0 dopo il suo azzeramento.

L'istruzione INTCON.T0IF = 0 è necessaria per azzerare il bit T0IF e predisporlo ad intercettare il successivo overflow di TMR0.

Compilare il programma come descritto in "mikroBasic PRO - Come fare il debug con MPLAB".
Se avete eseguito tutto come descritto anche in "mikroBasic PRO - Preparare debug con MPLAB", dovremo trovarci in una situazione quasi simile a quella della figura sotto.
Selezionate, nella finestra "Watch", i registri e le variabili come in figura.

   

Tenendo attiva (cliccandoci sopra) la finestra "Disassembly Listing", eseguiremo una istruzione alla volta cliccando su "Step Into" e fermandoci all'istruzione (1) indicata nella figura sotto.

   

Al punto (1) dove ci troviamo, l'istruzione "OPTION_REG = %11011111" non è ancora stata eseguita completamente (manca l'ultima istruzione assembly che imposta il valore al registro).
Possiamo notare che il registro TMR0 (2) è rimasto a zero, nonostante siano stati eseguiti, finora, 5 cicli istruzione (3).

Questo avviene perchè, dopo un reset, il registro OPTION_REG è impostato con tutti i bit a 1 e, quindi, il bit T0CS essendo a 1, imposta la sorgente di clock dal pin T0CKI dove non abbiamo collegato nulla, perciò, nessun clock, TMR0 fermo.

Cliccando ancora su "Step Into" completiamo (4) l'esecuzione della istruzione di impostazione di OPTION_REG (impostando così T0CS = clock interno) e vediamo (5) che il TMR0 è stato incrementato.

   

Cliccando ancora su "Step Into" avanziamo fino al punto (6), pronti per eseguire l'istruzione "TMR0 = 0".
Non essendo abilitato il prescaler, notiamo che (7) il registro TMR0 è stato incrementato ad ogni ciclo istruzione.

   

Cliccando ancora su "Step Into" eseguiamo la successiva istruzione che azzererà (8) il valore nel registro TMR0.
Clicchiamo sul pulsantino (9) per azzerare il contatore parziale dei cicli istruzione (Stopwatch).

   

Cliccando su "Step Into", eseguiamo le 2 istruzioni "NOP" e ci fermiamo come al punto (10).
Possiamo notare che (11) il registro TMR0 non è stato incrementato, anche se (12) sono stati eseguiti 2 cicli istruzione.

   

Cliccando ancora su "Step Into" eseguiamo la successiva istruzione "NOP" e notiamo che, (13) adesso, il registro TMR0 è stato incrementato.

   

Cliccando ancora su "Step Into" eseguiamo la successiva istruzione "NOP" e notiamo che, (14) adesso, il registro TMR0 viene incrementato ad ogni ciclo istruzione.
Dobbiamo ricordarci, dunque, che quando modifichiamo il valore del registro TMR0, il conteggio comincerà ad incrementarsi soltanto dopo 2 cicli istruzione.

(15) Impostiamo un punto di arresto (breakpoint), in questo punto, a cui arriveremo appena il bit T0IF (bit 2 del registro INTCON) verrà impostato a 1.

   

Clicchiamo su "Run" per eseguire il programma fino al punto di arresto.
(16) Notiamo che il bit 2 (T0IF) del registro INTCON è stato impostato a 1.
Questo bit viene impostato a 1 ogni volta che il registro TMR0 va in overflow, cioè quando passa dal valore 255 (0xFF) a 0 (0x00).

   

Cliccando su "Step Into" eseguiamo la successiva istruzione, la quale (17) incrementa la variabile contatore, che è quello che volevamo.

   

Quello visto fino ad ora, è il comportamento senza prescaler. Per vedere il comportamento con prescaler, vedere "Prove di comportamento del Timer0 con prescaler".

Esempi di codice con uso del Timer0:

 

Il Timer0

Il Timer1

Bibliografia:
Datasheet Microchip PIC16F877A

 

Ultima modifica