電圧監視IC のウオッチドッグ機能 Part1/2

pwr_sel_hint28_1.bmp電圧監視IC はリセットIC とも呼ばれ、電源の異常低下などを検出するとシステムにリセットをかけて暴走事故などを未然に防ぎます。単に電圧を監視するだけではなくウオッチドッグ機能によりシステムの正常動作をモニターし、異常を検出するとシステムをリセットする機能を持った製品もあります。今回はシステムの正常稼働をモニターするウオッチドック(WD)の機能とプログラム時の注意点を解説します。


ウオッチドッグ(WD)とは
ウオッチドッグ(番犬、監視者)IC はシステムの正常動作を監視するためにシステムから一定周期の信号をもらい、内蔵したウオッチドックタイマー(WDT)をリセットします。システムが異常動作状態となり一定時間以内に信号を送れなくなると、WDT がタイムアップするので RESET を発動してシステムを初期化させます。WDT は製品により 20msec から 1.6 秒の製品があり、CPU はこのタイマー時間より短い周期で信号を送る事により WDT をリセットし続ける事により、システムの正常動作を報告し、運転を継続します。


pwr_sel_hint28_2.bmpWDT のリセットは図 1 の様にライジングエッジ、フォーリングエッジの両エッジトリガでリセットされるようになっています。これは High、または Low でのレベルリセットの場合、CPU の暴走状態によってはタイマーをリセットする H か L のレベルのまま固定されてリセット状態が保持されてしまい、ウオッチドッグタイマーが動作しない事があるからです。エッジトリガにするとレベルを変動させるイベントが継続している必要があるので暴走時により確実に RESET を発動させる事が可能となります。WD に対するタイマーリセット信号はマイコンのIOポートに 1Bit の出力ポートを設定し、このポートを一定時間以内に0、1、0、1 と変化させるプログラムを書く必要があります。

ウオッチドッグタイマー(WDT)のリセット処理プログラム時の注意点
いくらエッジトリガにしてあっても、CPU が暴走している状態に実行されている命令中に WDT のリセット命令が入っていて、それが永久ループ状態となっていると暴走しているにも関わらず WDT をリセットし続けるのでシステムをリセットする事ができなくなります。WDT をリセットする処理をどの様にプログラム中に組み込むかを考える必要があります。

1:タイマー割り込み処理で WDT のリセット処理を使わない
一定の周期以下で定期的に WDT をリセットする必要があるので、タイマー割り込みによるインターバル処理のルーチンに WDT のリセット処理を組み込む人がいます。しかしタイマー割り込みによる割り込み処理は、メインルーチンが暴走していても、ハード的な割り込み処理としてタイマー起動により一定周期で動作してしまう場合があります。メインルーチンが暴走していても WDT のリセット処理がタイマーによる一定周期で継続して実行されるのでリセットは発動せず、付いている意味が全くない事になります。

pwr_sel_hint28_3.bmp 2:ウオッチドッグタイマーのリセット処理を分離する
WDT をリセットするには WDI に High→Low か Low→High の信号を出力する必要があります。このために、「ポートを 1 にセット」、「ポートを 0 にリセット」、という処理を交互に繰り返し、0→1→0 と出力ポートを変化させるプログラムが考えられますが、この一連の処理を 1 つのサブルーチン(関数)の中にいれてしまうのは問題となる場合があります。CPU が暴走するには様々なケースが考えられますが、そのサブルーチンをコールした時のリターンアドレスの喪失、for-ループ処理でのカウンタ異常、While 文の異常、などでこのサブルーチンの永久ループ状態となり暴走が発生する事があります。暴走しているのに WDT のリセットはかかり続ける事になります。これを防止するためにはリセット処理を 2 つに分離します。WDT リセットは 0→1 と 1→0 の両方のエッジでリセットされるので、High 処理と Low 処理(これらの処理は単純に、「出力ポートを 1 にする」と「出力ポートを 0 にする」という処理にします。)を別々にし、各々の処理はメインルーチン(プログラム動作時に一定周期で必ず通過する場所)の別々の場所におくか、一連のサブルーチンの中にどちらか片方だけを入れておきます。High と Low の処理を分離しておくと、特定のルーチンで永久ループ状態となってもポートは High レベルか Low レベルだけを出力し続けるので High か Low のままで固定され、WDT のリセットがかからないので RESET が発動される事になります。(101010 でなくても 110010 となっても時間内に 01 が変動すれば良いので 01 の順番は適当でも大丈夫)

pwr_sel_hint28_4.bmp 3:システム起動時や割り込み処理での注意点
プログラム起動時に初期化ルーチンの処理に時間がかかる場合にはメイン処理による WDT リセット処理が動作する前に WDT がタイムアップしてしまい RESET が発動され、再起動しますが結局同じ時間で RESET が発動してしまい、永久に起動できなくなる場合があります。この他、動作中に重い割り込み処理が入って、割り込み処理の間 WDT のリセット処理が出来なくなって RESET が発動してしまう場合もあります。 初期化処理に時間が必要な場合は図 3 の様に初期化ルーチンの中で、WDI 用の I/O ポートの設定を初期化ルーチンの最初の方で行い、初期化ルーチンの途中に WDT リセット処理を入れておく必要があります。問題は割り込み処理の場合です。メイン処理で WDT のリセット処理をする直前に割り込みが入ってしまった時や割り込み処理が WD タイマーより長い時間が必要な程長い時間がかかると割り込み処理中に WDT がタイムアップしてしまいます。しかし割り込み処理の中に完結するタイマーリセット処理を入れてしまうとこの割り込み処理ルーチンで暴走した時に永久にタイマーリセット処理を行なってしまう危険性がないとは言えません。この場合は WDT に出来るだけタイマー時間の長い製品を選択(例えば1.6 秒の製品)して、時間を稼ぎ、通常動作時には数 msec 毎に H/L 処理を行なう状態で使用します。

これ以上の長時間にわたって WDI パルスを生成できない状態が予想されるなら、一時的に WDT の動作を停止させる必要があります。この方法は次回に説明します。

(Part2 に続く)

             

ページトップへ