大致是这样的,我用430的定时器捕获,来获取脉冲的宽度,在上下边沿捕获沿,加了捕获中断,运行一会儿,就会出现程序卡死的现象,这是怎么回事啊,详细描述一下:用430的定时器捕获功能来获取超声波模块的测距的时间差,就是在时间差脉冲的两个沿都捕获,两个捕获值相减,再乘以定时器时钟周期就得到了时间差。循环测试,大概是这样,开启定时器捕获中断,触发超声波模块测距,延时等待,再一次触发测距,进入低功耗模式0,定时器0捕获了4次之后,关捕获中断,退出低功耗模式0,继续后面的任务。这样会发生这样的现象,只要在超声波测距范围内快速变化距离,就是连续改变挡的距离,就出现程序卡死了,不知道为什么会出现这个情况。
此帖出自
小平头技术问答
这是循环体里面的语句,感觉问题出现在里面
while(1)
{
//_BIS_SR(LPM3_bits); // Enter LPM3
//CCR0 = 0; //(改之前的语句)
//CCTL0 |= CCIE; //开捕获中断(改之前的)
//CCTL0 &= ~CCIFG; //(改之前的)
TrigGetDistance(); //触发超声波模块第一次测距
delay_ms(100); //延时等待
TrigGetDistance(); //触发第二次测距
delay_ms(100); //延时等待(这是新加的一句,原先的是下面注释的那两句)
//_BIS_SR(LPM0_bits); //进入低功耗模式0
//CCTL0 &= ~CCIE;
GetCarSpeed();
...........
}
定时器0捕获比较0中断函数
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A0(void)
{
cap_array[index++] = CCR0;
if(index == 4)
{
index = 0;
//LPM0_EXIT; //退出低功耗模式0(改了后注释掉了)
//CCTL0 &= ~CCIE; //(改之前没注释掉这句,改了后注释掉了)
}
P1OUT ^= BIT0;
}
还是不明白为什么触发测距模块后,就进入低功耗模式和在中断里面退出,然后再关闭中断会出现程序卡死的现象,真心求教
一周热门 更多>