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