ソースはこんな感じ。
#define RXDUINO
#ifdef RXDUINO
#include <rxduino.h>
#else
#include <Arduino.h>
#endif
#include <Wire.h>
#define RTC_ADDRESS (0xa2 >> 1)
int rtc[16];
void setup() {
// シリアルポートを9600bpsで開始。
Serial.begin(9600);
// 受信バッファにデータが入るまで待機。
while (Serial.available() == 0);
Serial.println("Initializing...");
// 一旦、受信バッファにデータがあれば、
if (Serial.available() > 0) {
// 読み込んで、廃棄。
char c = Serial.read();
}
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);
// 日レジスタ。とりあえず、13日。
Wire.write(0x13);
// 曜日レジスタ。とりあえず、月曜日。
Wire.write(0x01);
// 月レジスタ。とりあえず、8月。
Wire.write(0x08);
// 年レジスタ。取りあえず、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 件のコメント:
コメントを投稿