wiki:PCF2129AT

Version 5 (modified by kishida, 8 years ago) ( diff )

--

RTCクロックモジュール PCF2129AT の使い方

PCF2129AT SPI/I2C接続リアルタイムクロック・モジュール の使い方説明と、 サンプルプログラムです。 メーカーからデータシート(pdf)も公開されています。

RTCとは、内部に専用のオシレータなどを組み込んだ、 電源が供給されている限り時間を刻み続ける部品のことです。 主に時計機能などに使われます。

PCF2129ATは、年(西暦2桁)・月・日・曜日・時・分・秒を刻むことができます。


使い方

本製品はI2C又はSPIで制御されます。 通信方式によって配線が変わるのでデータシートを参照してください。

以下の記事ではI2Cでの配線を前提に記述します。

下の画像はI2C通信での実体配線図です。

販売している基板の裏には1608サイズのチップ抵抗を実装可能にしてあります。 この配線図内では表面実装抵抗を利用した場合のものです。

一般的な1/4W炭素皮膜抵抗などを利用する場合はSDA、SCLをそれぞれ1KΩ程度でプルアップしてください。

通信方法

I2C通信

I2C通信の詳細を記載します。

送信

メーカー公開のデータシートよりプロトコル図を抜粋しました。

fig37

1.データ書き込みモードでスレーブのデバイスIDを書き込みます。
0xA2は8bitでのアドレスです。ArduinoのWireライブラリを利用する際は7bit表記のアドレで0x51になります。

2.データを書き込みたいレジスタアドレスを送信します。

3.書き込みたいデータを送信します。こちらは連続で書き込むと内部で自動的にレジスタアドレスをインクリメントしてくれます。レジスタアドレスのインクリメントは、0x1Bの次に自動的に0x00に戻ります。

4.通信を終了します。

以下に、本ページで紹介しているライブラリの一部を抜粋します。

void PCF2129AT::dataSend(int id,int reg,int *data,int datasize)
{
  Wire.beginTransmission(id);
  Wire.write(reg);
  for(int i=0;i<datasize;i++)
  {
    Wire.write(data[i]);
    //Serial.print("data sended : "); //debug
    //Serial.println(data[i], BIN); //debug
  }
  Wire.endTransmission();
}

受信

メーカー公開のデータシートよりプロトコル図を抜粋しました。

fig38

1.データ書き込みモードでスレーブのデバイスIDを書き込みます。
0xA2は8bitでのアドレスです。ArduinoのWireライブラリを利用する際は7bitのアドレスが0x51になります。

2.データを読みだすレジスタアドレスを書き込みます。

3.ここで通信を終了します。Wire.endTransmission(true);とすることでストップビットを送信することができます。
通信を終了しないデバイスのほうがどちらかと言えば多い印象です。

4.再度通信を開始し、受信モードでデバイスIDを書き込みます。Wireライブラリを利用する際は読み取るバイト数を指定することができます。

5.データを受信し、通信を終えます。

手順3にてストップビットを送信しないまま読みだすと、PCF2129AT内部レジスタが1インクリメントされた状態で読み取りを開始するので注意が必要です。

以下に、本ページで紹介しているライブラリの一部を抜粋します。

void PCF2129AT::dataRead(int id,int reg,int *data,int datasize)
{
  //Serial.print("transmission begin");//debug
  Wire.beginTransmission(id);             //スレーブアドレス送信,書き込みモード
  Wire.write(reg);                        //レジスタアドレス送信
  Wire.endTransmission(true);            //STOPコンディションを送る
  //STOPコンディションを送る仕様
  Wire.requestFrom(id, datasize, false);  //スレーブアドレス送信,受信モード,
  for(int i=0;i<datasize;i++)
  {
    data[i] = Wire.read();
    //Serial.print("data recived : ");//debug
    //Serial.println(data[i], BIN);//debug
  }
  Wire.endTransmission(true);
  //Serial.println("transmission end");//debug
}

内蔵機能

  • アラーム
  • ウォッチドッグタイマ
  • タイムスタンプ
  • 割り込み出力
  • バックアップ用電源用端子

サンプルプログラム

Arduinoを起動た際に一度だけ走るsetup()内部で設定した時間から 刻々と時間を刻みます。Arduinoは100msごとに時間を読みにっているので、表示される秒の値は多少遅れます。
RTCは電源が供給される限り内部で時間を刻みます。

/* 
 *  I2Cで接続したPCF2129ATに
 *  日時を書き込んだ後に
 *  読みだすプログラム 
 */
#include <Wire.h>
#include "PCF2129AT.h"


PCF2129AT rtc;
dt_dat dt;
void setup()
{
    Serial.begin(9600);
    Wire.begin();
    rtc.init();
    Serial.println("PC2129AT Sample Program");
    dt.y = 2015;                // 年の設定(2000年代)
    dt.wd = 4;                  // 週の設定(0-6)
    dt.mm = 11;                 // 月の設定(1-12)
    dt.d = 16;                   // 日の設定(1-)
    dt.h = 0;                   // 時の設定
    dt.m = 0;                  // 分の設定
    dt.s = 0;                   // 秒の設定
    rtc.setDate(&dt);              // 日時の設定
}

void loop ()
{
        rtc.getTime(&dt);          // 日時の取得
        // 日時の表示
        Serial.print("year :");
        Serial.print(2000 + dt.y,DEC);
        Serial.print("\t week :");
        Serial.print(dt.wd,DEC);
        Serial.print("\t month :");
        Serial.print(dt.mm,DEC);
        Serial.print("\t date :");
        Serial.print(dt.d,DEC);
        Serial.print("\t hour :");
        Serial.print(dt.h,DEC);
        Serial.print("\t minutes :");
        Serial.print(dt.m,DEC);
        Serial.print("\t second :");
        Serial.println(dt.s,DEC);
        delay(100);
}

動作サンプル

sample1

ライブラリ

簡易ですがライブラリを作成したので、 "libraries"下にPCF2129ATフォルダを設置してください。

現在のバージョンは2015/11/16版です。

PCF2129AT.zip

付録

mbedのページ https://developer.mbed.org/...

Attachments (7)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.