Asm. Funderingar hos en nybörjare.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43243
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Asm. Funderingar hos en nybörjare.

Inlägg av sodjan »

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.
Användarvisningsbild
Housepainter
EF Sponsor
Inlägg: 1318
Blev medlem: 19 juli 2006, 18:50:38
Ort: Borås

Re: Asm. Funderingar hos en nybörjare.

Inlägg av Housepainter »

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.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9051
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Asm. Funderingar hos en nybörjare.

Inlägg av AndersG »

Använd en 16-bitars timer, sätt interrupt on overflow, då får du en int var 65535te puls
sodjan
EF Sponsor
Inlägg: 43243
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Asm. Funderingar hos en nybörjare.

Inlägg av sodjan »

> 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...
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9051
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Re: Asm. Funderingar hos en nybörjare.

Inlägg av AndersG »

Ja, det är ju också OK, om du inte behöver timer1 till annat...
Babysteps, Sodjan. Babysteps :)
BMI
Gått bort
Inlägg: 496
Blev medlem: 31 juli 2006, 22:29:08
Ort: Halmstad

Re: Asm. Funderingar hos en nybörjare.

Inlägg av BMI »

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
Skriv svar