Warum verwenden Echtzeituhr-Chips BCD?

14

Ich habe Dutzende verschiedener Echtzeituhr-Chips auf dem Markt gesehen sowie eine Reihe von Prozessoren mit einem eingebauten, separat versorgten Echtzeituhr-Modul.

Fast alle von ihnen speichern nicht nur die Zeit als Jahr-Monat-Tag-Stunden-Minuten-Sekunden, sondern auch die einzelnen Felder werden im BCD-Format und nicht im Binärformat gespeichert.

Gibt es einen Grund dafür?

Gibt es Mikroprozessoranwendungen, die etwas Raffinierteres tun, als nur eine Uhr anzuzeigen, bei der das BCD-Format nützlicher als das Binärformat ist, oder bei denen das Format Jahr-Monat-Tag-Stunde-Minuten-Sekunden nützlicher wäre als eine gerade 47-Bit-Zählung von Oszillatorzustandsänderungen?

Nach allem, was ich sagen kann, scheinen RTCC-Hersteller eine Menge zusätzlicher Schaltkreise hinzuzufügen, um ihre Chips weniger nützlich zu machen. Der einzige Grund, warum sich RTCC-Module in Prozessoren so verhalten, besteht darin, dass die Prozessoranbieter eine bereits vorhandene BCD-Implementierung verwenden, anstatt ihre eigene zu produzieren.

Superkatze
quelle
2
Ich kenne die Antwort nicht, aber ich frage mich, ob es eine Korrelation zwischen BCD und 7-Segment-Decodern gibt .
Prof. Meow Meow
@Prof. Meow Meow: Netter Name. Die praktischste Methode zum Speichern von Zahlen, die in der Hardware angezeigt werden sollen, ist BCD. Es gibt Systeme, in denen Zahlen gespeichert wurden, die in anderen Formaten angezeigt werden sollen. In vielen Fällen wurde jedoch lediglich ein ROM verwendet, um die Zahl direkt der visuellen Darstellung zuzuordnen (z. B. verwendete der Arcade-Automat "Tank" 6-Bit-Punktezähler und ein 512-Bit-Zähler) Byte-ROM, um jeden Punktewert in eine 8x8-Form umzuwandeln; dies war jedoch im Allgemeinen nur dann praktikabel, wenn der maximale numerische Wert ziemlich klein war.
Supercat

Antworten:

12

Verwenden alle RTCs BCD-Codierung?

RTCs von Philips / NXP (sowohl eigenständig als auch in ARM7- oder Cortex-M3-Chips integriert) verwenden keine BCD-Codierung.

Was ist los mit einer BCD RTC?

Im Vergleich zum Flachzähler sind die einzigen Operationen, die mit einer geteilten BCD-Uhr schwieriger sind, Zeitdifferenzberechnungen (Hinzufügen von Sekunden oder Berechnen der verstrichenen Zeit). Zeitvergleiche wie: "Ist die aktuelle Zeit größer als die vom Benutzer eingestellte Weckzeit" sind genauso einfach.

Was ist schön an BCD-RTCs (und im Allgemeinen Split-Field-RTCs)?

Das Aufteilen der Felder ist wirklich nett, wenn Sie sich um das Kalenderdatum kümmern. Menschliche Kalender haben lustige Dinge wie Monate unterschiedlicher Länge und zusätzlich zu diesen Schaltjahren. 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 zu unterstützen (ziemlich nützlich für alle Arten von Geräten, die für Menschen gedacht sind: von Weckern bis zu Heizungsreglern).

Der BCD-Ansatz hat eine zusätzliche Funktion: Sie erhalten "jede Sekunde" oder "alle zehn Sekunden" Interrupts kostenlos, ohne dass Sie Zeit- oder Datumsberechnungen durchführen müssen.

Bei den NXP-RTCs ist die Berechnung des Rekordsprungjahres ein wenig anders, da nur die durch 4 teilbare Regel berücksichtigt wird und die Division durch 100 und 400 nicht überprüft wird. Wenn der Jahreszähler in BCD beibehalten würde, wäre dies trivial und höchstwahrscheinlich richtig gemacht.

