我需要每15分钟设置一个闹钟(00:15,00:30,00:45,01:00,...)使用实时时钟进行一些处理,然后设置新的警报值。好了,我有一个写的代码,它可以很好地运行时钟。但不会出现周期警报。
如果有关于代码的反馈,那就太好了
void rtc_init(void)
{
RTCCTL01 = RTCMODE + RTCTEVIE + RTCTEV_0;
RTCCTL01 |= RTCHOLD;
RTCSEC = 0x00;
RTCMIN = 0x28;
RTCHOUR = 0x12;
RTCDOW = 0x05;
RTCDAY = 0x1A;
RTCMON = 0x08;
RTCYEAR = 0x07DB;
RTCAMIN = timer;
RTCCTL01 &= ~RTCHOLD;
__enable_interrupt();
}
#pragma vector=RTC_VECTOR
__interrupt void handle_rtc_interrupt(void)
{
switch(__even_in_range(RTCIV,8))
{
case 6:
get_fix();
timer += timer;
if (timer == 60) timer = 1;
RTCAMIN = timer;
RTCCTL1 &= ~RTCHOLD;
break;
}//switch
}//ISR发布于 2011-08-30 17:45:16
至少需要在RTCAMIN寄存器中设置AE位,以便在分钟匹配时报警:
RTCAMIN = AE | (timer & 0x7F);它看起来也像是您选择了在每一分钟的变化("RTCCTL01 = RTCMODE + RTCTEVIE + RTCTEV_0;")发生的事件中断,这与您想要使用的用户可编程报警不同。您需要设置报警中断位:
RTCCTL01 = RTCMODE + RTCTAIE;您增加计时器值的方法不正确,因为它每次都会增加一倍,而不是增加15分钟。您应该在ISR中使用以下内容:
timer += 15;如果此周期需要更改,则需要两个变量,一个用于存储新的计时器值,另一个用于存储报警的周期。你可以使用寄存器来存储定时器的值,所以它应该是这样的(假设“定时器”是用户想要的报警周期):
next_timer = RTCAMIN & 0x7F;
next_timer += timer;
if (next_timer) >= 60
{
next_timer -= 60;
}
RTCAMIN = AE | (next_timer & 0x7F);当计时器到达60时,您应该将其重新设置为0,而不是1,否则您的警报将在xx:00:xx xx:15:xx xx:30:xx xx:45:xx xx:01:xx xx:16:xx等时间响起。
您不应该在您的计时器变量中精确比较60分钟。这并不重要,但是使用上面的其他两个but,您永远不会在第二次迭代中得到确切的60。此外,如果60不能被警报周期精确整除,那么您将超过60,并且需要减小它,而不是将其设置为一个特定值,以保持正确的时间。为了安全起见,您应该这样做:
if (timer >= 60) timer -= 60;最后,数据手册指出,修改报警值时应禁用报警中断标志。记住在您的ISR中执行此操作。
其他需要检查的内容包括:
的定义混淆
我不知道中断是否是正确的中断(看起来应该是正确的),因为您仍然没有告诉我们零件号是什么。
https://stackoverflow.com/questions/7237467
复制相似问题