This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

430G2553定时器溢出中断计数丢失



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

#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++不执行,这是为什么呢?

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