Pinewood Derby med programmerbara lysdioder (3 / 4 steg)
Steg 3: Programvaran
Jag har tagit med koden nedan, samt en syntax markerade version som jag tycker är lättare
att läsa.
Jag beslutade att använda en timer för att generera ett avbrott varje 1mS eller så. Detta ger om tusen
cykler (kompilatorn kommer att spara/återställa register på avbrott, så det finns mindre än tusen)
mellan avbrott. Detta bör vara tillräckligt för någon rimlig ljus blinkar schema!
Du behöver läsa spec. noggrant för att ställa in timer och avbrott. Kom ihåg att aktivera
avbrott i de viktigaste loopen. Spec. länken är http://www.atmel.com/dyn/resources/prod_documents/doc2543.pdf .
Den första bilden nedan visar de vacklade turn-on tiderna för varje LED och driftcykler
för varje. För att göra livet enkelt, beslutade jag att använda en 16mS period, så intermittensen kan sättas
till något av värdena n/16, med n = 1,..., 16. En variabel count_ms ökas varje gång
avbryta rutinen klar. Jag valde 16 eftersom jag kan bara mask från botten 4 bitar
av count_ms att räkna ut var är vi i tullen cykelperioden. Data struktur ledde
(se .h filerna nedan) indikerar den vacklade starta tid för varje LED, och hur lång tid det
bör finnas kvar på.
Jag har några ytterligare kod att växla de gula lysdioderna, så på mest en gul lysdiod
på som när helst. Den variabla slow_count växlar mellan varje 256mS, ungefär en fjärdedel av en
för det andra.
Med den första bilden nedan, kan du räkna ut maximalt och genomsnittliga totala LED nuvarande.
Den genomsnittliga dra (inklusive mikrokontroller) handlar om 22mA, vilket ger ca 4 timmar
av ljus. Eftersom den maximala draw är bara 42mA, det finns inget behov av en kondensator över den
Strömförsörjning (till undertrycka växlingen transienter).
Jag justerade tiderna så ljusstyrkan i varje LED var ungefär samma. Gula
och röda lysdioderna har diffusorer, den vita lysdioden har en lins, som fungerar ungefär som
en riktig bil. De vita lysdioderna var mycket ljusa. Det finns ett något synlig flimmer (på 1000/16 Hz),
men det är acceptabla, och uppmärksammar när bilen rör sig.
En flerkanalig omfattning gör lätt arbete för felsökning. Jag vet inte hur jag skulle ha hittat
mitt fel annars. Det finns faktiskt en subtil bugg i koden, men det spelar ingen roll i det
Det är ett hörn fall som är irrelevant. Om pulse_on_time är satt till 0, då motsvarande
LED kommer att stanna på hela tiden! Fix är att också kontrollera att en LED är påslagen endast om den
värdet på pulse_on_time är noll. Dock detta förlänger koden onödigt, om du
vill en i tid av 0, bara kommentera ut det LED!
ATtiny2313 säkringar måste anges på lämpligt sätt att välja den interna klockan på 1 Mhz. den
följande länk http://www.engbedded.com/fusecalc/ är användbar för att förenkla den något förvirrande
omvänd logik används för säkring programmering. Filen fuse.txt nedan visar kommandot jag använde
att programmera mikrokontroller.
Bygga instruktioner finns i filen build.txt nedan. (Bara för en sanity check, jag skriva ut den
koden storlekar och varierande karta.)