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: ILF.cpp
- Revision:
- 0:1977c2310ef7
- Child:
- 1:f6a9410c46d2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ILF.cpp Tue Jan 18 07:54:54 2022 +0000 @@ -0,0 +1,4641 @@ +#include "mbed.h" +#include "SDFileSystem.h" +//#include "MODSERIAL.h" + +//difine_mbed_LPC1768 + +/******************************************************************************* + +2018.8.31 +ILF Iop汎用器 + +仕様 +電圧/抵抗測定:12bit +電流測定:14bit + +割込みはP0~P2で可能 +シーケンサスタート信号は、回路図「seq_yobi]で対応 + +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系と切替え +未)測定部ごとにクラス分け(過充電防止のところだけでも) + +*******************************************************************************/ +// +//各種定数 +#define DEB_EN 1 //デバッグイネーブル +#define RL_EN 1 //1:io[]を外付けのリードリレー制御用に使用する場合は1.以外は0. ver1.2.3 +#define SEQ_EN 0 //1:シーケンサ接続仕様 0:シーケンサ未接続仕様 +#define period_pwm 200 //*us +#define COP 0.005 //pwm_duty(%) = COP * DATA(0~255) +#define rsense 1000 //抵抗測定回路のプルアップ抵抗値 1kΩ +#define res_vref 0x800 //抵抗測定回路のリファレンス電圧 2.048V +#define dac_vref 2500 //DACのリファレンス電圧 単位[mV] +#define number_of_channels 2 //測定チャンネル数(MAX 4) +#define time_discharge 0.5 //discharging time(s) +#define time_integral 2 //integral time(s) +#define touch 5 //GU-D タッチパネル感度 0~7で設定。低いほど敏感。 +#define wait_voc 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] + +/*************************************** +RESOLUTION SETTINGS VS. LSB + ----------------------------------- +|Resolution Setting | LSB | + ----------------------------------- +| 12bits(00) | 1mv | +| 14bits(01) | 250uV | +| 16bits(10) | 62.5uV | +| 18bits(11) | 15.625uV | + ----------------------------------- +****************************************/ +//ver1.2.0 +const int version_major = 1; //ソフトバージョン +const int version_minor = 2; //ソフトバージョン +const int version_build = 3; //ソフトバージョン + +// +//繰り返しタイマー割り込み +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); +// +//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( 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 led1_green(P0_17); +DigitalOut led2_green(P1_31); +DigitalOut led1_red(P0_18); +DigitalOut led2_red(P1_30); +*/ + +DigitalOut led_green[] = { + DigitalOut( P0_17 ), + DigitalOut( P1_31 ), + DigitalOut( P2_11 ), + DigitalOut( P1_18 ) +}; + +DigitalOut led_red[] = { + DigitalOut( P0_18 ), + DigitalOut( P1_30 ), + DigitalOut( P2_12 ), + DigitalOut( P1_19 ) +}; +//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 +}; + +// +//I2C +I2C i2c(P0_10,P0_11); //(PinName sda, PinName scl) I2Cを定義 +// +/******************: + 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(); + +/*************************** +LCP1768(EEPROM) addr:15H +***************************/ +//parameter_PCAS08A(EEPROM) +//const int addr_EEPROM = 0x15 << 3; // Address of PCAS08A(EEPROM) コメント化 ver1.2.1 +char rdata[17]; //EEPROMからのリードデータ +char wdata[17]; //EEPROMへのライトデータ +int Jyushin; //受信成功時 Jyushin=0 +int Soushin; //送信成功時 Soushin=0 +const int fixed_adrs = 0x15 << 3; // Address of PCAS08A(EEPROM) 始めの5bit ver1.2.1 +int adrs_eeprom; //slave address ver1.2.1 +/*************************** +MCP3424(ADC) +***************************/ +//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 select_cal();//CAL選択画面 +void setup_cal_information(char cal_num);//CAL情報登録画面 +void manual_int_hyouji(); +void auto_int_hyouji(); +/*************************** +測定関係 +関数 +***************************/ +void set_pullup();//シーケンサからの入力ピンのプルアップ設定 +void trigger();//シーケンサからのスタート信号割込みサブ +void calibration(); +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進数 +short vocp[4];//過充電防止確認用電圧 +float iop[4];//2byte 補数あり 測定値 1bit 0.01uA +float ocp[4];//2byte 補数あり 測定値 +char ch_num ;//選択中の測定チャネル(0~3) + +/********************** +暫定 +**********************/ +/* +#define vss_voc 3600 +#define vss_iop 2800 +#define vss_ocp 3600 +#define wait_vss 4 +#define wait_io 2 +#define low_limit_voc 0xCE4//[mv] HEX +#define low_limit_iop 0x44C//11uA換算:1100*0.01 +#define low_limit_ocp 0xFFE2//-0.3uA換算 +*/ +/****************************** + + CAL情報登録 -> EEPROM + +*******************************/ +#define caliber_number 6 /* CAL登録数 */ +#define addr_calnum 0x20 /* 起動時に選択するCALnumber */ +#define addr_cal1 0x80 /* CAL.No1の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1 */ +#define addr_cal2 0x90 /* CAL.No2の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/ +#define addr_cal3 0xA0 /* CAL.No3の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/ +#define addr_cal4 0xB0 /* CAL.No4の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/ +#define addr_cal5 0xC0 /* CAL.No5の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/ +#define addr_cal6 0xD0 /* CAL.No6の情報を保存しているEEPROMのアドレス PCA24S08A BLOCK1*/ +//ver1.2.1 +//EEPROM BLOCK2へのアドレッシングは、別で初期8bitも制御する必要がある。 +#define addr_cal1_2 0x00 /* CAL.No1の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/ +#define addr_cal2_2 0x10 /* CAL.No2の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/ +#define addr_cal3_2 0x20 /* CAL.No3の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/ +#define addr_cal4_2 0x30 /* CAL.No4の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/ +#define addr_cal5_2 0x40 /* CAL.No5の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/ +#define addr_cal6_2 0x50 /* CAL.No6の情報を保存しているEEPROMのアドレス 追加分 PCA24S08A BLOCK2*/ +//up to here + +//structure +struct cal_info { + short number; /* CAL.No. */ + short vss_iop; /* IOP測定時のVss電圧 1bit * 0.01uA*/ + short vss_ocp; /* 過充電防止(over charge protection)測定時のVss電圧 */ + short vss_voc; /* VOC測定時のVss電圧 */ + short low_limit_voc; //1bit * 1mv + short low_limit_iop; //1bit * 0.01uA + short low_limit_ocp; //過充電防止検査の上限規格値(プラス側) + short up_limit_ocp; //過充電防止検査の上限規格値(マイナス側)ver1.2.1追加 + float wait_iop; /* [s]Iop測定前の待機時間 1bit 1s 換算*/ + float wait_ocp; /* [s]過充電防止時消電測定前の待機時間 1bit 1s換算*/ + short low_limit_resistor; /* アンテナ抵抗規格 1bit 10Ω*/ + short up_limit_resistor; /* アンテナ抵抗規格 1bit 10Ω*/ +} ; +//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); + +/******************************* + + set mode interruptin/degitalin + +*******************************/ +void set_pullup() +{ + sw_start.mode(PullUp); + seq_start.mode(PullUp);//シーケンサからのスタート信号 + seq_cal_a.mode(PullUp); + seq_cal_b.mode(PullUp); + seq_cal_c.mode(PullUp); + seq_kosuu_a.mode(PullUp); + seq_kosuu_b.mode(PullUp); +} +/******************************* + + Sequence Mode main screen + +*******************************/ +void seq() +{ + gu_cls();//clear screen + gu_fontsize(2); + gu_print1("Sequenser Mode"); + + //seq_start.fall(&trigger);//スタート信号立下りで割込み + + //シーケンサのトリガ以外は受け付けない + while(1) { + + if( seq_start == 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入力の負論理 + + //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); + + } + + meas_num = ( ~(( seq_kosuu_b << 1 ) + seq_kosuu_a )) & 0x3; //2bit負論理 + + gu_cursor(128,1); + gu_print1("n="); + gu_onebyte( meas_num + 0x30 );//測定個数確認用 + + seq_busy = 1;//DegitalOut busy + + auto_meas( meas_num ); + + //判定結果をシーケンサへ出力 + hantei( meas_num ); + + wait(0.1); + + //測定終了 + seq_busy = 0;//DegitalOut busy + + //終了表示 + gu_fontsize(1); + gu_cursor(0,3); + gu_print1("ready "); + +} + +/******************************* + + EEPROMへCAL情報(struct)を保存 + +*******************************/ +void write_caliber_information(cal_info *cal, int num) +{ + char cdata[17];//1byte + + //EEPROM書込み 先頭アドレス + cdata[0] = addr_cal1 + 0x10 * ( num - 1 ); + + //データ分割 EEPROM_BYTE 0x00~0x0Bまで + cdata[1] = calinfo.vss_iop & 0xFF;//1byte分割 + cdata[2] = ( calinfo.vss_iop >> 8 ) & 0xFF;//1byte分割 + + cdata[3] = calinfo.vss_ocp & 0xFF;//1byte分割 + cdata[4] = ( calinfo.vss_ocp >> 8 ) & 0xFF;//1byte分割 + + cdata[5] = calinfo.vss_voc & 0xFF;//1byte分割 + cdata[6] = ( calinfo.vss_voc >> 8 ) & 0xFF;//1byte分割 + + cdata[7] = calinfo.low_limit_voc & 0xFF;//1byte分割 + cdata[8] = ( calinfo.low_limit_voc >> 8 ) & 0xFF;//1byte分割 + + cdata[9] = calinfo.low_limit_iop & 0xFF;//1byte分割 + cdata[10] = ( calinfo.low_limit_iop >> 8 ) & 0xFF;//1byte分割 + + cdata[11] = calinfo.low_limit_ocp & 0xFF;//1byte分割 + cdata[12] = ( calinfo.low_limit_ocp >> 8 ) & 0xFF;//1byte分割 + + //ver1.1.0 + cdata[13] = calinfo.wait_iop; //1bitあたり 1s + cdata[14] = calinfo.wait_ocp; //1bitあたり 1s + /*ver1.1.0 + cdata[13] = calinfo.wait_iop * 10; //1bitあたり0.1s + cdata[14] = calinfo.wait_ocp * 10; //1bitあたり0.1s + */ + + cdata[15] = calinfo.low_limit_resistor / 10; //1bitあたり10ohm + cdata[16] = calinfo.up_limit_resistor / 10; //1bitあたり10ohm + + Soushin = i2c.write (fixed_adrs, cdata, 17); + + //ver1.2.1 + wait(0.1); + + char cdata_2[3]; + + adrs_eeprom = fixed_adrs + 0x2; //BLOCK2の選択 + + cdata_2[0] = addr_cal1_2 + 0x10 * ( num - 1 ); //PAGE選択 + cdata_2[1] = calinfo.up_limit_ocp & 0xFF;//1byte分割 + cdata_2[2] = ( calinfo.up_limit_ocp >> 8 ) & 0xFF;//1byte分割 + + Soushin = i2c.write (adrs_eeprom, cdata_2, 3); + //up to here + +} +/******************************* + + EEPROMからCAL情報を + 読み出して構造体へ代入する + +*******************************/ +void read_caliber(cal_info *cal, int num) +{ + signed short sdata[16]; //CAL設定条件 + int i; + + //EEPROMからnumで指定したナンバーのCAL情報を読み出し + wdata[0] = addr_cal1 + 0x10 * ( num - 1 ); + Soushin = i2c.write (fixed_adrs, wdata, 1,true); //読込先頭アドレス指定 ReStart + Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 16);//read 1byte + + //データ合成 EEPROM_BYTE 0x00~0x0Bまで2byte結合 + for ( i = 0; i <= 5; i++ ) { + sdata[i] = rdata[i*2] | ( rdata[ i*2 + 1 ] << 8 ); + } + sdata[6] = rdata[12]; + sdata[7] = rdata[13]; + sdata[8] = rdata[14]; + sdata[9] = rdata[15]; + + cal -> number = num; + cal -> vss_iop = sdata[0]; + cal -> vss_ocp = sdata[1]; + cal -> vss_voc = sdata[2]; + cal -> low_limit_voc = sdata[3]; + cal -> low_limit_iop = sdata[4]; + cal -> low_limit_ocp = sdata[5]; + //ver1.1.0 + cal -> wait_iop = sdata[6]; + cal -> wait_ocp = sdata[7]; + /* + cal -> wait_iop = sdata[6] / 10; + cal -> wait_ocp = sdata[7] / 10; + */ + cal -> low_limit_resistor = sdata[8] * 10; + cal -> up_limit_resistor = sdata[9] * 10; + + //ver1.2.3 + //EEPROMからnumで指定したナンバーのCAL情報を読み出し + char rdata2[2]; + + adrs_eeprom = fixed_adrs + 0x02; //BLOCK2 + + wdata[0] = addr_cal1_2 + 0x10 * ( num - 1 ); + Soushin = i2c.write (adrs_eeprom, wdata, 1,true); //読込先頭アドレス指定 ReStart + Jyushin = i2c.read ((adrs_eeprom + 0x01), rdata2, 2);//read 1byte + + //BYTE0~1 + i = 0; + sdata[10] = rdata2[i*2] | ( rdata2[ i*2 + 1 ] << 8 ); + + cal -> up_limit_ocp = sdata[10]; + //ver1.2.1 up to here + +} +/******************************* + + EEPROMからCAL登録番号を読出し + +*******************************/ +void read_regnum() +{ + wdata[0] = addr_calnum; + Soushin = i2c.write (fixed_adrs, wdata, 1,true); //読込先頭アドレス指定 ReStart + Jyushin = i2c.read ((fixed_adrs + 0x01), rdata, 1);//read 1byte + + reg_num = rdata[0]; +} +/******************************* + + EEPROMからCAL登録情報全消去 + +*******************************/ +void erace_calinfo() +{ + int i; + + reg_num = 0x01; + wdata[0] = addr_calnum; //word address 書込み先頭アドレス指定 + wdata[1] = reg_num; + Soushin = i2c.write (fixed_adrs, wdata, 2); + + wait(0.2); + + wdata[0] = addr_cal1; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (fixed_adrs, wdata, 17); + + wait(0.2); + + wdata[0] = addr_cal2; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (fixed_adrs, wdata, 17); + + wait(0.2); + + wdata[0] = addr_cal3; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (fixed_adrs, wdata, 17); + + wait(0.2); + + wdata[0] = addr_cal4; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (fixed_adrs, wdata, 17); + + wait(0.2); + + wdata[0] = addr_cal5; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (fixed_adrs, wdata, 17); + + wait(0.2); + + wdata[0] = addr_cal6; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (fixed_adrs, wdata, 17); + + //ver1.2.1 + //BLOCK2の消去 + wait(0.2); + + adrs_eeprom = fixed_adrs + 0x02; //BLOCK2 + + wdata[0] = addr_cal1_2; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (adrs_eeprom, wdata, 17); + + wait(0.2); + + wdata[0] = addr_cal2_2; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (adrs_eeprom, wdata, 17); + + wait(0.2); + + wdata[0] = addr_cal3_2; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (adrs_eeprom, wdata, 17); + + wait(0.2); + + wdata[0] = addr_cal4_2; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (adrs_eeprom, wdata, 17); + + wait(0.2); + + wdata[0] = addr_cal5_2; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (adrs_eeprom, wdata, 17); + + wait(0.2); + + wdata[0] = addr_cal6_2; + for( i = 1; i <= 16; i++) { //1page全消去 + wdata[i] = 0x00; + } + Soushin = i2c.write (adrs_eeprom, wdata, 17); + + wait(0.2); + + //up to herever1.2.1 + +} +/****************************************** + + ADC(MCP3424) Configuration Register + + 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読込み + +******************************************/ +short read_adc(char addr)//指定addressから2byte読込み +{ + char cdata[2];//1byte + short sdata;//2byte + + 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 + + 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; + + //apply Vss to all channel + for ( i = 0; i <= (number_of_channels - 1); i++) { + dac_out( calinfo.vss_iop,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: + //gu_reverse(0x01); //gu_リバース指定 + //gu_button_up(27);//印加電圧増加 + + if ( vss < 4500 ) { + vss = vss + 100; + } + + //apply Vss to all channel + for ( i = 0; i <= (number_of_channels - 1); i++) { + dac_out( vss,i); //Vss設定 DAC + } + + 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: + //gu_reverse(0x01); //gu_リバース指定 + //gu_button_down(28);//印加電圧減少 + + if ( vss >= 100 ) { + vss = vss - 100; + } + + //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 + } + + wait(0.2); + + for ( i = 0; i <= 7; i++) + io[i] = 0; //全てのio"L" + + return;//この関数を抜ける + + case 0x18 ://sw25 mv_reset + + //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[ch_num] = 1; + + //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 + + //選択測定チャンネルの表示 + gu_cursor(24, 2); + wdata[0] = ( ch_num + 1 ) + 0x30; + i2c.write( addr_gu, wdata, 1); + + //gu_button_up(32); + + wait(0.1); + + break; + + /* + case 0x1F ://sw32 CH選択 + + //gu_reverse(0x01);//gu_リバース指定 + //gu_button_down(32); + //gu_reverse(0x00);//gu_リバース解除 + + if ( ch_num >= 1 ) + ch_num = ch_num - 1; + + select_ich(ch_num);//ADC測定CHの変更 + + //set measuring range + for( i = 0; i <= 3; i++) + range[i] = 0; + + range[ ch_num ] = 1; //range 10uA + + //選択測定チャンネルの表示 + gu_cursor(24, 2); + wdata[0] =( ch_num + 1 ) + 0x30; + i2c.write( addr_gu, wdata, 1); + + //gu_button_down(32); + + wait(0.1); + + break; + */ + + } //switch + Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true); + + }//if + }//if + + //ver1.1.0 + if ( j >= 5 ) { + io[ch_num] = 0; + 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); + } + + //電圧測定 + //ver1.2.0 + if (RL_EN == 1) { + switch (ch_num) { + case 0: + io[4] = 1; //外付けリレーON + wait(TIME_RELAY_ON); + break; + case 1: + io[5] = 1; //外付けリレーON + wait(TIME_RELAY_ON); + break; + } + } + //up to here + + sdata = meas_voltage( ch_num ) * -1 ; + + //ver1.2.0 + if (RL_EN == 1) { + io[4] = 0; //外付けリレーOFF + io[5] = 0; //外付けリレーOFF + } + //up to here + + gu_fontsize(2); + gu_cursor(108,4); + gu_putdeck(&sdata); + 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); + + 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; + Soushin = i2c.write (fixed_adrs, wdata, 1,true); //読込先頭アドレス指定 ReStart + Jyushin = i2c.read ((fixed_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 + +*********************************/ +void show_info(int n) +{ + short sdata[6]; + + read_caliber(&calinfo,n); + + //読出したCAL情報の表示 + gu_fontsize(1); + gu_cursor(0,2); + gu_print1("No."); + gu_putdec(&calinfo.number); + gu_cursor(0,3); + gu_print1("Vss(Iop) ="); + sdata[0] = -1 * calinfo.vss_iop; + gu_putdeck(&sdata[0]); + gu_print1("V "); + gu_cursor(0,4); + gu_print1("Vss(ocp) ="); + sdata[1] = -1 * calinfo.vss_ocp; + gu_putdeck(&sdata[1]); + gu_print1("V "); + gu_cursor(0,5); + gu_print1("Vss(Voc) ="); + sdata[2] = -1 * calinfo.vss_voc; + gu_putdeck(&sdata[2]); + gu_print1("V "); +} +/********************************* + + CAL選択画面 #CAL登録画面 + +*********************************/ +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ナンバー + //short sdata[3]; //印加電圧表示用wr + + calnum = 0;//initial + + gu_cls(); + + read_regnum();//EEPROMに保存した選択CAL_NO.の読み出し + + show_info(reg_num); + + /* + read_caliber(&calinfo,reg_num); + + //読出したCAL情報の表示 + gu_fontsize(1); + gu_cursor(0,2); + gu_print1("No."); + gu_putdec(&calinfo.number); + gu_cursor(0,3); + gu_print1("Vss(Iop) ="); + sdata[0] = -1 * calinfo.vss_iop; + gu_putdeck(&sdata[0]); + gu_print1("V "); + gu_cursor(0,4); + gu_print1("Vss(ocp) ="); + sdata[1] = -1 * calinfo.vss_ocp; + gu_putdeck(&sdata[1]); + gu_print1("V "); + gu_cursor(0,5); + gu_print1("Vss(Voc) ="); + sdata[2] = -1 * calinfo.vss_voc; + gu_putdeck(&sdata[2]); + gu_print1("V "); + */ + + gu_fontsize(2); //change fontsize + gu_cursor(0,0); + gu_print1("Select CAL."); + //Set Button + gu_set_button(17,"1"); + gu_set_button(19,"2"); + gu_set_button(21,"3"); + gu_set_button(25,"4"); + gu_set_button(27,"5"); + gu_set_button(29,"6"); + gu_set_button_font1(7,"slct"); + gu_set_button_font1(8,"reg"); + //gu_set_button_font1(32,"del"); //ver1.1.0 + + + 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 0x10: //SW17 + + gu_reverse(0x01); //gu_リバース指定 + gu_set_button(17,"1"); + gu_reverse(0x00); //gu_リバース解除 + gu_set_button(19,"2"); + gu_set_button(21,"3"); + gu_set_button(25,"4"); + gu_set_button(27,"5"); + gu_set_button(29,"6"); + + calnum = 1; + + show_info(calnum); + + break; + + case 0x12: //SW19 + + gu_reverse(0x01); //gu_リバース指定 + gu_set_button(19,"2"); + gu_reverse(0x00); //gu_リバース解除 + gu_set_button(17,"1"); + gu_set_button(21,"3"); + gu_set_button(25,"4"); + gu_set_button(27,"5"); + gu_set_button(29,"6"); + + calnum = 2; + + show_info(calnum); + + break; + + case 0x14: //SW21 + + gu_reverse(0x01); //gu_リバース指定 + gu_set_button(21,"3"); + gu_reverse(0x00); //gu_リバース解除 + gu_set_button(17,"1"); + gu_set_button(19,"2"); + //gu_set_button(21,"3"); + gu_set_button(25,"4"); + gu_set_button(27,"5"); + gu_set_button(29,"6"); + + calnum = 3; + + show_info(calnum); + + break; + + case 0x18: //SW25 + + gu_reverse(0x01); //gu_リバース指定 + gu_set_button(25,"4"); + gu_reverse(0x00); //gu_リバース解除 + gu_set_button(17,"1"); + gu_set_button(19,"2"); + gu_set_button(21,"3"); + //gu_set_button(25,"4"); + gu_set_button(27,"5"); + gu_set_button(29,"6"); + + calnum = 4; + + show_info(calnum); + + break; + + case 0x1A: //SW27 + + gu_reverse(0x01); //gu_リバース指定 + gu_set_button(27,"5"); + gu_reverse(0x00); //gu_リバース解除 + gu_set_button(17,"1"); + gu_set_button(19,"2"); + gu_set_button(21,"3"); + gu_set_button(25,"4"); + //gu_set_button(27,"5"); + gu_set_button(29,"6"); + + calnum = 5; + + show_info(calnum); + + break; + + case 0x1C: //SW29 + + gu_reverse(0x01); //gu_リバース指定 + gu_set_button(29,"6"); + gu_reverse(0x00); //gu_リバース解除 + gu_set_button(17,"1"); + gu_set_button(19,"2"); + gu_set_button(21,"3"); + gu_set_button(25,"4"); + gu_set_button(27,"5"); + //gu_set_button(29,"6"); + + calnum = 6; + + show_info(calnum); + + break; + + case 0x06: //SW7 CAL選択ボタン + + if ( calnum >= 1 && calnum <=6 ) { + reg_num = calnum; + + //EEPROM書込み + wdata[0] = addr_calnum; //word address 書込み先頭アドレス指定 + wdata[1] = reg_num; + Soushin = i2c.write (fixed_adrs, wdata, 2); + + 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 + + if ( calnum >= 1 && calnum <= 6 ) { + gu_reverse(0x01); //gu_リバース指定 + gu_set_button_font1(8,"reg"); + wait(0.2); + gu_reverse(0x00); //gu_リバース解除 + + setup_cal_information(calnum);//CAL情報登録画面へ + return; + } + break; + + /*ver1.1.0 + case 0x1F: //SW32 + + gu_reverse(0x01); //gu_リバース指定 + gu_set_button_font1(32,"del"); + gu_reverse(0x00); //gu_リバース解除 + + erace_calinfo(); + + gu_set_button_font1(32,"del"); + + break; + */ + + } //switch + + }//if(cswdata == 0x01) { + } //if(crdata[0] == 0x11 ) { + wait(0.1);//タッチスイッチ入力読み出し間隔 + } //while(1) +} + +/********************************* + + CAL情報登録画面 サブルーチン + 表示パラメータ + x=0 : vss_iop[V] + x=1 : vss_ocp[V] + x=2 : vss_voc[V] + x=3 : low_limit_voc[V] + x=4 : low_limit_iop[uA] + x=5 : low_limit_ocp[uA] + x=6 : wait_iop[s] + x=7 : wait_ocp[s] + x=8 : low_limit_resistor[Ω] + x=9 : up_limit_resistor[Ω] + + ver1.2.2 + up_limit_ocp[]の追加と + 順序の入替え + + x=6 : up_limit_ocp[] + x=7 : wait_iop[s] + x=8 : wait_ocp[s] + x=9 : low_limit_resistor[Ω] + x=10 : up_limit_resistor[Ω] + +*********************************/ +void hyouji_cal_param(char x) +{ + gu_fontsize(2); + gu_cursor(0,4); + gu_print1(" "); + + switch ( x ) { + case 0: + gu_cursor(0,4); + gu_print1("Vss(Iop)"); + gu_cursor(208,4); + gu_print1("[V]"); + break; + case 1: + gu_cursor(0,4); + gu_print1("Vss(O.C.P)"); + gu_cursor(208,4); + gu_print1("[V]"); + break; + case 2: + gu_cursor(0,4); + gu_print1("Vss(Voc)"); + gu_cursor(208,4); + gu_print1("[V]"); + break; + case 3: + gu_cursor(0,4); + gu_print1("low limit(Voc)"); + gu_cursor(208,4); + gu_print1("[V]"); + break; + case 4: + gu_cursor(0,4); + gu_print1("low limit(Iop)"); + gu_cursor(208,4); + gu_print1("[uA]"); + break; + case 5: + gu_cursor(0,4); + gu_print1("low limit(O.C.P)"); + gu_cursor(208,4); + gu_print1("[uA]"); + break; + //ver1.2.2 + case 6: + gu_cursor(0,4); + gu_print1("up limit(O.C.P)"); + gu_cursor(208,4); + gu_print1("[uA]"); + break; + case 7: + gu_cursor(0,4); + gu_print1("Wait(Iop)"); + gu_cursor(208,4); + gu_print1("[s]"); + break; + case 8: + gu_cursor(0,4); + gu_print1("Wait(O.C.P)"); + gu_cursor(208,4); + gu_print1("[s]"); + break; + case 9: + gu_cursor(0,4); + gu_print1("low limit(ohm)"); + gu_cursor(208,4); + wdata[0] = 0xEA; //Ω + i2c.write( addr_gu, wdata, 1); + break; + case 10: + gu_cursor(0,4); + gu_print1("up limit(ohm)"); + gu_cursor(208,4); + wdata[0] = 0xEA; //Ω + i2c.write( addr_gu, wdata, 1); + break; + //ver1.2.2 up to here + + } +} + +/********************************* + + CAL情報登録画面 sub + para kind of parameter + idata data value + inc add number ex)0x64 0x0A 0x01 + +*********************************/ +void increase_param(char para, signed short *sdata, short inc) +{ + switch ( para ) { //パラメータの項目によって上限値異なる + case 0://vss_iop + case 1://vss_ocp + case 2://vss_voc + case 3://low_limit_voc + if(*sdata <= ( 4999 - inc )) { + *sdata = *sdata + inc ; + } + break;//switch ( param ){ + + case 4://low_limit_iop + case 5://low_limit_o.c.p + if(*sdata <= ( 2500 - inc / 10 )) { + *sdata = *sdata + inc /10 ; + } + break;//switch ( param ) + case 7://wait_iop + case 8://wait_ocp + + if(*sdata <= ( 2550 - inc / 10 )) { + *sdata = *sdata + inc / 10 ; + } + break;//switch ( param ) + + case 9: + case 10: + if(*sdata <= ( 2550 - inc )) { + *sdata = *sdata + inc; + } + break; + + //ver1.2.2 + case 6://up_limit_o.c.p + if(*sdata <= ( 2500 - inc / 10 )) { + *sdata = *sdata + inc /10 ; + } + break;//switch ( param ) + //ver1.2.1 up to here + + }//switch ( param ){ +} + +void decrease_param(char para, signed short *sdata, short dec) +{ + switch ( para ) { //パラメータの項目によって上限値異なる + case 0://vss_iop + case 1://vss_ocp + case 2://vss_voc + case 3://low_limit_voc + + 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 + + if(*sdata >= -2500 + dec / 10 ) { + *sdata = *sdata - dec / 10; + } + break; + + case 7://wait_iop + case 8://wait_ocp + + if(*sdata >= dec / 10 ) { + *sdata = *sdata - dec / 10 ; + } + break;//switch ( param ) + + case 9: + case 10: + if(*sdata >= dec ) { + *sdata = *sdata - dec; + } + break; + + //ver1.2.1 + case 6://up_limit_o.c.p + + if(*sdata >= -2500 + dec / 10 ) { + *sdata = *sdata - dec / 10; + } + break; + //ver1.2.1 ここまで + + }//switch ( param ){ +} +/********************************* + + CAL情報登録画面 MAIN + 別途システム設計図,EEPROMのシートを参照 + 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 ver1.2.2 + 7:wait_iop + 8:wait_ocp + 9:LowLimitResistor + 10:UPLimitResistor + +*********************************/ +void setup_cal_information(char cal_num) //xは登録ナンバー=EEPROMのPAGEナンバーex)登録No.1→BLOCK0x00 PAGE0x00 +{ + char param; //設定するパラメータの選択 0~9まで ver1.2.1 0~10まで + char crdata[3]; + signed short sdata_cal[16]; //CAL設定条件 + signed short hyouji_data; + int param_sum; //設定するパラメータの数 ver1.2.1 + //int i; + //short sdata_byte[16]; //EEPROM BYTEごとのDATA 1byte + //char cmd_gu[32]; //gu-DへのI2Cコマンド用配列 1byte0 + //char adrs_cal; //EEPROM CAL情報を保存しているアドレス 0x90~ + + param_sum = 11; //ver1.2.1 + + //画面表示 + gu_cls();//画面のクリア + gu_fontsize(2); + gu_print1("Setup Cal No."); + wdata[0] = ( cal_num % 10 ) + 0x30;//CALナンバーの表示 + i2c.write(addr_gu, wdata, 1); + + //CAL情報読込 + 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; + //ver1.2.2 + sdata_cal[6] = calinfo.up_limit_ocp; + sdata_cal[7] = calinfo.wait_iop; + sdata_cal[8] = calinfo.wait_ocp; + sdata_cal[9] = calinfo.low_limit_resistor; + sdata_cal[10] = calinfo.up_limit_resistor; + /* + sdata_cal[6] = calinfo.wait_iop; + sdata_cal[7] = calinfo.wait_ocp; + sdata_cal[8] = calinfo.low_limit_resistor; + sdata_cal[9] = calinfo.up_limit_resistor; + */ + //ver1.2.2 up to here + + //ボタンの配置 + gu_set_button_font1(8,"reg"); + gu_button_up(17); + gu_button_down(25); + + gu_button_up(20); + gu_button_up(22); + gu_button_up(24); + gu_button_down(28); + gu_button_down(30); + gu_button_down(32); + + /* + gu_button_up(21); + gu_button_up(22); + gu_button_up(23); + gu_button_down(29); + gu_button_down(30); + gu_button_down(31); + */ + + //初期表示はVss_Iop + param = 0; + gu_cursor(0,4); + gu_fontsize(2); + gu_print1("Vss(Iop)"); + gu_cursor(208,4); + gu_print1("V"); + + 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情報 + + switch( crdata[1] ) { //SWの番号(位置) + + /* ver1.2.1 + case 0x10 ://sw17 パラメータ変更スイッチ(上) + + if ( param <= 8 ) { + param = param + 1; + } else { + param = 0; + } + + hyouji_cal_param(param);//設定パラメータ表示 + break; + + case 0x18 ://sw25 パラメータ変更スイッチ(下) + + if ( param >= 1 ) { + param = param - 1; + } else { + param = 9; + } + + hyouji_cal_param(param);//設定パラメータ表示 + break; + */ + + case 0x10 ://sw17 パラメータ変更スイッチ(上) + + if ( param <= param_sum -2 ) { + param = param + 1; + } else { + param = 0; + } + + hyouji_cal_param(param);//設定パラメータ表示 + break; + + case 0x18 ://sw25 パラメータ変更スイッチ(下) + + if ( param >= 1 ) { + param = param - 1; + } else { + param = param_sum - 1; + } + + hyouji_cal_param(param);//設定パラメータ表示 + break; + + //ver1.2.1 up to here + + case 19 ://SW20 increase 0x3E8 + + increase_param(param, &sdata_cal[param], 1000); + break; + + case 27 ://SW28 decrease 0x3E8 + + decrease_param(param, &sdata_cal[param], 1000); + break; + + case 0x15 ://SW22 increase 0x64 + + increase_param(param, &sdata_cal[param], 100); + break; + + case 0x1D ://SW30 decrease 0x64 + + decrease_param(param, &sdata_cal[param], 100); + break; + + case 23 ://SW24 increase 0x0A + + increase_param(param, &sdata_cal[param], 10); + break; + + case 31 ://SW32 decrease 0x0A + + decrease_param(param, &sdata_cal[param], 10); + break; + + + case 0x07 ://保存ボタン + + calinfo.vss_iop = sdata_cal[0]; + calinfo.vss_ocp = sdata_cal[1]; + calinfo.vss_voc = sdata_cal[2]; + calinfo.low_limit_voc = sdata_cal[3]; + calinfo.low_limit_iop = sdata_cal[4]; + calinfo.low_limit_ocp = sdata_cal[5]; + //ver1.2.2 + calinfo.up_limit_ocp = sdata_cal[6]; + calinfo.wait_iop = sdata_cal[7]; + calinfo.wait_ocp = sdata_cal[8]; + calinfo.low_limit_resistor = sdata_cal[9]; + calinfo.up_limit_resistor = sdata_cal[10]; + /* + calinfo.wait_iop = sdata_cal[6]; + calinfo.wait_ocp = sdata_cal[7]; + calinfo.low_limit_resistor = sdata_cal[8]; + calinfo.up_limit_resistor = sdata_cal[9]; + */ + //ver1.2.2 up to here + + reg_num = cal_num; + + //CALNO.EEPROM書込み + wdata[0] = addr_calnum; //word address 書込み先頭アドレス指定 + wdata[1] = reg_num; + Soushin = i2c.write (fixed_adrs, wdata, 2); + + wait(0.2); + + //CAL情報 + //送信完了ならば実行 + if(Soushin == 0) { + + write_caliber_information(&calinfo, cal_num); + + //ver1.2.3 + } else { + gu_fontsize(1); + gu_cursor(0,2); + gu_print1("can not save cal no"); + wait(2); + return; + } + + //送信完了ならば実行 + if(Soushin == 0) { + gu_reverse(1); + gu_set_button_font1(8,"reg"); + wait(0.2); + return;//CAL情報登録画面を抜ける + + //ver1.2.3 + } else { + gu_fontsize(1); + gu_cursor(0,2); + gu_print1("can not save cal information"); + wait(2); + return; + } + + //break; + + } //switch + } //if + //gu-D表示 + gu_cursor(150,4); + + switch ( param ) { + case 0://vss_iop + case 1://vss_ocp + case 2://vss_voc + case 3://low_limit_voc + hyouji_data = sdata_cal[param] * -1; + gu_putdeck ( &hyouji_data ); + break; + case 4: + case 5: + hyouji_data = sdata_cal[param] * 10; + gu_putdeck ( &hyouji_data ); + break; + //ver1.2.2 + case 6: + hyouji_data = sdata_cal[param] * 10; + gu_putdeck ( &hyouji_data ); + break; + case 7: + case 8: + //ver1.1.0 + hyouji_data = sdata_cal[param]; + gu_putdec ( &hyouji_data ); + break; + case 9://low_limit_resistor + case 10://up_limit_resistor + hyouji_data = sdata_cal[param]; + gu_putdec ( &hyouji_data ); + break; + /* + case 6: + case 7: + //ver1.1.0 + hyouji_data = sdata_cal[param]; + gu_putdec ( &hyouji_data ); + break; + case 8://low_limit_resistor + case 9://up_limit_resistor + hyouji_data = sdata_cal[param]; + gu_putdec ( &hyouji_data ); + break; + */ + //ver1.2.2 uptohere + + } + 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 CAL + for ( i = 0; i <= ( noc -1 ); i++) { + io[i] = 1; //io1 = "H" + } + + wait(time_reset); //ver1.1.3 + //wait(0.2); + + for ( i = 0; i <= ( noc -1 ); i++) { + io[i] = 0; //io1 = "L" + } + + //抵抗測定 + 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 ); + + for ( i = 0; i <= ( noc -1 ); i++) { + io[i] = 1; //io1 = "H" + } + + wait( wait_reset ); + + for ( i = 0; i <= ( noc -1 ); i++ ) { + + //ver1.2.0 + if (RL_EN == 1) { + switch (i) { + case 0: + io[4] = 1; //外付けリレーON + wait(TIME_RELAY_ON); + case 1: + io[5] = 1; //外付けリレーON + wait(TIME_RELAY_ON); + } + } + //up to here ver1.2.0 + + voc[i] = meas_voltage(i); + sdata[i] = voc[i] * -1; + + //ver1.2.0 + if (RL_EN == 1) { + io[4] = 0; //外付けリレーOFF + io[5] = 0; //外付けリレーOFF + wait(TIME_RELAY_OFF); + } + //up to here + } + + + //display GU_D + if ( number_of_channels <= 2 ) { //2個測定の時の表示 + gu_cursor(0, iy + 8 );//IOP測定値表示位置指定 + 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[i] = 0; //io1 = "L" + } + + 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 + } + + 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; + + i2c.write(addr_gu, wdata, 5); + + gu_print1("uA"); + +} + +/************************************** + 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 ) { + seq_hantei[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 + +*********************************/ +short meas_voltage(char ch)//ch 0~3 -> 1ch ~ 4ch +{ + char com; + short sdata; + + switch(ch) { + case 0: + 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: + 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: + 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: + 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 + + //プリアンプ倍率を代入して、電圧値を算出する(単位はmV) + + + sdata = sdata * 5;//プリアンプ倍率 + + return ( sdata ); +} + + +/********************************* + + measure resistor + 測定CHを指定して、抵抗測定値Rを返す + char ch 0~3 -> 1ch ~ 4ch + +*********************************/ +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 + + 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 + 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 + + 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: + 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: + 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 + + //検出用抵抗値を代入して、測定抵抗値を算出する(単位は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 = 0x10; + i2c.write (fixed_adrs, &cmd, 1,true); //読込先頭アドレス指定 ReStart + i2c.read ((fixed_adrs + 0x01), rdata, 4);//read 1byte + + 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 保存ボタンを押すと現在の輝度をEEPROMへ保存する + + wdata[0] = 0x10 ; //word address 書込み先頭アドレス指定 + + for ( i = 0; i <= ( number_of_channels - 1 ); i++) { + wdata[ i + 1 ] = csyoudo[i]; //DATA_LED i + } + + Soushin = i2c.write (fixed_adrs, wdata,( number_of_channels + 1 )); + + 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 (fixed_adrs, wdata, 1,true); //読込先頭アドレス指定 ReStart + Jyushin = i2c.read ((fixed_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 + Soushin = i2c.write (fixed_adrs, wdata, 2); + + 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); + +} \ No newline at end of file