ILF / Mbed 2 deprecated mbed_ILF

Dependencies:   mbed SDFileSystem

Revision:
4:24481ebef1c4
Parent:
3:639e05fcfa0b
--- a/ILF.cpp	Fri Jan 21 08:40:08 2022 +0000
+++ b/ILF.cpp	Wed Apr 20 01:38:30 2022 +0000
@@ -1,14 +1,27 @@
 #include "mbed.h"
 #include "SDFileSystem.h"
-//#include "MODSERIAL.h"
 
 //difine_mbed_LPC1768
 
 /*******************************************************************************
 
-2018.8.31
-ILF Iop汎用器
-
+2022.4.8
+ILF V3 Iop汎用器
+
+ver3.0.0 2022.4.8 tanaka
+    mbed_ILF ver1.2.5を引継ぎ
+    ILF3のハードに合せて改編する
+    
+    1.EEPROMの変更 ONsemi製CAT24M01WI-GT3
+        the CAT24M01 is a 1024kb serial CMOS EEPROM
+        addres: 101010**
+
+    2.電圧測定の平均化
+
+
+
+******************************************************************************/
+/*
 仕様
 電圧/抵抗測定:12bit
 電流測定:14bit
@@ -100,12 +113,14 @@
 #define time_discharge  0.5     //discharging time(s)
 #define time_integral   2       //integral time(s)
 #define touch           5       //GU-D タッチパネル感度 0~7で設定。低いほど敏感。
-#define wait_voc        0.5     //[s]VOC測定電圧設定後からリセットまでの時間
+#define wait_voc_1      0.5     //[s]VOC測定電圧設定後からリセットまでの時間
 #define wait_reset      0.3     //[s]リセット解除からVOC測定までの時間
 #define wait_poweron    4       //[s]電源投入からリセットまでの時間
 #define time_reset      0.5     //reset Hの時間 ver1.1.3
 #define TIME_RELAY_ON   0.5     //外付けリードリレー用 Ton[s]
 #define TIME_RELAY_OFF  0.2     //外付けリードリレー用 Toff[s]
+const int ton_rr = 0.1;         //内蔵リードリレー ton[s]
+const int toff_rr = 0.1;        //内蔵リードリレー toff]
 
 /***************************************
 RESOLUTION SETTINGS VS. LSB
@@ -118,12 +133,16 @@
 |    18bits(11)      |   15.625uV   |
  -----------------------------------
 ****************************************/
-//ver1.2.0
-const int version_major = 1;    //ソフトバージョン
-const int version_minor = 2;    //ソフトバージョン
-const int version_build = 5;    //ソフトバージョン
-
-//
+//soft ver
+const int version_major = 3;
+const int version_minor = 0;
+const int version_build = 0;
+
+/*******************************************************************************
+
+    LPC1768 PIN MAPPING
+
+*******************************************************************************/
 //繰り返しタイマー割り込み
 Ticker flipper; /* 初期化 */
 //one shot timer
@@ -131,17 +150,23 @@
 Timeout oneshot2;
 Timeout oneshot3;
 Timeout oneshot4;
-//
-//SD-CARD
+
+/*** SD-CARD ***/
 SDFileSystem sd(P0_9, P0_8, P0_7, P0_6, "sd"); //SDFileSystem name(mosi, miso, sck, cs, mount);
-//
-//interruput
+
+/*** I2C ***/
+I2C i2c(P0_10,P0_11); //(PinName sda, PinName scl) I2Cを定義
+
+/*** UART ver3 ***/
+Serial uart(P0_15,P0_16,9600);
+
+/*** interruput ***/
 InterruptIn seq_yobi(P0_19);
-//
-//start sw
+
+/*** start sw ***/
 DigitalIn sw_start(P0_4);
-//
-//DigitalOut
+
+/*** DigitalOut ***/
 DigitalOut  houden[]  = {  //  配列を用意します
     DigitalOut( P2_1 ),  //houden1 配列の1番目の要素を**で初期化したDigitalOutに
     DigitalOut( P2_0 ),  //houden2
@@ -149,6 +174,26 @@
     DigitalOut( P1_29 )  //houden4
 };
 
+DigitalOut  io[]  = { 
+    DigitalOut( P2_11 ),  //io1
+    DigitalOut( P2_12 ),  //io2
+    DigitalOut( P1_18 ),  //io3
+    DigitalOut( P1_19 ),  //io4
+    DigitalOut( P0_17 ),  //io5
+    DigitalOut( P0_18 ),  //io6
+    DigitalOut( P1_30 ),  //io7
+    DigitalOut( P1_31 ),  //io8
+    DigitalOut( P1_22 ),  //io9
+    DigitalOut( P1_23 ),  //io10
+    DigitalOut( P1_24 ),  //io11
+    DigitalOut( P1_25 ),  //io12
+    DigitalOut( P0_23 ),  //io13
+    DigitalOut( P0_24 ),  //io14
+    DigitalOut( P0_25 ),  //io15
+    DigitalOut( P0_26 )   //io16
+};
+
+/*
 DigitalOut  io[]  = {  //  配列を用意します
     DigitalOut( P0_25 ),  //io1 配列の1番目の要素をP0_25で初期化したDigitalOutに
     DigitalOut( P0_26 ),  //io2
@@ -159,6 +204,7 @@
     DigitalOut( P1_24 ),  //io7
     DigitalOut( P1_25 )   //io8
 };
+*/
 
 DigitalOut  range[] = {  //  配列を用意します
     DigitalOut( P2_3 ),  //range1 配列の1番目の要素を**で初期化したDigitalOutに
@@ -167,13 +213,6 @@
     DigitalOut( P1_27 )  //range4
 };
 
-/*
-DigitalOut  led1_green(P0_17);
-DigitalOut  led2_green(P1_31);
-DigitalOut  led1_red(P0_18);
-DigitalOut  led2_red(P1_30);
-*/
-
 DigitalOut  led_green[] = {
     DigitalOut( P0_17 ),
     DigitalOut( P1_31 ),
@@ -187,7 +226,30 @@
     DigitalOut( P2_12 ),
     DigitalOut( P1_19 )
 };
+
+/*** PLC ver3 ***/
+DigitalIn seq_in[] = {
+    DigitalIn(P0_19),   //si1
+    DigitalIn(P2_9),    //si2
+    DigitalIn(P2_13),   //si3
+    DigitalIn(P4_28),   //si4
+    DigitalIn(P0_29),   //si5
+    DigitalIn(P0_30)    //si6
+};
+
+DigitalOut seq_out[] = {
+    DigitalOut( P0_21 ),    //so1
+    DigitalOut( P0_22 ),    //so2
+    DigitalOut( P3_25 ),    //so3
+    DigitalOut( P3_26 ),    //so4
+    DigitalOut( P0_20 ),    //so5
+    DigitalOut( P2_6 ),     //so6
+    DigitalOut( P2_7 ),     //so7
+    DigitalOut( P2_8 )      //so8
+};
+
 //ver1.1.0
+/*
 DigitalOut  seq_hantei[] = {
     DigitalOut( P0_21 ),
     DigitalOut( P0_22 ),
@@ -204,9 +266,9 @@
 DigitalIn   seq_kosuu_a(P2_13);
 DigitalIn   seq_kosuu_b(P2_9);
 //DigitalIn   seq_yobi(P0_19);
-
-//
-//PWM
+*/
+
+/*** PWM ***/
 PwmOut leds[] = {   //配列を用意
     PwmOut(P2_5),  //LED1
     PwmOut(P2_4),  //LED2
@@ -214,17 +276,30 @@
     PwmOut(P1_20)  //LED4
 };
 
-//
-//I2C
-I2C i2c(P0_10,P0_11); //(PinName sda, PinName scl) I2Cを定義
-//
-/******************:
+//RELAY ver3.0.0
+DigitalOut  rlen[]  = { 
+    DigitalOut( P1_4 ),     //RLCNT1
+    DigitalOut( P1_8 ),     //RLCNT2
+    DigitalOut( P1_9 ),     //RLCNT3    
+    DigitalOut( P1_10 ),     //RLCNT4
+    DigitalOut( P1_14 ),     //RLCNT5
+    DigitalOut( P1_15 ),     //RLCNT6
+    DigitalOut( P1_16 ),     //RLCNT7
+    DigitalOut( P1_17 ),     //RLCNT8
+};
+
+/*******************************************************************************
+
  SD Card
-*******************/
+ 
+*******************************************************************************/
 void sd_writetext(char* text);
-/******************:
-gu-D(表示器) addr:50H
-*******************/
+
+/*******************************************************************************
+
+    gu-D(表示器) addr:50H
+
+*******************************************************************************/
 //parameter_gu256X128C-D903M
 const   int addr_gu = 0x50 << 1; // Address of gu256X128C-D903M
 //
@@ -277,18 +352,63 @@
 void gu_Button_down_on2();
 void gu_Button_power_on();
 void gu_Button_power_off();
