ILF / Mbed 2 deprecated mbed_ILF

Dependencies:   mbed SDFileSystem

Revision:
6:cd0b4dc7eeb2
Parent:
5:569cfdb08f5b
Child:
11:73676f3114f1
--- a/ILF3.cpp	Wed Apr 20 01:40:07 2022 +0000
+++ b/ILF3.cpp	Mon Apr 25 07:48:36 2022 +0000
@@ -90,7 +90,16 @@
 
 *******************************************************************************/
 //
-//各種定数
+//定数
+//
+//soft ver
+const int version_major = 3;
+const int version_minor = 0;
+const int version_build = 0;
+
+const char pass[] = "ILF";      //password(大文字)
+#define YOSO            3       //password文字数
+
 #define O_L             100     //[uA]電流測定値のオーバーロード値 //ver1.2.5
 /*
 #define CAP             20      //[uF] 積分回路のコンデンサ容量
@@ -102,41 +111,104 @@
 #define GAIN_V          0.2     //電流測定プリアンプのGAIN
 */
 #define DEB_EN          0       //デバッグイネーブル:1 ディスイネーブル:0 ver1.2.3
-#define RL_EN           1       //1:io[]を外付けのリードリレー制御用に使用する場合は1.以外は0. ver1.2.3
+#define RL_EN           0       //1:io[]を外付けのリードリレー制御用に使用する場合は1.以外は0. ver1.2.3
 #define SEQ_EN          0       //1:シーケンサ接続仕様 0:シーケンサ未接続仕様
 #define period_pwm      200     //*us
-#define COP             0.005   //pwm_duty(%) = COP * DATA(0~255)
+#define COP             0.0039  //pwm_duty(%) = COP * DATA(0~255) ver3 0.005 -> 0.0039
 #define rsense          1000    //抵抗測定回路のプルアップ抵抗値 1kΩ
 #define res_vref        0x800   //抵抗測定回路のリファレンス電圧 2.048V
 #define dac_vref        2500    //DACのリファレンス電圧 単位[mV]
-#define number_of_channels   2  //測定チャンネル数(MAX 4)
+#define number_of_channels   4  //測定チャンネル数(MAX 4)
 #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_1      0.5     //[s]VOC測定電圧設定後からリセットまでの時間
-#define wait_reset      0.3     //[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
- -----------------------------------
-|Resolution Setting  |   LSB        |
- -----------------------------------
-|    12bits(00)      |   1mv        |
-|    14bits(01)      |   250uV      |
-|    16bits(10)      |   62.5uV     |
-|    18bits(11)      |   15.625uV   |
- -----------------------------------
-****************************************/
-//soft ver
-const int version_major = 3;
-const int version_minor = 0;
-const int version_build = 0;
+const bool tenken = true;       //日常点検用 マニュアルモードにて True:測定CHのみVSS出力 False:全CH,VSS出力
+
+//Display
+#define touch           5                   //GU-D タッチパネル感度 0~7で設定。低いほど敏感。
+const char sw_up_set[] = {20,21,22,23};     //CAL情報セット画面におけるUPスイッチの表示位置番号
+const char sw_down_set[] = {28,29,30,31};   //CAL情報セット画面におけるDOWNスイッチの表示位置番号
+const int zahyou_para1[] = {0,2};       //CAL情報セット画面における項目の表示位置座標
+const int zahyou_para2[] = {0,4};       //CAL情報セット画面における項目の表示位置座標
+const int zahyou_val[] = {96,4};       //CAL情報セット画面における数値の表示位置座標
+const int zahyou_unit[] = {160,4};     //CAL情報セット画面における単位の表示位置座標
+const char *cpara1[]= {
+    "IOP",      //x=0  : vss_iop[V]
+    "OCP",      //x=1  : vss_ocp[V]
+    "VOC",      //x=2  : vss_voc[V]
+    "VOC",      //x=3  : low_limit_voc[V]
+    "IOP",      //x=4  : low_limit_iop[uA]
+    "OCP",      //x=5  : low_limit_ocp[uA]
+    "OCP",      //x=6  : up_limit_ocp[uA]
+    "OCP",      //x=7  : low_limit_ocp_v[V]
+    "OCP",      //x=8  : up_limit_ocp_v[V]
+    "IOP",      //x=9  : wait_iop[s]
+    "OCP",      //x=10 : wait_ocp[s]
+    "VOC",      //x=11 : wait_voc[s]
+    "ANTENA",   //x=12 : low_limit_resistor[Ω]
+    "ANTENA",   //x=13 : up_limit_resistor[Ω]
+    ""          //x=14 : cal_name(ASCII)
+};
+const char *cpara2[]= {
+    "VSS",              //x=0  : vss_iop[V]
+    "VSS",              //x=1  : vss_ocp[V]
+    "VSS",              //x=2  : vss_voc[V]
+    "LOW LIMIT",        //x=3  : low_limit_voc[V]
+    "LOW LIMIT",        //x=4  : low_limit_iop[uA]
+    "LOW LIMIT",        //x=5  : low_limit_ocp[uA]
+    "UP  LIMIT",        //x=6  : up_limit_ocp[uA]
+    "LOW LIMIT",        //x=7  : low_limit_ocp_v[V]
+    "UP  LIMIT",        //x=8  : up_limit_ocp_v[V]
+    "WAIT",             //x=9  : wait_iop[s]
+    "WAIT",             //x=10 : wait_ocp[s]
+    "WAIT",             //x=11 : wait_voc[s]
+    "LOW LIMIT",        //x=12 : low_limit_resistor[Ω]
+    "UP  LIMIT",        //x=13 : up_limit_resistor[Ω]
+    "NAME"                  //x=14 : cal_name(ASCII)
+};
+const char *cunit[]= {
+    "V",                //x=0  : vss_iop[V]
+    "V",                //x=1  : vss_ocp[V]
+    "V",                //x=2  : vss_voc[V]
+    "V",                //x=3  : low_limit_voc[V]
+    "uA",               //x=4  : low_limit_iop[uA]
+    "uA",               //x=5  : low_limit_ocp[uA]
+    "uA",               //x=6  : up_limit_ocp[uA]
+    "V",                //x=7  : low_limit_ocp_v[V]
+    "V",                //x=8  : up_limit_ocp_v[V]
+    "s",                //x=9  : wait_iop[s]
+    "s",                //x=10 : wait_ocp[s]
+    "s",                //x=11 : wait_voc[s]
+    "",                //x=12 : low_limit_resistor[Ω]
+    "",                //x=13 : up_limit_resistor[Ω]
+    ""                  //x=14 : cal_name(ASCII)
+};
+
+/*
+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)
+*/
+
 
 /*******************************************************************************
 
@@ -161,7 +233,7 @@
 Serial uart(P0_15,P0_16,9600);
 
 /*** interruput ***/
-InterruptIn seq_yobi(P0_19);
+//InterruptIn seq_yobi(P0_19);
 
 /*** start sw ***/
 DigitalIn sw_start(P0_4);
@@ -193,6 +265,13 @@
     DigitalOut( P0_26 )   //io16
 };
 
