ウォッチドッグタイマ

プログラムが動かない

新しいデバイス(PIC)を手に入れたとき、まずは簡単なプログラムを組んで LED の点滅とかブザーの吹鳴を試してみます。

そんなプログラムやテスト基板作りは簡単で手馴れたもの、すぐに出来上がり、電源を入れてみますが 「オットドッコイ」 全く動いてくれない場合があります。

ウデに自信があると悩んじゃいますね。 いやウデが未熟なんですね。
CONFIG の設定でウォッチドッグタイマ (WDT) ON が原因のようです。

__CONFIG _WDT_OFF にすれば OK です。

ウォッチドッグタイマが有効に設定されているとほとんどのデバイスでは PIC 内の専用 RC タイマを使って 16m秒ごとにデバイスのリセットを繰り返します。
このためプログラムが正しくても LED の点滅やブザーの入り切りは最初の 16m秒のところでリセット、再スタートが行われるので LED なら点灯したまま、ブザーだったら吹鳴を続けたままになります。 PIC は動いているのです。

データシートの WDT(ウォッチドッグタイマ) ブロックダイアグラムではWDT用のPIC内蔵 RC 発振器の発振周波数は 31.25KHz になっています。 この周期は 32μ秒ですが内蔵のスケーラでオーバフローするのは 16m秒になっているようです。 この出力にタイマ TMR0 と兼用のプリスケーラを使ってオーバブローする時間を長くできます。 分周比はオプションレジスタで設定します。

OPTION_REG の設定中
   bit 3=1 なら プリスケーラは WDT に接続 (=0 なら TMR0 に接続)
   bit 2,1,0
        = 000 なら分周比 1:1    16mSec
        = 001 なら分周比 1:2    32mSec
        = 010 なら分周比 1:4    64mSec
        = 011 なら分周比 1:8    128mSec
        = 100 なら分周比 1:6    256mSec
        = 101 なら分周比 1:32   512mSec
        = 110 なら分周比 1:64   1024mSec
        = 111 なら分周比 1:128  2048mSec

  (TMR0 で使用する場合の分周比は上の2倍になります。)

次のプログラムはウォッチドッグタイマを 1:128 に分周して使ったものです。
ウォッチドッグタイマがオーバフローするとプログラムをリセットし吹鳴を続けたブザーが止まり 300mSec後に再度鳴り出すものです。

ブザーの鳴り続ける時間がウォッチドッグタイマとプリスケーラ 1:128 による動作時間で約2秒が確認できます。 (16mSec x 128 = 2048mSec)

__CONFIG   _WDT_ON  (その他も設定)
#DEFINE BUZZER PORTB,2 ; ポートRB2にブザーを接続
; (TRISB の設定省略)
BSF STATUS,RP0 ; BANK 1
MOVLW H'0F' '00001111' をオプションレジスタへ
MOVWF OPTION_REG
BCF STATUS,RP0 ; BANK 0
MAIN BCF BUZZER ; ブザーを止める
CALL DLY300M ; 300mSecタイマ(サブルーチン省略)
CLRWDT
LOOP BSF BUZZER ; ブザーを鳴らす
GOTO LOOP ; 繰り返す
END
PIC目次へ     トップページへ