Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed SDFileSystem
Diff: ILF3_rev1.cpp
- Revision:
- 7:e6767ea8cb55
- Parent:
- 6:cd0b4dc7eeb2
- Child:
- 8:34e4ca3c366e
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ILF3_rev1.cpp Mon Apr 25 08:11:28 2022 +0000
@@ -0,0 +1,5139 @@
+#include "mbed.h"
+#include "SDFileSystem.h"
+
+//difine_mbed_LPC1768
+
+/*******************************************************************************
+
+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
+
+割込みはP0~P2で可能
+シーケンサスタート信号は、回路図「seq_yobi]で対応
+
+ver1.2.5
+IOP測定値にO.L追加 ±100uA
+
+ver1.2.4
+ver1.2.3のDEB_EN=0としたもの。
+公開用。
+
+ver1.2.3
+EEPROM通信のコードを修正。
+debug mode の追加
+
+ver1.2.2
+過充電防止検査の上限規格の判定追加
+CAL情報登録画面において、登録項目の順序入替え(過充電防止上限規格の挿入)
+過充電防止上限規格ゼロの場合、判定しない
+
+ver1.2.1
+過充電防止検査の上限規格を新たに設置。
+それに伴い、規格値のメモリ割り当てと、上限規格設定画面を追加。
+
+ver1.2.0
+
+2021.9.7
+
+CAL.LJ21(A1098A05)専用
+発電検出時、高照度条件下でVSS電圧がIC耐圧超える為、VHD-VDD短絡する仕様へ変更(A05)
+200lx下でもVHD-VDD短絡の電圧条件を満たす為、ILFも対応。
+VSS端子でVOC測定をする。その為、VOC測定時以外はVSS端子と測定器を切り離すリレーを
+サブ基板へ取り付け、制御プログラムを追加した。
+CH1:P1_23(LPC1768) (led3_on)
+CH2:P1_22(LPC1768) (led3_off)
+
+アンテナ測定時にアンテナ測定端子切り離し用リレーのON/OFF制御を追加
+(led4_on)
+(led4_off)
+
+ver1.1.0
+1)VFD_SW23 SW31がタッチ感度故障の為、配置替え
+CAL登録画面とMANUAL測定画面
+2)DELETE EEPROM ボタンの配置変更
+3)シーケンサ判定IOの変更
+
+ver1.1.1
+void auto_meas において初期 R[i]の値をクリアすることを追加
+自動測定時、タッチパネルでスタートをやめる(外部IO入力のみ)
+
+ver1.1.2
+過充電防止検査時の電源電圧:VOC検査時の電圧となっていたのを修正。
+
+ver1.1.3
+1)SDカード未挿入の表示を削除
+
+2)R=Hの時間を0.2sから1sへ変更
+
+R5186 ver2.0.3の内容を反映。
+
+未)フラグでR5186系と切替え
+未)測定部ごとにクラス分け(過充電防止のところだけでも)
+
+*******************************************************************************/
+//
+//定数
+//
+//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] 積分回路のコンデンサ容量
+#define TIME_INT 2 //[s]積分時間
+#define GAIN_I 0.2 //電流測定プリアンプのGAIN
+#define LSB_I 0.00025 //[V] MCP3424 LSB size of 14bit conversion rate setting
+#define MINCODE_I -8192 //Minimum output code of MCP3424
+#define MAXCODE_I 8191 //Maximum output code of MCP3424
+#define GAIN_V 0.2 //電流測定プリアンプのGAIN
+*/
+#define DEB_EN 0 //デバッグイネーブル: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.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 4 //測定チャンネル数(MAX 4)
+#define time_discharge 0.5 //discharging time(s)
+#define time_integral 2 //integral time(s)
+#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]
+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)
+*/
+
+
+/*******************************************************************************
+
+ LPC1768 PIN MAPPING
+
+*******************************************************************************/
+//繰り返しタイマー割り込み
+Ticker flipper; /* 初期化 */
+//one shot timer
+Timeout oneshot1;
+Timeout oneshot2;
+Timeout oneshot3;
+Timeout oneshot4;
+
+/*** SD-CARD ***/
+SDFileSystem sd(P0_9, P0_8, P0_7, P0_6, "sd"); //SDFileSystem name(mosi, miso, sck, cs, mount);
+
+/*** I2C ***/
+I2C i2c(P0_10,P0_11); //(PinName sda, PinName scl) I2Cを定義
+
+/*** UART ver3 ***/
+//Serial uart(P0_15,P0_16,19200);
+//Serial pc(USBTX,USBRX,9600); //mbed⇔PCデバック用
+Serial pc(P0_15,P0_16,9600); //ILF3⇔PCデバック用
+
+/*** interruput ***/
+//InterruptIn seq_yobi(P0_19);
+
+/*** start sw ***/
+DigitalIn sw_start(P0_4);
+
+/*** DigitalOut ***/
+DigitalOut houden[] = { // 配列を用意します
+ DigitalOut( P2_1 ), //houden1 配列の1番目の要素を**で初期化したDigitalOutに
+ DigitalOut( P2_0 ), //houden2
+ DigitalOut( P1_28 ), //houden3
+ 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_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に
+ DigitalOut( P0_26 ), //io2
+ DigitalOut( P0_23 ), //io3
+ DigitalOut( P0_24 ), //io4
+ DigitalOut( P1_22 ), //io5
+ DigitalOut( P1_23 ), //io6
+ DigitalOut( P1_24 ), //io7
+ DigitalOut( P1_25 ) //io8
+};
+*/
+
+DigitalOut range[] = { // 配列を用意します
+ DigitalOut( P2_3 ), //range1 配列の1番目の要素を**で初期化したDigitalOutに
+ DigitalOut( P2_2 ), //range2
+ DigitalOut( P1_26 ), //range3
+ DigitalOut( P1_27 ) //range4
+};
+
+DigitalOut led_green[] = {
+ DigitalOut( P0_17 ),
+ DigitalOut( P1_31 ),
+ DigitalOut( P2_11 ),
+ DigitalOut( P1_18 )
+};
+
+DigitalOut led_red[] = {
+ DigitalOut( P0_18 ),
+ DigitalOut( P1_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 ),
+ DigitalOut( P3_25 ),
+ DigitalOut( P3_26 )
+};
+
+DigitalOut seq_busy(P0_20);
+//DigitalIn
+DigitalIn seq_start(P4_28);
+DigitalIn seq_cal_a(P2_6);
+DigitalIn seq_cal_b(P2_7);
+DigitalIn seq_cal_c(P2_8);
+DigitalIn seq_kosuu_a(P2_13);
+DigitalIn seq_kosuu_b(P2_9);
+//DigitalIn seq_yobi(P0_19);
+*/
+
+/*** PWM ***/
+PwmOut leds[] = { //配列を用意
+ PwmOut(P2_5), //LED1
+ PwmOut(P2_4), //LED2
+ PwmOut(P1_21), //LED3
+ PwmOut(P1_20) //LED4
+};
+
+//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
+
+*******************************************************************************/
+//parameter_gu256X128C-D903M
+const int addr_gu = 0x50 << 1; // Address of gu256X128C-D903M
+//
+//prototype
+const int Proportional1 = 0x02;
+//const int Proportional2 = 0x03;
+//const int Proportional3 = 0x04;
+//
+void gu_cls();
+void gu_drawButton(int x, int y, int w, int h, const char *data);
+void gu_cursor(int x, int y);
+void gu_fontsize(const char code);
+void gu_print_dot(int x, int y, const char *ptext);
+void gu_fontWidth(const char fontWidth);
+void gu_print(const char t[] );
+void gu_fontReverse(int code);
+void gu_RealTimeImage_dot(int x, int y, int w, int h, const char data[]);
+void gu_RealTimeImage(int w, int h, char data[]);
+void gu_magnify(int x, int y);
+//
+//オリジナルgu用関数
+void gu_print1(const char* ptext);
+void gu_luminance(const char* cl);
+void gu_touchPara(int x,int y);
+void gu_sendOneByte(char data);
+void utility(); //輝度調整サブルーチン
+void gu_CRLF();
+void gu_reverse(char x);
+void gu_drawbutton_cursor(char x,char y);
+void gu_onebyte(char data);
+//
+//Button Trig Function
+void adjust_illumination();//LED輝度調整サブ
+void gu_initial();//初期設定サブ
+void gu_set_button(char sw_num,char* text);//SWナンバーと表示テキストを指定
+void gu_set_button_font1(char sw_num,char* text);//fontsize = 1
+void gu_button_up(char sw_num); //upボタン表示
+void gu_button_down(char sw_num);//downボタン表示
+void gu_Button_up1();
+void gu_Button_up2();
+void gu_Button_up3();
+void gu_Button_up4();
+void gu_button_up_on(char sw_num);
+void gu_Button_up_on2();
+void gu_Button_down1();
+void gu_Button_down2();
+void gu_Button_down3();
+void gu_Button_down4();
+void gu_button_down_on(char sw_num);
+void gu_Button_down_on2();
+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)
+// 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登録数 */
+//
+//
+/*******************************************************************************
+
+ 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 eeprom_adrs = 0x15 << 3; // Address of PCAS08A(EEPROM) 始めの5bit ver1.2.1
+//int slave_adrs; //slave address ver1.2.1
+//
+/*******************************************************************************
+
+ 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
+const int addr_ADC3 = 0x68 <<1;//電流測定No.1,No.2
+const int addr_ADC4 = 0x6E <<1;//電流測定No.3,No.4
+//
+char hd[] = "0123456789ABCDEF" ;
+//
+//関数
+void general_call(char com); //power on reset
+char adc_config(char ch, char rate);
+//
+/*******************************************************************************
+
+ AD5625RBUZ(DAC) addr:1F
+
+*******************************************************************************/
+const char addr_dac = 0x1F <<1;
+void dac_out(short mvolt, char addr);
+void dac_init();
+//
+/*******************************************************************************
+
+ 測定関係関数
+
+*******************************************************************************/
+void set_pullup();//シーケンサからの入力ピンのプルアップ設定
+void trigger();//シーケンサからのスタート信号割込みサブ
+void calibration();
+void compute_adc(int adc_con, long *avg);//(ADCのCONFIG, 計算結果)
+void gu_putdec(short* x);//2byteを10進で表示
+void gu_putdeck(short* x);//2byteを10進で表示。1/1000.
+void gu_putdeci(float* x);// ver1.1.4
+void gu_putdeci_mA(float* x);// ver1.1.4
+void meas_current_automode(char amount);//AutoMOdeの電流測定サブ iop ocp共通
+void auto_run();//自動測定モード
+void auto_meas(char noc);//一括測定。ch:測定する総チャンネル数
+void meas_sub();//自動測定モード内の繰り返し処理
+void manual();//手動測定モード
+void hantei(char noc);//規格値比較エラーフラグ立てる
+void select_ich(char ch);//電流測定chの選択と設定
+short read_adc(char addr);//指定addressから2byte読込み
+short meas_voltage(char ch);//測定チャンネルを指定して、測定値(2byte)を返す
+short meas_resistor(char ch);//測定チャンネルを指定して、測定値(2byte)を返す
+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進数
+double vocp[4];//過充電防止時のHD測定電圧
+float iop[4];//2byte 補数あり 測定値 1bit 0.01uA
+float ocp[4];//2byte 補数あり 測定値
+char ch_num ;//選択中の測定チャネル(0~3)
+int cat;//検査カテゴリNo.
+
+/****************************
+シーケンサ関係変数
+****************************/
+int CH[] = {1,2,3,4};
+double seq_fdata[4][4];
+
+//structure
+struct cal_info {
+ 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電圧
+ 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ナンバー */
+//function
+void erace_calinfo();
+void read_regnum();
+void read_caliber(cal_info *cal, int num);
+void write_caliber_information(cal_info *cal, int num);
+
+/*******************************
+
+ ver1.2.5
+ convert code to Ampare
+
+*******************************
+float cul_ADC(short code){
+
+ float analog_data;
+
+ analog_data = code * LSB_I / GAIN_I / TIME_INT * CAP ;
+
+ return( analog_data );
+
+}
+*/
+
+/*******************************
+
+ set mode interruptin/degitalin
+
+*******************************/
+void set_pullup()
+{
+ /*** ver3 ***/
+ sw_start.mode(PullUp);
+
+ for (int i = 0; i <= 5; i++){
+ seq_in[i].mode(PullUp);
+ }
+
+}
+/*******************************
+
+ Sequence Mode main screen
+
+*******************************/
+void seq()
+{
+ gu_cls();//clear screen
+ gu_fontsize(2);
+ gu_print1("Sequenser Mode");
+
+ //seq_start.fall(&trigger);//スタート信号立下りで割込み
+
+ //シーケンサのトリガ以外は受け付けない
+ while(1) {
+ /*** ver3 ***/
+ //if( seq_start == 0 ) {
+ if ( seq_in[0] == 0 ){
+
+ trigger();
+
+ }
+
+ wait(0.3);
+
+ }//while(1)
+}
+
+
+/*******************************
+
+ Strart Sequence
+
+*******************************/
+void trigger()
+{
+ char meas_num;//測定個数
+ char cal_num; //CAL選択ナンバー
+ //char cmd_gu[2];
+
+ gu_cls();//clear screen
+ gu_fontsize(2);
+ gu_print1("Sequenser Mode");
+ gu_fontsize(1);
+ gu_cursor(0,3);
+ gu_print1("start ");
+ gu_cursor(128,0);
+ 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 ) {
+ read_caliber(&calinfo, cal_num);
+ gu_onebyte( cal_num + 0x30 );//CAL.No.確認用
+ } else {
+ gu_cls();
+ gu_fontsize(1);
+ gu_print1("Cal number error");
+ wait(1);
+
+ }
+
+ /*** 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 );//測定個数確認用
+
+ /*** ver3 ***/
+ //seq_busy = 1;//DegitalOut busy
+ seq_out[4] = 1;
+
+ auto_meas( meas_num );
+
+ //判定結果をシーケンサへ出力
+ hantei( meas_num );
+
+ wait(0.1);
+
+ seq_serialcomunication( meas_num );
+
+ //測定終了ver3
+ //seq_busy = 0;//DegitalOut busy
+ seq_out[4] = 1;
+
+ //終了表示
+ gu_fontsize(1);
+ gu_cursor(0,3);
+ gu_print1("ready ");
+
+}
+
+/*******************************************************************************
+
+ 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[29]; //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, 29);
+
+ 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;
+ int adrs_init;
+ int adrs;
+ char cdata[27];
+
+ 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), 27);//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 );
+ }
+
+ cal -> number = num;
+ 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()
+{
+
+ //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登録情報全消去("0x00"書込み)
+
+ ver3. CAT24M01用に改修 2022.4.11
+ 0x00000 ~ 0x032FF を消去
+
+*******************************************************************************/
+void erace_calinfo()
+{
+ int i;
+ int j;
+
+ //init cal number ver3
+ reg_num = 0x01;
+ wdata[0] = adrs_calnum[0];
+ wdata[1] = adrs_calnum[1];
+ wdata[2] = reg_num;
+ Soushin = i2c.write (eeprom_adrs, wdata, 3);
+
+ wait(0.2);
+
+ //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);
+
+ }
+
+}
+/*******************************************************************************
+
+ ADC(MCP3424) Configuration Register
+
+ ch : Channel Selection Bit
+ 00 = Select Channel 1
+ 01 = Select Channel 2
+ 10 = Select Channel 3
+ 11 = Select Channel 4
+
+ rate : Sample Rate Selection Bit
+ 00 = 240 SPS(12bits)
+ 01 = 60 SPS(14bits)
+ 10 = 15 SPS(16bits)
+ 11 = 3.75 SPS(18bits)
+
+*******************************************************************************/
+char adc_config(char ch, char rate)
+{
+ char confreg; //Configuration Register 1byte
+
+ char rdy = 0; //Ready Bit
+ char cm = 1; //Conversion Mode Bit
+ char gain = 0; //PGA Gain Selection Bits
+
+ confreg = (( rdy & 0x1 ) << 7 ) + (( ch & 0x3) << 5 ) + (( cm & 0x1 ) << 4) + (( rate & 0x3 ) << 2) + ( gain & 0x3 ) ;
+
+ return( confreg );
+}
+/*******************************************************************************
+
+ ADC(MCP3424) Configuration Register
+ 電流測定チャンネルの選択
+ char ch : 1~4ch
+
+*******************************************************************************/
+void select_ich(char ch)
+{
+ char com;
+
+ switch ( ch ) {
+ case 0:
+ com = adc_config( 0, 1 );//ADC3_ch1選択 14bits
+ i2c.write( addr_ADC3, &com, 1 );
+ break;
+ case 1:
+ com = adc_config( 1, 1 );//ADC3_ch2選択 14bits
+ i2c.write( addr_ADC3, &com, 1 );
+ break;
+ case 2:
+ com = adc_config( 0, 1 );//ADC4_ch1選択 14bits
+ i2c.write( addr_ADC4, &com, 1 );
+ break;
+ case 3:
+ com = adc_config( 1, 1 );//ADC4_ch2選択 14bits
+ i2c.write( addr_ADC4, &com, 1 );
+ break;
+ }
+}
+/*******************************************************************************
+
+ 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);
+
+ //connect 2byte
+ sdata = cdata[0] & 0xFF;
+ sdata = ( sdata << 8 ) | cdata[1];
+
+ return ( sdata );
+}
+/*******************************************************************************
+
+ AUTO/SEQ Mode
+
+ ワンショットタイマー発生イベント
+
+ For Current measurement
+ a recurring interrupt to repeatedly call a function at a specified rate.
+
+*******************************************************************************/
+void flip_ch1()
+{
+ short sdata;
+
+ sdata = read_adc( addr_ADC3 );
+
+ I[0] = sdata * 5 * 0.25;
+
+ //次の測定chへ切替
+ select_ich(1);
+}
+
+void flip_ch2()
+{
+ short sdata;
+
+ sdata = read_adc( addr_ADC3 );
+
+ I[1] = sdata * 5 * 0.25;
+
+ //次の測定chへ切替
+ select_ich(2);
+}
+
+void flip_ch3()
+{
+ short sdata;
+
+ sdata = read_adc( addr_ADC4 );
+
+ I[2] = sdata * 5 * 0.25;
+
+ //次の測定chへ切替
+ select_ich(3);
+}
+
+void flip_ch4()
+{
+ short sdata;
+
+ sdata = read_adc( addr_ADC4 );
+
+ I[3] = sdata * 5 * 0.25;
+
+ //次の測定chへ切替 無し
+}
+
+/*******************************************************************************
+
+ Manual Mode
+
+ 繰り返しタイマー発生イベント
+
+ For Current measurement
+ a recurring interrupt to repeatedly call a function at a specified rate.
+
+*******************************************************************************/
+void flip()
+{
+ short sdata; //_2byte reading data of ADC
+ float fdata; // ver1.1.4
+
+ switch ( ch_num ) {
+ case 0:
+ case 1:
+ sdata = read_adc( addr_ADC3 );
+ break;
+ case 2:
+ case 3:
+ sdata = read_adc( addr_ADC4 );
+ break;
+ }
+
+ //sdata = sdata * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv
+ /*ver1.1.4*/
+ fdata = sdata * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv
+
+ gu_cursor(0,4);
+ gu_print1(" ");
+ /*ver1.1.4*/
+ gu_putdeci(&fdata);
+ //gu_putdeci(&sdata);
+
+ 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
+
+}
+/*********************************
+ Manual Mode
+ initial screen
+*********************************/
+void manual_int_hyouji()
+{
+
+ /* 画面表示 */
+ gu_cls();
+ gu_fontsize(2); //change fontsize
+ gu_fontWidth(Proportional1);
+ gu_print1("Manual Mode");
+
+ gu_cursor(0, 2);
+ gu_print1("CH.");
+ gu_cursor(40, 14);
+ gu_print1("vss");
+ gu_cursor(192, 14);
+ gu_print1("ch.");
+ /*
+ gu_cursor(128, 14);
+ gu_print1("slct ch.");
+ */
+
+ //操作ボタン配置
+ gu_Button_power_on();//メニューへ戻る
+ gu_button_up(27);//印加電圧増加
+ gu_button_down(28);//印加電圧減少
+ gu_button_up(32);//ch切替
+ //gu_button_down(32);//ch切替
+
+ //Show Reset button(LEFT)
+ gu_set_button(25,"R");
+
+}
+/*******************************************************************************
+
+ Manual Mode (Main)
+
+*******************************************************************************/
+void manual()
+{
+
+ char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+ char cswdata; // 0x00 or 0x01
+ char crdata[3];
+ char *pcswnum = &cswnum;
+ char *pcswdata = &cswdata;
+ int i;
+ int j;
+ float interval;//繰り返し測定間隔(s) <- 積分時間と、繰り返し割込みサブ中のwait(放電時間)も足す
+ short vss;
+ short sdata;
+ int r_flag;
+ float ima;
+ short ssdata;
+
+ ch_num = 0; //初期電流測定CH.
+
+ interval = time_integral + time_discharge ;//繰り返し割込みの間隔設定
+ flipper.attach(&flip, interval);
+
+ read_regnum();//CAL登録No.読込
+ read_caliber(&calinfo, reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+ /* 初期表示 */
+ manual_int_hyouji();
+ //選択測定チャンネルの表示
+ gu_fontsize(2); //change fontsize
+ gu_cursor(24, 2);
+ wdata[0] = ( ch_num + 1 ) + 0x30;
+ i2c.write( addr_gu, wdata, 1);
+
+ //初期測定設定
+ //set range
+ range[0] = 1;//ch.1 10uA測定レンジ
+ //select channel
+ wdata[0] = adc_config( 0, 1 );//ADC3_ch1選択 14bits
+ i2c.write( addr_ADC3, wdata, 1 );
+
+ /*** 電源印加 ***/
+
+ vss = calinfo.vss_iop;
+
+ 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 ");
+
+ gu_cursor(64,8);
+ sdata = -1 * vss;
+ gu_putdeck( &sdata );
+ gu_print1("V");
+
+ while(1) {
+
+ crdata[0] = 0;
+ crdata[1] = 0;
+ crdata[2] = 0;
+
+ //タッチパネルスイッチ読込
+ Jyushin = 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 26://SW27
+ //gu_reverse(0x01); //gu_リバース指定
+ //gu_button_up(27);
+
+ if ( vss < 4500 ) {
+ vss = vss + 100;
+ }
+
+ 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_cursor(64,8);
+ sdata = -1 * vss;
+ gu_putdeck( &sdata );
+ gu_print1("V");
+
+ //gu_button_up(27);
+
+ //wait(0.1);
+
+ break;
+
+ case 27://SW28
+ //gu_reverse(0x01); //gu_リバース指定
+ //gu_button_down(28);//印加電圧減少
+
+ if ( vss >= 100 ) {
+ vss = vss - 100;
+ }
+
+ 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_リバース指定
+ gu_cursor(64,8);
+ sdata = -1 * vss;
+ gu_putdeck( &sdata );
+ gu_print1("V");
+
+ //gu_button_down(28);//印加電圧減少
+
+ //wait(0.1);
+
+ break;
+
+ case 0x07 ://Exit
+
+ gu_Button_power_off();//電源ボタンイメージ反転表示
+
+ //割り込み停止
+ flipper.detach();
+
+ for( i = 0; i <= 3; i++) {
+ houden[i] = 1;//discharge
+ }
+
+ wait( time_discharge );
+ //set measuring range
+ for( i = 0; i <= 3; i++) {
+ range[i] = 0;//range 1mA
+ 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 <= 15; i++)
+ io[i] = 0; //全てのio"L"
+
+ return;//この関数を抜ける
+
+ case 0x18 ://sw25 reset DUT
+
+ //gu_リバース指定
+ gu_reverse(0x01);
+ //Show Reset button(Left)
+ gu_set_button(25,"R");
+
+ wait(0.1);
+
+ gu_reverse(0x00); //gu_リバース解除
+ gu_set_button(25,"R"); //Show Reset button(Left)
+
+ io_reset[ch_num] = 1;//ver3.0.0 R="H"
+
+ //set measuring range ver1.1.0
+ for( i = 0; i <= 3; i++)
+ range[i] = 0;//range 1mA
+
+ r_flag = 1;
+
+ //割り込み停止 電流測定用タイマー停止
+ flipper.detach();
+
+ break;
+
+ case 31 ://sw32 CH選択
+
+ //gu_reverse(0x01);//gu_リバース指定
+ //gu_button_up(32);
+ //gu_reverse(0x00);//gu_リバース解除
+
+ if ( ch_num < ( number_of_channels - 1 )) {
+ ch_num = ch_num + 1;
+ } else {
+ ch_num = 0;
+ } //ver1.1.0
+
+ select_ich(ch_num);//ADC測定CHの変更
+
+ //set measuring range
+ for( i = 0; i <= 3; i++)
+ range[i] = 0; //range 1mA
+
+ 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;
+ i2c.write( addr_gu, wdata, 1);
+
+ //gu_button_up(32);
+
+ wait(0.1);
+
+ break;
+
+ } //switch
+ Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+ }//if
+ }//if
+
+ //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;
+ flipper.attach(&flip, interval);//割込み開始
+ }
+
+ if ( r_flag == 1 ) {
+ j = j + 1;
+
+ //R=Hの時の電流測定(1ma renge)
+ select_ich( ch_num );
+ ssdata = read_adc( addr_ADC3 );
+ ima = ssdata * 5 * 0.25;
+
+ gu_cursor(0,4);
+ gu_fontsize(2);
+ gu_print1(" ");
+ gu_putdeci_mA(&ima);
+ }
+
+ /*
+ //電圧測定
+ 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 ); //抵抗値表示サブ
+ */
+
+ wait( 0.1 );
+
+ }//While
+}
+
+/*****************************
+
+ I2C General Call
+
+*****************************/
+void general_call(char com)
+{
+ char cmd[1];
+
+ cmd[0]= com;
+ i2c.write(0x00, cmd, 1); //General Call
+}
+/*******************************************************************************
+
+ MAIN
+
+*******************************************************************************/
+int main(void)
+{
+ while(1) {
+
+ wait(0.2);
+
+ //ver3.0.0
+ uart.format(7, Serial::Even, 1);
+
+ set_pullup();
+
+ general_call(0x06); //ADC power on reset
+
+ dac_init(); //DAC 初期化
+
+ gu_initial();//初期画面へ
+ //utility();
+ }
+} //main end
+
+void gu_initial()
+{
+ char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte0
+ //char *pcmd = cmd_gu;
+ char clumi; //輝度設定用変数 01h<=n<=08h
+ char* pclumi = &clumi; //ポインタの定義
+ char crdata[3];
+ char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+ char cswdata; // 0x00 or 0x01
+ char *pcswnum = &cswnum;
+ char *pcswdata = &cswdata;
+ char csyoudo[4];
+ 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;
+ cmd_gu[1]= 0x40;
+ i2c.write(addr_gu, cmd_gu, 2); //gu-D ESC 初期化
+ wait(0.2);
+
+ //メモリ00h番地(GU_D輝度設定データ)読み出し
+ //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;
+ gu_luminance(pclumi);
+
+ gu_fontsize(2); //change fontsize
+ //ver1.2.3
+ //gu_print1("ILF Iop/Voc/O.C.P/R");
+ gu_print1("ILF mode selectiion");
+ //upto
+ //gu_CRLF();//CR+LF
+ //gu_print1("Settings");
+ gu_fontsize(1);
+ gu_cursor(192,1);
+ gu_print1("ver");
+ gu_onebyte( version_major + 0x30 );
+ gu_print1(".");
+ gu_onebyte( version_minor + 0x30 );
+ gu_print1(".");
+ gu_onebyte( version_build + 0x30 );
+
+ gu_touchPara(0,touch);//タッチ感度 00h~07h
+
+ //MODE選択用ボタンの表示
+ gu_set_button(9,"");
+ gu_set_button(17,"");
+ gu_set_button(25,"");
+ gu_set_button(13,"");
+ gu_set_button(21,"");
+ gu_set_button(29,"");
+ //LED Brighness
+ gu_fontsize(2);
+ gu_cursor(36,32/8);
+ gu_print1("CAL");
+ gu_cursor(36,64/8);
+ gu_print1("LUX");
+ //gu_cursor(36,80/8);
+ //gu_print1("illumi");
+ //Display Brightness
+ gu_cursor(36,96/8);
+ gu_print1("Utility");
+ //Auto MODE
+ gu_cursor(164,32/8);
+ gu_print1("Auto");
+ //Manual Mode
+ gu_cursor(164,64/8);
+ gu_print1("Manual");
+ //Sequenser Mode
+ gu_cursor(164,96/8);
+ gu_print1("SEQ");
+
+ /**********************
+ SDカードファイルオープン
+ **********************/
+
+ mkdir("/sd/mydir", 0777);
+
+ FILE *fp = fopen("/sd/mydir/iop.csv", "ab+");//ディレクトリとファイル名の指定
+
+ if(fp == NULL) {
+ /*ver1.1.3
+ gu_fontsize(1);
+ gu_cursor(0,2);
+ gu_print1("Could not open file for SD card");
+ */
+ } else {
+ fprintf(fp, "NewData R IOP OCP VOC");
+ fprintf(fp, "\n");
+ fclose(fp);
+ }
+ /**********************
+ LED照度初期設定
+ **********************/
+ read_syoudo( csyoudo );
+
+ //gu-D タッチスイッチ読み出し動作設定 p49
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+ 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 0x08 ://SW9 CAL登録画面
+ //gu_リバース指定
+ gu_reverse(0x01);
+ //Show Button
+ gu_set_button(9,"");
+ wait(0.1);
+ //gu_リバース解除
+ gu_reverse(0x00);
+
+ select_cal();//CAL選択画面へ移動
+
+ return;
+
+ case 0x10 ://SW17
+ //gu_リバース指定
+ gu_reverse(0x01);
+ //Show Button
+ gu_set_button(17,"");
+ wait(0.1);
+ //gu_リバース解除
+ gu_reverse(0x00);
+
+ adjust_illumination();//LED照度調整へ移動
+
+ return;
+
+ case 0x18 ://SW25
+ //gu_リバース指定
+ gu_reverse(0x01);
+ //Show Button
+ gu_set_button(25,"");
+ wait(0.1);
+ //gu_リバース解除
+ gu_reverse(0x00);
+
+ utility();//画面輝度調整へ移動
+
+ return;
+
+ case 0x0C ://SW13 自動測定モード
+ //gu_リバース指定
+ gu_reverse(0x01);
+ //Show Button
+ gu_set_button(13,"");
+ wait(0.1);
+ //gu_リバース解除
+ gu_reverse(0x00);
+
+ auto_run();
+
+ return;
+
+ case 0x14 ://SW21 手動測定モード
+ //gu_リバース指定
+ gu_reverse(0x01);
+ //Show Button
+ gu_set_button(21,"");
+ wait(0.1);
+ //gu_リバース解除
+ gu_reverse(0x00);
+
+ manual();
+
+ return;
+
+ case 0x1C ://SW29 シーケンサ制御モード
+ //gu_リバース指定
+ gu_reverse(0x01);
+ //Show Button
+ gu_set_button(29,"");
+ wait(0.1);
+ //gu_リバース解除
+ gu_reverse(0x00);
+
+ seq();
+
+ return;
+
+ } //switch
+
+ }//if(cswdata == 0x01) {
+ } //if(crdata[0] == 0x11 ) {
+
+ wait(0.1);//タッチスイッチ入力読み出し間隔
+
+ } //while(1) {
+
+}
+
+/*******************************************************************************
+
+ 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.");
+
+ 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, 4); //4byte ascii code
+
+ 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-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];
+ char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+ char cswdata; // 0x00 or 0x01
+ char *pcswnum = &cswnum;
+ char *pcswdata = &cswdata;
+ char calnum; //選択したCALナンバー
+
+ int digit = 0 ; //CAL番号 10の位の値 0~4
+ bool redraw ; //再描画
+
+ read_regnum();//EEPROMに保存した選択CAL_NO.の読み出し
+
+ 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情報
+
+ 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;
+
+ 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;
+ redraw = true;
+ }
+ break;
+
+ } //switch
+
+ if (redraw){
+ break; //exit while
+ }
+
+ }//if(cswdata == 0x01) {
+ } //if(crdata[0] == 0x11 ) {
+ wait(0.1);//タッチスイッチ入力読み出し間隔
+ } //while(1)
+
+ }
+}
+
+/*******************************************************************************
+
+ CAL情報登録画面 サブルーチン
+ 項目の表示
+
+ 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(int x)
+{
+ gu_fontsize(2);
+ gu_cursor(0,4);
+ gu_print1(" ");
+ 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]);
+ }
+
+}
+
+/*******************************************************************************
+
+ CAL情報登録画面 sub
+
+ para kind of parameter
+ idata data value
+ inc add number ex)0x64 0x0A 0x01
+
+*******************************************************************************/
+/*** 加算 ***/
+void increase_param(int para, signed short *sdata, short inc)
+{
+ switch ( para ) { //パラメータの項目によって上限値異なる
+ case 0://vss_iop
+ 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 6: //up_limit_o.c.p
+ if(*sdata <= ( 2500 - inc / 10 )) {
+ *sdata = *sdata + inc /10 ;
+ }
+ break;//switch ( param )
+ 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 12: //low_limit_resistor
+ case 13: //up_limit_resistor
+ if(*sdata <= ( 2550 - inc )) {
+ *sdata = *sdata + inc;
+ }
+ break;
+
+ }//switch ( param ){
+}
+
+/*** 減算 ***/
+void decrease_param(int para, signed short *sdata, short dec)
+{
+ switch ( para ) { //パラメータの項目によって上限値異なる
+ case 0://vss_iop
+ 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;
+ }
+ break;
+
+ case 4://low_limit_iop
+
+ if(*sdata >= dec / 10 ) {
+ *sdata = *sdata - dec / 10;
+ }
+ 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 9: //wait_iop
+ case 10: //wait_ocp
+ case 11: //wait_voc
+
+ if(*sdata >= dec / 10 ) {
+ *sdata = *sdata - dec / 10 ;
+ }
+ break;//switch ( param )
+
+ case 12: //low_limit_resistor
+ case 13: //up_limit_resistor
+
+ if(*sdata >= dec ) {
+ *sdata = *sdata - dec;
+ }
+ break;
+
+ }//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情報登録画面 表示
+
+ ****** 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
+ 別途システム設計図,EEPROMのシートを参照
+
+ ver3.0.0
+
+ param:
+ 0:vss_iop
+ 1:vss_ocp
+ 2:vss_voc
+ 3:low_limit_voc
+ 4:low_limit_iop
+ 5:low_limit_ocp
+ 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)
+{
+ int param; //設定するパラメータの選択
+ char crdata[3]; //GU-Dからの受信DATA 3byte
+ signed short sdata_cal[18]; //CAL設定条件
+ signed short hyouji_data;
+ 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~
+
+ int pwflag = 0;
+
+ pw(&pwflag);
+
+ if ( pwflag != 0 ){
+ return;
+ }
+
+ //Load caliber information
+ read_caliber(&calinfo,cal_num);
+
+ sdata_cal[0] = calinfo.vss_iop;
+ sdata_cal[1] = calinfo.vss_ocp;
+ sdata_cal[2] = calinfo.vss_voc;
+ sdata_cal[3] = calinfo.low_limit_voc;
+ sdata_cal[4] = calinfo.low_limit_iop;
+ sdata_cal[5] = calinfo.low_limit_ocp;
+ sdata_cal[6] = calinfo.up_limit_ocp;
+ 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];
+ 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);
+
+ if (crdata[0] == 0x11 && crdata[2] == 0x01 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。&& タッチしたならば
+ //cswnum = crdata[1]; //スイッチ番号
+ //cswdata = crdata[2];//ON/OFF情報
+
+ //タッチした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);//設定パラメータ表示
+
+ }
+
+ 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);
+ 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_fontsize(2);
+ gu_cursor(zahyou_val[0],zahyou_val[1]); //表示位置の指定
+
+ 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://low_limit_iop
+ case 5://low_limit_ocp
+ case 6://up_limit_ocp
+ hyouji_data = sdata_cal[param] * 10;
+ gu_putdeck ( &hyouji_data );
+ break;
+
+ 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 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, 4); //3byte ascii code
+ break;
+
+ }//swith
+ wait(0.1);//gu-D 読込間隔の設定
+ }//while
+}
+
+/*********************************
+
+ Auto Mode (sub)
+ 自動測定モード 初期画面
+
+*********************************/
+void auto_int_hyouji()
+{
+ //short st;
+ char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte
+
+ gu_cls();
+ gu_fontsize(1);
+ gu_print1("AUTO MODE CAL No.");
+ cmd_gu[0] = reg_num + 0x30;
+ i2c.write(addr_gu, cmd_gu, 1);
+ gu_Button_power_on();//show button
+
+}
+/*******************************************************
+
+ Auto Mode (Main)
+ 自動測定モード 画面
+ ver1.04 パネルタッチ -> スタートスイッチで測定開始へ変更
+
+*******************************************************/
+void auto_run()
+{
+ char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte
+ char crdata[6];
+ //char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+ //int i;
+ //float fdata[4][4];//ファイル出力用
+ //short sdata[4];
+ //short s;
+
+ read_regnum();//CAL登録No.読込
+ read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+ auto_int_hyouji();
+
+ //dac_init(); //DAC 初期化
+
+ //gu-D タッチスイッチ読み出し動作設定 p49
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+ wait(0.1);
+
+ Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+ while(1) {
+
+ //スタートスイッチで測定開始
+ if ( sw_start == 0 ) {
+ meas_sub();
+ }
+
+ wait(0.1);
+
+ crdata[0] = 0;
+ crdata[1] = 0;
+ crdata[2] = 0;
+
+ i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+ if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+
+ //cswnum = crdata[1]; //スイッチ番号
+ //cswdata = crdata[2];//ON/OFF情報
+
+ //gu-D タッチスイッチ読み出し動作設定 p49
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+ if ( crdata[1] == 7 ) {
+
+ gu_Button_power_off();//電源ボタンイメージ反転表示
+ wait(0.5);
+
+ led_off();//LED全消灯
+
+ return;//この関数を抜ける
+
+ } //end if
+
+ /* ver 1.1.1 タッチパネルで測定開始を削除
+ else {
+
+ meas_sub();//測定用サブ
+
+
+ } //else if
+ */
+
+ //gu-D タッチスイッチ読み出し動作設定 p49
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+ wait(0.1);
+
+ i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+ }//if
+ wait(0.1);
+ }//While
+}
+
+/*
+ char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte
+ char crdata[6];
+ char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+ //int i;
+ //float fdata[4][4];//ファイル出力用
+ //short sdata[4];
+ //short s;
+
+ read_regnum();//CAL登録No.読込
+ read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+ auto_int_hyouji();
+
+ //dac_init(); //DAC 初期化
+
+ //gu-D タッチスイッチ読み出し動作設定 p49
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+ wait(0.1);
+
+ Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+ while(1) {
+
+ wait(0.1);
+
+ crdata[0] = 0;
+ crdata[1] = 0;
+ crdata[2] = 0;
+
+ i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+ if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+ cswnum = crdata[1]; //スイッチ番号
+ //cswdata = crdata[2];//ON/OFF情報
+
+ //gu-D タッチスイッチ読み出し動作設定 p49
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+ //SWの番号(位置)
+ if ( cswnum == 7 ) {
+
+ gu_Button_power_off();//電源ボタンイメージ反転表示
+ wait(0.5);
+
+ led_off();//LED全消灯
+
+ return;//この関数を抜ける
+
+ }
+
+ //gu-D タッチスイッチ読み出し動作設定 p49
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+ wait(0.1);
+
+ i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+ } else if ( sw_start == 0 ) { //if
+
+ auto_int_hyouji();
+
+ gu_cursor(0,2);
+ gu_print1("Please Wait..");
+ gu_fontsize(2);
+
+ read_regnum();//CAL登録No.読込
+
+ read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+ auto_meas( number_of_channels );//2個測定
+
+ hantei( number_of_channels );//判定LED
+
+ wait(0.5);
+
+ gu_fontsize(1);
+ gu_cursor(0,2);
+ gu_print1("READY ");
+
+ }
+ wait(0.1);
+ }//While
+}
+*/
+
+/*
+void auto_run()
+{
+ char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte
+ char crdata[6];
+ char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+ //int i;
+ //float fdata[4][4];//ファイル出力用
+ //short sdata[4];
+ //short s;
+
+ read_regnum();//CAL登録No.読込
+ read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+ auto_int_hyouji();
+
+ //dac_init(); //DAC 初期化
+
+ //gu-D タッチスイッチ読み出し動作設定 p49
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+ wait(0.1);
+
+ Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+ while(1) {
+
+ wait(0.1);
+
+ crdata[0] = 0;
+ crdata[1] = 0;
+ crdata[2] = 0;
+
+ i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+ if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+ cswnum = crdata[1]; //スイッチ番号
+ //cswdata = crdata[2];//ON/OFF情報
+
+ //gu-D タッチスイッチ読み出し動作設定 p49
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+ //SWの番号(位置)
+ if ( cswnum == 7 ) {
+
+ gu_Button_power_off();//電源ボタンイメージ反転表示
+ wait(0.5);
+
+ led_off();//LED全消灯
+
+ return;//この関数を抜ける
+
+ } else {
+
+ auto_int_hyouji();
+
+ gu_cursor(0,2);
+ gu_print1("Please Wait..");
+ gu_fontsize(2);
+
+ read_regnum();//CAL登録No.読込
+
+ read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+ auto_meas( number_of_channels );//2個測定
+
+ hantei( number_of_channels );//判定LED
+
+ wait(0.5);
+
+ gu_fontsize(1);
+ gu_cursor(0,2);
+ gu_print1("READY ");
+
+ } //else if
+
+ //gu-D タッチスイッチ読み出し動作設定 p49
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+ wait(0.1);
+
+ i2c.read ((addr_gu + 0x01), crdata, 3, true);
+
+ }//if
+
+ wait(0.1);
+
+ }//While
+
+}
+*/
+
+/*********************************
+
+ Auto Mode (Sub)
+
+*********************************/
+void meas_sub()
+{
+ auto_int_hyouji();
+
+ gu_cursor(0,2);
+ gu_print1("Please Wait..");
+ gu_fontsize(2);
+
+ read_regnum();//CAL登録No.読込
+
+ read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入
+
+ auto_meas( number_of_channels );//2個測定
+
+ hantei( number_of_channels );//判定LED
+
+ wait(0.5);
+
+ gu_fontsize(1);
+ gu_cursor(0,2);
+ gu_print1("READY ");
+
+}
+
+/*******************************************************************************
+
+ 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個測定時の表示スタート位置
+ int y[4] = {5,11,5,11}; //GU_D y座標 4個測定時の表示スタート位置
+ int iy ; //GU_D y座標 2個測定時の表示スタート位置
+ int i;
+ float fdata[4][4];//ファイル出力用
+ short sdata[4];
+
+ iy = 4;//GU_D 2個測定時の測定値の表示開始位置 y座標
+
+ if ( noc > 4 ) {
+ noc = 4;
+ }
+
+ //値の初期化
+ for ( i = 0; i <= 3; i++) {
+ I[i] = 0;
+ R[i] = 0; //ver 1.1.1
+ iop[i] = 0;
+ voc[i] = 0;
+ ocp[i] = 0;
+ }
+
+ //判定用LED消灯
+ led_off();
+
+ //電源投入
+ for ( i = 0; i <= ( noc - 1 ); i++) {
+ dac_out( calinfo.vss_iop,i); //Vss設定 DAC_A~D
+ }
+
+ wait( wait_poweron );//パワーブレイク復帰待機?
+
+ //Reset DUT
+ for ( i = 0; i <= ( noc -1 ); i++) {
+ io_reset[i] = 1; //R = VDD
+ }
+
+ wait(time_reset);
+
+ for ( i = 0; i <= ( noc -1 ); i++) {
+ io_reset[i] = 0; //R = "OPEN"
+ }
+
+ //抵抗測定
+ for ( i = 0; i <= ( noc -1 ); i++ ) {
+ R[i] = meas_resistor(i);
+ }
+
+ //display GU_D
+ if ( number_of_channels <= 2 ) { //2個測定の時の表示
+ gu_fontsize(2);
+ gu_cursor(0,iy);
+ gu_print1("[ch.1]");
+ gu_cursor(128,iy);
+ gu_print1("[ch.2]");
+ //CH.1 表示
+ gu_cursor(0, iy + 2);
+ gu_print1("R ");
+ display_resistor( R[0] );
+ //CH.2 表示
+ gu_cursor(128, iy + 2);
+ gu_print("R ");
+ display_resistor( R[1] );
+ } else if( number_of_channels >= 3) { //3.4個測定の時の表示
+ gu_fontsize(1);
+ gu_cursor(x[0],y[0]);
+ gu_print1("ch.1");
+ gu_cursor(x[1],y[1] );
+ gu_print1("ch.2");
+ gu_cursor(x[2],y[2]);
+ gu_print1("ch.3");
+
+ if ( number_of_channels == 4 ) {
+ gu_cursor(x[3],y[3]);
+ gu_print1("ch.4");
+ }
+
+ //CH.1~4 表示
+ for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
+ gu_cursor( x[i], y[i] + 1 );//x座標指定
+ gu_print1("R ");
+ display_resistor( R[i] );
+ }
+ }
+
+ //iop測定
+ wait(calinfo.wait_iop);//Vss印加~リセット後からiop測定までの待機時間
+
+ meas_current_automode( noc );//電流測定サブ 測定値をI[]へ代入
+
+ for( i = 0; i <= ( noc - 1) ; i++) {
+ iop[i] = I[i];
+ }
+
+ //display GU_D
+ if ( number_of_channels <= 2 ) { //2個測定の時の表示
+ gu_cursor(0, iy + 4 );//IOP測定値表示位置指定
+ gu_print1("Iop ");
+ gu_putdeci(&iop[0]);
+ gu_cursor(128, iy + 4 );
+ gu_print1("Iop ");
+ gu_putdeci(&iop[1]);
+ } else {
+ //CH.1~4 表示
+ for ( i=0; i <= ( number_of_channels - 1 ); i++) {
+ gu_cursor( x[i], y[i] + 2 ); //x座標指定
+ gu_print1("Iop ");
+ gu_putdeci(&iop[i]);
+ }
+ }
+
+ wait(0.01);
+
+ //過充電防止時電流測定
+ for ( i = 0; i <= ( noc - 1 ); i++) {
+ dac_out( calinfo.vss_ocp,i); //Vss設定 DAC_A~D //ver1.1.2
+ }
+
+ wait( calinfo.wait_ocp );
+
+ meas_current_automode( noc );
+
+ for( i = 0; i <= ( noc - 1) ; i++) {
+ ocp[i] = I[i];
+ }
+
+ //display GU_D
+ if ( number_of_channels <= 2 ) { //2個測定の時の表示
+ gu_cursor(0, iy + 6 );//IOP測定値表示位置指定
+ gu_print1("OCP ");
+ gu_putdeci(&ocp[0]);
+ gu_cursor(128, iy + 6 );
+ gu_print1("OCP ");
+ gu_putdeci(&ocp[1]);
+ } else {
+ //CH.1~4 表示
+ for ( i=0; i <= ( number_of_channels - 1 ); i++) {
+ gu_cursor( x[i], y[i] + 3 ); //x座標指定
+ gu_print1("OCP ");
+ gu_putdeci(&ocp[i]);
+ }
+ }
+
+ //VOC測定
+ for ( i = 0; i <= ( noc - 1 ); i++) {
+ dac_out( calinfo.vss_voc,i); //Vss設定 DAC_A~D
+ }
+
+ wait( wait_voc_1 );
+
+ //Reset DUT
+ for ( i = 0; i <= ( noc -1 ); i++) {
+ io_reset[i] = 1; //R = VDD
+ }
+
+ wait( calinfo.wait_voc );//ver3
+
+ for ( i = 0; i <= ( noc -1 ); i++ ) {
+
+ voc[i] = meas_voltage(i);
+ sdata[i] = voc[i] * -1;
+
+ }
+
+ //display GU_D
+ if ( number_of_channels <= 2 ) { //2個測定の時の表示
+ gu_cursor(0, iy + 8 );//IOP測定値表示位置指定
+ gu_print1("Voc ");
+ gu_putdeck(&sdata[0]);
+ gu_print1("V");
+ gu_cursor(128, iy + 8 );
+ gu_print1("Voc ");
+ gu_putdeck(&sdata[1]);
+ gu_print1("V");
+ } else {
+ //CH.1~4 表示
+ for ( i=0; i <= ( number_of_channels - 1 ); i++) {
+ gu_cursor( x[i], y[i] + 4 );//x座標指定
+ gu_print1("Voc ");
+ gu_putdeck(&sdata[i]);
+ gu_print1("V");
+ }
+ }
+
+ //R = "L"
+ for ( i = 0; i <= ( noc -1 ); i++) {
+ io_reset[i] = 0; //R = "OPEN"
+ }
+
+ wait(0.1);
+
+ //Vss=0V
+ for ( i = 0; i <= ( noc - 1 ); i++) {
+ dac_out( 0, i );//Vss設定 DAC_A~D
+ }
+
+ //ファイルオープン
+ mkdir("/sd/mydir", 0777);
+
+ FILE *fp = fopen("/sd/mydir/iop.csv", "ab+");//ディレクトリとファイル名の指定,追加モード
+
+ if(fp == NULL) {
+ /* ver1.1.3
+ gu_fontsize(1);
+ gu_cursor(0,2);
+ gu_print1("Could not open file for SD card");
+ */
+ } else {
+ for ( i = 0; i <= ( noc - 1 ); i++) {
+ fdata[i][0] = iop[i] * 0.01; //1bitあたり0.01uA
+ fdata[i][1] = ocp[i] * 0.01; //1bitあたり0.01uA
+ fdata[i][2] = voc[i] * 0.001; //1bitあたり0.001V
+ seq_fdata[i][0] = iop[i] * 0.01;//シーケンサ用グローバル変数
+ seq_fdata[i][1] = ocp[i] * 0.01;
+ seq_fdata[i][2] = voc[i] * 0.001;
+ }
+
+ for( i = 0; i <= ( noc - 1 ); i++) {
+
+ switch ( i ) {
+ case 0:
+ fprintf(fp, "CH.1");
+ break;
+ case 1:
+ fprintf(fp, "CH.2");
+ break;
+ case 2:
+ fprintf(fp, "CH.3");
+ break;
+ case 3:
+ fprintf(fp, "CH.4");
+ break;
+ }
+
+ fprintf(fp, " ");//excel 区切り位置
+ if ( R[i] < res_vref && R[0] >= 0 ) {
+ fprintf(fp, "%d", R[i]);
+ } else {
+ fprintf(fp,"OL");
+ }
+ fprintf(fp, " ");
+ fprintf(fp, "%f", fdata[i][0]);
+ fprintf(fp, " ");
+ fprintf(fp, "%f", fdata[i][1]);
+ fprintf(fp, " ");
+ fprintf(fp, "%f", fdata[i][2]);
+ fprintf(fp, " ");
+ }//for
+
+ //ファイルクローズ
+ fprintf(fp, "\n");
+ fclose(fp);
+ }
+
+}
+
+/*********************************
+
+ 電流測定(iop/voc共通)
+ char amount;//測定数
+
+*********************************/
+void meas_current_automode(char amount) //a quantity of measuring channel
+{
+ int i;
+
+ //amount = number_of_channels;
+
+ //set range
+ for ( i = 0; i <= ( amount - 1 ); i++)
+ range[i] = 1; //range 10uA
+
+ wait(0.1);
+
+ //discharge condenser
+ for ( i = 0; i <= ( amount - 1 ); i++)
+ houden[i] = 1; //discharge condenser
+
+ wait(time_discharge);//discharge time
+
+ ch_num = 0;
+ select_ich( ch_num ); //select channel that mesuring current
+ houden[0] = 0; //start integral
+
+ oneshot1.attach ( &flip_ch1, time_integral );
+
+ if ( amount >= 2 ) {
+ wait(0.1);
+ houden[1] = 0;
+ oneshot2.attach ( &flip_ch2, time_integral );
+ }
+
+ if ( amount >= 3 ) {
+ wait(0.1);
+ houden[2] = 0;
+ oneshot3.attach ( &flip_ch3, time_integral );
+ }
+
+ if ( amount == 4 ) {
+ wait(0.1);
+ houden[3] = 0;
+ oneshot4.attach ( &flip_ch4, time_integral );
+ }
+
+ wait( time_integral + 0.3 );//wait Timeout
+
+ //discharge condenser
+ for ( i = 0; i <= ( amount - 1 ); i++)
+ houden[i] = 1; //discharge condenser
+
+ wait(time_discharge);//discharge time
+
+ //not discharge condenser
+ for ( i = 0; i <= ( amount - 1 ); i++)
+ houden[i] = 0;
+
+ //set range
+ for ( i = 0; i <= ( amount - 1 ); i++)
+ range[i] = 0; //range 1mA
+
+ oneshot1.detach();
+ oneshot2.detach();
+ oneshot3.detach();
+ oneshot4.detach();
+
+}
+
+/*********************************
+ DAC 初期設定
+ LDACレジスタの設定
+ 内部リファレンス電圧のセットアップ
+ 入力シフトレジスタ:
+ 0011 1000 0000 0000 0000 0001
+ (0x3F0001)
+*********************************/
+void dac_init()
+{
+
+ //内部リファレンス電圧のセットアップ
+ wdata[0] = 0x38;
+ wdata[1] = 0x00;
+ wdata[2] = 0x01;//
+
+ i2c.write ( addr_dac, wdata, 3);
+
+ wait(0.1);
+
+ //LDAC設定
+ wdata[0] = 0x30;
+ wdata[1] = 0x00;
+ wdata[2] = 0x0F;//
+
+ i2c.write ( addr_dac, wdata, 3);
+
+}
+
+/**************************************
+ DAC 電圧印加
+ Vout = 2 * Vref(2.5V) * ( D /2^2 )
+ mvolt[mV] 0~5000で設定
+ addrは、0x00~03.全チャネルは0x07で指定
+**************************************/
+void dac_out(short mvolt, char addr) //addr DACA:0x00 DACB:0x01 DACC:0x02 DACD:0x03 allDACs:0x07
+{
+ char command;//1byte
+ short dacdata;//2byte
+
+ command = 0x02;//write to input register n 仕様書p25参照
+
+ dacdata = mvolt * 4095 / 2 / dac_vref ; //12bit mvolt[mV] 0~5000で設定する
+
+ dacdata = dacdata << 4; //後ろ4bitはdon't care bit
+
+ wdata[0] = command << 3 | addr; //1byte
+ wdata[1] = dacdata >> 8 ; //1byte
+ wdata[2] = dacdata & 0xFF;//1byte
+
+ i2c.write(addr_dac, wdata, 3);
+
+}
+/*********************************
+ ADC測定し、平均値を算出する
+
+ 貰う値:平均値の分母
+ 渡す値:平均値
+*********************************/
+void compute_adc(int adc_con, long *avg) //(ADCのCONFIG, 計算結果)
+{
+
+ //short sdata[10];//2byte
+ long ldata[10];//4byte
+ long nu;//平均値の分子 4byte
+ long max;
+ long min;
+ char i;
+ char x;
+ //int n;
+
+ x = 10;
+
+ wdata[0] = adc_con; //ADC configuration data チャンネルの選択など
+ i2c.write( addr_ADC1, wdata, 1 );
+ wait(0.1);
+
+ //平均値の母数の数、測定を実施。
+ for( i=0; i<=(x-1); i++) {
+
+ i2c.read( addr_ADC1 + 0x01, rdata, 3);
+ //2byte結合
+ ldata[i] = rdata[0] & 0xFF;
+ ldata[i] = ( ldata[i] << 8 ) | rdata[1];
+
+ if ( ldata[i] >= 0x8000 ) {
+ ldata[i] = ldata[i] | 0xFFFF0000; //4byteの補数へ変換
+ }
+
+ wait(0.05);
+
+ }//for
+
+ //最大値を取得
+ max = ldata[0];
+ for ( i=0; i<=(x-2); i++) {
+ if ( ldata[i+1] > ldata[i]) {
+ max = ldata[i+1];
+ }
+ }
+ //最小値
+ min = ldata[0];
+ for ( i=0; i<=(x-2); i++) {
+ if ( ldata[i+1] < ldata[i]) {
+ min = ldata[i+1];
+ }
+ }
+
+ //平均値
+ nu = 0x00000000; //4byte
+ for ( i=0; i<=(x-1); i++) {
+ nu = nu + ldata[i];
+ }
+
+ *avg = ( nu - max - min ) / ( x - 2 );
+
+}
+
+
+/**************************************
+ 2バイトを10進数で表示する 0~65535
+ format *0.000
+ mV→uAへ変換(1/1000)
+ プリアンプ GAIN 1/5
+ ADC_LSB:0.25mV
+ 積分時間 2s
+ 容量 20uF
+**************************************/
+void gu_putdeci(float* idata)
+{
+
+ float uA; //ver1.1.4
+ long y; //ver1.1.4
+ long x; //ver1.1.4
+
+ //千分の一、四捨五入。
+ if ( *idata > 0 ) {
+ uA = *idata + 0.5;
+ } else {
+ uA = *idata - 0.5;
+ }
+
+ x = uA; //小数点以下切り捨て
+
+ //四捨五入 up to here
+
+ //プラスマイナスの表示
+ if( x >= 0 ) {
+ wdata[0] = 0x2B;//ascii "+"
+ i2c.write(addr_gu, wdata, 1);
+
+ y = x;
+
+ } else {
+ wdata[0] = 0x2D;//ascii "-"
+ i2c.write(addr_gu, wdata, 1);
+
+ y = ( ~x ) + 0x01;//2の補数
+ }
+
+ //y = y * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv
+
+ wdata[0] = (( y / 1000 ) % 10 ) + 0x30;
+
+ if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。
+ wdata[0] = 0x20;
+
+ wdata[1] = (( y / 100 ) % 10 ) + 0x30;
+ wdata[2] = 0x2E;//ASCII "."
+ wdata[3] = (( y / 10 ) % 10 ) + 0x30;
+ wdata[4] = ( y % 10 ) + 0x30;
+
+ //ver1.2.5
+ //i2c.write(addr_gu, wdata, 5);
+ //gu_print1("uA");
+
+ if ( *idata > O_L * -100 && *idata < O_L * 100 ){
+
+ i2c.write(addr_gu, wdata, 5);
+ gu_print1("uA");
+
+ }else{
+
+ gu_print1("O.L");
+
+ }
+ //upto
+
+}
+
+/**************************************
+ 2バイトを10進数で表示する 0~65535
+ format *0.000
+ mV→uAへ変換(1/1000)
+ プリアンプ GAIN 1/5
+ ADC_LSB:0.25mV
+ シャント抵抗1kΩ
+**************************************/
+void gu_putdeci_mA(float* idata)
+{
+ float uA; //ver1.1.4
+ long y; //ver1.1.4
+ long x; //ver1.1.4
+
+ //千分の一、四捨五入。
+ if ( *idata > 0 ) {
+ uA = *idata + 0.5;
+ } else {
+ uA = *idata - 0.5;
+ }
+
+ x = uA; //小数点以下切り捨て
+
+ //四捨五入 up to here
+
+ //プラスマイナスの表示
+ if( x >= 0 ) {
+ wdata[0] = 0x2B;//ascii "+"
+ i2c.write(addr_gu, wdata, 1);
+
+ y = x;
+
+ } else {
+ wdata[0] = 0x2D;//ascii "-"
+ i2c.write(addr_gu, wdata, 1);
+
+ y = ( ~x ) + 0x01;//2の補数
+ }
+
+ //y = y * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv
+
+ /*
+ wdata[0] = (( *y / 100000 ) % 10 ) + 0x30;
+
+ if( wdata[0] == 0x30 )//3桁目が零の場合、"0"を表示しない。
+ wdata[0] = 0x20;
+ */
+
+ wdata[0] = (( y / 1000 ) % 10 ) + 0x30;
+
+ if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。
+ wdata[0] = 0x20;
+
+ wdata[1] = (( y / 100 ) % 10 ) + 0x30;
+ wdata[2] = 0x2E;//ASCII "."
+ wdata[3] = (( y / 10 ) % 10 ) + 0x30;
+ wdata[4] = ( y % 10 ) + 0x30;
+
+ i2c.write(addr_gu, wdata, 5);
+
+ gu_print1("mA");
+
+}
+
+/**************************************
+ 2バイトを10進数で表示する 0~65535
+ 1/1000倍 format *0.000
+ mV→V Ω→kΩ
+**************************************/
+void gu_putdeck(short* x)
+{
+
+ short num;
+
+ //プラスマイナスの表示
+ if( *x >= 0 ) {
+ wdata[0] = 0x2B;//ascii "+"
+ i2c.write(addr_gu, wdata, 1);
+ num = *x;
+
+ } else {
+ wdata[0] = 0x2D;//ascii "-"
+ i2c.write(addr_gu, wdata, 1);
+
+ //*x = ( ~*x ) + 0x01;//2の補数
+ num = *x * -1;
+ }
+
+ wdata[0] = (( num / 10000 ) % 10 ) + 0x30;
+
+ if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。
+ wdata[0] = 0x20;
+
+ wdata[1] = (( num / 1000 ) % 10 ) + 0x30;
+ wdata[2] = 0x2E;//ASCII "."
+ wdata[3] = (( num / 100 ) % 10 ) + 0x30;
+ wdata[4] = (( num / 10 ) % 10 ) + 0x30;
+ //wdata[5] = ( num % 10 ) + 0x30;
+
+ i2c.write(addr_gu, wdata, 5);
+
+}
+
+/********************************
+
+ 判定 LED点灯
+
+********************************/
+void hantei(char noc)
+{
+ int i;
+
+ //エラーフラグ
+ for ( i=0; i<= 3 ; i++) {
+ err_f[i] = 0;
+ }
+
+ //ver1.2
+ if (DEB_EN == 1) {
+ voc[0] = 3100;//[mV]
+ ocp[0] = -0.4*100;//[uA] 0.1uAのときocp[]の値は10
+ iop[0] = 16.5*100;//[uA] 0.1uAのときicp[]の値は10
+ voc[1] = 3100;//[V]
+ ocp[1] = 0.4*100;//[uA]
+ iop[1] = 16.5*100;//[uA]
+ }
+ //upto
+
+ for ( i = 0; i <= ( noc - 1 ); i++) {
+
+ /*ver1.1.3 規格設置値=0の場合は判定しない*/
+ if( voc[i] < calinfo.low_limit_voc && calinfo.low_limit_voc != 0) {
+ err_f[i] = 1;
+ }
+
+ if( iop[i] < calinfo.low_limit_iop ) {
+ err_f[i] = 1;
+ }
+
+ if( ocp[i] > calinfo.low_limit_ocp ) {
+ err_f[i] = 1;
+ }
+
+ //ver1.2.2
+ if( ocp[i] < calinfo.up_limit_ocp && calinfo.up_limit_ocp != 0) {
+ err_f[i] = 1;
+ }
+
+ if( R[i] < calinfo.low_limit_resistor && calinfo.low_limit_resistor != 0 ) {
+ err_f[i] = 1;
+ }
+
+ if( R[i] > calinfo.up_limit_resistor && calinfo.up_limit_resistor != 0 ) {
+ err_f[i] = 1;
+ }
+
+ if( err_f[i] == 1) {
+ led_red[i] = 1;
+ } else {
+ led_green[i] = 1;
+ }
+
+ if ( SEQ_EN == 1 && err_f[i] == 0 ) {
+ /*** ver3
+ seq_hantei[i] = 1;
+ ***/
+ seq_out[i] = 1;
+ }
+
+ //ver1.2.3
+ char *print_text;
+
+ if(DEB_EN == 1) {
+
+ gu_fontsize(1);
+ gu_cursor(0,2);
+ gu_print1(" ");
+
+ if(err_f[i] == 1) {
+
+ switch(i){
+ case 0:
+ print_text="FAIL DUT1";
+ break;
+ case 1:
+ print_text="FAIL DUT2";
+ break;
+ }
+
+ gu_fontsize(1);
+ gu_cursor(0,2);
+ gu_print1(print_text);
+ wait(1);
+ }
+ if(err_f[i] == 0) {
+
+
+ switch(i){
+ case 0:
+ print_text="PASS DUT1";
+ break;
+ case 1:
+ print_text="PASS DUT2";
+ break;
+ }
+
+ gu_fontsize(1);
+ gu_cursor(0,2);
+ gu_print1(print_text);
+
+ wait(1);
+ }
+ }
+ //upto
+
+ }//for
+
+
+}
+
+/*******************************************************************************
+
+ 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;
+ short sdata;
+
+ switch(ch) {
+ case 0:
+ /*** ver3 *****************/
+ 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:
+
+ /*** ver3 *****************/
+ 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:
+
+ /*** ver3 *****************/
+ 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:
+
+ /*** ver3 *****************/
+ 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 );
+}
+
+
+/*******************************************************************************
+
+ measure resistor
+
+ 測定CHを指定して、抵抗測定値Rを返す
+ char ch 0~3 -> 1ch ~ 4ch
+
+ ver3.0.0 リレー制御追加
+
+*******************************************************************************/
+short meas_resistor(char ch)//ch 0~3 -> 1ch ~ 4ch
+{
+ char com;
+ short sdata;
+
+ 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 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);
+ } else {
+ sdata = res_vref;//overload
+ }
+
+ return ( sdata );
+}
+
+
+/*********************************
+
+ display resistor
+ 測定抵抗値を表示する
+
+*********************************/
+void display_resistor(short sdata)//測定値を表示する。
+{
+ if ( sdata < res_vref && sdata >= 0 ) {
+ gu_putdec(&sdata);
+ } else {
+ gu_print1(" OL ");//overload
+ }
+ gu_onebyte(0xEA);//ohm
+}
+
+/**************************************
+ 4バイトを10進数で表示する 0~9999
+**************************************/
+void gu_putdec(short* x)
+{
+
+ char cmd[4];
+
+ //cmd[0] = (( *x / 100000 ) % 10 ) + 0x30;
+ cmd[0] = (( *x / 1000 ) % 10 ) + 0x30;
+ cmd[1] = (( *x / 100 ) % 10 ) + 0x30;
+ cmd[2] = (( *x / 10 ) % 10 ) + 0x30;
+ cmd[3] = ( *x % 10 ) + 0x30;
+
+ i2c.write(addr_gu, cmd, 4);
+
+}
+/*********************************
+
+ LED 照度
+ 設定読込~反映
+ //メモリから設定値を読み出して、LEDのPWMのDutyを設定する
+ //LED1設定値&LED2設定値の計2Byte読込
+
+*********************************/
+void read_syoudo(char* c)
+{
+ //char cmd; //gu-DへのI2Cコマンド用配列 1byte0
+ //char csyoudo[4];//led出力用pwm duty 設定比1バイト255段階
+
+ float duty_pwm; //pwm パーセンテージ
+ int i;
+
+ //メモリ10h番地(照度設定データ)読み出し
+ //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];
+ }
+
+ //set pwm duty
+ for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
+
+ if(c[i] == 0x00) {
+ c[i] = 0x32;
+ }
+
+ duty_pwm = COP * c[i];
+
+ leds[i].write (duty_pwm);//Set Duty
+ }
+}
+/*********************************
+
+ LED 照度調整 (Main)
+
+*********************************/
+void adjust_illumination()
+{
+ char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte0
+ //char *pcmd = cmd_gu;
+ //char msg;
+ //char *pmsg = &msg;
+ char crdata[3];
+ char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F gu-D スイッチNo.
+ char cswdata; // 0x00 or 0x01 ONかOFFか
+ char *pcswnum = &cswnum;
+ char *pcswdata = &cswdata;
+ char csyoudo[4];//led出力用pwm duty 設定比1バイト255段階
+ char ch;
+ float duty_pwm;//pwm パーセンテージ
+ int i;
+ int x[4] = {64,64,192,192}; //レベル値の表示位置 x座標
+ int y[4] = {2,4,2,4}; //レベル値の表示位置 y座標
+ //
+ //EEPROMから照度データ読込とPWMDUTYセット
+ read_syoudo( csyoudo );
+ //
+ //画面表示
+ gu_cls();//画面のクリア
+ gu_fontsize(2);
+ gu_print1("Adjust illumination ");
+ //照度レベルを256段階で表示
+ //LED1
+ gu_cursor(0,16/8);
+ gu_print1("LED1 Lv ");
+ //LED2
+ gu_cursor(0,32/8);
+ gu_print1("LED2 Lv ");
+ //LED3
+ if( number_of_channels >= 3 ) {
+ gu_cursor(128,2);
+ gu_print1("LED3 Lv ");
+ }
+ //LED4
+ if( number_of_channels >= 4 ) {
+ gu_cursor(128,4);
+ gu_print1("LED4 Lv ");
+ }
+ //
+ for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
+
+ gu_cursor(x[i],y[i]);
+
+ cmd_gu[0] = ((csyoudo[i] / 100) & 0xFF) + 0x30;
+ cmd_gu[1] = (csyoudo[i] - (csyoudo[i] / 100) * 100) / 10 + 0x30;
+ cmd_gu[2] = ((csyoudo[i] % 10) & 0xFF) + 0x30;
+ i2c.write(addr_gu, cmd_gu, 3);
+ }
+
+ //
+ gu_fontsize(1);
+ gu_cursor(0,56/8);
+ gu_print1("LED1");
+ gu_cursor(32,56/8);
+ gu_print1("fine");
+ gu_cursor(64,56/8);
+ gu_print1("LED2");
+ gu_cursor(96,56/8);
+ gu_print1("fine");
+
+ if( number_of_channels >= 3) {
+ gu_cursor(128,56/8);
+ gu_print1("LED3");
+ gu_cursor(160,56/8);
+ gu_print1("fine");
+ }
+ if( number_of_channels >= 4) {
+ gu_cursor(192,56/8);
+ gu_print1("LED4");
+ gu_cursor(224,56/8);
+ gu_print1("fine");
+ }
+ //
+ //gu-D タッチスイッチ読み出し動作設定 p49
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+ //
+ //ボタンイメージの表示
+ for ( i = 17; i < 17 + ( number_of_channels * 2 ); i++) {
+ gu_button_up(i);
+ }
+ for ( i = 25; i < 25 + ( number_of_channels * 2 ); i++) {
+ gu_button_down(i);
+ }
+ gu_Button_power_on();//show button
+ wait(0.2);
+
+ while(1) {
+
+ i2c.read ((addr_gu + 0x01), crdata, 3);
+
+ if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。
+ *pcswnum = crdata[1]; //スイッチ番号
+ *pcswdata = crdata[2];//ON/OFF情報
+
+ if (cswdata == 0x01) { //タッチしたならば
+
+ switch ( number_of_channels ) { //ver1.1.0
+
+ case 1:
+ case 2:
+ if ( cswnum >= 20 && cswnum <= 23 )
+ cswnum = 0;
+
+ if ( cswnum >= 28 && cswnum <= 31 )
+ cswnum = 0;
+
+ break;
+
+ case 3:
+ if ( cswnum >= 22 && cswnum <= 23 )
+ cswnum = 0;
+
+ if ( cswnum >= 30 && cswnum <= 31 )
+ cswnum = 0;
+
+ break;
+
+ } //switch
+
+ switch( cswnum ) { //SWの番号(位置)
+
+ case 22:
+ case 20:
+ case 16:
+ case 18:
+
+ ch = ( cswnum - 16 ) / 2; //SWnoから選択したLEDNoの算出
+
+ gu_button_up_on( cswnum + 1 );
+ wait(0.2);
+ gu_button_up( cswnum + 1 );
+ wait(0.1);
+
+ if(csyoudo[ch] <= 0xEF ) {
+ csyoudo[ch] = csyoudo[ch] + 0x0A;
+ }
+
+ break;
+
+ case 23:
+ case 21:
+ case 17:
+ case 19:
+
+ ch = ( cswnum - 17 ) / 2; //SWnoから選択したLEDNoの算出
+
+ gu_button_up_on( cswnum + 1 );
+ wait(0.2);
+ gu_button_up( cswnum + 1 );
+ wait(0.1);
+
+ if(csyoudo[ch] <= 0xFF ) {
+ csyoudo[ch] = csyoudo[ch] + 0x01;
+ }
+
+ break;
+
+ case 24:
+ case 26:
+ case 28:
+ case 30:
+
+ ch = ( cswnum - 24 ) / 2; //SWnoから選択したLEDNoの算出
+
+ gu_button_down_on( cswnum + 1 );
+ wait(0.2);
+ gu_button_down( cswnum + 1 );
+ wait(0.1);
+
+ if(csyoudo[ch] >= 0x0A ) {
+ csyoudo[ch] = csyoudo[ch] - 0x0A;
+ }
+
+ break;
+
+ case 25:
+ case 27:
+ case 29:
+ case 31:
+
+ ch = ( cswnum - 24 ) / 2; //SWnoから選択したLEDNoの算出
+
+ gu_button_down_on( cswnum + 1 );
+ wait(0.2);
+ gu_button_down( cswnum + 1 );
+ wait(0.1);
+
+ if(csyoudo[ch] >= 0x01 ) {
+ csyoudo[ch] = csyoudo[ch] - 0x01;
+ }
+
+ break;
+
+ 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 + 2 ] = csyoudo[i]; //DATA_LED i
+ }
+
+ Soushin = i2c.write (eeprom_adrs, wdata,( number_of_channels + 2 )); // ver3 全送信BYTE数は、書込みデータにBYTE ADDRESSの2byteを加算した数
+
+ if(Soushin == 0) {
+ gu_Button_power_off();//電源ボタンイメージ反転表示
+ wait(0.3);
+
+ return;//照度調整ルーチンを抜ける
+ }
+ } //switch
+
+
+
+ //PWMのDUTY設定
+
+ for( i = 0; i <= ( number_of_channels - 1 ); i++) {
+ duty_pwm = COP * csyoudo[i];
+ leds[i].write (duty_pwm);//Set Duty
+ }
+
+
+ //照度レベルを256段階で表示
+ //LED1
+ gu_fontsize(2);
+
+ for ( i = 0; i <= ( number_of_channels - 1 ); i++) {
+
+ gu_cursor(x[i],y[i]);
+
+ cmd_gu[0] = ((csyoudo[i] / 100) & 0xFF) + 0x30;
+ cmd_gu[1] = (csyoudo[i] - (csyoudo[i] / 100) * 100) / 10 + 0x30;
+ cmd_gu[2] = ((csyoudo[i] % 10) & 0xFF) + 0x30;
+ i2c.write(addr_gu, cmd_gu, 3);
+ }
+ }
+ } //if
+
+ wait(0.1);//gu-D 読込間隔の設定
+
+ }
+}
+
+/*********************************
+
+ サブ基板LED(判定用)全消灯
+
+*********************************/
+void led_off()
+{
+ int i;
+
+ for( i = 0; i <= ( number_of_channels - 1 ); i++) {
+ led_green[ i ] = 0;
+ led_red[ i ] = 0;
+ }
+
+}
+/*********************************
+
+ Utility Main
+ gu_D 輝度調整 タッチ感度調整
+
+*********************************/
+void utility() //輝度調整サブルーチン
+{
+
+ char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte0
+ //char *pcmd = cmd_gu;
+ char clumi; //輝度設定用変数 01h<=n<=08h
+ char* pclumi = &clumi; //ポインタの定義
+ char msg;
+ char *pmsg = &msg;
+ char crdata[3];
+ char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F
+ char cswdata; // 0x00 or 0x01
+ char *pcswnum = &cswnum;
+ char *pcswdata = &cswdata;
+ //
+ //メモリ00h番地(輝度設定データ)読み出し
+ //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];
+
+ //輝度設定更新
+ if(*pclumi==0x00 || *pclumi > 0x08) *pclumi=0x05;
+ gu_luminance(pclumi);
+
+ //画面表示
+ gu_cls();//画面のクリア
+ gu_print1("Set Display Brightness");
+ gu_cursor(0,16/8);
+ gu_print1("LEVEL ");
+ *pmsg = *pclumi + 0x30;
+ gu_print1(pmsg);
+
+ gu_cursor(0,96/8); //ver1.1.0
+ gu_print1("DELETE EEPROM_DATA");
+ gu_set_button_font1(30,"del");
+
+ //SW状態変化時自動送信モード2
+ cmd_gu[0]= 0x1F;
+ cmd_gu[1]= 0x4B;
+ cmd_gu[2]= 0x18;
+ cmd_gu[3]= 0x02;
+ i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49
+
+ //ボタンイメージの表示
+ gu_button_up(6);//show button
+ gu_button_down(14);//show button
+ gu_Button_power_on();//show button
+
+ 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 5 ://SW6
+ gu_button_up_on( 6 );
+ wait(0.2);
+ gu_button_up( 6 );
+ wait(0.1);
+
+ if(clumi < 8 ) *pclumi = *pclumi + 1;
+
+ break;
+
+ case 13 ://SW14
+ gu_button_down_on( 14 );
+ wait(0.2);
+ gu_button_down( 14 );
+ wait(0.1);
+
+ if(clumi >= 1 ) *pclumi = *pclumi - 1;
+
+ break;
+
+ case 29: //SW30
+
+ gu_reverse(0x01); //gu_リバース指定
+ gu_set_button_font1(30,"del");
+ gu_reverse(0x00); //gu_リバース解除
+
+ erace_calinfo();
+
+ gu_set_button_font1(30,"del");
+
+ break;
+
+ case 0x07 ://保存ボタンを押すと現在の輝度をEEPROMへ保存する
+
+ //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();//電源ボタンイメージ反転表示
+ wait(0.5);
+ return;//輝度調整ルーチンを抜ける
+ }
+
+ } //switch
+
+ gu_luminance(pclumi);//輝度変更
+ gu_cursor(0,16/8);
+ gu_print1("LEVEL ");
+ *pmsg = *pclumi + 0x30;
+ gu_print1(pmsg);
+
+ }
+ } //if
+
+ wait(0.1);//gu-D 読込間隔の設定
+
+ }
+}
+
+/*********************************
+ gu_D グラフィックデータ
+*********************************/
+char gu_Button_MODE_data[] = {
+ 0x7F,0xF0,0x80,0x08,0x80,0x0C,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A,
+ 0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x7F,0xF2,0x20,0x02,0x1F,0xFC,0x00,0x00,
+};
+
+void gu_set_button(char sw_num,char* text)
+{
+ char x;
+ char y;
+
+ //SW_NoからSWの座標を求める
+ x = ((sw_num - 1) % 8 ) * 32;
+ y = ((sw_num - 1) / 8 ) * 32;
+
+ gu_drawButton(x,y,32,32, gu_Button_MODE_data );
+
+ // Change Font Size
+ gu_fontsize(2);
+ // set font width
+ gu_fontWidth(Proportional1);
+ gu_print_dot( x + 8,y + 8,text);
+ // Change Font Size
+ gu_fontsize(1);
+ // set font width
+ gu_fontWidth(1);
+}
+
+void gu_set_button_font1(char sw_num,char* text)
+{
+ char x;
+ char y;
+
+ //SW_NoからSWの座標を求める
+ x = ((sw_num - 1) % 8 ) * 32;
+ y = ((sw_num - 1) / 8 ) * 32;
+
+ gu_drawButton(x,y,32,32, gu_Button_MODE_data );
+
+ // Change Font Size
+ gu_fontsize(1);
+ // set font width
+ gu_fontWidth(1);
+ gu_print_dot( x + 2,y + 10,text);
+
+}
+
+char gu_Button_up_data[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08,
+ 0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x18,0x04,
+ 0x20,0x00,0x38,0x04,0x20,0x00,0x78,0x04,0x20,0x00,0xF8,0x04,0x20,0x01,0xF8,0x04,
+ 0x20,0x03,0xF8,0x04,0x20,0x07,0xF8,0x04,0x20,0x0F,0xF8,0x04,0x20,0x1F,0xF8,0x04,
+ 0x20,0x1F,0xF8,0x04,0x20,0x0F,0xF8,0x04,0x20,0x07,0xF8,0x04,0x20,0x03,0xF8,0x04,
+ 0x20,0x01,0xF8,0x04,0x20,0x00,0xF8,0x04,0x20,0x00,0x78,0x04,0x20,0x00,0x38,0x04,
+ 0x20,0x00,0x18,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,
+ 0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_button_up(char sw_num)
+{
+ char x;
+ char y;
+
+ //SW_NoからSWの座標を求める
+ x = ((sw_num - 1) % 8 ) * 32;
+ y = ((sw_num - 1) / 8 ) * 32;
+
+ gu_cursor( x, y/8 );
+ gu_RealTimeImage(32, 32, gu_Button_up_data);
+}
+
+void gu_Button_up1()
+{
+ gu_cursor(224,8);
+ gu_RealTimeImage(32, 32, gu_Button_up_data);
+}
+
+void gu_Button_up2()
+{
+ gu_cursor(192,8);
+ gu_RealTimeImage(32, 32, gu_Button_up_data);
+}
+
+void gu_Button_up3()
+{
+ gu_cursor(160,8);
+ gu_RealTimeImage(32, 32, gu_Button_up_data);
+}
+
+void gu_Button_up4()
+{
+ gu_cursor(128,8);
+ gu_RealTimeImage(32, 32, gu_Button_up_data);
+}
+
+char gu_Button_down_data[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08,
+ 0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x18,0x00,0x04,
+ 0x20,0x1C,0x00,0x04,0x20,0x1E,0x00,0x04,0x20,0x1F,0x00,0x04,0x20,0x1F,0x80,0x04,
+ 0x20,0x1F,0xC0,0x04,0x20,0x1F,0xE0,0x04,0x20,0x1F,0xF0,0x04,0x20,0x1F,0xF8,0x04,
+ 0x20,0x1F,0xF8,0x04,0x20,0x1F,0xF0,0x04,0x20,0x1F,0xE0,0x04,0x20,0x1F,0xC0,0x04,
+ 0x20,0x1F,0x80,0x04,0x20,0x1F,0x00,0x04,0x20,0x1E,0x00,0x04,0x20,0x1C,0x00,0x04,
+ 0x20,0x18,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,
+ 0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_button_down(char sw_num)
+{
+ char x;
+ char y;
+
+ //SW_NoからSWの座標を求める
+ x = ((sw_num - 1) % 8 ) * 32;
+ y = ((sw_num - 1) / 8 ) * 32;
+
+ gu_cursor( x, y/8 );
+ gu_RealTimeImage(32, 32, gu_Button_down_data);
+}
+
+void gu_Button_down1()
+{
+ gu_cursor(224,12);
+ gu_RealTimeImage(32, 32, gu_Button_down_data);
+}
+
+void gu_Button_down2()
+{
+ gu_cursor(192,12);
+ gu_RealTimeImage(32, 32, gu_Button_down_data);
+}
+
+void gu_Button_down3()
+{
+ gu_cursor(160,12);
+ gu_RealTimeImage(32, 32, gu_Button_down_data);
+}
+
+void gu_Button_down4()
+{
+ gu_cursor(128,12);
+ gu_RealTimeImage(32, 32, gu_Button_down_data);
+}
+
+char gu_Button_up_on_data[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,
+ 0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xE7,0xFC,
+ 0x3F,0xFF,0xC7,0xFC,0x3F,0xFF,0x87,0xFC,0x3F,0xFF,0x07,0xFC,0x3F,0xFE,0x07,0xFC,
+ 0x3F,0xFC,0x07,0xFC,0x3F,0xF8,0x07,0xFC,0x3F,0xF0,0x07,0xFC,0x3F,0xE0,0x07,0xFC,
+ 0x3F,0xE0,0x07,0xFC,0x3F,0xF0,0x07,0xFC,0x3F,0xF8,0x07,0xFC,0x3F,0xFC,0x07,0xFC,
+ 0x3F,0xFE,0x07,0xFC,0x3F,0xFF,0x07,0xFC,0x3F,0xFF,0x87,0xFC,0x3F,0xFF,0xC7,0xFC,
+ 0x3F,0xFF,0xE7,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,
+ 0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_button_up_on( char sw_num )
+{
+ char x;
+ char y;
+
+ //SW_NoからSWの座標を求める
+ x = ((sw_num - 1) % 8 ) * 32;
+ y = ((sw_num - 1) / 8 ) * 32;
+
+ gu_cursor( x, y/8 );
+
+ gu_RealTimeImage(32, 32, gu_Button_up_on_data);
+}
+
+void gu_Button_up_on2()
+{
+ gu_cursor(192,8);
+ gu_RealTimeImage(32, 32, gu_Button_up_on_data);
+}
+
+char gu_Button_down_on_data[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,
+ 0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xE7,0xFF,0xFC,
+ 0x3F,0xE3,0xFF,0xFC,0x3F,0xE1,0xFF,0xFC,0x3F,0xE0,0xFF,0xFC,0x3F,0xE0,0x7F,0xFC,
+ 0x3F,0xE0,0x3F,0xFC,0x3F,0xE0,0x1F,0xFC,0x3F,0xE0,0x0F,0xFC,0x3F,0xE0,0x07,0xFC,
+ 0x3F,0xE0,0x07,0xFC,0x3F,0xE0,0x0F,0xFC,0x3F,0xE0,0x1F,0xFC,0x3F,0xE0,0x3F,0xFC,
+ 0x3F,0xE0,0x7F,0xFC,0x3F,0xE0,0xFF,0xFC,0x3F,0xE1,0xFF,0xFC,0x3F,0xE3,0xFF,0xFC,
+ 0x3F,0xE7,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,
+ 0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_button_down_on(char sw_num)
+{
+ char x;
+ char y;
+
+ //SW_NoからSWの座標を求める
+ x = ((sw_num - 1) % 8 ) * 32;
+ y = ((sw_num - 1) / 8 ) * 32;
+
+ gu_cursor( x, y/8 );
+
+ gu_RealTimeImage(32, 32, gu_Button_down_on_data);
+}
+
+void gu_Button_down_on2()
+{
+ gu_cursor(192,12);
+ gu_RealTimeImage(32, 32, gu_Button_down_on_data);
+}
+
+char gu_Button_power_on_data[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08,
+ 0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x03,0xF0,0x04,
+ 0x20,0x0F,0xFC,0x04,0x20,0x1F,0xFE,0x04,0x20,0x3C,0x0F,0x04,0x20,0x38,0x07,0x84,
+ 0x20,0x00,0x03,0x84,0x20,0x00,0x03,0xC4,0x20,0x00,0x01,0xC4,0x21,0xFF,0x01,0xC4,
+ 0x21,0xFF,0x01,0xC4,0x20,0x00,0x01,0xC4,0x20,0x00,0x03,0xC4,0x20,0x00,0x03,0x84,
+ 0x20,0x38,0x07,0x84,0x20,0x3C,0x0F,0x04,0x20,0x1F,0xFE,0x04,0x20,0x0F,0xFC,0x04,
+ 0x20,0x03,0xF0,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,
+ 0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_Button_power_on()
+{
+ gu_cursor(224,0);
+ gu_RealTimeImage(32, 32, gu_Button_power_on_data);
+}
+
+
+char gu_Button_power_off_data[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8,
+ 0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFC,0x0F,0xFC,
+ 0x3F,0xF0,0x03,0xFC,0x3F,0xE0,0x01,0xFC,0x3F,0xC3,0xF0,0xFC,0x3F,0xC7,0xF8,0x7C,
+ 0x3F,0xFF,0xFC,0x7C,0x3F,0xFF,0xFC,0x3C,0x3F,0xFF,0xFE,0x3C,0x3C,0x00,0x7E,0x3C,
+ 0x3C,0x00,0x7E,0x3C,0x3F,0xFF,0xFE,0x3C,0x3F,0xFF,0xFC,0x3C,0x3F,0xFF,0xFC,0x7C,
+ 0x3F,0xC7,0xF8,0x7C,0x3F,0xC1,0xE0,0xFC,0x3F,0xE0,0x01,0xFC,0x3F,0xF0,0x03,0xFC,
+ 0x3F,0xFC,0x0F,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,
+ 0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+};
+
+void gu_Button_power_off()
+{
+ gu_cursor(224,0);
+ gu_RealTimeImage(32, 32, gu_Button_power_off_data);
+}
+
+/*********************************
+ ノリタケ関数
+ ここから
+**********************************/
+//
+// Clear screen//
+void gu_cls()
+{
+
+ i2c.start();
+ i2c.write(addr_gu);
+ i2c.write(0x0c);
+ i2c.stop();
+
+}
+
+void gu_drawButton(int x, int y, int w, int h, const char data[])
+{
+ h = h >> 3; // get height in byte
+ y = y >> 3; // get Y location in byte
+
+ gu_cursor(x,y);
+ // Realtime Image draw header
+
+ i2c.start();
+ i2c.write(addr_gu);
+ gu_sendOneByte(0x1f);
+ gu_sendOneByte(0x28);
+ gu_sendOneByte(0x66);
+ gu_sendOneByte(0x11);
+ gu_sendOneByte( w & 0xff);
+ gu_sendOneByte( w >> 8);
+ gu_sendOneByte( h & 0xff);
+ gu_sendOneByte( h >> 8);
+ gu_sendOneByte(0x01);
+
+ for(int i = 0; i<w; i++) {
+ if(i<8) { // 8 dots from left
+ gu_sendOneByte(data[i*2]);
+ if(h>2) {
+ for(int j=0; j<(h-2); j++) {
+ if((data[i*2]&0x01)==0) {
+ gu_sendOneByte(0x00);
+ } else {
+ gu_sendOneByte(0xff);
+ }
+ }
+ }
+ gu_sendOneByte(data[i*2+1]);
+ } else if (i > (w-8)) { // 8 dots from right
+
+ gu_sendOneByte(data[(16+i-w)*2]);
+ if(h>2) for(int j=0; j<(h-2); j++) {
+ if((data[(16+i-w)*2]&0x01)==0) {
+ gu_sendOneByte(0x00);
+ } else {
+ gu_sendOneByte(0xff);
+ }
+ }
+ gu_sendOneByte(data[(16+i-w)*2+1]);
+
+ } else { // in the middle
+ gu_sendOneByte(data[14]);
+ if(h>2) {
+ for(int j=0; j<(h-2); j++) {
+ if((data[14]&0x01)==0) {
+ gu_sendOneByte(0x00);
+ } else {
+ gu_sendOneByte(0xff);
+ }
+ }
+ }
+ gu_sendOneByte(data[15]);
+ }
+ }
+
+ i2c.stop();
+
+}
+
+
+// ドット単位キャラクタ表示 p37
+void gu_print_dot(int x, int y, const char* ptext)
+{
+
+ i2c.start();
+ i2c.write(addr_gu);
+ gu_sendOneByte(0x1f);
+ gu_sendOneByte(0x28);
+ gu_sendOneByte(0x64);
+ gu_sendOneByte(0x30);
+ gu_sendOneByte(x & 0xff);
+ gu_sendOneByte(x >> 8);
+ gu_sendOneByte(y & 0xff);
+ gu_sendOneByte(y >> 8);
+ gu_sendOneByte(0x00);
+
+ int i=0;
+ int j=0;
+ while(*(ptext+i)) {
+ if (*(ptext + i++) =='%') {
+ j+=2; //文字列終端”0%"までインクリメント
+ }
+ }
+
+ gu_sendOneByte(i-j); //キャラクタデータ長
+ gu_print(ptext); //キャラクタデータ
+
+ i2c.stop();
+
+}
+
+//
+// Print test//
+void gu_print(const char t[] )
+{
+ i2c.start();
+ i2c.write(addr_gu);
+
+ int i=0;
+ int j=0;
+ int k=0;
+ while(t[i]) {
+ if(t[i] != 37) {
+ gu_sendOneByte(t[i++]);
+ } else {
+ i++;
+ j=t[i++]-0x30;
+ if(j>9) {
+ j -= 7;
+ }
+ if(j>0x10) {
+ j -= 0x20;
+ }
+ k=t[i++]-0x30;
+ if(k>9) {
+ k -= 7;
+ }
+ if(k>0x10) {
+ k -= 0x20;
+ }
+ gu_sendOneByte(j*16+k);
+ }
+ }
+ i2c.stop();
+}
+
+void gu_RealTimeImage(int w, int h, char data[])
+{
+ h = h >> 3; // get height in byte
+
+ i2c.start();
+ gu_sendOneByte(addr_gu);
+ gu_sendOneByte(0x1f);
+ gu_sendOneByte(0x28);
+ gu_sendOneByte(0x66);
+ gu_sendOneByte(0x11);
+ gu_sendOneByte( w & 0xff);
+ gu_sendOneByte( w >> 8);
+ gu_sendOneByte( h & 0xff);
+ gu_sendOneByte( h >> 8);
+ gu_sendOneByte(0x01);
+ for( int i=0; i < ( w * h ); i++) {
+ gu_sendOneByte( data[i]);
+ }
+ i2c.stop();
+}
+
+// Draw RealTimeBitImage by dot
+void gu_RealTimeImage_dot(int x, int y, int w, int h, const char data[])
+{
+ i2c.start();
+ gu_sendOneByte(addr_gu);
+ gu_sendOneByte(0x1f);
+ gu_sendOneByte(0x28);
+ gu_sendOneByte(0x64);
+ gu_sendOneByte(0x21);
+ gu_sendOneByte(x & 0xff);
+ gu_sendOneByte(x >> 8);
+ gu_sendOneByte(y & 0xff);
+ gu_sendOneByte(y >> 8);
+ gu_sendOneByte(w & 0xff);
+ gu_sendOneByte(w >> 8);
+ gu_sendOneByte(h & 0xff);
+ gu_sendOneByte(h >> 8);
+ gu_sendOneByte(0x01);
+ for(int i=0; i<( w * ((h + 7)>>3)); i++ ) {
+ gu_sendOneByte(data[i]);
+ }
+ i2c.stop();
+}
+
+
+// Set Font width
+void gu_fontWidth(const char fontWidth)
+{
+ /*
+ gu_sendOneByte(0x1f);
+ gu_sendOneByte(0x28);
+ gu_sendOneByte(0x67);
+ gu_sendOneByte(0x03);
+ gu_sendOneByte(fontWidth);
+ */
+
+ char accom_gu[5] ; //gu-DへのI2Cコマンド用配列
+
+ accom_gu[0] = 0x1F;
+ accom_gu[1] = 0x28;
+ accom_gu[2] = 0x67;
+ accom_gu[3] = 0x03;
+ accom_gu[4] = fontWidth;
+
+ i2c.write(addr_gu, accom_gu, 5);
+
+}
+
+//
+// Move Cursor
+// 動作確認完了 2017/6/26
+void gu_cursor(int x, int y)
+{
+
+ /*
+ gu_sendOneByte(0x1f);
+ gu_sendOneByte(0x24);
+ gu_sendOneByte(x%256);
+ gu_sendOneByte(x>>8);
+ gu_sendOneByte(y%256);
+ gu_sendOneByte(y>>8);
+ */
+
+ char accom_gu[6] ; //gu-DへのI2Cコマンド用配列
+
+ accom_gu[0] = 0x1f;
+ accom_gu[1] = 0x24;
+ accom_gu[2] = x & 0xFF;
+ accom_gu[3] = x >> 8;
+ accom_gu[4] = y & 0xFF;
+ accom_gu[5] = y >> 8;
+
+ i2c.write(addr_gu, accom_gu, 6);
+
+}
+
+// Font Body Size
+// 動作確認2017/6/26
+void gu_fontsize(const char code)
+{
+ /*
+ gu_sendOneByte(0x1f);
+ gu_sendOneByte(0x28);
+ gu_sendOneByte(0x67);
+ gu_sendOneByte(0x01);
+ gu_sendOneByte(code);
+ */
+ char accom_gu[5] ; //gu-DへのI2Cコマンド用配列
+
+ accom_gu[0] = 0x1F;
+ accom_gu[1] = 0x28;
+ accom_gu[2] = 0x67;
+ accom_gu[3] = 0x01;
+ accom_gu[4] = code;
+
+ i2c.write(addr_gu, accom_gu, 5);
+
+}
+
+
+//
+// Reverse video font
+void gu_fontReverse(int code)
+{
+
+ i2c.start();
+ gu_sendOneByte(addr_gu);
+ gu_sendOneByte(0x1f);
+ gu_sendOneByte(0x72);
+ gu_sendOneByte(code);
+ i2c.stop();
+
+}
+
+void gu_touchPara(int x,int y)
+{
+ i2c.start();
+ i2c.write(addr_gu);
+ i2c.write(0x1F);
+ i2c.write(0x4B);
+ i2c.write(0x70);
+ i2c.write(x & 0xFF);
+ i2c.write(y & 0xFF);
+ i2c.stop();
+}
+
+// Magnify Font キャラクタ拡大表示
+void gu_magnify(int x, int y)
+{
+ gu_sendOneByte(0x1f);
+ gu_sendOneByte(0x28);
+ gu_sendOneByte(0x67);
+ gu_sendOneByte(0x40);
+ gu_sendOneByte(x);
+ gu_sendOneByte(y);
+}
+
+/*********************************
+ ノリタケ関数
+ ここまで
+**********************************/
+//
+//Show text
+void gu_print1(const char* ptext)
+{
+ i2c.write(addr_gu, ptext, strlen(ptext));
+}
+//
+//輝度調整
+void gu_luminance(const char* cl)
+{
+ i2c.start();
+ i2c.write(addr_gu);
+ i2c.write(0x1F);
+ i2c.write(0x58);
+ i2c.write(*cl & 0xFF);
+ i2c.stop();
+}
+//
+//gu_Dクラス用 1バイト送信
+void gu_sendOneByte(char data) //arduino->mbed
+{
+ i2c.write(data);
+ //while(digitalRead(gu_MBUSY)==HIGH){} // wait for ready.
+ //Serial.write(data); // send a byte.
+}
+//
+//CF+RF
+void gu_CRLF()
+{
+ char com[2];
+
+ com[0] = 0x0A; //LF
+ com[1] = 0x0D; //CR
+ i2c.write(addr_gu, com, 2); //LF+CR
+}
+//
+//リバース指定or解除
+void gu_reverse(char x) //リバース指定or解除
+{
+ char com[3];
+
+ com[0] = 0x1F;
+ com[1] = 0x72;
+ com[2] = x & 0xFF; //0x01:指定 0x00:解除
+ i2c.write(addr_gu, com, 3);
+}
+//1byte送信用
+void gu_onebyte(char data)
+{
+ i2c.write(addr_gu, &data, 1);
+}
+/*****************************************
+
+ SD CARD
+
+*****************************************/
+void sd_writetext(const char* ptext)
+{
+
+ mkdir("/sd/mydir", 0777);
+
+ FILE *fp = fopen("/sd/mydir/iop.txt", "w");//ディレクトリとファイル名の指定
+
+ if(fp == NULL) {
+
+ gu_fontsize(1);
+ gu_cursor(0,2);
+ /* ver1.1.3*/
+ gu_print1("No SD card");
+ //gu_print1("Could not open file for SD card");
+ //error("Could not open file for write\n");
+
+ }
+
+ fprintf(fp, ptext);
+ fclose(fp);
+
+}
+
+
+
+/****************************************
+
+ シーケンサ通信
+
+****************************************/
+
+void seq_serialcomunication(int noc)
+{
+ char STX = 2;
+ char EXT = 3;
+ int i;
+
+ for(i = 0; i <= ( noc - 1); i++;){
+/*
+ uart.printf("%c" , STX);
+ uart.printf("%s" , calinfo.name[i]);
+ uart.printf("%c" , ",");
+
+ //アンテナ抵抗値
+ if(R[i] < res_vref && R[0] >= 0){
+ uart.printf("%d" , R[i]);
+ }
+ else{
+ uart.printf("%c" , "OL");
+ }
+
+ uart.printf("%c" , ",");
+ uart.printf("%f" , seq_fdata[i],[0]); //Iop
+ uart.printf("%c" , ",");
+ uart.printf("%f" , seq_fdata[i],[1]); //Idd
+ uart.printf("%c" , ",");
+ uart.printf("%f" , seq_fdata[i],[2]); //Voc
+ uart.printf("%c" , ",");
+ uart.printf("%d" , vocp[i]);
+ uart.printf("&c" , ",");
+ uart.printf("%c" , err_f); //void hanteiのエラーフラグを流用
+ uart.printf("&c" , ",");
+ uart.printf("&d" , cat);
+ uart.printf("&c" , ",");
+
+ uart.printf("%c" , EXT);
+ */
+//PCデバック用
+ pc.printf("%c" , STX);
+ pc.printf("%d" , CH[i]);
+ pc.printf("%c" , ',');
+ pc.printf("%s\n" , calinfo.name);
+ pc.printf("%c" , ',');
+
+ //アンテナ抵抗値
+ if(R[i] < res_vref && R[0] >= 0){
+ pc.printf("%d" , R[i]);
+ }
+ else{
+ pc.printf("%s" , "OL");
+ }
+
+ pc.printf("%c" , ',');
+ pc.printf("%f" , seq_fdata[i][0]); //Iop
+ pc.printf("%c" , ',');
+ pc.printf("%f" , seq_fdata[i][1]); //Idd
+ pc.printf("%c" , ',');
+ pc.printf("%f" , seq_fdata[i][2]); //Voc
+ pc.printf("%c" , ',');
+ pc.printf("%f" , vocp[i]);
+ pc.printf("%c" , ',');
+
+ if(err_f == 0){ //void hanteiのエラーフラグを流用
+ pc.printf("%s" , "PASS");
+ }
+ else{
+ pc.printf("%s" , "FAIL");
+ }
+
+ pc.printf("%c" , ',');
+ pc.printf("%d" , cat);
+ pc.printf("%c\n" , EXT);
+ }//for
+
+}
\ No newline at end of file