-
+//
+//******************************************************************************
+
+//    CAT24M01(EEPROM)
+//      ver3.0.0 2022.4.8 
+
+const static int eeprom_adrs = 0xA8;      //0x2A << 2 Address of PCAS08A(EEPROM) 6/8bit
+
+int     slave_adrs;                //i2c slave address 8bit
+
+char    rdata[17];                  //EEPROMからのリードデータ
+char    wdata[17];                  //EEPROMへのライトデータ
+int     Jyushin;                    //受信成功時 Jyushin=0
+int     Soushin;                    //送信成功時 Soushin=0
+
+const static char adrs_kido[]={0x00,0x00};      //VFDの輝度
+const static char adrs_syoudo[]={0x00,0x10};    //測定用LED照度の値を保存しているアドレス
+const static char adrs_calnum[]={0x00,0x20};    //CPUにロードしているCALの登録番号
+const static char adrs_calinfo[]={0x01,0x00};   //CAL情報 0x0100~0x032FFを割り当て。1page256byte。No.1~No.50まで登録
+//
+//    CAL情報登録 -> EEPROM
+//
+#define     caliber_number  50       /* CAL登録数 */
+//
+//#define     caliber_number  6       /* CAL登録数 */
+//#define     addr_calnum     0x20    /* 起動時に選択するCALnumber */
+//#define     addr_cal1       0x80    /* CAL.No1の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1 */
+//#define     addr_cal2       0x90    /* CAL.No2の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
+//#define     addr_cal3       0xA0    /* CAL.No3の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
+//#define     addr_cal4       0xB0    /* CAL.No4の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
+//#define     addr_cal5       0xC0    /* CAL.No5の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
+//#define     addr_cal6       0xD0    /* CAL.No6の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
+//ver1.2.1
+//EEPROM BLOCK2へのアドレッシングは、別で初期8bitも制御する必要がある。
+//#define     addr_cal1_2     0x00    /* CAL.No1の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+//#define     addr_cal2_2     0x10    /* CAL.No2の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+//#define     addr_cal3_2     0x20    /* CAL.No3の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+//#define     addr_cal4_2     0x30    /* CAL.No4の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+//#define     addr_cal5_2     0x40    /* CAL.No5の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+//#define     addr_cal6_2     0x50    /* CAL.No6の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
+//
+/******************************************************************************/
+
+//******************************************************************************
+//
 /***************************
 LCP1768(EEPROM) addr:15H
 ***************************/
 //parameter_PCAS08A(EEPROM)
 //const   int addr_EEPROM = 0x15 << 3; // Address of PCAS08A(EEPROM) コメント化 ver1.2.1
-char    rdata[17]; //EEPROMからのリードデータ
-char    wdata[17]; //EEPROMへのライトデータ
-int     Jyushin; //受信成功時 Jyushin=0
-int     Soushin; //送信成功時 Soushin=0
-const   int fixed_adrs = 0x15 << 3; // Address of PCAS08A(EEPROM) 始めの5bit ver1.2.1
-int     adrs_eeprom; //slave address ver1.2.1
+//char    rdata[17]; //EEPROMからのリードデータ
+//char    wdata[17]; //EEPROMへのライトデータ
+//int     Jyushin; //受信成功時 Jyushin=0
+//int     Soushin; //送信成功時 Soushin=0
+//const   int eeprom_adrs = 0x15 << 3; // Address of PCAS08A(EEPROM) 始めの5bit ver1.2.1
+//int     slave_adrs; //slave address ver1.2.1
+//
 /***************************
 MCP3424(ADC)
 ***************************/
@@ -374,44 +494,27 @@
 #define     low_limit_iop   0x44C//11uA換算:1100*0.01
 #define     low_limit_ocp   0xFFE2//-0.3uA換算
 */
-/******************************
-
-    CAL情報登録 -> EEPROM
-
-*******************************/
-#define     caliber_number  6       /* CAL登録数 */
-#define     addr_calnum     0x20    /* 起動時に選択するCALnumber */
-#define     addr_cal1       0x80    /* CAL.No1の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1 */
-#define     addr_cal2       0x90    /* CAL.No2の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
-#define     addr_cal3       0xA0    /* CAL.No3の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
-#define     addr_cal4       0xB0    /* CAL.No4の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
-#define     addr_cal5       0xC0    /* CAL.No5の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
-#define     addr_cal6       0xD0    /* CAL.No6の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/
-//ver1.2.1
-//EEPROM BLOCK2へのアドレッシングは、別で初期8bitも制御する必要がある。
-#define     addr_cal1_2     0x00    /* CAL.No1の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
-#define     addr_cal2_2     0x10    /* CAL.No2の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
-#define     addr_cal3_2     0x20    /* CAL.No3の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
-#define     addr_cal4_2     0x30    /* CAL.No4の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
-#define     addr_cal5_2     0x40    /* CAL.No5の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
-#define     addr_cal6_2     0x50    /* CAL.No6の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/
-//up to here
 
 //structure
 struct cal_info {
-    short   number;         /* CAL.No. */
-    short   vss_iop;        /* IOP測定時のVss電圧 1bit * 0.01uA*/
-    short   vss_ocp;        /* 過充電防止(over charge protection)測定時のVss電圧 */
-    short   vss_voc;        /* VOC測定時のVss電圧 */
-    short   low_limit_voc;  //1bit * 1mv
-    short   low_limit_iop;  //1bit * 0.01uA
-    short   low_limit_ocp;  //過充電防止検査の上限規格値(プラス側)
-    short   up_limit_ocp;  //過充電防止検査の上限規格値(マイナス側)ver1.2.1追加
-    float   wait_iop;       /* [s]Iop測定前の待機時間 1bit 1s 換算*/
-    float   wait_ocp;       /* [s]過充電防止時消電測定前の待機時間 1bit 1s換算*/
-    short   low_limit_resistor; /* アンテナ抵抗規格 1bit 10Ω*/
-    short   up_limit_resistor; /* アンテナ抵抗規格 1bit 10Ω*/
+    char    name[3];            // CAL NAME ASCII CODE ver3
+    short   number;             // CAL.No.
+    short   vss_iop;            // IOP測定時のVss電圧 1bit * 0.01uA
+    short   vss_ocp;            // 過充電防止(over charge protection)測定時のVss電圧
+    short   vss_voc;            // VOC測定時のVss電圧
+    short   low_limit_voc;      // 1bit * 1mv
+    short   low_limit_iop;      // 1bit * 0.01uA
+    short   low_limit_ocp;      // 過充電防止検査の下規格値(プラス側)
+    short   up_limit_ocp;       // 過充電防止検査の上限規格値(マイナス側)ver1.2.1追加
+    float   wait_iop;           // Iop測定前の待機時間[s] 1bit 1s 換算
+    float   wait_ocp;           // 過充電防止時消電測定前の待機時間[s] 1bit 1s換算
+    short   low_limit_resistor; // アンテナ抵抗規格 1bit 10Ω
+    short   up_limit_resistor;  // アンテナ抵抗規格 1bit 10Ω
+    short   low_limit_ocp_v;    // 過充電防止検査の下限規格[V] ver3
+    short   up_limit_ocp_v;     // 過充電防止検査の上限規格[V] ver3
+    float   wait_voc;           // VOC測定前の待機時間[s] 1bit 1s 換算 ver3
 } ;
+
 //parameter
 struct  cal_info calinfo;
 char    reg_num;    /* 選択中の登録CALナンバー */
@@ -421,7 +524,6 @@
 void read_caliber(cal_info *cal, int num);
 void write_caliber_information(cal_info *cal, int num);
 
-
 /*******************************
 
     ver1.2.5
@@ -446,6 +548,12 @@
 *******************************/
 void set_pullup()
 {
+    /*** ver3 ***/
+    for (int i = 0; i <= 5; i++){
+        seq_in[i].mode(PullUp);
+    }
+    
+    /*
     sw_start.mode(PullUp);
     seq_start.mode(PullUp);//シーケンサからのスタート信号
     seq_cal_a.mode(PullUp);
@@ -453,6 +561,7 @@
     seq_cal_c.mode(PullUp);
     seq_kosuu_a.mode(PullUp);
     seq_kosuu_b.mode(PullUp);
+    */
 }
 /*******************************
 
@@ -469,8 +578,9 @@
 
     //シーケンサのトリガ以外は受け付けない
     while(1) {
-
-        if( seq_start == 0 ) {
+        /*** ver3 ***/
+        //if( seq_start == 0 ) {
+        if ( seq_in[0] == 0 ){
 
             trigger();
 
@@ -503,9 +613,14 @@
     gu_print1("CAL.");
 
     //シーケンサからCAL選択bit読込と表示
+    /*
     cal_num = ( seq_cal_c << 2 ) + ( seq_cal_b << 1 ) +  seq_cal_a;
 
     cal_num = ( ~ cal_num ) & 0x7 ; //3bit入力の負論理
+    */
+
+    /*** v3 debug ***/
+    cal_num = 1;
 
     //read caliber infomation from eeprom
     if( cal_num >= 1 && cal_num <= 6 ) {
@@ -519,13 +634,18 @@
 
     }
 
-    meas_num = ( ~(( seq_kosuu_b << 1 ) + seq_kosuu_a )) & 0x3; //2bit負論理
+    /*** v3 debag ***/
+    //meas_num = ( ~(( seq_kosuu_b << 1 ) + seq_kosuu_a )) & 0x3; //2bit負論理
+    meas_num = ( ~(( seq_in[2] << 1 ) + seq_in[3] )) & 0x3; //2bit負論理
+    /******/
 
     gu_cursor(128,1);
     gu_print1("n=");
     gu_onebyte( meas_num + 0x30 );//測定個数確認用
 
-    seq_busy = 1;//DegitalOut busy
+    /*** ver3 ***/
+    //seq_busy = 1;//DegitalOut busy
+    seq_out[4] = 1;
 
     auto_meas( meas_num );
 
@@ -534,8 +654,9 @@
 
     wait(0.1);
 
-    //測定終了
-    seq_busy = 0;//DegitalOut busy
+    //測定終了ver3
+    //seq_busy = 0;//DegitalOut busy
+    seq_out[4] = 1;
 
     //終了表示
     gu_fontsize(1);
@@ -544,258 +665,208 @@
 
 }
 
