00001
00048
00049 #include <stdint.h>
00050 #include <stdbool.h>
00051
00052 #include <avr/io.h>
00053 #include <avr/sleep.h>
00054 #include <avr/interrupt.h>
00055 #include <avr/wdt.h>
00056 #include <util/delay.h>
00057
00058
00059
00060
00061 #ifndef F_CPU
00062 # define F_CPU 1000000UL
00063 #endif
00064
00065
00067 uint8_t gState = 0;
00068 volatile bool run = false;
00069
00070
00075 void LOWPOWER_Init(void)
00076 {
00077 wdt_disable();
00078 sleep_bod_disable();
00079
00080 PRR = (1 << PRTWI) | (1 << PRTIM2 ) | (1 << PRTIM1 ) | \
00081 (1 << PRTIM0 ) | (1 << PRSPI ) | (1 << PRUSART0 ) | (1 << PRADC ) ;
00082
00083
00084 DDRB = 0x00;
00085 PORTB = 0xFF;
00086 DDRC = 0x00;
00087 PORTC = 0xFF;
00088 DDRD = 0x00;
00089 PORTD = 0xFF;
00090
00091 DIDR1 = (1 << AIN1D) | (1 << AIN0D);
00092 DIDR0 = (1 << ADC5D) | (1 << ADC4D) | (1 << ADC3D) | (1 << ADC2D) | (1 << ADC1D) | (1 << ADC0D);
00093 }
00098 void RTC_Init(void)
00099 {
00100 PRR &= ~(1 << PRTIM2 );
00101 ASSR |= (1 << AS2);
00102 }
00107 void Disable_RTC(void)
00108 {
00109 ASSR &= ~(1<<AS2);
00110 PRR |= (1 << PRTIM2 );
00111 }
00116 void LED_Init(void)
00117 {
00118 DDRC |= (1 << PINC1) | (1 << PINC2) | (1 << PINC3) | (1 << PINC4);
00119 PORTC |= (1 << PINC1) | (1 << PINC2) | (1 << PINC3) | (1 << PINC4);
00120 _delay_ms( 500 );
00121 PORTC &= ~((1 << PINC1) | (1 << PINC2) | (1 << PINC3) | (1 << PINC4));
00122 }
00127 void ASYNC_Init(void)
00128 {
00129 EICRA = 0x0;
00130 EIMSK |= (1 << INT0);
00131 }
00136 int main(void)
00137 {
00138 LOWPOWER_Init();
00139 ASYNC_Init();
00140 LED_Init();
00141
00142 for(;;) {
00143 switch(gState) {
00144 case 0:
00145 DDRC = (1 << PINC4);
00146 PORTC = (1 << PINC4);
00147 break;
00148
00149 case 1:
00150 set_sleep_mode(SLEEP_MODE_IDLE);
00151 DDRC = (1 << PINC3);
00152 PORTC = (1 << PINC3);
00153 break;
00154
00155 case 2:
00156 set_sleep_mode(SLEEP_MODE_PWR_SAVE);
00157 DDRC = (1 << PINC2);
00158 PORTC = (1 << PINC2);
00159 RTC_Init();
00160 break;
00161
00162 case 3:
00163 set_sleep_mode(SLEEP_MODE_PWR_DOWN);
00164 DDRC = (1 << PINC1);
00165 PORTC = (1 << PINC1);
00166 break;
00167
00168 default:
00169 gState = 1;
00170 set_sleep_mode(SLEEP_MODE_IDLE);
00171 DDRC = (1 << PINC3);
00172 PORTC = (1 << PINC3);
00173 }
00174
00175 sei();
00176 _delay_ms( 250 );
00177
00178 while ( !(PIND & (1 << PIND2))){
00179 }
00180 run = false;
00181
00182 PORTC &= ~((1 << PINC1) | (1 << PINC2) | (1 << PINC3) | (1 << PINC4));
00183 DDRC = 0x0;
00184
00185 if (gState == 0) {
00186 while (!run ){
00187 }
00188 } else {
00189 cli();
00190 sleep_enable();
00191 sleep_bod_disable();
00192 sei();
00193 sleep_cpu();
00194 sleep_disable();
00195 cli();
00196
00197 if (gState == 2) {
00198 Disable_RTC();
00199 }
00200 }
00201 gState++;
00202 if (gState > 3) gState =0;
00203 }
00204 }
00209 ISR(INT0_vect)
00210 {
00211 run = true;
00212 }