打印

430G2553定时器溢出中断计数丢失,求高手指点!

[复制链接]
3189|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
逍遥李|  楼主 | 2013-11-14 16:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 逍遥李 于 2013-11-15 23:54 编辑

Avoid_run.rar (35.72 KB)



最近在做一个小车,做到超声波测距这块的时候总是出现定时器溢出中断丢失,因为要靠溢出中断次数进行计算距离,所以一旦丢失一次就会造成距离数据错误。部分程序如下:

#pragma vector =TIMER0_A0_VECTOR    /* TAR计数值由TACCR0-1跳到TACCR0时进入此中断,TACCR0设置值为100*/
__interrupt void period_in (){   

over_sign++;    //溢出标志位//
}

#pragma vector=TIMER0_A1_VECTOR
__interrupt void pwm_and_echo(){                            //TACCR2溢出中断和捕获发生中断


switch(TAIV){
case 2:
  if(echo_sign==0){                            //判断:如果第一次进入中断则说明是Echo上升沿信号,
   echo_t1 =TACCR1;                       //记录此时TAR计数值,存入echo_t1
   over_t0=over_sign;                       //溢出次数计入over_t0保存

   echo_sign=1;       //中断进入标志位置1
  }
  else if(echo_sign==1){                  ////第二次进入中断,即下降沿Echo信号
   echo_t2 =TACCR1;                      ////读取TAR值
   over_times=over_sign-over_t0;     //计算出溢出次数,保存到over_times中,用于距离计算
   echo_sign=0;                                    //恢复捕获信号辨识标志
   TACCTL1 &=~CCIE;                       //关闭捕获中断允许,屏蔽干扰,在超声波触发程序段中再打开

  }
  break;

case 4:         ;  break;
}

}

void for_a_distance(){
TACCTL1  |=CCIE;
Send_echo;                                             //此处宏定义 #define Send_echo P1OUT |=BIT7  //超声波发送
__delay_cycles(25);
Send_echo_end;                                   //               #define Send_echo_end  P1OUT &=~BIT7
over_sign =0;                                         //               每次进行测距之前清零溢出次数计数,防止此变量自身溢出
}

/*******系统初始化********/

void Init_sys(){
P2DIR |=BIT0;
TACTL = TASSEL_1 + MC_1+ID_0;                   //定时器时钟选择为ACLK, up mode
TACCR0 =100;         

TACCTL0 |=CCIE;                                                 //打开TAR溢出中断

/******超声波测距功能初始化******/
P1SEL |=BIT2;           //超声波测距捕获引脚P1.2第二功能打开
P1DIR |=BIT7;           //超声波信号发送引脚P1.7设置为输出
TACCTL1 |=CM_3+SCS+CAP+CCIE;       //上升、下降沿捕获;同步捕获;
_EINT();
}

定时器时钟选择的是ACLK,32.768Khz,

使用的是launchpad小板,通过在线监控发现溢出中断丢失基本都是发生在“TAR值为98、99即接近溢出值100时候丢失over_sign计数”,就是当TAR计数到接近100时候,此时恰好超声波脉冲也过来了,那么这次溢出将不能被记录,也就是over_sign++不执行,这是为什么呢?

哪位大侠看出来问题所在了,请指点,不胜感激!另外,我在另一个论坛也看到有人遇到这个问题,但是坛友后来说他解决了是时钟设置问题,我一直没明白,也没联系上这位坛友。

相关帖子

沙发
dirtwillfly| | 2013-11-14 20:51 | 只看该作者
不应该啊,msp430默认是关中断嵌套的,也就是__interrupt void period_in ()中断服务程序执行时,是不会相应其他中断的
:funk:

使用特权

评论回复
板凳
dirtwillfly| | 2013-11-14 20:55 | 只看该作者
能把你的完整程序传上来看看吗?

使用特权

评论回复
地板
firstblood| | 2013-11-14 23:50 | 只看该作者
我先看看具体的问题的吧,430单片机的我也用的多的,还没遇到这样的问题的

使用特权

评论回复
5
firstblood| | 2013-11-14 23:51 | 只看该作者
我先看的吧,说不定后边的自己也会遇到这样的

使用特权

评论回复
6
逍遥李|  楼主 | 2013-11-15 23:07 | 只看该作者
dirtwillfly 发表于 2013-11-14 20:51
不应该啊,msp430默认是关中断嵌套的,也就是__interrupt void period_in ()中断服务程序执行时,是不会相 ...

