[AVR单片机] ATMEGA48 用GCCAVR c语言编程,看门狗溢出时间不能改变,怎么回事,请高手请教?

[复制链接]
1404|3
 楼主| 99welcome 发表于 2016-4-12 09:51 | 显示全部楼层 |阅读模式
编译环境GCCAVR  ,C语言,看门狗时间是确定的,无论怎么设置   看门狗定时器预分频器 3, 2, 1, 与 0,都不能改变溢出时间。
WDTCSR|=(1<<WDCE)|(1<<WDE);
   WDTCSR|=(1<<WDE)|(1<<WDP3);
 楼主| 99welcome 发表于 2016-4-12 10:24 | 显示全部楼层
本帖最后由 99welcome 于 2016-4-13 09:53 编辑

可以进入WDT中断,在中断中改变I/O口电平,程序如下:
#pragma interrupt_handler WDT_isr:7  
void WDT_isr(void)  
{
          wdt_flag=0x01;
          PORTC|=SEN_V;
          DelayMs(10);
          PORTC&=~SEN_V;
}


void main(void)
{
   MCUCR = 0x00;   //JTD XX PUD XX IVSEL IVCE;PUD为0,禁止上拉电阻
   EICRA  = 0x00;  //XXXX ISC11 ISC10 ISC01 ISC00,低电平时产生中断
   EIMSK = 0x00;   //XXXXXX INT1 INT0
   PCICR =  0x00;  //XXXXX PCIE2 PCIE1 PCIE0
   PCMSK2 = 0x00;
   PCMSK1 = 0x00;
   PCMSK0 = 0x00;
   TIMSK0 =0x00;
   TIMSK1 =0x00;
   TIMSK2 =0x00;
   SEI();          //re-enable interrupts
   DDRC  = 0b0010111;  //
   PORTC = 0b0010001;   //
   ACSR=0X80;
  
   MCUSR = 0x00;
   /* 置位WDCE 与WDE */
   WDTCSR = (1<<WDCE) | (1<<WDE);
   /* 关闭WDT */
   WDTCSR = 0x00;
   //可以关闭WDT,下面开启WDT就不行,是固定的频率!!!!!
   WDTCSR=0X18;//(1<<WDCE)|(1<<WDE);/* 启动时序 */  WDIF WDIE WDP3 WDCE WDE WDP2 WDP1 WDP0
   WDTCSR=0X00;
   WDTCSR=0X71;//(BIT(WDCE))|(BIT(WDTIE))|(BIT(WDP3))|(BIT(WDP0));//8S,interreput中断模式,8秒溢出
  //上面程序可以开启WDT,但是频率不能改变,无论怎么改变WDP3 WDP2  WDP1 WDP0,频率输出固定
start:
     while(wdt_flag==0)
     {
       NOP();
     }

         if(wdt_flag==1)
         {
           wdt_flag=0;
           goto   start;
         }
}

 楼主| 99welcome 发表于 2016-4-12 10:29 | 显示全部楼层
熔丝位设置如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部