为什么实时时钟芯片使用BCD


14

我已经看到市场上有数十种不同的实时时钟芯片,以及许多具有内置的独立供电实时时钟模块的处理器。

几乎所有它们不仅将时间存储为年-月-日-小时-分钟-秒,而且甚至单个字段都以BCD而不是二进制格式存储。

是否有一些根本原因?

是否有微处理器应用程序能做的事情比简单地显示时钟要复杂得多,在这里BCD格式比二进制文件更有用,或者年月日日时分秒格式比直接的47位计数更有用。振荡器状态变化?

据我所知,RTCC制造商似乎增加了很多额外的电路,以降低其芯片的实用性。我认为处理器中的RTCC模块采用这种方式的唯一原因是处理器供应商使用了一些预先存在的BCD实现,而不是自己生产。


2
我不知道答案,但我想知道与7段解码器的BCD是否相关?
Meow Meow教授

@教授 喵喵:好听的名字。BCD是存储将要在硬件中显示的数字的最实用方法。有些系统存储的数字将以其他格式显示,但是在许多情况下,它们仅使用ROM直接从数字映射到其视觉表示(例如,街机“ Tank”使用6位计分计数器和512)字节ROM将每个得分值转换为8x8形状),但这通常仅在最大数值相当小时才可用。
supercat

Answers:


12

所有RTC都使用BCD编码吗?

Philips / NXP的RTC(既独立又集成到ARM7或Cortex-M3芯片中)都不使用BCD编码。

BCD RTC有什么问题?

与平面计数器相比,使用BCD分离时钟时唯一困难的操作是时间差计算(增加秒数或计算经过的时间)。时间比较就像:“当前时间是否大于用户设置的警报时间”一样容易。

BCD(通常是分场)RTC有什么好处?

当您关心日历日期时,拆分字段真的很好。人类日历上有有趣的事情,例如不同长度的月份以及leap年。尝试在单个计数器中执行此操作(由于几乎不使用电源,您可以获得奖励积分)。哦,并尝试以此支持工作日(在对人类有意义的各种设备中都很有用:从闹钟到加热器控制器)。

BCD方法还有一个附加功能:您可以免费获得“每秒”或“每十秒钟”的中断,而无需对时间或日期进行任何计算。

对于创纪录的leap年计算,恩智浦RTC中的计算有点差,因为它只关心4分法,而不检查100和400的除法。如果将年份保留在BCD中,这将是微不足道的,并且很可能是做得对。

摘要

  1. 如果您想要单调时钟,请使用一个。您可以购买带有“ RTC计数器”(这只是具有自主32kHz振荡器的异步计数器)的PIC或AVR。请记住,仅显示日期将很困难。:)

  2. 当需要显示时间和日期并根据用户输入的时间和日期设置警报时,请使用RTC。请记住,当用户更改当前时间和日期时,基于RTC的中断可能不准确。


1
我刚刚开始使用Gekko,它具有24位RTC,几乎是我想要的,除了在处理器死机时无法保留时间。我还在看一个ST Micro ARM,它具有一个愚蠢的BCD RTC模块,仅支持一秒钟的中断。如果ST芯片永远不会断电超过三年,我可以将RTC预分频器以32倍的速度运行,然后使用软件技巧进行补偿,从而在唤醒事件中获得1/32秒的时间分辨率,但是RTC中存储的时间与日历时间和...没有任何有意义的关系。
。– supercat

1
...因此从RTC的愚蠢格式转换为1/32秒增量的必要性将令人烦恼,尤其是因为在每个睡眠/唤醒周期都需要进行这种转换。我想我很好奇有多少人在不转换为统一秒数的情况下使用RTCC读数。也许足以使YMDHMS格式值得,但在我看来,为人类 I / O 保留YMDHMS 并为其他所有内容使用连续秒数(或其任何分数)要有用得多。
supercat

1
@jpc:我的意愿实际上是从不设置RTC芯片时间,而是保留“自安装时钟电池以来的时间”,并存储该时间与墙上时间之间的时差。我在一代产品中使用了这种方法,该产品使用单独的PIC来保持电池备用时间(该PIC上的时间是只读的),并将其用于带有直计数器的芯片上。但是,让机器的RTC存储无意义的日期格式的值似乎有点愚蠢,尽管如果我使用ST Micro芯片,我可能会这样做。
超级猫

