请教高搜 avr 看门狗禁用不了?
请教高手,为什么看门狗禁用不了呢?熔丝烧写是默认的,狗没有一直启动。内部8M频率 启用8分频,mea48 mega 8效果一样
用的是CVAVR
有如下几种现象几个问题,如下:
1、
注释掉interrupt void _dog_isr(void)函数。
1.1 (下面程序是抄主程序的)
USART_Init();
// dog_en(); //不启用狗
USART_char(WDTCSR); //调试结果:WDTCSR=00;
dog_dis();
USART_char(WDTCSR); //调试结果:WDTCSR=00;
1.2
USART_Init();
dog_en(); //启用狗
USART_char(WDTCSR); //调试结果:WDTCSR=08;
dog_dis();
USART_char(WDTCSR); //调试结果:WDTCSR=08;明显没禁用狗
2、
不注释interrupt void _dog_isr(void)函数。
USART_Init();
// dog_en(); //不启用狗
USART_char(WDTCSR); //调试结果:WDTCSR=08;
dog_dis();
USART_char(WDTCSR); //调试结果:WDTCSR=08;//主程序 1.1相同但是仅仅加了个中断函数,中断也没执行,狗却启用了,也禁止不了
3、打算用48的狗中断,中断后保存数据,然后重启。程序如下:
interrupt void _dog_isr(void)
{
/*
数据保存程序 略
*/
dog_en();//用一次开启看门狗复位函数,就是复位不了实验结果是 要用两次开启看门才行
dog_en();
while(1) #asm("cli");;
}
下面是关闭狗测试源程序
#include <mega48.h>
#include <delay.h>
#define feed_dog #asm("WDR")
#define dog_overflow_time_17ms 0
#define dog_overflow_time_33ms 1
#define dog_overflow_time_66ms 2
#define dog_overflow_time_130ms 3
#define dog_overflow_time_260ms 4
#define dog_overflow_time_540ms 5
#define dog_overflow_time_1110ms 6
#define dog_overflow_time_2220ms 7
#define dog_overflow_time_4000ms 0x20
#define dog_overflow_time_8000ms 0x21
void dog_en(void) //看门狗启动
{
feed_dog;
/*MCUSR 中的WDRF 清零*/
MCUSR = 0x00;
// 置位WDCE 与WDE
WDTCSR = (1<<WDCE) | (1<<WDE);
WDTCSR=(1<<WDE) |dog_overflow_time_17ms;
}
void dog_dis(void) //看门狗禁止 安全是抄手册上的
{
feed_dog;
// MCUSR 中的WDRF 清零*/
MCUSR = 0x00;
// 置位WDCE 与WDE
WDTCSR = (1<<WDCE) | (1<<WDE);
WDTCSR=0;
}
interrupt void _dog_isr(void)//看门狗中断
{
/*
SHUJU
*/
{//要复位需要增加两个dog_en()不知道为啥,试验结果。
dog_en();
dog_en();
while(1);
}
}
voidUSART_char (unsigned char x) //串口发送一个数据
{
while (!(UCSR0A&0x20)) #asm("WDR");
UDR0=x;
}
//f****************USART无中断初始化******************* ************************ 频率1M波特率1200
void USART_Init(void)
{
unsigned int usart_temp;
usart_temp=(unsigned int)(1000000/1200)/16-1;
UBRR0H=(unsigned char)(usart_temp>>8);
UBRR0L=(unsigned char)(usart_temp&(unsigned int)0x00ff);
UCSR0B=0x98;//发送接收使能接收中断使能
}
void main(void)
{
USART_Init();
dog_en();
USART_char(0xaa);
USART_char(WDTCSR);
dog_dis();
USART_char(0xbb);
USART_char(WDTCSR);
USART_char(0xcc);
while (1)
{
;
}
}
页:
[1]