|  |  |  | 
   
    |  |  |  | 
   
    |  |  |  | 
   
    |  | WatchDog 
      timer |  | 
   
    |  | 
        มีหน้าที่รีเซ็ทไมโครคอนโทรลเลอร์มี free running 
          oscillator แบบ RC แยกอิสระจากสัญญาณนาฬิกาของระบบ ทำให้ทำงานอย่างต่อเนื่องแม้อยู่ใน 
          sleep modeเมื่อสั่งให้ 
          WatchDog timer ทำงานแล้ว WatchDog timer จะเริ่มนับค่าเวลาจนถึงที่ตั้งไว้ 
          แล้วจะส่งสัญญาณไปรีเซ็ท MCU ฉะนั้น MCU จะต้องเคลียร์ค่าใน WatchDog ตลอดเวลา |  | 
   
    |  |  |  | 
   
    |  | การตั้งค่าการใช้งาน 
      WatchDog timer |  | 
   
    |  | สำหรับ Complier 
      ใน Preprocessor #fuse ให้ใส ่WDT เพื่อให้ WatchDog 
      ทำงาน |  | 
   
    |  | #fuses 
      XT,PUT,BROWNOUT,MCLR,WDT,NOPROTECT,NOLVP |  | 
   
    |  |  |  | 
   
    |  | ฟังก์ขั่นที่สำคัญ |  | 
   
    |  | 
         
          |  | setup_wdt 
            (mode) | การกำหนดระยะเวลาให้กับ 
            WatchDog timer |   
          |  | For 
            PCB/PCM parts: |  |   
          |  | WDT_18MS |  |   
          |  | WDT_36MS |  |   
          |  | WDT_72MS |  |   
          |  | WDT_144MS |  |   
          |  | WDT_288MS |  |   
          |  | WDT_576MS |  |   
          |  | WDT_1152MS |  |   
          |  | WDT_2304MS |  |   
          |  | For 
            PIC18 parts: |  |   
          |  |  WDT_ON, WDT_OFF |  |   
          |  |  |  |   
          |  |  |  |   
          |  | restart_wdt() | กำหนดให้ 
            WatchDog timer เริ่มนับใหม่ (Clear Watch dog) |   
          |  |  |  |   
          |  |  |  |   
          | การตรวจสอบเงื่อนไขเมื่อ 
            MCU ถูกรีเซ็ท |   
          |  |  |  |   
          |  | value = restart_cause() | ฟังก์ขั่นที่ใช้ตรวจสอบเหมือน 
            MCU ถูกรีเซ็ท |   
          |  | WDT_FROM_SLEEPWDT_TIMEOUT
 MCLR_FROM_SLEEP
 NORMAL_POWER_UP
 
 |  |  |  | 
   
    |  |  |  | 
   
    |  |  |  | 
   
    |  | - การทดสอบการทำงานของ 
      WATCHDOG โดยให้แสดงผ่านทาง RS232 (soft ware TX=RA0,RX=RA1) 
 |  | 
   
    |  |  |  | 
   
    |  |  |  | 
   
    |  | WDTDEMO.C |  | 
   
    |  | 
        
           
            |  
                //Watchdog timer Demo
//#include <16F628.h>#include <16F648A.h>
#use delay(clock=4000000)
#fuses XT,PUT,BROWNOUT,MCLR,WDT,NOPROTECT,NOLVP
#define  TxD         PIN_A0
#define  RxD         PIN_A1
#use rs232(baud=9600, xmit=TxD,rcv=RxD)
void main(void)
{
int c,done;
   
   switch(restart_cause())
   {
    case WDT_FROM_SLEEP:
        printf("WAKEUP form sleep\r\n");
        break;
    case WDT_TIMEOUT:
        printf("Watchdog Reset!\r\n");
        break;
    case NORMAL_POWER_UP:
        printf("Normal  power up!\r\n");
        break;
    
    default:
     printf("Reset!\r\n");  //27
   }
   printf("*** Watchdog Timer  ***\r\n");
   printf("Press h goto Halt\r\n");
   printf("Press s goto Sleep mode\r\n");
   setup_wdt(WDT_2304MS);
   done=0;
   while(!done)
   {
    if(kbhit())
    {
     c =getc();
     //printf("%c",c);
     switch(c)
     {
      case 's':
           done=1;
           break;
      case 'h':
            printf("Halt!\r\n");
            while(1);
           break;
     }
    }
    restart_wdt();      //Clear Watch Dog
   }
   printf("sleep\r\n");
}
 |  |  | 
   
    |  |  |  | 
   
    |  | เมื่อโปรแกรมเริ่มทำงาน |  | 
   
    |  | *** Watchdog Timer  ***
Press h goto Halt
Press s goto Sleep mode  |  | 
   
    |  |  |  | 
   
    |  | - ทดสอบโดยกดตัวอักษร 
      h เพื่อให้โปรแกรมวนลูป (Hang) |  | 
   
    |  | Halt!
Watchdog Reset!
*** Watchdog Timer  ***
Press h goto Halt
Press s goto Sleep mode |  | 
   
    |  |  |  | 
   
    |  | - ทดสอบโดยกดตัวอักษร 
      sเพื่อให้ไมโครคอนโทรลเลอร์เข้าสู่ Sleep mode |  | 
   
    |  | sleepWAKEUP form sleep
 *** Watchdog Timer  ***
 Press h goto Halt
 Press s goto Sleep mode
 |  | 
   
    |  |  |  | 
   
    |  | - เมื่อปิดแหล่งจ่ายไฟ 
      แล้วเปิดขึ้นมาใหม่ |  | 
   
    |  | Normal  power up!*** Watchdog Timer  ***
Press h goto Halt
Press s goto Sleep mode
 |  | 
   
    |  |  |  | 
   
    |  |  |  |