-/*******************************
+/*******************************************************************************
 
     EEPROMへCAL情報(struct)を保存
-
-*******************************/
+    
+        ver3. CAT24M01用に改修 2022.4.12   
+            
+            1page(256byte)につき1Cal分の品種情報を登録する。
+            BYTE_ADDRESS上位9bitでpage指定。下位8bitはpage内アドレス。
+       
+            argument
+                num : CAL登録ナンバー(1~50)
+                cal_info : 測定条件
+
+*******************************************************************************/
 void write_caliber_information(cal_info *cal, int num)
 {
-    char   cdata[17];//1byte
-
-    //EEPROM書込み 先頭アドレス
-    cdata[0] = addr_cal1 + 0x10 * ( num - 1 );
-
-    //データ分割 EEPROM_BYTE 0x00~0x0Bまで
-    cdata[1] = calinfo.vss_iop & 0xFF;//1byte分割
-    cdata[2] = ( calinfo.vss_iop >> 8 ) & 0xFF;//1byte分割
-
-    cdata[3] = calinfo.vss_ocp & 0xFF;//1byte分割
-    cdata[4] = ( calinfo.vss_ocp >> 8 ) & 0xFF;//1byte分割
-
-    cdata[5] = calinfo.vss_voc & 0xFF;//1byte分割
-    cdata[6] = ( calinfo.vss_voc >> 8 ) & 0xFF;//1byte分割
-
-    cdata[7] = calinfo.low_limit_voc & 0xFF;//1byte分割
-    cdata[8] = ( calinfo.low_limit_voc >> 8 ) & 0xFF;//1byte分割
-
-    cdata[9] = calinfo.low_limit_iop & 0xFF;//1byte分割
-    cdata[10] = ( calinfo.low_limit_iop >> 8 ) & 0xFF;//1byte分割
-
-    cdata[11] = calinfo.low_limit_ocp & 0xFF;//1byte分割
-    cdata[12] = ( calinfo.low_limit_ocp >> 8 ) & 0xFF;//1byte分割
-
-    //ver1.1.0
-    cdata[13] = calinfo.wait_iop; //1bitあたり 1s
-    cdata[14] = calinfo.wait_ocp; //1bitあたり 1s
-    /*ver1.1.0
-    cdata[13] = calinfo.wait_iop * 10; //1bitあたり0.1s
-    cdata[14] = calinfo.wait_ocp * 10; //1bitあたり0.1s
-    */
-
-    cdata[15] = calinfo.low_limit_resistor / 10; //1bitあたり10ohm
-    cdata[16] = calinfo.up_limit_resistor / 10;  //1bitあたり10ohm
-
-    Soushin = i2c.write (fixed_adrs, cdata, 17);
-
-    //ver1.2.1
-    wait(0.1);
-
-    char cdata_2[3];
-
-    adrs_eeprom = fixed_adrs + 0x2; //BLOCK2の選択
-
-    cdata_2[0] = addr_cal1_2 + 0x10 * ( num - 1 ); //PAGE選択
-    cdata_2[1] = calinfo.up_limit_ocp & 0xFF;//1byte分割
-    cdata_2[2] = ( calinfo.up_limit_ocp >> 8 ) & 0xFF;//1byte分割
-
-    Soushin = i2c.write (adrs_eeprom, cdata_2, 3);
-    //up to here
+    char   cdata[28];   //1byte*x
+    int adrs_init;
+    int adrs;
+
+    adrs_init = ((adrs_calinfo[0] << 8 ) & 0xFF00 ) + (adrs_calinfo[1] & 0xFF);
+
+    //EEPROM書込み page指定
+    
+    adrs = adrs_init + 0x100 * ( num - 1 );
+    cdata[0] = ( (adrs & 0xFF00) >> 8 ) & 0xFF;   //address 15~8 bit
+    cdata[1] = 0x00;                            //address 7~0 bit
+
+    //連続データ書込み BYTE_ADDRESS 下位8bit 0x00~0x0Bまで
+    
+    cdata[2] = calinfo.vss_iop & 0xFF;                      //0x00 
+    cdata[3] = ( calinfo.vss_iop >> 8 ) & 0xFF;             //0x01 
+
+    cdata[4] = calinfo.vss_ocp & 0xFF;                      //0x02 
+    cdata[5] = ( calinfo.vss_ocp >> 8 ) & 0xFF;             //0x03 
+
+    cdata[6] = calinfo.vss_voc & 0xFF;                      //0x04 
+    cdata[7] = ( calinfo.vss_voc >> 8 ) & 0xFF;             //0x05
+
+    cdata[8] = calinfo.low_limit_voc & 0xFF;                //0x06
+    cdata[9] = ( calinfo.low_limit_voc >> 8 ) & 0xFF;       //0x07
+
+    cdata[10] = calinfo.low_limit_iop & 0xFF;                //0x08
+    cdata[11] = ( calinfo.low_limit_iop >> 8 ) & 0xFF;      //0x09
+
+    cdata[12] = calinfo.low_limit_ocp & 0xFF;               //0x0A
+    cdata[13] = ( calinfo.low_limit_ocp >> 8 ) & 0xFF;      //0x0B
+
+    cdata[14] = calinfo.up_limit_ocp & 0xFF;                //0x0C
+    cdata[15] = ( calinfo.up_limit_ocp >> 8 ) & 0xFF;       //0x0D
+
+    cdata[16] = calinfo.low_limit_ocp_v & 0xFF;             //0x0E
+    cdata[17] = ( calinfo.low_limit_ocp_v >> 8 ) & 0xFF;    //0x0F
+
+    cdata[18] = calinfo.up_limit_ocp_v & 0xFF;              //0x10
+    cdata[19] = ( calinfo.up_limit_ocp_v >> 8 ) & 0xFF;     //0x11
+
+    cdata[20] = calinfo.wait_iop;                           //0x12
+    cdata[21] = calinfo.wait_ocp;                           //0x13
+    cdata[22] = calinfo.wait_voc;                           //0x14
+
+    cdata[23] = calinfo.low_limit_resistor / 10;            //0x15 1bitあたり10ohm
+    cdata[24] = calinfo.up_limit_resistor / 10;             //0x16 1bitあたり10ohm
+
+    cdata[25] = calinfo.name[0];                            //0x17
+    cdata[26] = calinfo.name[1];                            //0x18
+    cdata[27] = calinfo.name[2];                            //0x19
+    //cdata[28] = calinfo.name[3];                            //0x1A
+
+    Soushin = i2c.write (eeprom_adrs, cdata, 28);
+
+    wait(0.2); //ver3
 
 }
-/*******************************
+/*******************************************************************************
 
     EEPROMからCAL情報を
     読み出して構造体へ代入する
 
-*******************************/
+    argument    num:登録番号
+
+        ver3. CAT24M01用に改修 2022.4.12   
+        
+*******************************************************************************/
 void read_caliber(cal_info *cal, int num)
 {
     signed short    sdata[16];      //CAL設定条件
-    int             i;
-
-    //EEPROMからnumで指定したナンバーのCAL情報を読み出し
-    wdata[0] = addr_cal1 + 0x10 * ( num - 1 );
-    Soushin = i2c.write (fixed_adrs, wdata, 1,true);    //読込先頭アドレス指定 ReStart
-    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 16);//read 1byte
-
-    //データ合成 EEPROM_BYTE 0x00~0x0Bまで2byte結合
-    for ( i = 0; i <= 5; i++ ) {
-        sdata[i] = rdata[i*2] | ( rdata[ i*2 + 1 ] << 8 );
+    int i;
+    int adrs_init;
+    int adrs;
+    char cdata[26];
+    
+    adrs_init = ((adrs_calinfo[0] << 8 ) & 0xFF00) + (adrs_calinfo[1] & 0x00FF);
+    
+    adrs = adrs_init + 0x100 * ( num - 1 );
+
+    wdata[0] = ( (adrs & 0xFF00) >> 8 ) & 0xFF;   //address 15~8 bit
+    wdata[1] = 0x00;                            //address 7~0 bit
+
+    Soushin = i2c.write (eeprom_adrs, wdata, 2,true); //not set stpo at end
+    Jyushin = i2c.read ((eeprom_adrs + 0x01), cdata, 1);
+    Jyushin = i2c.read ((eeprom_adrs + 0x01), (cdata + 1), 26);//read 27byte 
+    
+    /*** ver3.0.0 debug***/
+    if ( Jyushin != 0 ){
+        gu_fontsize(1);
+        gu_cursor(0,2);
+        gu_print1("not read cal information");   
+    } 
+
+    //データ合成 EEPROM_BYTE 0x00~0x11まで2byte結合
+    for ( i = 0; i <= 8; i++ ) {
+        sdata[i] = cdata[i*2] | ( cdata[ i*2 + 1 ] << 8 );
     }
-    sdata[6] = rdata[12];
-    sdata[7] = rdata[13];
-    sdata[8] = rdata[14];
-    sdata[9] = rdata[15];
-
+    
     cal -> number = num;
-    cal -> vss_iop = sdata[0];
-    cal -> vss_ocp = sdata[1];
-    cal -> vss_voc = sdata[2];
-    cal -> low_limit_voc = sdata[3];
-    cal -> low_limit_iop = sdata[4];
-    cal -> low_limit_ocp = sdata[5];
-    //ver1.1.0
-    cal -> wait_iop = sdata[6];
-    cal -> wait_ocp = sdata[7];
-    /*
-    cal -> wait_iop = sdata[6] / 10;
-    cal -> wait_ocp = sdata[7] / 10;
-    */
-    cal -> low_limit_resistor = sdata[8] * 10;
-    cal -> up_limit_resistor = sdata[9] * 10;
-
-    //ver1.2.3
-    //EEPROMからnumで指定したナンバーのCAL情報を読み出し
-    char            rdata2[2];
-
-    adrs_eeprom = fixed_adrs + 0x02; //BLOCK2
-
-    wdata[0] = addr_cal1_2 + 0x10 * ( num - 1 );
-    Soushin = i2c.write (adrs_eeprom, wdata, 1,true);    //読込先頭アドレス指定 ReStart
-    Jyushin = i2c.read ((adrs_eeprom + 0x01), rdata2, 2);//read 1byte
-
-    //BYTE0~1
-    i = 0;
-    sdata[10] = rdata2[i*2] | ( rdata2[ i*2 + 1 ] << 8 );
-
-    cal -> up_limit_ocp = sdata[10];
-    //ver1.2.1 up to here
+    cal -> vss_iop = sdata[0];          //0x00
+    cal -> vss_ocp = sdata[1];          //0x02
+    cal -> vss_voc = sdata[2];          //0x04
+    cal -> low_limit_voc = sdata[3];    //0x06
+    cal -> low_limit_iop = sdata[4];    //0x08
+    cal -> low_limit_ocp = sdata[5];    //0x0A
+    cal -> up_limit_ocp = sdata[6];     //0x0C
+    cal -> low_limit_ocp_v = sdata[7];  //0x0E
+    cal -> up_limit_ocp_v = sdata[8];   //0x10
+
+    cal -> wait_iop = cdata[18];        //0x12 wait_iop
+    cal -> wait_ocp = cdata[19];        //0x13 wait_ocp
+    cal -> wait_voc = cdata[20];        //0x14 wait_voc
+    
+    cal -> low_limit_resistor = cdata[21] * 10; //0x15 low_limit_resistor
+    cal -> up_limit_resistor = cdata[22] * 10;  //0x16 up_limit_resistor
+    
+    cal -> name[0] = cdata[23];         //0x17 cal name      
+    cal -> name[1] = cdata[24];         //0x18 cal name
+    cal -> name[2] = cdata[25];         //0x19 cal name
+    //cal -> name[3] = cdata[26];         //0x1A cal name
 
 }
