有关430的定时器捕获,出现程序卡死

2019-03-24 12:30发布

大致是这样的,我用430的定时器捕获,来获取脉冲的宽度,在上下边沿捕获沿,加了捕获中断,运行一会儿,就会出现程序卡死的现象,这是怎么回事啊,详细描述一下:用430的定时器捕获功能来获取超声波模块的测距的时间差,就是在时间差脉冲的两个沿都捕获,两个捕获值相减,再乘以定时器时钟周期就得到了时间差。循环测试,大概是这样,开启定时器捕获中断,触发超声波模块测距,延时等待,再一次触发测距,进入低功耗模式0,定时器0捕获了4次之后,关捕获中断,退出低功耗模式0,继续后面的任务。这样会发生这样的现象,只要在超声波测距范围内快速变化距离,就是连续改变挡的距离,就出现程序卡死了,不知道为什么会出现这个情况。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
yunhaiking
2019-03-24 21:25
< 好像问题解决了,还是贴一下程序,好看些,写的文字太多了,看起烦
这是循环体里面的语句,感觉问题出现在里面
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;
}

还是不明白为什么触发测距模块后,就进入低功耗模式和在中断里面退出,然后再关闭中断会出现程序卡死的现象,真心求教

一周热门 更多>

相关问题

    相关文章