老马识途 发表于 2013-12-15 17:11:53

请教高搜 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]
查看完整版本: 请教高搜 avr 看门狗禁用不了?