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.

[参考译文] MSP430F4784:使用计时器的一秒延迟

Guru**** 668880 points
Other Parts Discussed in Thread: MSP430F4784
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1095837/msp430f4784-one-second-delay-using-timer

部件号:MSP430F4784

您好,

  我目前使用的是MSP430F4784控制器。

在这种情况下,我要设置N个延迟数(仅限最大10秒延迟)。

我能够实现我想要的延迟,但在程序运行时,执行过程在delayMS函数循环中保持特别,我在下面介绍了这一点。

但这种情况会突然发生,并会连续发生3到4次。这可能是什么原因造成的。

请帮我解决这个问题。

volatile unsigned int k=0;
volatile unsigned int h=0;
volatile unsigned int l=0;

void tim(void)
{
    TACTL |= MC_0;
     TACTL |= TACLR;
      TACTL = TASSEL_1 + ID_0;                  // SMCLK, continuous mode
      TA0CCTL0 = CCIE;
      TA0CCR0  = 32768;

}

void delayMS(int x)
{
    TACTL |= MC_2;
    k=0;
    h= x;
    while(!l);

    l=0;
    TACTL |= MC_0;
}


int main(void)
{
	WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timer
	P9DIR |= BIT5;

	tim();
	
	while(1)
	{
	    P9OUT ^= BIT5;
	    delayMS(2);
	  }
	 }
	 
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Timer_A0( void )
{
    TA0CCTL0 &= ~CCIFG;
                        
  k++;
    if(k == h)
    {
       k=0;
       l=1;
    }
}

	 
	 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好

    在使用计时器A0的延迟功能上,它与计时器时钟源和计时器设置相关。

    请测试并参考 MSP430F47x3,MSP430F47x4代码示例(修订版 (一)

    谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    延迟正常。无论我需要什么延迟,我都能得到。 但在运行时,在一些称为延迟的地方,它会在 dellayMS 函数中被调用while (!l);。 突然,我无法找出导致此问题的原因。 计时器的行为是否如此? 这在MSP430 MCU中很常见吗? 如何解决此问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    > TACTL |= MC_0;

    这不会停止计时器,因为MC_0==0。 请尝试:

    > TACTL &=~MC_3; //设置MC=0 (已停止)

    ----------------

    > TACTL |= MC_2;

    这将设置连续模式,并且不会清除计数器,因此CCR0中断将在每个完整周期(2秒)中仅触发一次,并且您的延迟通常会是两倍长。 请尝试:

    > TACTL |= MC_1 | TALCLR; //向上模式,清除计数器