This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

求助 关于msp430f149的定时器使用



用定时器a 连续计数模式,产生4个定时,这4个定时的触发条件不一样 方案一,初始化的时候就设置好中断使能和ccrx,开启总中断。 在中断函数中,ccrx+=各自的定时间隔,if触发条件满足,则cnt++,定时时间到,再置位一个变量。。。。 方案一,相当于所有的中断都会进,但是只有触发条件满足时,才会开始计时。。。 方案二,初始化的时候不允许中断使能,然后开总中断。 在主函数中,if触发条件满足,则设置对应的中断使能和ccrx。 在中断函数中,cnt++,计时时间到,置位变量,并关闭对应的使能。 方案二,相当于当使用定时器的时候,才开启定时器,计时时间到,则关闭定时器。。 求大神指点,我对方案一和二的理解对不对,这两个方案哪个更好一些,哪个更稳定可靠呢?或者有没有别的更好的方案。 谢谢!
  • 不是大神。觉得方案一更可靠

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

    #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;
    }
    }

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

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

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

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

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

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