是这样的,我有几个输出为方波的传感器,现在需要使用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