パーツ解説

リアルタイムクロック DS1307 の使い方

投稿日:2021-08-14 更新日:

今回は秋月電子で販売されているこちらのリアルタイムクロック(以下RTC)のDS1307について紹介します。

RTCとは

まずはRTCについて説明します。電子工作で「クロック」といえば、普通は 〇Hzのような一定の周波数の信号のことを指すことが多いですが、RTCは〇時〇分といった時刻を数えています。PIC等のマイコンで時計を作ろうとしたときに、一定の周波数の信号を数えれば時刻を計算することが出来ますが、その仕事をやってくれるICがRTCです。RTCを使用することでPICは他の計算に専念できたり、RTCにバックアップ電源を供給することでPICの電源を切っても時刻を保持できたりといった利点があります。

 

DS1307の特徴

秋月電子で取り扱っているものだけでもいくつかのRTCがありますが、DS1307の特徴としては以下のものが挙げられます。

  • I2C接続
  • バックアップ電源専用ピンあり
  • 外付けの水晶発振子が必要

まずはインターフェースですが、I2C接続なので2本の信号線で接続できて便利です。

次に、バックアップ電源の専用ピンがついています。これがない場合は、主電源とバックアップ電源を切り替えたり逆流を防止したりする必要が生じますが、そのような問題を気にすることがなくなるのでとても便利です。

バックアップ電源には3Vのリチウム電池を繋ぐのが手軽で確実です。他にもダイオードとコンデンサを使って主電源から貯めておくという手段もあります。(主電源は5Vなので注意)

注意点としては、クロック源として32.768kHzの水晶発振子を外付けする必要があります。ただ水晶発振子は秋月電子で30円で買えますし、実装スペースも大して必要ないので、それほど気にすることでもないと思います。

 

レジスタ

ここからは実際の制御に必要な情報を見ていきます。DS1307のレジスタは次のようになっています。

00h ~ 06hに日付や時刻のデータが入っていて、07hが設定のレジスタとなっています。08h ~ 3Fhは自由に使えるRAMになっていて、バックアップ電源によって疑似的に不揮発メモリとして使っても良いかもしれません。

 

データはBCD (Binary Coded Decimal) という形になっていて、8ビットのうち上位4ビットが10の位、下位4ビットが1の位となっています。

扱いにくいと思うかもしれませんが、7セグLEDなど一桁ずつ制御する場合には都合が良いのだと思います。

 

次に「時」についてですが、12時間表示と24時間表示の好きな方を選べるようになっています。Hoursレジスタのbit 6が0であれば24時間表示、1であれば12時間表示となります。12時間表示の場合、10の位は1bitで足りるので、bit 5はPM/AMとなります。普通のBCD形式でデータを入力すれば、10の位の数は高々2なのでbit 6は0となり、24時間表示になります。

 

曜日を表すDayレジスタは1~7の値を取りますが、何曜日がどの数字かは決まっていないので、月曜始まりでも日曜始まりでも好きなように決めていいです。

 

ControlレジスタはSQW/OUTピンの矩形波出力に関するピンで、RSは周波数の設定、SQWEは矩形波出力のON/OFF、OUTは矩形波出力がOFFの場合の出力を設定します。(下図参照)

1Hzの矩形波はSecondsレジスタと同期しているので、これをマイコンに送れば秒まで同期可能です。

 

最後に、Secondsレジスタのbit 7にCH (Clock Halt) ビットがあります。リセット後はこのビットが1になっていてクロックが動かないので、必ず0にする必要があります。(私はこれに気付かず4~5時間頭を悩ませていました。なんでControlレジスタに入っていないんだよ~)

 

プログラム

DS1307と通信してデータを送受信するライブラリのようなものを書いてみました。

日付や時刻のデータは通信の簡単のために配列として、インデックスを定数として定義することで、例えば秒だったらdateTime[SEC] のように使うことにしました。

また、BCDのデータをそのままインクリメントする関数や、BCDと普通の数字を変換する関数も一応用意しておきました。

この中で使っているI2Cライブラリについてはこちらの記事をご覧ください。

▼I2Cライブラリ

今回の記事は以上です。ご覧いただきありがとうございました。

この記事では都合上実際に動作テストはしていませんが、このICを使って卓上時計を作ったので実例はこちらをご覧ください。https://rikeden.net/?p=697

 

-パーツ解説

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

aitendoのI2CキャラクタLCDが安くて便利

ブレッドボード上で情報を表示したり簡易的なデバッグをしたりするのに便利なのがキャラクタLCDです。 今回はaitendoで販売されているこちらのLCDを使ってみました。 ちなみに以前秋月電子のLCDを …

圧電素子とPICマイコンで振動センサー

この記事では圧電素子(ピエゾ素子)を使用してPICマイコンで振動を検出する方法を解説します。   目次1 使用するもの2 圧電素子とは3 圧電効果を見てみる4 PICマイコンで振動検出5 応 …

ロータリーエンコーダの使い方

今回はPICで ロータリーエンコーダ を使ってみたので、使い方や制御するためのポイントを紹介します。 目次1 ロータリーエンコーダとは2 信号3 チャタリング4 実験5 あとがき ロータリーエンコーダ …

PICで128x64グラフィックLCDを使ってみる

今回はAliExpressで買った128×64のグラフィックLCDを使ってみました。使用したPICはPIC16F18857です。 400円ぐらいで安かったのはいいですが、データシートや型番が不明なので …

APDS-9960のRGBセンサーを使ってみる

前々回のジェスチャーセンサー、前回の近接センサーに引き続き、APDS-9960の最後の機能である照度・RGBセンサーを使ってみました。 最初に言っておきますが、今回は動作確認程度のかなり適当な内容にな …