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' utilizzar
e
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.