MSP430 定时器A中断问题,我想用TACCR0和TACCR1中断来实现产生一个时间脉冲,编译能通过,但是无法产生波
代码如下intmain(void){WDTCTL=WDTPW+WDTHOLD;//关看门狗BCSCTL1=CALBC1_12MHZ;//设定DCO为12MHZDCOCTL...
代码如下
int main( void )
{
WDTCTL=WDTPW+WDTHOLD; //关看门狗
BCSCTL1 =CALBC1_12MHZ; //设定DCO为12MHZ
DCOCTL =CALDCO_12MHZ;
BCSCTL2 |= DIVS_2; //SMLK 4分频 频率为3MHz
P1DIR |=BIT0; //P1.0输出使能
TACTL=TASSEL_2+TACLR; //定时器A时钟源为SMCLK,并清TAR
TACCTL0 |=CCIE; //TACCR0中断使能
TACCR0 =60000; //计数值为60000个SMCLK周期 即20ms的PPM总信号周期
TACCR1=1500;
TACTL |=MC_1; //动定时器A为单增模式
_BIS_SR(GIE+CPUOFF);
return 0;
}
#pragma vector = TIMERA0_VECTOR //TACCR0中断服务
__interrupt void ta0_isr(void)
{
TACCTL1 |=CCIE; //TACCR1中断使能
//TACTL |=TACLR; //TAR清零
//TACCR1=TAR+1500; //间隔高电平信号0.5ms
P1OUT |=BIT0; //拉高电平
}
#pragma vector = TIMERA1_VECTOR //TACCR1中断服务
__interrupt void ta1_isr(void)
{
P1OUT &=~BIT0; //拉低电平
TACCTL1 &=~CCIE; //TACCR1中断关闭
}
不知道有没有会的高人指点一下
另外,说明一下,我是要用msp430实现产生六通道PPM信号,这只是第一步工作,由于初雪msp430,估计这段程序忽视了某些东西,如果有高人写过类似程序,跪求啊!!! 展开
int main( void )
{
WDTCTL=WDTPW+WDTHOLD; //关看门狗
BCSCTL1 =CALBC1_12MHZ; //设定DCO为12MHZ
DCOCTL =CALDCO_12MHZ;
BCSCTL2 |= DIVS_2; //SMLK 4分频 频率为3MHz
P1DIR |=BIT0; //P1.0输出使能
TACTL=TASSEL_2+TACLR; //定时器A时钟源为SMCLK,并清TAR
TACCTL0 |=CCIE; //TACCR0中断使能
TACCR0 =60000; //计数值为60000个SMCLK周期 即20ms的PPM总信号周期
TACCR1=1500;
TACTL |=MC_1; //动定时器A为单增模式
_BIS_SR(GIE+CPUOFF);
return 0;
}
#pragma vector = TIMERA0_VECTOR //TACCR0中断服务
__interrupt void ta0_isr(void)
{
TACCTL1 |=CCIE; //TACCR1中断使能
//TACTL |=TACLR; //TAR清零
//TACCR1=TAR+1500; //间隔高电平信号0.5ms
P1OUT |=BIT0; //拉高电平
}
#pragma vector = TIMERA1_VECTOR //TACCR1中断服务
__interrupt void ta1_isr(void)
{
P1OUT &=~BIT0; //拉低电平
TACCTL1 &=~CCIE; //TACCR1中断关闭
}
不知道有没有会的高人指点一下
另外,说明一下,我是要用msp430实现产生六通道PPM信号,这只是第一步工作,由于初雪msp430,估计这段程序忽视了某些东西,如果有高人写过类似程序,跪求啊!!! 展开
2个回答
展开全部
说实在的,没有太明确你到底是什么目的,但是就你这个函数而言你的TACCR1<TACCR0,所以等计数器达到TACCR1时,TACCR1 CCIFG被置位,但是由于没有相应的中断允许就不会进入到TIMERA1中断,由于也没有进行软件清零,所以该标志一直是置位状态。直到计数到TACCR0,这时进入中断 TIMERA0,打开了TACCR1的中断允许,这时由于TACCR1 CCIFG处于置位状态,加上TIMERA1中断优先级低于中断 TIMERA0,所以在中断 TIMERA0结束后立刻进入到TIMERA1中断,这段时间很短,可以忽略不计。重新计数后就是一直先进入TIMERA1中断,然后关闭了中断 TIMERA0,也就不能进入中断 TIMERA0,也就没有了高电平,所以看到的效果就是一直是低电平。(有一点你可能不知道就是如果不进入中断,中断标志是不自动清零的)。
我也不知道你要产生什么样的波,真是不好说啊,如果只是产生一个时间脉冲,那么可以在打开TACCTL1中断前先将TACCR1 CCIFG清零。应该就可以出现一个0.5ms 的高电平脉冲。
纯理论分析,不知道正确与否,但你可以参考看看。
我也不知道你要产生什么样的波,真是不好说啊,如果只是产生一个时间脉冲,那么可以在打开TACCTL1中断前先将TACCR1 CCIFG清零。应该就可以出现一个0.5ms 的高电平脉冲。
纯理论分析,不知道正确与否,但你可以参考看看。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼主好像少写了开中断允许 _EINT(),加到主函数中试一下吧。
追问
_BIS_SR(GIE)就是开总中断,
我现在发现可能是在中断中又开了中断的问题,我把 TACCTL1 |=CCIE; 中断使能放在主函数中就是可以了,但是我又必须要把tacctl1的中断在tacctl0中打开,这如何是好
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询