AVR Libc Home Page AVRs AVR Libc Development Pages
Main Page FAQ Library Reference Additional Documentation Example Projects

<avr/wdt.h>: Watchdog timer handling


Detailed Description

 #include <avr/wdt.h> 
このヘッダファイルは、多くのAVRデバイスに装備されているウォッチドッグタイマー(以後WDT)を取り扱うための、いくつかのインラインマクロを提供しています。
暴走するプログラムが偶然にウォッチドッグタイマーの設定をキャンセルしてしまわないように、設定変更には特別なタイムシーケンスが要求されています。このヘッダファイル内のマクロは、設定変更の前に行うべき要求される手順を自動的に行います。この操作の間、割り込みは禁止されます。
Note:
デバイスによっては、ヒューズビット設定によりさらなる設定変更制限が存在するかも知れません。WDTを停止することを不許可にすることが起こりえます。
新しいデバイス(ATmega88以降、WDTによる割り込みを生成できるAVR) では、最速のプリスケーラー値において(約15msec)、WDTはシステムリセット後も有効であり続けます。(パワーオンリセットを除く)。そのため、これらのデバイスではプログラムスタートアップ早期で一度WDTを停止する必要があります。データシートは以下のような手順を推奨しています。
    #include <stdint.h>
    #include <avr/wdt.h>

    uint8_t mcusr_mirror;

    void get_mcusr(void) \
      __attribute__((naked)) \
      __attribute__((section(".init3")));
    void get_mcusr(void)
    {
      mcusr_mirror = MCUSR;
      MCUSR = 0;
      wdt_disable();
    }
MCUCR値を mcusr_mirror に待避するのは、あとでリセット原因をチェックするためにリセット時のMCUCR値を知りたい場合に必要となります。しかし、データシートによると、WDTリセットフラグのクリアはWDT禁止の前に行うことが要求されています。※先頭にwdt_reset()を入れるべきと言うことか??

Defines

#define wdt_reset()   __asm__ __volatile__ ("wdr")
#define wdt_disable()
#define wdt_enable(timeout)   _wdt_write(timeout)
#define WDTO_15MS   0
#define WDTO_30MS   1
#define WDTO_60MS   2
#define WDTO_120MS   3
#define WDTO_250MS   4
#define WDTO_500MS   5
#define WDTO_1S   6
#define WDTO_2S   7
#define WDTO_4S   8
#define WDTO_8S   9

Define Documentation

 
#define wdt_disable
 ) 
 

Value:

__asm__ __volatile__ (  \
    "in __tmp_reg__, __SREG__" "\n\t" \
     "cli" "\n\t" \
    "out %0, %1" "\n\t" \
    "out %0, __zero_reg__" "\n\t" \
    "out __SREG__,__tmp_reg__" "\n\t" \
    : /* no outputs */ \
    : "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), \
    "r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))) \
    : "r0" \
)
可能なら(ヒューズ設定で禁止されていなければ)ウォッチドッグタイマーを無効にします。WDTCRレジスタのWDEビットのクリアを試みます。詳細はデータシート参照。
#define wdt_enable timeout   )     _wdt_write(timeout)
 

ウォッチドッグタイマーを有効にして、timeout 時間の後ウォッチドッグリセットされるよう設定します。
timeout時間はWDTCRレジスタのWDP0〜WDP2で設定される。デバイスによってはWDTCSRという名のレジスタにある。

timeout値と時間の関係についてはデータシート参照。便利なシンボリック定数 WDTO_15MS 等も参照ください。

 
#define wdt_reset
 )     __asm__ __volatile__ ("wdr")
 

ウォッチドッグタイマーをリセットします。ウォッチドッグタイマーが有効なときは、この命令の呼び出しはタイマが時間切れになる前に行って下さい。さもないとウォッチドッグリセットがかかります。

#define WDTO_15MS   0
 

ウォッチドッグタイムアウト値のためのシンボリック定数です。ウォッチドッグタイマーはRC発振器で出来ているため、この時間の値(ここでは15msec)は、Vcc=5Vの時のみ適用できます。より低い電源電圧では、タイムアウト時間はもう少し長くなります。旧AVRデバイスについては、Vcc=3Vの時はタイムアウト時間は3倍に延びますが、新しいデバイス(ATmega8,mega128など)では、無視できる程度の変化になります。

設定可能なタイムアウト時間は 15 ms, 30 ms, 60 ms, 120 ms, 250 ms, 500 ms, 1 s, 2 s, (一部のデバイスで 4s, 8s ) です。
シンボリック定数は、時間の値の頭に "WDTO_" がついた名前となります。
※ WD Toです。WDT-zeroではありません・・・

例えば、ウォッチドッグタイマータイムアウト時間が約500msecの設定は以下のようになります。

   wdt_enable(WDTO_500MS);
#define WDTO_30MS   1
 

WDT0_15MS の項参照。

#define WDTO_60MS   2
 

WDT0_15MS

#define WDTO_120MS   3
 

WDT0_15MS の項参照。

#define WDTO_250MS   4
 

WDT0_15MS の項参照。

#define WDTO_500MS   5
 

WDT0_15MS の項参照。

#define WDTO_1S   6
 

WDT0_15MS の項参照。

#define WDTO_2S   7
 

WDT0_15MS の項参照。

#define WDTO_4S   8
 

WDT0_15MS の項参照。

Note: この設定は以下のデバイスでのみ利用可能です。
ATtiny2313, ATtiny24, ATtiny44, ATtiny84, ATtiny25, ATtiny45, ATtiny85, ATtiny261, ATtiny461, ATtiny861, ATmega48, ATmega88, ATmega164, ATmega168, ATmega324, ATmega644, ATmega640, ATmega1280, ATmega1281, AT90PWM2, and the AT90PWM3.

#define WDTO_8S   9
 

WDT0_15MS の項参照。

Note: この設定は以下のデバイスでのみ利用可能です。
ATtiny2313, ATtiny24, ATtiny44, ATtiny84, ATtiny25, ATtiny45, ATtiny85, ATtiny261, ATtiny461, ATtiny861, ATmega48, ATmega88, ATmega164, ATmega168, ATmega324, ATmega644, ATmega640, ATmega1280, ATmega1281, AT90PWM2, and the AT90PWM3.


Automatically generated by Doxygen 1.4.1 on 23 Jan 2006.