【问题标题】:Reset timer on msp430在 msp430 上重置计时器
【发布时间】:2016-03-22 09:21:55
【问题描述】:

使用 CCS,嵌入式编程,MSP430F63736A

在我的应用程序中,我使用定时器 A 来切换 LED(开/关)不同的时间。

例如: LED 亮起 - 0.5 秒 LED 熄灭 - 3 秒

当定时器达到寄存器 TA1CCR0 中的值时,我需要重置定时器。这些时间(0.5 s 和 3 s)在寄存器 TA1CCR0 中。问题是,如果我将寄存器 TA1CCR0 的值从 0.5 秒更改为 3 秒,它将从 0.5 秒计数到 3 秒。我需要整整 3 秒,所以我需要一个重置计时器。

这就是我要切换 LED 的中断例程

    if (P4OUT == 0x00)
    {

        P4OUT ^= BIT6; // LED ON
        TA1CCR0 = (sekunda*t1);  //t1- 3 s.... pc 2s
    }

    else
    {

        P4OUT = 0x00;
        TA1CCR0 = (sekunda*t2);
    }
}

【问题讨论】:

  • 您使用的是哪种定时器模式,向上还是连续?为什么?为什么不对 CCR 使用设置/重置模式?
  • 您应该设置 Timer A Counter 寄存器 (TAR),而不是 Capture Compare 寄存器来更改计数器值。最好在这样做之前停止计时器。

标签: c timer reset msp430


【解决方案1】:

您使用的是哪种计数器模式?您需要通过写入TA1CTL 寄存器来设置模式。模式是:

#define MC_0                (0x0000)  /* Timer A mode control: 0 - Stop */
#define MC_1                (0x0010)  /* Timer A mode control: 1 - Up to CCR0 */
#define MC_2                (0x0020)  /* Timer A mode control: 2 - Continuous up */
#define MC_3                (0x0030)  /* Timer A mode control: 3 - Up/Down */

“连续”模式通常是最常用的一种。它一直计数直到定时器寄存器溢出,然后从零重新开始。如果您启用它,添加到 CCR 连续而不是将其设置为间隔值:

TA1CCR0 += (sekunda*t1);

您也可以使用“向上”模式。在这种情况下,定时器计数器应在达到 CCR 后自动复位为零。如果您在 ISR 中修改 CCR,但显然没有发生此复位,您可以通过减去最短周期的值来修改定时器计数器寄存器(TARTA1R)。不要只将定时器寄存器设置为零,因为这通常不是一个好的编码习惯:如果 ISR 调用偶尔延迟(例如,因为其他一些中断正在执行多个滴答声),它会为计时不准确累积打开大门。

【讨论】:

  • 使用UP模式,但是当我将寄存器TACCR0的值从低变高时,定时器不是从0开始计数,而是从之前的值开始计数
  • @kfx 我还不明白,但我将我的评论标记为删除。
【解决方案2】:

在你的 ISR 中添加一个偏移量到 TA1CCR0 并且不重置它:

假设您希望在第一次中断后延迟 1 秒,并且假设要产生 1 秒延迟,计时器必须计数到 50000。所以您需要在 ISR 中执行 TA1CCR0 +=50000。

在你的情况下:

if (P4OUT == 0x00)
{

    P4OUT ^= BIT6; // LED ON
    TA1CCR0    +=    (sekunda*t1);  //t1- 3 s.... pc 2s
}

else
{

    P4OUT = 0x00;
    TA1CCR0    +=    (sekunda*t2);
}

}

完整的例子请看

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多