Zusammenfassung

  1. Wenn Sie eine monotone Uhr möchten, 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 daran, dass es schwierig sein wird, nur das Datum anzuzeigen. :)

  2. Wenn Sie Uhrzeit und Datum anzeigen und Alarme basierend auf der Benutzereingabe von Uhrzeit und Datum einstellen müssen, verwenden Sie eine Echtzeituhr. Und denken Sie daran, dass Ihre RTC-basierten Interrupts möglicherweise ungenau sind, wenn der Benutzer die aktuelle Uhrzeit und das Datum ändert.

jpc
quelle
1
Ich habe gerade angefangen, den Gekko zu verwenden, der über eine 24-Bit-Echtzeituhr verfügt. Das ist fast das, was ich möchte, außer dass er nicht die Zeit messen kann, wenn der Prozessor tot ist. Ich habe mir auch einen ST Micro ARM angesehen, der ein albernes BCD-RTC-Modul hat, das nur Interrupts von einer Sekunde unterstützt. Wenn der ST-Chip niemals länger als drei Jahre ohne Strom sein würde, könnte ich die RTC-Vorkalare so einstellen, dass sie mit 32-facher Geschwindigkeit laufen, und dann Software-Tricks anwenden, um dies zu kompensieren, um eine zeitliche Auflösung von 1/32-Sek. Bei den Aufweckereignissen zu erzielen, aber Die in der RTC gespeicherten Uhrzeiten hätten keine sinnvolle Beziehung zur Kalenderzeit und ...
supercat
1
... die Notwendigkeit, vom albernen RTC-Format in 1/32-Sekunden-Schritte zu konvertieren, wäre ärgerlich, zumal eine solche Konvertierung bei jedem Schlaf- / Weckzyklus erforderlich wäre. Ich schätze, ich bin gespannt, wie viele Leute RTCC-Anzeigen verwenden, ohne sie in einheitliche Sekunden umzurechnen. Vielleicht gibt es genug, um das YMDHMS-Format lohnenswert zu machen, aber meiner Meinung nach ist es weitaus nützlicher, YMDHMS für die menschliche E / A zu reservieren und für alles andere gerade Sekunden (oder einen Bruchteil davon) zu verwenden.
Supercat
1
@jpc: Eigentlich wäre es meine Neigung gewesen, niemals die RTC-Chip-Zeit einzustellen, sondern die "Zeit seit dem Einsetzen der Uhrbatterie" beizubehalten und die Differenz zwischen dieser und der Wandzeit zu speichern. Ich habe diesen Ansatz in einer Produktgeneration verwendet, in der ein separater PIC für die akkugepufferte Zeit verwendet wurde (die Zeit auf diesem PIC war schreibgeschützt) und auf einem Chip mit einem geraden Zähler verwendet wurde. Es schien jedoch eine etwas doofe Idee zu sein, die RTC der Maschine einen bedeutungslos datumsformatierten Wert speichern zu lassen. Wenn ich jedoch den ST-Micro-Chip verwende, kann ich das auch tun.
Supercat
1
Übrigens verwendet die STM32F100-Serie eine 32-Bit-Sekunden-RTC (nicht BCD), aber die STM32F400-Serie greift auf eine BCD-codierte RTC zurück. Seufzer.
Mark Lakata
1
@ FedericoRusso: Geteiltes Feld wäre sinnvoll, obwohl es in den meisten Anwendungen eher hinderlich als hilfreich ist. Die Wahl von BCD erscheint jedoch geradezu bizarr, als eine Wahl, die mit einer CPU gebündelt werden soll , die keine BCD-Unterstützung hat .
Supercat
3

Wenn Sie am Ende Uhren verwenden, interessieren Sie sich mit größerer Wahrscheinlichkeit für Minuten und Dutzende von Sekunden (um sie anzuzeigen) als nur für die Summe von Sekunden, Minuten usw. Falls Sie sich nicht für einzelne Ziffern interessieren, interessieren Sie sich wahrscheinlich auch nicht für einzelne Minuten- oder Sekundenwerte, und Sie können auch einen langen Binärzähler verwenden, wie Sie vorgeschlagen haben.
Das Konvertieren von BCD in Binärdateien ist in der Software einfacher als umgekehrt. Und da BCD-Zähler nicht so viel zusätzlichen Platz gegenüber Binärzählern benötigen, ist es sinnvoll, sich für BCD zu entscheiden.

