1ms fördröjning blir ca 250ms?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dreadful
Inlägg: 39
Blev medlem: 10 januari 2005, 02:53:50
Kontakt:

1ms fördröjning blir ca 250ms?

Inlägg av dreadful »

Har fifflat ihop en simpel led som ska blinka varje millisekund. Vet att det är för fort för att se men jag provade bara att ställa ner det så mycket det gick och det går ändå för sakta. ca 2 blink i sekunden...

Hur som helst. Använder timer0 på en PIC16F628A med prescale 8. Med intern oscillator på 4mhz får jag för mig att tmr0 då borde köra en interrupt var 8:e μs.
Räknar sedan i varje interrupt upp ett "tick" ändå tills jag kommer till 125 och trodde då att jag skulle få 1ms...

Antar att jag tänker fel någonstans, var lite väl länge sedan man skrev assembler...
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

4MHz klocka = 1MHz instruktionshastighet (och timerklocka).

Räknar upp varje mikrosekund med andra ord, och räknar runt och ger interrupt på 256 mikrosekunder.
dreadful
Inlägg: 39
Blev medlem: 10 januari 2005, 02:53:50
Kontakt:

Inlägg av dreadful »

aah, nu börjar det klarna. Blir följande exakt 1ms?

timer0 nu på prescale 4 och så börjar den räkna från 6 och uppåt tills interrupt. avbrottsrutinen sätter sedan den till 6 igen så den alltid börjar från det och inte 0.

EDIT: hmm, borde den börja från 5 eller 6 förresten om ovanstående är rätt?
sodjan
EF Sponsor
Inlägg: 43266
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

*Visa* koden istället för dåliga förklaringar till vad du *tror* att koden gör...
dreadful
Inlägg: 39
Blev medlem: 10 januari 2005, 02:53:50
Kontakt:

Inlägg av dreadful »

Tänkte jag skulle slippa klippa ur kod här och där men här kommer den iaf:

Kod: Markera allt

org 	0000h
	goto	INIT

org 	0004h
	movwf 	TEMPW		; Save W in a temporary variable
	movfw 	STATUS		; Save Status register in temporary variable
	movwf 	TEMPSTATUS	
	movfw 	TICKSTART	; Preset timer 6 steps ahead
	movwf 	TMR0

	incf 	MS,1		; Increment Millisecond counter

	movfw 	TEMPSTATUS	; Read back Status register from temporary variable
	movwf 	STATUS
	movfw 	TEMPW		; Read back W from temporary variable

	bcf 	INTCON,2 	; Clear interrupt flag
retfie

INIT
	movlw 	b'00000001'	; Set timer0 interrupt and prescale
	movwf 	OPTION_REG

	movlw 	0x06		; Preset timer 6 steps ahead
	movwf 	TICKSTART
	movwf 	TMR0

MAIN
.
.
.
	goto 	MAIN
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Om du använder Mplab...
Sätt en breakpoint i interrupt-rutinen.
Använd stopwatch för att se hur många cycler det är mellan interrupt.

Du har skrivit "incf MS,1"
Det blir tydligare om man använder ,w och ,f istället.
,f är default så du behöver inte skriva något alls.

Jag använder aldrig movfw för jag tycker det blir för likt movwf (grötar ihop sig i hjärnan), dessutom står movfw inte i databladet.
sodjan
EF Sponsor
Inlägg: 43266
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Har du tagit hänsyn till tiden från det att interruptet inträffar
fram till att du sätter TMR0 ?
Som Cribba sa, använd symbolerna istället för bitnummer.
Din save/restore av context är inte enligt "standard". Se exmepl i databladet.
Du talade om "blink i sekunden", jag ser inget i koden som "blinkar"...
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Det var ett tag sen, men ett trick jag använde när jag gjorde liknande saker var att addera ett tal till TMR0 istället för att sätta den. Det kompenserar automatiskt för cyklerna det tar att köra "introt" i ISR (allt utom cykeln där själva additionen körs, om jag minns rätt angående timerns beteende).

Alltså

movlw XXX
addwf TMR0,f
dreadful
Inlägg: 39
Blev medlem: 10 januari 2005, 02:53:50
Kontakt:

Inlägg av dreadful »

Tack för alla tips!

Och ang. blink så var det bara något jag gjorde som exempel. LEDen styrs av MS räknaren inne i MAIN loopen.
sodjan
EF Sponsor
Inlägg: 43266
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jaha ??

Helt ointressant om det "bara" var ett exemepl, fungerar det nu ???
Och i så fall, vad var problemet ??
dreadful
Inlägg: 39
Blev medlem: 10 januari 2005, 02:53:50
Kontakt:

Inlägg av dreadful »

Ja det fungerade i det stora hela innan jag postade kodsnutten. Verkar dock inte bli exakt 1ms enligt mplabs stopwatch. Men det ska jag kolla lite närmare på.

Det var jag som först tänkte lite fel ang. prescale och med mikrosekunder hit och dit.
sodjan
EF Sponsor
Inlägg: 43266
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK.
Det har nog med hur du "sätter om" tmr0...
dreadful
Inlägg: 39
Blev medlem: 10 januari 2005, 02:53:50
Kontakt:

Inlägg av dreadful »

Ja, jag ska prova med att addera på tmr0 istället som cyr föreslog och se om det blir någon skillnad.
Användarvisningsbild
Chribbe76
EF Sponsor
Inlägg: 1167
Blev medlem: 17 januari 2004, 22:43:17
Ort: Stockholm

Inlägg av Chribbe76 »

Även om man adderar timern så blir det inte garanterat exakt eftersom prescalern nollställs när man adderar timern.
Skriv svar