/* パワーダウンモードでdelayする関数のデモ。 パワーダウン中のCPUの消費電流は約28μA(Atmega328P@16MHz,5V) 2014/07/12 ラジオペンチ http://radiopench.blog96.fc2.com/ */ #include #include int led = 13; // LEDピン //volatile int wdt_cycle = 0; // 必要ならコメントアウトを解除 void setup() { pinMode(led, OUTPUT); } void loop() { digitalWrite(led, LOW); // LED off delayWDT(7); // 引数は関数の資料参照 digitalWrite(led, HIGH); // LED on delay(2000); // 普通のdelay(比較用) // delayWDT(7); } // ここから下を全て使う void delayWDT(unsigned long t) { // パワーダウンモードでdelayを実行 delayWDT_setup(t); // ウォッチドッグタイマー割り込み条件設定 ADCSRA &= ~(1 << ADEN); // ADENビットをクリアしてADCを停止(120μA節約) set_sleep_mode(SLEEP_MODE_PWR_DOWN); // パワーダウンモード sleep_enable(); sleep_mode(); // ここでスリープに入る sleep_disable(); // WDTがタイムアップでここから動作再開 ADCSRA != (1 << ADEN); // ADCの電源をON } void delayWDT_setup(unsigned int ii) { // ウォッチドッグタイマーをセット。 // 引数はWDTCSRにセットするWDP0-WDP3の値。設定値と動作時間は概略下記 // 0=16ms, 1=32ms, 2=64ms, 3=128ms, 4=250ms, 5=500ms // 6=1sec, 7=2sec, 8=4sec, 9=8sec byte bb; if (ii > 9 ){ // 変な値を排除 ii = 9; } bb =ii & 7; // 下位3ビットをbbに if (ii > 7){ // 7以上(7.8,9)なら bb |= (1 << 5); // bbの5ビット目(WDP3)を1にする } bb |= ( 1 << WDCE ); MCUSR &= ~(1 << WDRF); // MCU Status Reg. Watchdog Reset Flag ->0 // start timed sequence WDTCSR |= (1 << WDCE) | (1<