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,估计这段程序忽视了某些东西,如果有高人写过类似程序,跪求啊!!!
展开
 我来答
bettergreen
推荐于2016-06-09 · TA获得超过1913个赞
知道小有建树答主
回答量:321
采纳率:0%
帮助的人:510万
展开全部
说实在的,没有太明确你到底是什么目的,但是就你这个函数而言你的TACCR1<TACCR0,所以等计数器达到TACCR1时,TACCR1 CCIFG被置位,但是由于没有相应的中断允许就不会进入到TIMERA1中断,由于也没有进行软件清零,所以该标志一直是置位状态。直到计数到TACCR0,这时进入中断 TIMERA0,打开了TACCR1的中断允许,这时由于TACCR1 CCIFG处于置位状态,加上TIMERA1中断优先级低于中断 TIMERA0,所以在中断 TIMERA0结束后立刻进入到TIMERA1中断,这段时间很短,可以忽略不计。重新计数后就是一直先进入TIMERA1中断,然后关闭了中断 TIMERA0,也就不能进入中断 TIMERA0,也就没有了高电平,所以看到的效果就是一直是低电平。(有一点你可能不知道就是如果不进入中断,中断标志是不自动清零的)。
我也不知道你要产生什么样的波,真是不好说啊,如果只是产生一个时间脉冲,那么可以在打开TACCTL1中断前先将TACCR1 CCIFG清零。应该就可以出现一个0.5ms 的高电平脉冲。
纯理论分析,不知道正确与否,但你可以参考看看。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
菜鸟小队
2011-04-04
知道答主
回答量:10
采纳率:0%
帮助的人:16.1万
展开全部
楼主好像少写了开中断允许 _EINT(),加到主函数中试一下吧。
追问
_BIS_SR(GIE)就是开总中断,
我现在发现可能是在中断中又开了中断的问题,我把 TACCTL1 |=CCIE; 中断使能放在主函数中就是可以了,但是我又必须要把tacctl1的中断在tacctl0中打开,这如何是好
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式