1. 程式人生 > >看門狗的概念與應用以及如何用軟體實現系統的復位

看門狗的概念與應用以及如何用軟體實現系統的復位

在微控制器構成的系統中,由於微控制器的工作有可能受到來自外來電磁場的干擾而出現程式跑飛的現象,從而陷入死迴圈,出於對微控制器執行狀態進行實時性的監控的考慮,便產生了一種專門用於監測微控制器程式執行狀態的晶片,俗稱看門狗(watch dog)

看門狗的工作過程如下:

看門狗晶片和微控制器的一個I/O引腳相連,該I/O引腳通過微控制器的程式控制,使他定時的往看門狗晶片的這個引腳送入高電平(或者是低電平)這一個程式語句是分散在微控制器的其他控制語句中的,一旦微控制器由於干擾造成程式跑飛而陷入死迴圈時,給看門狗引腳送電平的程式便不能被執行到,這時,看門狗電路就會由於得不到微控制器送來的訊號,便對他送入一個復位訊號,使微控制器從程式儲存器的起始位置重新開始執行程式,這樣便實現了微控制器的自動復位

示例程式碼:

用軟體觀察看門狗的喂狗現象:如果在while迴圈中遮蔽這一局,那麼在看門狗的作用下,程式將會不斷
 //不斷的復位,這是看到的現象是在看門狗的作用下,led燈不斷的閃爍   

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sfr WDT_CONTR = 0xe1;//51系列的微控制器的看門狗的位置
sbit led1 = P1^0;

void delayms(uint x)
{
    uint i,j;
    for(i = x;i>0;i--)
        for
(j = 110;j>0;j--); } main() { WDT_CONTR = 0x35;//0011 0101表示喂狗,時間是2.095m要喂一次 led1 = 0; delayms(500); led1 = 1; while(1) { delayms(1000); // WDT_CONTR = 0x35;如果在while迴圈中遮蔽這一局,那麼在看門狗的作用下,程式將會不斷 //不斷的復位,這是看到的現象是在看門狗的作用下,led燈不斷的閃爍 } }
View Code

看門狗的暫存器為WDT_CONTR,位元組地址是e1,不能位定址,實現喂狗功能一般是在程式中插入

sfr WDT_CONTR = 0xe1 ;

WDT_CONTR= 0x35;//0011 0000這裡可以檢視專門的書籍看暫存器的相關位的設定

用軟體實現微控制器的系統復位:

STC微控制器增加了響應的硬體功能,內部的ISP/IAP控制暫存器ISP_CONTR便可以實現此功能,使用者只需要簡單的控制ISP_CONTR特殊功能暫存器中的SWBS和SWRST兩位便可以實現系統的復位

示例程式碼:

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char 
sfr  ISP_CONTR = 0xe7;

sbit dula = P2^6;
sbit wela = P2^7;
uchar num ,gw,sw,aa;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
                    0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x77,0x7c,
                    0x39,0x5e,0x79,0x71};

void init()//初始化函式
{
    TMOD = 0x01;
    TH0 = (65535-50000)/256;
    TL0 = (65535-50000)%256;

    EA = 1;
    ET0 = 1;
    TR0 =1;

}

void delayms(uint x)//延時函式
{
    uint i,j;
    for(i = x;i>0;i--)
        for(j=110;j>0;j--);
}

void display(uchar gw,uchar sw)//顯示函式
{
    dula = 1;
    P0 = table[sw];
    dula = 0;

    P0 = 0xff;
    wela = 1;
    P0 = 0xfe;
    wela = 0;
    delayms(5);

    P0 = 0x0;//消影
    dula = 1;
    P0 = table[gw];
    dula = 0;

    P0 = 0xff;
    wela = 1;
    P0 = 0xfd;
    wela = 0;
    delayms(5);

}

void main()
{
    init();
    while(1)
    {
        if(aa ==20)
        {
            aa =0;
            num++;
            if(num == 99)
                num =0;
            if(num ==10)
            {
                ISP_CONTR = 0x20;//0010 0000,操控暫存器實現軟體復位
            }
            gw = num%10;
            sw = num/10;
           
        }
        display(gw,sw);
    }
}

void timer0()interrupt 1
{
    TH0 = (65536-50000)/256;
    TL0 = (65536-50000)%256;
    aa ++;

}
View Code

實驗現象,數碼管以秒速遞增,遞增到10後,系統復位,之後重新開始從0計時

說一下STC微控制器的暫存器ISP/IAP暫存器,這個暫存器的地址是E7H,不能位定址,在這裡只需要將暫存器的第五個bit設定為1,便可以實現軟體的復位

因此程式碼通常是

sfr ISP_CONTR = 0xe7;

ISP_CONTR = 0x20;//0010 0000