欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 大俠發(fā)個STC51定時(shí)器喂狗代碼 學(xué)習(xí)一下 [打印本頁]

作者: sr861126    時(shí)間: 2023-6-16 11:51
標(biāo)題: 大俠發(fā)個STC51定時(shí)器喂狗代碼 學(xué)習(xí)一下
謝謝大家

作者: angmall    時(shí)間: 2023-6-16 14:13
不要在定時(shí)器中斷中喂狗,那將是一條寵物狗!

用定時(shí)器喂狗不合適吧,主程序跑飛了,但定時(shí)器仍舊喂狗,不能復(fù)位系統(tǒng). 應(yīng)該在主程序loop里面加喂狗指令, 程序跑飛,超時(shí)不能喂狗重啟系統(tǒng).
作者: chxelc    時(shí)間: 2023-6-16 14:57
// 看門狗程序 開始------------------------------------------------

WDT_CONTR = 0x27; //使能看門狗,溢出時(shí)間約為8s 通常放在main函數(shù)初始化區(qū)域

WDT_CONTR = 0x37; //清看門狗,否則系統(tǒng)復(fù)位(喂狗)通常放在mainWhile(1)循環(huán)體中 注意喂狗間隔不能超過8秒
作者: npn    時(shí)間: 2023-6-16 18:36
angmall 發(fā)表于 2023-6-16 14:13
不要在定時(shí)器中斷中喂狗,那將是一條寵物狗!

用定時(shí)器喂狗不合適吧,主程序跑飛了,但定時(shí)器仍舊喂狗,不 ...

不光是定時(shí)器中斷,任何中斷內(nèi)或被中斷調(diào)用的函數(shù)都不能喂狗。
作者: coody_sz    時(shí)間: 2023-6-16 21:14
喂狗只在主循環(huán)喂一次。
作者: rayin    時(shí)間: 2023-6-17 07:40
定時(shí)器是硬件, 獨(dú)立于單片機(jī)程序執(zhí)行運(yùn)行的, 單片機(jī)程序跑飛死機(jī)了, 定時(shí)器還能持續(xù)喂狗, 單片機(jī)異常后是不能復(fù)位重啟的.
作者: sr861126    時(shí)間: 2023-6-17 08:26
chxelc 發(fā)表于 2023-6-16 14:57
// 看門狗程序 開始------------------------------------------------

WDT_CONTR = 0x27; //使能看門狗 ...

  那怎么計(jì)算出每個函數(shù)執(zhí)行的時(shí)間,執(zhí)行完后剛好喂狗呢?
作者: 188610329    時(shí)間: 2023-6-17 13:47
sr861126 發(fā)表于 2023-6-17 08:26
那怎么計(jì)算出每個函數(shù)執(zhí)行的時(shí)間,執(zhí)行完后剛好喂狗呢?

看門狗不是去算主循環(huán)需要跑多少時(shí)間,實(shí)際上你也算不出來,因?yàn)槊看窝h(huán)的時(shí)間是不確定的,一旦有中斷觸發(fā),主循環(huán),一個循環(huán)的時(shí)間就會被延長。
而是你自己定義一個忍耐極限,就好像電腦多久沒有反應(yīng)了,你判定認(rèn)為死機(jī)了,然后強(qiáng)制重啟?
看門狗一個道理,比如,程序比較復(fù)雜的,中斷比較多的,你定義個3秒,沒有完成一個循環(huán),說明死機(jī)了,那么就重啟,就定義3秒,反正每次喂3秒,超時(shí)了就重啟。 程序比較簡單的,可以定義個 200ms,只要循環(huán)超過200ms 就重啟。 看你自己的“忍耐極限”
作者: chxelc    時(shí)間: 2023-6-17 14:47
sr861126 發(fā)表于 2023-6-17 08:26
那怎么計(jì)算出每個函數(shù)執(zhí)行的時(shí)間,執(zhí)行完后剛好喂狗呢?

時(shí)間不一定要剛剛好,提前喂狗也是可以的。例如8秒的看門狗,1秒喂狗也是可以的。
只要不影響程序的運(yùn)行,你勤快點(diǎn)喂狗,愛狗人士會表揚(yáng)你的。

