RTCを照会する頻度は?


11

私はまだRTCを使用していないので、リアルタイムクロックを読み取るための「通常の」方法が完全にはわかりません。私が考えたいくつかの異なるアプローチがありますが、それについてのいくつかのアドバイスを期待していました。

これまでの時間を読んで使用することを考えた方法は次のとおりです。

  1. 電源投入時に日付と時刻を取得してRAMに保存し、タイマー割り込みを使用して1秒ごとにRAMの値をインクリメントします。その後、コードは日付/時刻を知る必要があるときにRAMの値を使用します。
  2. タイマー割り込みを使用して、RTCを毎秒クエリし、受信した日付と時刻をRAMにコピーします。この場合も、コードは日付/時刻を知る必要があるときはいつでもRAMの値を使用します。
  3. 時間を調べる必要があるたびに、RTCを照会し、その応答を直接使用します。

どちらが最良のアプローチでしょうか?


15
最適なアプローチは、最小限のリソースを使用しながら仕様を満たすアプローチです。私たちはあなたのニーズを本当に知らないので、「最高」は私たちにとってほとんど意味がありません。
スコットサイドマン

すべての非常に良い答え私は答えを選ぶことができません!
-user9993

回答:


23

4番目のオプションを使用します。

ほとんどのRTCチップには、1秒のパルスを出力するオプションがあります。そのパルスをMCUの割り込み対応入力に接続する必要があります。

  • プログラムの開始時にチップから時間を取得しますが、それ以降は時折-おそらく1時間に1回取得します。
  • 次に、割り込み信号はMCUの割り込みルーチンをトリガーし、そこで1秒ずつ時間を増やします。

この配置により、RTCを積極的に読み取るオーバーヘッドなしで、RTC の秒の精度が得られます。


5
このアプローチを使用する場合、どのクロックエッジが増分を表しているかを把握し、そのクロックエッジ中に進行中の読み取りをすべて破棄する必要があります。
-supercat

または、読み取りがISRによってのみトリガーされることを確認します。次のISRがトリガーされる前に読み取りを実行するために1秒のギャップが生じます。
マジェンコ

イベントタイミングのニーズに合わせてRTC解像度を十分に設定できる場合は、可能な限り、リアルタイムクロックを1ティック/秒よりも速く実行するように設定し、それらを汎用イベントタイミングに使用することを好みます。したがって、すべてのRTCティックで常に割り込みが発生するとは限りません。さらに、アラームを設定する場合、アラームが設定されている瞬間のRTC時間を正確に把握し、RTCをポーリングして、アラームが設定されている間に動いたかどうかを確認することが重要です。32ビットチップベンダーが単に読み取り機能を備えた47ビットカウンターを提供しない理由はわかりません
...-supercat

...上位32ビットまたは下位31とクロック入力状態、同期遅延なしでいつでもオン/オフできるアラーム、およびアラームが発生したときにいつでも書き込むことができるアラームレジスタoff、アラームが有効なときにインクリメントが発生するとアラームが発生するというセマンティクスを使用します。チップが非同期ウェイクアップを受け入れることができ、ソフトウェアが適切な場合にポーリングをダブルチェックする場合、他のハードウェア同期は不要であり、ソフトウェアは他の形式のハードウェア同期に起因する問題を回避する必要はありません。
-supercat

9

3番目と2番目がより実行可能です。

3番目のアプローチは、ほとんどの場合に使用するものです。利点は、RAM内のRTCのミラーリングを心配する必要がないことです。潜在的な欠点は、シリアルバスを介してRTCに問い合わせると遅延が発生することです。1秒間に1回データを書き込む場合、この遅延はおそらく問題になりません。

第二のアプローチも良いです。デバイスが長時間実行されている場合、ミラークロックを維持すると、計時エラーが発生する場合があります。ミラークロックは、RTCから離れてドリフトする可能性があります。RTCを定期的に読んだ場合、ドリフトは累積しません。
ただし、割り込みサービスルーチン(ISR)自体でシリアル通信を行うことはお勧めしません。ISRでフラグを設定し、main()でシリアル通信を行います。

ps すべての場合で、DS1307を使用していました。


6

一部のRTC(たとえば、MC68HC68T1 [確かにほとんど誰も使用すべきではない])は、一貫した応答を提供するために、読み取られるときに内部カウントを一時停止します。中断を最小限に抑えるために、できるだけまれに読み取る必要があります。それらから1回読み取ってから、タイマー割り込みを使用してMCUのRAMに保存されている時間値を更新します。


そのようなデザインは心を震わせます。増分中に発生する読み取りがランダムデータを生成することは、回避する簡単な問題です。読み取りが原因でカウントが失われることは、失われたカウントを受け入れる場合を除いて回避できない問題です。
スーパーキャット

2
どうやらダブルバッファリングは、一部の人々がチップを設計するときに考えていないことです。
イグナシオバスケス-アブラムス

コードがポーリング時に値が変更されていないことを確認する場合、ダブルバッファリングの必要はありません。オンチップのリアルタイムクロックの場合、メインラインコードがそうするのと同時に割り込みがRTCを読み取ろうとしても、そのような繰り返し変更なしポーリングは機能します。一部のダブルバッファ設計では、安全に共存できるメインラインと割り込みコードを書くことが難しくなり、「役に立つ」と考えているものを見たことがありません。
-supercat

5

RTCは、独自のクリスタルを備えた個別のチップ、またはメインクロックとは別のタイムソース(32 kHzクリスタルなど)を備えたマイクロコントローラーに統合されたモジュールのいずれかであると想定します。また、RTCの時間ソースは、マイクロコントローラーの時間ソースよりも正確です。

RTCを読み取る必要がある頻度を判断するには、メインクロックで発生する可能性のある最大エラーを把握する必要があります。たとえば、メインクリスタルが20 ppmで指定されている場合、0.002%と同じです。したがって、メインクロックソースのみに基づいたクロックは、1日に0.00002 * 3600 * 24 = 1.728秒ドリフトする可能性があります。

したがって、RTCを1日に2回だけ読み取り、その間にタイマー割り込みを使用して1秒に1回時間をインクリメントすると、1秒以上オフになることはありません-RTCと比較して1秒以上オフになることはありません。

前述したように、RTCが独自の水晶を備えた個別のチップであるか、マイクロコントローラーと統合されたモジュールである場合、それが正しいという意味ではありません。RTCでもエラーが発生する可能性があります。たとえば、公差が5 ppmの32 kHzクリスタル(10 ppmのク​​リスタルよりもわずかに高価です)を使用している場合、1日あたり0.43秒(月あたり13秒)オフになる可能性があります。

これを回避するには、RTCを調整し、補正係数をレジスタに書き戻す必要があります。そうすることで、エラーを実質的にゼロにすることができます。ただし、チューニングを行う際の基準として使用する3つ目の外部クロックソースが必要です。米国では非常に正確な基準である60HzのACライン、ある保証であると正確に連続深夜の間に24時間の期間中に60 * 60 * 60 * 24(5184000)サイクル。これを有効にするには、60 Hzが真夜中にドリフトする可能性があるため、24時間全体の時間を計る必要があります。

もう1つの優れた時間基準は、GPSプロジェクトを使用している場合(10 nsの精度)、GPSを使用することです。

代わりに、セルラーネットワーク時間(AT + CCLK?呼び出し)などの外部ソース、またはNTPを使用するネットワークタイムサーバーからRTC時間を取得する場合、「調整」するものは何もないため、RTC値をそのまま使用できます。 。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.