Hallo,
Ik wou de tijdsduur tussen 2 interrupts van timer0 bij PIC18F4550 uitrekenen en dacht dat met volgende formule te doen:
1/(20 MHz / 4 / 256 / 2^16) = 3.355 sec
-de kristal die ik gebruik is 20 MHz
-ik ging er van uit dat de pic 4 clockpulsen nodig heeft om 1 instructie uit te voeren
-de prescaler staat op 1/256
-16 bit modus: de interrupt wordt uitgevoerd wanneer de 2 bytes 256 zijn = 2^16
Maar... als ik tel is op 120 seconden tijd de led 86 keer aan of uit: 120/86 = 1.395 sec.
Wat doe ik fout in mijn berekening?
Dit is de code die ik gebruik en de instellingen in winpic zitten in bijlage:
code:
;instellingen timer0
T08BIT = 0 ; 0= 16 bit, 1= 8 bit
T0CS = 0 ; 0 = timer, 1 = counter (stgt bij T0CKI pin)
T0SE = 0 ; indien counter: 0 = stgt bij low to high op T0CKI pin, 1 = bij high to low
;prescaler:
PSA = 0 ; prescaler gebruiken voor timer0 teller?: 0 = gebruiken, 1 = niet gebruiken
T0PS0 = 1
T0PS1 = 1
T0PS2 = 1
; 111 = 1/256
; 110 = 1/128
; 101 = 1/64
; 100 = 1/32
; 011 = 1/16
; 010 = 1/8
; 001 = 1/4
; 000 = 1/2
; formule tijd (s) = 1 / (20*10^6 Hz / 4 / prescale / (256 of 2^16 - startwaarde timer + 2) )
GIE = 1 ; schakel interupts in het algemeen in
TMR0IE = 1 ; schakel timer0 overflow interrupt in
TMR0ON = 1 ; start timer0
procedure interruptprocedures is
pragma interrupt ; deze procedure wordt uitgevoerd wanneer er EEN interrupt is
if TMR0IF == 1 then ; timer0 overflow interrupt flag: kijk of het gaat om een interrupt door timer0
; bij 8 bit: FFh --> 00h, bij 16 bit: FFFFh --> 0000h
if groenled == 1 then
groenled = 0
else
groenled = 1
end if
TMR0H = 0 ; stel waarde timer in (TMR0H wordt pas echt geschreven na TMR0L te schrijven)
TMR0L = 0
; indien je deze waarden wil uitlezen: TMR0H krijgt pas de juiste waarde na TMR0L te lezen
TMR0IF = 0 ; interrupt flag terug op 0 zetten
end if
end procedure
forever loop
end loop