Watchdog Timer สำหรับ 89S52 ใน Keil

ถ้าพูดถึงไมโครคอนโทรลเลอร์ตระกูล MCS-51 ที่ผมชอบใช้ ก็เป็นเบอร์ 89S52 เนื่องจากมีราคาที่ถูกมาก และที่ถูกอกถูกใจคือผมไม่ต้องถอด IC มา burn เหมือนแต่ก่อนแล้ว ผมต่อสายจาก parallel port มา burn IC ได้เลย (ISP Programming) สะดวกกว่า ICD2 ของ Microchip เสียอีก

เอาละมาเข้าเรื่องกันดีกว่า มันมีอยู่งานนึงที่ผมใช้ 89S52 แต่มันเป็นงานที่ทำตลอด 24 ชั่วโมง ฉะนั้นมันแฮงค์ไม่ได้เลย ผมจำได้ว่า 89S52 มันมี Watchdog Timer ในตัวด้วย เลยไม่รอช้าเปิด datasheet มาดู เค้าบอกว่าอย่างนี้

การที่จะ Enable ให้ Watchdog ทำงานนั้นให้เขียนข้อมูล 0x1E และ 0xE1 ลงไปใน register WDTRST ต้องเขียนต่อกันเลยนะถึงจะใช้ได้ ส่วน Watchdog Timer ตัวนี้เป็น Counter 13 บิตแล้วจะนับขึ้นทุก machine cycle แล้วถ้าปล่อยให้นับได้ถึง 8191 (0x1FFF) เมื่อไหร่ละก็ จะเกิดการรีเซต ฉะนั้นเราต้องเขียนโปรแกรมไปคอยเคลียร์ไม่ให้ Watchdog Timer มันนับไปถึงค่า Overflow 8191

การเคลียร์ Watchdog Timer ก็ทำเหมือนกับ enable นะแหล่ะ ก็เขียนข้อมูล 0x1E และ 0xE1 ลงไปใน register WDTRST ถ้าอยากรู้ว่า 8191machine cycle นี่นานขนาดไหนมาลองคำนวนเล่นๆกันดีกว่า

ตัวอย่าง สมมุติว่าใช้ XTAL 11.0592 MHz แล้ว clock 12 ลูกจะได้ 1 machine cycle

T = (8191*12)/(11059200) = 8.887 mS ฉะนั้นเราต้องไปเคลียร์ Watchdog Timer ทุกๆ 8.8 mS เป็นอย่างน้อย หรือใครจะเคลียร์ทุกๆ 1 mS ก็ยิ่งดี ส่วนตัวเลข 8191 นี่เค้ากำหนดมาตายตัว เราไม่สามารถ scale ได้

ลองดู code ที่จะนำไปใช้กับ Compiler keil ดู

อันดับแรกเราก็ต้องประกาศ sfr (Speacial Function Register) ก่อนเพราะใน AT89X52.h ไม่ได้ประกาศ register WDTRST มาให้

sfr WDTRST = 0xa6;
sfr AUXR = 0x8e;

จากนั้นก็ Enable และ เคลียร์ด้วย Sub void kickdog()

void kickdog()??????????????????????????????? //every 8191 Machine Cycle
{ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //~8 ms
WDTRST = 0x1e;
WDTRST = 0xe1;
}

จากนั้นเราก็หาที่วาง void kickdog() ใน function ต่างๆ (แนะนำว่าควรวางใน loop while(1) )? เพียงเท่านี้ 89S52 ของเราก็ทำงานได้นานแสนนาน โดยที่ไม่แฮงค์ (ถึงแฮงค์ก็รีเซตตัวเองขึ้นใหม่ได้)

บทความอื่นๆที่เกี่ยวข้อง

2 thoughts on “Watchdog Timer สำหรับ 89S52 ใน Keil

  1. ผมมีข้อสงสัยครับ..คือเวลาที่มันรีเซตตัวเองแล้วค่าต่างๆมันจะไม่หายหรือครับ
    เช่น มันรีเซตตอนที่หลอด LED ติด(หลังจากที่เรากด SW)หรือต้องเขียนโปรแกรม mem ค่าต่างๆไว้ใน eep

  2. เวลารีเซตค่าใน RAM มันหายไปครับ บางทีผมก็ให้มันเรียนรู้จาก Hardware ภายนอกที่มาต่อว่ามันควรจะทำงานอย่างไรต่อไป หรือจะเก็บไว้ใน EEPROM ก็ได้ครับ

Leave a Reply