void time_sleep() { // TCCR2B = _BV(CS22)|_BV(CS20); // while(ASSR & (_BV(OCR2BUB)|_BV(TCR2AUB)|_BV(TCR2BUB))); #if RTC_SRC != RTC_SRC_INTERNAL // Turn off square wave rtc_sqw(RTC_SQW_OFF); alarm_s alarm; // Set next alarm if(alarm_getNext(&alarm)) { alarm.days = alarm_getNextDay() + 1; rtc_setUserAlarmWake(&alarm); } else rtc_setUserAlarmWake(NULL); // if(appConfig.volHour) { alarm.min = 0; alarm.hour = 0; alarm.days = 0; rtc_setSystemAlarmWake(&alarm); } else // Hour beep volume set to minimum, so don't bother with the system alarm rtc_setSystemAlarmWake(NULL); #endif update = false; }
void ds3231_init() { // Set registers byte data; // Control // Enable oscillator read(DS3231_ADDR_CTRL, &data, 1); CLEAR_BITS(data, DS3231_BIT_EOSC, DS3231_BIT_RS1, DS3231_BIT_RS2); write(DS3231_ADDR_CTRL, data); // Status // Turn off 32KHz output // Unset alarm 1 & 2 interrupts read(DS3231_ADDR_STATUS, &data, 1); CLEAR_BITS(data, DS3231_BIT_EN32KHZ, DS3231_BIT_A2F, DS3231_BIT_A1F); write(DS3231_ADDR_STATUS, data); // Set 1Hz output rtc_sqw(RTC_SQW_ON); }
rtcwake_t time_wake() { #if RTC_SRC != RTC_SRC_INTERNAL getRtcTime(); // Turn on square wave rtc_sqw(RTC_SQW_ON); // update = false; // Check alarms bool userAlarm = rtc_userAlarmState(); bool systemAlarm = rtc_systemAlarmState(); if(userAlarm && systemAlarm) return RTCWAKE_USER_SYSTEM; else if(userAlarm) return RTCWAKE_USER; else if(systemAlarm) return RTCWAKE_SYSTEM; #endif return RTCWAKE_NONE; }