Stap 2: over het programma
Functionerende modi:
--User input/opties
--Wacht-voor-slaapstand
--PWM dromen modus
Opstarten
Tijdens het opstarten lampje het LED-brandt gedurende ca. 2 seconden om aan te geven van de operatie.
Het apparaat controleert ook of de input knop werd ingedrukt en tijdens macht voor die eerste 2 seconden gehouden. Als het was, "immediate mode" wordt ingevoerd: de LEDs beginnen knipperen. Dit is meestal zo guyfrom7up kon gemakkelijk de hardware testen zonder te wachten tot vier uur;-).
Het kan ook worden gebruikt voor "catnap" type slaapstanden.
Echter we kunnen ook een beetje toevoegen van code om te variëren de pulsbreedte... whattay denken?
De Timer en IRQ-instellingen voor de eerste wacht staat
Na controle voor gebruikersinvoer, enz., en het opzetten van de IRQ, is de ATtiny13 direct geplaatst in de slaapmodus staat. In deze modus zijn slechts de timers, klokken en IRQ's functioneel. Natuurlijk, is dit een energiebesparende maatregel.
Rollover tijd voor een 16-bits-teller, per timer scaler waarde (keer approx)--
-----------------------CS00: 13.75sCS01: 110s (1m, 50s)CS02: 3520s (58m, 40s)CS00 + CS02: 14080s (3.91h)
Een ~ 4 uur wachten is mogelijk met de CS02 en CS00 vlag combinatie, een klok scaler van 1024. In deze staat, wordt de IRQ geactiveerd 4,6 keer per seconde. Het wachten staat kan goed fijn afgestemd, door het gebruik van de 16-bits-teller (duur < 4 hrs) samen met de waitstate teller (voor langere vertragingen.)
Aangezien de vier uur is net zo goed een vertraging als ieder ander, wordt niet een langere duur waitstate gebruikt. Een langere vertraging zou een triviale zaak uit te voeren.
Opmerking: guyfrom7up heeft gevonden dat de waitstate voor zijn AVR's enigszins groter is dan 4 uur, terwijl de mijne is iets minder. De interne oscillator voor de AVR is niet zeer nauwkeurig, maar het is goed genoeg voor onze behoeften...
Op 4.6 IRQ's per tweede, CPU-vermogen moet verbruik zeer laag. Natuurlijk mogen de AVR in power-down modus, zoals dat een externe wake-up signaal vereist. Onze moet worden getimed intern, dus SLEEP_MODE_IDLE onze beste keuze is.
IRQ's per seconde, voor elke scaler (circa)--
---------------------CS00: 4766 /s (during dream phase)CS01: 593.8 /sCS02: 18.6 /sCS00 + CS02: 4.6 /s (during initial waitstate)
De Timer en IRQ-instellingen voor dromen PWM-modus
De timer scaler waarde verandert in CS00 wanneer MODE_DREAMING begint--om de zachte overgangen van de pwm software maken. De taakcyclus voor de CPU (en IRQ) is veel groter (ongeveer 4,7 K per seconde.) Maar de taakcyclus van de LED is veel kleiner dan zou met een eenvoudige aan/uit-schakelaar. Een afweging tussen de cpu en LED huidige tekenen...
De totale pulsbreedte (lengte) van de LED knipperen wordt gecontroleerd door de constanten MACRO_WIDTH en MACRO_GAP. De PWM wordt verwerkt door het verhogen van de pwm en overgang variabelen door de constanten PWM_VAL en TRANS_VAL. deze constanten wijzigen zal veranderen hoe snel de PWM "hellingen omhoog."
Op dit moment de dromen frequentie LED polsslag is ongeveer 1,5 hz.
De grootte van het programma
De huidige versie (0.2b) gebruikt alleen 438 bytes van flitsgeheugen. Dit is lager is dan de limiet van 1 K op de ATtiny13.
Dus het toevoegen van meer functies is zeker doe-staat.