如果程序塊或者函數(shù)執(zhí)行時(shí)間超過8秒,就需要在函數(shù)或語句塊中加入喂狗語句。
關(guān)于函數(shù)執(zhí)行的時(shí)間,要熟悉下硬件才能估算,1T的單片機(jī),語句執(zhí)行是很快的,耗時(shí)大多在循環(huán)或者延時(shí)函數(shù)上。
作者: chxelc    時(shí)間: 2023-6-17 14:49
發(fā)一個STC官網(wǎng)的STC15系列的看門狗測試程序供參考

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 看門狗溢出復(fù)位測試舉例------------------------*/
/* 如果要在程序中使用此代碼,請?jiān)诔绦蛑凶⒚魇褂昧薙TC的資料及程序        */
/* 如果要在文章中應(yīng)用此代碼,請?jiān)谖恼轮凶⒚魇褂昧薙TC的資料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil開發(fā)環(huán)境下請選擇Intel的8058芯片型號進(jìn)行編譯
//若無特別說明,工作頻率一般為11.0592MHz


#include "reg51.h"
#include "intrins.h"

sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;

sfr WDT_CONTR   = 0xc1;     //看門狗控制寄存器
sbit P32        = P3^2;     //測試口

void delay(unsigned int i)
{
    while (i--)
    {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
    }
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

    P32 = 0;
    delay(10000);           //復(fù)位閃燈延時(shí)
    P32 = 1;
    WDT_CONTR = 0x04;       //看門狗定時(shí)器溢出時(shí)間計(jì)算公式: (12 * 32768 * PS) / FOSC (秒)
                            //設(shè)置看門狗定時(shí)器分頻數(shù)為32,溢出時(shí)間如下:
                            //11.0592M : 1.14s
                            //18.432M  : 0.68s
                            //20M      : 0.63s
    WDT_CONTR |= 0x20;      //啟動看門狗
    while (1);
}


作者: chxelc    時(shí)間: 2023-6-17 15:19
發(fā)個測試看門狗的代碼供參考:

#include "reg51.h"

sfr     WDT_CONTR   =   0xc1;
sbit    P32         =   P3^2;

sfr     P0M1        =   0x93;
sfr     P0M0        =   0x94;
sfr     P1M1        =   0x91;
sfr     P1M0        =   0x92;
sfr     P2M1        =   0x95;
sfr     P2M0        =   0x96;
sfr     P3M1        =   0xb1;
sfr     P3M0        =   0xb2;
sfr     P4M1        =   0xb3;
sfr     P4M0        =   0xb4;
sfr     P5M1        =   0xc9;
sfr     P5M0        =   0xca;

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

//  WDT_CONTR = 0x23;                           //使能看門狗,溢出時(shí)間約為0.5s
    WDT_CONTR = 0x24;                           //使能看門狗,溢出時(shí)間約為1s
//  WDT_CONTR = 0x27;                           //使能看門狗,溢出時(shí)間約為8s
    P32 = 0;                                    //測試端口

    while (1)
    {
//      WDT_CONTR = 0x33;                       //清看門狗,否則系統(tǒng)復(fù)位
        WDT_CONTR = 0x34;                       //清看門狗,否則系統(tǒng)復(fù)位
//      WDT_CONTR = 0x37;                       //清看門狗,否則系統(tǒng)復(fù)位

//      Display();                              //顯示模塊
//      Scankey();                              //按鍵掃描模塊
//      MotorDriver();                          //電機(jī)驅(qū)動模塊
    }
}

作者: Y_G_G    時(shí)間: 2023-6-18 17:46
喂狗直接放在主函數(shù)
主函數(shù)執(zhí)行時(shí)間是不好算出來的,特別是用KEIL來仿真STC
在主函數(shù)放一行取反一個IO的代碼,用示波器或者邏輯分析儀測量就知道運(yùn)行時(shí)間了
喂狗時(shí)間大于這個時(shí)間就可以子
作者: yzwzfyz    時(shí)間: 2023-6-19 09:03
喂狗就一條指令而矣。
關(guān)鍵是,你要弄清楚看門狗的應(yīng)用原理,原理通了,寫一個喂狗語句還值得一提。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1