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
ILF.cpp
- Committer:
- Kujira
- Date:
- 2022-01-18
- Revision:
- 0:1977c2310ef7
- Child:
- 1:f6a9410c46d2
File content as of revision 0:1977c2310ef7:
#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); }