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

求助 关于msp430f149的定时器使用

用定时器a 连续计数模式,产生4个定时,这4个定时的触发条件不一样
方案一,初始化的时候就设置好中断使能和ccrx,开启总中断。
在中断函数中,ccrx+=各自的定时间隔,if触发条件满足,则cnt++,定时时间到,再置位一个变量。。。。
方案一,相当于所有的中断都会进,但是只有触发条件满足时,才会开始计时。。。

方案二,初始化的时候不允许中断使能,然后开总中断。
在主函数中,if触发条件满足,则设置对应的中断使能和ccrx。
在中断函数中,cnt++,计时时间到,置位变量,并关闭对应的使能。
方案二,相当于当使用定时器的时候,才开启定时器,计时时间到,则关闭定时器。。

求大神指点,我对方案一和二的理解对不对,这两个方案哪个更好一些,哪个更稳定可靠呢?或者有没有别的更好的方案。
谢谢!

灰小子:

不是大神。觉得方案一更可靠

Maka Luo:

你可以参考此例程方式来实现,应该就是你说的方案一

#include <msp430.h>

int main(void){ WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1SEL |= 0x0E; // P1.1 – P1.4 option select P1DIR |= 0x0F; // P1.0 – P1.4 outputs CCTL0 = OUTMOD_4 + CCIE; // CCR0 toggle, interrupt enabled CCTL1 = OUTMOD_4 + CCIE; // CCR1 toggle, interrupt enabled CCTL2 = OUTMOD_4 + CCIE; // CCR2 toggle, interrupt enabled TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, Contmode, int enabled

__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt}

// Timer A0 interrupt service routine#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A0 (void)#elif defined(__GNUC__)void __attribute__ ((interrupt(TIMERA0_VECTOR))) Timer_A0 (void)#else#error Compiler not supported!#endif{ CCR0 += 200; // Add Offset to CCR0}

// Timer_A3 Interrupt Vector (TAIV) handler#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)#pragma vector=TIMERA1_VECTOR__interrupt void Timer_A1(void)#elif defined(__GNUC__)void __attribute__ ((interrupt(TIMERA1_VECTOR))) Timer_A1 (void)#else#error Compiler not supported!#endif{ switch( TAIV ) { case 2: CCR1 += 1000; // Add Offset to CCR1 break; case 4: CCR2 += 10000; // Add Offset to CCR2 break; case 10: P1OUT ^= 0x01; // Timer_A3 overflow break; }}

qian shi:

回复 灰小子:

谢谢!

qian shi:

回复 Maka Luo:

其实,方案一,就是跟定时产生4路pwm波类似,只是不是一上电就输出,而是等待特定条件满足再开始输出。。。我是个小白菜,你这段程序中断部分看不懂。。。。我想问这俩方案相比,你觉得哪个更好一些呢?

Terry Deng:

回复 qian shi:

两种方式实现的功能是一样的,都是触发条件到了以后,定时一段时间然后做事情。

如果你对触发条件的实时性要求高,那么建议采用第一种方式,并且把TIMER中断优先级调高,保证任何情况下触发条件能够在TIMER中断得到响应。

否则个人觉得第二种方式好一些,因为触发条件没有满足的时候,不会不停的timer中断打断其它程序的连续性,增加效率。

qian shi:

回复 Terry Deng:

主要是担心方案二计时会有误差,因为开启第二个定时的时候,因为第一个定时器的计时,导致计数器的值不一定是零,那么第二个定时计数到ccrx 就会有误差。。。这么想对么?

Maka Luo:

回复 qian shi:

方案一 在中断中只是改变每次比较值,其计数值是连续工作的,不会存在误差。当然这个需要看你的应用具体是什么,定时需求具体是什么?

赞(0)
未经允许不得转载:TI中文支持网 » 求助 关于msp430f149的定时器使用
分享到: 更多 (0)