お知らせ:10月末まで応募可能な期間限定の無料メンター企画実施中

マイコン入門 ウォッチドッグタイマの役割と機能の解説

マイコン
この記事は約6分で読めます。

こんにちは、ナナです。

前章ではタイマB1機能を学びましたが、タイマ繋がりということで本章ではウォッチドッグタイマについて学びましょう。

本記事では次の疑問点を解消する内容となっています。

本記事で学習できること
  • ウォッチドッグタイマって何?
  • ウォッチドッグタイマの役割とは?
  • ウォッチドッグタイマってどうやって使うの?

では、密かに登場していたウォッチドッグタイマ機能を解説します。

スポンサーリンク

ウォッチドッグタイマとはどんな機能なのか

ウォッチドッグタイマって不思議な名前ですね。どのような機能なのかをイメージから知っていきましょう。

ウォッチドッグタイマの動作イメージ

ウォッチドッグとは番犬のことなのですが、マイコンにおけるウォッチドッグタイマとは時間を利用したシステム異常を検知するための仕組みです。

タイマ機能に対してクロックが入力されるとタイマはカウントを行うのでした。ウォッチドッグタイマはカウンタ用のTCWDレジスタがオーバーフローするとシステムがリセット(再起動)します。

そのためオーバーフローしないように定期的にカウンタをクリアしてあげる必要があります。これはエサを一定期間与えないと吠える犬のようなものなのです。

WDTイメージ

ウォッチドッグタイマの役割

なぜ、このようなシステムを再起動する仕組みが設けられているのでしょうか。

プログラムにおいて不具合というのは避けられないものです。組み込みシステムにおいてソフトウェアのバグが要因となり、システムが正常に動かなくなってしまうこともあります。

無限ループで返ってこない

実施されるべき処理が一定時間経過しても実施できない、このようなシーンでシステムを復旧するのがウォッチドッグタイマの役割です。

一定時間行われるべき処理がされないことを検知し、リセットすることでシステムを復旧するのです。

スポンサーリンク

ウォッチドッグタイマ機能の使い方

ウォッチドッグタイマはデータシート「13章 ウォッチドッグタイマ」に記載されています。タイマB1と同じでプリスケーラの設定やクロックカウント用のレジスタがあることがわかります。

特徴

「13.1章 特徴」には次の記載があります。

  • 9種類の内部クロックを選択可能
  • カウンタのオーバフローでリセット信号を発生
  • 初期状態で動作状態です(リセット解除でカウントアップ)

初期状態で動作としてあります。つまり、システムが起動したときに最初からウォッチドッグタイマ機能は有効な状態で起動するということです。

マイコンによってシステム起動時にウォッチドッグタイマが有効なのか無効なのかは異なる。H8/36064マイコンにおいては有効になっていることに注意!

レジスタ

ウォッチドッグタイマのレジスタは次の3つが存在します。

  • タイマコントロール/ステータスレジスタWD(TCSRWD)
  • タイマカウンタWD(TCWD)
  • タイマモードレジスタWD(TMWD)

タイマコントロール/ステータスレジスタWD(TCSRWD)とは

ウォッチドッグタイマの動作を制御するためのレジスタです。データシートの説明を見るとわかりますが、非常にややこしいレジスタになっています。

下記太字にあるようにとあるビットに書き込むためには別のビットを1にする必要があるなど、それぞれのビットが別のビットに依存しているのがわかります。

13.2.1章 タイマコントロール/ステータスレジスタWD(TCSRWD)
レジスタ仕様

なぜ、このような構成になっているかというと、ウォッチドッグタイマの動作というのは最悪の状態でシステムを救う機能なわけです。その動きを制御するレジスタが誤って値を書き換えられるようなことがあると「ウォッチドッグタイマが動作してない!」といったことになりかねません。

動かない

そのため、意識的に変更するようなプログラムでないとレジスタ設定値を変えられないような作りになっているのです。

タイマカウンタWD(TCWD)とは

TCWDはクロックをカウントするレジスタです。これはタイマB1におけるTCB1レジスタと同じ役割のレジスタです。1Byteのレジスタであるため0~255までカウントすることが可能です。

このレジスタがオーバーフローするとシステムが再起動してしまうため、一定時間以内にクリアし続ける必要があるのです。

タイマモードレジスタWD(TMWD)とは

このレジスタはプリスケーラの分周を設定するためのレジスタなのがわかりますね。8種類の分周から選択することができます。ビュートローバーではシステムクロックは12MHzのため、各分周においてオーバーフローするまでの最大時間は算出することができます。

WDT最大時間一覧

最大分周の8192を使用しても174ミリ秒以内にはカウンタクリアをしないとリセットが掛かるのがわかります。

ウォッチドッグタイマ停止処理

本編におけるプログラムを動かした際に次のプログラムコードが存在していることに皆さん気づいていることでしょう。

//---------------------------------------------------
//  ウォッチドッグタイマの停止(消さないこと)
//---------------------------------------------------
WDT.TCSRWD.BYTE = 0x92;
WDT.TCSRWD.BYTE = 0x92;

このプログラムはウォッチドッグタイマ機能を停止している処理です。システム開発途中などにおいてはウォッチドッグタイマが動いているとリセットが実施されて不便な時があるため今は起動時に停止にしてあります。

スポンサーリンク

課題:ウォッチドッグタイマ機能を使ってみよう

本章は解説のみで課題はありません。

スポンサーリンク

Q&A:ウォッチドッグタイマに関するよくある質問

ウォッチドッグタイマを停止するプログラムではなぜ同じ代入を2回行っているのでしょうか?ミスですか?

WDT.TCSRWD.BYTE = 0x92;
WDT.TCSRWD.BYTE = 0x92;

これはプログラムミスではありません。意図的に2回同じ値を書き込んでいるのです。

13.3章 動作説明(一部抜粋)

ウォッチドッグタイマを使用しない場合は、TCSRWDのTCSRWE=1 の状態でB2WI に0、WDON に0 を同時にライトして、TCWD のカウントアップを停止させてください。(ウォッチドッグタイマを停止させるためには、TCSRWDへ2回ライトアクセスが必要となります)。

上記はデータシートの説明文を抜粋したものですが「停止させるときは2回ライトしなさい」と書いてありますね。この制約を満たすために2回書き込んでいるのです。

1回だけの書き込みでは停止ができません。

リセットとはなんでしょうか?

リセットはマイコンを再起動させるための信号です。リセット信号というものが発生するとマイコンが再起動し、プログラムはまた最初から動き出すことになります。

リセットはウォッチドッグタイマ以外にも、プログラム上で起きてはいけない事象が起きた時に発生する信号であり、発生要因は複数あります。

リセットというのはシステムが異常になったときに再起動して正常に処理を戻すってことなんですよね?それっていいことじゃないのですか?

そうですね。ウォッチドッグタイマといった万が一に備えた復旧機能というのはシステムを利用するユーザーを救うものです。

しかし、それは開発者にとっては不名誉なことなのです。システムが再起動しなければならないようなプログラムは本来作ってはなりません。リセットが起きないように設計・プログラムをしなければならないのです。

ですので、リセットという現象は企業や開発者にとっては非常に大きな問題であり、発生したときには早急に原因追及や対策が求められる不具合になります。