Esempio n. 1
0
void time_init()
{
	pinPullup(RTC_INT_P, PU_EN);

#if RTC_SRC != RTC_SRC_INTERNAL
	EICRA |= _BV(ISC01);
	EIMSK |= _BV(INT0);
#endif

	time_wake();
}
Esempio n. 2
0
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();
}
Esempio n. 3
0
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);
		}
	}
}