+DigitalOut io_reset[] = {
+    DigitalOut( P1_22 ),  //io9
+    DigitalOut( P1_23 ),  //io10
+    DigitalOut( P1_24 ),  //io11
+    DigitalOut( P1_25 ),  //io12
+};
+
 /*
 DigitalOut  io[]  = {  //  配列を用意します
     DigitalOut( P0_25 ),  //io1 配列の1番目の要素をP0_25で初期化したDigitalOutに
@@ -290,7 +369,7 @@
 
 /*******************************************************************************
 
- SD Card
+    SD Card
  
 *******************************************************************************/
 void sd_writetext(char* text);
@@ -353,6 +432,17 @@
 void gu_Button_power_on();
 void gu_Button_power_off();
 //
+/*******************************************************************************
+
+    表示関数
+
+*******************************************************************************/
+void    select_cal();   //CAL選択画面
+void    setup_cal_information(char cal_num);    //CAL情報登録画面
+void    manual_int_hyouji();
+void    auto_int_hyouji();
+void    disp_setup_cal(char cal_num ,int parameter);   //CAL情報登録画面表示
+//
 //******************************************************************************
 
 //    CAT24M01(EEPROM)
@@ -376,30 +466,12 @@
 //
 #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
-***************************/
+/*******************************************************************************
+
+    LCP1768(EEPROM) addr:15H
+
+*******************************************************************************/
 //parameter_PCAS08A(EEPROM)
 //const   int addr_EEPROM = 0x15 << 3; // Address of PCAS08A(EEPROM) コメント化 ver1.2.1
 //char    rdata[17]; //EEPROMからのリードデータ
@@ -409,9 +481,21 @@
 //const   int eeprom_adrs = 0x15 << 3; // Address of PCAS08A(EEPROM) 始めの5bit ver1.2.1
 //int     slave_adrs; //slave address ver1.2.1
 //
-/***************************
-MCP3424(ADC)
-***************************/
+/*******************************************************************************
+    
+    MCP3424(ADC)
+
+    RESOLUTION SETTINGS VS. LSB
+     -----------------------------------
+    |Resolution Setting  |   LSB        |
+     -----------------------------------
+    |    12bits(00)      |   1mv        |
+    |    14bits(01)      |   250uV      |
+    |    16bits(10)      |   62.5uV     |
+    |    18bits(11)      |   15.625uV   |
+     -----------------------------------
+
+*******************************************************************************/
 //parameter_ADC(MCP3424)
 const   int addr_ADC1 = 0x6C <<1;//電圧抵抗測定No.1,No.2用ADC
 const   int addr_ADC2 = 0x6A <<1;//電圧抵抗測定No.3,No.4用ADC
@@ -424,25 +508,20 @@
 void    general_call(char com); //power on reset
 char    adc_config(char ch, char rate);
 //
-/***************************
-AD5625RBUZ(DAC) addr:1F
-***************************/
+/*******************************************************************************
+
+    AD5625RBUZ(DAC) addr:1F
+
+*******************************************************************************/
 const   char addr_dac = 0x1F <<1;
 void    dac_out(short mvolt, char addr);
 void    dac_init();
 //
-/***************************
-表示
-関数
-***************************/
-void    select_cal();//CAL選択画面
-void    setup_cal_information(char cal_num);//CAL情報登録画面
-void    manual_int_hyouji();
-void    auto_int_hyouji();
-/***************************
-測定関係
-関数
-***************************/
+/*******************************************************************************
+
+    測定関係関数
+
+*******************************************************************************/
 void    set_pullup();//シーケンサからの入力ピンのプルアップ設定
 void    trigger();//シーケンサからのスタート信号割込みサブ
 void    calibration();
@@ -464,40 +543,26 @@
 void    display_resistor(short sdata);//測定値を表示する。
 void    led_off();//判定用LED全消灯
 void    read_syoudo(char* c);//EEPROMから照度データ(PwmDuty)を読み込んでセットする
-
 //
-/***************************
-測定関係
-変数
-***************************/
+/*******************************************************************************
+
+    測定関係 変数
+    
+*******************************************************************************/
 char    io_voc; //VOC測定時のIO操作。ON(=VDD)の場合は”0x01"OFF(=OPEN)は"0x00"
 char    err_f[4];//ch1~4 規格外発生時のフラグ 0or1
 short   V[4];//ADC入力値を3倍した値 測定値[V] 16進数
 float   I[4];//電流測定値チャンネル毎の
 short   R[4];//抵抗測定値
 short   voc[4];//ADC入力値を3倍した値 測定値[mV] 16進数
-short   vocp[4];//過充電防止確認用電圧
+short   vocp[4];//過充電防止時のHD測定電圧
 float   iop[4];//2byte 補数あり 測定値 1bit 0.01uA
 float   ocp[4];//2byte 補数あり 測定値
 char    ch_num ;//選択中の測定チャネル(0~3)
 
-/**********************
-暫定
-**********************/
-/*
-#define     vss_voc     3600
-#define     vss_iop     2800
-#define     vss_ocp     3600
-#define     wait_vss    4
-#define     wait_io     2
-#define     low_limit_voc   0xCE4//[mv] HEX
-#define     low_limit_iop   0x44C//11uA換算:1100*0.01
-#define     low_limit_ocp   0xFFE2//-0.3uA換算
-*/
-
 //structure
 struct cal_info {
-    char    name[3];            // CAL NAME ASCII CODE ver3
+    char    name[4];            // CAL NAME ASCII CODE ver3
     short   number;             // CAL.No.
     short   vss_iop;            // IOP測定時のVss電圧 1bit * 0.01uA
     short   vss_ocp;            // 過充電防止(over charge protection)測定時のVss電圧
@@ -512,7 +577,7 @@
     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
+    float   wait_voc;           // リセット立上りからVOC測定までの待機時間[s] 1bit 1s 換算 ver3
 } ;
 
 //parameter
@@ -549,19 +614,12 @@
 void set_pullup()
 {
     /*** ver3 ***/
+    sw_start.mode(PullUp);
+    
     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);
-    seq_cal_b.mode(PullUp);
-    seq_cal_c.mode(PullUp);
-    seq_kosuu_a.mode(PullUp);
-    seq_kosuu_b.mode(PullUp);
-    */
 }
 /*******************************
 
@@ -681,7 +739,7 @@
 *******************************************************************************/
 void write_caliber_information(cal_info *cal, int num)
 {
-    char   cdata[28];   //1byte*x
+    char   cdata[29];   //1byte*x
     int adrs_init;
     int adrs;
 
@@ -732,9 +790,9 @@
     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);
+    cdata[28] = calinfo.name[3];                            //0x1A
+
+    Soushin = i2c.write (eeprom_adrs, cdata, 29);
 
     wait(0.2); //ver3
 
@@ -755,7 +813,7 @@
     int i;
     int adrs_init;
     int adrs;
-    char cdata[26];
+    char cdata[27];
     
     adrs_init = ((adrs_calinfo[0] << 8 ) & 0xFF00) + (adrs_calinfo[1] & 0x00FF);
     
