レジスタの内容に関しては、アプリケーションノートなどが日本語なので助かりました。また、ArduinoでI2Cを使ってみるのが初めてだったので、前述のPIC AVR 工作室のサイトが大変参考になりました。実際、以下のテストに使ったスケッチも、当該サイトのものをほぼいただいてきたものです。感謝。
まずは、接続。ブレッドボード(他の実験中の領域の隙間ですが・・・)にRTCモジュールを載せて、電源、GND、SDA、SDCをつなぐだけですが、SDA、SDCは1kとか2.2kの抵抗でプルアップしておきます。SDAはArduinoのAN4端子、同SDCはAN5端子に接続します。
前述のサイトにあったソースを参考(というか、ほぼそのまま)にさせていただいたスケッチを書き込んで、動作確認。とりあえず、日時の初期値はスケッチ中で固定値(日付が変わる直前くらいの)を入れて、動きを見ました。
時間の経過とともに、時間、日付、曜日などが更新されているところがわかります。流用元さんに感謝しつつ、以下、スケッチのソースです。
#include "Arduino.h"
#include "Wire.h"
#define RTC_ADDRESS (0xa2 >> 1)
int rtc[16];
void setup() {
Serial.begin(9600);
Serial.println("Initializing RTC unit...Please wait...");
delay(1000);
// Bus-MasterとしてI2Cを開始。
Wire.begin();
// RTCへの送信準備開始。
Wire.beginTransmission(RTC_ADDRESS);
// はじめにアドレス0x00を指定。次からはオートインクリメント。
Wire.write(0x00);
// コントロールレジスタ1。
Wire.write(0x00);
// コントロールレジスタ2。
Wire.write(0x00);
// 秒レジスタ。とりあえず、58秒。
Wire.write(0x58);
// 分レジスタ。とりあえず、59分。
Wire.write(0x59);
// 時レジスタ。とりあえず、23時。
Wire.write(0x23);
// 日レジスタ。とりあえず、23日。
Wire.write(0x23);
// 曜日レジスタ。とりあえず、月曜日。
Wire.write(0x01);
// 月レジスタ。とりあえず、7月。
Wire.write(0x07);
// 年レジスタ。取りあえず、12年。
Wire.write(0x12);
// アラーム設定。なし。
Wire.write(0x00);
Wire.write(0x00);
Wire.write(0x00);
// Clock出力設定。1Hz。
Wire.write(0x83);
// キューの送信。通信終了。
Wire.endTransmission();
delay(20);
Serial.println("RTC Initialized.");
}
void loop() {
// I2C通信開始。
Wire.beginTransmission(RTC_ADDRESS);
// レジスタアドレス0x00を指定。
Wire.write(0x00);
// キューの送信。
Wire.endTransmission();
// データ要求。
Wire.requestFrom(RTC_ADDRESS, 16);
// データ受信。
for (int i = 0; i < 16; i++) {
while (Wire.available() == 0);
rtc[i] = Wire.read();
}
// (西暦)年。以下、数値類はBCD。
Serial.print("20");
Serial.print(rtc[8], HEX);
Serial.print("/");
// 月。下位9bit。
Serial.print(rtc[7] & 0x1f, HEX);
Serial.print("/");
// 日。下位10bit。
Serial.print(rtc[5] & 0x3f, HEX);
Serial.print(" ");
// 曜日。
switch (rtc[6] & 0x07) {
case 0:
Serial.print("Sun");
break;
case 1:
Serial.print("Mon");
break;
case 2:
Serial.print("Tue");
break;
case 3:
Serial.print("Wed");
break;
case 4:
Serial.print("Thr");
break;
case 5:
Serial.print("Fri");
break;
case 6:
Serial.print("Sat");
break;
default:
Serial.print(" ");
break;
}
Serial.print(" ");
// 時。
Serial.print(rtc[4] & 0x3f, HEX);
Serial.print(":");
// 分。
Serial.print(rtc[3] & 0x7f, HEX);
Serial.print(":");
// 秒。
Serial.print(rtc[2] & 0x7f, HEX);
Serial.println();
delay(200);
}


0 件のコメント:
コメントを投稿