文章類型
開發平台
解決方案
關注主題
文章類型
開發平台
解決方案
關注主題

Arduino運作守護者:看門狗計時器簡介

 

watchdog-breadboard

有用電腦的人都知道,電腦一旦當機(大陸稱:死機)了,只能按下重新開機鈕Reset,或稱:重置),讓一切重來。

事實上Arduino系統也是這樣,有可能是因為外界的雜訊、電磁干擾,或程式本身的問題,或各種情況等,導致Arduino系統無法如預期正常運作,變成當機,碰到這種情形,也只能靠人工去按下它的重新開機鈕。

不過,不是所有的Arduino應用,都適合人工去按下重新開機鈕,有時候環境很複雜,一天可能當機5、6次,每天去按5、6次,也是很煩人的。

或者,Arduino的應用是在一些外部環境,例如架設在高架道路上,用來偵測與累計超過多少高度的車輛每天有多少輛,若這樣的系統當機了,就得派人去現場按重新開機鈕,人得爬高上去按,每天當一天,每天爬一次。

或者,在工廠輸送帶的生產線上,設置一個用Arduino控制的最終打印器,偵測到產品靠近,就自動替產品外包裝蓋上字樣,確定可以出貨,如果這樣的打印器當機了,就必須停止整條生產線,等待重新開機,才能恢復原有生產程序,這樣影響太大了。

解決方案:看門狗計時器

針對上述這種狀況,其實Arduino的系統晶片內,是有一個看門狗計時器(Watch Dog Timer, WDT),可以解決上述問題的。

看門狗計時器原理簡圖

看門狗計時器原理簡圖

看門狗計時器說穿了,就是一個「定時對Arduino系統按下重新開機鈕」的內部裝置,Arduino的看門狗計時器,最長可以設每8秒按一下重新開機,最短可以到15毫秒。

到此各位可能有個疑惑?若系統正常運作,卻被看門狗計時器下令重新開機,這不等於是擾亂運作嗎?

是的,所以,在開發撰寫Arduino控制程式時,必須每隔一段時間,下令清除看門狗計時器的計時值,讓計時器重新累計時間,如此就可以延後看門狗計時器按下重新開機的時間。

因此,若要讓Arduino系統良善運作,不想被看門狗計時器來搗亂,則控制程式每隔一段時間去清計時值,這個時間必須短於看門口計時器的週期時間,否則就真的會被看門狗計時器給干擾運作,這必須在寫程式時好好考慮一下,甚至需要一段時間的測試驗證,以便微調看門狗的計時週期時間,或者是微調控制程式清除計時值的週期時間。

尤其要考慮控制程式,主程式外加副程式(函式)等的運作週期,最久時間會是多長,必須事先掌握,以此來調整看門狗計時器的時間,如果清除計時值的指令是放在主程式,但實際執行時,卻碰到系統一直在副程式內執行,久久不能回返,就會導致看門狗計時器自行重新開機。

反之若把清除指令用於副程式,但卻很久沒去執行副程式,一樣會遭到看門狗發出的重新開機。當然,保險點就是時時去清除它,但太過頻繁也會增加系統運作的負荷與功耗。

最後,看門狗計時器的功效,基本上不在Arduino的核心函式庫內,但在avr-gcc編譯器內還是有的,且Arduino的Bootloader不支援,若真的要用,得用建議的ISP下載器去直接下載程式才行。以下是程式撰寫時,如何使用看門狗計時器的一些範例程式:

#include <wdt.h>    //使用看門狗計時器的含括檔

wdt_enable(timeout)      //開啟看門狗計時器功效,並設定重新開機的週期時間timeout

wdt_disable()  //關閉看門狗計時器功效

wdt_reset()     //清掉看門狗計時器的計時值

其中timeout要填入常數,有10個週期時間可選,如WDTO_2S、WDTO_8S等,TO即Timeout的意思,2S等於2秒週期,8S等於8秒週期。有機會各位也摸索嘗試。

陸向陽

陸向陽

從電子科系畢業後,即以媒體人的角色繼續這段與「電子科技」的不解之緣。歷任電子技術專書作者、電子媒體記者、分析師等角色,並持續寫作不殆。近來投入Arduino、Raspberry Pi等開放硬體的研究與教程介紹。
陸向陽

上一篇: | 下一篇:

我想回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *

成城共創股份有限公司版權所有、轉載必究.Copyright(c) 2017 MakerPRO