@@ -766,7 +824,7 @@
 
     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 
+    Jyushin = i2c.read ((eeprom_adrs + 0x01), (cdata + 1), 27);//read 27byte 
     
     /*** ver3.0.0 debug***/
     if ( Jyushin != 0 ){
@@ -801,7 +859,7 @@
     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
+    cal -> name[3] = cdata[26];         //0x1A cal name
 
 }
 /*******************************************************************************
@@ -895,13 +953,13 @@
 
     return( confreg );
 }
-/******************************************
+/*******************************************************************************
 
     ADC(MCP3424) Configuration Register
     電流測定チャンネルの選択
     char ch : 1~4ch
 
-******************************************/
+*******************************************************************************/
 void select_ich(char ch)
 {
     char    com;
@@ -930,11 +988,35 @@
     ADC(MCP3424)
     指定addressから2byte読込み
 
+        ver3.0.0 20ms間隔の5回平均
+
 *******************************************************************************/
 short read_adc(char addr)//指定addressから2byte読込み
 {
     char cdata[2];//1byte
     short sdata;//2byte
+    //short kekka;
+    //short goukei;
+    //int bosu = 5;
+
+    i2c.read( addr + 0x01, cdata, 2);
+
+    /*
+    for( int i = 0; i < bosu; i++){
+        i2c.read( addr + 0x01, cdata, 2);
+
+        //connect 2byte
+        kekka = cdata[0] & 0xFF;
+        kekka = ( sdata << 8 ) | cdata[1];
+
+        goukei += kekka;
+        
+        wait(0.1);
+
+    }
+     
+    sdata = goukei / bosu;
+    */
 
     i2c.read( addr + 0x01, cdata, 2);
 
@@ -1040,6 +1122,23 @@
     houden[ ch_num ] = 1; //Discharge
 
     wait(time_discharge); //Discharge time
+    
+    /*** ver3.0.0 ***/
+    
+    //電圧測定
+    sdata = meas_voltage( ch_num ) * -1 ;
+    gu_fontsize(2);
+    gu_cursor(108,4);
+    gu_putdeck(&sdata);
+    gu_print1("V");
+
+    //抵抗測定
+    sdata = meas_resistor( ch_num );
+    gu_fontsize(2);
+    gu_cursor(192,4);
+    display_resistor( sdata ); //抵抗値表示サブ
+    
+    /*****************/
 
     houden[ ch_num ] = 0; //charging
 
@@ -1079,11 +1178,11 @@
     gu_set_button(25,"R");
 
 }
-/*********************************
+/*******************************************************************************
 
     Manual Mode (Main)
 
-*********************************/
+*******************************************************************************/
 void manual()
 {
 
@@ -1124,12 +1223,23 @@
     wdata[0] =  adc_config( 0, 1 );//ADC3_ch1選択 14bits
     i2c.write( addr_ADC3, wdata, 1 );
 
+    /*** 電源印加 ***/
+    
     vss = calinfo.vss_iop;
 
-    //apply Vss to all channel
-    for ( i = 0; i <= (number_of_channels - 1); i++) {
-        dac_out( calinfo.vss_iop,i); //Vss設定 DAC
+    if ( tenken == true ){
+        for ( i = 0; i <= (number_of_channels - 1); i++) {
+            dac_out(0,i);
+        }
+        dac_out( vss,0); //Vss設定 DAC ch.1 ver3.0.0
+    } else {
+        //apply Vss to all channel
+        for ( i = 0; i <= (number_of_channels - 1); i++) {
+            dac_out( vss,i); //Vss設定 DAC
+        }
     }
+    
+    /**************/
 
     gu_cursor(0,8);
     gu_print1("Vss ");
@@ -1155,17 +1265,21 @@
             if (cswdata == 0x01) { //タッチしたならば
                 switch( cswnum ) { //SWの番号(位置)
 
-                    case 26:
+                    case 26://SW27 
                         //gu_reverse(0x01);                         //gu_リバース指定
-                        //gu_button_up(27);//印加電圧増加
+                        //gu_button_up(27);
 
                         if ( vss < 4500 ) {
                             vss = vss + 100;
                         }
 
-                        //apply Vss to all channel
-                        for ( i = 0; i <= (number_of_channels - 1); i++) {
-                            dac_out( vss,i); //Vss設定 DAC
+                        if ( tenken == true ){
+                            dac_out( vss,ch_num);
+                        } else {
+                            //apply Vss to all channel
+                            for ( i = 0; i <= (number_of_channels - 1); i++) {
+                                dac_out( vss,i); //Vss設定 DAC
+                            }
                         }
 
                         gu_reverse(0x00);
@@ -1174,13 +1288,13 @@
                         gu_putdeck( &sdata );
                         gu_print1("V");
 
-                        //gu_button_up(27);//印加電圧減少
-
-                        wait(0.1);
+                        //gu_button_up(27);
+
+                        //wait(0.1);
 
                         break;
 
-                    case 27:
+                    case 27://SW28
                         //gu_reverse(0x01);                         //gu_リバース指定
                         //gu_button_down(28);//印加電圧減少
 
@@ -1188,9 +1302,13 @@
                             vss = vss - 100;
                         }
 
-                        //apply Vss to all channel
-                        for ( i = 0; i <= (number_of_channels - 1); i++) {
-                            dac_out( vss,i); //Vss設定 DAC
+                        if ( tenken == true ){
+                            dac_out( vss,ch_num);
+                        } else {
+                            //apply Vss to all channel
+                            for ( i = 0; i <= (number_of_channels - 1); i++) {
+                                dac_out( vss,i); //Vss設定 DAC
+                            }
                         }
 
                         //gu_reverse(0x00);                         //gu_リバース指定
@@ -1201,7 +1319,7 @@
 
                         //gu_button_down(28);//印加電圧減少
 
-                        wait(0.1);
+                        //wait(0.1);
 
                         break;
 
@@ -1223,14 +1341,20 @@
                             houden[i] = 0;//not discharge
                         }
 
+                        /*** ver 3.0.0 ****************************************/
+                        for ( i = 0; i <= (number_of_channels - 1); i++) {
+                            dac_out(0,i); //Vss設定 DAC
+                        }
+                        /******************************************************/
+
                         wait(0.2);
 
-                        for ( i = 0; i <= 7; i++)
+                        for ( i = 0; i <= 15; i++)
                             io[i] = 0; //全てのio"L"
 
                         return;//この関数を抜ける
 
-                    case 0x18 ://sw25 mv_reset
+                    case 0x18 ://sw25 reset DUT
 
                         //gu_リバース指定
                         gu_reverse(0x01);
@@ -1242,7 +1366,7 @@
                         gu_reverse(0x00); //gu_リバース解除
                         gu_set_button(25,"R"); //Show Reset button(Left)
 
-                        io[ch_num] = 1;
+                        io_reset[ch_num] = 1;//ver3.0.0 R="H"
 
                         //set measuring range  ver1.1.0
                         for( i = 0; i <= 3; i++)
@@ -1266,7 +1390,7 @@
                         } else {
                             ch_num = 0;
                         } //ver1.1.0
-
+                        
                         select_ich(ch_num);//ADC測定CHの変更
 
                         //set measuring range
@@ -1275,6 +1399,18 @@
 
                         range[ch_num] = 1; //range 10uA
 
+                        if ( tenken == true ){
+                            for ( i = 0; i <= (number_of_channels - 1); i++) {
+                                dac_out(0,i); //Vss設定 DAC
+                            }
+                            dac_out( vss,ch_num);
+                        } else {
+                            //apply Vss to all channel
+                            for ( i = 0; i <= (number_of_channels - 1); i++) {
+                                dac_out( vss,i); //Vss設定 DAC
+                            }
+                        }
+
                         //選択測定チャンネルの表示
                         gu_cursor(24, 2);
                         wdata[0] = ( ch_num + 1 ) + 0x30;
@@ -1286,45 +1422,15 @@
 
                         break;
 
-                        /*
-                        case 0x1F ://sw32 CH選択
-
-                            //gu_reverse(0x01);//gu_リバース指定
-                            //gu_button_down(32);
-                            //gu_reverse(0x00);//gu_リバース解除
-
-                            if ( ch_num >= 1 )
-                                ch_num = ch_num - 1;
-
-                            select_ich(ch_num);//ADC測定CHの変更
-
-                            //set measuring range
-                            for( i = 0; i <= 3; i++)
-                                range[i] = 0;
-
-                            range[ ch_num ] = 1; //range 10uA
-
-                            //選択測定チャンネルの表示
-                            gu_cursor(24, 2);
-                            wdata[0] =( ch_num + 1 ) + 0x30;
-                            i2c.write( addr_gu, wdata, 1);
-
-                            //gu_button_down(32);
-
-                            wait(0.1);
-
-                            break;
-                        */
-
                 } //switch
                 Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);
 
             }//if
         }//if
 
