PIC单片机看门狗程序,关闭看门狗程序正常,打开后异常。请指点错误之处,谢谢 代码如下

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PIC单片机看门狗程序,关闭看门狗程序正常,打开后异常。请指点错误之处,谢谢 代码如下相关的知识,希望对你有一定的参考价值。

//MPLAB IDE v8.63
//PICC 9.82
//PIC16F873A
//****************************************************************************
//程序的主要功能是测试单片机的看门狗信号,疑问点看门狗关闭运行 RB4灯闪烁 RC2灯一直亮
// 看门狗打开运行 RB4灯一直亮 RC2灯一直亮
//****************************************************************************
#include <pic.h> //包含头文件
#define clrwdt asm("CLRWDT")
#define uint unsigned int
__CONFIG(FOSC_XT&WDTE_ON&PWRTE_ON &BOREN_ON&LVP_ON);
//__CONFIG(FOSC_XT&WDTE_OFF&PWRTE_ON &BOREN_ON&LVP_OFF);
unsigned int delay_key;
//**************************************************************
//TMR0周期=256×(2的8次方-计数初值)×指令周期(4M为1us)
//**************************************************************
void fun_initializtion(void) //初始化函数

OPTION_REG=0b11000111; //位7 禁止B端口上拉、位6 RB0/INT上升沿触发中断、位5 内部指令周期,位4 不用RA4,
//位3是0 将预分频指派给TMR0、位2-0 分频比选择位 111为1:256
INTCON =0b11110000; //全局中断、外设中断、TMR0溢出中断允许、RB0/INT外部中断允许
ADCON1 =0b00000110; //RA端口为数字I/O口

//LED默认熄灭
TRISB = 0b00000000;
//PORTB = 0b00000000;
TRISC = 0b00000000;
//PORTC = 0b00000000;

void mDelay(unsigned int Delay) //延时函数

unsigned int i;
for(;Delay>0;Delay--)

//for(i=0;i<34;i++) //4MHZ 501us
for(i=0;i<16;i++); //4MHZ 249us

/*clrwdt;*/


static void interrupt isr(void) // 中断函数

if(TMR0IF) //判断TMR0是否有溢出 =1为溢出
//timer interrupt
TMR0=215; //256×40×1 =80us 4M
TMR0IF=0; //clear the interrupt flag 软件清零
clrwdt;
delay_key++; //记录TMR0的溢出次数 每10ms加1
if(delay_key>=100) //1s时间 值为100

delay_key=0;
RB4 = 1;
mDelay(4000); //1S时间
RB4 = 0;



void main()

clrwdt;
fun_initializtion(); //调用初始化函数
interrupt isr();
while(1)

mDelay(4); //0.01S时间
//mDelay(4000); //1S时间
RC2 = 1;
clrwdt;


中断的占用时间过长,也就是清狗程序不够及时。建议不要用延时,想其他的办法去解决这个问题为好。本身单片机的速度就不快,还延时就让单片机的休息时间过多,效率自然就不高了。
就好比楼主请个人给你做事,本省这个人做事就不怎么快,你还让他经常休息,你说能帮你做好事情么?开个玩笑,帮助理解的!~
参考技术A 1.初始化函数里没看到看门狗的初始化;
2.中断函数里不可以清看门狗;
3.建议在子程序调用的开始和结束时都清一次看门狗;追问

你好,我改好后测试还是一样,我想知道怎样测试在程序还没执行完成时(即RC2灯点不亮),看门狗提前复位

追答

你在主函数的初始化后开关一次独立的指示灯,如果这个灯会闪烁,就说明看门狗出现了超时。

追问

void main()

//clrwdt;
fun_initializtion(); //调用初始化函数
RC2 =1;
mDelay(40); //10S时间
RC2 =0;
interrupt isr();
while(1)

mDelay(4000); //1S时间
//mDelay(40000); //10S时间

RC2 = 1;
clrwdt;



还是不知怎样计算 RC2 灯无异常 我没财富了 麻烦发我私信吧 谢谢

Arduino - 看门狗定时器的使用介绍

Arduino - 看门狗定时器的使用介绍


看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗置零,重新开始计数。如果看门狗增加到设定值就认为程序没有正常工作,强制整个系统复位。

该看门狗定时器有点像ESP32/8266的Ticker库的定时功能.

wdt_enable(timeout) //看门狗启动,并设置超时时间
// 0=15(16)ms, 1=30(32)ms,2=60(64)ms,3=120(128)ms,4=25

以上是关于PIC单片机看门狗程序,关闭看门狗程序正常,打开后异常。请指点错误之处,谢谢 代码如下的主要内容,如果未能解决你的问题,请参考以下文章

计算机高手解释一下硬件看门狗是什么意思?

单片机中的看门狗是啥东西,有啥作用

Arduino - 看门狗定时器的使用介绍

单片机的看门狗怎么用

看门狗定时器原理介绍

什么是看门狗它的原理 看门狗它的原理是什么