時刻設定のため変更する桁を示す方法
時刻の設定を行うために、LCDの日付、時刻の変更対象の桁を点滅させることを考えます。この時刻設定時の日付、時刻の設定を次のようにします。
YY/MM/DD N
HH:MM:SS s
16桁2行表示で各設定値を1文字ずつ設定していきます。
時刻の設定モードの処理
ボタンを二つ用意し、Aボタンを押すと、該当する桁の値を一つ進め、上限を超えたらもとに戻ります。Bボタンは桁を1桁進めます。
この時刻の設定モードで最初に設定する値は上段左端のYYの左の桁からとなります。YYの2桁の後は/を飛ばしてMMを順番に設定し再度/を飛ばしてDDの日付をを設定します。その後0から6の値で曜日を設定します。曜日の設定を終えたら、下の行の時間から順番に設定します。
RTCからデータを読み取り該当する桁の表示を点滅する方法について検討します。
RTC-8564NBのデータの確認
RTC-8564NBをリアルタイム・クロックのカレンダとして取り扱うための、留意事項をまとめます。詳細はエプソントヨコムの製品のページのアプリケーションマニュアルに詳しく説明されています。アラーム機能、インターバル・タイマ、クロックの発生などについてはそちらを参照してください。
I2Cのアドレス
RTC-8564NBのI2Cのアドレスは、0x51と設定されています。このアドレスは、次に示すようにグローバル定数として定義します。
byte RTC8564_ADDRESS=0x51;
Wire.requestFrom()、Wire.beginTransmission()の関数でI2Cのスレーブ・アドレスの設定には、このRTC8564_ADDRESSを使用します。
RTC-8564NBのレジスタ
コントロール・レジスタ0x00
RTC-8564のレジスタは、アドレス0x00から0x0Fのアドレスをもつレジスタが用意されています。アドレス0x00と0x01は共にコントロール・レジスタで、0x00はテストとRTCを停止する機能が用意されています。bit3とbit7がTESTビットで、メーカが使うビットで使用時には0にします。bit5はSTOPビットでこのビットを1にすると時計、カレンダ、アラーム、タイマが停止します。そのため、このタイマを使用する場合、初期化処理の中でコントロールレジスタに0x00を書き込みます。
コントロール・レジスタ0x01は割り込みに関するレジスタで、bit0がTIEビットでタイマの割り込み制御のビットで1にするとイベント時に割り込みが発生します。bit1はAIEでこのビットを1にするとアラーム割り込みのイベント時に割り込みを発生します。今回は使用しません。
時計カウンタのレジスタ
アドレス0x02~0x04は、時分秒の時計のためのカウンタとなっています。
アドレス0x02 秒のカウンタ
bit0からbit3で0から9秒までの値を示します。10秒になるとbit4~bit6の10秒の桁に桁上がりします。BCD(Binary Coded Decimal)のコードとなっています。bit7はVL(Voltage Low Flag)ビットでこのRTCに加わる電源電圧が規定の電圧より低下し内容が保障されなく初期化の設定が必要なことが示されます。
アドレス0x03 分のカウンタ
bit0からbit3で0から9分までの値を示します。10分になるとbit4~bit6の10分の桁に桁上がりします。BCD(Binary Coded Decimal)のコードとなっています。
アドレス0x04 時のカウンタ
bit0からbit3で0から9時までの値を示します。10時になるとbit4~bit5の10時の桁に桁上がりします。BCD(Binary Coded Decimal)のコードとなっています。
カレンダのカウンタ
アドレス0x05から0x08まではカレンダの年月日と曜日のためのカウンタとなっています。
アドレス0x05 日のカウンタ
bit0からbit3で0から9日までの値を示します。10日になるとbit4~bit5の10日の桁に桁上がりします。BCD(Binary Coded Decimal)のコードとなっています。
アドレス0x06 曜日のカウンタ
日曜日から土曜日まで0から6の値が割り当てられ、このレジスタのbit0~bit2の3ビットで曜日を示します。
アドレス0x07 月のカウンタ
bit0からbit3で0から9までの月の値を示します。10月になるとbit4の10月以上の桁に桁上がりします。BCD(Binary Coded Decimal)のコードとなっています。
アドレス0x08 年のカウンタ
bit0からbit3で0から9年までの値を示します。10年になるとbit4~bit7の10時の桁に桁上がりします。BCD(Binary Coded Decimal)のコードとなっています。00年から99年まで表示できます。
RTC8564の特定のレジスタの値を読み書きする関数
RTC8564のレジスタの値を指定して時、分、秒または年、月、日などのデータを個々に読んだり、書き込んだする関数を作ります。
最初に、必要なヘッダ・ファイルを呼び出し、グローバルな定数および変数を定義します。
#include <LiquidCrystal.h>
#include <Wire.h>
byte RTC8564_ADDRESS=0x51;
byte indata;
レジスタ・アドレスを引数として渡すと、該当のレジスタの値を戻しデータとして返す関数get_RTC8564_dataを作ります。
RTCの値を1バイト読み出す関数
関数の型はbyte型です。RTC8564のアドレスを指定し、I2CインターフェースでRTC8564にアクセスし、data_noにセットされたアドレスを指定して該当レジスタが読み書きできるようにします。その後、該当レジスタの値を読み出します。
byte get_RTC8564_data(byte data_no){
Wire.beginTransmission(RTC8564_ADDRESS);
Wire.send(data_no);
Wire.endTransmission();
byte n=1;
Wire.requestFrom(RTC8564_ADDRESS,n);
return Wire.receive();
}
RTCのレジスタに値をセットする関数
data_noで指定したRTC8564のレジスタに1バイトのset_dataを書き込む関数です。RTC8564のアドレスを指定してI2C通信を開始し、RTC8564にレジスタ・アドレスと書き込みデータを1バイト書き込み完了しています。
void set_RTC8564(byte data_no,byte set_data){
Wire.beginTransmission(RTC8564_ADDRESS);
Wire.send(data_no);
Wire.send(set_data);
Wire.endTransmission();
}
表示位置を指定してLCDに1文字データを書き込む関数
byte pos_col,byte pos_rowで指定された16文字2行表示のLCDモジュールに1バイトのデータを表示する関数です。書き出すデータはp_dataにセットしてこの関数に渡す。blink_modeを1にすると表示を指定した場所が点滅します。
void lcd_print_set(byte p_data,byte pos_col,byte pos_row,byte blink_mode){
lcd.setCursor(pos_col,pos_row);
if( blink_mode==1){
lcd.blink();}
else{
lcd.cursor();
}
lcd.print(p_data,DEC);
lcd.setCursor(pos_col,pos_row);
} テスト・スケッチのメイン部分です。setup()では各ライブラリの初期を行い、RTC8564のコントロール・レジスタの値を0x00にしてRTCをスタートしています。 void setup(){
lcd.begin(16,2);
Wire.begin();
Wire.beginTransmission(RTC8564_ADDRESS);
Wire.send(0x00);
Wire.send(0x00);
Wire.endTransmission();
} 次のloop()関数ではRTC8564の時計、カレンダのレジスタの読み書きのテストを行っています。レジスタ・アドレス2から8まで順番に読み出し、2行目13番目の位置に読み出した結果を表示しています。次に読み出した結果に1を加算してレジスタに書き込み、再度呼び出して表示しています。レジスタ・アドレスを示す変数 iを2行目7番目の位置に表示しています。このテストで各関数の動作のテストを行います。 void loop(){
for (byte i=2;i<9;i++){
lcd_print_set(i,6,1,0);
indata=get_RTC8564_data(i)& 0x0F;
lcd_print_set(indata,12,1,1);
delay(1000);
indata++;
set_RTC8564(i,indata);
indata=get_RTC8564_data(i)&0x0F;
lcd_print_set(indata,12,1,1),
delay(1000);
}
delay(1500);
}
次回このスケッチのテストを行い、具体的な時刻、日付のセットの具体的な方法の検討を続けます。





コメントする