年の瀬に,時を刻むリアルタイムクロック(RTC)DS1307を試してみました。
ネット接続があれば日時は捉えられますが,無線機能のない小さなマイコンではRTCが応用が効きそうです。
使用したのは秋月の「DS1307使用 I2C接続RTCモジュール」で,PICAXE-08M2とつないでみました。見た目どちらがマスターか分かりません(^^;;;;
![](https://stat.ameba.jp/user_images/20201226/18/pta55/c5/45/j/o0997062014872250822.jpg?caw=800)
このモジュールは電池のバックアップが裏面についていて便利です(^^)。
![](https://stat.ameba.jp/user_images/20201226/18/pta55/27/0e/j/o0789051014872250821.jpg?caw=800)
今回の組み合わせの概要です。
配線はI2C接続なのでシンプルです。
![](https://stat.ameba.jp/user_images/20201226/18/pta55/8b/25/j/o1200080114872253777.jpg?caw=800)
簡単なプログラムで初期設定し,電源を切ってしばらく置いて,,,様子を見てみました。
ちゃんとバックアップは動いてくれているようでした。
![](https://stat.ameba.jp/user_images/20201226/18/pta55/df/42/j/o0692028414872257141.jpg?caw=800)
それでも心配なので(^^;;;,今朝まで電源を切っておいてチェックしてみました。
![](https://stat.ameba.jp/user_images/20201226/18/pta55/dd/59/j/o0697026214872258769.jpg?caw=800)
うむ,ちゃんと日付も曜日も変わっていて大丈夫そうです(^^)。
テストプログラムは初期設定とデータ読み込みを兼ねていて,最初の回だけ初期設定し,2回目からはデータ読み込みだけ行っています。
start:のhi2coutから始まる4行目が初期設定の行で,2回目からはコメントアウトしたプログラムを入れています。
![](https://stat.ameba.jp/user_images/20201226/18/pta55/c2/7f/j/o1200110914872260073.jpg?caw=800)
ま,こういう初期設定では秒から合わせるのは無理ですね(^^;;;;;;;;
以下,DS1307のレジスタ構成と注意点の覚書です。
1.全レジスタとアドレス
今回使用したDS1307というRTCは秒,分,時,曜日,日,月,年の7byteのレジスタと矩形波出力のコントロールレジスタ1byteという構成になっていてシンプルです。
ただ,データ形式が4bitで10進法の1桁を表現するBCD(Binary-Coded Decimal)です。どこか懐かしい響きのBCD形式ですがそこに少しコントロールbitも含まれているので注意が必要です。
![](https://stat.ameba.jp/user_images/20201226/19/pta55/9f/84/j/o1200052614872279547.jpg?caw=800)
BCDでは1byteでも00から99まで10進法2桁の数値しか表現できませんが,どうもこれはRTCに多いらしいです。4bit処理のシステムや1桁ずつ0から9を表示する時計には相性が良いのかもしれませんね。
2.秒,分,時のレジスタ (アドレス 0x00-0x02)
秒のBit7は[CH] 信号として時計の休止とスタートを担当しています。デフォルトが1なので,0を書き込まないと時計がスタートしません。
時の上位bitには24時間表示とAM/PM表示の切り替え機能が含まれています。デフォルトは24時間表示でその方が数値がそのまま読めて簡単ですね。
![](https://stat.ameba.jp/user_images/20201226/19/pta55/92/93/j/o1200056714872282881.jpg?caw=800)
3.曜日,日,月,年のレジスタ (アドレス 0x03-0x06)
ここにはコントロールに関するbitがないので,そのまま数値が読めます。曜日は日曜から始まります。
![](https://stat.ameba.jp/user_images/20201226/19/pta55/c2/81/j/o1200037914872301802.jpg?caw=800)
4.タイムベースパルス出力のコントロールレジスタ (アドレス 0x07)
このレジスタは特に時計機能とは直接関係なく一定の周期のパルスを提供するSQW/OUT pin出力のコントロールです。
今回はデフォルトの0x00のままで,触っていませんが,LED点滅とか割り込みとかベースクロックとかに使うのでしょうかね,,。
![](https://stat.ameba.jp/user_images/20201226/20/pta55/0f/dc/j/o1200068314872306503.jpg?caw=800)
5.BCD形式のデータの取り扱い
BCDはいつもと少々勝手が違いますが,10進数を1桁ずつ扱うには便利な形式でしょう。
ただ1byteは8bitなので,上位4bitに1桁,下位4bitに次の1桁が入っています。
PICAXEのBASICでは1byteに含まれるBCD2桁の数値を各桁のアスキーコードに変換して別々の変数に代入する,という何やら古いのか新しいのか分からない関数があります(^^;;;;;;;;
上のプログラムでも使っている
bcdtoascii hoursVal, b1,b0
というような関数で,hoursValという1byteの変数の上位4bitの10進数の文字のアスキーコードが変数b1に入り,b0には下位4bitのが入ります。
Arduino言語だとこういう作業は
hoursValがbyte変数だとして
byte b1=hoursVal/16+0x30;
byte b0=(hoursVal & 0x0F)+0x30;
数値計算用に変換するのなら
byte b3=hoursVal/16*10+(hoursVal & 0x0F);
というぐらいになるのでしょうかね,,。
久しくプログラムをしていなかった私にとって,何十年ぶりかで触れたBCD形式はなんだか懐かしい思いがしました。
ちなみにバックアップ電池は机上の計算では上手くいくと8年は持つ事になるのですが,,はて,それまで私自身がまだ1里塚をいくつ通過して行っているかどうかの方が分からないですね(^^;;;;;;;
今年はなんとか年が変わるのが見られるかな(^^)。
ネット接続があれば日時は捉えられますが,無線機能のない小さなマイコンではRTCが応用が効きそうです。
使用したのは秋月の「DS1307使用 I2C接続RTCモジュール」で,PICAXE-08M2とつないでみました。見た目どちらがマスターか分かりません(^^;;;;
![](https://stat.ameba.jp/user_images/20201226/18/pta55/c5/45/j/o0997062014872250822.jpg?caw=800)
このモジュールは電池のバックアップが裏面についていて便利です(^^)。
![](https://stat.ameba.jp/user_images/20201226/18/pta55/27/0e/j/o0789051014872250821.jpg?caw=800)
今回の組み合わせの概要です。
配線はI2C接続なのでシンプルです。
![](https://stat.ameba.jp/user_images/20201226/18/pta55/8b/25/j/o1200080114872253777.jpg?caw=800)
簡単なプログラムで初期設定し,電源を切ってしばらく置いて,,,様子を見てみました。
ちゃんとバックアップは動いてくれているようでした。
![](https://stat.ameba.jp/user_images/20201226/18/pta55/df/42/j/o0692028414872257141.jpg?caw=800)
それでも心配なので(^^;;;,今朝まで電源を切っておいてチェックしてみました。
![](https://stat.ameba.jp/user_images/20201226/18/pta55/dd/59/j/o0697026214872258769.jpg?caw=800)
うむ,ちゃんと日付も曜日も変わっていて大丈夫そうです(^^)。
テストプログラムは初期設定とデータ読み込みを兼ねていて,最初の回だけ初期設定し,2回目からはデータ読み込みだけ行っています。
start:のhi2coutから始まる4行目が初期設定の行で,2回目からはコメントアウトしたプログラムを入れています。
![](https://stat.ameba.jp/user_images/20201226/18/pta55/c2/7f/j/o1200110914872260073.jpg?caw=800)
ま,こういう初期設定では秒から合わせるのは無理ですね(^^;;;;;;;;
以下,DS1307のレジスタ構成と注意点の覚書です。
1.全レジスタとアドレス
今回使用したDS1307というRTCは秒,分,時,曜日,日,月,年の7byteのレジスタと矩形波出力のコントロールレジスタ1byteという構成になっていてシンプルです。
ただ,データ形式が4bitで10進法の1桁を表現するBCD(Binary-Coded Decimal)です。どこか懐かしい響きのBCD形式ですがそこに少しコントロールbitも含まれているので注意が必要です。
![](https://stat.ameba.jp/user_images/20201226/19/pta55/9f/84/j/o1200052614872279547.jpg?caw=800)
BCDでは1byteでも00から99まで10進法2桁の数値しか表現できませんが,どうもこれはRTCに多いらしいです。4bit処理のシステムや1桁ずつ0から9を表示する時計には相性が良いのかもしれませんね。
2.秒,分,時のレジスタ (アドレス 0x00-0x02)
秒のBit7は[CH] 信号として時計の休止とスタートを担当しています。デフォルトが1なので,0を書き込まないと時計がスタートしません。
時の上位bitには24時間表示とAM/PM表示の切り替え機能が含まれています。デフォルトは24時間表示でその方が数値がそのまま読めて簡単ですね。
![](https://stat.ameba.jp/user_images/20201226/19/pta55/92/93/j/o1200056714872282881.jpg?caw=800)
3.曜日,日,月,年のレジスタ (アドレス 0x03-0x06)
ここにはコントロールに関するbitがないので,そのまま数値が読めます。曜日は日曜から始まります。
![](https://stat.ameba.jp/user_images/20201226/19/pta55/c2/81/j/o1200037914872301802.jpg?caw=800)
4.タイムベースパルス出力のコントロールレジスタ (アドレス 0x07)
このレジスタは特に時計機能とは直接関係なく一定の周期のパルスを提供するSQW/OUT pin出力のコントロールです。
今回はデフォルトの0x00のままで,触っていませんが,LED点滅とか割り込みとかベースクロックとかに使うのでしょうかね,,。
![](https://stat.ameba.jp/user_images/20201226/20/pta55/0f/dc/j/o1200068314872306503.jpg?caw=800)
5.BCD形式のデータの取り扱い
BCDはいつもと少々勝手が違いますが,10進数を1桁ずつ扱うには便利な形式でしょう。
ただ1byteは8bitなので,上位4bitに1桁,下位4bitに次の1桁が入っています。
PICAXEのBASICでは1byteに含まれるBCD2桁の数値を各桁のアスキーコードに変換して別々の変数に代入する,という何やら古いのか新しいのか分からない関数があります(^^;;;;;;;;
上のプログラムでも使っている
bcdtoascii hoursVal, b1,b0
というような関数で,hoursValという1byteの変数の上位4bitの10進数の文字のアスキーコードが変数b1に入り,b0には下位4bitのが入ります。
Arduino言語だとこういう作業は
hoursValがbyte変数だとして
byte b1=hoursVal/16+0x30;
byte b0=(hoursVal & 0x0F)+0x30;
数値計算用に変換するのなら
byte b3=hoursVal/16*10+(hoursVal & 0x0F);
というぐらいになるのでしょうかね,,。
久しくプログラムをしていなかった私にとって,何十年ぶりかで触れたBCD形式はなんだか懐かしい思いがしました。
ちなみにバックアップ電池は机上の計算では上手くいくと8年は持つ事になるのですが,,はて,それまで私自身がまだ1里塚をいくつ通過して行っているかどうかの方が分からないですね(^^;;;;;;;
今年はなんとか年が変わるのが見られるかな(^^)。