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

2019-03-24 12:30发布

大致是这样的,我用430的定时器捕获,来获取脉冲的宽度,在上下边沿捕获沿,加了捕获中断,运行一会儿,就会出现程序卡死的现象,这是怎么回事啊,详细描述一下:用430的定时器捕获功能来获取超声波模块的测距的时间差,就是在时间差脉冲的两个沿都捕获,两个捕获值相减,再乘以定时器时钟周期就得到了时间差。循环测试,大概是这样,开启定时器捕获中断,触发超声波模块测距,延时等待,再一次触发测距,进入低功耗模式0,定时器0捕获了4次之后,关捕获中断,退出低功耗模式0,继续后面的任务。这样会发生这样的现象,只要在超声波测距范围内快速变化距离,就是连续改变挡的距离,就出现程序卡死了,不知道为什么会出现这个情况。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
yunhaiking
1楼-- · 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;
}

还是不明白为什么触发测距模块后,就进入低功耗模式和在中断里面退出,然后再关闭中断会出现程序卡死的现象,真心求教
bobde163
2楼-- · 2019-03-25 02:41
< :TI_MSP430_内容页_SA7 --> 不清楚,会不会是中断发了冲突,我在用捕获功能的时候,也会卡死,就是在调试的时候,突然就提示错误,得重新连接电脑才行,后来查看了中断源的知识,把中断程序加上就没有问题了
yunhaiking
3楼-- · 2019-03-25 05:30
 精彩回答 2  元偷偷看……
bobde163
4楼-- · 2019-03-25 08:48
应该是和中断有很大的关系,我做调试的时候,比如用TACCTL1模块作捕获,根据中断源寄存器的值,明显显示的是捕获中断,可是在中断程序里面进行检测时,不加断点,在判断语句处就会判断错误,从而不能进入相应代码,如果在判断语句上下断点,判断就会正确,这会不会是一个BUG,还是什么其他原因
yunhaiking
5楼-- · 2019-03-25 11:47
在线调试的时候,有中断可能就会有问题,下到单片机里面直接运行试看看

一周热门 更多>

相关问题

    相关文章