2408308628 发表于 2013-8-9 15:58:11

MEGA48使用看门狗碰到的问题

本帖最后由 2408308628 于 2013-8-9 16:07 编辑

最近小弟在写一个程序,里边要用到看门狗,看门狗的功能相信大家都知道它的作用就是超过你设定的时间不喂狗,系统就会重启。而我现在碰到的问题就是看门狗设定不了,一使能看门狗,它就不断重启系统,我用的编译环境是atmelstudio 6.0,GCC,下面是我的程序:附件为对应程序proteus仿真电路
/*
* MEGA48_WDT_TEST.c
*
* Created: 2013-8-8 9:35:07
*Author: Administrator
*/
//-----------------------------------------------------------------
//名称: 看门狗应用
//-----------------------------------------------------------------
//说明: 本例系统启动时,LED1点亮,正常运行时,LED1熄灭,LED2开始闪烁
//      程序设置看门狗溢出时间为:1.9s,定时器必须在此时间内复位
//      看门狗(喂狗),否则会引起系统复位,LED1再次点亮后熄灭,LED2
//      重新开始持续闪烁.
//
//-----------------------------------------------------------------


#define F_CPU   4000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>                     //看门狗相关头文件
#include <util/delay.h>
#define INT8U   unsigned char
#define INT16Uunsigned int


//分别定义LED1开/关,LED2闪烁
#define LED1_ON()   (PORTC&=~_BV(PC0))
#define LED1_OFF()    (PORTC|=_BV(PC0))
#define LED2_BLINK()   (PORTC^=_BV(PC5))






//------------------------------------------------------------------
// 主程序
//------------------------------------------------------------------
int main()
{
      
      DDRC|=_BV(PC0);PORTC|=_BV(PC0);
      DDRC|=_BV(PC5);PORTC|=_BV(PC5);
      DDRD&=~_BV(PD3);PORTD|=_BV(PD3);
      DDRC|=_BV(PC2);PORTC|=_BV(PC2);
      DDRC|=_BV(PC3);PORTC|=_BV(PC3);
      DDRD&=~_BV(PD2);PORTD|=_BV(PD2);
      LED1_ON();
      _delay_ms(1600);
      
      MCUCR=0X00;                     //INT0中断低电平触发
      EIMSK=_BV(INT0);                //INT0使能
      
      TCCR1B=0x03;                  //T1预设分频:64
      TCNT1=65536-F_CPU/64.0*1.5;    //晶振1MHZ,1.5S定时初值
      TIMSK1=0x01;                  //允许T1定时器溢出中断
      wdt_enable(WDTO_2S);         //启动看门狗(溢出时间1.9S,约等于2.0S   


    LED1_OFF();                        //LED1熄灭
      
    sei();                           //开中断
      while(1)
      {


                LED2_BLINK();
         _delay_ms(200);


      }




}


//-----------------------------------------------------------------
// 定时器1中断程序负责喂狗(1.9s以内)
//-----------------------------------------------------------------
ISR (TIMER1_OVF_vect)
{
      TCNT1=65536-F_CPU/64.0*1.5;    //晶振1MHZ,1.5S定时初值
      wdt_reset();                   //看门狗复位,也就是喂狗


}


//-----------------------------------------------------------------
// INT0中断函数(按下K1时关闭定时器,停止喂狗)
//-----------------------------------------------------------------
ISR (INT0_vect)
{
      TIMSK1=0X00;


}

2408308628 发表于 2013-8-9 16:23:00

这个程序如果修改成MEGA8对应寄存器,用在MEGA8就能正常工作 ,真快要疯了想不明{:cry:}
页: [1]
查看完整版本: MEGA48使用看门狗碰到的问题