Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1.  
  2. // potřebné knihovny
  3. #include <avr/sleep.h>
  4. #include <avr/power.h>
  5. #include <avr/wdt.h>
  6.  
  7. #define LED_PIN (13) // pojmenování pinu 13
  8.  
  9. // zde se bude ukládat zda přišel impuls z watchdog timeru
  10. // hodnota 1 simuluje impuls po zapnutí, aby jsme nečekali
  11. volatile int impuls_z_wdt=1;
  12. // zde se ukládají impulsy
  13. volatile int citac_impulsu= 2;
  14. // zde nastavíme potřebný počet impulsů
  15. // podle nastavení WDT viz níže je jeden impuls 8 sekund
  16. volatile int impulsu_ke_spusteni = 2;
  17.  
  18. /* klíčové slovo volatile říká kompilítoru jak má zacházet z proměnou
  19.    načte proměné z paměti RAM a ne z paměťového registru. Vzhledem k
  20.    spánkovému režimu budou tyto hodnoty určitě poté přesné.
  21. */
  22.  
  23.  
  24.  
  25. // impuls z WATCHDOG TIMERU /////////////////
  26. ISR(WDT_vect)
  27. {
  28.   //když je proměnná impuls_z_wdt na 0
  29.   if(impuls_z_wdt == 0)
  30.   {
  31.     // zapiš do proměnné 1
  32.     impuls_z_wdt=1;
  33.   }
  34. }
  35.  
  36.  
  37. void enterSleep(void)
  38. {
  39.   //nastavení nejúspornějšího módu
  40.   set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  41.   // spánkový režim je povolený
  42.   sleep_enable();  
  43.   // spuštění režimu spánku
  44.   sleep_mode();
  45.  
  46.   // tady bude program pokračovat když se probudí
  47.  
  48.   // spánek zakázán
  49.   sleep_disable();  
  50.   //znovu zapojení všech funkcí
  51.   power_all_enable();
  52. }
  53.  
  54.  
  55.  
  56. void setup()
  57. {
  58.    //nastaví pin 13 jako výstup
  59.   pinMode(LED_PIN,OUTPUT);
  60.  
  61.   // nastavení WATCHDOG TIMERU    
  62.   MCUSR &= ~(1<<WDRF); // neřešte
  63.   WDTCSR |= (1<<WDCE) | (1<<WDE); // neřešte
  64.  
  65.   // nastavení času impulsu
  66.   WDTCSR = 1<<WDP0 | 1<<WDP3; // 8 sekund, WDTCSR = B0110 --> 1 sekunda
  67.  
  68.   WDTCSR |= _BV(WDIE); //neřešte
  69. }
  70.  
  71.  
  72. void loop()
  73. {
  74.   //když je impuls z WATCHDOG TIMERU a zároveň i potřebný jejich počet
  75.   if ((impuls_z_wdt == 1) & (impulsu_ke_spusteni == citac_impulsu))
  76.   {
  77.     ///////////////////////////////////////////////////////////////
  78.     // zde je ukázkový kód, upravte si sami podle potřeby
  79.     digitalWrite(LED_PIN, HIGH);
  80.     delay(3000);
  81.     digitalWrite(LED_PIN, LOW);
  82.     // konec ukázkového kódu, který se v nastaveném intervalu
  83.     // bude provádět
  84.     //////////////////////////////////////////////////////////////
  85.    
  86.     citac_impulsu = 0;// vynuluj čítač
  87.     impuls_z_wdt = 0; // vynuluj impuls    
  88.     enterSleep();// znovu do spánku
  89.   }
  90.   else
  91.   {
  92.     enterSleep();//znovu do spánku
  93.   }
  94.   citac_impulsu++; // inpuls se přičte i když nic neproběhlo  
  95. }