-        //ver1.1.0 0.1s*5(jの値)=0.5s待機後(プラスリレー制御時間)に電流測定用タイマー始動 
-        if ( j >= 5 ) {
-            io[ch_num] = 0;
+        //ver1.1.0 0.1s*10(jの値)=1s待機後(プラスリレー制御時間)に電流測定用タイマー始動 
+        if ( j >= 10 ) {
+            io_reset[ch_num] = 0; // R = "OPEN"
             range[ ch_num ] = 1; //range 10uA
             r_flag = 0;
             j = 0;
@@ -1345,35 +1451,9 @@
             gu_putdeci_mA(&ima);
         }
 
+        /*
         //電圧測定
-        //ver1.2.0
-        /*** ver3.0.0 ***
-        if (RL_EN == 1) {
-            switch (ch_num) {
-                case 0:
-                    io[4] = 1; //外付けリレーON
-                    wait(TIME_RELAY_ON);
-                    break;
-                case 1:
-                    io[5] = 1; //外付けリレーON
-                    wait(TIME_RELAY_ON);
-                    break;
-            }
-        }
-        //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);
         gu_putdeck(&sdata);
@@ -1381,11 +1461,10 @@
 
         //抵抗測定
         sdata = meas_resistor( ch_num );
-
         gu_fontsize(2);
         gu_cursor(192,4);
-
         display_resistor( sdata ); //抵抗値表示サブ
+        */
 
         wait( 0.1 );
 
@@ -1679,7 +1758,7 @@
 
     gu_print1(" CAL.");
     //gu_print1(calinfo.name);
-    i2c.write(addr_gu, calinfo.name, 3); //3byte ascii code
+    i2c.write(addr_gu, calinfo.name, 4); //4byte ascii code
 
     gu_cursor(0,3);
     gu_print1("Vss(Iop) =");
@@ -1769,187 +1848,173 @@
     char calnum;    //選択したCALナンバー
     
     int digit = 0 ;     //CAL番号 10の位の値 0~4
-
-    calnum = 0;         //initial
-
-    gu_cls();           //GU-D 画面クリア
+    bool redraw ;       //再描画
 
     read_regnum();//EEPROMに保存した選択CAL_NO.の読み出し
 
-    show_info(reg_num);
-
-    gu_fontsize(2); //change fontsize
-    gu_cursor(0,0);
-    //ver3.0.0
-    //gu_print1("Select CAL.");
-    gu_print1("CONFIG");
+    while(1){//ver3
+
+        redraw = false;
+    
+        calnum = 0;         //initial
+    
+        gu_cls();           //GU-D 画面クリア
+    
+        show_info(reg_num);
+    
+        gu_fontsize(2); //change fontsize
+        gu_cursor(0,0);
+        //ver3.0.0
+        //gu_print1("Select CAL.");
+        gu_print1("CONFIG");
+        
+        //Set Button init ver3.0.0
+        redraw_sw(calnum,0);
+    
+        gu_set_button_font1(7,"slct");
+        gu_set_button_font1(8,"set");
+        
+        gu_button_up(24);
+        gu_button_down(32);
+    
+        while(1) {
+            //タッチスイッチ読み出し
+            i2c.read ((addr_gu + 0x01), crdata, 3, true);
+    
+            if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+                *pcswnum = crdata[1]; //スイッチ番号
+                *pcswdata = crdata[2];//ON/OFF情報
     
-    //Set Button init ver3.0.0
-    redraw_sw(calnum,0);
-    /*
-    gu_set_button(17,"1");
-    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,"set");
+                if (cswdata == 0x01) { //タッチしたならば
+                    switch( cswnum ) { //SWの番号(位置)
+                    
+                        case 23:  //SW24 page up
+                            
+                            if ( digit <= 3 ){
+                                digit += 1;
+                            } else if ( digit == 4 ){
+                                digit = 0;
+                            }
+                            
+                            redraw_sw(digit,0);
+                            
+                            //calnum = digit * 10 + 1;
+                            //show_info(calnum);
+                            
+                            break;
+                            
+                        case 31: //SW32 page down
+    
+                            if ( digit >= 1 ){
+                                digit -= 1;
+                            } else if ( digit == 0 ) {
+                                digit = 4;
+                            }
+    
+                            redraw_sw(digit,0);
+    
+                            //calnum = digit * 10 + 1;                                          
+                            //show_info(calnum);
+                                  
+                            break;
+    
+                        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;
     
-    gu_button_up(24);
-    gu_button_down(32);
-
-    while(1) {
-        //タッチスイッチ読み出し
-        i2c.read ((addr_gu + 0x01), crdata, 3, true);
-
-        if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
-            *pcswnum = crdata[1]; //スイッチ番号
-            *pcswdata = crdata[2];//ON/OFF情報
-
-            if (cswdata == 0x01) { //タッチしたならば
-                switch( cswnum ) { //SWの番号(位置)
-                
-                    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 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 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 24:  //SW25
-                    case 25:  //SW26
-                    case 26:
-                    case 27:
-
-
-                        calnum = cswnum - 18 + (digit*10);
-
-                        redraw_sw(digit,cswnum + 1);
-
-                        show_info(calnum);
-
-                        break;
-
-                    case 28:    //SW29
-
-                        calnum = ((digit + 1 )*10);
-
-                        redraw_sw(digit,cswnum + 1);
-
-                        show_info(calnum);
-
-                        break;
-
-                    case 0x06:  //SW7 ”slct"(CAL選択)ボタン
-
-                        if ( calnum >= 1 && calnum <=6 ) {
-                            reg_num = calnum;
-
-                            //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 ) {
-                            //CALNo.選択しなければ、何もしないでこのサブを抜ける
-                            gu_reverse(0x01);   //gu_リバース指定
-                            gu_set_button_font1(7,"slct");
-                            wait(0.2);
-                            gu_reverse(0x00);   //gu_リバース解除
-                            return;
-                        }
-
-                        break;
-
-                    case 0x07:  //SW8 "set"ボタン
-
-                        if ( calnum >= 1 && calnum <= 50 ) {
-                            gu_reverse(0x01);   //gu_リバース指定
-                            gu_set_button_font1(8,"set");
-                            wait(0.2);
-                            gu_reverse(0x00);   //gu_リバース解除
-
-                            setup_cal_information(calnum);//CAL情報登録画面へ
-                            
-                            //return; ver3.0.0 remove
-                        }
-                        break;
-
-                        /*ver1.1.0
-                        case 0x1F:  //SW32
-
-                            gu_reverse(0x01);   //gu_リバース指定
-                            gu_set_button_font1(32,"del");
-                            gu_reverse(0x00);   //gu_リバース解除
-
-                            erace_calinfo();
-
-                            gu_set_button_font1(32,"del");
-
+                        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 28:    //SW29
+    
+                            calnum = ((digit + 1 )*10);
+    
+                            redraw_sw(digit,cswnum + 1);
+    
+                            show_info(calnum);
+    
                             break;
-                        */
-
-                } //switch
-
-            }//if(cswdata == 0x01) {
-        } //if(crdata[0] == 0x11 ) {
-        wait(0.1);//タッチスイッチ入力読み出し間隔
-    } //while(1)
+    
+                        case 0x06:  //SW7 ”slct"(CAL選択)ボタン
+    
+                            if ( calnum >= 1 && calnum <=6 ) {
+                                reg_num = calnum;
+    
+                                //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 ) {
+                                //CALNo.選択しなければ、何もしないでこのサブを抜ける
+                                gu_reverse(0x01);   //gu_リバース指定
+                                gu_set_button_font1(7,"slct");
+                                wait(0.2);
+                                gu_reverse(0x00);   //gu_リバース解除
+                                return;
+                            }
+    
+                            break;
+    
+                        case 0x07:  //SW8 "set"ボタン
+    
+                            if ( calnum >= 1 && calnum <= 50 ) {
+                                gu_reverse(0x01);   //gu_リバース指定
+                                gu_set_button_font1(8,"set");
+                                wait(0.2);
+                                gu_reverse(0x00);   //gu_リバース解除
+    
+                                setup_cal_information(calnum);//CAL情報登録画面へ
+                                
+                                //return;
+                                redraw = true;
+                            }
+                            break;
+    
+                    } //switch
+                    
+                    if (redraw){
+                        break;  //exit while
+                    }
+    
+                }//if(cswdata == 0x01) {
+            } //if(crdata[0] == 0x11 ) {
+            wait(0.1);//タッチスイッチ入力読み出し間隔
+        } //while(1)
+        
+    }
 }
 
 /*******************************************************************************
@@ -1990,105 +2055,31 @@
         /
 
 *******************************************************************************/
