เรียนรู้การใช้งาน Watch Dog Timer โมดูลภายใน Arduino Wemos D1 หรือ ESP8266 - Griffinics

Latest

เว็บบล็อกนี้จัดทำขึ้นเพื่อเก็บสะสมองค์ความรู้และประสบการณ์ด้านต่างๆ ที่ผู้เขียนได้เรียนรู้ระหว่างเส้นทางชีวิตการงาน ไว้เป็นวิทยาทานแด่ศิษย์อาจารย์ Google ทุกทาน

วันอังคารที่ 21 กุมภาพันธ์ พ.ศ. 2566

เรียนรู้การใช้งาน Watch Dog Timer โมดูลภายใน Arduino Wemos D1 หรือ ESP8266

 


ในบางครั้งการทำงานของโปรแกรมที่เราเขียนในไมโครคอนโทรลเลอร์อาจทำงานผิดพลาดหรือเกิดข้อผิดพลาดจนทำให้มีอาการโปรแกรมแฮงค์ เครื่องค้าง ไม่ทำงานต่อเนื่องตามที่เราต้องการ ซึ่งเป็นอาการที่ไม่ได้เกิดขึ้นบ่อยๆ แต่เกิดขึ้นได้ สำหรับโปรแกรมที่ต้องทำงานตลอดเวลาที่ต้องการความเสถียรสูงโปรแกรมจะหยุดทำงานไม่ได้ ซึ่งจำเป็นอย่างยิ่งที่ต้องมีระบบตรวจสอบการทำงาน ซึ่งระบบนี้ในไมโครคอนโทรลเลอร์จะเรียกว่า Watch Dog Timer (WDT) หรือสุนัขเฝ้าดูนั่นเอง ในวงจรควบคุมทางอิเล็กทรอนิกส์และคอมพิวเตอร์ต่างๆ จะต้องมีวงจรนี้ และสำหรับบอร์ด ESP8266 ก็มีมาเช่นกัน

หลักการทำงานของ Watch Dog Timer

WDT จะทำงานโดยอาศัยการตรวจสอบสัญญานนาฬิกาของวงจรซึ่งเปรียบได้กับชีพจรของคนเรา โดยจะมีความถี่ระยะเวลาในการตรวจสอบ เช่น ทุกๆ กี่มิลลิวินาที, กี่วินาที ก็แล้วแต่การตั้งค่า ซึ่งในระยะเวลาที่กำหนดวงจรหรือโปรแกรมจะต้องส่งสัญญานให้กับ WDT หากครบกำหนดเวลาแล้วถ้ายังไม่มีการสัญญาน WDT จะถือว่าการทำงานของโปรแกรมล้มเหลว และจะต้องทำการขัดจังหวะการทำงาน เช่น สั่งรีเซตการทำงานทั้งหมด เป็นต้น 

Software WDT และ Hardware WDT

ในบอร์ด ESP8266 จะมี WDT อยู่ 2 แบบ คือ Software (SW) และ Hardware  (HW) ในการทำงานปกติ WDT ทั้งสองแบบจะถูกเปิดใช้งานอยู่เสมอ หากต้องการปิดการใช้งานของ SW จะใช้ฟังก์ชั่น wdtDisable() และหากปิด SW แล้วจะต้องใช้ฟังก์ชั่น wdtFeed() เพื่อทำให้ WDT รู้ว่าการทำนยังปกติ การเปิดใช้งาน SW จะใช้ฟังก์ชั่น wdtEnable(mSec) 
  • ฟังก์ชั่นที่ใช้งาน
ESP.wdtDisable();      ใช้สำหรับปิดการใช้งาน Watch Dog Timer  แบบ Software

ESP.wdtEnable(mSec);      ใช้สำหรับเปิดการใช้งาน Watch Dog Timer  แบบ Software ค่า mSec มีหน่วยเป็นมิลลิวินาที

ESP.wdtFeed();         ใช้สำหรับสั่งให้ Watch Dog Timer เริ่มนับเวลาใหม่ ซึ่งคำสั่งนี้จะทำให้ WDT รู้ว่าการทำนยังปกติ

เพื่อให้เข้าใจหลักการทำงานของ WDT มากขึ้น ลองมาเขียนโค้ดเพื่อทดสอบการทำงานของ WDT ง่ายๆกันโดยการกำหนดการหน่วงเวลาและสังเกตการทำงานของโปรแกรมจากการปริ้นต์ข้อความผ่าน Serial Monitor ดังนี้

ตัวอย่างการใช้ WDT กับบอร์ด Arduino D1 หรือ ESP8266

    โปรแกรมนี้ทดสอบการทำงานของ WDT โดยการหน่วงเวลา 1 วินาที   เพื่อทดสอบการทำงานของ WDT ซึ่งค่าการตรวจสอบของ Hardware WDT ตรวจสอบ ทุกๆ 8 วินาที ในการทดสอบนี้จะทดสอบในสภาวะการทำงานปกติ

โค้ดตัวอย่าง ทดสอบการทำงานปกติ

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... ต่อเนื่องดังรูป




ทดสอบการทำงานของ WDT เมื่อโปรแกมทำงานผิดปกติ เช่น โปรแกรมแฮค์ หรือหยุดการทำงานนานเกิน 8 วินาที สมมุติสถานะการณ์โดยหน่วงเวลาเพิ่มเป็น 9 วินาที ซึ่งเกินค่าการตรวจสอบของ Hardware WDT 

โค้ดตัวอย่าง ทดสอบการทำงานผิดปกติปกติ

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 รู้ว่าการทำงานยังปกติ

}

เมื่อ WDT นับเวลาตรวจสอบการทำงานจนเกิน 8 วินาทีแล้วคำสั่ง ESP.wdtFeed(); ยังไม่ทำงาน ทำให้ WDT ทำการรีเซตการทำงานทั้งหมดของบอร์ด สังเกตได้จากการปริ้นต์ Reset เมื่อหน่วงเวลาเกิน 8 วินาที


บทสรุป 



อ้างอิง:


ไม่มีความคิดเห็น:

แสดงความคิดเห็น