stevenvh
quelle
2
Wie oft möchte eine Anwendung mit Datum und Uhrzeit nichts anderes tun, als sie anzuzeigen? Es scheint mir, dass es weitaus üblicher ist, in der Zukunft eine Zeit zu berechnen oder zu bestimmen, wie viel Zeit seit einem bestimmten Ereignis vergangen ist, usw. Was einfacher zu berechnen ist: Datum und Uhrzeit 45 Sekunden nach 28-Feb-2000 23:59:52 oder 5097582 + 45 (letzterer Wert unter der Annahme von Mitternacht 01-Jan-2000 als Epoche)? Wie wäre es mit der Feststellung, ob zwischen dem 28. Februar 2000, 23:59 Uhr und dem 1. März 2000, 00:03 Uhr (gegenüber 5097540.0 und 5184180.0 Uhr) 5 Minuten vergangen sind
supercat,
1
Eine Echtzeituhr mit einem 48-Bit-Zähler für 65.536 Sekunden und einem Alarmvergleichsmodul, das die unteren 24 Bit abdeckt, wäre für Systeme mit geringem Stromverbrauch äußerst praktisch, da sie als Grundlage für die OS-unabhängige Zeitplanung verwendet werden könnte Prozessor wacht auf und schläft. Sollte in 4 Sekunden etwas passieren, könnte das System den RTC-Wert notieren, wenn das Ereignis eintreten sollte. Wenn der Prozessor in 2 Sekunden nichts mehr zu tun hat, kann er den RTC-Alarm einstellen und in den Ruhezustand wechseln. Wenn das Ereignis eintreten sollte, würde das System aufwachen.
Supercat
@supercat - für Allzweckcomputer lassen Sie das Betriebssystem die Zeit verfolgen und "nützliche Dinge" mit diesen Zeitangaben tun. Die RTC wird nur einmal abgefragt, um die Zeitinformationen des Betriebssystems zu initialisieren, und dann wird die Zeit durch Interrupts aktualisiert. Aber für viele einfache Embedded-Anwendungen ist es viel wahrscheinlicher, dass
Toybuilder
1
@Toybuilder: Letzteres ist genau der Ansatz, den ich in den letzten Generationen von elektronischen Schlössern verwendet habe. Meine größten Ärgernisse waren das Fehlen von Impulsausgangswahlen zwischen 32 kHz und 16 Hz (da ich einem 1-M-Pullup nicht vertraute, um zuverlässig mit einem 32-kHz-Open-Collector-Ausgang zu arbeiten, war die einzig vernünftige Wahl 16 Hz) und die Schlampigkeit der PICs Timer-Schaltung.
Supercat
1
@ FedericoRusso: Wenn man einen geradlinigen binären Zeitzähler hätte, müsste man nicht zurück in Stunden, Minuten und Sekunden konvertieren, außer vielleicht für eine von Menschen lesbare Anzeige. Man addiert einfach 3723 und das wars. Wenn man mit YMD-HMS-Datums- / Zeitwerten arbeitet, benötigt man einen separaten Code zum Inkrementieren und Dekrementieren. Die Sommerzeit ist ein Albtraum, für den Chiphersteller anscheinend defekte Unterstützung hinzufügen möchten [wie ein Befehl, der eine von der Stundenzählung abzieht, außer wenn es ist Null, in diesem Fall macht es nichts]. Sommerzeit ist ein Schmerz in binären auch, aber nicht ganz so schrecklich.
Superkatze
3

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 genauso funktionieren. Sie bleiben also beim BCD.

