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
retHehe, 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.
Marcel
AVR C tutorial http://expand.xs4all.nl/avr
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.