desperado1 发表于 2025-8-5 09:13:27

RTC失效或是误差特别大



要实现的功能:
   当设备开机后启动一次模块,在这个过程中会收到当前准确时间及后续要启动模块的两个时间;
       1.把接收到的当前准确时间更新到RTC也就是void ParseAndUpdateRTC(char *time_str)
       2.设置两个时间:比如一个是上午12点,一个是晚上21点,也就是void Parse_NNMO_Data(char *time_str) 接收到的时间,
       3.分钟中断也就是void RTC_Isr() interrupt 36 这里设置的是满足5分钟后也就是当B_1m = 1时执行一次Result_Check(),但每次分钟中断时把B_Sleep = 1也就是每分钟都做一次其它检测,其它         时间处于掉电模式。
问题:
       1.设置的两个时间有时会失效,不失效的话误差也会特别大,比如15分钟可能有5分钟左右或者4个小时左右大概会延后90分钟左右(这个值不确定有时更多有时更少),是设置错误还是程序问题            请大家指点!感谢!
       2.不加外部晶振的解决办法。
说明:
       1.设备用电池供电,电压在2.5-3.0V
       2.型号为STC8H8K64U,丝印的第三行最后两个字母是HD
       3.使用STC内部晶振,因为时间精度没有太大要求,12小时内误差10分钟到30分钟都可以接受,后续每次模块启动后都可以更新RTC的值为当前准确时间
       4.烧录程序时:输入用户程序运行时的IRC频率为11.0592,允许低压复位没有勾选
<blockquote>xdata int t1_hou, t1_min;   // 时间段1/* 中断函数 */void RTC_Isr() interrupt 36
{
       if(RTCIF & 0x10) //分钟中断
      {
          RTCIF &= ~0x10;
          rtc_1min_counter++; // 每分钟中断计数增加1
          if (rtc_1min_counter >= 5) // 满足5分钟
         {
            rtc_1min_counter = 0; // 清零重新计数/* 接收到的模块启动时间 */这里是两个时间段,比如12:00启动一次模块,21:00启动一次模块void Parse_NNMO_Data(char *time_str)
{
    // 检查数据是否以 "NNMO:" 开头
    if (strncmp(time_str, "NNMO:", 5) != 0)
      {
         return; // 不是时间数据,直接返回
       }
    // 跳过 "NNMO:" 解析时间数据
    if (sscanf(time_str + 5, "%d,%d,%d,%d", &mt1, &mt2, &mt3, &mt4) == 4)
      {
      // 数据有效性校验
       f (mt1 < 24 && mt2 < 60 && mt3 < 24 && mt4 < 60)


desperado1 发表于 2025-8-5 09:16:36

下面还有代码为何会显示不完整?

_奶咖君_ 发表于 2025-8-5 09:39:56

RTC的话 不使用外部32K晶振的话,15分钟差个5、6分钟很正常。

xpz127 发表于 2025-8-5 10:18:33

_奶咖君_ 发表于 2025-8-5 09:39
RTC的话 不使用外部32K晶振的话,15分钟差个5、6分钟很正常。

用人来计时,15分钟也不会差5,6分?

_奶咖君_ 发表于 2025-8-5 10:23:42

xpz127 发表于 2025-8-5 10:18
用人来计时,15分钟也不会差5,6分?

那你就帮它计时吧{:touxiao:}

乘风飞扬 发表于 2025-8-5 17:07:24

desperado1 发表于 2025-8-5 09:16
下面还有代码为何会显示不完整?
代码显示不全的话,编辑时最好在“高级”下勾选“纯文本”
然后在格式符外面插入代码,避免代码结构里面混入其它格式符,或者复制的代码内容里包含格式符导致显示不正常:



页: [1]
查看完整版本: RTC失效或是误差特别大