Sahara's WebLog

日記のような、備忘録のような、うらみつらみのような、自慢のような…。

Real Time Clock Module ( DS1307 + AT24C32 ) + PIC18F2550 + SC1602B

20150302003457Real Time Clock Module は「Real Time Clock Module ( DS1307 + AT24C32 ) + Arduino UNO + Arduino IDE 1.0.5-r2」でArduinoを使って動作確認したっきっり放置してあったもの。

これをPIC18F2550で動かしてみた。
I2CはBit Bangingで実装したいところだが、まずは物真似なので、I2Cを装備しているPICを使う。
それに加えてLCD用にI/Oが6本用意できれば他のPICでも動くとは思う。
参考にしたのはこのサイト
上のサイトで使っているPICはPIC18F2620というものだが、手持ちになかったので同じF18で28ピンの物ってことで、PIC18F2550にしてみた。
あと、LCDへの表示に MPLAB C Compiler Libraries for PIC18 MCUs に含まれている LCD Function を使っているのを「PIC16F84A + SC1602BS + XC8」で使ったものに変更した。
PIC18F2620を使っている元の回路ではRB0~RB3をLCDのデータ用に割り当てているが、PIC18F2550ではRB0とRB1にI2C用のSDAとSCLが割り当てられていて、I2Cを優先するためにLCD用には使えない。
ところが LCD Function でピンの割り当てを変更する方法がよく分からなかったので、使い慣れたコードを流用することにした。
表示部分を該当するものに機械的に置き換えるだけなのでそれほど面倒ではない。

電源関係を除く配線は以下のとおり。
RB4~RB7 D4~D7(SC1602B)
RB2 Enable(SC1602B)
RB3 RS(SC1602B)
SCL SCL(RTC Module)
SDA SDA(RTC Module)


※改良
実際に動かしてみたら、時刻などの設定をする時に現在どの値を設定している最中なのかが分りにくかったので、その部分だけ少し改良した。
改良前と改良後

RC0に接続してあるタクト・スイッチの押下で設定モードに入るが、その際にLCDの右下隅に文字を表示するようにした。
下の写真は「月」を設定している最中であることをあらわす「M」が表示されているところ。
20150302012140


※修正
時間の設定に不具合があった。
きっちり確認したわけではないが、12時間制を前提にプログラムされていて、うちのモジュールが24時間制に設定されているせいでおかしくなるような気がした。
そのため、起動時に強制的に12時間制に設定するコードを追加した。
アドレス0x02のBIT6をHighにすると12時間制になる。
while( SSPCON2bits.SEN );
の後に次の3行を追加する。
hour = read_ds1307(0x02);//0x02を読み込む
hour = hour | 0b01000000;//BIT6だけを変更して1にする
write_ds1307(2, hour); //0x02に書き戻す


※追加
曜日を表示するコードを追加した。
ddayはもともと宣言もされていて値も読み込まれているのに使われていない。
つまり、下の関数を追加してどこか適当なところで呼び出すだけでいい。

20150302043236
ちなみに、曜日は時間が午前0時をまたいだ時にだけ変更される。
日付だけを変更してもすぐには反映されない。
午前0時をまたいで変更されても正しい曜日に自動的に変わるわけではなく、前の曜日から次の曜日に変わるだけ。


※追加
曜日を変更できるようにした。
変更モード時の表示用文字列を以下のように変更する。
char disp[] = “hmsDMYd”;
「hms」は「時分秒」、「DMY」は「日月年」で、「d」は「曜日」を表す。

項目が1つ増えたのでswitch文用のカウントを1つ増やす。
if(set_count >= 8)

switch文に以下のcaseを追加する。

RTC内部では数値をBCD(Binary-coded decimal)で扱っているので、値の増減には普通のBinaryに直す必要がある。
ところが、曜日はどうせ7種類しかないので1桁で納まるから、BinaryもBCDも同じことになる。
つまり、BinaryとBCDの相互の変換処理が不要で、ちょっと楽した気分だ。

プリント基板を作成した。
Real Time Clock Module ( DS1307 + AT24C32 ) + PIC18F2550 プリント基板作成

このエントリーをはてなブックマークに追加

Posted under: 8 bit, I2C, MPLAB X, PIC Hardware, PIC18F2550, 電子工作その他


コメントを残す

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

Time limit is exhausted. Please reload CAPTCHA.