#include <util/delay.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
+#include <avr/power.h>
#include <avr/wdt.h>
#include "lights.h"
void hw_setup()
{
+ wdt_enable(WDTO_1S);
init_pwm();
init_adc();
init_tmr();
set_sleep_mode(SLEEP_MODE_IDLE);
}
-int main(void)
+void hw_suspend()
{
- log_init();
- wdt_enable(WDTO_1S);
+ susp_pwm();
+ susp_adc();
+ susp_tmr();
+ susp_gpio();
+ wdt_disable();
+}
+
+
+void power_down()
+{
+ // enable PCINT14, so that user can wake up later
+ GIMSK |= _BV(PCIE1);
+ PCMSK1 |= _BV(PCINT14);
+
+ // G'night
+ set_sleep_mode(SLEEP_MODE_PWR_DOWN);
+ sleep_enable();
+ sleep_bod_disable();
+ sei();
+ sleep_cpu();
+
+ // G'morning
+ cli();
+
+ sleep_disable();
- _delay_ms(100);
+ // Disable PCINT14
+ GIMSK &= ~_BV(PCIE1);
+ PCMSK1 &= ~_BV(PCINT14);
hw_setup();
+}
+
+
+ISR(PCINT_vect)
+{
+ GIMSK &= ~_BV(PCIE1);
+ PCMSK1 &= ~_BV(PCINT14);
+}
+
+int main(void)
+{
+ log_init();
+ power_usi_disable(); // Once for lifetime
log_set_state(3);
+ hw_setup();
+ hw_suspend();
+ power_down();
+
sei();
#if 1
while (1) {