いろいろなセンサーをマイコンにつないでみているのですが,そういえば日時の把握も必要だなと思い,リアルタイムクロックを使ってみました。
今回使ったリアルタイムクロック(RTC-DS1307)は以前にPICAXEのBASIC言語で経験済みで,バックアップ電池もついていて使いやすい秋月のモジュールです。
→ 時を刻むリアルタイムクロック(RTC)DS1307モジュールを試してみた
[機材]
MPU:ATtiny402
RTC:秋月 DS1307モジュール
Display:自作I2Cインターフェイス,1602型LCD
![](https://stat.ameba.jp/user_images/20231006/22/pta55/1b/b3/j/o1200050515347510568.jpg?caw=800)
☆基板に組む前にRTCモジュールに付属のコネクタコードを使ってブレッドボード配線で動作をみました。
どうも付属のコードが細くて長すぎたようで,最初は動作せず,原因を探してハマリました(^^;;;;;;。コードを半分に切って,やっと動きました。
![](https://stat.ameba.jp/user_images/20231006/22/pta55/96/e7/j/o1200055915347510565.jpg?caw=800)
[配線図]
・I2CのPull UpはDS1307かディスプレイのどちらかを使います。
・電源(VCC)は5Vです。
![](https://stat.ameba.jp/user_images/20231007/12/pta55/c5/ed/j/o0968077115347683041.jpg?caw=800)
[プログラムの概要]
・DS1307
I2Cアドレス:0x68 (7bit表記)
レジスタアドレス:0x00〜0x07
☆データはBCD (Binary Coded Decimal) 表現なのが注意点です。
各1バイトの上位4bitと下位4bitで10進数2桁の数値(00〜99)を表します。
例えば12月25日のデータは16進で0x12, 0x25なので書き込みは分かりやすいですね(^^)。
![](https://stat.ameba.jp/user_images/20231006/23/pta55/c9/3f/j/o1200047515347513681.jpg?caw=800)
・秒のBIT7(CH, Clock Halt?)を0にすると計時がスタートします。
普通に0x00〜0x59秒を書き込むと自然にスタートになりますね。
・時間のBIT6はここでは設定しないで0にしておき,PM/AM表現をしたければプログラムで24時間表現から変換する方がシンプルだと思います。
・曜日(DAY)は日曜から1で始まります。
[プログラム 1/2]
・曜日はポインタ配列にしてみました。
・時刻合わせの時だけinit_RTCで初期化します。
その後は電源を切ってもRTCは電池のバックアップで計時を続けているので,再度初期化しないように,初期化部をコメントアウトしてもう一度初期化無しのプログラムにしてスタートさせています。
![](https://stat.ameba.jp/user_images/20231006/23/pta55/df/c0/j/o0791084315347513535.jpg?caw=800)
[プログラム 2/2]
・DS1307からは各レジスタからバイト値を読み取り,BCD表現なので上位4bitの数値と下位4bitの数値をそれぞれ求めてアスキーに変換してLCDに送信しています(59-62行)。
![](https://stat.ameba.jp/user_images/20231007/12/pta55/8c/5c/j/o0998152415347683500.jpg?caw=800)
PICAXEでの経験があるのでホイホイと行くと思っていたのですが,,I2Cの接続ケーブルでハマってしまいました(^^;;;;;。
I2Cが Inter-Integrated Circuit で通信線は短かいに越した事はないというのは基本的なことですね。
リアルタイムクロックなどでは数値にBCD表現が多いみたいです。これは4bitデータバスの時代などと関係があるのか,素直な数値がそのままに表されるからなのか,,いろいろと想像していますが,さてどうでしょうかね(^^) 。
今回使ったリアルタイムクロック(RTC-DS1307)は以前にPICAXEのBASIC言語で経験済みで,バックアップ電池もついていて使いやすい秋月のモジュールです。
→ 時を刻むリアルタイムクロック(RTC)DS1307モジュールを試してみた
[機材]
MPU:ATtiny402
RTC:秋月 DS1307モジュール
Display:自作I2Cインターフェイス,1602型LCD
![](https://stat.ameba.jp/user_images/20231006/22/pta55/1b/b3/j/o1200050515347510568.jpg?caw=800)
☆基板に組む前にRTCモジュールに付属のコネクタコードを使ってブレッドボード配線で動作をみました。
どうも付属のコードが細くて長すぎたようで,最初は動作せず,原因を探してハマリました(^^;;;;;;。コードを半分に切って,やっと動きました。
![](https://stat.ameba.jp/user_images/20231006/22/pta55/96/e7/j/o1200055915347510565.jpg?caw=800)
[配線図]
・I2CのPull UpはDS1307かディスプレイのどちらかを使います。
・電源(VCC)は5Vです。
![](https://stat.ameba.jp/user_images/20231007/12/pta55/c5/ed/j/o0968077115347683041.jpg?caw=800)
[プログラムの概要]
・DS1307
I2Cアドレス:0x68 (7bit表記)
レジスタアドレス:0x00〜0x07
☆データはBCD (Binary Coded Decimal) 表現なのが注意点です。
各1バイトの上位4bitと下位4bitで10進数2桁の数値(00〜99)を表します。
例えば12月25日のデータは16進で0x12, 0x25なので書き込みは分かりやすいですね(^^)。
![](https://stat.ameba.jp/user_images/20231006/23/pta55/c9/3f/j/o1200047515347513681.jpg?caw=800)
・秒のBIT7(CH, Clock Halt?)を0にすると計時がスタートします。
普通に0x00〜0x59秒を書き込むと自然にスタートになりますね。
・時間のBIT6はここでは設定しないで0にしておき,PM/AM表現をしたければプログラムで24時間表現から変換する方がシンプルだと思います。
・曜日(DAY)は日曜から1で始まります。
[プログラム 1/2]
・曜日はポインタ配列にしてみました。
・時刻合わせの時だけinit_RTCで初期化します。
その後は電源を切ってもRTCは電池のバックアップで計時を続けているので,再度初期化しないように,初期化部をコメントアウトしてもう一度初期化無しのプログラムにしてスタートさせています。
![](https://stat.ameba.jp/user_images/20231006/23/pta55/df/c0/j/o0791084315347513535.jpg?caw=800)
[プログラム 2/2]
・DS1307からは各レジスタからバイト値を読み取り,BCD表現なので上位4bitの数値と下位4bitの数値をそれぞれ求めてアスキーに変換してLCDに送信しています(59-62行)。
![](https://stat.ameba.jp/user_images/20231007/12/pta55/8c/5c/j/o0998152415347683500.jpg?caw=800)
PICAXEでの経験があるのでホイホイと行くと思っていたのですが,,I2Cの接続ケーブルでハマってしまいました(^^;;;;;。
I2Cが Inter-Integrated Circuit で通信線は短かいに越した事はないというのは基本的なことですね。
リアルタイムクロックなどでは数値にBCD表現が多いみたいです。これは4bitデータバスの時代などと関係があるのか,素直な数値がそのままに表されるからなのか,,いろいろと想像していますが,さてどうでしょうかね(^^) 。