00001
00064 #include "avr_compiler.h"
00065 #include "ccpwrite.h"
00066 #include "rtc_driver.h"
00067 #include "sleepmgr.h"
00068 #include "lowpower.h"
00069
00070
00085 #define SLEEP_MODE SLEEPMGR_SAVE
00086
00087
00094 #define USE_RTC
00096 #define RTC_PERIOD 5
00097
00098
00100 #ifndef F_CPU
00101 #define F_CPU 2000000
00102 #endif // F_CPU
00103
00104
00112 int main(void)
00113 {
00114
00115 LOWPOWER_Init();
00116
00117
00118 CCPWrite(&NVM.CTRLB, NVM_EPRM_bm | NVM_FPRM_bm);
00119
00120
00121 SLEEPMGR_Init();
00122 #ifdef SLEEP_MODE
00123 SLEEPMGR_Lock( SLEEP_MODE );
00124 #endif // SLEEP_MODE
00125
00126
00127
00128 #ifdef USE_RTC
00129
00130 PR.PRGEN &= ~PR_RTC_bm;
00131
00132
00133 OSC.XOSCCTRL = OSC_XOSCSEL_32KHz_gc | OSC_X32KLPM_bm;
00134 OSC.CTRL |= OSC_XOSCEN_bm;
00135
00136
00137 do { } while (!( OSC.STATUS & OSC_XOSCRDY_bm ));
00138
00139
00140 CLK.RTCCTRL = CLK_RTCSRC_TOSC_gc | CLK_RTCEN_bm;
00141
00142
00143 do { } while ( RTC_Busy() );
00144
00145
00146 RTC_Initialize( RTC_PERIOD, 0, 0, RTC_PRESCALER_DIV1024_gc );
00147
00148
00149 RTC_SetCompareIntLevel( RTC_COMPINTLVL_LO_gc );
00150 PMIC.CTRL |= PMIC_LOLVLEN_bm;
00151 sei();
00152 #endif // USE_RTC
00153
00154
00155 do {
00156
00157
00158
00159
00160 delay_us(500000);
00161
00162
00163 CCPWrite(&NVM.CTRLB, NVM_EPRM_bm);
00164
00165 SLEEPMGR_Sleep();
00166
00167
00168 CCPWrite(&NVM.CTRLB, NVM_EPRM_bm | NVM_FPRM_bm);
00169 } while (1);
00170 }
00171
00172
00173
00174
00175
00176
00177
00178 ISR(RTC_COMP_vect)
00179 {
00180 }