-void hyouji_cal_param(char x)
+void hyouji_cal_param(int x)
 {
     gu_fontsize(2);
     gu_cursor(0,4);
     gu_print1("                                ");
-
-    switch ( x ) {
-        case 0:
-            gu_cursor(0,4);
-            gu_print1("Vss(Iop)");
-            gu_cursor(208,4);
-            gu_print1("[V]");
-            break;
-        case 1:
-            gu_cursor(0,4);
-            gu_print1("Vss(O.C.P)");
-            gu_cursor(208,4);
-            gu_print1("[V]");
-            break;
-        case 2:
-            gu_cursor(0,4);
-            gu_print1("Vss(Voc)");
-            gu_cursor(208,4);
-            gu_print1("[V]");
-            break;
-        case 3:
-            gu_cursor(0,4);
-            gu_print1("low limit(Voc)");
-            gu_cursor(208,4);
-            gu_print1("[V]");
-            break;
-        case 4:
-            gu_cursor(0,4);
-            gu_print1("low limit(Iop)");
-            gu_cursor(208,4);
-            gu_print1("[uA]");
-            break;
-        case 5:
-            gu_cursor(0,4);
-            gu_print1("low limit(O.C.P)");
-            gu_cursor(208,4);
-            gu_print1("[uA]");
-            break;
-        case 6:
-            gu_cursor(0,4);
-            gu_print1("up limit(O.C.P)");
-            gu_cursor(208,4);
-            gu_print1("[uA]");
-            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 10:
-            gu_cursor(0,4);
-            gu_print1("Wait(O.C.P)");
-            gu_cursor(208,4);
-            gu_print1("[s]");
-            break;
-        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 13:
-            gu_cursor(0,4);
-            gu_print1("up limit(ohm)");
-            gu_cursor(208,4);
-            wdata[0] = 0xEA; //Ω
-            i2c.write( addr_gu, wdata, 1);
-            break;
-        case 14:
-            gu_cursor(0,4);
-            gu_print1("CAL NAME");
-            //gu_cursor(208,4);
-            break;
+    gu_cursor(0,6);
+    gu_print1("                                ");
+
+    gu_fontsize(2);    
+    gu_cursor(zahyou_para1[0],zahyou_para1[1]);
+    gu_print1(cpara1[x]);
+    gu_fontsize(2);
+    gu_cursor(zahyou_para2[0],zahyou_para2[1]);    
+    gu_print1(cpara2[x]);
+    
+    gu_fontsize(2);
+    gu_cursor(zahyou_unit[0],zahyou_unit[1]);
+    
+    if ( x == 12 || x == 13 ){
+        wdata[0] = 0xEA; //Ω
+        i2c.write( addr_gu, wdata, 1);
+    } else {
+        gu_print1(cunit[x]);
     }
+
 }
 
 /*******************************************************************************
@@ -2101,7 +2092,7 @@
 
 *******************************************************************************/
 /*** 加算 ***/
-void increase_param(char para, signed short *sdata, short inc)
+void increase_param(int para, signed short *sdata, short inc)
 {
     switch ( para ) { //パラメータの項目によって上限値異なる
         case 0://vss_iop
@@ -2142,7 +2133,7 @@
 }
 
 /*** 減算 ***/
-void decrease_param(char para, signed short *sdata, short dec)
+void decrease_param(int para, signed short *sdata, short dec)
 {
     switch ( para ) { //パラメータの項目によって上限値異なる
         case 0://vss_iop
@@ -2225,7 +2216,119 @@
     }       
 
 }
-
+/*******************************************************************************
+    
+    CAL情報登録画面 表示
+
+    ****** Swich matrix ******
+    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 disp_setup_cal(char cal_num , int parameter){
+
+    char wdata[2];
+
+    gu_cls();//clear dispray
+    gu_fontsize(1);
+    gu_print1("SETUP No.");
+    wdata[0] = ( cal_num / 10 ) + 0x30;//ver3.0.0
+    wdata[1] = ( cal_num % 10 ) + 0x30;//show caliber number
+    i2c.write(addr_gu, wdata, 2);    
+        
+    if( parameter == 14 ){
+        gu_button_up(sw_up_set[3]);       
+        gu_button_down(sw_down_set[3]);    
+    }
+    
+    gu_set_button_font1(7,"esc");
+    gu_set_button_font1(8,"save");
+    gu_button_up(17);
+    gu_button_down(25);
+    gu_button_up(sw_up_set[0]);
+    gu_button_up(sw_up_set[1]);
+    gu_button_up(sw_up_set[2]);
+    gu_button_down(sw_down_set[0]);
+    gu_button_down(sw_down_set[1]);
+    gu_button_down(sw_down_set[2]);
+    
+    hyouji_cal_param(parameter);
+
+}
+
+
+/*******************************************************************************
+
+    PASS WORD 画面
+
+*******************************************************************************/
+void pw(int* pflag){
+
+    char crdata[3];//GUDからの受信データ
+    char strnum[2];
+    char basho = 0;
+    char word[YOSO];
+    char c[2];//GU-D SW 表示文字
+    int j = 0;
+    
+    gu_cls();//clear dispray
+    
+    strnum[1] = 0;//NULL
+    c[1]=0;//NULL
+
+    for ( int i = 0; i <=25; i++ ){
+        strnum[0] = i + 0x41;
+        gu_set_button( (basho + 1 ) ,strnum);
+        basho = basho + 1;
+    }
+    
+    wait(0.2);
+    
+    int i = 0;
+
+    while(1) {
+        
+        i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+        if (crdata[0] == 0x11 && crdata[2] == 0x01 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。&& タッチしたならば
+            
+            word[j] = crdata[1] + 0x41; 
+            c[0] = word[j];
+            
+            gu_reverse(1);
+            gu_set_button( (crdata[1] + 1 ) ,c);
+            gu_reverse(0);
+
+            j = j + 1; 
+        
+        }
+        
+        if ( j == YOSO ){
+            
+            while (1){
+                if ( word[i] != pass[i] ){
+                    *pflag = 1;
+                    break;
+                }
+                if (i == ( YOSO - 1) ){
+                    break;
+                }
+                
+                i += 1;
+            }
+            
+            wait(0.5);
+            return;
+
+        }//if
+        
+        wait(0.2);
+
+    }//while 
+}
 /*******************************************************************************
 
     CAL情報登録画面   MAIN
@@ -2253,27 +2356,26 @@
 *******************************************************************************/
 void setup_cal_information(char cal_num)
 {
-    char            param;              //設定するパラメータの選択 0~9まで ver1.2.1 0~10まで
-    char            crdata[3];
+    int             param;              //設定するパラメータの選択
+    char            crdata[3];          //GU-Dからの受信DATA 3byte
     signed short    sdata_cal[18];      //CAL設定条件
     signed short    hyouji_data;
-    int             param_sum;          //設定するパラメータの数 ver1.2.1
-    char            c_temp[3];          //CAL設定条件 calinfo.name
+    int             param_sum = 14;     //パラメータの最大設定数
+    char            c_temp[4];          //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 = 14; //ver3.0.0 //11; //ver1.2.1
-
-    //画面表示
-    gu_cls();//画面クリア
-    gu_fontsize(2);
-    gu_print1("Setup Cal No.");
-    wdata[0] = ( cal_num % 10 ) + 0x30;//CALナンバーの表示
-    i2c.write(addr_gu, wdata, 1);
-
-    //CAL情報読込
+    
+    int pwflag = 0;
+
+    pw(&pwflag);
+    
+    if ( pwflag != 0 ){
+        return;
+    }
+    
+    //Load caliber information
     read_caliber(&calinfo,cal_num);
 
     sdata_cal[0] = calinfo.vss_iop;
@@ -2294,26 +2396,11 @@
     c_temp[0] = calinfo.name[0];
     c_temp[1] = calinfo.name[1];
     c_temp[2] = calinfo.name[2];
-    
-    //ボタンの配置
-    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);
-    gu_button_down(28);
-    gu_button_down(30);
-    gu_button_down(32);
-
-    //初期表示はVss_Iop
-    param = 0;
-    gu_cursor(0,4);
-    gu_fontsize(2);
-    gu_print1("Vss(Iop)");
-    gu_cursor(208,4);
-    gu_print1("V");
+    c_temp[3] = calinfo.name[3];
+
+    //初期表示はCAL名設定
+    param = 14;
+    disp_setup_cal(cal_num,param);    
 
     while(1) {
         i2c.read ((addr_gu + 0x01), crdata, 3, true);
@@ -2322,160 +2409,192 @@
             //cswnum = crdata[1]; //スイッチ番号
             //cswdata = crdata[2];//ON/OFF情報
 
-            switch( crdata[1] ) { //SWの番号(位置)
-
-                case 0x10 ://sw17 パラメータ変更スイッチ(上)
-
-                    if ( param <= param_sum -1 ) {
-                        param = param + 1;
-                    } else {
-                        param = 0;
-                    }
-
-                    hyouji_cal_param(param);//設定パラメータ表示
-                    break;
-
-                case 0x18 ://sw25 パラメータ変更スイッチ(下)
-
-                    if ( param >= 1 ) {
-                        param = param - 1;
-                    } else {
-                        param = param_sum;
-                    }
-
-                    hyouji_cal_param(param);//設定パラメータ表示
-                    break;
-
-                case 19 ://SW20 increase 0x3E8
-
-                    // 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
-
-                    if ( param == 14 ){ 
-                        down_ascii(&c_temp[0]);
-                    } else {    
-                        decrease_param(param, &sdata_cal[param], 1000);
-                    }
-                    break;
-
-                case 0x15 ://SW22 increase 0x64
-
-                    if ( param == 14 ){ 
-                        up_ascii(&c_temp[1]);
-                    } else {
-                        increase_param(param, &sdata_cal[param], 100);
-                    }
-                    break;
-
-                case 0x1D ://SW30 decrease 0x64
-
-                    if ( param == 14 ){ 
-                        down_ascii(&c_temp[1]);
-                    } else {
-                        decrease_param(param, &sdata_cal[param], 100);
-                    }
-                    break;
-
-                case 23 ://SW24 increase 0x0A
-
-                    if ( param == 14 ){ 
-                        up_ascii(&c_temp[2]);
-                    } else {
-                        increase_param(param, &sdata_cal[param], 10);
-                    }
-                    break;
-
-                case 31 ://SW32 decrease 0x0A
-
-                    if ( param == 14 ){ 
-                        down_ascii(&c_temp[2]);
-                    } else {
-                        decrease_param(param, &sdata_cal[param], 10);
-                    }
-                    break;
-                    
-                case 6:     //SW7 "esc"ボタン
-                    
-                    return; //何もせずに抜ける
-
-                case 0x07 : //SW8 "save"保存ボタン
+            //タッチしたSWの番号(位置)による分岐
+            
+            //sw17 パラメータ変更スイッチ(上)
+            if ( crdata[1] == 16 ){
+    
+                if ( param <= param_sum -1 ) {
+                    param = param + 1;
+                } else {
+                    param = 0;
+                }
+    
+                disp_setup_cal(cal_num,param);    
+                //hyouji_cal_param(param);//設定パラメータ表示
+                
+            }
+            
+            //case 0x18 ://sw25 パラメータ変更スイッチ(下)
+            if ( crdata[1] == 24 ){
+    
+                if ( param >= 1 ) {
+                    param = param - 1;
+                } else {
+                    param = param_sum;
+                }
+    
+                disp_setup_cal(cal_num,param);    
+                //hyouji_cal_param(param);//設定パラメータ表示
                 
-                    //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];
-                    calinfo.up_limit_ocp = sdata_cal[6];
-                    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;
-                    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
+            }
+    
+            if ( crdata[1] == (sw_up_set[0] - 1)){ //increase
+    
+                // if set caliber name .. ver3
+                if ( param == 14 ){ 
+                    up_ascii(&c_temp[0]);
+                } else {    
+                    increase_param(param, &sdata_cal[param], 1000);
+                }
+            }
+    
+            if ( crdata[1] == (sw_up_set[1] - 1)){ //increase
+    
+                if ( param == 14 ){ 
+                    up_ascii(&c_temp[1]);
+                } else {
+                    increase_param(param, &sdata_cal[param], 100);
+                }
+             }
+    
+            if ( crdata[1] == (sw_up_set[2] - 1)){ //SW** increase
+    
+                if ( param == 14 ){ 
+                    up_ascii(&c_temp[2]);
+                } else {
+                    increase_param(param, &sdata_cal[param], 10);
+                }
+            }
+    
+            if ( crdata[1] == (sw_up_set[3] - 1)){ //SW** increase CAL名設定時に使用する
+    
+                if ( param == 14 ){ 
+                    up_ascii(&c_temp[3]);
+                }
+            }
+    
+            if ( crdata[1] == (sw_down_set[0] - 1)){ //SW** decrease
+    
+                if ( param == 14 ){ 
+                    down_ascii(&c_temp[0]);
+                } else {    
+                    decrease_param(param, &sdata_cal[param], 1000);
+                }
+            }
+    
+            if ( crdata[1] == (sw_down_set[1] - 1)){ //SW** decrease
+    
+                if ( param == 14 ){ 
+                    down_ascii(&c_temp[1]);
+                } else {
+                    decrease_param(param, &sdata_cal[param], 100);
+                }
+            }
+    
+            if ( crdata[1] == (sw_down_set[2] - 1)){ //SW** decrease
+    
+                if ( param == 14 ){ 
+                    down_ascii(&c_temp[2]);
+                } else {
+                    decrease_param(param, &sdata_cal[param], 10);
+                }
+            }
+    
+            if ( crdata[1] == (sw_down_set[3] - 1)){ //SW** decrease
+    
+                if ( param == 14 ){ 
+                    down_ascii(&c_temp[3]);
+                } 
+            }
+                
+            if ( crdata[1] == 6 ){   //SW7 "esc"ボタン
+    
+                gu_reverse(1);
+                gu_set_button_font1(7,"esc");
+                wait(0.2);
+                gu_reverse(0);//ver3                    
+    
+                return; //何もせずに抜ける
+            }
+            
+            if ( crdata[1] == 7 ){   //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];
+                calinfo.up_limit_ocp = sdata_cal[6];
+                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];
+                calinfo.name[3] = c_temp[3];
+    
+                /*ver3 Byte Write CALNO.EEPROM 書込み 
+                reg_num = cal_num;
+                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);
+                */
+    
+                /*** ver3 ***
+                //CAL情報 >> EEPROM
+                //送信完了ならば実行
+                if(Soushin == 0) {
+    
+                    write_caliber_information(&calinfo, cal_num);
+    
+                    //ver1.2.3
+                } else {
+                    gu_fontsize(1);
+                    gu_cursor(0,2);
+                    gu_print1("can not save cal no");
+                    wait(2);
+                    return;
+                }
+                ***/
+                
+                /*** ver3 ***/
+                write_caliber_information(&calinfo, cal_num);                    
+    
+                //送信完了ならば実行
+                if(Soushin == 0) {
+                    gu_reverse(1);
+                    gu_set_button_font1(8,"save");
                     wait(0.2);
-
-                    //CAL情報 >> EEPROM
-                    //送信完了ならば実行
-                    if(Soushin == 0) {
-
-                        write_caliber_information(&calinfo, cal_num);
-
-                        //ver1.2.3
-                    } else {
-                        gu_fontsize(1);
-                        gu_cursor(0,2);
-                        gu_print1("can not save cal no");
-                        wait(2);
-                        return;
-                    }
-
-                    //送信完了ならば実行
-                    if(Soushin == 0) {
-                        gu_reverse(1);
-                        gu_set_button_font1(8,"save");
-                        wait(0.2);
-                        return;//CAL情報登録画面を抜ける
-
-                        //ver1.2.3
-                    } else {
-                        gu_fontsize(1);
-                        gu_cursor(0,2);
-                        gu_print1("can not save cal information");
-                        wait(2);
-                        return;
-                    }
-
-                    //break;
-
-            } //switch
-        } //if
+                    gu_reverse(0);//ver3
+                    return;//CAL情報登録画面を抜ける
+    
+                    //ver1.2.3
+                } else {
+                    gu_fontsize(1);
+                    gu_cursor(0,2);
+                    gu_print1("can not save cal information");
+                    wait(2);
+                    return;
+                }
+            
+            }//end if
+        }//end if
         
         //gu-D表示 ver3
