[英]Reset timer on msp430
使用CCS,嵌入式编程,MSP430F63736A
在我的应用程序中,我使用计时器A来切换LED(开/关)不同的时间。
例如:Led为ON-0.5秒Led为OFF- 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);
}
}
您正在使用哪种计数器模式? 您需要通过写入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,然后显然不会发生此复位,则可以通过减去最短周期的值来修改定时器计数器寄存器( TAR
或TA1R
)。 不要只是将定时器寄存器设置为零,因为通常这不是一个好的编码习惯:万一ISR调用偶尔被延迟(例如,因为某些其他中断正在执行多个滴答),它会打开计时不准确累积的门。
在您的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);
}
}
有关完整示例,请参见
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.