1. 程式人生 > >17 AVR中的定時器喂狗的作用

17 AVR中的定時器喂狗的作用

   在由微控制器構成的微型計算機系統中,由於微控制器的工作常常會受到來自外界電磁場的干擾,造成程式的跑飛,而陷入死迴圈,程式的正常執行被打斷,由微控制器控制的系統無法繼續工作,會造成整個系統的陷入停滯狀態,發生不可預料的後果,所以出於對微控制器執行狀態進行實時監測的考慮,便產生了一種專門用於監測微控制器程式執行狀態的晶片,俗稱"看門狗"(watchdog)。
其次,看門狗的工作原理是什麼?
   在系統執行以後也就啟動了看門狗的計數器,看門狗就開始自動計數,如果到了一定的時間還不去清看門狗,那麼看門狗計數器就會溢位從而引起看門狗中斷,造成系統復位。所以在使用有看門狗的晶片時要注意清看門狗(俗稱喂狗)。

   AVR中的定時器和其他所有的微控制器定時器大同小異,看門狗的作用也是如此,在大多數專案中,開發人員一般都是為了省事而將看門狗直接靜默,但是這樣一旦出現外部影響或者一些非人力因素導致的跑飛、程式宕機,會導致微控制器不能再自動的重啟。

  在一般的使用中,我們在init.c中對看門狗進行初始化//一般不建議直接靜默,而應該設定一個看門狗定時器的閾值
void wdtinit(void)
{
    #asm("wdr")
    WDTCR=0x1F;
    WDTCR=0x0F;
}
   然後在主函式進行一個喂狗操作。

void main()

{

...

while(1)

{

 wdtflag=1; //喂狗

...

}

}

   的確,這樣一般的情況下都可以避免微控制器的非正常宕機。但是在高低溫實驗(見博主前文)或者其他的時候,不可避免的會導致微控制器的異常重啟,尤其是在程式執行時間大致等於看門狗定時器的情況下。

   除了在中斷進行喂狗,一個比較好的辦法就是在定時器中進行喂狗操作,這樣可以避免中斷函式進入後子函式太長而導致程式執行時間大於看門狗定時器的時間的情況

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
...
    wdtflag=1;
...
}