TI中文支持网
TI专业的中文技术问题搜集分享网站

定时器A捕获程序移植到定时器B后表现异常

是这样的,我有几个输出为方波的传感器,现在需要使用MSP430F149来解析这个方波。

由于传感器数目多了,所以为了避免麻烦只能使用定时器B的捕获组单元。

但奇怪的是,同一套代码使用定时器A能够很好地解析方波(程序是测占空比的)

但是一旦运用到定时器B上去,就发生了异常,也不知道是不是和锁存器有关系

以下是我的代码:

#include  <msp430x14x.h>

unsigned int tem=0;
unsigned long start=0,temp=0,end=0,overflow=0,hold,length;
double per;

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  P2DIR = 0XFF;                            // 流水灯是P2组IO口
  P2OUT = 0XFF;
  TBCTL = TBSSEL_2 + MC_2 + TBIE;           // SMCLK, contmode, interrupt
  TBCCTL1=CM_1+SCS+CAP+CCIE+CCIS_0;
  P4DIR&=~BIT1;                        //P4.1为输入
  P4SEL|=BIT1;
  /*
  TACTL = TASSEL_2 + MC_2 + TAIE;           // SMCLK, contmode, interrupt
  TACCTL1=CM_1+SCS+CAP+CCIE+CCIS_0;
  P1DIR&=~BIT2;                        //P1.2为输入
  P1SEL|=BIT2;
  */
  while(1)
  {
    length=overflow*65535+temp-start;
    per=hold/1.0/length;
    _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt
  }
}

// Timer_B7 Interrupt Vector (TBIV) handler
#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B(void)
{
switch( TBIV )//(TBIV)
{
   case  2: 

         if(TBCCTL1&CM_1)                       //上升沿
         { 
           P2OUT |= BIT1;
           tem++;
           if(tem==1)                             //一个周期的开始
           {
             TBCCTL1=(TBCCTL1&(~CM_1))|CM_2;       //更变设置为下降沿触发
             start=TBCCR1;                     //记录初始时间(捕捉产生start)
             overflow=0;                       //溢出计数变量复位
           } 
           else if(tem==2)                    //一个完整周期的结束+另一个新周期的开始
           {
             P2OUT ^= BIT2;
             tem=0;
             temp=TBCCR1;                      //把捕获/比较寄存器里的值记录下来
             _DINT();                          //关中断
             LPM0_EXIT;                         //从低功耗0模式退出
           }
         }
          else if(TBCCTL1&CM_2)                  //下降沿
         {  
            P2OUT &= ~BIT1;
            TBCCTL1=(TBCCTL1&(~CM_2))|CM_1;        //更变设置为上升沿触发           
            end=TBCCR1;                        //用start,end,overflow计算脉冲宽度
            hold=overflow*65535+end-start;         
         }

     /*
         if(TACCTL1&CM_1)                       //上升沿
         { 
           P2OUT |= BIT1;
           tem++;
           if(tem==1)
           {
             TACCTL1=(TACCTL1&(~CM_1))|CM_2;       //更变设置为下降沿触发
             start=TACCR1;                     //记录初始时间(捕捉产生start)
             overflow=0;                       //溢出计数变量复位
           } 
           else if(tem==2)
           {
             P2OUT ^= BIT2;
             tem=0;
             temp=TACCR1;                      //把捕获/比较寄存器里的值记录下来
             _DINT();                          //关中断
             LPM0_EXIT;                         //从低功耗0模式退出
           }
         }
          else if(TACCTL1&CM_2)                  //下降沿
         {  
            P2OUT &= ~BIT1;
            TACCTL1=(TACCTL1&(~CM_2))|CM_1;        //更变设置为上升沿触发           
            end=TACCR1;                        //用start,end,overflow计算脉冲宽度
            hold=overflow*65535+end-start;         
         }
     */
         break;
   case  4: break;                         
   case 14: overflow++;
            P2OUT ^= BIT0;                  // overflow
            break;
}
}

我在三个位置设置了LED灯来观察程序运行的状态。

定时器A和B的溢出中断(对应流水灯P2.0)都是正常的,定时器A的周期开始标志灯P2.1和完整周期结束灯P2.2表现正常数据正确;

但是定时器B的周期开始标志灯和完整周期结束灯抖得像穿了滑板鞋一样,当然数据也是不对的,请问这是为啥啊?

TIANHAO HE:

其中定时器A的程序我以注释的方式体现了。

在移植程序的时候,定时器各个寄存器名称、中断向量头名称、中断向量表名称,中断向量表中的序号我都进行了调整

Jacky Xu:

我记得在另一个帖子回复了,第一要知道你的波形抖成什么样

第二timerA和timerB是不完全一样的,在使用某些功能时不能直接把timer A套用到timer B

赞(0)
未经允许不得转载:TI中文支持网 » 定时器A捕获程序移植到定时器B后表现异常
分享到: 更多 (0)