Stap 8: slapen
Een van de eerste dingen om te doen de micro wordt uitgevoerd op de langzaamste klok die je kunt terwijl de code doet het werk, het andere ding is dat de micro om te slapen wanneer u niet nodig hebt.
Als u een langzame sensor aan het opnemen bent, of je alleen moet monsters te nemen elke zo vaak, is het mogelijk kunt slapen voor langere tijd en een heleboel energie besparen.
Wanneer u premieaffaires te ontvangen uw micro slapen u moet een manier om het wakker te worden, of u zult kunnen om iets te doen.
Je hebt een paar opties.
Een is een watchdog-timer instellen, en de andere is om setup interrupts.
Een watchdog-timer is een aparte klok die uitgevoerd onafhankelijk van de micro's code.
Als het overloopt kan het teweegbrengen van een interrupt of herstellen van de micro.
U kunt dit gebruiken ofwel wakker van enige tijd in de toekomst, of kunt u het get you out of code die is in een oneindige lus.
We gaan alleen te concentreren op de chip hier wakker.
De andere optie, een pin-interrupt is de mogelijkheid om de micro kielzog omhoog wanneer er iets gebeurt op de interrupt IO pinnen.
Aan de macht naar beneden modus, de interrupt alleen gestart als de pin laag gaat (zoals wanneer een knop wordt ingedrukt bijvoorbeeld), maar in de standby-modus u op een verandering in de staat van de pin onderbreken kunt (zoals gaande van laag naar hoog of visa versa).
Dus, nu we weten over manieren om uit de slaap, hoe krijgen we erin?
Hier is een voorbeeld van de bijgevoegde code:
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu();
Word wakker
sleep_disable();
MCUSR = 0;
Wij Stel de modus eerst, en stel vervolgens slaap ingeschakeld, gevolgd door een aanroep van sleep_cpu.
Het proces is onderverdeeld in stappen als dit om te voorkomen dat slechte code per ongeluk slaap.
Het is op dit punt dat de micro in slaap zal zijn.
Wanneer het is gewekt door een van de hierboven genoemde bronnen, blijft het op, waar moet u onmiddellijk de optie slaapstand uitschakelen (nogmaals, om te beschermen tegen slechte code).
De laatste regel wordt de oorzaak van het resetten (zoals vanaf de watchdog-timer) gewist.
Dus, hoe we de watchdog-timer instellen?
WDTCSR | = (1 << WDP2) | (1 << WDP1) | (1 << WDP0) | (1 << WDIE);
De eerste 3 waarden instellen hoe lang tot de watchdog branden (bladzijde 43 in het gegevensblad), in dit voorbeeld is het 2 seconden (weer, ongeveer).
De laatste kan de watchdog-interrupt.
Dit moet worden gedaan alvorens de slaapstand zoals in de voorbeeldcode.
U zult moeten leveren een interrupt handler voor de watchdog als volgt:
ISR(WDT_OVERFLOW_vect)
{
LED_TOGGLE;
}
U kunt het leeg laten als alles wat je wilt is de microcontroller de slaapstand wordt gehaald.
Een laatste stap is het inschakelen van de onderbreekt wereldwijd door te bellen naar sei(); aan het begin van uw code.
Wat betreft de pin interrupts, zullen wij behandelen die in een latere stap.
Als u het bouwen van het circuit in de afbeelding en gebruik de bijgevoegde code, elke 2 seconden zal de LED wisselen, en in de tussentijd de micro zal gaan slapen om energie te besparen.