Tutorials - PIC peripherals

 

TIMER0

Qualche esempio di codice


Baseline

Generare un delay da 40 ms con il TIMER0 di PIC10F220. Il clock è quello interno a 4MHz.

Il ciclo di istruzione, per un clock a 4 MHz, è :

ciclo_istruzione = 1 / (FOSC/4) =  1 us

Se dividiamo il clock con un prescaler 1:256, otteniamo un periodo di:

 periodo = ciclo_istruzione *  256 =  256 us

Se vogliamo ottenere 40 ms di overflow occorre un conteggio di:

  40ms / 256us = 156,25 impulsi

Dobbiamo scegliere un valore intero, quindi 156.  Ovvero occorrerà una pre carica in TMR0 di 256 - 156 = 100.
In effetti:

TIMER0 Overflow = 1us * (256 - 156) * 256 = 1 us * 100 * 256 = 39,936

che equivalgono a 40 ms con l' approssimazione dell' 0.16 %. 

Per un PIC10F200, la via migliore è quella di azzerare il timer ed attendere il conteggio di 100 impulsi. 
In Assembly:

; configura il TIMER0 per clock interno con prescaler 1:256
;OPTION   11010111
;         ||||||_|___ prescaler 1/256
;         |||||______ al Tmr0
;         ||||_______ GP rising
;         |||________ clock interno
;         ||_________ no WPU
;         |__________ no WU
;

     movlw  b'11010111'
     option

; set TIMER0 per un ritardo di 40 ms
     clrf   TMR0      ; azzera il contatore
t0l
  movf   TMR0, w   ; verifica la fine del conteggio
     xorlw  .156      
     btfss  STATUS, Z
     goto   t01
waitend   ...         ; fine del ritardo

Non ci sono banchi, quindi non occorre alcuna precauzione nell' utilizzare i vari SFR.
In un PIC10F204/6, però, occorrerà considerare anche la presenza del comparatore, ad esempio disabilitandolo.


Mid-range

Se utilizziamo un PIC con gestione interrupt, il test di fine conteggio potrà essere effettuato in polling sul flag T0IF o con interrupt.
OPTION_REG è posizionato solitamente nel banco 1 per cui occorre ricordarsi dello switch.
inoltre nei Mid-range l' accesso al registro si effettua con le normali istruzioni.

; configura il TIMER0 per clock interno con prescaler 1:256
;OPTION   11010111
;         ||||||_|___ prescaler 1/256
;         |||||______ al Tmr0
;         ||||_______ GP rising
;         |||________ clock interno
;         ||_________ no WPU
;         |__________ no WU
;

     movlw   b'11010111'
    
movwf   OPTION_REG

; set TIMER0 per un ritardo di 40 ms
     bcf     INTCON, IT0IF  ; clear flag
     movlw   .100           ; preload counter
     movwf   TMR0           
t0l
  btfss   INTCON, TOIF   ; attesa fine conteggio
     goto    t01
waitend:   ...              ; fine del ritardo

 


PIC18

Nei PIC18 il TIMER 0 può essere a 16 bit e dispone di comando on/off, ma, lasciando i default al POR, è del tutto compatibile con i precedenti.
OPTION_REG è sostituito da T0CON

; configura il TIMER0 per clock interno con prescaler 1:256
; T0CON   11010111
;         ||||||_|___ prescaler 1/256
;         |||||______ prescaler
;         ||||_______ rising
;         |||________ clock interno
;         ||_________ 8 bit
;         |__________ Timer0 on
;
 
    movlw   b'11010111'
     movwf   T0CON

; set TIMER0 per un ritardo di 40 ms
     bcf     INTCON, INT0IF  ; clear flag
     movlw   .100            ; preload counter
     movwf   TMR0           
t0l
  btfss   INTCON, INTOIF  ; attesa fine conteggio
     goto    t01
waitend:   ...               ; fine del ritardo

Come si vede, il TIMER0 può essere utilizzato nello stesso modo anche cambiando famiglia.

 


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 04/04/13.