-/*******************************
+/*******************************************************************************
 
     EEPROMからCAL登録番号を読出し
 
-*******************************/
+        ver3. CAT24M01用に改修 2022.4.11
+    
+*******************************************************************************/
 void read_regnum()
 {
-    wdata[0] = addr_calnum;
-    Soushin = i2c.write (fixed_adrs, wdata, 1,true);   //読込先頭アドレス指定 ReStart
-    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 1);//read 1byte
+
+    //Selective Read Timing
+    
+    Soushin = i2c.write (eeprom_adrs, adrs_calnum, 2,true);  //ver3
+    
+    Jyushin = i2c.read ((eeprom_adrs + 0x01), rdata, 1);//read 1byte
 
     reg_num = rdata[0];
 }
-/*******************************
-
-    EEPROMからCAL登録情報全消去
-
-*******************************/
+/*******************************************************************************
+
+    EEPROMからCAL登録情報全消去("0x00"書込み)
+    
+        ver3. CAT24M01用に改修 2022.4.11
+            0x00000 ~ 0x032FF を消去
+    
+*******************************************************************************/
 void erace_calinfo()
 {
     int i;
-
+    int j;
+
+    //init cal number ver3
     reg_num = 0x01;
-    wdata[0] = addr_calnum;    //word address 書込み先頭アドレス指定
-    wdata[1] = reg_num;
-    Soushin = i2c.write (fixed_adrs, wdata, 2);
-
-    wait(0.2);
-
-    wdata[0] = addr_cal1;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
-    }
-    Soushin = i2c.write (fixed_adrs, wdata, 17);
-
-    wait(0.2);
-
-    wdata[0] = addr_cal2;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
-    }
-    Soushin = i2c.write (fixed_adrs, wdata, 17);
-
-    wait(0.2);
-
-    wdata[0] = addr_cal3;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
-    }
-    Soushin = i2c.write (fixed_adrs, wdata, 17);
-
-    wait(0.2);
-
-    wdata[0] = addr_cal4;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
-    }
-    Soushin = i2c.write (fixed_adrs, wdata, 17);
-
-    wait(0.2);
-
-    wdata[0] = addr_cal5;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
-    }
-    Soushin = i2c.write (fixed_adrs, wdata, 17);
+    wdata[0] = adrs_calnum[0];
+    wdata[1] = adrs_calnum[1];
+    wdata[2] = reg_num;
+    Soushin = i2c.write (eeprom_adrs, wdata, 3);
 
     wait(0.2);
-
-    wdata[0] = addr_cal6;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
-    }
-    Soushin = i2c.write (fixed_adrs, wdata, 17);
-
-    //ver1.2.1
-    //BLOCK2の消去
-    wait(0.2);
-
-    adrs_eeprom = fixed_adrs + 0x02; //BLOCK2
-
-    wdata[0] = addr_cal1_2;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
-    }
-    Soushin = i2c.write (adrs_eeprom, wdata, 17);
-
-    wait(0.2);
-
-    wdata[0] = addr_cal2_2;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
+    
+    //write "0x00" by 256 byte
+
+    char wd[258];                       //DATA
+    int byte_adrs;                      //送信するBYTE ADDRESS I2C送信データの1,2BYTE目
+    const static int cal_adrs = 0x0100; //CAL情報を保存する開始アドレス
+    int page = 50;                      //page数
+    
+    for ( j = 0; j < page; j++){ 
+
+        byte_adrs = cal_adrs + j * 256;
+        wd[0] = (byte_adrs & 0xFF00) >> 8;
+        wd[1] = byte_adrs & 0xFF;
+        for( i = 2; i <= 258; i++) { //write 1page(256byte)
+            wd[i] = 0x00;
+        }
+        Soushin = i2c.write (eeprom_adrs, wd, 258);
+    
+        wait(0.2);
+
     }
-    Soushin = i2c.write (adrs_eeprom, wdata, 17);
-
-    wait(0.2);
-
-    wdata[0] = addr_cal3_2;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
-    }
-    Soushin = i2c.write (adrs_eeprom, wdata, 17);
-
-    wait(0.2);
-
-    wdata[0] = addr_cal4_2;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
-    }
-    Soushin = i2c.write (adrs_eeprom, wdata, 17);
-
-    wait(0.2);
-
-    wdata[0] = addr_cal5_2;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
-    }
-    Soushin = i2c.write (adrs_eeprom, wdata, 17);
-
-    wait(0.2);
-
-    wdata[0] = addr_cal6_2;
-    for( i = 1; i <= 16; i++) { //1page全消去
-        wdata[i] = 0x00;
-    }
-    Soushin = i2c.write (adrs_eeprom, wdata, 17);
-
-    wait(0.2);
-
-    //up to herever1.2.1
 
 }
-/******************************************
+/*******************************************************************************
 
     ADC(MCP3424) Configuration Register
 
@@ -811,7 +882,7 @@
         10 = 15 SPS(16bits)
         11 = 3.75 SPS(18bits)
 
-******************************************/
+*******************************************************************************/
 char adc_config(char ch, char rate)
 {
     char confreg;   //Configuration Register 1byte
@@ -854,12 +925,12 @@
             break;
     }
 }
-/******************************************
+/*******************************************************************************
 
     ADC(MCP3424)
     指定addressから2byte読込み
 
-******************************************/
+*******************************************************************************/
 short read_adc(char addr)//指定addressから2byte読込み
 {
     char cdata[2];//1byte
@@ -873,7 +944,7 @@
 
     return ( sdata );
 }
-/*****************************
+/*******************************************************************************
 
     AUTO/SEQ Mode
 
@@ -882,7 +953,7 @@
     For Current measurement
      a recurring interrupt to repeatedly call a function at a specified rate.
 
-*****************************/
+*******************************************************************************/
 void flip_ch1()
 {
     short sdata;
@@ -930,7 +1001,7 @@
     //次の測定chへ切替 無し
 }
 
-/*****************************
+/*******************************************************************************
 
     Manual Mode
 
@@ -939,7 +1010,7 @@
     For Current measurement
      a recurring interrupt to repeatedly call a function at a specified rate.
 
-*****************************/
+*******************************************************************************/
 void flip()
 {
     short   sdata; //_2byte reading data of ADC
@@ -1276,6 +1347,7 @@
 
         //電圧測定
         //ver1.2.0
+        /*** ver3.0.0 ***
         if (RL_EN == 1) {
             switch (ch_num) {
                 case 0:
@@ -1289,15 +1361,18 @@
             }
         }
         //up to here
+        */
 
         sdata = meas_voltage( ch_num ) * -1 ;
 
+        /*** ver3.0.0 ***
         //ver1.2.0
         if (RL_EN == 1) {
             io[4] = 0; //外付けリレーOFF
             io[5] = 0; //外付けリレーOFF
         }
         //up to here
+        */
 
         gu_fontsize(2);
         gu_cursor(108,4);
@@ -1340,6 +1415,9 @@
 
         wait(0.2);
 
+        //ver3.0.0
+        uart.format(7, Serial::Even, 1);
+
         set_pullup();
 
         general_call(0x06); //ADC power on reset
@@ -1349,7 +1427,7 @@
         gu_initial();//初期画面へ
         //utility();
     }
-}                                                                               //main end
+}   //main end
 
 void gu_initial()
 {
@@ -1366,19 +1444,16 @@
     int i;
     float duty_pwm;
 
-
     for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
         leds[i].period_us(period_pwm); //Set tha PWM period(us)
     }
 
-
     duty_pwm = 0; //表示器立ち上がるまでLEDOFF
 
     for( i = 0; i <= 3; i++) {
         leds[i].write(duty_pwm);//Set Duty
     }
 
-
     i2c.frequency(100000); //gu_D I2Cクロックレート(HZ) 400khz以下
 
     cmd_gu[0]= 0x1B;
@@ -1387,9 +1462,11 @@
     wait(0.2);
 
     //メモリ00h番地(GU_D輝度設定データ)読み出し
-    wdata[0] = 0x00;
-    Soushin = i2c.write (fixed_adrs, wdata, 1,true);    //読込先頭アドレス指定 ReStart
-    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 1);//read 1byte
+    //wdata[0] = 0x00;
+    wdata[0] = adrs_kido[0];
+    wdata[1] = adrs_kido[1];
+    Soushin = i2c.write (eeprom_adrs, wdata, 2,true);    //読込先頭アドレス指定 ReStart
+    Jyushin = i2c.read ((eeprom_adrs + 0x01), rdata, 1);//read 1byte
     *pclumi = rdata[0];
     //輝度設定更新
     if(*pclumi==0x00 || *pclumi > 0x08) *pclumi=0x05;
@@ -1572,22 +1649,38 @@
 
 }
 
