ソースはこんな感じ。
#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 件のコメント:
コメントを投稿