1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include <avr/sleep.h> #include <avr/power.h> #include <avr/wdt.h>
void OFFACDDC() { ACSR |= _BV(ACD); ADCSRA = 0; }
void ONACDDC() { ACSR &= ~_BV(ACIE); ACSR &= ~_BV(ACD); ADCSRA |= _BV(ADEN); ADCSRA |= _BV(ADIF); }
volatile int f_wdt = 1;
ISR(WDT_vect) { f_wdt++; }
void wdt_setup(int ii) { byte bb; if (ii > 9 ) ii = 9; bb = ii & 7; if (ii > 7) bb |= (1 << 5); bb |= (1 << WDCE); MCUSR &= ~(1<<WDRF); WDTCSR |= (1<<WDCE) | (1<<WDE); WDTCSR = bb; WDTCSR |= _BV(WDIE); }
void enterSleep(void) { set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sleep_mode(); sleep_disable(); power_all_enable(); }
void setup() { OFFACDDC(); wdt_setup(8); }
void loop() {
if (f_wdt >= 15) { ONACDDC();
f_wdt = 0; OFFACDDC(); }
enterSleep(); }
|