首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实时时钟,MSP430

实时时钟,MSP430
EN

Stack Overflow用户
提问于 2011-08-30 08:17:43
回答 1查看 6.5K关注 0票数 3

我需要每15分钟设置一个闹钟(00:15,00:30,00:45,01:00,...)使用实时时钟进行一些处理,然后设置新的警报值。好了,我有一个写的代码,它可以很好地运行时钟。但不会出现周期警报。

如果有关于代码的反馈,那就太好了

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-30 17:45:16

至少需要在RTCAMIN寄存器中设置AE位,以便在分钟匹配时报警:

代码语言:javascript
复制
RTCAMIN = AE | (timer & 0x7F);

它看起来也像是您选择了在每一分钟的变化("RTCCTL01 = RTCMODE + RTCTEVIE + RTCTEV_0;")发生的事件中断,这与您想要使用的用户可编程报警不同。您需要设置报警中断位:

代码语言:javascript
复制
RTCCTL01 = RTCMODE + RTCTAIE;

您增加计时器值的方法不正确,因为它每次都会增加一倍,而不是增加15分钟。您应该在ISR中使用以下内容:

代码语言:javascript
复制
timer += 15;

如果此周期需要更改,则需要两个变量,一个用于存储新的计时器值,另一个用于存储报警的周期。你可以使用寄存器来存储定时器的值,所以它应该是这样的(假设“定时器”是用户想要的报警周期):

代码语言:javascript
复制
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,并且需要减小它,而不是将其设置为一个特定值,以保持正确的时间。为了安全起见,您应该这样做:

代码语言:javascript
复制
if (timer >= 60) timer -= 60;

最后,数据手册指出,修改报警值时应禁用报警中断标志。记住在您的ISR中执行此操作。

其他需要检查的内容包括:

  • 确保您不会进入从updating
  • you've停止RTC的低功耗模式使用组合寄存器RTCCTL01的正确定义,并且不会将它们与用于单个寄存器(RTCCTL0)

的定义混淆

我不知道中断是否是正确的中断(看起来应该是正确的),因为您仍然没有告诉我们零件号是什么。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7237467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档