Sida 1 av 1
1ms fördröjning blir ca 250ms?
Postat: 12 september 2006, 22:10:28
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...
Postat: 12 september 2006, 22:17:03
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.
Postat: 12 september 2006, 23:42:04
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?
Postat: 12 september 2006, 23:44:55
av sodjan
*Visa* koden istället för dåliga förklaringar till vad du *tror* att koden gör...
Postat: 13 september 2006, 02:38:46
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
Postat: 13 september 2006, 09:59:52
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.
Postat: 13 september 2006, 13:35:49
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"...
Postat: 13 september 2006, 13:46:13
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
Postat: 14 september 2006, 08:10:29
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.
Postat: 14 september 2006, 10:36:04
av sodjan
Jaha ??
Helt ointressant om det "bara" var ett exemepl, fungerar det nu ???
Och i så fall, vad var problemet ??
Postat: 14 september 2006, 10:48:38
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.
Postat: 14 september 2006, 10:57:26
av sodjan
OK.
Det har nog med hur du "sätter om" tmr0...
Postat: 14 september 2006, 11:02:26
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.
Postat: 14 september 2006, 21:04:43
av Chribbe76
Även om man adderar timern så blir det inte garanterat exakt eftersom prescalern nollställs när man adderar timern.