Sida 1 av 1

Fel vi beräkning av tidsintervall, Timer0, pic18f458

Postat: 1 februari 2009, 15:44:01
av Johel572
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:

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
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.

Re: Fel vi beräkning av tidsintervall, Timer0, pic18f458

Postat: 1 februari 2009, 15:57:25
av JockeE
Timern tickar med Fosc / 4, dvs 4MHz.

Re: Fel vi beräkning av tidsintervall, Timer0, pic18f458

Postat: 2 februari 2009, 08:11:17
av Johel572
Tack.
Nu när du säger det så ser jag att det är Fosc/4 i ett blockdiagram. Tycker dock att det är konstigt att det inte står i texten.

Re: Fel vi beräkning av tidsintervall, Timer0, pic18f458

Postat: 2 februari 2009, 08:39:26
av TomasL
Johel572 skrev:Tack.
Nu när du säger det så ser jag att det är Fosc/4 i ett blockdiagram. Tycker dock att det är konstigt att det inte står i texten.
Står garanterat i texten.

I Databladet för 18Cxx2, i stycket "Timer0 Operation"
Timer mode, the Timer0 module will increment every
instruction cycle (without prescaler).
Står säkert motsvarande text i xx8ans datablad
Exakt samma sak står i referensmanualen för 18C(F)XXX.
Det är samma referens manual för både 18FXXX och 18CXX.

Re: Fel vi beräkning av tidsintervall, Timer0, pic18f458

Postat: 2 februari 2009, 13:08:11
av Johel572
Hm. Nu ska vi se. Ja du har så rätt TomasL det står "increment every instruction cycle". Det var jag som blandade ihop Fosc och instruction cycle.

Re: Fel vi beräkning av tidsintervall, Timer0, pic18f458

Postat: 2 februari 2009, 13:11:11
av sodjan
Ibland ser man det förkortat Fosc (d.v.s kristallen eller annan oscillator)
resp Fcyc (alltså cykelfrekvensen eller instruktionscykeln). Eller Tosc
resp Tcyc om det istället är tiden man anger (d.v.s 1/Fosc, resp 1/Fcyc).