Watch Dog Timer () 功能使用說明 ( 使用內部 250KHz) 適用產品 :SM59264 SM59128 SM8954A SM8958A SM89516A SM894051 SM79108 SM79164 SM59D03/04G2 應用說明 : 1 針對使用新茂 (SyncMOS)MCU, 如有因程式設計之關係, 需防止當機之發生時, 可啟動 Watch Dog 功能, 以防止當機之發生 2 此 功能共有八組重置時間可供選擇 (SM8954A/58A/516A 重置時間乘 8 倍 ) 3 此 功能為計數器 0, 計數器 1, 計數器 2 外之另一組利用內部 RC 震盪的 16 位的計數器 4 應用範圍 :1 防當機裝置 2 自動 S/W Reset 功能 使用方法 : 1. 特殊功能暫存器說明 : 1.1. 控制暫存器 (C, $9F) E Unused Clear Unused Unused PS2 PS1 PS0 Read / Write: R/W - R/W - - R/W R/W R/W Reset value: 0 * 0 * * 0 0 0 E: 致能位當設為 1 時則啟動 計時功能, 初使值為 0 當 Reset 發生時, 此位會被清成 0, 故如果要再次啟動, 則需再一次將此位設成 1 Clear: 重置位當設為 1 時則是將 16 位計數值清除為 0, 當計數值清除為 0 後,CLEAR 會自動恢復為 0 型號 : SM59264 SM59128 SM894051 SM79108 SM79164 PS 2:0 : 計數溢位週期選擇 PS 2:0 000 001 010 011 100 101 110 111 溢位週期 2.048ms 4.096ms 8.192ms 16.384ms 32.768ms 65.536ms 131.072ms 262.144ms 型號 : SM8954A SM8958A SM89516A PS 2:0 : 計數溢位週期選擇 PS 2:0 000 001 010 011 100 101 110 111 溢位週期 16.38ms 32.76ms 65.53ms 131.07ms 262.14ms 524.28ms 1048.57ms 2097.15ms ISSFA-0109 1 Ver.B 2010/07
控制暫存器 (C, $8E)(SM59D03/04G2 設定 ) E Unused Clear Unused Unused M2 M1 M0 Read / Write: R/W - R/W - - R/W R/W R/W Reset value: 0 * 0 * * 0 0 0 E: 致能位當設為 1 時則啟動 計時功能, 初使值為 0 當 Reset 發生時, 此位會被清成 0, 故如果要再次啟動, 則需再一次將此位設成 1 Clear: 重置位當設為 1 時則是將 16 位計數值清除為 0, 當計數值清除為 0 後,CLEAR 會自動恢復為 0 型號 : SM59D03/04G2 M 2:0 : 計數溢位週期選擇 M 2:0 000 001 010 011 100 101 110 111 溢位週期 1.58ms 3.15ms 6.30ms 12.60ms 25.12ms 50.41ms 100.82ms 201.65ms 1.2. Key 暫存器 - (KEY, $97) KEY7 KEY6 KEY5 KEY4 KEY3 KEY2 KEY1 KEY0 Read / Write: W W W W W W W W Reset value: 0 0 0 0 0 0 0 0 此 Key 暫存器 (KEY,$ 97) 為控制 控制暫存器 (C,$ 9F) 之設定及保護 當對 Key 暫存器 (KEY,$ 97) 先後寫入 1EH 及 E1H 時 ( 須依此順序先後寫入 ), 始可對 控制暫存器 (C,$ 9F) 設定 當對 Key 暫存器 (KEY,$ 97) 先後寫入 E1H 及 1EH 時 ( 須依此順序先後寫入 ), 則 控制暫存器 (C,$ 9F) 已被保護, 無法修改 Key 暫存器 - (KEY, $8F)(SM59D03/04G2 設定 ) KEY7 KEY6 KEY5 KEY4 KEY3 KEY2 KEY1 Read / Write: W W W W W W W W Reset value: 0 0 0 0 0 0 0 0 KEY0 ISSFA-0109 2 Ver.B 2010/07
此 Key 暫存器 (KEY,$ 8F) 為控制 控制暫存器 (C,$ 8E) 之設定及保護 當對 Key 暫存器 (KEY,$ 8F) 先後寫入 1EH 及 E1H 時 ( 須依此順序先後寫入 ), 始可對 控制暫存器 (C,$ 8E) 設定 當對 Key 暫存器 (KEY,$ 8F) 先後寫入 E1H 及 1EH 時 ( 須依此順序先後寫入 ), 則 控制暫存器 (C,$ 8E) 已被保護, 無法修改 1.3. 系統控制暫存器 (SCONF, $BF) WDR Unused Unused Unused DFEN ISPE OME ALEI Read / Write: R/W - - - R/W R/W R/W R/W Reset value: 0 * * * 0 0 0 0 WDR: Watch Dog Timer 重置位 當系統重置時是借著 溢位時產生 WDR 將被設定為 1, 初使值 = 0 2. 程式範例 : 2.1. Assembly language: ;*********************** SET DATA ************************************ C.REG 09FH ;SFR 內 C 的地址 KEY.REG 097H ;SFR 內 KEY 的地址 ;C.REG 08EH ;SFR 內 C 的地址 (59D03/04G2) ;KEY.REG 08FH ;SFR 內 KEY 的地址 (59D03/04G2) SCONF.REG 0BFH ;SFR 內 SCONF 的地址 ;********************************************************************** ORG 0000H ; 設定目前程式的起始位址 ;******************* 判斷 SCONF 的 WDR 是否有 Reset 產生 *************** reset: MOV a,sconf ; 將 SCONF 暫存器的內容放至 A 暫存器中 JNB acc.7,poweron_reset ;acc.7 的值若為 0 則跳至 power on_reset ;******************** acc.7 為 1 時的執行程式 ( 即 Reset 動作 ) ************* wdt_reset: MOV P1,#00 ; 如果進入 RESET 副程式, 則 P1 會全亮全滅一次 ANL a,#7fh ; 將 SCONF 的 WDR 清除為 0, 為了做下一次是否被 RESET 的偵測 MOV SCONF,a MOV KEY,#1Eh ISSFA-0109 3 Ver.B 2010/07
MOV KEY,#0E1h ;UnProtect C MOV C,#10000110b ; 啟動 Timer 且開始計數及選擇內部頻率除頻大小 MOV KEY,#0E1h MOV KEY,#1Eh ;Protect C MOV P1,#0ffh JMP start ;******************** acc.7 為 0 時的執行程式 ( 即設定 功能 ) ************** poweron_reset: MOV KEY,#01Eh MOV KEY,#0E1h ;UnProtect C MOV C,#10000110b ; 啟動 Timer 且開始計數及選擇內部頻率除頻大小 MOV KEY,#0E1h MOV KEY,#1Eh ;Protect C ;*************** 執行 main program (LED 閃爍程式由 Port 0 輸出 ) ************ start: MOV a,#55h MOV P0,a MOV a,#0aah MOV P0,a JMP start ;************************ 執行 Delay 的動作 ***************************** delay: MOV 20H,#08h b3: MOV 21H,#0ffh b2: CALL clear ; 呼叫 clear 副程式 MOV 22H,#0ffh b1: DJNZ 22H,b1 DJNZ 21H,b2 DJNZ 20H,b3 RET ;******************* 設定 C 的 Clear Bit ******************************* clear: MOV KEY,#1Eh ISSFA-0109 4 Ver.B 2010/07
MOV KEY,#0E1h ;UnProtect C MOV a,c ; 將 C 的 CLEAR 設定為 1, 執行清除計數器的動作 ORL a,#20h MOV C,a MOV KEY,#0E1h MOV KEY,#1Eh ;Protect C RET END 2.2. C language: #include "SM59264C.h" //#include "SM59D04G2.h" #include<intrins.h>//--use "_nop_();" void _Enable(void) // Watch Dog enable KEY = 0x1E; KEY = 0xE1; C = 0x86; KEY = 0xE1; KEY = 0x1E; void _Clear(void) // Watch Dog Disable and counter clear KEY = 0x1E; KEY = 0xE1; C = C 0x20; KEY = 0xE1; KEY = 0x1E; void Delay_x1ms(int time) int count=0,t_base; TMOD=TMOD 0x01; // set timer0 mode1 T_base=0x10000-0x733; //0x10000-0x733; while(count<time) ISSFA-0109 5 Ver.B 2010/07
TH0=T_base/0x100; //catch hi byte TL0=T_base%0x100; //catch low byte TR0=1; //set TR0, start timer1 mode1 while(tf0==0) //TMOD is TF0, if TF0=1 overflow _nop_(); _Clear(); TR0=0; TF0=0; //clr TF0 count++; TMOD=TMOD & 0xFE; // stop timer0 mode1 void _Reset(void) // Watch Dog Reset unsigned char temp; temp = SCONF & 0x80; if (temp==0x80) P1 = 0X00; SCONF = SCONF & 0X7F; P1 = 0Xff; //=============================== void main(void) _Enable(); _Reset(); while(1) P0 = 0x55; ISSFA-0109 6 Ver.B 2010/07
P0 = 0xAA; ISSFA-0109 7 Ver.B 2010/07