リアルタイムクロックチップがBCDを使用する理由


14

市場には数十種類のリアルタイムクロックチップと、個別に電源供給されるリアルタイムクロックモジュールが組み込まれた多数のプロセッサを見てきました。

それらのほぼすべては、年月日日時分秒として時間を保存するだけでなく、個々のフィールドでさえバイナリ形式ではなくBCDで保存されます。

これには根本的な理由がありますか?

BCD形式がバイナリよりも便利な時計を表示するだけでなく、年-月-日-時-分-秒形式が47ビットのストレートカウントよりも便利な時計を表示するだけでなく、より高度な処理を行うマイクロプロセッサアプリケーションはありますか発振器の状態変化の?

私の知る限り、RTCCメーカーはチップの有用性を下げるために多くの回路を追加しているようです。プロセッサ内のRTCCモジュールがそのように動作するように考えられる唯一の理由は、プロセッサベンダーが独自のBCD実装を作成するのではなく、既存のBCD実装を使用していることです。


2
答えはわかりませんが、BCDと7-Segment Decoderには相関関係があるでしょうか?
教授Meow Meow

@教授 ニャーニャー:いい名前。ハードウェアに表示される数値を保存する最も実用的な方法は、BCDです。他の形式で表示される数字を保存するシステムがありますが、多くの場合、ROMを使用して数字からその視覚的表現に直接マッピングします(たとえば、アーケードマシン「タンク」は6ビットスコアカウンターを使用し、512バイトROMを使用して各スコア値を8x8の形状に変換します)が、これは通常、最大数値がかなり小さい場合にのみ機能しました。
-supercat

回答:


12

すべてのRTCはBCDエンコーディングを使用しますか?

Philips / NXPのRTC(スタンドアロンおよびARM7またはCortex-M3チップに統合)は、BCDエンコーディングを使用しません。

BCD RTCの何が問題になっていますか?

フラットカウンターと比較した場合、スプリットBCDクロックでより困難な操作は、時間差の計算(秒の追加または経過時間の計算)のみです。「現在の時刻は、ユーザーが設定したアラーム時刻よりも大きい」などの時間比較も同様に簡単です。

BCD(および一般にスプリットフィールド)RTCの利点は何ですか?

カレンダーの日付を気にするとき、フィールドを分割することは本当に素晴らしいです。人間のカレンダーには、長さが異なる月やそのうるう年に加えて、面白いものがあります。1つのカウンターでそれを試してみてください(ほとんど電力を使用しないことでボーナスポイントを獲得できます)。ああ、これで平日をサポートしてみてください(目覚まし時計からヒーターコントローラーまで、人間向けのあらゆる種類のデバイスで非常に便利です)。

BCDアプローチには、追加の機能が1つあります。時間または日付を計算する必要なく、「毎秒」または「10秒ごと」の割り込みを無料で取得できます。

レコードのうるう年の計算では、4で割り切れるルールのみを考慮し、100および400による除算をチェックしないため、NXP RTCでは少しずれています。正しくやった。

概要

  1. 単調な時計が必要な場合は、それを使用します。「RTCカウンター」(これは、自律的な32kHz発振器を備えた単なる非同期カウンターです)でPICまたはAVRを購入できます。日付を表示するだけでは難しいことを覚えておいてください。:)

  2. 時刻と日付を表示し、時刻と日付のユーザー入力に基づいてアラームを設定する必要がある場合は、RTCを使用します。また、ユーザーが現在の時刻と日付を変更すると、RTCベースの割り込みが不正確になる可能性があることに注意してください。


1
Gekkoを使い始めたばかりです。Gekkoには24ビットRTCがあります。これは、プロセッサが死んだときに時間を維持できないことを除けば、ほとんど必要なものです。また、1秒単位の割り込みのみをサポートする愚かなBCD RTCモジュールを備えたST Micro ARMも検討していました。STチップに3年以上電力が供給されない場合、RTCプリスカラーを32倍の速度で実行し、ソフトウェアトリックを使用して補正することで、ウェイクアップイベントで1/32秒の時間分解能を得ることができますが、 RTCに保存されている時間は、カレンダーの時間と意味のある関係を持たないでしょう
...-supercat

1
...そのため、特にスリープ/ウェイクアップサイクルごとにこのような変換が必要になるため、RTCの愚かな形式から1/32秒の増分に変換する必要があります。統一された秒数に変換せずにRTCC読み取り値を使用する人がどれだけいるのか興味があります。YMDHMS形式を価値のあるものにするのに十分かもしれませんが、人間の I / O 用にYMDHMSを予約し、他のすべてにまっすぐな秒(またはその端数)を使用する方がはるかに便利です。
-supercat

1
@jpc:RTCチップの時間を決して設定せず、代わりに「クロックバッテリーが取り付けられてからの時間」を保持し、その時間と壁の時間の差を保存することでした。私はこのアプローチを製品の1世代で使用し、バッテリーバックアップ時間(そのPICの時間は読み取り専用であった)を保持するために別のPICを使用し、ストレートカウンターのあるチップで使用しました。しかし、マシンのRTCに無意味な日付形式の値を保存させるのは、ちょっとおかしいアイデアのように思えましたが、ST Microチップを使用すれば、それを行うことができます。
-supercat