1
顺便说一句,STM32F100系列使用32位秒RTC(而不是BCD),但是STM32F400系列返回到BCD编码的RTC。叹。
Mark Lakata 2012年

1
@FedericoRusso:拆分字段在某种意义上是有意义的,尽管在大多数应用程序中它比帮助更容易成为障碍。但是,选择BCD作为与不支持BCD的CPU捆绑在一起的选择似乎很奇怪。
超级猫

3

最后使用时钟时,您会更感兴趣的是分钟和数十秒(以显示它们),而不是总的秒,分钟等。如果您对单独的数字不感兴趣,则有可能您也不在意单独的分钟或秒值,并且不妨使用建议的长二进制计数器。
在软件中从BCD转换为二进制文件比其他方法更容易。而且由于BCD计数器不需要比二进制计数器多得多的空间,因此选择BCD是有意义的。


2
除了显示日期外,应用程序多长时间不希望日期和时间做什么?在我看来,执行诸如计算将来某个距离的时间,或者确定自某个特定事件以来已经过去了多少时间等事情,这是更常见的事情。这更容易计算:日期和时间45秒2000年2月28日23:59:52之后还是5097582 + 45(后一个值假设以2000年1月1日午夜为纪元)?如何确定在2000年2月28日23:59到2000年3月1日00:03之间是否经过了5分钟(相对于5097540.0和5184180.0)
supercat

1
带有48位计数器的RTC(用于65,536秒)和一个警报比较模块(覆盖最低24位左右)对于低功率系统而言非常方便,因为它可以用作独立于操作系统调度的基础处理器唤醒和睡眠。如果应该从现在开始4秒钟发生一些事情,那么系统可以在事件应该发生时记录RTC值。如果从现在起2秒钟,处理器发现自己无事可做,则可以设置RTC警报并进入睡眠状态。当事件应该发生时,系统将唤醒。
supercat

@supercat-对于通用计算机,让OS跟踪时间并使用该时间信息进行“有用的事情”。仅查询一次RTC即可初始化操作系统的时间信息,然后通过中断来更新时间。但是对于许多简单的嵌入式使用而言,它更有可能
Toybuilder 2011年

1
@Toybuilder:后者正是我在最后几代电子锁中最终使用的方法。我最大的烦恼是在32Khz和16Hz之间没有任何脉冲输出选择(因为我不相信1M上拉电阻可以在32Khz集电极开路输出下可靠地工作,所以唯一合理的选择是16Hz),而且PIC的分辨率太低计时器电路。
supercat

1
@FedericoRusso:如果一个人拥有一个二进制的正时计数器,那么除了人类可读的显示器外,不必将其转换回小时,分钟和秒。只需添加3723就可以了。使用YMD-HMS日期/时间值时,需要使用单独的代码进行递增和递减操作,夏令时是一场噩梦,芯片制造商似乎希望添加中断的支持(例如从小时计数中减去一个的命令,除非它为零,在这种情况下它什么也不做]。DST也是二进制的痛苦,但并不那么可怕。
2013年

3

我怀疑有几个原因:

历史悠久-他们这样做已经有一段时间了。如果您希望新零件替换其他零件,那么它或多或少都需要相同的工作。因此,您保留了BCD。

应用-如果有人使用小型RTC(在8位范围内,例如低端PIC),那么处理大量RTC(例如您的47位计数器)是一个很大的麻烦。处理BCD数字更容易,因为您不必费力分解。

不那么难-进行BCD计数器并不难,实际上我认为与对二进制进行计数相比,门并不多。

可以想象一个系统,您将获得二进制形式的小时,分​​钟等计数器,而不是BCD(从而避免了“分解47位数字”的问题),但是它并没有那么容易,并且您将要做一些无论如何在显示事物时进行转换。


1
48位数字将是32位秒数和16位小数。在8位微控制器上使用32位数字并不是很糟糕。我可以想象,在像6502这样可以很好地处理打包的BCD的东西上,BCD格式在某些情况下可以节省一些字节,尽管在几分之二的间隔内增加进位处理的复杂性会抵消任何优势。但是可以肯定的是,在ST micro的ARM芯片中内置RTCC的人们并不期望有人使用6502来处理数据-而不是在那里使用32位ARM!
supercat