Anwendung - Wenn jemand eine RTC von einem kleinen Mikro verwendet (etwas im 8-Bit-Bereich, wie ein Low-End-PIC), ist der Umgang mit einer großen Zahl (wie 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, die Dinge aufzubrechen.

Nicht so schwer - Es ist nicht so schwer, die BCD-Zähler zu benutzen, und ich denke, es sind nicht viel mehr Tore 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 der Aufschlüsselung der 47-Bit-Zahl vermieden wird), aber es ist nicht viel einfacher, und Sie werden einige durchführen umrechnungen bei der darstellung des dings trotzdem.

Michael Kohne
quelle
1
Die 48-Bit-Zahl wäre eine 32-Bit-Zahl von Sekunden und ein 16-Bit-Bruch. Das Arbeiten mit 32-Bit-Zahlen auf einem 8-Bit-Mikro ist nicht so schlecht. Ich kann mir vorstellen, dass das BCD-Format auf so etwas wie einem 6502, das gut mit gepacktem BCD umgehen kann, in einigen Fällen einige Bytes einspart, obwohl die zusätzliche Komplexität der Verarbeitung von Übertrag zwischen Sekunden-Stunden-Minuten jeden Vorteil ausgleichen würde. Aber die Leute, die einen RTCC in die ARM-Chips von ST micro eingebaut haben, haben sicherlich nicht erwartet, dass jemand einen 6502 zur Verarbeitung der Daten verwendet - nicht mit einem 32-Bit-ARM, der genau dort sitzt!
Supercat
1
@supercat - während es nicht schwer ist, die 32-Bit-Arbeit am 8-Bit-Mikro zu erledigen, ist immer noch ein Schmerz im <Piep>. Und auf so etwas wie einem PIC (mit SEHR begrenzten Instruktions-, Register- und RAM-Räumen) ist es noch schmerzhafter. Was den ARM-Chip betrifft - ich wette, das hat mehr mit historischen Präzedenzfällen zu tun als mit allem anderen -, ist jeder daran gewöhnt, es so zu machen, also machen sie es so weiter.
Michael Kohne
1
Ich frage mich, welcher Teil der Leute, die RTCC-Peripheriegeräte verwenden, konvertiert Datums- und Uhrzeitangaben nicht in Sekunden-Zähler im Unix-Stil.
Supercat
1
Superkatze: Alle von ihnen? Was nützen Unix-ähnliche Zeitstempel in einer Uhr? OTOH Ihr einziger Anwendungsfall sind RTOS-Alarme, die besser mit einem normalen Timer oder mit einem einfachen "Sekundeninkrement" -Interrupt von der RTC bedient werden können.
jpc
1
@jpc: Was ist, wenn Sie feststellen möchten, ob ein bestimmtes Datum in der Sommerzeit liegt, oder ob ein Programm, das an einem bestimmten Datum / einer bestimmten Uhrzeit beginnt und eine bestimmte Länge hat, ein anderes Programm überlappt? Solche Dinge sind mit geraden Sekunden einfach, aber mit YMDHMS schwieriger. Was die Verwendung eines normalen Timers betrifft, verwende ich derzeit einen 1/16-Sekunden-Tick von einem RTC-Chip, der TMR1 und TMR3 auf einem PIC ansteuert. das gibt mir ein 1/16-Sekunden-genaues Aufwecken, das funktioniert, auch wenn die Haupt-CPU-Uhr gestoppt ist, und ich leite mein gesamtes Timing daraus ab.
Supercat
1

Ich stimme Michael Kohne zu, dass es eine Menge historischer Impulse gibt.

Frühe MCUs hatten auch viel weniger Platz für Code und Daten (zum Beispiel 128 Byte RAM). Da Zeitinformationen häufig für Zwecke der Benutzerschnittstelle verwendet werden, ist es sinnvoller, die Daten so nah wie möglich an dem Format zu halten, das für die Anzeige von / für Eingaben von Menschen verwendet wird.

Einige neuere MCUs mit mehr Code- und Datenraum implementieren manchmal Hardware-Echtzeitzähler - diese Geräte behalten oft Binärzahlen von 32-kHz-Ticks bei.

