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