哦,这样是不是说如果有中断正在执行的时候,其他中断就不再响应?就会丢失?

使用特权

评论回复
7
逍遥李|  楼主 | 2013-11-15 23:09 | 只看该作者
dirtwillfly 发表于 2013-11-14 20:51
不应该啊,msp430默认是关中断嵌套的,也就是__interrupt void period_in ()中断服务程序执行时,是不会相 ...

哦,这样是不是说如果有中断正在执行的时候,其他中断就不再响应?就会丢失?

使用特权

评论回复
8
逍遥李|  楼主 | 2013-11-15 23:57 | 只看该作者
dirtwillfly 发表于 2013-11-14 20:55
能把你的完整程序传上来看看吗?

你好,附件已添加,程序写的比较乱,非常感谢你的帮助。现在这个程序的状态是:近距离检测时候,容易丢失定时器溢出中断,从而导致溢出次数本应该为1的却读出的是0,从而在计算距离时候由于数据溢出导致距离很大。

使用特权

评论回复
9
逍遥李|  楼主 | 2013-11-15 23:57 | 只看该作者
firstblood 发表于 2013-11-14 23:50
我先看看具体的问题的吧,430单片机的我也用的多的,还没遇到这样的问题的 ...

谢谢你!非常感谢!

使用特权

评论回复
10
dirtwillfly| | 2013-11-16 09:20 | 只看该作者
逍遥李 发表于 2013-11-15 23:09
哦,这样是不是说如果有中断正在执行的时候,其他中断就不再响应?就会丢失? ...

你先看看msp430中断机制:https://bbs.21ic.com/icview-286842-1-1.html
你说的这种情况,有可能是TIMER0_A1中断服务程序执行时间比较长。
当TIMER0_A1中断服务程序正在执行时,如果来了一次TIMER0_A0中断,则在TIMER0_A1中断服务程序执行完毕后,会响应TIMER0_A0中断。如果在TIMER0_A1中断服务程序执行过程,有两次或者更多次溢出,就会丢失溢出信号。

使用特权

评论回复
11
1988020566| | 2013-11-16 14:25 | 只看该作者
溢出了就说明超出测距范围了。

使用特权

评论回复
12
逍遥李|  楼主 | 2013-11-19 12:29 | 只看该作者
1988020566 发表于 2013-11-16 14:25
溢出了就说明超出测距范围了。

不是说定时器溢出,定时器溢出可以进行溢出计数,我是说这溢出计数丢失了,是在10cm左右测距的时候容易定时器溢出,而溢出计数没有加1,也就是丢失了

使用特权

评论回复
13
1988020566| | 2013-12-1 13:10 | 只看该作者
逍遥李 发表于 2013-11-19 12:29
不是说定时器溢出,定时器溢出可以进行溢出计数,我是说这溢出计数丢失了,是在10cm左右测距的时候容易定 ...

你使用while等待的么?

使用特权

评论回复
14
逍遥李|  楼主 | 2013-12-11 15:25 | 只看该作者
1988020566 发表于 2013-12-1 13:10
你使用while等待的么?

不是啊,使用的定时器A啊,捕获脉宽计时的

使用特权

评论回复
15
zeluo| | 2013-12-11 17:38 | 只看该作者
帮你顶一个   这一块 的技术不是很懂   顶一个

使用特权

评论回复
16
liuyang8023| | 2013-12-11 17:52 | 只看该作者
430G2553  用IAR的哪个版本编译  谢谢

使用特权

评论回复
17
greenwei| | 2013-12-11 18:51 | 只看该作者
建议在IDE里单步一下,看看是不是在那个地方清零了!

使用特权

评论回复
18
1988020566| | 2013-12-12 15:42 | 只看该作者
1988020566 发表于 2013-12-1 13:10
你使用while等待的么?

超声波的触发木有问题吧?

使用特权

评论回复
19
逍遥李|  楼主 | 2013-12-13 19:34 | 只看该作者
zeluo 发表于 2013-12-11 17:38
帮你顶一个   这一块 的技术不是很懂   顶一个

谢谢非常感谢!

使用特权

评论回复
20
逍遥李|  楼主 | 2013-12-13 19:36 | 只看该作者
liuyang8023 发表于 2013-12-11 17:52
430G2553  用IAR的哪个版本编译  谢谢

我没有用IAR,用的是CCS,Studio v5版本

使用特权

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

本版积分规则

57

主题

1315

帖子

32

粉丝