1
ところで、STM32F100シリーズは32ビット秒RTC(BCDではない)を使用しますが、STM32F400シリーズはBCDエンコードRTCに戻ります。はぁ。
マークラカタ

1
@FedericoRusso:分割フィールドは意味がありますが、ほとんどのアプリケーションのヘルプよりも障害になりやすいです。ただし、BCDの選択は、BCDをサポートしていない CPUにバンドルする選択肢として、まったく奇妙に思えます。
supercat

3

最後に時計を使用する場合、秒、分などの合計だけでなく、数分および数十秒(時計の表示に向けて)に関心を持つ可能性が高くなります。個別の数字に興味がない場合は、分または秒の値を個別に気にする必要はなく、提案したようにロングバイナリカウンターを使用することもできます。
ソフトウェアでBCDからバイナリに変換するのは、他の方法よりも簡単です。また、BCDカウンターはバイナリカウンターに比べてそれほど大きなスペースを必要としないため、BCDを選択するのは理にかなっています。


2
アプリケーションは、日付と時刻を表示する以外に何もしたくない場合がありますか?将来、ある距離の時間を計算したり、特定のイベントから経過した時間を決定したりするなど、もっと簡単に計算できるようになります:日付と時間45秒28-Feb-2000 23:59:52、または5097582 + 45(エポックとして2000年1月1日午前0時を想定した後者の値)の後ですか?28-Feb-2000 23:59と01-Mar-2000 00:03(vs 5097540.0と5184180.0)の間に5分が経過したかどうかを判断する方法について
supercat

1
65,536秒の48ビットカウンターと下位24ビット程度をカバーするアラーム比較モジュールを備えたRTCは、独立したOSスケジューリングの基盤として使用できるため、低電力システムに非常に便利です。プロセッサーが目覚め、眠っている。何かが今から4秒後に発生することになっている場合、システムはイベントが発生するはずのRTC値を記録できます。2秒後にプロセッサが何もする必要がないと判断すると、RTCアラームを設定してスリープ状態になる可能性があります。イベントが発生すると、システムが起動します。
-supercat

@supercat-汎用コンピューターの場合、OSが時間を追跡し、その時間情報で「有用なこと」を行うようにします。RTCは、OSの時間情報を初期化するために一度だけ参照され、その後、割り込みによって時間が更新されます。しかし、多くの単純な組み込み用途では、
-Toybuilder

1
@Toybuilder:後者は、まさに最後の数世代の電子ロックで使用することになったアプローチです。私の最大の悩みは、32Khzと16Hzの間のパルス出力の選択の欠如(32Khzのオープンコレクター出力で確実に動作するために1Mのプルアップを信用しなかったため、妥当な選択は16Hzのみでした)、およびPICタイマー回路。
-supercat

1
@FedericoRusso:ストレートバイナリのタイムカウンターがあれば、おそらく人間が読めるディスプレイを除いて、時間、分、秒に戻す必要はありません。3723を追加するだけです。YMD-HMSの日付/時刻の値を操作する場合、インクリメントとデクリメントに別のコードが必要です。夏時間は悪夢です。それはゼロです、その場合、それは何もしません]。DSTもバイナリでは苦痛ですが、それほど恐ろしくはありません。
supercat

3

いくつかの理由が疑われます。

歴史的-彼らは今しばらくこの方法でやっています。新しい部品で他の部品を置き換える場合は、ほぼ同じように動作する必要があります。したがって、BCDを使用します。

アプリケーション-誰かが小さなマイクロ(ローエンドPICなどの8ビット範囲の何か)からRTCを使用している場合、多数(47ビットカウンターなど)を扱うことは首に大きな痛みを伴います。物事を分解する必要がないので、BCDの数字を扱うのははるかに簡単です。

それほど難しくありません-BCDカウンターを実行することはそれほど難しくありません。実際、バイナリを実行するよりも多くのゲートはないと思います。

BCDの代わりにバイナリの時間、分などのカウンターを個別に取得するシステムを想像できます(したがって、「47ビット数の内訳」の問題を回避します)が、それほど簡単ではないので、とにかく物を表示するときの変換。


1
48ビットの数値は、32ビットの秒数と16ビットの小数です。8ビットのマイクロで32ビットの数値を操作するのは悪くありません。パックされたBCDをうまく処理できる6502のようなものでは、BCD形式が場合によっては数バイトを節約するかもしれませんが、数時間から数分の間のキャリーの処理の複雑さは利点を相殺します。しかし確かに、ST microのARMチップにRTCCを組み込んだ人々は、だれかがデータを処理するために6502を使用することを期待していませんでした。
-supercat

1
@supercat-難しいことではありませんが、8ビットマイクロで32ビットの作業を行うのは<bleep>の苦痛です。そして、PICのようなもの(非常に限られた命令とレジスターとRAMスペース)では、さらに面倒です。ARMチップについては-歴史的な先例と関係があるのではないかと思う-誰もがそのようにそれを行うことに慣れているので、彼らはそれを続ける。
マイケルコーン