-/*********************************
+/*******************************************************************************
 
     CAL選択画面 sub
-
-*********************************/
+    
+        ver3.0.0    CAL名を追加
+
+*******************************************************************************/
 void show_info(int n)
 {
     short sdata[6];
+    char cl[2];
 
     read_caliber(&calinfo,n);
 
     //読出したCAL情報の表示
     gu_fontsize(1);
     gu_cursor(0,2);
+    gu_print1("                ");
+    gu_fontsize(1);
+    gu_cursor(0,2);
     gu_print1("No.");
-    gu_putdec(&calinfo.number);
+    
+    cl[1] = calinfo.number % 10 + '0';
+    cl[0] = calinfo.number /10 + '0';
+    
+    gu_print(cl);
+    //gu_putdec(&calinfo.number);
+
+    gu_print1(" CAL.");
+    //gu_print1(calinfo.name);
+    i2c.write(addr_gu, calinfo.name, 3); //3byte ascii code
+
     gu_cursor(0,3);
     gu_print1("Vss(Iop) =");
     sdata[0] = -1 * calinfo.vss_iop;
@@ -1604,11 +1697,68 @@
     gu_putdeck(&sdata[2]);
     gu_print1("V ");
 }
-/*********************************
+/*******************************************************************************
+
+    GU-D CAL選択スイッチボタン再表示 サブ
+
+        画面上にあるスイッチの配置
+        
+        01,02,03,04,05,06,07,08,
+        09,10,11,12,13,14,15,16,
+        17,18,19,20,21,22,23,24,
+        25,26,27,28,29,30,31,32,
+    
+*******************************************************************************/
+void redraw_sw(int dig, char sw_num){
+    
+    char str_num[3];    // ascii code
+    char sw;            // GU-D Swich Number
+    
+    str_num[2] = 0;     // null終端
+    
+    if (  dig >= 1 ){
+        str_num[0] = dig + 0x30;   //convert ASCII 10の位
+    } else {
+        str_num[0] = 0x20;         //space
+    }
+
+    for ( sw = 17; sw <= 29; sw++ ){ 
+        
+        if ( sw >= 22 && sw <= 24 ){
+            continue;
+        }
+        
+        if ( sw <= 21 ){
+            str_num[1] = ( sw - 16 ) + 0x30;
+        } else if ( sw >= 24 && sw <= 28 ){    
+            str_num[1] = ( sw - 19 ) + 0x30;       
+        } else if ( sw == 29) {
+            str_num[0] = ( dig + 1 )+ 0x30;
+            str_num[1] = 0x30;
+        }
+        
+        if ( sw_num != sw ){
+            gu_set_button(sw,str_num);
+        } else {
+            gu_reverse(0x01);   //gu_リバース指定
+            gu_set_button(sw,str_num);
+            gu_reverse(0x00);   //gu_リバース解除
+        }
+    }//for
+}
+
+/*******************************************************************************
 
     CAL選択画面 #CAL登録画面
-
-*********************************/
+    
+        画面上にあるスイッチの配置
+        
+        01,02,03,04,05,06,07,08,
+        09,10,11,12,13,14,15,16,
+        17,18,19,20,21,22,23,24,
+        25,26,27,28,29,30,31,32,
+
+*******************************************************************************/
 void select_cal()
 {
     char crdata[3];
@@ -1617,55 +1767,43 @@
     char *pcswnum = &cswnum;
     char *pcswdata = &cswdata;
     char calnum;    //選択したCALナンバー
-    //short sdata[3]; //印加電圧表示用wr
-
-    calnum = 0;//initial
-
-    gu_cls();
+    
+    int digit = 0 ;     //CAL番号 10の位の値 0~4
+
+    calnum = 0;         //initial
+
+    gu_cls();           //GU-D 画面クリア
 
     read_regnum();//EEPROMに保存した選択CAL_NO.の読み出し
 
     show_info(reg_num);
 
-    /*
-    read_caliber(&calinfo,reg_num);
-
-    //読出したCAL情報の表示
-    gu_fontsize(1);
-    gu_cursor(0,2);
-    gu_print1("No.");
-    gu_putdec(&calinfo.number);
-    gu_cursor(0,3);
-    gu_print1("Vss(Iop) =");
-    sdata[0] = -1 * calinfo.vss_iop;
-    gu_putdeck(&sdata[0]);
-    gu_print1("V ");
-    gu_cursor(0,4);
-    gu_print1("Vss(ocp) =");
-    sdata[1] = -1 * calinfo.vss_ocp;
-    gu_putdeck(&sdata[1]);
-    gu_print1("V ");
-    gu_cursor(0,5);
-    gu_print1("Vss(Voc) =");
-    sdata[2] = -1 * calinfo.vss_voc;
-    gu_putdeck(&sdata[2]);
-    gu_print1("V ");
-    */
-
     gu_fontsize(2); //change fontsize
     gu_cursor(0,0);
-    gu_print1("Select CAL.");
-    //Set Button
+    //ver3.0.0
+    //gu_print1("Select CAL.");
+    gu_print1("CONFIG");
+    
+    //Set Button init ver3.0.0
+    redraw_sw(calnum,0);
+    /*
     gu_set_button(17,"1");
-    gu_set_button(19,"2");
-    gu_set_button(21,"3");
-    gu_set_button(25,"4");
-    gu_set_button(27,"5");
-    gu_set_button(29,"6");
+    gu_set_button(18,"2");
+    gu_set_button(19,"3");
+    gu_set_button(20,"4");
+    gu_set_button(21,"5");
+    gu_set_button(24,"6");
+    gu_set_button(25,"7");
+    gu_set_button(26,"8");
+    gu_set_button(27,"9");
+    gu_set_button(28,"10");
+    */
+
     gu_set_button_font1(7,"slct");
-    gu_set_button_font1(8,"reg");
-    //gu_set_button_font1(32,"del"); //ver1.1.0
-
+    gu_set_button_font1(8,"set");
+    
+    gu_button_up(24);
+    gu_button_down(32);
 
     while(1) {
         //タッチスイッチ読み出し
@@ -1677,129 +1815,94 @@
 
             if (cswdata == 0x01) { //タッチしたならば
                 switch( cswnum ) { //SWの番号(位置)
-
-                    case 0x10:  //SW17
-
-                        gu_reverse(0x01);   //gu_リバース指定
-                        gu_set_button(17,"1");
-                        gu_reverse(0x00);   //gu_リバース解除
-                        gu_set_button(19,"2");
-                        gu_set_button(21,"3");
-                        gu_set_button(25,"4");
-                        gu_set_button(27,"5");
-                        gu_set_button(29,"6");
-
-                        calnum = 1;
-
+                
+                    case 23:  //SW24
+                        
+                        if ( digit <= 3 ){
+                            digit += 1;
+                        } else if ( digit == 4 ){
+                            digit = 0;
+                        }
+                        
+                        redraw_sw(digit,17);
+                        
+                        calnum = digit * 10 + 1;
                         show_info(calnum);
-
+                        
                         break;
-
-                    case 0x12:  //SW19
-
-                        gu_reverse(0x01);   //gu_リバース指定
-                        gu_set_button(19,"2");
-                        gu_reverse(0x00);   //gu_リバース解除
-                        gu_set_button(17,"1");
-                        gu_set_button(21,"3");
-                        gu_set_button(25,"4");
-                        gu_set_button(27,"5");
-                        gu_set_button(29,"6");
-
-                        calnum = 2;
-
+                        
+                    case 31: //SW32
+
+                        if ( digit >= 1 ){
+                            digit -= 1;
+                        } else if ( digit == 0 ) {
+                            digit = 4;
+                        }
+
+                        redraw_sw(digit,17);
+
+                        calnum = digit * 10 + 1;                                          
                         show_info(calnum);
-
+                              
                         break;
 
-                    case 0x14:  //SW21
-
-                        gu_reverse(0x01);   //gu_リバース指定
-                        gu_set_button(21,"3");
-                        gu_reverse(0x00);   //gu_リバース解除
-                        gu_set_button(17,"1");
-                        gu_set_button(19,"2");
-                        //gu_set_button(21,"3");
-                        gu_set_button(25,"4");
-                        gu_set_button(27,"5");
-                        gu_set_button(29,"6");
-
-                        calnum = 3;
+                    case 16:  //SW17
+                    case 17:  //SW18
+                    case 18:  //SW19
+                    case 19:  //SW20
+                    case 20:  //SW21
+
+                        calnum = cswnum - 15 + (digit*10);
+
+                        redraw_sw(digit,cswnum + 1);
 
                         show_info(calnum);
 
                         break;
 
-                    case 0x18:  //SW25
-
-                        gu_reverse(0x01);   //gu_リバース指定
-                        gu_set_button(25,"4");
-                        gu_reverse(0x00);   //gu_リバース解除
-                        gu_set_button(17,"1");
-                        gu_set_button(19,"2");
-                        gu_set_button(21,"3");
-                        //gu_set_button(25,"4");
-                        gu_set_button(27,"5");
-                        gu_set_button(29,"6");
-
-                        calnum = 4;
+                    case 24:  //SW25
+                    case 25:  //SW26
+                    case 26:
+                    case 27:
+
+
+                        calnum = cswnum - 18 + (digit*10);
+
+                        redraw_sw(digit,cswnum + 1);
 
                         show_info(calnum);
 
                         break;
 
-                    case 0x1A:  //SW27
-
-                        gu_reverse(0x01);   //gu_リバース指定
-                        gu_set_button(27,"5");
-                        gu_reverse(0x00);   //gu_リバース解除
-                        gu_set_button(17,"1");
-                        gu_set_button(19,"2");
-                        gu_set_button(21,"3");
-                        gu_set_button(25,"4");
-                        //gu_set_button(27,"5");
-                        gu_set_button(29,"6");
-
-                        calnum = 5;
+                    case 28:    //SW29
+
+                        calnum = ((digit + 1 )*10);
+
+                        redraw_sw(digit,cswnum + 1);
 
                         show_info(calnum);
 
                         break;
 
-                    case 0x1C:  //SW29
-
-                        gu_reverse(0x01);   //gu_リバース指定
-                        gu_set_button(29,"6");
-                        gu_reverse(0x00);   //gu_リバース解除
-                        gu_set_button(17,"1");
-                        gu_set_button(19,"2");
-                        gu_set_button(21,"3");
-                        gu_set_button(25,"4");
-                        gu_set_button(27,"5");
-                        //gu_set_button(29,"6");
-
-                        calnum = 6;
-
-                        show_info(calnum);
-
-                        break;
-
-                    case 0x06:  //SW7 CAL選択ボタン
+                    case 0x06:  //SW7 ”slct"(CAL選択)ボタン
 
                         if ( calnum >= 1 && calnum <=6 ) {
                             reg_num = calnum;
 
-                            //EEPROM書込み
-                            wdata[0] = addr_calnum;    //word address 書込み先頭アドレス指定
-                            wdata[1] = reg_num;
-                            Soushin = i2c.write (fixed_adrs, wdata, 2);
-
+                            //ver3 EEPROM書込み Byte Write
+                            wdata[0] = adrs_calnum[0]; //byte address a15~8
+                            wdata[1] = adrs_calnum[1]; //byte address a7~a0
+                            wdata[2] = reg_num;
+                            Soushin = i2c.write (eeprom_adrs, wdata, 3); //send stop at end default value is false.
+
+                            //GU-D
                             gu_reverse(0x01);   //gu_リバース指定
                             gu_set_button_font1(7,"slct");
                             wait(0.2);
                             gu_reverse(0x00);   //gu_リバース解除
 
                             read_caliber(&calinfo,reg_num);
+                            
                             return;
 
                         } else if( calnum == 0 ) {
@@ -1813,16 +1916,17 @@
 
                         break;
 
-                    case 0x07:  //SW8
-
-                        if ( calnum >= 1 && calnum <= 6 ) {
+                    case 0x07:  //SW8 "set"ボタン
+
+                        if ( calnum >= 1 && calnum <= 50 ) {
                             gu_reverse(0x01);   //gu_リバース指定
-                            gu_set_button_font1(8,"reg");
+                            gu_set_button_font1(8,"set");
                             wait(0.2);
                             gu_reverse(0x00);   //gu_リバース解除
 
                             setup_cal_information(calnum);//CAL情報登録画面へ
-                            return;
+                            
+                            //return; ver3.0.0 remove
                         }
                         break;
 
@@ -1848,32 +1952,44 @@
     } //while(1)
 }
 
-/*********************************
+/*******************************************************************************
 
     CAL情報登録画面 サブルーチン
-    表示パラメータ
-    x=0 : vss_iop[V]
-    x=1 : vss_ocp[V]
-    x=2 : vss_voc[V]
-    x=3 : low_limit_voc[V]
-    x=4 : low_limit_iop[uA]
-    x=5 : low_limit_ocp[uA]
-    x=6 : wait_iop[s]
-    x=7 : wait_ocp[s]
-    x=8 : low_limit_resistor[Ω]
-    x=9 : up_limit_resistor[Ω]
-
-    ver1.2.2
-    up_limit_ocp[]の追加と
-    順序の入替え
-
-    x=6 : up_limit_ocp[]
-    x=7 : wait_iop[s]
-    x=8 : wait_ocp[s]
-    x=9 : low_limit_resistor[Ω]
-    x=10 : up_limit_resistor[Ω]
-
-*********************************/
+        項目の表示
+    
+        ver3.0.0    22.4.12
+    
+        x=0  : vss_iop[V]
+        x=1  : vss_ocp[V]
+        x=2  : vss_voc[V]
+        x=3  : low_limit_voc[V]
+        x=4  : low_limit_iop[uA]
+        x=5  : low_limit_ocp[uA]
+        x=6  : up_limit_ocp[uA]
+        x=7  : low_limit_ocp_v[V]
+        x=8  : up_limit_ocp_v[V]
+        x=9  : wait_iop[s]
+        x=10 : wait_ocp[s]
+        x=11 : wait_voc[s]
+        x=12 : low_limit_resistor[Ω]
+        x=13 : up_limit_resistor[Ω]
+        x=14 : cal_name(ASCII)
+        
+        /1.2.1
+        x=0 : vss_iop[V]
+        x=1 : vss_ocp[V]
+        x=2 : vss_voc[V]
+        x=3 : low_limit_voc[V]
+        x=4 : low_limit_iop[uA]
+        x=5 : low_limit_ocp[uA]
+        x=6 : up_limit_ocp[uA] ver1.2.2 追加 
+        x=7 : wait_iop[s]
+        x=8 : wait_ocp[s]
+        x=9 : low_limit_resistor[Ω]
+        x=10 : up_limit_resistor[Ω]
+        /
+
+*******************************************************************************/
 void hyouji_cal_param(char x)
 {
     gu_fontsize(2);
@@ -1917,7 +2033,6 @@
             gu_cursor(208,4);
             gu_print1("[uA]");
             break;
-        //ver1.2.2
         case 6:
             gu_cursor(0,4);
             gu_print1("up limit(O.C.P)");
@@ -1926,43 +2041,66 @@
             break;
         case 7:
             gu_cursor(0,4);
+            gu_print1("low limit(O.C.P)");
+            gu_cursor(208,4);
+            gu_print1("[V]");
+            break; 
+        case 8:
+            gu_cursor(0,4);
+            gu_print1("up limit(O.C.P)");
+            gu_cursor(208,4);
+            gu_print1("[V]");        
+            break;
+        case 9:
+            gu_cursor(0,4);
             gu_print1("Wait(Iop)");
             gu_cursor(208,4);
             gu_print1("[s]");
             break;
-        case 8:
+        case 10:
             gu_cursor(0,4);
             gu_print1("Wait(O.C.P)");
             gu_cursor(208,4);
             gu_print1("[s]");
             break;
-        case 9:
+        case 11:
+            gu_cursor(0,4);
+            gu_print1("Wait(Voc)");
+            gu_cursor(208,4);
+            gu_print1("[s]");
+            break;
+        case 12:
             gu_cursor(0,4);
             gu_print1("low limit(ohm)");
             gu_cursor(208,4);
             wdata[0] = 0xEA; //Ω
             i2c.write( addr_gu, wdata, 1);
             break;
-        case 10:
+        case 13:
             gu_cursor(0,4);
             gu_print1("up limit(ohm)");
             gu_cursor(208,4);
             wdata[0] = 0xEA; //Ω
             i2c.write( addr_gu, wdata, 1);
             break;
-            //ver1.2.2 up to here
-
+        case 14:
+            gu_cursor(0,4);
+            gu_print1("CAL NAME");
+            //gu_cursor(208,4);
+            break;
     }
 }
 
-/*********************************
+/*******************************************************************************
 
     CAL情報登録画面 sub
+    
     para    kind of parameter
     idata   data value
     inc     add number  ex)0x64 0x0A 0x01
 
-*********************************/
+*******************************************************************************/
+/*** 加算 ***/
 void increase_param(char para, signed short *sdata, short inc)
 {
     switch ( para ) { //パラメータの項目によって上限値異なる
@@ -1970,43 +2108,40 @@
         case 1://vss_ocp
         case 2://vss_voc
         case 3://low_limit_voc
+        case 7://low_limit_ocp_v
+        case 8://up_limit_ocp_v
             if(*sdata <= ( 4999 - inc )) {
                 *sdata = *sdata + inc ;
             }
             break;//switch ( param ){
 
-        case 4://low_limit_iop
-        case 5://low_limit_o.c.p
+        case 4: //low_limit_iop
+        case 5: //low_limit_o.c.p
+        case 6: //up_limit_o.c.p
             if(*sdata <= ( 2500 - inc / 10 )) {
                 *sdata = *sdata + inc /10 ;
             }
             break;//switch ( param )
-        case 7://wait_iop
-        case 8://wait_ocp
+        case 9:     //wait_iop
+        case 10:    //wait_ocp
+        case 11:    //wait_voc
 
             if(*sdata <= ( 2550 - inc / 10 )) {
                 *sdata = *sdata + inc / 10 ;
             }
             break;//switch ( param )
 
-        case 9:
-        case 10:
+        case 12: //low_limit_resistor
+        case 13: //up_limit_resistor
             if(*sdata <= ( 2550 - inc )) {
                 *sdata = *sdata + inc;
             }
             break;
-
-        //ver1.2.2
-        case 6://up_limit_o.c.p
-            if(*sdata <= ( 2500 - inc / 10 )) {
-                *sdata = *sdata + inc /10 ;
-            }
-            break;//switch ( param )
-            //ver1.2.1 up to here
-
+        
     }//switch ( param ){
 }
 
+/*** 減算 ***/
 void decrease_param(char para, signed short *sdata, short dec)
 {
     switch ( para ) { //パラメータの項目によって上限値異なる
@@ -2014,6 +2149,8 @@
         case 1://vss_ocp
         case 2://vss_voc
         case 3://low_limit_voc
+        case 7://low_limit_ocp_v
+        case 8://up_limit_ocp_v
 
             if(*sdata >= dec ) {
                 *sdata = *sdata - dec;
@@ -2028,42 +2165,74 @@
             break;
 
         case 5://low_limit_o.c.p
+        case 6://up_limit_o.c.p        
 
             if(*sdata >= -2500 + dec / 10 ) {
                 *sdata = *sdata - dec / 10;
             }
             break;
 
-        case 7://wait_iop
-        case 8://wait_ocp
+        case 9:     //wait_iop
+        case 10:    //wait_ocp
+        case 11:    //wait_voc
 
             if(*sdata >= dec / 10 ) {
                 *sdata = *sdata - dec / 10 ;
             }
             break;//switch ( param )
 
-        case 9:
-        case 10:
+        case 12:    //low_limit_resistor
+        case 13:    //up_limit_resistor
+        
             if(*sdata >= dec ) {
                 *sdata = *sdata - dec;
             }
             break;
 
-        //ver1.2.1
-        case 6://up_limit_o.c.p
-
-            if(*sdata >= -2500 + dec / 10 ) {
-                *sdata = *sdata - dec / 10;
-            }
-            break;
-            //ver1.2.1 ここまで
-
     }//switch ( param ){
 }
-/*********************************
+
+/*******************************************************************************
+
+    CAL NAME (ASCII)
+        3文字で構成(ex.B61)。1文字づつ上下キーで変更する。
+        範囲はASCII表において 0x30~0x5A
+        
+        ver3.0.0 2022.4.13
+
+*******************************************************************************/
+/*** UP ***/
+void up_ascii(char *c){
+
+    if (*c >= 0x5A ){
+        *c = 0x30;
+    } else if ( *c < 0x30 ){
+        *c = 0x30;
+    } else {
+        *c = *c + 1;
+    }       
+
+}
+/*** DOWN ***/
+void down_ascii(char *c){
+
+    if (*c > 0x5A ){
+        *c = 0x5A;
+    } else if ( *c <= 0x30 ){
+        *c = 0x5A;
+    } else {
+        *c = *c - 1;
+    }       
+
+}
+
+/*******************************************************************************
 
     CAL情報登録画面   MAIN
     別途システム設計図,EEPROMのシートを参照
+    
+    ver3.0.0
+    
     param:
         0:vss_iop
         1:vss_ocp
@@ -2071,29 +2240,34 @@
         3:low_limit_voc
         4:low_limit_iop
         5:low_limit_ocp
-        6:up_limit_ocp ver1.2.2
-        7:wait_iop
-        8:wait_ocp
-        9:LowLimitResistor
-        10:UPLimitResistor
-
-*********************************/
-void setup_cal_information(char cal_num)   //xは登録ナンバー=EEPROMのPAGEナンバーex)登録No.1→BLOCK0x00 PAGE0x00
+        6:up_limit_ocp
+        7:low_limit_ocp_v
+        8:up_limit_ocp_v
+        9:wait_iop
+        10:wait_ocp
+        11:wait_voc
+        12:LowLimitResistor
+        13:UPLimitResistor
+        14:CAL_name
+
+*******************************************************************************/
+void setup_cal_information(char cal_num)
 {
     char            param;              //設定するパラメータの選択 0~9まで ver1.2.1 0~10まで
     char            crdata[3];
-    signed short    sdata_cal[16];      //CAL設定条件
+    signed short    sdata_cal[18];      //CAL設定条件
     signed short    hyouji_data;
-    int             param_sum;            //設定するパラメータの数 ver1.2.1
+    int             param_sum;          //設定するパラメータの数 ver1.2.1
+    char            c_temp[3];          //CAL設定条件 calinfo.name
     //int i;
     //short           sdata_byte[16];     //EEPROM BYTEごとのDATA 1byte
     //char          cmd_gu[32];         //gu-DへのI2Cコマンド用配列 1byte0
     //char            adrs_cal;           //EEPROM CAL情報を保存しているアドレス 0x90~
 
-    param_sum = 11; //ver1.2.1
+    param_sum = 14; //ver3.0.0 //11; //ver1.2.1
 
     //画面表示
-    gu_cls();//画面のクリア
+    gu_cls();//画面クリア
     gu_fontsize(2);
     gu_print1("Setup Cal No.");
     wdata[0] = ( cal_num % 10 ) + 0x30;//CALナンバーの表示
@@ -2108,25 +2282,24 @@
     sdata_cal[3] = calinfo.low_limit_voc;
     sdata_cal[4] = calinfo.low_limit_iop;
     sdata_cal[5] = calinfo.low_limit_ocp;
-    //ver1.2.2
     sdata_cal[6] = calinfo.up_limit_ocp;
-    sdata_cal[7] = calinfo.wait_iop;
-    sdata_cal[8] = calinfo.wait_ocp;
-    sdata_cal[9] = calinfo.low_limit_resistor;
-    sdata_cal[10] = calinfo.up_limit_resistor;
-    /*
-    sdata_cal[6] = calinfo.wait_iop;
-    sdata_cal[7] = calinfo.wait_ocp;
-    sdata_cal[8] = calinfo.low_limit_resistor;
-    sdata_cal[9] = calinfo.up_limit_resistor;
-    */
-    //ver1.2.2 up to here
-
+    sdata_cal[7] = calinfo.low_limit_ocp_v;
+    sdata_cal[8] = calinfo.up_limit_ocp_v;
+    sdata_cal[9] = calinfo.wait_iop;
+    sdata_cal[10] = calinfo.wait_ocp;
+    sdata_cal[11] = calinfo.wait_voc;
+    sdata_cal[12] = calinfo.low_limit_resistor;
+    sdata_cal[13] = calinfo.up_limit_resistor;
+
+    c_temp[0] = calinfo.name[0];
+    c_temp[1] = calinfo.name[1];
+    c_temp[2] = calinfo.name[2];
+    
     //ボタンの配置
-    gu_set_button_font1(8,"reg");
+    gu_set_button_font1(7,"esc");   //ver3.0.0 add
+    gu_set_button_font1(8,"save");
     gu_button_up(17);
     gu_button_down(25);
-
     gu_button_up(20);
     gu_button_up(22);
     gu_button_up(24);
@@ -2134,15 +2307,6 @@
     gu_button_down(30);
     gu_button_down(32);
 
-    /*
-    gu_button_up(21);
-    gu_button_up(22);
-    gu_button_up(23);
-    gu_button_down(29);
-    gu_button_down(30);
-    gu_button_down(31);
-    */
-
     //初期表示はVss_Iop
     param = 0;
     gu_cursor(0,4);
@@ -2160,33 +2324,9 @@
 
             switch( crdata[1] ) { //SWの番号(位置)
 
-                /* ver1.2.1
                 case 0x10 ://sw17 パラメータ変更スイッチ(上)
 
-                    if ( param <= 8 ) {
-                        param = param + 1;
-                    } else {
-                        param = 0;
-                    }
-
-                    hyouji_cal_param(param);//設定パラメータ表示
-                    break;
-
-                case 0x18 ://sw25 パラメータ変更スイッチ(下)
-
-                    if ( param >= 1 ) {
-                        param = param - 1;
-                    } else {
-                        param = 9;
-                    }
-
-                    hyouji_cal_param(param);//設定パラメータ表示
-                    break;
-                */
-
-                case 0x10 ://sw17 パラメータ変更スイッチ(上)
-
-                    if ( param <= param_sum -2 ) {
+                    if ( param <= param_sum -1 ) {
                         param = param + 1;
                     } else {
                         param = 0;
@@ -2200,77 +2340,104 @@
                     if ( param >= 1 ) {
                         param = param - 1;
                     } else {
-                        param = param_sum - 1;
+                        param = param_sum;
                     }
 
                     hyouji_cal_param(param);//設定パラメータ表示
                     break;
 
-                //ver1.2.1 up to here
-
                 case 19 ://SW20 increase 0x3E8
 
-                    increase_param(param, &sdata_cal[param], 1000);
+                    // if set caliber name .. ver3
+                    if ( param == 14 ){ 
+                        up_ascii(&c_temp[0]);
+                    } else {    
+                        increase_param(param, &sdata_cal[param], 1000);
+                    }
                     break;
 
                 case 27 ://SW28 decrease 0x3E8
 
-                    decrease_param(param, &sdata_cal[param], 1000);
+                    if ( param == 14 ){ 
+                        down_ascii(&c_temp[0]);
+                    } else {    
+                        decrease_param(param, &sdata_cal[param], 1000);
+                    }
                     break;
 
                 case 0x15 ://SW22 increase 0x64
 
-                    increase_param(param, &sdata_cal[param], 100);
+                    if ( param == 14 ){ 
+                        up_ascii(&c_temp[1]);
+                    } else {
+                        increase_param(param, &sdata_cal[param], 100);
+                    }
                     break;
 
                 case 0x1D ://SW30 decrease 0x64
 
-                    decrease_param(param, &sdata_cal[param], 100);
+                    if ( param == 14 ){ 
+                        down_ascii(&c_temp[1]);
+                    } else {
+                        decrease_param(param, &sdata_cal[param], 100);
+                    }
                     break;
 
                 case 23 ://SW24 increase 0x0A
 
-                    increase_param(param, &sdata_cal[param], 10);
+                    if ( param == 14 ){ 
+                        up_ascii(&c_temp[2]);
+                    } else {
+                        increase_param(param, &sdata_cal[param], 10);
+                    }
                     break;
 
                 case 31 ://SW32 decrease 0x0A
 
-                    decrease_param(param, &sdata_cal[param], 10);
+                    if ( param == 14 ){ 
+                        down_ascii(&c_temp[2]);
+                    } else {
+                        decrease_param(param, &sdata_cal[param], 10);
+                    }
                     break;
-
-
-                case 0x07 ://保存ボタン
-
+                    
+                case 6:     //SW7 "esc"ボタン
+                    
+                    return; //何もせずに抜ける
+
+                case 0x07 : //SW8 "save"保存ボタン
+                
+                    //ver3 CAL情報 代入
+                    //*** ver3 ***
                     calinfo.vss_iop = sdata_cal[0];
                     calinfo.vss_ocp = sdata_cal[1];
                     calinfo.vss_voc = sdata_cal[2];
                     calinfo.low_limit_voc = sdata_cal[3];
                     calinfo.low_limit_iop = sdata_cal[4];
                     calinfo.low_limit_ocp = sdata_cal[5];
-                    //ver1.2.2
                     calinfo.up_limit_ocp = sdata_cal[6];
-                    calinfo.wait_iop = sdata_cal[7];
-                    calinfo.wait_ocp = sdata_cal[8];
-                    calinfo.low_limit_resistor = sdata_cal[9];
-                    calinfo.up_limit_resistor = sdata_cal[10];
-                    /*
-                    calinfo.wait_iop = sdata_cal[6];
-                    calinfo.wait_ocp = sdata_cal[7];
-                    calinfo.low_limit_resistor = sdata_cal[8];
-                    calinfo.up_limit_resistor = sdata_cal[9];
-                    */
-                    //ver1.2.2 up to here
-
+                    calinfo.up_limit_ocp_v = sdata_cal[7]; 
+                    calinfo.low_limit_ocp_v = sdata_cal[8];
+                    calinfo.wait_iop = sdata_cal[9];
+                    calinfo.wait_ocp = sdata_cal[10];
+                    calinfo.wait_voc = sdata_cal[11];
+                    calinfo.low_limit_resistor = sdata_cal[12];
+                    calinfo.up_limit_resistor = sdata_cal[13];
+                    
+                    calinfo.name[0] = c_temp[0];
+                    calinfo.name[1] = c_temp[1];
+                    calinfo.name[2] = c_temp[2];    
+
+                    //ver3 Byte Write CALNO.EEPROM 書込み 
                     reg_num = cal_num;
-
-                    //CALNO.EEPROM書込み
-                    wdata[0] = addr_calnum;    //word address 書込み先頭アドレス指定
-                    wdata[1] = reg_num;
-                    Soushin = i2c.write (fixed_adrs, wdata, 2);
-
+                    wdata[0] = adrs_calnum[0];
+                    wdata[1] = adrs_calnum[1];
+                    wdata[2] = reg_num;
+                    
+                    Soushin = i2c.write (eeprom_adrs, wdata, 3); //send stop at end
                     wait(0.2);
 
-                    //CAL情報
+                    //CAL情報 >> EEPROM
                     //送信完了ならば実行
                     if(Soushin == 0) {
 
@@ -2288,7 +2455,7 @@
                     //送信完了ならば実行
                     if(Soushin == 0) {
                         gu_reverse(1);
-                        gu_set_button_font1(8,"reg");
+                        gu_set_button_font1(8,"save");
                         wait(0.2);
                         return;//CAL情報登録画面を抜ける
 
@@ -2305,38 +2472,46 @@
 
             } //switch
         } //if
-        //gu-D表示
-        gu_cursor(150,4);
+        
+        //gu-D表示 ver3
+        
+        gu_cursor(150,4);   //表示位置の指定
 
         switch ( param ) {
             case 0://vss_iop
             case 1://vss_ocp
             case 2://vss_voc
             case 3://low_limit_voc
+            case 7://low_limit_voc_v
+            case 8://up_limit_voc_v
                 hyouji_data = sdata_cal[param] * -1;
                 gu_putdeck ( &hyouji_data );
                 break;
-            case 4:
-            case 5:
+                
+            case 4://low_limit_iop
+            case 5://low_limit_ocp
+            case 6://up_limit_ocp
                 hyouji_data = sdata_cal[param] * 10;
                 gu_putdeck ( &hyouji_data );
                 break;
-            //ver1.2.2
-            case 6:
-                hyouji_data = sdata_cal[param] * 10;
-                gu_putdeck ( &hyouji_data );
-                break;
-            case 7:
-            case 8:
+                
+            case 9:  //wait_iop
+            case 10: //wait_ocp
+            case 11: //wait_voc
                 //ver1.1.0
                 hyouji_data = sdata_cal[param];
                 gu_putdec ( &hyouji_data );
                 break;
-            case 9://low_limit_resistor
-            case 10://up_limit_resistor
+                
+            case 12://low_limit_resistor
+            case 13://up_limit_resistor
                 hyouji_data = sdata_cal[param];
                 gu_putdec ( &hyouji_data );
                 break;
+                
+            case 14: //cal name ver3
+                i2c.write(addr_gu, c_temp, 3); //3byte ascii code
+                break;
                 /*
                 case 6:
                 case 7:
@@ -2864,7 +3039,7 @@
         dac_out( calinfo.vss_voc,i); //Vss設定 DAC_A~D
     }
 
-    wait( wait_voc );
+    wait( wait_voc_1 );
 
     for ( i = 0; i <= ( noc -1 ); i++) {
         io[i] = 1; //io1 = "H"
@@ -3413,7 +3588,10 @@
         }
 
         if ( SEQ_EN == 1 && err_f[i] == 0 ) {
+            /*** ver3
             seq_hantei[i] = 1;
+            ***/
+            seq_out[i] = 1;
         }
 
         //ver1.2.3
@@ -3467,13 +3645,15 @@
 
 }
 
-/*********************************
+/*******************************************************************************
 
     measure voltage
     測定CHを指定して、電圧値Rを返す
     char ch 0~3 -> 1ch ~ 4ch
 
-*********************************/
+        ver3.0.0    リレー制御シーケンスを追加
+
+*******************************************************************************/
 short meas_voltage(char ch)//ch 0~3 -> 1ch ~ 4ch
 {
     char    com;
@@ -3481,34 +3661,67 @@
 
     switch(ch) {
         case 0:
+            /*** v3 debag *************/
+            rlen[4] = 1; //RLEN5="H"
+            wait(ton_rr);
+            /**************************/
+            
             com = adc_config(2,0);//ch1(adc),12bit
             i2c.write( addr_ADC1, &com, 1);
             wait(0.1);
             sdata = read_adc(addr_ADC1);
             break;
+            
         case 1:
+        
+            /*** v3 debag *************/
+            rlen[5] = 1; //RLEN6="H"
+            wait(ton_rr);
+            /**************************/
+        
             com = adc_config(3,0);//ch2(adc),12bit
             i2c.write( addr_ADC1, &com, 1);
             wait(0.1);
             sdata = read_adc(addr_ADC1);
             break;
+            
         case 2:
+
+            /*** v3 debag *************/
+            rlen[6] = 1; //RLEN7="H"
+            wait(ton_rr);
+            /**************************/
+            
             com = adc_config(2,0);//ch1(adc),12bit
             i2c.write( addr_ADC2, &com, 1);
             wait(0.1);
             sdata = read_adc(addr_ADC2);
             break;
+            
         case 3:
+        
+            /*** v3 debag *************/
+            rlen[7] = 1; //RLEN8="H"
+            wait(ton_rr);
+            /**************************/
+            
             com = adc_config(3,0);//ch2(adc),12bit
             i2c.write( addr_ADC2, &com, 1);
             wait(0.1);
             sdata = read_adc(addr_ADC2);
             break;
+            
     }// end switch
+    
+    /*** ver3 ***/
+    //電圧測定用リレーを全てオフ
+    for (int i = 4; i <= 7; i++){
+        rlen[i] = 0;
+        wait(toff_rr);
+    }
+    /************/
 
     //プリアンプ倍率を代入して、電圧値を算出する(単位はmV)
-
-
     sdata = sdata * 5;//プリアンプ倍率
 
     return ( sdata );
@@ -3635,16 +3848,20 @@
 *********************************/
 void read_syoudo(char* c)
 {
-    char cmd;       //gu-DへのI2Cコマンド用配列 1byte0
+    //char cmd;       //gu-DへのI2Cコマンド用配列 1byte0
     //char csyoudo[4];//led出力用pwm duty 設定比1バイト255段階
+
     float duty_pwm; //pwm パーセンテージ
     int i;
 
-    //
     //メモリ10h番地(照度設定データ)読み出し
-    cmd = 0x10;
-    i2c.write (fixed_adrs, &cmd, 1,true);    //読込先頭アドレス指定 ReStart
-    i2c.read ((fixed_adrs + 0x01), rdata, 4);//read 1byte
+    //cmd[0] = 0x10;  //ver3
+    //Sequential Read
+
+    i2c.write (eeprom_adrs, adrs_syoudo, 2,true);   //ver3 repeated start,true - do not send stop condition
+    //i2c.write (slave_adrs, &cmd, 1,true);         //ver3 send 1 byte remove stop condition
+    slave_adrs = eeprom_adrs + 0x01;                //ver3 read mode
+    i2c.read (slave_adrs, rdata, 4);                //read 4 byte
 
     for ( i = 0; i <=3; i++) {
         c[i] = rdata[i];
@@ -3868,15 +4085,16 @@
 
                         break;
 
-                    case 7 ://SW.8 保存ボタンを押すと現在の輝度をEEPROMへ保存する
-
-                        wdata[0] = 0x10 ; //word address 書込み先頭アドレス指定
+                    case 7 ://SW.8 保存ボタンを押すと現在のLED照度をEEPROMへ保存する
+
+                        wdata[0] = adrs_syoudo[0]; //word address 書込み先頭アドレス指定
+                        wdata[1] = adrs_syoudo[1];  //ver3
 
                         for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
-                            wdata[ i + 1 ] = csyoudo[i]; //DATA_LED i
+                            wdata[ i + 2 ] = csyoudo[i]; //DATA_LED i
                         }
 
-                        Soushin = i2c.write (fixed_adrs, wdata,( number_of_channels + 1 ));
+                        Soushin = i2c.write (eeprom_adrs, wdata,( number_of_channels + 2 )); // ver3 全送信BYTE数は、書込みデータにBYTE ADDRESSの2byteを加算した数
 
                         if(Soushin == 0) {
                             gu_Button_power_off();//電源ボタンイメージ反転表示
@@ -3954,9 +4172,10 @@
     char *pcswdata = &cswdata;
     //
     //メモリ00h番地(輝度設定データ)読み出し
-    wdata[0] = 0x00;
-    Soushin = i2c.write (fixed_adrs, wdata, 1,true);    //読込先頭アドレス指定 ReStart
-    Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 1);//read 1byte
+    //wdata[0] = 0x00;
+    //Soushin = i2c.write (eeprom_adrs, wdata, 1,true);    //読込先頭アドレス指定 ReStart
+    Soushin = i2c.write (eeprom_adrs, adrs_kido, 2,true);    //ver3 読込先頭アドレス指定 2byte
+    Jyushin = i2c.read ((eeprom_adrs + 0x01), rdata, 1);//read 1byte
     *pclumi = rdata[0];
 
     //輝度設定更新
@@ -4031,9 +4250,14 @@
 
                     case 0x07 ://保存ボタンを押すと現在の輝度をEEPROMへ保存する
 
-                        wdata[0] = 0x00 ; //word address 書込み先頭アドレス指定
-                        wdata[1] = *pclumi ; //DATA
-                        Soushin = i2c.write (fixed_adrs, wdata, 2);
+                        //wdata[0] = 0x00 ; //word address 書込み先頭アドレス指定
+                        //wdata[1] = *pclumi ; //DATA
+                        
+                        wdata[0] = adrs_kido[0];    //ver3
+                        wdata[1] = adrs_kido[1];    //ver3                        
+                        wdata[2] = *pclumi ;        //ver3
+                        
+                        Soushin = i2c.write (eeprom_adrs, wdata, 3); //ver3 
 
                         if(Soushin == 0) {
                             gu_Button_power_off();//電源ボタンイメージ反転表示