Ich habe Dutzende verschiedener Echtzeituhr-Chips auf dem Markt gesehen, sowie eine Reihe von Prozessoren mit einem eingebauten, separat mit Strom versorgten Echtzeituhr-Modul.
Fast alle speichern die Zeit nicht nur als Jahr-Monat-Tag-Stunden-Minuten-Sekunden, sondern sogar die einzelnen Felder werden im BCD- statt im Binärformat gespeichert.
Gibt es dafür einen Grund?
Gibt es Mikroprozessoranwendungen, die etwas Ausgefeilteres tun, als einfach eine Uhr anzuzeigen, bei der das BCD-Format nützlicher ist als das Binärformat, oder bei der das Format Jahr-Monat-Tag-Stunde-Minuten-Sekunden nützlicher wäre als eine reine 47-Bit-Zählung? von Zustandsänderungen des Oszillators?
Soweit ich das beurteilen kann, scheinen die RTCC-Hersteller eine Menge zusätzlicher Schaltkreise hinzuzufügen, um ihre Chips weniger nützlich zu machen. Der einzige Grund, warum ich mir vorstellen kann, dass sich RTCC-Module in Prozessoren so verhalten, ist, dass die Prozessorhersteller eine bereits vorhandene BCD-Implementierung verwenden, anstatt ihre eigene zu produzieren.
RTCs von Philips/NXP (sowohl eigenständig als auch in ARM7- oder Cortex-M3-Chips integriert) verwenden keine BCD-Codierung.
Im Vergleich zum flachen Zähler sind die einzigen Operationen, die mit einer geteilten BCD-Uhr schwieriger sind, Zeitdifferenzberechnungen (Addieren von Sekunden oder Berechnen der verstrichenen Zeit). Zeitvergleiche wie: „Ist die aktuelle Zeit größer als die vom Benutzer eingestellte Weckzeit“ sind ebenso einfach.
Das Aufteilen der Felder ist wirklich nett, wenn Sie sich um das Kalenderdatum kümmern. Menschliche Kalender haben komische Dinge wie unterschiedlich lange Monate und obendrein noch Schaltjahre. Versuchen Sie, dies in einem einzigen Zähler zu tun (Sie können einen Bonuspunkt erhalten, wenn Sie fast keinen Strom verbrauchen). Oh, und versuchen Sie, Wochentage (sehr nützlich in allen Arten von Geräten, die für Menschen bestimmt sind: von Weckern bis zu Heizungsreglern) damit zu unterstützen.
Der BCD-Ansatz hat eine zusätzliche Funktion: Sie erhalten "jede Sekunde" oder "alle zehn Sekunden" kostenlose Interrupts, ohne irgendwelche Berechnungen zu Zeiten oder Daten durchführen zu müssen.
Denn die Rekord-Schaltjahrberechnung ist in den NXP-RTCs etwas daneben, da sie sich nur um die durch 4 teilbare Regel kümmert und die Teilung durch 100 und 400 nicht überprüft. Wenn sie den Jahreszähler in BCD belassen würde, wäre dies trivial und höchstwahrscheinlich richtig gemacht.
Wenn Sie eine monotone Uhr wollen, dann verwenden Sie eine. Sie können einen PIC oder AVR mit dem "RTC-Zähler" kaufen (der nur ein asynchroner Zähler mit einem autonomen 32-kHz-Oszillator ist). Denken Sie nur daran, dass die einfache Anzeige des Datums schwierig sein wird. :)
Wenn Sie die Uhrzeit und das Datum anzeigen und Alarme basierend auf der Benutzereingabe von Uhrzeiten und Daten einstellen müssen, verwenden Sie eine RTC. Und denken Sie daran, dass Ihre RTC-basierten Interrupts ungenau sein können, wenn der Benutzer die aktuelle Uhrzeit und das aktuelle Datum ändert.
Wenn Sie am Ende Uhren verwenden, interessieren Sie sich eher für Minuten und Zehntelsekunden (um sie anzuzeigen) als nur für die Summe von Sekunden, Minuten und so weiter. Falls Sie nicht an separaten Ziffern interessiert sind, besteht die Möglichkeit, dass Sie sich auch nicht für separate Minuten- oder Sekundenwerte interessieren und dass Sie genauso gut einen langen Binärzähler verwenden können, wie Sie vorgeschlagen haben.
Es ist einfacher, in Software von BCD in Binär umzuwandeln als umgekehrt. Und da BCD-Zähler gegenüber Binärzählern nicht so viel zusätzlichen Platz benötigen, ist es sinnvoll, sich für BCD zu entscheiden.
Ich vermute mehrere Gründe:
Historisch - das machen sie schon seit einiger Zeit so. Wenn Sie möchten, dass Ihr neues Teil ein anderes Teil ersetzt, muss es mehr oder weniger gleich funktionieren. Du bleibst also beim BCD.
Anwendung - Wenn jemand eine RTC von einem kleinen Mikro (etwas im 8-Bit-Bereich, wie ein Low-End-PIC) verwendet, ist der Umgang mit einer großen Zahl (z. B. Ihrem 47-Bit-Zähler) ein großes Problem. Es ist VIEL einfacher, mit den BCD-Ziffern umzugehen, da Sie nicht daran arbeiten müssen, Dinge aufzubrechen.
Nicht so schwer - Die BCD-Zähler zu machen ist nicht so schwer, und tatsächlich denke ich, dass es nicht viel mehr Gatter sind, als sie binär zu machen.
Man kann sich ein System vorstellen, bei dem Sie separate Stunden-, Minuten- usw. Zähler in Binärform anstelle von BCD erhalten (wodurch das Problem des „Aufschlüsselns der 47-Bit-Zahl“ vermieden wird), aber es ist nicht viel einfacher, und Sie werden einige tun Konvertierungen beim Anzeigen des Dings sowieso.
Ich stimme Michael Kohne zu, dass es viel historisches Momentum gibt.
Frühe MCUs hatten auch viel weniger Platz für Code und Daten (denken Sie zum Beispiel an 128 BYTES RAM). Da Zeitinformationen oft für menschliche Schnittstellenzwecke verwendet werden, war es sinnvoller, die Daten möglichst nahe an dem Format zu halten, das verwendet wird, um Menschen anzuzeigen/einzugeben.
Einige neuere MCUs mit mehr Code- und Datenraum implementieren manchmal Hardware-Echtzeitzähler – diese Geräte führen oft binäre Zählungen von 32-kHz-Ticks.
Falls es jemanden interessiert, ich habe mir nur die 32F-Serie von ST angesehen und es scheint, dass die neuere 32L-Serie zwar eine BCD-RTC verwendet, die 32F jedoch einen direkten 32-Bit-Zähler mit konfigurierbarem Vorteiler verwendet und einen separaten Batterieeingang dafür bereitstellt (Hurra! ). Ich hätte lieber einen längeren geraden Zähler ohne einen konfigurierbaren Preskalar gehabt (damit ich eine Genauigkeit von 1/256 Sek. erreichen, aber die Zeit jahrelang halten könnte, ohne mich um das Wickeln kümmern zu müssen), aber wenn ich die Prescale auf 1/64 Sek. einstellen würde, könnte der Timer laufen zwei Jahre ohne Überlaufen. Nicht optimal, aber auch nicht schlecht. Ein wenig unästhetisch, dass, wenn jemand die Maschine einschaltet, nachdem sie zu lange ausgeschaltet war (2,1+ Jahre), die Uhrzeit/das Datum unbemerkt um 2,1 Jahre zurückrutschen würde, aber kaum ein großes Problem (der Zähler hat eine Überlaufflagge, aber in viele Fälle, die nicht besonders hilfreich wären. Wenn die Maschine zwei Jahre lang eingeschaltet war, bevor sie ausgeschaltet wurde, und drei Monate später eingeschaltet wurde, würde der Timer voraussichtlich überlaufen; die Frage wäre, ob es zweimal übergelaufen ist, und dafür kenne ich keine Flagge.
Maxim scheint mit DS1372U genau das zu tun, was Sie wollen . Es benötigt weniger als 1 μA, kostet 1,7 USD und ist bei DigiKey und Mouser erhältlich(!). Das einzige Problem ist, dass es keine Alarme mit einer Genauigkeit von mehr als 1 Sekunde zu bieten scheint und die niedrigste Ausgangstaktrate $ \ approx $ 4 kHz beträgt.
Prof. Miau Miau
Superkatze