-        
-        gu_cursor(150,4);   //表示位置の指定
+        gu_fontsize(2);
+        gu_cursor(zahyou_val[0],zahyou_val[1]);   //表示位置の指定
 
         switch ( param ) {
             case 0://vss_iop
@@ -2510,24 +2629,10 @@
                 break;
                 
             case 14: //cal name ver3
-                i2c.write(addr_gu, c_temp, 3); //3byte ascii code
+                i2c.write(addr_gu, c_temp, 4); //3byte ascii code
                 break;
-                /*
-                case 6:
-                case 7:
-                    //ver1.1.0
-                    hyouji_data = sdata_cal[param];
-                    gu_putdec ( &hyouji_data );
-                    break;
-                case 8://low_limit_resistor
-                case 9://up_limit_resistor
-                    hyouji_data = sdata_cal[param];
-                    gu_putdec ( &hyouji_data );
-                    break;
-                */
-                //ver1.2.2 uptohere
-
-        }
+
+        }//swith
         wait(0.1);//gu-D 読込間隔の設定
     }//while
 }
@@ -2881,13 +2986,13 @@
 
 }
 
-/*********************************
+/*******************************************************************************
 
     Auto Mode/SEQ Mode (sub)
     自動測定
     char noc -> 総測定数 1~4
 
-*********************************/
+*******************************************************************************/
 void auto_meas(char noc)
 {
     int     x[4] = {0,0,128,128};   //GU_D x座標 4個測定時の表示スタート位置
@@ -2922,16 +3027,15 @@
 
     wait( wait_poweron );//パワーブレイク復帰待機?
 
-    //Reset CAL
+    //Reset DUT
     for ( i = 0; i <= ( noc -1 ); i++) {
-        io[i] = 1; //io1 = "H"
+        io_reset[i] = 1; //R = VDD
     }
 
-    wait(time_reset); //ver1.1.3
-    //wait(0.2);
+    wait(time_reset); 
 
     for ( i = 0; i <= ( noc -1 ); i++) {
-        io[i] = 0; //io1 = "L"
+        io_reset[i] = 0; //R = "OPEN"
     }
 
     //抵抗測定
@@ -3041,40 +3145,20 @@
 
     wait( wait_voc_1 );
 
+    //Reset DUT
     for ( i = 0; i <= ( noc -1 ); i++) {
-        io[i] = 1; //io1 = "H"
+        io_reset[i] = 1; //R = VDD
     }
 
-    wait( wait_reset );
+    wait( calinfo.wait_voc );//ver3
 
     for ( i = 0; i <= ( noc -1 ); i++ ) {
 
-        //ver1.2.0
-        if (RL_EN == 1) {
-            switch (i) {
-                case 0:
-                    io[4] = 1; //外付けリレーON
-                    wait(TIME_RELAY_ON);
-                case 1:
-                    io[5] = 1; //外付けリレーON
-                    wait(TIME_RELAY_ON);
-            }
-        }
-        //up to here ver1.2.0
-
         voc[i] = meas_voltage(i);
         sdata[i] = voc[i] * -1;
 
-        //ver1.2.0
-        if (RL_EN == 1) {
-            io[4] = 0; //外付けリレーOFF
-            io[5] = 0; //外付けリレーOFF
-            wait(TIME_RELAY_OFF);
-        }
-        //up to here
     }
 
-
     //display GU_D
     if ( number_of_channels <= 2 ) { //2個測定の時の表示
         gu_cursor(0, iy + 8 );//IOP測定値表示位置指定
@@ -3097,7 +3181,7 @@
 
     //R = "L"
     for ( i = 0; i <= ( noc -1 ); i++) {
-        io[i] = 0; //io1 = "L"
+        io_reset[i] = 0; //R = "OPEN"
     }
 
     wait(0.1);
@@ -3661,7 +3745,7 @@
 
     switch(ch) {
         case 0:
-            /*** v3 debag *************/
+            /*** ver3 *****************/
             rlen[4] = 1; //RLEN5="H"
             wait(ton_rr);
             /**************************/
@@ -3674,7 +3758,7 @@
             
         case 1:
         
-            /*** v3 debag *************/
+            /*** ver3 *****************/
             rlen[5] = 1; //RLEN6="H"
             wait(ton_rr);
             /**************************/
@@ -3687,7 +3771,7 @@
             
         case 2:
 
-            /*** v3 debag *************/
+            /*** ver3 *****************/
             rlen[6] = 1; //RLEN7="H"
             wait(ton_rr);
             /**************************/
@@ -3700,7 +3784,7 @@
             
         case 3:
         
-            /*** v3 debag *************/
+            /*** ver3 *****************/
             rlen[7] = 1; //RLEN8="H"
             wait(ton_rr);
             /**************************/
@@ -3717,8 +3801,8 @@
     //電圧測定用リレーを全てオフ
     for (int i = 4; i <= 7; i++){
         rlen[i] = 0;
-        wait(toff_rr);
     }
+    wait(toff_rr);
     /************/
 
     //プリアンプ倍率を代入して、電圧値を算出する(単位はmV)
@@ -3728,13 +3812,16 @@
 }
 
 
-/*********************************
+/*******************************************************************************
 
     measure resistor
-    測定CHを指定して、抵抗測定値Rを返す
-    char ch 0~3 -> 1ch ~ 4ch
-
-*********************************/
+    
+        測定CHを指定して、抵抗測定値Rを返す
+        char ch 0~3 -> 1ch ~ 4ch
+
+        ver3.0.0 リレー制御追加
+
+*******************************************************************************/
 short meas_resistor(char ch)//ch 0~3 -> 1ch ~ 4ch
 {
     char    com;
@@ -3742,57 +3829,100 @@
 
     switch(ch) {
         case 0:
+            /*
             //ver1.2.0
             if (RL_EN == 1) {
                 io[6] = 1; //外付けリレーON
                 wait(TIME_RELAY_ON);
             }
             //up to here
+            */
+            
+            /*** ver3 *****************/
+            rlen[0] = 1; //RLEN1="H"
+            wait(ton_rr);
+            /**************************/
 
             com = adc_config(0,0);//ch1(adc),12bit
             i2c.write( addr_ADC1, &com, 1);
             wait(0.1);
             sdata = read_adc(addr_ADC1);
-            //ver1.2.0
+            
+            /*
+            //ver1.2.0 relay off
             if (RL_EN == 1) {
                 io[6] = 0 ;
             }
+            */
 
             break;
 
         case 1:
+        
+            /*
             //ver1.2.0
             if (RL_EN == 1) {
                 io[7] = 1; //外付けリレーON
                 wait(TIME_RELAY_ON);
             }
             //up to here
+            */
+
+            /*** ver3 *****************/
+            rlen[1] = 1; //RLEN2="H"
+            wait(ton_rr);
+            /**************************/
 
             com = adc_config(1,0);//ch2(adc),12bit
             i2c.write( addr_ADC1, &com, 1);
             wait(0.1);
             sdata = read_adc(addr_ADC1);
+            
+            /*
             //ver1.2.0
             if (RL_EN == 1) {
                 io[7] = 0;
             }
+            */
 
             break;
 
         case 2:
+            /*** ver3 *****************/
+            rlen[2] = 1; //RLEN3="H"
+            wait(ton_rr);
+            /**************************/        
+
             com = adc_config(0,0);//ch1(adc),12bit
             i2c.write( addr_ADC2, &com, 1);
             wait(0.1);
             sdata = read_adc(addr_ADC2);
+            
             break;
+            
         case 3:
+            /*** ver3 *****************/
+            rlen[3] = 1; //RLEN4="H"
+            wait(ton_rr);
+            /**************************/
+        
             com = adc_config(1,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 = 0; i <= 3; i++){
+        rlen[i] = 0;
+    }
+    wait(toff_rr);
+    /*****************************/
+
     //検出用抵抗値を代入して、測定抵抗値を算出する(単位はmV,Ω)
     if ( sdata < res_vref ) {
         sdata =( rsense * sdata ) / ( res_vref - sdata);
@@ -3800,7 +3930,6 @@
         sdata = res_vref;//overload
     }
 
-
     return ( sdata );
 }