Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #include <avr/sleep.h>
  2. #include <avr/power.h>
  3. #include <avr/wdt.h>
  4.  
  5. #ifndef cbi
  6. #define cbi(sfr,bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
  7. #endif
  8. #ifndef sbi
  9. #define sbi(sfr,bit) (_SFR_BYTE(sfr) |= _BV(bit))
  10. #endif
  11.  
  12. #define BODS 7                   //BOD Sleep bit in MCUCR
  13. #define BODSE 2                  //BOD Sleep enable bit in MCUCR
  14. uint8_t mcucr1, mcucr2;
  15.  
  16. #define LED1_PIN 3
  17. #define LED2_PIN 4
  18.  
  19. // milliseconds
  20. #define BLINK_RATE 200
  21.  
  22. volatile boolean f_wdt;
  23. volatile boolean f_btn;
  24.  
  25. // 8 = 4 seconds
  26. // 9 = 8 seconds
  27. #define WATCHDOG_SETTING 8
  28.  
  29. extern volatile unsigned long timer0_overflow_count; // specific to attiny
  30.  
  31. void setup() {
  32.   pinMode(LED1_PIN,OUTPUT);
  33.   pinMode(LED2_PIN,OUTPUT);
  34.  
  35.   // Power down various bits of hardware to lower power usage  
  36.   set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  37.   sleep_enable();
  38.  
  39.   disable_adc();
  40.   disable_ac();
  41.   disable_brown_out_detector();
  42.  
  43.   f_wdt = 0;
  44.   disable_watchdog();
  45.   setup_watchdog(WATCHDOG_SETTING);
  46.  
  47.   // enable global interrupts
  48.   sei();
  49. }
  50.  
  51. void loop() {
  52.   goToSleep();
  53.    
  54.   if( f_wdt == 1 ) {
  55.     digitalWrite(LED1_PIN,HIGH);
  56.     digitalWrite(LED2_PIN,HIGH);
  57.    
  58.     delay(BLINK_RATE);
  59.    
  60.     digitalWrite(LED1_PIN,LOW);
  61.     digitalWrite(LED2_PIN,LOW);
  62.    
  63.     f_wdt = 0;
  64.   }
  65. }
  66.    
  67. void goToSleep() {
  68.   sleep_cpu();
  69. }
  70.  
  71. void disable_brown_out_detector() {
  72.   mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE);
  73.   mcucr2 = mcucr1 & ~_BV(BODSE);
  74.   MCUCR = mcucr1;
  75.   MCUCR = mcucr2;
  76. }
  77.  
  78. void disable_adc() {
  79.   cbi(ADCSRA,ADEN);
  80. }
  81.  
  82. void disable_ac() {
  83.   sbi(ACSR,ACD);
  84. }
  85.  
  86. //****************************************************************
  87. // 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
  88. // 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
  89. void setup_watchdog(int ii) {
  90.   byte bb;
  91.   int ww;
  92.   if (ii > 9 ) ii=9;
  93.   bb=ii & 7;
  94.   if (ii > 7) bb|= (1<<5);
  95.   bb|= (1<<WDCE);
  96.   ww=bb;
  97.  
  98.  
  99.   MCUSR &= ~(1<<WDRF);
  100.   // start timed sequence
  101.   WDTCR |= (1<<WDCE) | (1<<WDE);
  102.   // set new watchdog timeout value
  103.   WDTCR = bb;
  104.   WDTCR |= _BV(WDIE);
  105. }
  106.  
  107. void disable_watchdog() {
  108.   cbi(WDTCR,WDIE);
  109. }
  110.  
  111. ISR (WDT_vect) {
  112.   f_wdt = 1;
  113. }