Hallo,
Ik ben even aan het experimenteren met een avr microcontroller met een 10Mhz kristal. Ik schreef een testprogramma om een ledje te laten knipperen. Nu wou ik het laten pinken om de seconde. Bleek dat de led veel te snel knipperde, na wat foefelen lukte het om deze om de 1.4s te laten knipperen. Maar als ik dan nareken, is de delay:
0.1µs * 1024 * 240 * 200 *60 = 294s ??

 
.include	"2313def.inc"

.def		temp 		=R16
.def		tellerL		=R17
.def		tellerH		=R18

.equ		start	=0b00000101		
.org 0x00

rjmp		restart


restart:
ldi		temp,ramend
out		spl,temp
ser		temp
out		DDRB,temp
rjmp 		main

main:
ser		temp
out		portb,temp
rcall		delay
clr		temp
out		portb,temp
rcall		delay
rjmp main


delay:
clr		tellerL					;clear 16 bit teller
clr		tellerH
loop:	
clr		temp					;inhoud teller0 resetten
out		TCNT0,temp	
ldi		temp,start				;teller begint te lopen op ck/1024
out		TCCR0,temp
loop1:
in		temp,TCNT0
cpi		temp,240
brlo		loop1			
inc 		tellerL
cpi		tellerL,200
brlo		loop1
clr		tellerL
inc		tellerH
cpi		tellerH,60
brlo		loop
ret

Dit valt onder: "Hoe schiet ik een vlieg dood met een kanon ?".

Hehe, da's wel een feit, maar het is louter het eerste experimeenteerwerk. Dit is het mijn eerste experiment met een microcontroller. Ik ben enkele weken gestart met een kennis vanaf nul.

Ondertussen heb ik al een deftig programma geschreven, maar nog nog niet kunnen testen in praktijk, wegens gebrek aan een programmer. Die heb ik ondertussen.

Omdat dat projectje infrarood moet gaan zenden moet de timing zeker kloppen. Nu test ik dit eens met een led die ik zelf kan chronometreren, maar blijkt dus niet te kloppen met mijn voorspelling. Dus in mijn infrarood code zal de timing dus ook niet gaan uitkomen.

Nu, kan iemand eens kijken naar de timing in dit knipperlicht, waar zit mijn fout?

Je vergeet de timer te resetten. Wanneer deze 240 is geweest loopt die door naar 255, terug naar 0 en weer naar 240. Hij zou dus iets trager moeten zijn.

Loopt de uC ook echt op het kristal? Stel dat hij op een interne klok van 2 Mhz loopt:

1024 x 256 x 200 x 60 / 2E9 = 1,57 seconden.

Het is overigens vrij link om een timer op deze manier uit te lezen. In dit geval gaat het wel goed omdat de tijd tussen het uitlezen van de timer veel kleiner is dan het interval van de timer maar zodra je met Clk/8 oid werkt of je hebt lange interrupt routines dan mis je vroeger of later een timer = 240.

Op 29 augustus 2004 15:58:56 schreef WillemJ:Loopt de uC ook echt op het kristal? Stel dat hij op een interne klok van 2 Mhz loopt:

Een AT90S2313 heeft geen interne klok, dus dat lijkt me onmogelijk. Gezien de regel:

.include	"2313def.inc"

Ga ik er vanuit dat het een AT90S2313 betreft.

Oops foutje, zag oscillator in de sheet staan maar dat is wat anders.

Nog een keer gekeken en zie nu wel je fout: je teller blijft 1000 klok cyclussen op 240 staan. Zodra hij de eerste keer 240 nadert ga je TellerL ophogen en spring je terug naar je timer controle loop. Deze is gelijk klaar omdat de timer dus nog op 240 staat. Deze loop is ongeveer 7 clockcyclussen lang en geeft dus amper vertraging. Sommetje moet dus worden:

0.1µs * 1024 * 255 * 1 * 60 = 1.56 seconde.