Spielzeugbauer
quelle
Ich habe für den Atari 2600 (128 Byte RAM) codiert und kenne die Vorzüge von BCD. Dinge wie Punktzahlen werden fast immer in BCD berechnet; Ebenenzahlen sind manchmal. Sogar auf einem 6502 würde ich erwarten, dass, wenn ich feststellen müsste, ob zwei Datums- / Uhrzeitangaben innerhalb von fünf Minuten voneinander liegen und ob die Sommerzeit wirksam ist, Code zum Konvertieren eines 32-Bit-Sekunden-Zählers in YMDHMS Seien Sie ungefähr so ​​kompakt wie Code, um diese Berechnungen ohne solche Konvertierungen durchzuführen. Bei neueren CPUs habe ich einige mit 32-kHz-Zählern gesehen, bei denen die Haupt-CPU am Leben sein muss ...
supercat
... aber die Chips, die ich bemerkt habe, die ein separat betriebenes RTCC haben, verwenden BCD YMDHMS.
Supercat
Die neueren CPUs tun dies, da sie billiger sind und etwas weniger Strom verbrauchen (besonders wichtig, da der verwendete Halbleiterprozess für die Herstellung von CPUs und nicht für RTCs optimiert ist).
JPC
@jpc: Warum ist es billiger und aktueller, BCD YMDHMS zu verwenden? Ich würde denken, dass ein 47-Bit-Nur-Lese-Zähler mit einem Komparator auf den unteren 32 Bits einfacher ist als alle Datenanalyse-Funktionen in einem RTC-Chip. Sofern es keinen Masterfilm über eine BCD-Datumsschaltung gibt, der aufgrund einer lang vergessenen Magie in ein Design eingetaucht werden kann, um niedrigere Ströme als mit modernen Methoden zu erzielen, ist mir nicht klar, warum BCD billiger oder billiger ist weniger aktuell?
Supercat
Ich habe über @Toybuilders Antwort nachgedacht, in der er sagte, dass neuere CPUs nur Zähler und keine vollwertigen RPCs haben.
JPC
1

Falls sich jemand interessiert, schaue ich mir nur die 32F-Serie von ST an und es sieht so aus, als ob die neuere 32L-Serie eine BCD-RTC verwendet, die 32F jedoch einen geraden 32-Bit-Zähler mit konfigurierbarer Voreinstellung verwendet und einen separaten Batterieeingang dafür bereitstellt (Hurra! ). Ich hätte lieber einen längeren geraden Zähler ohne konfigurierbaren Prescalar gehabt (so dass ich eine Genauigkeit von 1 / 256sec erzielen könnte, aber die Zeit jahrelang halten könnte, ohne mir Gedanken über das Wickeln machen zu müssen), aber wenn ich den Prescale auf 1 / 64sec einstellen würde, könnte der Timer laufen zwei Jahre ohne Überlauf. Nicht ideal, aber nicht schlecht. Ein wenig unästhetisch, dass, wenn jemand die Maschine einschaltet, nachdem sie zu lange ausgeschaltet war (über 2,1 Jahre), die Zeit / das Datum unerkennbar um 2,1 Jahre zurückrutschen würde, dies aber kaum ein großes Problem darstellt (der Zähler hat eine Überlaufmarkierung, aber in In vielen Fällen wäre das nicht besonders hilfreich. Wenn die Maschine zwei Jahre eingeschaltet war, bevor sie ausgeschaltet wurde, und drei Monate später eingeschaltet wurde, ist zu erwarten, dass der Timer überläuft. die frage wäre, ob es zweimal übergelaufen wäre und ich kenne keine flagge dafür.

Superkatze
quelle
0

Maxim scheint mit DS1372U genau das zu tun, was Sie wollen . Es benötigt weniger als 1μA, kostet 1,7 USD und ist (!) Auf 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 $ \ ca. $ 4kHz beträgt.

jpc
quelle
1
Es ist ein wenig teuer und erlaubt es nicht, Inkremente kleiner als eine Sekunde auszulesen. Ein Ausgang mit 4096 Hz wäre schön, obwohl es viel schöner wäre, wenn er für 1/65536 Sekunde niedrig und für 15/65536 hoch wäre. Open-Collector-Ausgänge sollten so wenig wie möglich niedrig sein.
Supercat