void time_init() { pinPullup(RTC_INT_P, PU_EN); #if RTC_SRC != RTC_SRC_INTERNAL EICRA |= _BV(ISC01); EIMSK |= _BV(INT0); #endif time_wake(); }
void time_init() { /* delay(1000); TIMSK2 &= ~((1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2)); ASSR |= (1<<AS2); TCNT2 = 0x00; TCCR2B = (1<<CS22)|(1<<CS20); while(ASSR & 0x07); TIFR2 = 0; TIMSK2 |= (1<<TOIE2); */ /*shao pinPullup(RTC_INT_P, PULLUP_ENABLE); EICRA |= _BV(ISC00); EIMSK |= _BV(INT0);*/ pinMode(RTC_INT_P, INPUT_PULLUP); attachInterrupt(2, INT2_Interrupt, CHANGE); time_wake(); }
void pwrmgr_update() { bool idle = false; LOOPR(PWR_ACTIVE_COUNT, i) { if(active[i] == PWR_STATE_BSY) // Something busy, no sleep stuff return; else if(active[i] == PWR_STATE_IDLE) idle = true; } bool buttonsActive = buttons_isActive(); if(idle || buttonsActive) { if(systemState == SYS_CRTANIM && buttonsActive) // Cancel CRT anim if a button is pressed { display_startCRTAnim(DISPLAY_CRTANIM_OPEN); systemState = SYS_AWAKE; } else // Idle sleep mode { debugPin_sleepIdle(HIGH); sleep_mode(); debugPin_sleepIdle(LOW); } } else { if(systemState == SYS_AWAKE) // Begin CRT anim { systemState = SYS_CRTANIM; display_startCRTAnim(DISPLAY_CRTANIM_CLOSE); } else if(systemState == SYS_CRTANIM) { // Shutdown if(userState == USER_ACTIVE) userSleep(); systemState = SYS_SLEEP; set_sleep_mode(SLEEP_MODE_PWR_DOWN); time_sleep(); debugPin_sleepPowerDown(HIGH); // need to make sure no interrupts fired here! cli(); sleep_enable(); sleep_bod_disable(); sei(); sleep_cpu(); sleep_disable(); debugPin_sleepPowerDown(LOW); systemState = SYS_AWAKE; if(time_wake() != RTCWAKE_SYSTEM) // Woken by button press, USB plugged in or by RTC user alarm userWake(); set_sleep_mode(SLEEP_MODE_IDLE); } } }