430两路捕获计时问题

2019-03-24 12:15发布

我用P1.2,1.3口捕获两个输入方波信号,均上升沿促发。两个捕获计数值差值得出时间差。但是计数差值很不稳定。。一段时间较为正常,一千多。一段时间突然保持在-几万。求助

#include  <msp430x14x.h>
long int cap1=0;
long int cap2=0;
long int cap1_array[16];
long int cap2_array[16];
unsigned char flag_cap1=0,flag_cap2=0;
int cap_diff=0;
long int captime_array[16];                // RAM array for differences
unsigned int capture_array[16];             // RAM array for captures
unsigned char index=0,index1=0,index2=0;
unsigned int time=0;
void InitSys()
{
  unsigned int iq0;   //使用XT2 振荡器
  BCSCTL1 &= ~XT2OFF; //打开XT2 振荡器
  do
  {
    IFG1 &= ~OFIFG;   //清除振荡器失效标志
    for(iq0=0xFF;iq0>0;iq0--);  //延时,等待XT2 起振
  }
  while ((IFG1 & OFIFG)!= 0);   //判断XT2 是否起振
  BCSCTL2=SELM_2+SELS+DIVS_3; //选择MCLK、SMCLK 为XT2/8
  
}
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  InitSys();
  
  P1DIR &= ~(BIT2+BIT3);                             // Set 1.2,3 input dir
  P1SEL |= (BIT2+BIT3);                             // Set P1.2,3 cap
  CCTL1 |= CM_1 + SCS + CCIS_0 + CAP + CCIE; // Rising edge + CCI0A (P1.1)
  CCTL2 |= CM_1 + SCS + CCIS_0 + CAP + CCIE;                                          // + //Capture Mode + Interrupt
  CCR0=10000;
  TACTL = TASSEL_2 + MC_1+TAIE;                  // SMCLK + Continuous Mode
  _EINT();//打开全局中断控制,若不需要打开,可以屏蔽本句
  while(1);
}

#pragma vector=TIMERA1_VECTOR
__interrupt void TimerA(void)
{
  switch (TAIV)
  {
    case 2:
      //捕获/比较1 中断
      cap1 =time*10000+TACCR1;
      cap1_array[index1++]=cap1;
             if (index1 == 16)
       {
         index1 = 0;
         //P1OUT ^= 0x01;                         // Toggle P1.0 using exclusive-OR
       }
      flag_cap1=1;
      break;
   
    case 4:
      //捕获/比较2 中断
      cap2 =time*10000+TACCR2;
            cap2_array[index2++]=cap2;
             if (index2 == 16)
       {
         index2 = 0;
         //P1OUT ^= 0x01;                         // Toggle P1.0 using exclusive-OR
       }
      flag_cap2=1;
      break;
   
    case 10:
      //TAIFG 定时器溢出中断
      time++;//tar增加到ccr0时产生一次中断
      break;
  }
  
    if((flag_cap1==1)&&(flag_cap2==1))
    {
       captime_array[index++] =cap2-cap1;            // record
       if (index == 16)
       {
         index = 0;
         //P1OUT ^= 0x01;                         // Toggle P1.0 using exclusive-OR
       }
       time=0;
       flag_cap1=0;
       flag_cap2=0;
    }
     
  
  
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
重邮king
2019-03-24 19:11
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章