【问题标题】:Time/date implementation on a MCU [closed]MCU上的时间/日期实现[关闭]
【发布时间】:2016-03-31 11:58:23
【问题描述】:

我正在开发 MCU,我的目标是在 MCU 上实现时间/日期。

我使用一个每秒计时的计时器并将其存储在uint32_t count 上,它的大小足以存储 136 年。我想以 2000 作为参考,最大值应为 2099。

这是我的数据结构:

typedef struct
{
uint8_t sec;        // Seconds. [0-60] (1 leap second) 
uint8_t min;        // Minutes. [0-59] 
uint8_t hour;       // Hours.   [0-23] 
uint8_t day;        // Day.     [1-31] 
uint8_t month;      // Month.   [0-11] 
uint8_t year;       // Year - from 2000.  [00-99] 
} osal_time_t;

使用最少的资源正确地将秒 (uint32_t count) 转换为分钟/小时/天/月/年的最佳方法是什么?

时间、小时和年份似乎很简单,但一天变得棘手,因为 28-29-30-31 天,而 2 月是每 4 年 29 天。

我看到了 linux 源代码实现,但我认为它是一个操作系统,而不是一个不起眼的 MCU。

谁能提示我应该在 MCU 中使用哪种算法,以便它需要最少。资源?

举个例子,这个http://www.mathcats.com/explore/elapsedtime.html是用什么算法计算的

如果你有任何代码sn-p,如果你能分享一下,我将不胜感激。

【问题讨论】:

  • 我想指出的是,您可以在 ebay 上以几分钱的价格获得 RTC(实时时钟)模块,这些模块实现了非常简单的通信接口,并且通常有一个电池插槽可以保存它们即使 MCU 关闭,也可以使用数年。
  • 闻起来像 X-Y 问题。为什么你需要将秒转换为时间+日期+年份,谁在乎呢?
  • @MatthewGoulart: 1) ebay 是专业产品的不良来源(我们不知道!) 2) 人们经常没有空间使用一些额外的硬件或重量是一个问题 3 ) 甚至一些“便士”对于大批量产品来说也是一个问题 4) 在软件中实现这一点是一个好习惯。
  • 我不想解释所有的实现以及为什么,因为问题会太长并且相关信息太多。我知道 RTC,但我不能在我的应用程序中使用。我正在利用时间来安排一天中特定时间的活动。例如,用户可以安排系统在 2 月 27 日 4:30:27 执行的操作。由于闪存限制,我计划每月更新时间表。将 2 月 27 日... 转换为 2000 年的秒数的一种偏好,问题是一样的,用什么算法来计算经过的时间

标签: c date time microcontroller elapsedtime


【解决方案1】:

你必须做数学,没有其他办法。您正在从以 2 为基数转换为以 10 为基数(以 10 为基数表示以 60 为基数)。

同样地,对于月日的事情,你也必须通过某种表格来处理每月的天数并处理闰年。

进行数学运算的替代方法是改变计数方式,使用更多内存但更少计算。基本上是 BCD 方法。当秒数从 9 滚动到 10 时,增加数十秒并将秒数设置为 0。一直重复直到日期。或者在 59 次滚动到零并增加分钟的中途和秒数中相遇……然后做以 10 为基础的东西,将十数与秒数小时分开。如果你没有分隔线,你可以使用一个表格。

【讨论】:

    【解决方案2】:

    这不是编程问题,因为仅使用微控制器无法可靠地做到这一点。内部 RC 振荡器会太不准确,即使您使用高精度的外部晶体振荡器,它也会随着时间的推移而漂移,并且可能会随着温度而变化。

    唯一正确的解决方案是在硬件中添加实时时钟电路,最好与备用电池一起使用。如何与实时时钟电路通信是硬件特定的。

    这类问题最好在https://electronics.stackexchange.com/上问硬件边界问题。

    【讨论】:

    • 我同意它会随着时间的推移而漂移,这就是为什么我每次都从边缘路由器更新它,但我在 cmets 中写道我不写系统详细信息和偏好,因为问题是一个 C 问题,而不是系统设计。我有 24 MHz 10ppm 晶体,OSAL 定时器用于嵌入式系统,例如许多 ZigBee 设备。它不是最好的,但对于我的应用程序来说仍然足够好。我考虑将其发布在electronics.stackexchange 上,但这不是电子设计问题,我要求最好的C 方法来转换日期。我认为 dwelch 有最准确的答案
    • 只是对答案的修正,即可以通过使用温度补偿晶体(参考温度漂移)在 MCU 上实现精确的时钟信号。
    • 我完全同意这一点,但 RTC 也会漂移,虽然没有那么多,但也会/将会漂移。一切都取决于时钟电路的质量(阅读:费用)以及您如何维护它(功率、温度等)。
    • 关于算法的问题怎么不是编程问题,算法怎么不能用微控制器可靠地完成? (有一个准确的时钟源来计算时间是一个完全不同的话题,但 OP 没有问这个问题。)
    • @tonypdmtr 因为 RTC 将是外部的,因此如何获得时间将完全取决于 RTC 获得的硬件。也许它只是一些 SPI 接口,然后你一口气读完它的全部时间。那么就不需要任何算法了。
    猜你喜欢
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多