【實作實驗室】除錯很難怎麼辦?用 Watch Dog Timer 自動 Reset

作者:實作派

大家對自己寫的程式通常都很有自信,但人算不如天算,總是在幾萬次的執行當中會遇到當機,而且你還不知道原因,因為 Bug 出現的機率低,造成除錯很困難。如果無法與 Bug 直球對決,那麼閃過它也是一種方法。watch dog 提供代客 Reset 的服務,會緊盯處理器 Processor,萬一 Processor 當機了,它會自動 Reset Processor,這樣系統就會穩定許多。

watch dog 概念

watch dog 的想法很簡單,就是 Processor 利用外部的電路來 Reset 自己。

Processor 為了證明自己還活著,每隔一段時間會傳送 Clear 訊號給 watch dog timer,一旦 Clear 訊號久久沒送出來, watch dog 就會視為當機,隨後便送出 Reset 給 Processor,我用下面這張圖來表示,我想各位會更清楚。

(圖片來源:實作派提供)

事實上 watch dog 本身是個計時器 Timer,它可以從 0 數到 N,所以也稱為 watch dog timer(WDT),WDT 一旦數到 N 就會發送 Reset 的訊號給 Processor,而 WDT 也設計成可以接受 Clear 訊號,用來讓 Timer 重新計數,只要 WDT 不要數到 N 就永遠不會送出 Reset。

Timer 算時間的方式不外乎 0 上數到 N,N 下數到 0,有些是用除頻的方式,只要能計算時間,實作方式可以說五花八門。

在大型的 DSP 系統中,可能會有好幾個 Watch Dog 看守不同的 Function Unit,每個 Unit 在 reset 的時候由於無法對外部的請求做回應,因此需要搭配一些機制,避免因為一個 Unit 當機而牽連了其他 Unit 跟著當機。

應用實例

我直接做個電路板來當例子,我使用 PIC 系列的 PIC12F1840,它是一顆 8 腳的 8 bit MCU,內含振盪器,也就是說接上電源就能馬上使用,下圖就是我的實驗平台。至於 3.3 V 的整流器是我做其他實驗要用的,在這篇文章裡並不會用到。

PIC12F1840 接線很容易,包含 watch dog 功能(圖片來源:實作派提供)

我的程式很簡單,就是下面這幾行,其中 clrwdt 就是組合語言的指令,asm( ) 可以用來崁入組合語言指令。這個程式的功能只有在 RA0 的腳位輸出 0 與 1 交替訊號而已,所以理論上在 RA0 會測量到一個穩定的方波。

參考資料

#pragma config WDTE = ON  //watch dog turn ON
#include <pic12f1840.h>

unsigned char c=0;

void main(void) {
    unsigned char i;
    
    TRISA=0x00; //設定PORT A為輸出
    while(1)
    {
        c=(unsigned char)(c^0x01);  //做XOR運算 1變0, 0變1
        PORTA=c; //輸出, 只有PORTA.0   也就是RA0有變化而已
        
        for(i=0;i<20;i++);  //delay, 模擬function的執行時間
        asm("clrwdt"); //以組合語言發送WDT clear指令
    }
    return;
}

由於我有啟動 WDT,如果沒有在時限內送出 clrwdt,MCU 就會被 Reset,而 Reset 這段時間由於程式重新跑到 XOR 運算需要額外的時間,會造成方波在這時候的寬度變得比較寬,從示波器上看起來就會有些抖動,如下圖這般。

如果這個現象 10 sec 才發生一次,你會發現這些細微的差異進而更正它嗎?身為工程師就是要具有相當敏銳的覺察力,所謂見微知著,你才能防範於未然。

System reset by watch dog timer

單晶片的 WDT

接下來看比較硬體的東西,我列出 PIC12F1840 的 WDT 方塊圖,在 datasheet page 81,它其實很容易理解,左邊看似一堆輸入訊號,其實就是用來決定要如何啟動 WDT 而已,只要有啟動,中間的震盪器便會振出固定的 31 KHz 頻率週期,而後方的 23 bit prescaler 是用來除頻的,除越多頻率就越低,到達 Timeout 的時間就越久,講白話些就是用來設定 WDT 的時間。

Watch Dog block diagram, Quote from PIC12F1840 datasheet

那除下來到底是多少時間一個循環呢?Datasheet 裡面已經幫我們算好了,但它只是大概算一下,所以才會寫上 nominal,我摘要在下圖,從 1 m sec 到 256 sec 都可以選。

時間的選擇取決於你的程式一趟要跑多久,Timeout 的時間必須要大於程式執行的時間,否則你的程式還沒跑完就會被Reset。別以為自己不會犯這種錯,當你的程式越寫越長的時候,到了某個時候你就會遇到一直莫名其妙的當機發生,如果你又忘了 watch dog 的存在,你就會在原地 Debug 到海枯石爛都找不出原因,原先想拿來穩定系統的 WDT,屆時就變成了你 Debug 的夢靨。

好好善用 watch dog 能幫助你改善系統的穩定度喔,這樣對 watch dog 是否有更清楚了呢?

Watch Dog timeout period setting by prescaler

(本文經同意轉載自實作派電子實驗室原文連結;責任編輯:賴佩萱)

StrongPiLab

Author: StrongPiLab

實作派電子實驗室(StrongPiLab)是一個著重知識與經驗的實作交流媒體,提供工程師們理論外的實務經驗,主要傳達電子產品與家電用品的正確操作概念與生活小常識、解說各種測試手法的技巧。

Share This Post On

發表

跳至工具列