Stap 3: De software
Ik heb ook de onderstaande code, evenals een syntaxis gemarkeerde versie die ik vind makkelijker
om te lezen.
Ik besloot om een timer gebruiken om een interrupt genereren elke 1mS of zo. Dit geeft over duizend
cycli (de compiler zal opslaan/herstellen registers op onderbreken, zodat er minder dan duizend)
tussen interrupts. Dit zou moeten volstaan voor een redelijk licht knipperen schema!
U moet lezen de spec. zorgvuldig om het instellen van de timer en interrupts. Vergeet niet om in te schakelen
interrupts in de hoofdlus. De spec. link is http://www.atmel.com/dyn/resources/prod_documents/doc2543.pdf .
De eerste afbeelding hieronder toont de gespreide turn-on tijden voor elke LED en de plicht-cycli
voor elk. Leven om eenvoudig te maken, besloten heb ik om het gebruik van een periode van 16 MS, dus het pulserend sproeien kan worden ingesteld
op elk van de n/16 waarden, met n = 1,..., 16. Een variabele count_ms wordt verhoogd telkens
de interrupt routine klaar. Ik koos voor 16 omdat ik kan gewoon masker uit de bodem 4 bits
count_ms om erachter te komen waar zijn wij de plicht cyclusperiode. De structuur van de gegevens onder leiding
(Zie de .h-bestanden hieronder) toont u de gespreide start tijd voor elke LED, en hoe lang het
moet blijven.
Ik heb enkele aanvullende code om te wisselen van de gele LEDs, dus hooguit een gele LED
brandt op elk gewenst moment. De variabele slow_count wordt iedere 256mS, ongeveer een kwart van een
tweede.
De eerste afbeelding hieronder gebruikt, kunt u berekenen van de maximale en gemiddelde totale LED huidige.
De gemiddelde trekken (met inbegrip van de microcontroller) is over 22mA, waardoor ongeveer 4 uur
van licht. Aangezien de maximale trekken alleen 42mA is, er is geen noodzaak voor een condensator over de
voeding (te onderdrukken switch transiënten).
Ik heb de op-keer aangepast zodat de helderheid van de LED ongeveer hetzelfde was. De gele
en rode LEDs hebben diffusers, de witte LED heeft een lens, die vergelijkbaar met de werkt
een echte auto. De witte LED's waren zeer helder. Er is een licht zichtbaar flikkering (bij 1000/16 Hz),
maar het is verdraaglijk, en vestigt de aandacht wanneer de auto beweegt.
Een meerkanaals-scope maakt het gemakkelijke werk van het opsporen van fouten. Ik ben niet zeker hoe ik zou hebben gevonden
mijn insecten anders. Er is eigenlijk een subtiele bug in de code, maar het maakt niet uit dat
het is een zaak van de hoek die irrelevant is. Als de pulse_on_time is ingesteld op 0, dan is de corresponderende
LED zal aanblijven op de allertijden! De oplossing is ook controleren dat een LED alleen als is ingeschakeld het
waarde van pulse_on_time is niet nul. Echter, dit verlengt de code onnodig, als u
wil een tijdig van 0, net reactie uit dat LED!
De zekeringen ATtiny2313 op passende wijze moeten worden ingesteld op het selecteren van de interne klok van 1 Mhz. de
na koppeling http://www.engbedded.com/fusecalc/ is handig om te vereenvoudigen het enigszins verwarrend
omgekeerde logica die wordt gebruikt voor het programmeren van de zekering. Het fuse.txt bestand hieronder toont de opdracht ik gebruikte
de microcontroller te programmeren.
De build-instructies staan in het bestand build.txt hieronder. (Alleen voor een geestelijke gezondheid te controleren, ik print uit de
maten van de code en de variabele kaart.)