Timer PIC... sfasati!
Buonasera...
premesso che probabilmente lo sfasato sono io ;) : devo realizzare due conteggi di tempo con un PIC 18F4620:
per fare ciò sto utilizzando con profitto il TIMER0 e il TIMER2: riesco ad effettuare il conteggio con buona precisione e ripetibilità; l'anomalia sta nella differenza del calcolo teorico rispetto al riscontro pratico
TIMER 0 Obiettivo:un conteggio ogni secondo
- f osc=20MHz -> 5 MIPS -> 1 conteggio ogni 0,2 us
- prescaler 1:16 -> conteggio ogni 3,2 us
- conteggio 8 bit (255) -> interrupt di fondo scala ogni 816 us
- ogni 1225,5 interrupt dovrei contare 1 secondo (tralasciamo lo 0,5 e lo accettiamo come errore: 1225)
Invece per ottenere il valore più viciono a 1 secondo (1,006 s) devo contare 1208 interrupt.. ?_?
TIMER 2 Obiettivo:un conteggio ogni 18 ms
- f osc=20MHz -> 5 MIPS -> 1 conteggio ogni 0,2 us
- prescaler=1
- postscale=1
per ottenere un conteggio ogni 18 ms devo ottenere un fattore 90000 che ottengo imponendo il valore di compare PR2 del timer a 200 e contando 450 interrupt di fondo scala.
Anche in questo caso per ottenere circa 18 ms devo mettere PR2=140, valore che differisce di molto dal valore calcolato.
Dove sbaglio? Ecco il code..
premesso che probabilmente lo sfasato sono io ;) : devo realizzare due conteggi di tempo con un PIC 18F4620:
per fare ciò sto utilizzando con profitto il TIMER0 e il TIMER2: riesco ad effettuare il conteggio con buona precisione e ripetibilità; l'anomalia sta nella differenza del calcolo teorico rispetto al riscontro pratico
TIMER 0 Obiettivo:un conteggio ogni secondo
- f osc=20MHz -> 5 MIPS -> 1 conteggio ogni 0,2 us
- prescaler 1:16 -> conteggio ogni 3,2 us
- conteggio 8 bit (255) -> interrupt di fondo scala ogni 816 us
- ogni 1225,5 interrupt dovrei contare 1 secondo (tralasciamo lo 0,5 e lo accettiamo come errore: 1225)
Invece per ottenere il valore più viciono a 1 secondo (1,006 s) devo contare 1208 interrupt.. ?_?
TIMER 2 Obiettivo:un conteggio ogni 18 ms
- f osc=20MHz -> 5 MIPS -> 1 conteggio ogni 0,2 us
- prescaler=1
- postscale=1
per ottenere un conteggio ogni 18 ms devo ottenere un fattore 90000 che ottengo imponendo il valore di compare PR2 del timer a 200 e contando 450 interrupt di fondo scala.
Anche in questo caso per ottenere circa 18 ms devo mettere PR2=140, valore che differisce di molto dal valore calcolato.
Dove sbaglio? Ecco il code..

- Codice: Seleziona tutto
sub procedure interrupt
if(INTCON.TMR0IF)then 'è un INTERRUPT di TIMER 0
TMR0L=0
INTCON.TMR0IF=0 'set T0IE, clear T0IF
Inc(cnt) 'increment value of cnt on every interrupt
if(cnt>=1208)then '1,006 sec
cnt=0
inc(sec)
end if
TMR0L=0
INTCON.TMR0IF=0 'set T0IE, clear T0IF
end if
if(PIR1.TMR2IF)then
TMR2=0
PIR1.TMR2IF=0
Inc(cnt2)
if(cnt2>=450)then 'è un INTERRUPT di TIMER 2
cnt2=0 '450+140PR2=28 Hz
end if 'circa 1 km/h (27 Hz)
TMR2 =0
PIR1.TMR2IF=0
end if
end sub
main:
'TIMER 2 -----------------------------------------------------------------------
T2CON=%00000100 'postscale=1 , acceso, prescaler 1
TMR2=0
PIE1.TMR2IE=1
PIR1.TMR2IF=0
PR2=140
'TIMER 0------------------------------------------------------------------------
T0CON=%11000011 'TIMER 0, 8 bit, gli assegno il PRESCALER, prescaler 16
TMR0L=0 'Valore iniziale
TMR0H=0
'-------------------------------------------------------------------------------
INTCON=%11100000 'Abilito interrupt timer0 e timer2
while(1)
wend
end.
