- uint16_t wake_count = 0;
- unsigned char btn;
-
-sleep_again:
- // 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();
-
- // Disable PCINT14
- GIMSK &= ~_BV(PCIE1);
- PCMSK1 &= ~_BV(PCINT14);
-
- // allow wakeup by long button-press only
- for (btn = 0; btn < 5; btn++) {
- if ((PINB & _BV(PB6)) != 0) {
- wake_count++;
- goto sleep_again;;
- }
- _delay_ms(100);
- }