Accurate RTC with integrated quartz crystal for industrial applications

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
wataaki
Date:
Wed Feb 04 06:12:10 2015 +0000
Commit message:
Initial version

Changed in this revision

PCF2129AT.cpp Show annotated file Show diff for this revision Revisions of this file
PCF2129AT.h Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 6bee9019d980 PCF2129AT.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCF2129AT.cpp	Wed Feb 04 06:12:10 2015 +0000
@@ -0,0 +1,123 @@
+#include "mbed.h"
+#include "PCF2129AT.h"
+ 
+I2C i2c(p28,p27);        // sda, scl
+Serial pc(USBTX, USBRX); // tx, rx
+char cmd[32];
+char i;
+dt_dat dt;                          // 日時構造体の変数設定
+ 
+void set_ch(char sel)
+{    // PCA9541のサンプル
+        // MST_0側の自分にスレーブ側の制御権を得る場合
+    cmd[0] = 1;                     // PCA9541 コマンドコード Cont Reg
+    i2c.write( 0xe2, cmd, 1);       // Cont Regを指定
+    i2c.read( 0xe2, cmd, 1);        // Cont Regを読込み
+    wait(0.1);                      // 0.1s待つ
+    switch(cmd[0] & 0xf)
+    {
+    case 0:                         // bus off, has control
+    case 1:                         // bus off, no control
+    case 5:                         // bus on, no control
+        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
+        cmd[1] = 4;                 // bus on, has control
+        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
+        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
+        break;
+    case 2:                         // bus off, no control
+    case 3:                         // bus off, has control
+    case 6:                         // bus on, no control
+        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
+        cmd[1] = 5;                 // bus on, has control
+        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
+        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
+        break;
+    case 9:                         // bus on, no control
+    case 0xc:                       // bus on, no control
+    case 0xd:                       // bus off, no control
+        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
+        cmd[1] = 0;                 // bus on, has control
+        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
+        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
+        break;
+    case 0xa:                       // bus on, no control
+    case 0xe:                       // bus off, no control
+    case 0xf:                       // bus on, has control
+        cmd[0] = 1;                 // PCA9541 コマンドコード Cont Reg
+        cmd[1] = 1;                 // bus on, has control
+        i2c.write( 0xe2, cmd, 2);   // Cont Regにcmd[1]を書込み
+        i2c.read( 0xe2, cmd, 1);    // Cont Regを読込み
+        break;
+    default:
+        break;
+    }
+
+    cmd[0] = sel;                   // PCA9546 Cont Reg sel channel enabled
+    i2c.write( 0xe8, cmd, 1);       // Send command string
+}
+
+void  get_time(dt_dat *dt)      // 日時の取得
+{
+    cmd[0] = Seconds;                       // 取得はレジスタSecondsから
+    i2c.write(PCF2129AT_ADDR, cmd, 1);      // レジスタの設定
+    i2c.read(PCF2129AT_ADDR, cmd, 7);       // SecondsからYearsまで取得
+    cmd[0] &= 0x7f;                         // 有効なのは下位7ビット
+    dt->s = (cmd[0] >> 4) * 10 + (cmd[0] & 0xf);    // BCDの数値化
+    cmd[1] &= 0x7f;                         // 有効なのは下位7ビット
+    dt->m = (cmd[1] >> 4) * 10 + (cmd[1] & 0xf);    // BCDの数値化
+    cmd[2] &= 0x3f;                         // 有効なのは下位6ビット
+    dt->h = (cmd[2] >> 4) * 10 + (cmd[2] & 0xf);    // BCDの数値化
+    cmd[3] &= 0x3f;                         // 有効なのは下位6ビット
+    dt->d = (cmd[3] >> 4) * 10 + (cmd[3] & 0xf);    // BCDの数値化
+    dt->wd = (cmd[4] & 0x3);                        // BCDの数値化
+    cmd[5] &= 0x1f;                         // 有効なのは下位5ビット
+    dt->mm = (cmd[5] >> 4) * 10 + (cmd[5] & 0xf);   // BCDの数値化
+    dt->y = (cmd[6] >> 4) * 10 + (cmd[6] & 0xf);    // BCDの数値化
+}        
+
+void set_time(dt_dat *dt)       // 日時の設定
+{
+    cmd[0] = Seconds;                       // 設定はレジスタSecondsから
+    cmd[1] = ((dt->s / 10) << 4) + (dt->s % 10) + 0x80; // 秒のBCD化
+    cmd[2] = ((dt->m / 10) << 4) + (dt->m % 10);        // 分のBCD化
+    cmd[3] = ((dt->h / 10) << 4) + (dt->h % 10);        // 時のBCD化
+    cmd[4] = ((dt->d / 10) << 4) + (dt->d % 10);        // 日のBCD化
+    cmd[6] = ((dt->mm / 10) << 4) + (dt->mm % 10);      // 月のBCD化
+    dt->y = dt->y - 2000;       
+    cmd[7] = ((dt->y / 10) << 4) + (dt->y % 10);        // 年のBCD化
+    i2c.write(PCF2129AT_ADDR, cmd, 8);      // 日時の設定
+}
+
+
+int main ()
+{
+    i2c.frequency(100000);
+    pc.printf("PC2129AT Sample Program\r\n");
+     
+    set_ch(2);              // PCF2129ATはch1に接続
+
+  // PCF2129AT
+    cmd[0] = CLKOUT_ctl;                // CLKOUTレジスタ設定
+    cmd[1] = (3 << 6) + 4;              // 温度測定は30s毎、出力周波数は2048Hz
+    i2c.write(PCF2129AT_ADDR, cmd, 2);  // CLKOUT設定
+
+    cmd[0] = Aging_offset;              // Aging_offsetレジスタ設定
+    cmd[1] = 0x9;                       // -1ppm
+    i2c.write(PCF2129AT_ADDR, cmd, 2);  // Aging_offset設定
+
+    dt.y = 2014;                // 年の設定
+    dt.mm = 10;                 // 月の設定
+    dt.d = 5;                   // 日の設定
+    dt.h = 8;                   // 時の設定
+    dt.m = 31;                  // 分の設定
+    dt.s = 0;                   // 秒の設定
+    set_time(&dt);              // 日時の設定
+
+    while(1)
+    {
+        get_time(&dt);          // 日時の取得
+             // 日時の表示
+        pc.printf("%04d/%02d/%02d %02d:%02d:%02d\r\n", 2000 + dt.y, dt.mm, dt.d, dt.h, dt.m, dt.s);
+        wait(1.0);
+    }
+}
\ No newline at end of file
diff -r 000000000000 -r 6bee9019d980 PCF2129AT.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCF2129AT.h	Wed Feb 04 06:12:10 2015 +0000
@@ -0,0 +1,41 @@
+#define PCF2129AT_ADDR   0xA2
+
+#define Control_1        0x00
+#define Control_2        0x01
+#define Control_3        0x02
+#define Seconds          0x03
+#define Minutes          0x04
+#define Hours            0x05
+#define Days             0x06
+#define Weekdays         0x07
+#define Months           0x08
+#define Years            0x09
+#define Second_alarm     0x0a
+#define Minute_alarm     0x0b
+#define Hour_alarm       0x0c
+#define Day_alarm        0x0d
+#define Weekday_alarm    0x0e
+#define CLKOUT_ctl       0x0f
+#define Watchdg_tim_ctl  0x10
+#define Watchdg_tim_val  0x11
+#define Timestp_ctl      0x12
+#define Sec_timestp      0x13
+#define Min_timestp      0x14
+#define Hour_timestp     0x15
+#define Day_timestp      0x16
+#define Mon_timestp      0x17
+#define Year_timestp     0x18
+#define Aging_offset     0x19
+#define Internal_reg     0x1a
+
+typedef struct
+{
+  char   s;         // 秒
+  char   m;         // 分
+  char   h;         // 時間
+  char   d;         // 日
+  char   wd;        // 曜日
+  char   mm;        // 月
+  short   y;        // 年
+} dt_dat, *pdt_dat;
+
diff -r 000000000000 -r 6bee9019d980 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Feb 04 06:12:10 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/552587b429a1
\ No newline at end of file