wdtサンプル
_delay_msは電力の無駄なのでwdtでLEDをチカチカさせるサンプル。
// tiny2313V @ 1MHz #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <avr/wdt.h> #include <util/delay.h> /* volatile long timer = 0; ISR(WDT_OVERFLOW_vect) { } */ EMPTY_INTERRUPT(WDT_OVERFLOW_vect); int main(void) { int i; // start WDT cli(); wdt_reset(); MCUSR &= ~(1<<WDRF); // 「WDTリセットされた」フラグクリア WDTCSR |= (1<<WDCE)|(1<<WDE); // wdt変更前処理 #define _WDT_15MS ((0<<WDP3)|(0<<WDP2)|(0<<WDP1)|(0<<WDP0)) #define _WDT_30MS ((0<<WDP3)|(0<<WDP2)|(0<<WDP1)|(1<<WDP0)) #define _WDT_60MS ((0<<WDP3)|(0<<WDP2)|(1<<WDP1)|(0<<WDP0)) #define _WDT_120MS ((0<<WDP3)|(0<<WDP2)|(1<<WDP1)|(1<<WDP0)) #define _WDT_250MS ((0<<WDP3)|(1<<WDP2)|(0<<WDP1)|(0<<WDP0)) #define _WDT_500MS ((0<<WDP3)|(1<<WDP2)|(0<<WDP1)|(1<<WDP0)) #define _WDT_1S ((0<<WDP3)|(1<<WDP2)|(1<<WDP1)|(0<<WDP0)) #define _WDT_2S ((0<<WDP3)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0)) #define _WDT_4S ((1<<WDP3)|(0<<WDP2)|(0<<WDP1)|(0<<WDP0)) #define _WDT_8S ((1<<WDP3)|(0<<WDP2)|(0<<WDP1)|(1<<WDP0)) WDTCSR = (1<<WDIE)|(0<<WDE)|_WDT_1S; // wdt設定 reset=0, interrupt=1, 1sec. sei(); DDRB = 0b00001111; for(i=0;i<5;i++){ PORTB = 0b00001111; _delay_ms(100); PORTB = 0b00000000; _delay_ms(100); } set_sleep_mode(SLEEP_MODE_PWR_DOWN); for(;;){ for(i=0; i<8; i++){ // 0.02mA PORTB = i % 16; sleep_mode(); } for(i=8; i<16; i++){ // 5.5mA-6.0mA PORTB = i % 16; _delay_ms(1000); } } }
参考: http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+%2D+SLEEP