1
@supercat-虽然不难,但在<bleep>中仍然很难在8位微型计算机上进行32位工作。而在PIC之类的东西上(具有非常有限的指令,寄存器和内存空间),这更让人痛苦。至于ARM芯片-我敢打赌,这与历史上的先例有更多的关系,比其他任何事情都重要-每个人都习惯那样做,所以他们一直那样做。
迈克尔·科恩

1
我想知道使用RTCC外设的人中有多少人不将日期/时间转换为Unix样式的秒计数器吗?
supercat

1
超级猫:所有人?时钟中的Unix风格时间戳有什么用?OTOH,您唯一的用例是RTOS警报,最好使用常规计时器或RTC的简单“第二增量”中断来使用。
jpc 2011年

1
@jpc:如果要确定给定的日期是否在夏时制,或者确定某个程序在某个日期/时间开始并持续一定长度,该程序是否会与另一个重叠?这样的事情在短短几秒钟之内就很容易,而对于YMDHMS则更困难。至于使用普通定时器,我目前使用的是来自RTC芯片驱动PIC上的TMR1和TMR3的1/16秒滴答声。即使在主CPU时钟停止时,它也能提供1/16秒精确的唤醒,并且我从中得出所有计时信息。
supercat

1

我同意迈克尔·科恩(Michael Kohne)的观点,它具有许多历史动力。

早期的MCU的代码和数据空间也要少得多(例如,以128 BYTES的RAM为例)。由于时间信息通常用于人机交互目的,因此使数据最接近用于向人显示/从人输入的格式更为有意义。

一些具有更多代码和数据空间的新型MCU有时会实现硬件实时计数器-这些设备通常保持32kHz滴答的二进制计数。


我已经为Atari 2600(128字节RAM)编码,并且我知道BCD的优点。分数之类的东西几乎总是在BCD中计算出来的。级别数字有时是。但是,即使在6502上,我也希望如果我需要确定两个日期/时间是否在彼此之间的五分钟内,并确定夏时制是否有效,将32位秒计数器转换为YMDHMS的代码会无需执行此类转换就可以像代码一样紧凑。至于较新的CPU,我见过一些带有直32Khz计数器的计数器,这些计数器要求主CPU仍处于活动状态……
supercat

...但是我注意到,具有单独供电的RTCC的芯片使用BCD YMDHMS。
supercat

较新的CPU可以做到这一点,因为它更便宜并且使用的电流更少(特别重要,因为所使用的半导体工艺已针对制造CPU而不是RTC进行了优化)。
jpc 2011年

@jpc:为什么使用BCD YMDHMS更便宜,电流更低?我认为47位只读计数器的底部32位具有比较器会比RTC芯片中的所有日期解析函数更简单。除非有一些BCD日期电路的母片,由于某些神秘的,久已被遗忘的魔术,可以将其放入设计中以实现比现代方法所能提供的电流低的电流,否则我不清楚BCD为什么会便宜或使用电流较小?
supercat

我在考虑@Toybuilders的回答,他在回答中说,较新的CPU仅具有计数器,而没有成熟的RPC。
jpc 2011年

1

如果有人感兴趣,我只看一下ST的32F系列,似乎较新的32L系列使用BCD RTC,而32F使用带有可配置预分频器的直32位计数器并为其提供独立的电池输入(万岁! )。我本来希望有一个更长的直线计数器而没有可配置的预分频器(所以我可以获得1 / 256sec的精度,但可以保留很多年而不用担心换行),但是如果我将prescale设置为1 / 64sec,计时器就可以运行两年不溢出。不是很理想,但是还算不错。有点麻木的感觉,如果有人在关闭机器时间过长(2.1年以上)后打开机器电源,则时间/日期将无法察觉地回退2.1年,但这几乎不是主要问题(计数器具有溢出标志,但是在很多情况下并不会带来很大帮助。如果机器在关闭电源之前已打开了两年,而在三个月后重新打开,则计时器可能会溢出;问题是它是否溢出了两次,我对此一无所知。


0

Maxim似乎正在使用DS1372U做您想要的事情。它需要小于1μA的电流,成本为1.7美元,可在DigiKey和Mouser上使用(!)。唯一的问题是,它似乎提供的警报似乎没有超过1秒的精度,并且最低输出时钟速率为$ \ approx $ 4kHz。


1
它有点贵,并且不允许任何方式读出小于一秒的增量。4096Hz的输出将是不错的,但是如果它的低值持续1/65536秒,而高的持续时间15/65536,则效果会更好。集电极开路输出应尽可能低。
supercat
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.