AVR Libc Home Page | AVR Libc Development Pages | ||||
Main Page | User Manual | Library Reference | FAQ | Alphabetical Index | Example Projects |
定義 | |
#define | wdt_reset() __asm__ __volatile__ ("wdr") |
#define | wdt_enable(value) |
#define | wdt_disable() |
#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 |
#include <avr/wdt.h>
このヘッダファイルは、多くのAVRデバイス内のウォッチドッグタイマーを操作するインラインマクロのインタフェースを宣言している。クラッシュするアプリケーションにより、過って変更されたウォッチドッグタイマの設定を防止するため、特別なタイムアウトシーケンスが変更するために必要となります。 このヘッダファイルに含まれるマクロは、値を変更する前に自動的に必要なシーケンスを処理します。割込みは、 操作中無効になります。
新しいデバイス向けの注釈(ATmega88や新しい割込み生成をオプションで有効にできるAVR)、ウォッチドッグタイマーは、(電源投入の状態と関係なく)システムリセット後もアクティブであり、最も速いプリスケーラ値(約15ms)になっていることに注意してください。そんため、プログラムの起動時にウォッチドッグをオフにすることが要求されており、データシートには、次のようなシーケンスを推奨しています。
#include <stdint.h> #include <avr/wdt.h> uint8_t mcusr_mirror __attribute__ ((section (".noinit"))); void get_mcusr(void) \ __attribute__((naked)) \ __attribute__((section(".init3"))); void get_mcusr(void) { mcusr_mirror = MCUSR; MCUSR = 0; wdt_disable(); }
アプリケーションがあとでリセット源を調べたいときは、mcusr_mirror
にMCUSRの値を保存するだけです。しかし特に、ウォッチドッグを無効にする前に、ウォッチドッグリセットフラグをクリアすることを、データシートによると要求されています。
#define wdt_disable | ( | ) |
__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" \ )
ウォッチドッグタイマを可能なら不可にします。ウォッチドッグタイマ制御レジスタの許可ビットをオフへ試みます。詳細はデータシートを参照してください。
#define wdt_enable | ( | value ) |
__asm__ __volatile__ ( \ "in __tmp_reg__,__SREG__" "\n\t" \ "cli" "\n\t" \ "wdr" "\n\t" \ "out %0,%1" "\n\t" \ "out __SREG__,__tmp_reg__" "\n\t" \ "out %0,%2" \ : /* no outputs */ \ : "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), \ "r" (_BV(_WD_CHANGE_BIT) | _BV(WDE)), \ "r" ((uint8_t) ((value & 0x08 ? _WD_PS3_MASK : 0x00) | \ _BV(WDE) | (value & 0x07)) ) \ : "r0" \ )
タイムアウト
後の期限を設定し、ウォッチドッグタイマを有効にします。(これは、WDP2
を介してWDP0
と結合させて、WDTCR
レジスタへ書き込みます。WDTCSR
レジスタを持つデバイスへは、WDP3
ビットを介してWDP0
と結合させて使用します。)
WDTO_15MS
らのシンボリック定数を参照ください。
#define wdt_reset | ( | ) | __asm__ __volatile__ ("wdr") |
ウォッチドッグタイマのリセット。 ウォッチドッグタイマが有効の時、タイマーの期限前にこの操作が呼び出されなければいけません。さもないと、ウォッチドッグによるデバイスのリセットが実行されます。
#define WDTO_120MS 3 |
WDT0_15MS
を参照
#define WDTO_15MS 0 |
ウォッチドッグタイムアウトのための象徴的な定数。ウォッチドッグタイマは、自由動作のRC発信器に基づくため、時間は概算で、5Vの供給電圧のときに当てはまる。そのため、低い電圧では、時間は増加する。新しいデバイス(例えば ATmega128, ATmega8)にはわずかな変化だが、古いデバイスにとっては、Vcc = 3 V 動作時の時間は3倍くらい大きくなる。
可能性のあるタイムアウトの値は次の通りである: 15 ms, 30 ms, 60 ms, 120 ms, 250 ms, 500 ms, 1 s, 2 s。 (いくつかのデバイスでは、4 s と 8 s を考慮に入れる。) 象徴的な定数は、接頭辞がWDTO_
により作られ、その後に時間が続く。
約500 msのウォッチドッグタイマ期限を選択する例:
#define WDTO_1S 6 |
WDT0_15MS
を参照
#define WDTO_250MS 4 |
WDT0_15MS
を参照
#define WDTO_2S 7 |
WDT0_15MS
を参照
#define WDTO_30MS 1 |
WDT0_15MS
を参照
#define WDTO_4S 8 |
WDT0_15MS
を参照。 注釈: これは次のデバイスで利用できます。ATtiny2313, ATtiny24, ATtiny44, ATtiny84, ATtiny84A, ATtiny25, ATtiny45, ATtiny85, ATtiny261, ATtiny461, ATtiny861, ATmega48, ATmega88, ATmega168, ATmega48P, ATmega88P, ATmega168P, ATmega328P, ATmega164P, ATmega324P, ATmega644P, ATmega644, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega8HVA, ATmega16HVA, ATmega32HVB, ATmega406, ATmega1284P, AT90PWM1, AT90PWM2, AT90PWM2B, AT90PWM3, AT90PWM3B, AT90PWM216, AT90PWM316, AT90PWM81, AT90USB82, AT90USB162, AT90USB646, AT90USB647, AT90USB1286, AT90USB1287, ATtiny48, ATtiny88.
#define WDTO_500MS 5 |
WDT0_15MS
を参照
#define WDTO_60MS 2 |
WDT0_15MS
#define WDTO_8S 9 |
WDT0_15MS
を参照。注釈: これは次のデバイスで利用できます。ATtiny2313, ATtiny24, ATtiny44, ATtiny84, ATtiny84A, ATtiny25, ATtiny45, ATtiny85, ATtiny261, ATtiny461, ATtiny861, ATmega48, ATmega88, ATmega168, ATmega48P, ATmega88P, ATmega168P, ATmega328P, ATmega164P, ATmega324P, ATmega644P, ATmega644, ATmega640, ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega8HVA, ATmega16HVA, ATmega32HVB, ATmega406, ATmega1284P, AT90PWM1, AT90PWM2, AT90PWM2B, AT90PWM3, AT90PWM3B, AT90PWM216, AT90PWM316, AT90PWM81, AT90USB82, AT90USB162, AT90USB646, AT90USB647, AT90USB1286, AT90USB1287, ATtiny48, ATtiny88.