Changes between Version 2 and Version 3 of PCF2129AT


Ignore:
Timestamp:
Nov 16, 2015 12:09:04 AM (8 years ago)
Author:
kishida
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • PCF2129AT

    v2 v3  
    44でも販売しているリアルタイムクロック(RTC)モジュールの使い方説明と、
    55サンプルプログラムです。
    6 メーカーから[http://www.nxp.com/documents/data_sheet/PCF2129.pdf pdf]も公開されています。
     6メーカーから[http://www.nxp.com/documents/data_sheet/PCF2129.pdf データシート(pdf)]も公開されています。
    77
    88RTCとは、内部に専用のオシレータなどを組み込んだ、
     
    1111
    1212PCF2129ATは、年(西暦2桁)・月・日・曜日・時・分・秒を刻むことができます。
     13
     14----
    1315
    1416== 使い方 ==
     
    2022以下の記事ではI2Cでの配線を前提に記述します。
    2123
     24== 通信方法 ==
     25
     26=== I2C通信 ===
     27
     28I2C通信の詳細を記載します。
     29
     30==== 送信 ====
     31
     32メーカー公開のデータシートよりプロトコル図を抜粋しました。
     33
     34[[Image(fig37.png,480px)]]
     35
     36 1.データ書き込みモードでスレーブのデバイスIDを書き込みます。[[BR]]0xA2は8bitでのアドレスです。ArduinoのWireライブラリを利用する際は7bitのアドレスが0x51になります。
     37
     38 2.データを書き込みたいレジスタアドレスを送信します。
     39
     40 3.書き込みたいデータを送信します。こちらは連続で書き込むと内部で自動的にレジスタアドレスをインクリメントしてくれます。レジスタアドレスのインクリメントは、0x1Bの次に自動的に0x00に戻ります。
     41
     42 4.通信を終了します。
     43
     44以下に、本ページで紹介しているライブラリの一部を抜粋します。
     45{{{
     46void PCF2129AT::dataSend(int id,int reg,int *data,int datasize)
     47{
     48  Wire.beginTransmission(id);
     49  Wire.write(reg);
     50  for(int i=0;i<datasize;i++)
     51  {
     52    Wire.write(data[i]);
     53    //Serial.print("data sended : "); //debug
     54    //Serial.println(data[i], BIN); //debug
     55  }
     56  Wire.endTransmission();
     57}
     58}}}
     59
     60==== 受信 ====
     61
     62メーカー公開のデータシートよりプロトコル図を抜粋しました。
     63
     64[[Image(fig38.png,480px)]]
     65
     66 1.データ書き込みモードでスレーブのデバイスIDを書き込みます。[[BR]]0xA2は8bitでのアドレスです。ArduinoのWireライブラリを利用する際は7bitのアドレスが0x51になります。
     67
     68 2.データを読みだすレジスタアドレスを書き込みます。
     69
     70 3.ここで通信を終了します。{{{Wire.endTransmission(true);}}}とすることでストップビットを送信することができます。[[BR]]通信を終了しないデバイスのほうがどちらかと言えば多い印象です。
     71
     72 4.再度通信を開始し、受信モードでデバイスIDを書き込みます。Wireライブラリを利用する際は読み取るバイト数を指定することができます。
     73
     74 5.データを受信し、通信を終えます。
     75
     76手順3にてストップビットを送信しないまま読みだすと、PCF2129AT内部レジスタが1インクリメントされた状態で読み取りを開始するので注意が必要です。
     77
     78以下に、本ページで紹介しているライブラリの一部を抜粋します。
     79{{{
     80void PCF2129AT::dataRead(int id,int reg,int *data,int datasize)
     81{
     82  //Serial.print("transmission begin");//debug
     83  Wire.beginTransmission(id);             //スレーブアドレス送信,書き込みモード
     84  Wire.write(reg);                        //レジスタアドレス送信
     85  Wire.endTransmission(true);            //STOPコンディションを送る
     86  //STOPコンディションを送る仕様
     87  Wire.requestFrom(id, datasize, false);  //スレーブアドレス送信,受信モード,
     88  for(int i=0;i<datasize;i++)
     89  {
     90    data[i] = Wire.read();
     91    //Serial.print("data recived : ");//debug
     92    //Serial.println(data[i], BIN);//debug
     93  }
     94  Wire.endTransmission(true);
     95  //Serial.println("transmission end");//debug
     96}
     97}}}
    2298== 内蔵機能 ==
    2399
     
    31107
    32108Arduinoを起動た際に一度だけ走るsetup()内部で設定した時間から
    33 刻々と時間を刻みます。Arduinoは1000msごとに時間を読みにっていますが、
     109刻々と時間を刻みます。Arduinoは100msごとに時間を読みにっているので、表示される秒の値は多少遅れます。[[BR}]
    34110RTCは電源が供給される限り内部で時間を刻みます。
    35111
     112{{{
     113/*
     114 *  I2Cで接続したPCF2129ATに
     115 *  日時を書き込んだ後に
     116 *  読みだすプログラム
     117 */
     118#include <Wire.h>
     119#include "PCF2129AT.h"
     120
     121
     122PCF2129AT rtc;
     123dt_dat dt;
     124void setup()
     125{
     126    Serial.begin(9600);
     127    Wire.begin();
     128    rtc.init();
     129    Serial.println("PC2129AT Sample Program");
     130    dt.y = 2015;                // 年の設定(2000年代)
     131    dt.wd = 4;                  // 週の設定(0-6)
     132    dt.mm = 11;                 // 月の設定(1-12)
     133    dt.d = 16;                   // 日の設定(1-)
     134    dt.h = 0;                   // 時の設定
     135    dt.m = 0;                  // 分の設定
     136    dt.s = 0;                   // 秒の設定
     137    rtc.setDate(&dt);              // 日時の設定
     138}
     139
     140void loop ()
     141{
     142        rtc.getTime(&dt);          // 日時の取得
     143        // 日時の表示
     144        Serial.print("year :");
     145        Serial.print(2000 + dt.y,DEC);
     146        Serial.print("\t week :");
     147        Serial.print(dt.wd,DEC);
     148        Serial.print("\t month :");
     149        Serial.print(dt.mm,DEC);
     150        Serial.print("\t date :");
     151        Serial.print(dt.d,DEC);
     152        Serial.print("\t hour :");
     153        Serial.print(dt.h,DEC);
     154        Serial.print("\t minutes :");
     155        Serial.print(dt.m,DEC);
     156        Serial.print("\t second :");
     157        Serial.println(dt.s,DEC);
     158        delay(100);
     159}
     160}}}
     161
     162=== 動作サンプル ===
     163
     164[[Image(sample1.png,480px)]]
     165
     166== ライブラリ ==
     167
    36168簡易ですがライブラリを作成したので、
    37 "/Arduino/libraries/"下にPCF2129ATフォルダを設置してください。
     169"libraries"下にPCF2129ATフォルダを設置してください。
     170現在のバージョンは2015/11/16版です。
    38171
    39172== 付録 ==