小弟最近调试一个程序,其中用到了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时会出现问题~ |