Fel vi beräkning av tidsintervall, Timer0, pic18f458
Postat: 1 februari 2009, 15:44:01
Jag försöker få en LED att slå på/av varje sekund med en pic18f458. Jag använder Timer0 och ”togglar” en pinne vid interruput. Bekymret är att fördröjning är betydligt längre än en sekund (ca 5s eller något vilket är helt galet).
Jag kör med 16Mhz kristall och 16-bits timer 1:256 prescaler. TMR0H och TMR0L laddas som de ska. Jag beräknar värdet till TMR0H och TMR0L genom tid/(prescaler*periodtid) dvs 1/(256*(1/(16*10e6)))=62500 => TMR0=65536-62500=3036 dvs TMR0H=11, TMR0L=220.
Initiering av Timer0:
Tänker jag fel eller kan jag missat något vi initieringen av timern? Jag förstår inte riktigt varför det blir som det blir.
Jag kör med 16Mhz kristall och 16-bits timer 1:256 prescaler. TMR0H och TMR0L laddas som de ska. Jag beräknar värdet till TMR0H och TMR0L genom tid/(prescaler*periodtid) dvs 1/(256*(1/(16*10e6)))=62500 => TMR0=65536-62500=3036 dvs TMR0H=11, TMR0L=220.
Initiering av Timer0:
Kod: Markera allt
;------------------------------------------------------------------------------
;Funktion för att konfiguera Timer0
Configure_timer0
bcf T0CON,T08BIT ;16-bits timer
bcf T0CON,T0CS ;Internal instruction cycle clock (timer mode)
bcf T0CON,T0SE ;Räkna upp på låg-till-hög flank
bcf T0CON,PSA ;Enable prescaler
bsf T0CON,T0PS2 ;1:256 prescaler, 111 på T0PS2-T0PS0
bsf T0CON,T0PS1
bsf T0CON,T0PS0
bsf INTCON,TMR0IE ;Enable Timer0 interrupts
bcf INTCON,TMR0IF ;Nollställer Timer0s interrupt flag-bit
movlw D'11' ;Sätter värdet på Timer0s register för fördröjning
movwf TMR0H
movlw D'220'
movwf TMR0L
;Observera att det inte går att stega med ICD2 vid uppdatering av TMR0H, det syns inte.
;Sätt en breakpoint efter och titta på värdet.
bsf T0CON,TMR0ON ;Starta Timer0
return