こんにちは、ENGかぴです。
マイコンのソフト開発を行うときにWDT(ウォッチドックタイマ)について理解する必要があります。WDTはマイコンの正常動作を監視するもので、バグなどでマイコンが動作不良を起こしたときWDTのカウントがクリアできなくなり通知されるものです。
PIC12F675を使ってWDTの考え方を説明していますが、マイコンを問わずWDTの考え方は同じです。
PIC12F675を使ってマイコンの動きを勉強するためにPIC12F675の機能でできることについてまとめています。
PICマイコン(PIC12F675)で実現できる機能と解説リンクまとめ
WDT(ウォッチドックタイマ)とは
WDTはWatchdog Timerの略です。Watchdogは「番犬」です。直訳すると番犬の時計になります。何の番犬なのかというとマイコンが通常に動作していることを監視する番犬です。
製品を開発を進めていくとプログラムはどんどん大きくなり複雑になっていきます。複雑になるにつれて処理が重たくなっていき、マイコンへの負担が多くなっていきます。
WDTは動き出すとカウントを貯めていきます。カウントがオーバーフローするとシステムが異常であると判断してWDT異常を割り込みで通知したり、マイコンをリセットしたりします。WDTのカウント(動作する時間)はユーザーで設定することができますが、マイコンに依存します。
WDTの動作イメージ
WDTを使用する設定が完了すると、タイマーがカウント開始します。WDTのカウントがオーバーフローするとWDT異常と判断してCPUをリセットします。WDTがオーバーフローするまでのカウント値は時間に問わず一定なのでウインドウ100%と表現しています。
異常がなく通常に動いているときにWDTのカウントがオーバーフローしないように定期的にWDTのカウントをクリア(リフレッシュと呼ばれることもあります)することが必要になります。
WDTはマイコンが正常に動作しているかの監視をするので、通常はメインループを1周したときにWDTのカウントをクリアする処理(WDTリフレッシュともいう)を1か所置きます。
プログラムがある条件下において動作が重くなると処理が遅れるためWDTをクリアするタイミングが遅れることがあります。
マイコンによってはウインドウについて詳細に設定できるものもあり0~20%(任意変更可能)まではクリアしないようにしたり、逆に80%(任意変更可能)を超えるとクリアできないようにしたりとできるものもあります。
WDTの間違った使い方
WDTは異常を監視するためのものです。WDTの使い方によっては効果がなくなってしまうものがあるためWDTの使い方について〇な例と、×な例を示します。
WDTは異常を監視するためのものです。意図的にWDTクリア処理を置いている場合の除いて、WDTが動作しないようにメインプログラム上にWDTのクリア処理をたくさん置くとWDTの効果がなくなってしまいます。
〇な例のようにメインを1周することに1回WDTクリアしてもWDT異常にならないようにWDTのプリスケーラを見直しや処理が重たくなりすぎないように対策が必要です。
WDTを使用する方法
マイコンに内蔵されているWDT機能を使う方法と外部のロジックICを使用して管理する方法があります。これらの特徴について説明していきます。
PIC12F675のWDTを使用する
マイコンには必ずと言っていいほどWDTが内蔵されています。PIC12F675の設定の例を見てみます。CONFIGレジスタの設定でWDTを使用する設定をし、OPTIONレジスタでTMR0とWDT機能を切り替えとプリスケーラでWDTの時間を設定します。
CONFIGレジスタ
bit2-0を設定で内部クロックを使用してI/Oで使用するので100=INTOSCを選択します。WDTを使用するためにbit3に1をセットにすると使用できるようになります。その他の設定は使用しません。
OPTIONレジスタ
bit2-0はWDT(TMR0)のプリスケーラです。WDTとTMR0は兼用となっており一方しか使用できません。今回はWDTをして使用するのでTMR0のプリスケーラとしては使用できません。(TMR0はプリスケーラなしで使えます)bit3をセットしてWDTとして使用します
プリスケーラの設定は表の下に行くほどWDT異常となる時限が長くなります。1:4とする場合は0b010を設定します。
bit3はWDTとして使用したいので1をセットします。設定後WDTが動き出し、停止はできないので定期的にWDTのクリア処理を入れる必要があります。WDTクリアする場合はCLRWDT()をコールします。
bit4はTMR0として使用しているときに動作クロックのカウントをHighからLowに変化するときとLowからHighに変化するときのとちらでカウントするかを選択するものです。とくに関係ないので0をセットします。
bit5はTMR0のクロックの入力と出力を選択するものです。1を選択するとクロックを入力として受けるピンになります。0を選択するとクロックを出力するピンになります。
bit6は割り込みを発生させるエッジを選択します。1をセットすると波形の立ち上がりで割り込みを発生し、0をセットすると波形の立下りで割り込みを発生させます。
bit7はGPIOピンにおいてウィークプルアップを使用するかを選択します。使用する場合は1をセットします。
広告
マイコンの外部のロジック回路で管理する
内部WDTを使用せずにマイコンの外部のロジック回路によって管理する方法もあります。例えば74HC123を使用するなどです。PIC12F675にはNMI端子がないので例のみを上げます。
DOでHとLを切り替えながらQを出力させます。CPUが保持時間内にDOが更新できなくなると74HC123のQの出力がLとなり/NMI割り込みが発生します。次に74HC123の真理値表を見てみます。
外部ロジックの例は、上から4番目の設定を使って回路を組んだものになります。
B端子に立ち上がりのトリガーを与えることでQがH出力になります。
この状態が74HC123に外付けしたCxとRxによる時定数によって決まります。時定数よりも短い時限で再び立ち上がりのトリガーを与えることで常にQからはH出力を維持します。
マイコンで処理が重たくなったり以上になった場合74HC123のB端子にトリガーが入力されなくなり時定数以上の時間になったときQの出力がL出力となりマイコンのNMI端子がLとなります。
NMIは優先順位の最も高い割り込みです。NMIの割り込み内でソフトウェアリセットするとWDTと同じ動きになります。
マイコン異常とWDT異常の区別
WDTはマイコンの異常を監視するイメージですが厳密に言うとマイコン異常とWDT異常は以下のように区別されます。
マイコン異常
マイコンが外的要因であるノイズなどの影響によりハード的に故障して動かなくなった場合は、マイコンそのものが故障している可能性があるためWDTによってマイコンが動いているかの監視すらできません。ハードの故障となるとマイコンを交換する以外に復帰させることはできません。
WDT異常
WDT異常は、マイコンが動いているかを監視するものでありマイコンが正常に動いている場合において監視するものです。ソフト開発時に想定していなかったバグなどによって無限ループにはまってしまった場合や、WDTの時限以内に処理が終わらずにWDTのカウントがオーバーフローしてしまった場合にWDT異常となります。
ソフトのバグを修正したりWDTのプリスケーラの設定を変更することでWDT異常が解消されることもあります。
関連リンク
PICマイコンを使ってマイコンのレジスタの設定やMPLAB X IDEのプラグインであるMCCを使用して動作確認したことについてまとめています。
PICマイコン(PIC12F675)で実現できる機能と解説リンクまとめ
PICマイコン(PIC16F1827)で実現できる機能と解説リンクまとめ
最後まで、読んでいただきありがとうございました。
最近では、マイコンのWDTの信頼性が上がっていることや回路の小型化によって外部に部品を実装するケースは減ってきたように感じます。私が設計するときもマイコンのWDTのみで監視することが多くあります。