ในบางครั้งการทำงานของโปรแกรมที่เราเขียนในไมโครคอนโทรลเลอร์อาจทำงานผิดพลาดหรือเกิดข้อผิดพลาดจนทำให้มีอาการโปรแกรมแฮงค์ เครื่องค้าง ไม่ทำงานต่อเนื่องตามที่เราต้องการ ซึ่งเป็นอาการที่ไม่ได้เกิดขึ้นบ่อยๆ แต่เกิดขึ้นได้ สำหรับโปรแกรมที่ต้องทำงานตลอดเวลาที่ต้องการความเสถียรสูงโปรแกรมจะหยุดทำงานไม่ได้ ซึ่งจำเป็นอย่างยิ่งที่ต้องมีระบบตรวจสอบการทำงาน ซึ่งระบบนี้ในไมโครคอนโทรลเลอร์จะเรียกว่า Watch Dog Timer (WDT) หรือสุนัขเฝ้าดูนั่นเอง ในวงจรควบคุมทางอิเล็กทรอนิกส์และคอมพิวเตอร์ต่างๆ จะต้องมีวงจรนี้ และสำหรับบอร์ด ESP8266 ก็มีมาเช่นกัน
หลักการทำงานของ Watch Dog Timer
WDT จะทำงานโดยอาศัยการตรวจสอบสัญญานนาฬิกาของวงจรซึ่งเปรียบได้กับชีพจรของคนเรา โดยจะมีความถี่ระยะเวลาในการตรวจสอบ เช่น ทุกๆ กี่มิลลิวินาที, กี่วินาที ก็แล้วแต่การตั้งค่า ซึ่งในระยะเวลาที่กำหนดวงจรหรือโปรแกรมจะต้องส่งสัญญานให้กับ WDT หากครบกำหนดเวลาแล้วถ้ายังไม่มีการสัญญาน WDT จะถือว่าการทำงานของโปรแกรมล้มเหลว และจะต้องทำการขัดจังหวะการทำงาน เช่น สั่งรีเซตการทำงานทั้งหมด เป็นต้น
Software WDT และ Hardware WDT
- ฟังก์ชั่นที่ใช้งาน
เพื่อให้เข้าใจหลักการทำงานของ WDT มากขึ้น ลองมาเขียนโค้ดเพื่อทดสอบการทำงานของ WDT ง่ายๆกันโดยการกำหนดการหน่วงเวลาและสังเกตการทำงานของโปรแกรมจากการปริ้นต์ข้อความผ่าน Serial Monitor ดังนี้
ตัวอย่างการใช้ WDT กับบอร์ด Arduino D1 หรือ ESP8266
โค้ดตัวอย่าง ทดสอบการทำงานปกติ
void setup()
{
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
ESP.wdtDisable(); //ใช้สำหรับปิดการใช้งาน Watch Dog Timer แบบ Software
Serial.println("Reset");
}
void loop()
{
Serial.println("Arduino All Working...");
delay(1000);
ESP.wdtFeed(); //สั่งให้ Watch Dog Timer เริ่มนับเวลาใหม่ ซึ่งคำสั่งนี้จะทำให้ WDT รู้ว่าการทำงานยังปกติ
}
เมื่อหน่วงเวลา 1 วินาที แล้วใช้คำสั่ง ESP.wdtFeed() ให้ Watch Dog Timer เริ่มนับเวลาใหม่ ซึ่งจะไม่เกิน 8 วินาที เสมือนกับโปรแกรมการทำงานเป็นปกติ โปรแกรมก็จะปริ้นต์ Arduino All Working... ต่อเนื่องดังรูป
โค้ดตัวอย่าง ทดสอบการทำงานผิดปกติปกติ
void setup()
{
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
ESP.wdtDisable(); //ใช้สำหรับปิดการใช้งาน Watch Dog Timer แบบ Software
Serial.println("Reset");
}
void loop()
{
Serial.println("Arduino All Working...");
delay(9000); //หน่วงเวลาเพิ่ม 9 วินาที
ESP.wdtFeed(); //สั่งให้ Watch Dog Timer เริ่มนับเวลาใหม่ ซึ่งคำสั่งนี้จะทำให้ WDT รู้ว่าการทำงานยังปกติ
}
ไม่มีความคิดเห็น:
แสดงความคิดเห็น