打印
[AVR单片机]

诡异!!请教一个ATmega128定时器2中断与while程序调试的问题

[复制链接]
6035|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
异客|  楼主 | 2010-8-20 23:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟最近调试一个程序,其中用到了T/C2定时中断程序:
T/C2四毫秒初始化
void Timer2_4MS()
{
    TCCR2 = 0x00;
    TCNT2 = 0x0000;
    OCR2 = 249; //focn=16M/2*N*(1+OCR2)
    TCCR2 = 0x0C;//CTC模式,256分频,OC2无输出
    TIMSK_OCIE2 = 1;//OCIE2:T/C2 输出比较匹配中断使能
}
中断函数
#pragma vector = TIMER2_COMP_vect
__interrupt  void timer2_comp(void)
{  
  TIMSK_OCIE2 = 0;
        giPressTimeCount++;
  TIMSK_OCIE2 = 1;
}
然后主程序里面设置while等待语句:
while( (!gbStopPress_Flag)&&(giPressTimeCount < 300) );
gbStopPress_Flag为一个串口标志位,值为零。
程序本意为gbStopPress_Flag置位或者giPressTimeCount计数超过300的时候即可跳出while。
调试过程中发现,gbStopPress_Flag没有置位的情况下,giPressTimeCount在256的时候就跳出了while循环。
小弟百思不得其解,在中断里设置了断点调试,有时候giPressTimeCount可以到达300,有时候giPressTimeCount=256时就跳出循环。
想不明白为什么256的时候会跳出while循环,希望论坛的各位前辈能够指点迷津,多谢!!!

后续:后来将300改为250后,目前测试至今未出现这样的情况,莫非T/C2在255的时候或者堆栈之类的会发生意想不到的情况?还是由于while()语句的条件判识导致的?继续迷茫中
再补充:
giPressTimeCount为int型测试,发现256的时候会出现问题
             giPressTimeCount为float型测试,发现128时会出现问题~

相关帖子

沙发
xuyiyi| | 2010-8-21 08:13 | 只看该作者
问题很简单,脑袋一拍,就知结果。

你的问题都出在BYTE进位上,int型测试,BYTE进位为256,float型测试,扣除一位符号位,BYTE进位为128,寻根刨底,问题出在在执行int型或float型测试时,响应中断,返回时现场变量已改变(即判断条件改变)所至。

解决方法很简单:
在执行int型或float型测试时,关闭中断!测试完成后再开中断!

使用特权

评论回复
板凳
异客|  楼主 | 2010-8-21 09:32 | 只看该作者
多谢LS指点,可是我中断程序里面:
#pragma vector = TIMER2_COMP_vect
__interrupt  void timer2_comp(void)
{  
  TIMSK_OCIE2 = 0;
        giPressTimeCount++;
  TIMSK_OCIE2 = 1;
}

已经将中断关闭了啊,而且一进中断全局中断硬件会自动清零。还是不太明白,望指点一二。
编译环境是IAR。

使用特权

评论回复
地板
xuyiyi| | 2010-8-21 09:42 | 只看该作者
中断程序里面关中断?画蛇添足,多此一举。

俺已说过,要在执行int型或float型测试时,关中断!

加在这里面:
while( (!gbStopPress_Flag)&&(giPressTimeCount < 300) );

使用特权

评论回复
5
xuyiyi| | 2010-8-21 09:53 | 只看该作者
方法1: 关中断。
do{  int  a;
        TIMSK_OCIE2 = 0;
        a=giPressTimeCount ;
        TIMSK_OCIE2 = 1;
  }
while( (!gbStopPress_Flag)&&(a< 300) );

方法2: 不关中断。
do{  int  a,b;
        a=giPressTimeCount ;
        b=giPressTimeCount ;
  }
while( (!gbStopPress_Flag)&&((a!=b)||(a< 300)) );

使用特权

评论回复
6
xuyiyi| | 2010-8-21 09:55 | 只看该作者
此现象不诡异!!!

而是一点基本功问题!!!

使用特权

评论回复
7
nicole.088| | 2013-7-4 16:22 | 只看该作者
程序本意为gbStopPress_Flag置位或者giPressTimeCount计数超过300的时候即可跳出while.  "或者"   为什么用到 &&。 是并且吧???  

使用特权

评论回复
8
lion1899| | 2013-7-18 10:31 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

22

帖子

0

粉丝