1 HZ är en frekvens, ingen tid (vilket ju en delay bör mätas i).
Men vi antar att du menar 1 sekund...
Pretar vi om ungefär 1 sek eller så noggrant som kristallen klarar av ?
OK, 4 Mhz, då är signalen in till prescalern 1 Mhz.
Om du sätter prescaler till 1:64 så får du ca 61.03
"varv" (255->0) på timer0 varje sekund. Ett litet fel som
jag inte vet om det är OK. Om du räknar 61 varv på timer0
så har du 0,9994 sekund, om jag inte räknar fel. Att hamna
exakt på 1 sekund är lite trickigare...
EDIT:
Det är enklast om du tittar på en lösning där du inte behöver
"ladda om" TMR0 varje varvj. Det blir lite struligare och du behöver
ta hänsyn till tiden det tar att ladda om registret o.s.v. Det är
mycket enklare att lämna timern "free-running".
Genom att välja en annan kristall (som är enklare att dela ner
jämt med potensen av 2) så är det mycket enklare att fixa rutiner
med bättre noggranhet i tiderna. T.ex 4.194304 MHz...
EDIT2:
På den här sidan http://www.search.com/reference/Crystal_oscillator
finns lite olika frekvenser och där kan du se vilka som är enkla att dela ner
till (t.ex) jämna sekunder.
Asm. Funderingar hos en nybörjare.
- Housepainter
- EF Sponsor
- Inlägg: 1318
- Blev medlem: 19 juli 2006, 18:50:38
- Ort: Borås
Re: Asm. Funderingar hos en nybörjare.
Ok. Jag blir lite klokare!
Men stopp och belägg. Varför delar man frekvensen in på fyra? Jag förstår inte. Det är bla. det som gäckade mig igår.
Och ja, jag borde nog har skrivit 1s och inte 1Hz.
Att det blir EXAKT är inte så noga.
Jag tänkte att man kanske kunde sätta ett delay på ca en sekund som man använder i de större delayen flera gånger.
I detta fall, om man använder 1:64 som prescaler och det slår på 0,03 så blir diffen på 24h bara ca 43 sekunder. Vilket är helt ok. (förutsatt att jag räknat rätt) 86400(sekunder går på 24h) * 61 (interupts) = 5270400
5270400 / 61.03 = 86357.52 dvs en diff på 42.5s.
Men stopp och belägg. Varför delar man frekvensen in på fyra? Jag förstår inte. Det är bla. det som gäckade mig igår.
Och ja, jag borde nog har skrivit 1s och inte 1Hz.

Att det blir EXAKT är inte så noga.
Jag tänkte att man kanske kunde sätta ett delay på ca en sekund som man använder i de större delayen flera gånger.
I detta fall, om man använder 1:64 som prescaler och det slår på 0,03 så blir diffen på 24h bara ca 43 sekunder. Vilket är helt ok. (förutsatt att jag räknat rätt) 86400(sekunder går på 24h) * 61 (interupts) = 5270400
5270400 / 61.03 = 86357.52 dvs en diff på 42.5s.
Re: Asm. Funderingar hos en nybörjare.
Använd en 16-bitars timer, sätt interrupt on overflow, då får du en int var 65535te puls
Re: Asm. Funderingar hos en nybörjare.
> Varför delar man frekvensen in på fyra?
Tja, varför inte ?
> Jag förstår inte.
Det räcker med att du kommer ihåg det...
(Men annars så är det generellt så att det mesta i en PIC styrs av "systemklockan"
som alltid är kristallfrekvensen delat med 4. Så är det bara...)
> Jag tänkte att man kanske kunde sätta ett delay på ca en sekund
Men du kan inte få det direkt via timer0 vid 4 Mhz. Det är ju lätt att räkna ut.
Du får en kortare delay där du sedan får räkna fram till 1 sek själv.
Men det är bara helt OK, det kan ju finnas annat som du vill göra oftare
än 1 sek. Det var det jag menade med att skapa en "puls" i applikationen som
sedan alla andra tids-rellaterade saker bygger på (alltså multiplar av pulsen).
> Använd en 16-bitars timer, sätt interrupt on overflow, då får du en int var 65535te puls
Ja, det är ju också OK, om du inte behöver timer1 till annat...
Tja, varför inte ?

> Jag förstår inte.
Det räcker med att du kommer ihåg det...
(Men annars så är det generellt så att det mesta i en PIC styrs av "systemklockan"
som alltid är kristallfrekvensen delat med 4. Så är det bara...)
> Jag tänkte att man kanske kunde sätta ett delay på ca en sekund
Men du kan inte få det direkt via timer0 vid 4 Mhz. Det är ju lätt att räkna ut.
Du får en kortare delay där du sedan får räkna fram till 1 sek själv.
Men det är bara helt OK, det kan ju finnas annat som du vill göra oftare
än 1 sek. Det var det jag menade med att skapa en "puls" i applikationen som
sedan alla andra tids-rellaterade saker bygger på (alltså multiplar av pulsen).
> Använd en 16-bitars timer, sätt interrupt on overflow, då får du en int var 65535te puls
Ja, det är ju också OK, om du inte behöver timer1 till annat...
Re: Asm. Funderingar hos en nybörjare.
Babysteps, Sodjan. BabystepsJa, det är ju också OK, om du inte behöver timer1 till annat...

Re: Asm. Funderingar hos en nybörjare.
Kan detta exempel vara till hjälp ? För att få till en looptid
Kod: Markera allt
; KRISTALL= 8000000 Hz
; CLKOUT = 2000000 Hz
;PROGRAM OMLOPP = 1000 ggr/s
;PRESCALER = 64
; CLKOUT
TID EQU .31 ; TID = ----------------------
; PRESCALER * OMLOPP
org 0000
PAUSE
MOVF TMR0,W ; Hämta pause räknaren
XORLW TID ; Pause klar ?
BTFSS STATUS,Z ; Ja, hoppa över !
GOTO PAUSE ; Nej, fortsätt vänta !
;
CLRF TMR0 ; Nolla pause räknaren
; Här kommer "Ditt program" som körs 1000 ggr/s i detta fallet
får
inte
stoppa
någonstans
utan måste
hitta
igenom
till
raden nedan < 1ms
goto PAUSE