其次,看門狗的工作原理是什麼?
在系統運行以後也就啓動了看門狗的計數器,看門狗就開始自動計數,如果到了一定的時間還不去清看門狗,那麼看門狗計數器就會溢出從而引起看門狗中斷,造成系統復位。所以在使用有看門狗的芯片時要注意清看門狗(俗稱餵狗)。
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;
...
}