*WDT 僅能在正常電源模式及 Idle Mode 工作,Power-down Mode 沒有 Clock,所以不能工作
無 Pre-Scaling 的 WDT 操作
以 AT89S51 為例,關聯的 SFR 有:
WDTRST(0A6H)
AUXR(4:3)(08EH)
其中,
WDIDLE(Disable/Enable WDT in IDLE mode)
0(預設): 在 IDLE MODE 繼續計數
1: 在 IDLE MODE 不計數
DISRTO(Disable/Enable Reset-out)
0(預設): Reset pin is driven High after WDT times out
1: Reset pin is input only
S51 的 Watch Timer 是固定 14-bit 的,計數範圍由 0~214-1 即 0~16383 ,每個機械週期 Count 一次,沒有 Pre-Scaling 可以設定(不能調整 Time out 時間);以 12MHz 的 Crystal 來計算,Time out 時間:
16384 * 1us = 16.384 msec
計數 16384 個 Count (16.384msec) 之後溢位,觸發 WDT Reset。
使用上只要在程式開頭及 16384 個機械週期內在 WDTRST 依序寫入 01EH 及 0E1H 即可。
範例:
ORG00H
MOV WDTRST,#01EH
MOVWDTRST,#0E1H;致能 WDT
...
...
...
MAIN_ROUTING:
MOVWDTRST,#01EH
MOVWDTRST,#0E1H;WDT 歸零,重新計數
...
...
...
SUB_ROUTING1:
MOVWDTRST,#01EH
MOVWDTRST,#0E1H;WDT 歸零,重新計數
...
...
...
SUB_ROUTING2:
MOVWDTRST,#01EH
MOVWDTRST,#0E1H;WDT 歸零,重新計數
...
...
...
具有 Pre-Scaling 功能的 WDT 操作
以 Megawin 的 MPC89E(L)51A 為例,關聯的 SFR 有:
WDTCR(0E1H)
其中,
ENW(WDT 致能)
0(預設): 不開啟 WDT
1: WDT 致能
CLRW(WDT 歸零)
0(預設): 無動作
1: 歸零重新計數,設 1 後會自動被硬體清除
WILD(是否在 IDLE MODE 下計數)
0(預設): 在 IDLE MODE 下繼續計數
1: 在 IDLE MODE 不計數
PS2:0(計數尺度,SCALE 為 8 的時候,每 8 個機械週期計數一次,亦即 8 倍於 1 個 SCALE 的週期)
{PS2, PS1, PS0}
{0, 0, 0}:2
{0, 0, 1}:4
{0, 1, 0}:8
{0, 1, 1}:16
{1, 0, 0}:32
{1, 0, 1}:64
{1, 1, 0}:128
{1, 1, 1}:256
由於這顆 MCU 的 WDT 是 15-bit 的,所以計數範圍為:0~215-1 即 0~32767,最低尺度是 2 個機械週期 Count 一次,也當尺度為 2 的時候,65536 個機械週期內必須至少歸零一次(相當於 16-bit WDT),否則將觸發 WDT Reset。
Pre-Scaling 的 Time out 時間(使用12MHz震盪器):
Pre-Scaling = 2 時,
2 * 215 * 1us = 0.065536 = 65.536 msec
Pre-Scaling = 4 時,
4 * 215 * 1us = 0.131072 = 131.072 msec
震盪頻率=12MHz 時的 WDT 計數週期速查:
範例:
ORG00H
MOVWDTCR,#00100010B;致能 WDT,設定尺度為 8
...
...
...
MAIN_ROUTING:
ORLWDTCR,#00010000B ;設定 CLRW 為 1,WDT 歸零
...
...
...
SUB_ROUTING1:
ORLWDTCR,#00010000B ;設定 CLRW 為 1,WDT 歸零
...
...
...
SUB_ROUTING2:
ORLWDTCR,#00010000B ;設定 CLRW 為 1,WDT 歸零
...
...
...