PIC16F1789 & MPUトレーナー 13 / ウォッチドッグタイマーを使う

参考: 定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ), p.149-156


main.c

/*
テキスト p.155、リスト 17-3 のまま。経過時間を表示するプログラムである。

ウォッチドッグタイマーのタイムアウトピリオドは 4 秒に設定してある。

ここでは動作確認として人がスイッチを押してウォッチドッグタイマーをリセットする。

ウォッチドッグタイマーをリセットしないまま 4 秒が経過するとシステムリセットがかかる。
*/



―――――――――――――――――――――――――――――――――――――――――――――――――

ウォッチドッグ・タイマは、タイムアウトすると PIC マイコンをリセットする。(中略) 例えば、プログラムでは、ウォッチドッグ・タイマをタイムアウトしないように書く。タイムアウトしないはずなのに、タイムアウトしたということは、不思議な動作をしているということなので、PIC マイコンをリセットしようというような目的で使う。
引用元: 『キホンからはじめる PIC マイコン C 言語をフリーのコンパイラで使う』オーム社、中尾真治、p.71


「タイマー」とは「カウンター」のことである。

たとえば 10 進 1 桁のカウンターは 0 から 9 まで 1 ずつカウントアップする。9 を超えると、「10」にはなれないので (2 桁にはなれないので) オーバーフロー (桁あふれ) を起こして 0 に戻る。

だから 10 進 1 桁のカウンターで 1 Hz のクロックをカウントすれば 10 秒タイマーが出来る。そのクロックを 2 分周してからカウントすることにしておけば (2 クロックを 1 回としてカウントすることにしておけば) 20 秒タイマーが出来るし、オーバーフローしたあとに 0 に戻さずに 5 に戻すことにしておけば 5 秒タイマーが出来る。

ウォッチドッグタイマーは、ウォッチドッグタイマー自身がオーバーフローあるいはアンダーフローしたときに番犬として吠える役割 (システムリセットを引き起こす役割、プログラムを 0 番から実行し直す役割) を負っている。だから、システムに異常の発生していないときは、ウォッチドッグタイマー自身がオーバーフローあるいはアンダーフローしないよう (ウォッチドッグタイマーがタイムアウトしないよう)、何らかの手段で定期的にウォッチドッグタイマー自身をリセットしなければならない (カウントアップあるいはカウントダウンしている途中で元に巻き戻してまた最初からカウントアップあるいはカウントダウンが始まるようにしなければならない)。定期的なリセット処理 (システムをリセットすることではなく、ウォッチドッグタイマーをリセットすること) がうまく働かなかったときに番犬が吠える。そしてシステムリセットがかかる。

The window mode makes it possible to define a time slot or window inside the total timeout period during which WDT must be reset. If the WDT is reset outside this window, either too early or too late, a system reset will be issued.
(http://www.atmel.com/images/Atmel-8362-8-and-16bit-AVR-microcontroller-ATxmega256A3BU_datasheet.pdf)

このように、ウォッチドッグタイマーは、あらかじめ決めておいた時間内にウォッチドッグタイマーがリセットされなかったとき (リセットされないままタイムアウトしたとき) に吠えるが、「ウィンドウウォッチドッグタイマー」というのは、上の引用文にあるように、決めておいたウィンドウ (タイムアウト期間内に設けた時間枠) を過ぎてからウォッチドッグタイマーがリセットされたとき (リセットが遅すぎたとき) にも吠えるし、その時間枠に突入する前にウォッチドッグタイマーがリセットされたとき (リセットが早すぎたとき) にも吠えるウォッチドッグタイマーのことである。つまり、普通のウォッチドッグタイマーは、タイムアウト期間内 (上の英文の “the total timeout period”) のどこでリセットをかけても有効であるが、ウィンドウウォッチドッグタイマーは、タイムアウト期間内に設けたもう 1 つの時間枠の中でリセットをかけなければならない。上の英文の which の先行詞は “a time slot or window” である。