Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // potřebné knihovny
- #include <avr/sleep.h>
- #include <avr/power.h>
- #include <avr/wdt.h>
- #define LED_PIN (13) // pojmenování pinu 13
- // zde se bude ukládat zda přišel impuls z watchdog timeru
- // hodnota 1 simuluje impuls po zapnutí, aby jsme nečekali
- volatile int impuls_z_wdt=1;
- // zde se ukládají impulsy
- volatile int citac_impulsu= 2;
- // zde nastavíme potřebný počet impulsů
- // podle nastavení WDT viz níže je jeden impuls 8 sekund
- volatile int impulsu_ke_spusteni = 2;
- /* klíčové slovo volatile říká kompilítoru jak má zacházet z proměnou
- načte proměné z paměti RAM a ne z paměťového registru. Vzhledem k
- spánkovému režimu budou tyto hodnoty určitě poté přesné.
- */
- // impuls z WATCHDOG TIMERU /////////////////
- ISR(WDT_vect)
- {
- //když je proměnná impuls_z_wdt na 0
- if(impuls_z_wdt == 0)
- {
- // zapiš do proměnné 1
- impuls_z_wdt=1;
- }
- }
- void enterSleep(void)
- {
- //nastavení nejúspornějšího módu
- set_sleep_mode(SLEEP_MODE_PWR_DOWN);
- // spánkový režim je povolený
- sleep_enable();
- // spuštění režimu spánku
- sleep_mode();
- // tady bude program pokračovat když se probudí
- // spánek zakázán
- sleep_disable();
- //znovu zapojení všech funkcí
- power_all_enable();
- }
- void setup()
- {
- //nastaví pin 13 jako výstup
- pinMode(LED_PIN,OUTPUT);
- // nastavení WATCHDOG TIMERU
- MCUSR &= ~(1<<WDRF); // neřešte
- WDTCSR |= (1<<WDCE) | (1<<WDE); // neřešte
- // nastavení času impulsu
- WDTCSR = 1<<WDP0 | 1<<WDP3; // 8 sekund, WDTCSR = B0110 --> 1 sekunda
- WDTCSR |= _BV(WDIE); //neřešte
- }
- void loop()
- {
- //když je impuls z WATCHDOG TIMERU a zároveň i potřebný jejich počet
- if ((impuls_z_wdt == 1) & (impulsu_ke_spusteni == citac_impulsu))
- {
- ///////////////////////////////////////////////////////////////
- // zde je ukázkový kód, upravte si sami podle potřeby
- digitalWrite(LED_PIN, HIGH);
- delay(3000);
- digitalWrite(LED_PIN, LOW);
- // konec ukázkového kódu, který se v nastaveném intervalu
- // bude provádět
- //////////////////////////////////////////////////////////////
- citac_impulsu = 0;// vynuluj čítač
- impuls_z_wdt = 0; // vynuluj impuls
- enterSleep();// znovu do spánku
- }
- else
- {
- enterSleep();//znovu do spánku
- }
- citac_impulsu++; // inpuls se přičte i když nic neproběhlo
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement