En komplett starter guide till AVRs (8 / 10 steg)
Steg 8: sova
En av de första sakerna att göra är köra micro på långsammaste klockan kan du samtidigt hålla koden gör det jobb, det andra är att sätta mikro i vila när du inte behöver.
Om du spelar in en långsam sensor, eller behöver du bara ta prover varje så ofta, skulle du kunna sova för längre tid och spara en hel del makt.
När du sätter din micro till sov du behöver något sätt att väcka den, eller du kommer inte kunna göra något.
Du har ett par alternativ.
En är att ställa in en watchdog timer, och den andra är att installationsprogrammet avbrott.
En watchdog timer är en separat klocka som kan köras oberoende av Mikros kod.
När det flödar över kan det utlösa ett avbrott eller återställa mikro.
Du kan använda detta till antingen vakna upp någon gång i framtiden, eller du kan använda den för att få dig ur koden som finns i en oändlig loop.
Vi kommer bara att fokusera på vakna chip här.
Det andra alternativet, en pin avbryta är möjligheten att ha micro vakna när något händer på avbrott IO pinnar.
Makten ner läge bränder avbrottet bara när stiftet går låg (som när en knapp trycks till exempel), men i passningsläge kan du avbryta på en ändring i tillstånd av PIN-koden (till exempel går från låg till hög eller visum versa).
Så, nu vet vi om olika sätt att komma ur sömn, hur får vi in det?
Här är ett exempel från den bifogade uppförandekoden:
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu();
Vakna
sleep_disable();
MCUSR = 0;
Vi anger läget först och ange sömn aktiverat, följt av ett anrop till sleep_cpu.
Processen delas i steg såhär för att förhindra dålig kod från att av misstag registrera sömn.
Det är på denna punkt kommer att somna mikro.
När det är väckt av en av de ovan nämnda källorna, den fortsätter på, där bör du inaktivera alternativet sömn omedelbart (igen, att skydda mot dålig kod).
Den sista raden rensar orsaken till Återställ (t.ex. från watchdog-timer).
Så, Hur ställer vi in watchdog timer?
WDTCSR | = (1 << WDP2) | (1 << WDP1) | (1 << WDP0) | (1 << WDIE);
3 första värdena in hur lång tid förrän en watchdog bränder (sidan 43 i databladet), i det här exemplet är det 2 sekunder (igen, ungefär).
Sist kan watchdog avbrottet.
Detta bör göras innan du går in i viloläge som i exempelkod.
Du kommer att behöva leverera en avbrottshanterare för watchdog som så:
ISR(WDT_OVERFLOW_vect)
{
LED_TOGGLE;
}
Du kan lämna det tomt om allt du vill är att vakna mikrokontroller.
Ett sista steg är att aktivera avbrott globalt genom att ringa sei(); i början av din kod.
Som för pin avbrott, kommer vi att täcka som i ett senare steg.
Om du bygger banan i bilden och använda den bifogade uppförandekoden, var 2 sekunder lysdioden att växla och under tiden mikro kommer att gå i viloläge för att spara ström.