1
RTCC周辺機器を使用する人々のうち、日付/時刻をUnixスタイルの秒カウンターに変換しないのはどの部分かと思いますか?
-supercat

1
supercat:それらはすべて?Unixスタイルのタイムスタンプはどのような用途に使用されますか?OTOHの唯一のユースケースはRTOSアラームであり、これは通常のタイマーまたはRTCからの単純な「2番目のインクリメント」割り込みでより適切に処理されます。
-jpc

1
@jpc:特定の日付が夏時間かどうかを判断したり、特定の日付/時刻に開始して特定の長さだけ続くプログラムが別のプログラムと重複するかどうかを判断したい場合はどうしますか?このようなことは、まっすぐな秒では簡単ですが、YMDHMSでは難しいです。通常のタイマーを使用する場合、現在使用しているのは、PICでTMR1およびTMR3を駆動するRTCチップからの1/16秒のティックです。これにより、メインCPUクロックが停止していても機能する1/16秒の正確なウェイクアップが得られ、そこからすべてのタイミングが導き出されます。
-supercat

1

マイケル・コーネ氏には、歴史的な勢いがたくさんあることに同意します。

初期のMCUも、コードとデータ用のスペースがはるかに少なかった(たとえば、128バイトのRAMなど)。時間情報は人間とのインターフェースの目的で使用されることが多いため、データを人間に表示したり入力したりするために使用する形式に最も近い状態に保つ方が理にかなっています。

より多くのコードとデータスペースを備えた一部の新しいMCUは、ハードウェアリアルタイムカウンターを実装することがあります。これらのデバイスは、多くの場合、32kHzティックのバイナリカウントを保持します。


Atari 2600(128バイトRAM)用にコーディングしましたが、BCDの長所は知っています。スコアのようなものはほとんど常にBCDで計算されます。レベル番号は時々です。6502でも、2つの日付/時刻が互いに5分以内であるかどうかを判断し、夏時間が有効かどうかを判断する必要がある場合、32ビット秒カウンターをYMDHMSに変換するコードは、そのような変換を行わずにこれらの計算を行うためのコードとほぼ同じくらいコンパクトになります。新しいCPUについては、メインCPUが稼働している必要があるストレート32Khzカウンターを使用しているものがあります
...-supercat

...しかし、個別に電源供給されるRTCCを持っていることに気付いたチップは、BCD YMDHMSを使用しています。
-supercat

新しいCPUは、安価で電流が少し少ないため、これを行います(使用される半導体プロセスはRTCではなくCPUの作成に最適化されているため、特に重要です)。
jpc

@jpc:BCD YMDHMSを使用する方が安価で低電流なのはなぜですか?下位32ビットにコンパレーターを備えた47ビットの読み取り専用カウンターは、R​​TCチップのすべての日付解析のものよりも簡単だと思います。BCD日付回路のマスターフィルムがありますが、それは、いくつかの難解な長い間忘れられていた魔法のために、現代の方法で利用できるよりも低い電流を達成するために設計に取り入れることができるものです。電流が少ない?
-supercat

私は@Toybuildersの回答について考えていました。彼は、新しいCPUにはカウンターだけがあり、本格的なRPCはない、と述べました。
jpc

1

誰かが興味を持っている場合、私はSTの32Fシリーズを見ているだけで、新しい32LシリーズはBCD RTCを使用していますが、32Fは構成可能なプリスカラ付きのストレート32ビットカウンターを使用し、別個のバッテリー入力を提供しているようです(ホーレイ! )。構成可能なプリスケーラを使用せずに、より長いストレートカウンターがあればよかったので(1/256秒の精度を得ることができますが、ラップを心配することなく何年も時間を維持できます)、プリスケールを1/64秒に設定した場合、タイマーは実行できますあふれることなく2年。理想的ではありませんが、それほど悪くはありません。あまりにも長い間(2.1年以上)オフになってからマシンの電源を入れた場合、時刻/日付は2.1年遅れて検出できなくなりますが、大きな問題はほとんどありません(カウンターにはオーバーフローフラグがありますが、あまり役に立たない多くのケース。マシンの電源を切る前に2年間電源を入れ、3か月後に電源を入れた場合、タイマーはオーバーフローすることが予想されます。問題は、2回オーバーフローしたかどうかであり、そのためのフラグは知りません。


0

マキシムはDS1372Uであなたが望むことをやっているようです。必要なものは1μA未満で、価格は1.7米ドルで、DigiKeyおよびMouserで入手可能です(!)。唯一の問題は、1秒を超える精度のアラームを提供しないようであり、最低出力クロックレートが$ \ approx $ 4kHzであるということです。


1
それは少し高価であり、1秒未満の増分を読み取る方法を許可しません。4096Hzの出力は優れていますが、1/65536秒で低く、15/65536で高ければはるかに優れています。オープンコレクター出力はできるだけ低くする必要があります。
-supercat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.