PIC12F675 ウォッチドッグタイマーの使い方
最近趣味でPICアセンブラを初めた者です。
WDTの実験をするため以下のプログラムでリセットのかかるまでの時間を比べてみました。
私の考え違いかもしれませんが、WDTポストスケーラの値によってリセットするまでの時間は違うと思ったからです。
675のGP0~GP3の入力をOPTION_REG のbit0~bit3に割り当てました。
GP3はHに固定してあるのでOPTION_REG bit3(PSA)は常にHです。
プログラムは一秒間のLED点灯後消灯し、WDTリセットのかかるまでループします。
WDTリセットからのリスタートはLEDを点滅後、同じことを繰り返します。
このときGP0~GP2の端子を切り替えることにより、OPTION_REGのWDT分周比を変え、
LED消灯後、リスタートし、点滅するまでの時間が変わると思ったのですが、変化しません。
正確な時間はわかりませんが、GP0~GP2を変えても、リスタートまでの時間は三秒程度一定です。
OPTION_REGのbit0~bit2がすべて立ってるのではと思われるのですが、
私のWDTの設定に対する考え方が間違ってるのか、テスト用のプログラムにミスがあるのかわかりません。
お暇な時で結構ですので、お教えくださるよう、どうぞよろしくお願いいたします。
title WDT
list p=12f675
#include <p12f675.inc>
errorlevel -302
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
org 20h
work RES 1 ; ワーク
counter RES 1 ; 回数カウンター
cnt10m RES 1 ; 10ms時間稼ぎ用ワーク
cnt500u RES 1
org 0
goto start
start bsf STATUS, RP0 ; レジスタバンク1を選択
call h'3ff'
movwf OSCCAL ; 書き込む
movlw b'00001111' ; GP0~GP3を入力設定
movwf TRISIO
clrf ANSEL ; すべてデジタルI/O
bcf OPTION_REG, NOT_GPPU ; プルアップ使用する
bcf STATUS,RP0 ; バンクゼロ
btfsc STATUS,NOT_TO
goto start2
movlw d'5' ; LED 点滅回数を5回にして
call led_on_off
start2 bsf GPIO,GP5 ; 一秒間LEDを点灯し
call tm1000
movf GPIO,w ; 入出力ピンを読んで b3は一番ピンに直結し常時 H
andlw b'00001111' ; 下位4ビットだけ選び
bsf STATUS,RP0 ; バンク 1 選択
iorwf OPTION_REG,f ; ウォッチドッグの分周比とする
bcf STATUS,RP0 ; バンク 0
loop bcf GPIO,GP5 ; LED消灯し
goto loop ; リセットがかかるまでループ
; LED を0.1秒ごとにWレジスタの回数点滅
led_on_off movwf work
led_loop decfsz work
goto led_loop2
return
led_loop2 bsf GPIO,GP5
call tm100
bcf GPIO,GP5
call tm100
goto led_loop
;-------------- 1000ms,100ms 遅延ルーチン
tm1000 movlw D'100'
goto lp200
tm500 movlw D'50'
goto lp200
tm100 movlw D'10' ;10ms遅延を10回で100ms
lp200 movwf counter ;カウンターをセットし
lp201 decfsz counter,f ;カウンターはゼロ ?
goto lp202 ;いいや
return
lp202 call t10m
goto lp201
; 10msec 遅延ルーチン for 4Mz
t10m movlw d'8'
movwf cnt10m
tm10lp1 movlw d'249'
movwf cnt500u
tm10lp2 clrwdt ; ウォッチドッグタイマーをクリア
nop
decfsz cnt500u,f
goto tm10lp2
decfsz cnt10m,f
goto tm10lp1
return
END