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
ILF3_rev1.cpp
00001 #include "mbed.h" 00002 #include "SDFileSystem.h" 00003 00004 00005 //difine_mbed_LPC1768 00006 00007 /******************************************************************************* 00008 00009 2022.4.8 00010 ILF V3 Iop汎用器 00011 00012 ver3.0.0 2022.4.8 tanaka 00013 mbed_ILF ver1.2.5を引継ぎ 00014 ILF3のハードに合せて改編する 00015 00016 1.EEPROMの変更 ONsemi製CAT24M01WI-GT3 00017 the CAT24M01 is a 1024kb serial CMOS EEPROM 00018 addres: 101010** 00019 00020 2.電圧測定の平均化 00021 00022 00023 00024 ******************************************************************************/ 00025 /* 00026 仕様 00027 電圧/抵抗測定:12bit 00028 電流測定:14bit 00029 00030 割込みはP0~P2で可能 00031 シーケンサスタート信号は、回路図「seq_yobi]で対応 00032 00033 ver1.2.5 00034 IOP測定値にO.L追加 ±100uA 00035 00036 ver1.2.4 00037 ver1.2.3のDEB_EN=0としたもの。 00038 公開用。 00039 00040 ver1.2.3 00041 EEPROM通信のコードを修正。 00042 debug mode の追加 00043 00044 ver1.2.2 00045 過充電防止検査の上限規格の判定追加 00046 CAL情報登録画面において、登録項目の順序入替え(過充電防止上限規格の挿入) 00047 過充電防止上限規格ゼロの場合、判定しない 00048 00049 ver1.2.1 00050 過充電防止検査の上限規格を新たに設置。 00051 それに伴い、規格値のメモリ割り当てと、上限規格設定画面を追加。 00052 00053 ver1.2.0 00054 00055 2021.9.7 00056 00057 CAL.LJ21(A1098A05)専用 00058 発電検出時、高照度条件下でVSS電圧がIC耐圧超える為、VHD-VDD短絡する仕様へ変更(A05) 00059 200lx下でもVHD-VDD短絡の電圧条件を満たす為、ILFも対応。 00060 VSS端子でVOC測定をする。その為、VOC測定時以外はVSS端子と測定器を切り離すリレーを 00061 サブ基板へ取り付け、制御プログラムを追加した。 00062 CH1:P1_23(LPC1768) (led3_on) 00063 CH2:P1_22(LPC1768) (led3_off) 00064 00065 アンテナ測定時にアンテナ測定端子切り離し用リレーのON/OFF制御を追加 00066 (led4_on) 00067 (led4_off) 00068 00069 ver1.1.0 00070 1)VFD_SW23 SW31がタッチ感度故障の為、配置替え 00071 CAL登録画面とMANUAL測定画面 00072 2)DELETE EEPROM ボタンの配置変更 00073 3)シーケンサ判定IOの変更 00074 00075 ver1.1.1 00076 void auto_meas において初期 R[i]の値をクリアすることを追加 00077 自動測定時、タッチパネルでスタートをやめる(外部IO入力のみ) 00078 00079 ver1.1.2 00080 過充電防止検査時の電源電圧:VOC検査時の電圧となっていたのを修正。 00081 00082 ver1.1.3 00083 1)SDカード未挿入の表示を削除 00084 00085 2)R=Hの時間を0.2sから1sへ変更 00086 00087 R5186 ver2.0.3の内容を反映。 00088 00089 未)フラグでR5186系と切替え 00090 未)測定部ごとにクラス分け(過充電防止のところだけでも) 00091 00092 *******************************************************************************/ 00093 // 00094 //定数 00095 // 00096 //soft ver 00097 const int version_major = 3; 00098 const int version_minor = 0; 00099 const int version_build = 0; 00100 00101 const char pass[] = "ILF"; //password(大文字) 00102 #define YOSO 3 //password文字数 00103 00104 #define O_L 100 //[uA]電流測定値のオーバーロード値 //ver1.2.5 00105 /* 00106 #define CAP 20 //[uF] 積分回路のコンデンサ容量 00107 #define TIME_INT 2 //[s]積分時間 00108 #define GAIN_I 0.2 //電流測定プリアンプのGAIN 00109 #define LSB_I 0.00025 //[V] MCP3424 LSB size of 14bit conversion rate setting 00110 #define MINCODE_I -8192 //Minimum output code of MCP3424 00111 #define MAXCODE_I 8191 //Maximum output code of MCP3424 00112 #define GAIN_V 0.2 //電流測定プリアンプのGAIN 00113 */ 00114 #define DEB_EN 0 //デバッグイネーブル:1 ディスイネーブル:0 ver1.2.3 00115 #define RL_EN 0 //1:io[]を外付けのリードリレー制御用に使用する場合は1.以外は0. ver1.2.3 00116 #define SEQ_EN 0 //1:シーケンサ接続仕様 0:シーケンサ未接続仕様 00117 #define period_pwm 200 //*us 00118 #define COP 0.0039 //pwm_duty(%) = COP * DATA(0~255) ver3 0.005 -> 0.0039 00119 #define rsense 1000 //抵抗測定回路のプルアップ抵抗値 1kΩ 00120 #define res_vref 0x800 //抵抗測定回路のリファレンス電圧 2.048V 00121 #define dac_vref 2500 //DACのリファレンス電圧 単位[mV] 00122 #define number_of_channels 4 //測定チャンネル数(MAX 4) 00123 #define time_discharge 0.5 //discharging time(s) 00124 #define time_integral 2 //integral time(s) 00125 #define wait_voc_1 0.5 //[s]VOC測定電圧設定後からリセットまでの時間 00126 //#define wait_reset 0.3 //[s]リセット解除からVOC測定までの時間 00127 #define wait_poweron 4 //[s]電源投入からリセットまでの時間 00128 #define time_reset 0.5 //reset Hの時間 ver1.1.3 00129 #define TIME_RELAY_ON 0.5 //外付けリードリレー用 Ton[s] 00130 #define TIME_RELAY_OFF 0.2 //外付けリードリレー用 Toff[s] 00131 const int ton_rr = 0.1; //内蔵リードリレー ton[s] 00132 const int toff_rr = 0.1; //内蔵リードリレー toff] 00133 const bool tenken = true; //日常点検用 マニュアルモードにて True:測定CHのみVSS出力 False:全CH,VSS出力 00134 00135 //Display 00136 #define touch 5 //GU-D タッチパネル感度 0~7で設定。低いほど敏感。 00137 const char sw_up_set[] = {20,21,22,23}; //CAL情報セット画面におけるUPスイッチの表示位置番号 00138 const char sw_down_set[] = {28,29,30,31}; //CAL情報セット画面におけるDOWNスイッチの表示位置番号 00139 const int zahyou_para1[] = {0,2}; //CAL情報セット画面における項目の表示位置座標 00140 const int zahyou_para2[] = {0,4}; //CAL情報セット画面における項目の表示位置座標 00141 const int zahyou_val[] = {96,4}; //CAL情報セット画面における数値の表示位置座標 00142 const int zahyou_unit[] = {160,4}; //CAL情報セット画面における単位の表示位置座標 00143 const char *cpara1[]= { 00144 "IOP", //x=0 : vss_iop[V] 00145 "OCP", //x=1 : vss_ocp[V] 00146 "VOC", //x=2 : vss_voc[V] 00147 "VOC", //x=3 : low_limit_voc[V] 00148 "IOP", //x=4 : low_limit_iop[uA] 00149 "OCP", //x=5 : low_limit_ocp[uA] 00150 "OCP", //x=6 : up_limit_ocp[uA] 00151 "OCP", //x=7 : low_limit_ocp_v[V] 00152 "OCP", //x=8 : up_limit_ocp_v[V] 00153 "IOP", //x=9 : wait_iop[s] 00154 "OCP", //x=10 : wait_ocp[s] 00155 "VOC", //x=11 : wait_voc[s] 00156 "ANTENA", //x=12 : low_limit_resistor[Ω] 00157 "ANTENA", //x=13 : up_limit_resistor[Ω] 00158 "" //x=14 : cal_name(ASCII) 00159 }; 00160 const char *cpara2[]= { 00161 "VSS", //x=0 : vss_iop[V] 00162 "VSS", //x=1 : vss_ocp[V] 00163 "VSS", //x=2 : vss_voc[V] 00164 "LOW LIMIT", //x=3 : low_limit_voc[V] 00165 "LOW LIMIT", //x=4 : low_limit_iop[uA] 00166 "LOW LIMIT", //x=5 : low_limit_ocp[uA] 00167 "UP LIMIT", //x=6 : up_limit_ocp[uA] 00168 "LOW LIMIT", //x=7 : low_limit_ocp_v[V] 00169 "UP LIMIT", //x=8 : up_limit_ocp_v[V] 00170 "WAIT", //x=9 : wait_iop[s] 00171 "WAIT", //x=10 : wait_ocp[s] 00172 "WAIT", //x=11 : wait_voc[s] 00173 "LOW LIMIT", //x=12 : low_limit_resistor[Ω] 00174 "UP LIMIT", //x=13 : up_limit_resistor[Ω] 00175 "NAME" //x=14 : cal_name(ASCII) 00176 }; 00177 const char *cunit[]= { 00178 "V", //x=0 : vss_iop[V] 00179 "V", //x=1 : vss_ocp[V] 00180 "V", //x=2 : vss_voc[V] 00181 "V", //x=3 : low_limit_voc[V] 00182 "uA", //x=4 : low_limit_iop[uA] 00183 "uA", //x=5 : low_limit_ocp[uA] 00184 "uA", //x=6 : up_limit_ocp[uA] 00185 "V", //x=7 : low_limit_ocp_v[V] 00186 "V", //x=8 : up_limit_ocp_v[V] 00187 "s", //x=9 : wait_iop[s] 00188 "s", //x=10 : wait_ocp[s] 00189 "s", //x=11 : wait_voc[s] 00190 "", //x=12 : low_limit_resistor[Ω] 00191 "", //x=13 : up_limit_resistor[Ω] 00192 "" //x=14 : cal_name(ASCII) 00193 }; 00194 00195 /* 00196 x=0 : vss_iop[V] 00197 x=1 : vss_ocp[V] 00198 x=2 : vss_voc[V] 00199 x=3 : low_limit_voc[V] 00200 x=4 : low_limit_iop[uA] 00201 x=5 : low_limit_ocp[uA] 00202 x=6 : up_limit_ocp[uA] 00203 x=7 : low_limit_ocp_v[V] 00204 x=8 : up_limit_ocp_v[V] 00205 x=9 : wait_iop[s] 00206 x=10 : wait_ocp[s] 00207 x=11 : wait_voc[s] 00208 x=12 : low_limit_resistor[Ω] 00209 x=13 : up_limit_resistor[Ω] 00210 x=14 : cal_name(ASCII) 00211 */ 00212 00213 00214 /******************************************************************************* 00215 00216 LPC1768 PIN MAPPING 00217 00218 *******************************************************************************/ 00219 //繰り返しタイマー割り込み 00220 Ticker flipper; /* 初期化 */ 00221 //one shot timer 00222 Timeout oneshot1; 00223 Timeout oneshot2; 00224 Timeout oneshot3; 00225 Timeout oneshot4; 00226 Timeout oneshot5;//CAL番号未送信タイムアウト用 00227 00228 /*** SD-CARD ***/ 00229 SDFileSystem sd(P0_9, P0_8, P0_7, P0_6, "sd"); //SDFileSystem name(mosi, miso, sck, cs, mount); 00230 00231 /*** I2C ***/ 00232 I2C i2c(P0_10,P0_11); //(PinName sda, PinName scl) I2Cを定義 00233 00234 /*** UART ver3 ***/ 00235 //RawSerial uart(P0_15,P0_16,19200); 00236 //RawSerial pc(USBTX,USBRX,9600); //mbed⇔PCデバック用 00237 RawSerial pc(P0_15,P0_16,19200);//ILF3⇔PCデバック用 00238 00239 /*** interruput ***/ 00240 //InterruptIn seq_yobi(P0_19); 00241 00242 /*** start sw ***/ 00243 DigitalIn sw_start(P0_4); 00244 00245 /*** DigitalOut ***/ 00246 DigitalOut houden[] = { // 配列を用意します 00247 DigitalOut( P2_1 ), //houden1 配列の1番目の要素を**で初期化したDigitalOutに 00248 DigitalOut( P2_0 ), //houden2 00249 DigitalOut( P1_28 ), //houden3 00250 DigitalOut( P1_29 ) //houden4 00251 }; 00252 00253 DigitalOut io[] = { 00254 DigitalOut( P2_11 ), //io1 00255 DigitalOut( P2_12 ), //io2 00256 DigitalOut( P1_18 ), //io3 00257 DigitalOut( P1_19 ), //io4 00258 DigitalOut( P0_17 ), //io5 00259 DigitalOut( P0_18 ), //io6 00260 DigitalOut( P1_30 ), //io7 00261 DigitalOut( P1_31 ), //io8 00262 DigitalOut( P1_22 ), //io9 00263 DigitalOut( P1_23 ), //io10 00264 DigitalOut( P1_24 ), //io11 00265 DigitalOut( P1_25 ), //io12 00266 DigitalOut( P0_23 ), //io13 00267 DigitalOut( P0_24 ), //io14 00268 DigitalOut( P0_25 ), //io15 00269 DigitalOut( P0_26 ) //io16 00270 }; 00271 00272 DigitalOut io_reset[] = { 00273 DigitalOut( P1_22 ), //io9 00274 DigitalOut( P1_23 ), //io10 00275 DigitalOut( P1_24 ), //io11 00276 DigitalOut( P1_25 ), //io12 00277 }; 00278 00279 /* 00280 DigitalOut io[] = { // 配列を用意します 00281 DigitalOut( P0_25 ), //io1 配列の1番目の要素をP0_25で初期化したDigitalOutに 00282 DigitalOut( P0_26 ), //io2 00283 DigitalOut( P0_23 ), //io3 00284 DigitalOut( P0_24 ), //io4 00285 DigitalOut( P1_22 ), //io5 00286 DigitalOut( P1_23 ), //io6 00287 DigitalOut( P1_24 ), //io7 00288 DigitalOut( P1_25 ) //io8 00289 }; 00290 */ 00291 00292 DigitalOut range[] = { // 配列を用意します 00293 DigitalOut( P2_3 ), //range1 配列の1番目の要素を**で初期化したDigitalOutに 00294 DigitalOut( P2_2 ), //range2 00295 DigitalOut( P1_26 ), //range3 00296 DigitalOut( P1_27 ) //range4 00297 }; 00298 00299 DigitalOut led_green[] = { 00300 DigitalOut( P0_17 ), 00301 DigitalOut( P1_31 ), 00302 DigitalOut( P2_11 ), 00303 DigitalOut( P1_18 ) 00304 }; 00305 00306 DigitalOut led_red[] = { 00307 DigitalOut( P0_18 ), 00308 DigitalOut( P1_30 ), 00309 DigitalOut( P2_12 ), 00310 DigitalOut( P1_19 ) 00311 }; 00312 00313 /*** PLC ver3 ***/ 00314 DigitalIn seq_in[] = { 00315 DigitalIn(P0_19), //si1 00316 DigitalIn(P2_9), //si2 00317 DigitalIn(P2_13), //si3 00318 DigitalIn(P4_28), //si4 00319 DigitalIn(P0_29), //si5 00320 DigitalIn(P0_30) //si6 00321 }; 00322 00323 DigitalOut seq_out[] = { 00324 DigitalOut( P0_21 ), //so1 00325 DigitalOut( P0_22 ), //so2 00326 DigitalOut( P3_25 ), //so3 00327 DigitalOut( P3_26 ), //so4 00328 DigitalOut( P0_20 ), //so5 00329 DigitalOut( P2_6 ), //so6 00330 DigitalOut( P2_7 ), //so7 00331 DigitalOut( P2_8 ) //so8 00332 }; 00333 00334 //ver1.1.0 00335 /* 00336 DigitalOut seq_hantei[] = { 00337 DigitalOut( P0_21 ), 00338 DigitalOut( P0_22 ), 00339 DigitalOut( P3_25 ), 00340 DigitalOut( P3_26 ) 00341 }; 00342 00343 DigitalOut seq_busy(P0_20); 00344 //DigitalIn 00345 DigitalIn seq_start(P4_28); 00346 DigitalIn seq_cal_a(P2_6); 00347 DigitalIn seq_cal_b(P2_7); 00348 DigitalIn seq_cal_c(P2_8); 00349 DigitalIn seq_kosuu_a(P2_13); 00350 DigitalIn seq_kosuu_b(P2_9); 00351 //DigitalIn seq_yobi(P0_19); 00352 */ 00353 00354 /*** PWM ***/ 00355 PwmOut leds[] = { //配列を用意 00356 PwmOut(P2_5), //LED1 00357 PwmOut(P2_4), //LED2 00358 PwmOut(P1_21), //LED3 00359 PwmOut(P1_20) //LED4 00360 }; 00361 00362 //RELAY ver3.0.0 00363 DigitalOut rlen[] = { 00364 DigitalOut( P1_4 ), //RLCNT1 00365 DigitalOut( P1_8 ), //RLCNT2 00366 DigitalOut( P1_9 ), //RLCNT3 00367 DigitalOut( P1_10 ), //RLCNT4 00368 DigitalOut( P1_14 ), //RLCNT5 00369 DigitalOut( P1_15 ), //RLCNT6 00370 DigitalOut( P1_16 ), //RLCNT7 00371 DigitalOut( P1_17 ), //RLCNT8 00372 }; 00373 00374 /******************************************************************************* 00375 00376 SD Card 00377 00378 *******************************************************************************/ 00379 void sd_writetext(char* text); 00380 00381 /******************************************************************************* 00382 00383 gu-D(表示器) addr:50H 00384 00385 *******************************************************************************/ 00386 //parameter_gu256X128C-D903M 00387 const int addr_gu = 0x50 << 1; // Address of gu256X128C-D903M 00388 // 00389 //prototype 00390 const int Proportional1 = 0x02; 00391 //const int Proportional2 = 0x03; 00392 //const int Proportional3 = 0x04; 00393 // 00394 void gu_cls(); 00395 void gu_drawButton(int x, int y, int w, int h, const char *data); 00396 void gu_cursor(int x, int y); 00397 void gu_fontsize(const char code); 00398 void gu_print_dot(int x, int y, const char *ptext); 00399 void gu_fontWidth(const char fontWidth); 00400 void gu_print(const char t[] ); 00401 void gu_fontReverse(int code); 00402 void gu_RealTimeImage_dot(int x, int y, int w, int h, const char data[]); 00403 void gu_RealTimeImage(int w, int h, char data[]); 00404 void gu_magnify(int x, int y); 00405 // 00406 //オリジナルgu用関数 00407 void gu_print1(const char* ptext); 00408 void gu_luminance(const char* cl); 00409 void gu_touchPara(int x,int y); 00410 void gu_sendOneByte(char data); 00411 void utility(); //輝度調整サブルーチン 00412 void gu_CRLF(); 00413 void gu_reverse(char x); 00414 void gu_drawbutton_cursor(char x,char y); 00415 void gu_onebyte(char data); 00416 // 00417 //Button Trig Function 00418 void adjust_illumination();//LED輝度調整サブ 00419 void gu_initial();//初期設定サブ 00420 void gu_set_button(char sw_num,char* text);//SWナンバーと表示テキストを指定 00421 void gu_set_button_font1(char sw_num,char* text);//fontsize = 1 00422 void gu_button_up(char sw_num); //upボタン表示 00423 void gu_button_down(char sw_num);//downボタン表示 00424 void gu_Button_up1(); 00425 void gu_Button_up2(); 00426 void gu_Button_up3(); 00427 void gu_Button_up4(); 00428 void gu_button_up_on(char sw_num); 00429 void gu_Button_up_on2(); 00430 void gu_Button_down1(); 00431 void gu_Button_down2(); 00432 void gu_Button_down3(); 00433 void gu_Button_down4(); 00434 void gu_button_down_on(char sw_num); 00435 void gu_Button_down_on2(); 00436 void gu_Button_power_on(); 00437 void gu_Button_power_off(); 00438 // 00439 /******************************************************************************* 00440 00441 表示関数 00442 00443 *******************************************************************************/ 00444 void select_cal(); //CAL選択画面 00445 void setup_cal_information(char cal_num); //CAL情報登録画面 00446 void manual_int_hyouji(); 00447 void auto_int_hyouji(); 00448 void disp_setup_cal(char cal_num ,int parameter); //CAL情報登録画面表示 00449 // 00450 //****************************************************************************** 00451 00452 // CAT24M01(EEPROM) 00453 // ver3.0.0 2022.4.8 00454 00455 const static int eeprom_adrs = 0xA8; //0x2A << 2 Address of PCAS08A(EEPROM) 6/8bit 00456 00457 int slave_adrs; //i2c slave address 8bit 00458 00459 char rdata[17]; //EEPROMからのリードデータ 00460 char wdata[17]; //EEPROMへのライトデータ 00461 int Jyushin; //受信成功時 Jyushin=0 00462 int Soushin; //送信成功時 Soushin=0 00463 00464 const static char adrs_kido[]={0x00,0x00}; //VFDの輝度 00465 const static char adrs_syoudo[]={0x00,0x10}; //測定用LED照度の値を保存しているアドレス 00466 const static char adrs_calnum[]={0x00,0x20}; //CPUにロードしているCALの登録番号 00467 const static char adrs_calinfo[]={0x01,0x00}; //CAL情報 0x0100~0x032FFを割り当て。1page256byte。No.1~No.50まで登録 00468 // 00469 // CAL情報登録 -> EEPROM 00470 // 00471 #define caliber_number 50 /* CAL登録数 */ 00472 // 00473 // 00474 /******************************************************************************* 00475 00476 LCP1768(EEPROM) addr:15H 00477 00478 *******************************************************************************/ 00479 //parameter_PCAS08A(EEPROM) 00480 //const int addr_EEPROM = 0x15 << 3; // Address of PCAS08A(EEPROM) コメント化 ver1.2.1 00481 //char rdata[17]; //EEPROMからのリードデータ 00482 //char wdata[17]; //EEPROMへのライトデータ 00483 //int Jyushin; //受信成功時 Jyushin=0 00484 //int Soushin; //送信成功時 Soushin=0 00485 //const int eeprom_adrs = 0x15 << 3; // Address of PCAS08A(EEPROM) 始めの5bit ver1.2.1 00486 //int slave_adrs; //slave address ver1.2.1 00487 // 00488 /******************************************************************************* 00489 00490 MCP3424(ADC) 00491 00492 RESOLUTION SETTINGS VS. LSB 00493 ----------------------------------- 00494 |Resolution Setting | LSB | 00495 ----------------------------------- 00496 | 12bits(00) | 1mv | 00497 | 14bits(01) | 250uV | 00498 | 16bits(10) | 62.5uV | 00499 | 18bits(11) | 15.625uV | 00500 ----------------------------------- 00501 00502 *******************************************************************************/ 00503 //parameter_ADC(MCP3424) 00504 const int addr_ADC1 = 0x6C <<1;//電圧抵抗測定No.1,No.2用ADC 00505 const int addr_ADC2 = 0x6A <<1;//電圧抵抗測定No.3,No.4用ADC 00506 const int addr_ADC3 = 0x68 <<1;//電流測定No.1,No.2 00507 const int addr_ADC4 = 0x6E <<1;//電流測定No.3,No.4 00508 // 00509 char hd[] = "0123456789ABCDEF" ; 00510 // 00511 //関数 00512 void general_call(char com); //power on reset 00513 char adc_config(char ch, char rate); 00514 // 00515 /******************************************************************************* 00516 00517 AD5625RBUZ(DAC) addr:1F 00518 00519 *******************************************************************************/ 00520 const char addr_dac = 0x1F <<1; 00521 void dac_out(short mvolt, char addr); 00522 void dac_init(); 00523 // 00524 /******************************************************************************* 00525 00526 測定関係関数 00527 00528 *******************************************************************************/ 00529 void set_pullup();//シーケンサからの入力ピンのプルアップ設定 00530 void trigger();//シーケンサからのスタート信号割込みサブ 00531 void calibration(); 00532 void compute_adc(int adc_con, long *avg);//(ADCのCONFIG, 計算結果) 00533 void gu_putdec(short* x);//2byteを10進で表示 00534 void gu_putdeck(short* x);//2byteを10進で表示。1/1000. 00535 void gu_putdeci(float* x);// ver1.1.4 00536 void gu_putdeci_mA(float* x);// ver1.1.4 00537 void meas_current_automode(char amount);//AutoMOdeの電流測定サブ iop ocp共通 00538 void auto_run();//自動測定モード 00539 void auto_meas(char noc);//一括測定。ch:測定する総チャンネル数 00540 void meas_sub();//自動測定モード内の繰り返し処理 00541 void manual();//手動測定モード 00542 void hantei(char noc);//規格値比較エラーフラグ立てる 00543 void select_ich(char ch);//電流測定chの選択と設定 00544 short read_adc(char addr);//指定addressから2byte読込み 00545 short meas_voltage(char ch);//測定チャンネルを指定して、測定値(2byte)を返す 00546 short meas_resistor(char ch);//測定チャンネルを指定して、測定値(2byte)を返す 00547 void display_resistor(short sdata);//測定値を表示する。 00548 void led_off();//判定用LED全消灯 00549 void read_syoudo(char* c);//EEPROMから照度データ(PwmDuty)を読み込んでセットする 00550 void seq_serialsend(/*int noc*/);//シーケンサへのシリアル出力 00551 void seq_serialrecive(/*int noc*/);//シーケンサへのシリアル入力 00552 void seq_timeout();//シーケンサからCAL番号が一定時間出力されなければ前回のCAL番号で測定 00553 00554 00555 /******************************************************************************* 00556 00557 測定関係 変数 00558 00559 *******************************************************************************/ 00560 char io_voc; //VOC測定時のIO操作。ON(=VDD)の場合は”0x01"OFF(=OPEN)は"0x00" 00561 char err_f[4];//ch1~4 規格外発生時のフラグ 0or1 00562 short V[4];//ADC入力値を3倍した値 測定値[V] 16進数 00563 float I[4];//電流測定値チャンネル毎の 00564 short R[4];//抵抗測定値 00565 short voc[4];//ADC入力値を3倍した値 測定値[mV] 16進数 00566 double vocp[4];//過充電防止時のHD測定電圧 00567 float iop[4];//2byte 補数あり 測定値 1bit 0.01uA 00568 float ocp[4];//2byte 補数あり 測定値 00569 char ch_num ;//選択中の測定チャネル(0~3) 00570 int cat;//検査カテゴリNo. 00571 float fdata[4][4];//ファイル出力用 00572 char seq_name[4] = {0,0,0,0};//CAL番号一時格納用配列 00573 00574 00575 //structure 00576 struct cal_info { 00577 char name[4]; // CAL NAME ASCII CODE ver3 00578 short number; // CAL.No. 00579 short vss_iop; // IOP測定時のVss電圧 1bit * 0.01uA 00580 short vss_ocp; // 過充電防止(over charge protection)測定時のVss電圧 00581 short vss_voc; // VOC測定時のVss電圧 00582 short low_limit_voc; // 1bit * 1mv 00583 short low_limit_iop; // 1bit * 0.01uA 00584 short low_limit_ocp; // 過充電防止検査の下規格値(プラス側) 00585 short up_limit_ocp; // 過充電防止検査の上限規格値(マイナス側)ver1.2.1追加 00586 float wait_iop; // Iop測定前の待機時間[s] 1bit 1s 換算 00587 float wait_ocp; // 過充電防止時消電測定前の待機時間[s] 1bit 1s換算 00588 short low_limit_resistor; // アンテナ抵抗規格 1bit 10Ω 00589 short up_limit_resistor; // アンテナ抵抗規格 1bit 10Ω 00590 short low_limit_ocp_v; // 過充電防止検査の下限規格[V] ver3 00591 short up_limit_ocp_v; // 過充電防止検査の上限規格[V] ver3 00592 float wait_voc; // リセット立上りからVOC測定までの待機時間[s] 1bit 1s 換算 ver3 00593 }; 00594 00595 00596 //parameter 00597 struct cal_info calinfo; 00598 char reg_num; /* 選択中の登録CALナンバー */ 00599 //function 00600 void erace_calinfo(); 00601 void read_regnum(); 00602 void read_caliber(cal_info *cal, int num); 00603 void write_caliber_information(cal_info *cal, int num); 00604 00605 /******************************* 00606 00607 ver1.2.5 00608 convert code to Ampare 00609 00610 ******************************* 00611 float cul_ADC(short code){ 00612 00613 float analog_data; 00614 00615 analog_data = code * LSB_I / GAIN_I / TIME_INT * CAP ; 00616 00617 return( analog_data ); 00618 00619 } 00620 */ 00621 00622 /******************************* 00623 00624 set mode interruptin/degitalin 00625 00626 *******************************/ 00627 void set_pullup() 00628 { 00629 //シーケンサ受信割り込み 00630 pc.attach(&seq_serialrecive,RawSerial::RxIrq); 00631 00632 /*** ver3 ***/ 00633 sw_start.mode(PullUp); 00634 00635 for (int i = 0; i <= 5; i++){ 00636 seq_in[i].mode(PullUp); 00637 } 00638 00639 } 00640 /******************************* 00641 00642 Sequence Mode main screen 00643 00644 *******************************/ 00645 void seq() 00646 { 00647 char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte 00648 char crdata[6]; 00649 00650 gu_cls();//clear screen 00651 gu_fontsize(2); 00652 gu_print1("Sequenser Mode"); 00653 gu_Button_power_on();//show button 00654 00655 //seq_start.fall(&trigger);//スタート信号立下りで割込み 00656 00657 00658 //シーケンサのトリガ以外は受け付けない 00659 while(1) { 00660 /*** ver3 ***/ 00661 if( sw_start == 0 ) { 00662 //if ( seq_in[0] == 0 ){ 00663 trigger(); 00664 } 00665 00666 wait(0.3); 00667 00668 crdata[0] = 0; 00669 crdata[1] = 0; 00670 crdata[2] = 0; 00671 00672 i2c.read ((addr_gu + 0x01), crdata, 3, true); 00673 00674 if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。 00675 00676 //cswnum = crdata[1]; //スイッチ番号 00677 //cswdata = crdata[2];//ON/OFF情報 00678 00679 //gu-D タッチスイッチ読み出し動作設定 p49 00680 cmd_gu[0]= 0x1F; 00681 cmd_gu[1]= 0x4B; 00682 cmd_gu[2]= 0x18; 00683 cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除 00684 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 00685 00686 if ( crdata[1] == 7 ) { 00687 00688 gu_Button_power_off();//電源ボタンイメージ反転表示 00689 wait(0.5); 00690 00691 led_off();//LED全消灯 00692 00693 return;//この関数を抜ける 00694 00695 } //end if 00696 00697 /* ver 1.1.1 タッチパネルで測定開始を削除 00698 else { 00699 00700 meas_sub();//測定用サブ 00701 00702 00703 } //else if 00704 */ 00705 00706 //gu-D タッチスイッチ読み出し動作設定 p49 00707 cmd_gu[0]= 0x1F; 00708 cmd_gu[1]= 0x4B; 00709 cmd_gu[2]= 0x18; 00710 cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除 00711 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 00712 00713 wait(0.1); 00714 00715 i2c.read ((addr_gu + 0x01), crdata, 3, true); 00716 00717 }//if 00718 00719 }//while(1) 00720 } 00721 00722 00723 /******************************* 00724 00725 Strart Sequence 00726 00727 *******************************/ 00728 void trigger() 00729 { 00730 char meas_num;//測定個数 00731 char cal_num; //CAL選択ナンバー 00732 //char cmd_gu[2]; 00733 00734 gu_cls();//clear screen 00735 gu_fontsize(2); 00736 gu_print1("Sequenser Mode"); 00737 gu_fontsize(1); 00738 gu_cursor(0,3); 00739 gu_print1("start "); 00740 gu_cursor(128,0); 00741 gu_print1("CAL."); 00742 00743 00744 //シーケンサからCAL選択bit読込と表示 00745 /* 00746 cal_num = ( seq_cal_c << 2 ) + ( seq_cal_b << 1 ) + seq_cal_a; 00747 00748 cal_num = ( ~ cal_num ) & 0x7 ; //3bit入力の負論理 00749 */ 00750 00751 /*** v3 debug ***/ 00752 cal_num = 1; 00753 00754 //read caliber infomation from eeprom 00755 if( cal_num >= 1 && cal_num <= 6 ) { 00756 read_caliber(&calinfo, cal_num); 00757 gu_onebyte( cal_num + 0x30 );//CAL.No.確認用 00758 } else { 00759 gu_cls(); 00760 gu_fontsize(1); 00761 gu_print1("Cal number error"); 00762 wait(1); 00763 } 00764 00765 /*** v3 debag ***/ 00766 //meas_num = ( ~(( seq_kosuu_b << 1 ) + seq_kosuu_a )) & 0x3; //2bit負論理 00767 meas_num = ( ~(( seq_in[2] << 1 ) + seq_in[3] )) & 0x3; //2bit負論理 00768 /******/ 00769 00770 gu_cursor(128,1); 00771 gu_print1("n="); 00772 gu_onebyte( meas_num + 0x30 );//測定個数確認用 00773 00774 /*** ver3 ***/ 00775 //seq_busy = 1;//DegitalOut busy 00776 seq_out[4] = 1; 00777 00778 auto_meas( meas_num ); 00779 00780 //判定結果をシーケンサへ出力 00781 hantei( meas_num ); 00782 00783 wait(0.1); 00784 00785 //測定終了ver3 00786 //seq_busy = 0;//DegitalOut busy 00787 seq_out[4] = 1; 00788 00789 //終了表示 00790 gu_fontsize(1); 00791 gu_cursor(0,3); 00792 gu_print1("ready "); 00793 00794 } 00795 00796 /******************************************************************************* 00797 00798 EEPROMへCAL情報(struct)を保存 00799 00800 ver3. CAT24M01用に改修 2022.4.12 00801 00802 1page(256byte)につき1Cal分の品種情報を登録する。 00803 BYTE_ADDRESS上位9bitでpage指定。下位8bitはpage内アドレス。 00804 00805 argument 00806 num : CAL登録ナンバー(1~50) 00807 cal_info : 測定条件 00808 00809 *******************************************************************************/ 00810 void write_caliber_information(cal_info *cal, int num) 00811 { 00812 char cdata[29]; //1byte*x 00813 int adrs_init; 00814 int adrs; 00815 00816 adrs_init = ((adrs_calinfo[0] << 8 ) & 0xFF00 ) + (adrs_calinfo[1] & 0xFF); 00817 00818 //EEPROM書込み page指定 00819 00820 adrs = adrs_init + 0x100 * ( num - 1 ); 00821 cdata[0] = ( (adrs & 0xFF00) >> 8 ) & 0xFF; //address 15~8 bit 00822 cdata[1] = 0x00; //address 7~0 bit 00823 00824 //連続データ書込み BYTE_ADDRESS 下位8bit 0x00~0x0Bまで 00825 00826 cdata[2] = calinfo.vss_iop & 0xFF; //0x00 00827 cdata[3] = ( calinfo.vss_iop >> 8 ) & 0xFF; //0x01 00828 00829 cdata[4] = calinfo.vss_ocp & 0xFF; //0x02 00830 cdata[5] = ( calinfo.vss_ocp >> 8 ) & 0xFF; //0x03 00831 00832 cdata[6] = calinfo.vss_voc & 0xFF; //0x04 00833 cdata[7] = ( calinfo.vss_voc >> 8 ) & 0xFF; //0x05 00834 00835 cdata[8] = calinfo.low_limit_voc & 0xFF; //0x06 00836 cdata[9] = ( calinfo.low_limit_voc >> 8 ) & 0xFF; //0x07 00837 00838 cdata[10] = calinfo.low_limit_iop & 0xFF; //0x08 00839 cdata[11] = ( calinfo.low_limit_iop >> 8 ) & 0xFF; //0x09 00840 00841 cdata[12] = calinfo.low_limit_ocp & 0xFF; //0x0A 00842 cdata[13] = ( calinfo.low_limit_ocp >> 8 ) & 0xFF; //0x0B 00843 00844 cdata[14] = calinfo.up_limit_ocp & 0xFF; //0x0C 00845 cdata[15] = ( calinfo.up_limit_ocp >> 8 ) & 0xFF; //0x0D 00846 00847 cdata[16] = calinfo.low_limit_ocp_v & 0xFF; //0x0E 00848 cdata[17] = ( calinfo.low_limit_ocp_v >> 8 ) & 0xFF; //0x0F 00849 00850 cdata[18] = calinfo.up_limit_ocp_v & 0xFF; //0x10 00851 cdata[19] = ( calinfo.up_limit_ocp_v >> 8 ) & 0xFF; //0x11 00852 00853 cdata[20] = calinfo.wait_iop; //0x12 00854 cdata[21] = calinfo.wait_ocp; //0x13 00855 cdata[22] = calinfo.wait_voc; //0x14 00856 00857 cdata[23] = calinfo.low_limit_resistor / 10; //0x15 1bitあたり10ohm 00858 cdata[24] = calinfo.up_limit_resistor / 10; //0x16 1bitあたり10ohm 00859 00860 cdata[25] = calinfo.name[0]; //0x17 00861 cdata[26] = calinfo.name[1]; //0x18 00862 cdata[27] = calinfo.name[2]; //0x19 00863 cdata[28] = calinfo.name[3]; //0x1A 00864 00865 Soushin = i2c.write (eeprom_adrs, cdata, 29); 00866 00867 wait(0.2); //ver3 00868 00869 } 00870 /******************************************************************************* 00871 00872 EEPROMからCAL情報を 00873 読み出して構造体へ代入する 00874 00875 argument num:登録番号 00876 00877 ver3. CAT24M01用に改修 2022.4.12 00878 00879 *******************************************************************************/ 00880 void read_caliber(cal_info *cal, int num) 00881 { 00882 signed short sdata[16]; //CAL設定条件 00883 int i; 00884 int adrs_init; 00885 int adrs; 00886 char cdata[27]; 00887 00888 adrs_init = ((adrs_calinfo[0] << 8 ) & 0xFF00) + (adrs_calinfo[1] & 0x00FF); 00889 00890 adrs = adrs_init + 0x100 * ( num - 1 ); 00891 00892 wdata[0] = ( (adrs & 0xFF00) >> 8 ) & 0xFF; //address 15~8 bit 00893 wdata[1] = 0x00; //address 7~0 bit 00894 00895 Soushin = i2c.write (eeprom_adrs, wdata, 2,true); //not set stpo at end 00896 Jyushin = i2c.read ((eeprom_adrs + 0x01), cdata, 1); 00897 Jyushin = i2c.read ((eeprom_adrs + 0x01), (cdata + 1), 27);//read 27byte 00898 00899 /*** ver3.0.0 debug***/ 00900 if ( Jyushin != 0 ){ 00901 gu_fontsize(1); 00902 gu_cursor(0,2); 00903 gu_print1("not read cal information"); 00904 } 00905 00906 //データ合成 EEPROM_BYTE 0x00~0x11まで2byte結合 00907 for ( i = 0; i <= 8; i++ ) { 00908 sdata[i] = cdata[i*2] | ( cdata[ i*2 + 1 ] << 8 ); 00909 } 00910 00911 cal -> number = num; 00912 cal -> vss_iop = sdata[0]; //0x00 00913 cal -> vss_ocp = sdata[1]; //0x02 00914 cal -> vss_voc = sdata[2]; //0x04 00915 cal -> low_limit_voc = sdata[3]; //0x06 00916 cal -> low_limit_iop = sdata[4]; //0x08 00917 cal -> low_limit_ocp = sdata[5]; //0x0A 00918 cal -> up_limit_ocp = sdata[6]; //0x0C 00919 cal -> low_limit_ocp_v = sdata[7]; //0x0E 00920 cal -> up_limit_ocp_v = sdata[8]; //0x10 00921 00922 cal -> wait_iop = cdata[18]; //0x12 wait_iop 00923 cal -> wait_ocp = cdata[19]; //0x13 wait_ocp 00924 cal -> wait_voc = cdata[20]; //0x14 wait_voc 00925 00926 cal -> low_limit_resistor = cdata[21] * 10; //0x15 low_limit_resistor 00927 cal -> up_limit_resistor = cdata[22] * 10; //0x16 up_limit_resistor 00928 00929 cal -> name[0] = cdata[23]; //0x17 cal name 00930 cal -> name[1] = cdata[24]; //0x18 cal name 00931 cal -> name[2] = cdata[25]; //0x19 cal name 00932 cal -> name[3] = cdata[26]; //0x1A cal name 00933 00934 } 00935 /******************************************************************************* 00936 00937 EEPROMからCAL登録番号を読出し 00938 00939 ver3. CAT24M01用に改修 2022.4.11 00940 00941 *******************************************************************************/ 00942 void read_regnum() 00943 { 00944 00945 //Selective Read Timing 00946 00947 Soushin = i2c.write (eeprom_adrs, adrs_calnum, 2,true); //ver3 00948 00949 Jyushin = i2c.read ((eeprom_adrs + 0x01), rdata, 1);//read 1byte 00950 00951 reg_num = rdata[0]; 00952 } 00953 /******************************************************************************* 00954 00955 EEPROMからCAL登録情報全消去("0x00"書込み) 00956 00957 ver3. CAT24M01用に改修 2022.4.11 00958 0x00000 ~ 0x032FF を消去 00959 00960 *******************************************************************************/ 00961 void erace_calinfo() 00962 { 00963 int i; 00964 int j; 00965 00966 //init cal number ver3 00967 reg_num = 0x01; 00968 wdata[0] = adrs_calnum[0]; 00969 wdata[1] = adrs_calnum[1]; 00970 wdata[2] = reg_num; 00971 Soushin = i2c.write (eeprom_adrs, wdata, 3); 00972 00973 wait(0.2); 00974 00975 //write "0x00" by 256 byte 00976 00977 char wd[258]; //DATA 00978 int byte_adrs; //送信するBYTE ADDRESS I2C送信データの1,2BYTE目 00979 const static int cal_adrs = 0x0100; //CAL情報を保存する開始アドレス 00980 int page = 50; //page数 00981 00982 for ( j = 0; j < page; j++){ 00983 00984 byte_adrs = cal_adrs + j * 256; 00985 wd[0] = (byte_adrs & 0xFF00) >> 8; 00986 wd[1] = byte_adrs & 0xFF; 00987 for( i = 2; i <= 258; i++) { //write 1page(256byte) 00988 wd[i] = 0x00; 00989 } 00990 Soushin = i2c.write (eeprom_adrs, wd, 258); 00991 00992 wait(0.2); 00993 00994 } 00995 00996 } 00997 /******************************************************************************* 00998 00999 ADC(MCP3424) Configuration Register 01000 01001 ch : Channel Selection Bit 01002 00 = Select Channel 1 01003 01 = Select Channel 2 01004 10 = Select Channel 3 01005 11 = Select Channel 4 01006 01007 rate : Sample Rate Selection Bit 01008 00 = 240 SPS(12bits) 01009 01 = 60 SPS(14bits) 01010 10 = 15 SPS(16bits) 01011 11 = 3.75 SPS(18bits) 01012 01013 *******************************************************************************/ 01014 char adc_config(char ch, char rate) 01015 { 01016 char confreg; //Configuration Register 1byte 01017 01018 char rdy = 0; //Ready Bit 01019 char cm = 1; //Conversion Mode Bit 01020 char gain = 0; //PGA Gain Selection Bits 01021 01022 confreg = (( rdy & 0x1 ) << 7 ) + (( ch & 0x3) << 5 ) + (( cm & 0x1 ) << 4) + (( rate & 0x3 ) << 2) + ( gain & 0x3 ) ; 01023 01024 return( confreg ); 01025 } 01026 /******************************************************************************* 01027 01028 ADC(MCP3424) Configuration Register 01029 電流測定チャンネルの選択 01030 char ch : 1~4ch 01031 01032 *******************************************************************************/ 01033 void select_ich(char ch) 01034 { 01035 char com; 01036 01037 switch ( ch ) { 01038 case 0: 01039 com = adc_config( 0, 1 );//ADC3_ch1選択 14bits 01040 i2c.write( addr_ADC3, &com, 1 ); 01041 break; 01042 case 1: 01043 com = adc_config( 1, 1 );//ADC3_ch2選択 14bits 01044 i2c.write( addr_ADC3, &com, 1 ); 01045 break; 01046 case 2: 01047 com = adc_config( 0, 1 );//ADC4_ch1選択 14bits 01048 i2c.write( addr_ADC4, &com, 1 ); 01049 break; 01050 case 3: 01051 com = adc_config( 1, 1 );//ADC4_ch2選択 14bits 01052 i2c.write( addr_ADC4, &com, 1 ); 01053 break; 01054 } 01055 } 01056 /******************************************************************************* 01057 01058 ADC(MCP3424) 01059 指定addressから2byte読込み 01060 01061 ver3.0.0 20ms間隔の5回平均 01062 01063 *******************************************************************************/ 01064 short read_adc(char addr)//指定addressから2byte読込み 01065 { 01066 char cdata[2];//1byte 01067 short sdata;//2byte 01068 //short kekka; 01069 //short goukei; 01070 //int bosu = 5; 01071 01072 i2c.read( addr + 0x01, cdata, 2); 01073 01074 /* 01075 for( int i = 0; i < bosu; i++){ 01076 i2c.read( addr + 0x01, cdata, 2); 01077 01078 //connect 2byte 01079 kekka = cdata[0] & 0xFF; 01080 kekka = ( sdata << 8 ) | cdata[1]; 01081 01082 goukei += kekka; 01083 01084 wait(0.1); 01085 01086 } 01087 01088 sdata = goukei / bosu; 01089 */ 01090 01091 i2c.read( addr + 0x01, cdata, 2); 01092 01093 //connect 2byte 01094 sdata = cdata[0] & 0xFF; 01095 sdata = ( sdata << 8 ) | cdata[1]; 01096 01097 return ( sdata ); 01098 } 01099 /******************************************************************************* 01100 01101 AUTO/SEQ Mode 01102 01103 ワンショットタイマー発生イベント 01104 01105 For Current measurement 01106 a recurring interrupt to repeatedly call a function at a specified rate. 01107 01108 *******************************************************************************/ 01109 void flip_ch1() 01110 { 01111 short sdata; 01112 01113 sdata = read_adc( addr_ADC3 ); 01114 01115 I[0] = sdata * 5 * 0.25; 01116 01117 //次の測定chへ切替 01118 select_ich(1); 01119 } 01120 01121 void flip_ch2() 01122 { 01123 short sdata; 01124 01125 sdata = read_adc( addr_ADC3 ); 01126 01127 I[1] = sdata * 5 * 0.25; 01128 01129 //次の測定chへ切替 01130 select_ich(2); 01131 } 01132 01133 void flip_ch3() 01134 { 01135 short sdata; 01136 01137 sdata = read_adc( addr_ADC4 ); 01138 01139 I[2] = sdata * 5 * 0.25; 01140 01141 //次の測定chへ切替 01142 select_ich(3); 01143 } 01144 01145 void flip_ch4() 01146 { 01147 short sdata; 01148 01149 sdata = read_adc( addr_ADC4 ); 01150 01151 I[3] = sdata * 5 * 0.25; 01152 01153 //次の測定chへ切替 無し 01154 } 01155 01156 /******************************************************************************* 01157 01158 Manual Mode 01159 01160 繰り返しタイマー発生イベント 01161 01162 For Current measurement 01163 a recurring interrupt to repeatedly call a function at a specified rate. 01164 01165 *******************************************************************************/ 01166 void flip() 01167 { 01168 short sdata; //_2byte reading data of ADC 01169 float fdata; // ver1.1.4 01170 01171 switch ( ch_num ) { 01172 case 0: 01173 case 1: 01174 sdata = read_adc( addr_ADC3 ); 01175 break; 01176 case 2: 01177 case 3: 01178 sdata = read_adc( addr_ADC4 ); 01179 break; 01180 } 01181 01182 //sdata = sdata * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv 01183 /*ver1.1.4*/ 01184 fdata = sdata * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv 01185 01186 gu_cursor(0,4); 01187 gu_print1(" "); 01188 /*ver1.1.4*/ 01189 gu_putdeci(&fdata); 01190 //gu_putdeci(&sdata); 01191 01192 houden[ ch_num ] = 1; //Discharge 01193 01194 wait(time_discharge); //Discharge time 01195 01196 /*** ver3.0.0 ***/ 01197 01198 //電圧測定 01199 sdata = meas_voltage( ch_num ) * -1 ; 01200 gu_fontsize(2); 01201 gu_cursor(108,4); 01202 gu_putdeck(&sdata); 01203 gu_print1("V"); 01204 01205 //抵抗測定 01206 sdata = meas_resistor( ch_num ); 01207 gu_fontsize(2); 01208 gu_cursor(192,4); 01209 display_resistor( sdata ); //抵抗値表示サブ 01210 01211 /*****************/ 01212 01213 houden[ ch_num ] = 0; //charging 01214 01215 } 01216 /********************************* 01217 Manual Mode 01218 initial screen 01219 *********************************/ 01220 void manual_int_hyouji() 01221 { 01222 01223 /* 画面表示 */ 01224 gu_cls(); 01225 gu_fontsize(2); //change fontsize 01226 gu_fontWidth(Proportional1); 01227 gu_print1("Manual Mode"); 01228 01229 gu_cursor(0, 2); 01230 gu_print1("CH."); 01231 gu_cursor(40, 14); 01232 gu_print1("vss"); 01233 gu_cursor(192, 14); 01234 gu_print1("ch."); 01235 /* 01236 gu_cursor(128, 14); 01237 gu_print1("slct ch."); 01238 */ 01239 01240 //操作ボタン配置 01241 gu_Button_power_on();//メニューへ戻る 01242 gu_button_up(27);//印加電圧増加 01243 gu_button_down(28);//印加電圧減少 01244 gu_button_up(32);//ch切替 01245 //gu_button_down(32);//ch切替 01246 01247 //Show Reset button(LEFT) 01248 gu_set_button(25,"R"); 01249 01250 } 01251 /******************************************************************************* 01252 01253 Manual Mode (Main) 01254 01255 *******************************************************************************/ 01256 void manual() 01257 { 01258 01259 char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F 01260 char cswdata; // 0x00 or 0x01 01261 char crdata[3]; 01262 char *pcswnum = &cswnum; 01263 char *pcswdata = &cswdata; 01264 int i; 01265 int j; 01266 float interval;//繰り返し測定間隔(s) <- 積分時間と、繰り返し割込みサブ中のwait(放電時間)も足す 01267 short vss; 01268 short sdata; 01269 int r_flag; 01270 float ima; 01271 short ssdata; 01272 01273 ch_num = 0; //初期電流測定CH. 01274 01275 interval = time_integral + time_discharge ;//繰り返し割込みの間隔設定 01276 flipper.attach(&flip, interval); 01277 01278 read_regnum();//CAL登録No.読込 01279 read_caliber(&calinfo, reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入 01280 01281 /* 初期表示 */ 01282 manual_int_hyouji(); 01283 //選択測定チャンネルの表示 01284 gu_fontsize(2); //change fontsize 01285 gu_cursor(24, 2); 01286 wdata[0] = ( ch_num + 1 ) + 0x30; 01287 i2c.write( addr_gu, wdata, 1); 01288 01289 //初期測定設定 01290 //set range 01291 range[0] = 1;//ch.1 10uA測定レンジ 01292 //select channel 01293 wdata[0] = adc_config( 0, 1 );//ADC3_ch1選択 14bits 01294 i2c.write( addr_ADC3, wdata, 1 ); 01295 01296 /*** 電源印加 ***/ 01297 01298 vss = calinfo.vss_iop; 01299 01300 if ( tenken == true ){ 01301 for ( i = 0; i <= (number_of_channels - 1); i++) { 01302 dac_out(0,i); 01303 } 01304 dac_out( vss,0); //Vss設定 DAC ch.1 ver3.0.0 01305 } else { 01306 //apply Vss to all channel 01307 for ( i = 0; i <= (number_of_channels - 1); i++) { 01308 dac_out( vss,i); //Vss設定 DAC 01309 } 01310 } 01311 01312 /**************/ 01313 01314 gu_cursor(0,8); 01315 gu_print1("Vss "); 01316 01317 gu_cursor(64,8); 01318 sdata = -1 * vss; 01319 gu_putdeck( &sdata ); 01320 gu_print1("V"); 01321 01322 while(1) { 01323 01324 crdata[0] = 0; 01325 crdata[1] = 0; 01326 crdata[2] = 0; 01327 01328 //タッチパネルスイッチ読込 01329 Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true); 01330 01331 if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。 01332 *pcswnum = crdata[1]; //スイッチ番号 01333 *pcswdata = crdata[2];//ON/OFF情報 01334 01335 if (cswdata == 0x01) { //タッチしたならば 01336 switch( cswnum ) { //SWの番号(位置) 01337 01338 case 26://SW27 01339 //gu_reverse(0x01); //gu_リバース指定 01340 //gu_button_up(27); 01341 01342 if ( vss < 4500 ) { 01343 vss = vss + 100; 01344 } 01345 01346 if ( tenken == true ){ 01347 dac_out( vss,ch_num); 01348 } else { 01349 //apply Vss to all channel 01350 for ( i = 0; i <= (number_of_channels - 1); i++) { 01351 dac_out( vss,i); //Vss設定 DAC 01352 } 01353 } 01354 01355 gu_reverse(0x00); 01356 gu_cursor(64,8); 01357 sdata = -1 * vss; 01358 gu_putdeck( &sdata ); 01359 gu_print1("V"); 01360 01361 //gu_button_up(27); 01362 01363 //wait(0.1); 01364 01365 break; 01366 01367 case 27://SW28 01368 //gu_reverse(0x01); //gu_リバース指定 01369 //gu_button_down(28);//印加電圧減少 01370 01371 if ( vss >= 100 ) { 01372 vss = vss - 100; 01373 } 01374 01375 if ( tenken == true ){ 01376 dac_out( vss,ch_num); 01377 } else { 01378 //apply Vss to all channel 01379 for ( i = 0; i <= (number_of_channels - 1); i++) { 01380 dac_out( vss,i); //Vss設定 DAC 01381 } 01382 } 01383 01384 //gu_reverse(0x00); //gu_リバース指定 01385 gu_cursor(64,8); 01386 sdata = -1 * vss; 01387 gu_putdeck( &sdata ); 01388 gu_print1("V"); 01389 01390 //gu_button_down(28);//印加電圧減少 01391 01392 //wait(0.1); 01393 01394 break; 01395 01396 case 0x07 ://Exit 01397 01398 gu_Button_power_off();//電源ボタンイメージ反転表示 01399 01400 //割り込み停止 01401 flipper.detach(); 01402 01403 for( i = 0; i <= 3; i++) { 01404 houden[i] = 1;//discharge 01405 } 01406 01407 wait( time_discharge ); 01408 //set measuring range 01409 for( i = 0; i <= 3; i++) { 01410 range[i] = 0;//range 1mA 01411 houden[i] = 0;//not discharge 01412 } 01413 01414 /*** ver 3.0.0 ****************************************/ 01415 for ( i = 0; i <= (number_of_channels - 1); i++) { 01416 dac_out(0,i); //Vss設定 DAC 01417 } 01418 /******************************************************/ 01419 01420 wait(0.2); 01421 01422 for ( i = 0; i <= 15; i++) 01423 io[i] = 0; //全てのio"L" 01424 01425 return;//この関数を抜ける 01426 01427 case 0x18 ://sw25 reset DUT 01428 01429 //gu_リバース指定 01430 gu_reverse(0x01); 01431 //Show Reset button(Left) 01432 gu_set_button(25,"R"); 01433 01434 wait(0.1); 01435 01436 gu_reverse(0x00); //gu_リバース解除 01437 gu_set_button(25,"R"); //Show Reset button(Left) 01438 01439 io_reset[ch_num] = 1;//ver3.0.0 R="H" 01440 01441 //set measuring range ver1.1.0 01442 for( i = 0; i <= 3; i++) 01443 range[i] = 0;//range 1mA 01444 01445 r_flag = 1; 01446 01447 //割り込み停止 電流測定用タイマー停止 01448 flipper.detach(); 01449 01450 break; 01451 01452 case 31 ://sw32 CH選択 01453 01454 //gu_reverse(0x01);//gu_リバース指定 01455 //gu_button_up(32); 01456 //gu_reverse(0x00);//gu_リバース解除 01457 01458 if ( ch_num < ( number_of_channels - 1 )) { 01459 ch_num = ch_num + 1; 01460 } else { 01461 ch_num = 0; 01462 } //ver1.1.0 01463 01464 select_ich(ch_num);//ADC測定CHの変更 01465 01466 //set measuring range 01467 for( i = 0; i <= 3; i++) 01468 range[i] = 0; //range 1mA 01469 01470 range[ch_num] = 1; //range 10uA 01471 01472 if ( tenken == true ){ 01473 for ( i = 0; i <= (number_of_channels - 1); i++) { 01474 dac_out(0,i); //Vss設定 DAC 01475 } 01476 dac_out( vss,ch_num); 01477 } else { 01478 //apply Vss to all channel 01479 for ( i = 0; i <= (number_of_channels - 1); i++) { 01480 dac_out( vss,i); //Vss設定 DAC 01481 } 01482 } 01483 01484 //選択測定チャンネルの表示 01485 gu_cursor(24, 2); 01486 wdata[0] = ( ch_num + 1 ) + 0x30; 01487 i2c.write( addr_gu, wdata, 1); 01488 01489 //gu_button_up(32); 01490 01491 wait(0.1); 01492 01493 break; 01494 01495 } //switch 01496 Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true); 01497 01498 }//if 01499 }//if 01500 01501 //ver1.1.0 0.1s*10(jの値)=1s待機後(プラスリレー制御時間)に電流測定用タイマー始動 01502 if ( j >= 10 ) { 01503 io_reset[ch_num] = 0; // R = "OPEN" 01504 range[ ch_num ] = 1; //range 10uA 01505 r_flag = 0; 01506 j = 0; 01507 flipper.attach(&flip, interval);//割込み開始 01508 } 01509 01510 if ( r_flag == 1 ) { 01511 j = j + 1; 01512 01513 //R=Hの時の電流測定(1ma renge) 01514 select_ich( ch_num ); 01515 ssdata = read_adc( addr_ADC3 ); 01516 ima = ssdata * 5 * 0.25; 01517 01518 gu_cursor(0,4); 01519 gu_fontsize(2); 01520 gu_print1(" "); 01521 gu_putdeci_mA(&ima); 01522 } 01523 01524 /* 01525 //電圧測定 01526 sdata = meas_voltage( ch_num ) * -1 ; 01527 gu_fontsize(2); 01528 gu_cursor(108,4); 01529 gu_putdeck(&sdata); 01530 gu_print1("V"); 01531 01532 //抵抗測定 01533 sdata = meas_resistor( ch_num ); 01534 gu_fontsize(2); 01535 gu_cursor(192,4); 01536 display_resistor( sdata ); //抵抗値表示サブ 01537 */ 01538 01539 wait( 0.1 ); 01540 01541 }//While 01542 } 01543 01544 /***************************** 01545 01546 I2C General Call 01547 01548 *****************************/ 01549 void general_call(char com) 01550 { 01551 char cmd[1]; 01552 01553 cmd[0]= com; 01554 i2c.write(0x00, cmd, 1); //General Call 01555 } 01556 /******************************************************************************* 01557 01558 MAIN 01559 01560 *******************************************************************************/ 01561 int main(void) 01562 { 01563 while(1) { 01564 01565 wait(0.2); 01566 01567 //ver3.0.0 01568 //uart.format(7, Serial::Even, 1); 01569 01570 set_pullup(); 01571 01572 general_call(0x06); //ADC power on reset 01573 01574 dac_init(); //DAC 初期化 01575 01576 gu_initial();//初期画面へ 01577 //utility(); 01578 } 01579 } //main end 01580 01581 void gu_initial() 01582 { 01583 char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte0 01584 //char *pcmd = cmd_gu; 01585 char clumi; //輝度設定用変数 01h<=n<=08h 01586 char* pclumi = &clumi; //ポインタの定義 01587 char crdata[3]; 01588 char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F 01589 char cswdata; // 0x00 or 0x01 01590 char *pcswnum = &cswnum; 01591 char *pcswdata = &cswdata; 01592 char csyoudo[4]; 01593 int i; 01594 float duty_pwm; 01595 01596 for ( i = 0; i <= ( number_of_channels - 1 ); i++) { 01597 leds[i].period_us(period_pwm); //Set tha PWM period(us) 01598 } 01599 01600 duty_pwm = 0; //表示器立ち上がるまでLEDOFF 01601 01602 for( i = 0; i <= 3; i++) { 01603 leds[i].write(duty_pwm);//Set Duty 01604 } 01605 01606 i2c.frequency(100000); //gu_D I2Cクロックレート(HZ) 400khz以下 01607 01608 cmd_gu[0]= 0x1B; 01609 cmd_gu[1]= 0x40; 01610 i2c.write(addr_gu, cmd_gu, 2); //gu-D ESC 初期化 01611 wait(0.2); 01612 01613 //メモリ00h番地(GU_D輝度設定データ)読み出し 01614 //wdata[0] = 0x00; 01615 wdata[0] = adrs_kido[0]; 01616 wdata[1] = adrs_kido[1]; 01617 Soushin = i2c.write (eeprom_adrs, wdata, 2,true); //読込先頭アドレス指定 ReStart 01618 Jyushin = i2c.read ((eeprom_adrs + 0x01), rdata, 1);//read 1byte 01619 *pclumi = rdata[0]; 01620 //輝度設定更新 01621 if(*pclumi==0x00 || *pclumi > 0x08) *pclumi=0x05; 01622 gu_luminance(pclumi); 01623 01624 gu_fontsize(2); //change fontsize 01625 //ver1.2.3 01626 //gu_print1("ILF Iop/Voc/O.C.P/R"); 01627 gu_print1("ILF mode selectiion"); 01628 //upto 01629 //gu_CRLF();//CR+LF 01630 //gu_print1("Settings"); 01631 gu_fontsize(1); 01632 gu_cursor(192,1); 01633 gu_print1("ver"); 01634 gu_onebyte( version_major + 0x30 ); 01635 gu_print1("."); 01636 gu_onebyte( version_minor + 0x30 ); 01637 gu_print1("."); 01638 gu_onebyte( version_build + 0x30 ); 01639 01640 gu_touchPara(0,touch);//タッチ感度 00h~07h 01641 01642 //MODE選択用ボタンの表示 01643 gu_set_button(9,""); 01644 gu_set_button(17,""); 01645 gu_set_button(25,""); 01646 gu_set_button(13,""); 01647 gu_set_button(21,""); 01648 gu_set_button(29,""); 01649 //LED Brighness 01650 gu_fontsize(2); 01651 gu_cursor(36,32/8); 01652 gu_print1("CAL"); 01653 gu_cursor(36,64/8); 01654 gu_print1("LUX"); 01655 //gu_cursor(36,80/8); 01656 //gu_print1("illumi"); 01657 //Display Brightness 01658 gu_cursor(36,96/8); 01659 gu_print1("Utility"); 01660 //Auto MODE 01661 gu_cursor(164,32/8); 01662 gu_print1("Auto"); 01663 //Manual Mode 01664 gu_cursor(164,64/8); 01665 gu_print1("Manual"); 01666 //Sequenser Mode 01667 gu_cursor(164,96/8); 01668 gu_print1("SEQ"); 01669 01670 /********************** 01671 SDカードファイルオープン 01672 **********************/ 01673 01674 mkdir("/sd/mydir", 0777); 01675 01676 FILE *fp = fopen("/sd/mydir/iop.csv", "ab+");//ディレクトリとファイル名の指定 01677 01678 if(fp == NULL) { 01679 /*ver1.1.3 01680 gu_fontsize(1); 01681 gu_cursor(0,2); 01682 gu_print1("Could not open file for SD card"); 01683 */ 01684 } else { 01685 fprintf(fp, "NewData R IOP OCP VOC"); 01686 fprintf(fp, "\n"); 01687 fclose(fp); 01688 } 01689 /********************** 01690 LED照度初期設定 01691 **********************/ 01692 read_syoudo( csyoudo ); 01693 01694 //gu-D タッチスイッチ読み出し動作設定 p49 01695 cmd_gu[0]= 0x1F; 01696 cmd_gu[1]= 0x4B; 01697 cmd_gu[2]= 0x18; 01698 cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2 01699 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 01700 01701 while(1) { 01702 01703 //タッチスイッチ読み出し 01704 i2c.read ((addr_gu + 0x01), crdata, 3, true); 01705 01706 if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。 01707 *pcswnum = crdata[1]; //スイッチ番号 01708 *pcswdata = crdata[2];//ON/OFF情報 01709 01710 if (cswdata == 0x01) { //タッチしたならば 01711 switch( cswnum ) { //SWの番号(位置) 01712 01713 case 0x08 ://SW9 CAL登録画面 01714 //gu_リバース指定 01715 gu_reverse(0x01); 01716 //Show Button 01717 gu_set_button(9,""); 01718 wait(0.1); 01719 //gu_リバース解除 01720 gu_reverse(0x00); 01721 01722 select_cal();//CAL選択画面へ移動 01723 01724 return; 01725 01726 case 0x10 ://SW17 01727 //gu_リバース指定 01728 gu_reverse(0x01); 01729 //Show Button 01730 gu_set_button(17,""); 01731 wait(0.1); 01732 //gu_リバース解除 01733 gu_reverse(0x00); 01734 01735 adjust_illumination();//LED照度調整へ移動 01736 01737 return; 01738 01739 case 0x18 ://SW25 01740 //gu_リバース指定 01741 gu_reverse(0x01); 01742 //Show Button 01743 gu_set_button(25,""); 01744 wait(0.1); 01745 //gu_リバース解除 01746 gu_reverse(0x00); 01747 01748 utility();//画面輝度調整へ移動 01749 01750 return; 01751 01752 case 0x0C ://SW13 自動測定モード 01753 //gu_リバース指定 01754 gu_reverse(0x01); 01755 //Show Button 01756 gu_set_button(13,""); 01757 wait(0.1); 01758 //gu_リバース解除 01759 gu_reverse(0x00); 01760 01761 auto_run(); 01762 01763 return; 01764 01765 case 0x14 ://SW21 手動測定モード 01766 //gu_リバース指定 01767 gu_reverse(0x01); 01768 //Show Button 01769 gu_set_button(21,""); 01770 wait(0.1); 01771 //gu_リバース解除 01772 gu_reverse(0x00); 01773 01774 manual(); 01775 01776 return; 01777 01778 case 0x1C ://SW29 シーケンサ制御モード 01779 //gu_リバース指定 01780 gu_reverse(0x01); 01781 //Show Button 01782 gu_set_button(29,""); 01783 wait(0.1); 01784 //gu_リバース解除 01785 gu_reverse(0x00); 01786 01787 seq(); 01788 01789 return; 01790 01791 } //switch 01792 01793 }//if(cswdata == 0x01) { 01794 } //if(crdata[0] == 0x11 ) { 01795 01796 wait(0.1);//タッチスイッチ入力読み出し間隔 01797 01798 } //while(1) { 01799 01800 } 01801 01802 /******************************************************************************* 01803 01804 CAL選択画面 sub 01805 01806 ver3.0.0 CAL名を追加 01807 01808 *******************************************************************************/ 01809 void show_info(int n) 01810 { 01811 short sdata[6]; 01812 char cl[2]; 01813 01814 read_caliber(&calinfo,n); 01815 01816 //読出したCAL情報の表示 01817 gu_fontsize(1); 01818 gu_cursor(0,2); 01819 gu_print1(" "); 01820 gu_fontsize(1); 01821 gu_cursor(0,2); 01822 gu_print1("No."); 01823 01824 cl[1] = calinfo.number % 10 + '0'; 01825 cl[0] = calinfo.number /10 + '0'; 01826 01827 gu_print(cl); 01828 //gu_putdec(&calinfo.number); 01829 01830 gu_print1(" CAL."); 01831 //gu_print1(calinfo.name); 01832 i2c.write(addr_gu, calinfo.name, 4); //4byte ascii code 01833 01834 gu_cursor(0,3); 01835 gu_print1("Vss(Iop) ="); 01836 sdata[0] = -1 * calinfo.vss_iop; 01837 gu_putdeck(&sdata[0]); 01838 gu_print1("V "); 01839 gu_cursor(0,4); 01840 gu_print1("Vss(ocp) ="); 01841 sdata[1] = -1 * calinfo.vss_ocp; 01842 gu_putdeck(&sdata[1]); 01843 gu_print1("V "); 01844 gu_cursor(0,5); 01845 gu_print1("Vss(Voc) ="); 01846 sdata[2] = -1 * calinfo.vss_voc; 01847 gu_putdeck(&sdata[2]); 01848 gu_print1("V "); 01849 } 01850 /******************************************************************************* 01851 01852 GU-D CAL選択スイッチボタン再表示 サブ 01853 01854 画面上にあるスイッチの配置 01855 01856 01,02,03,04,05,06,07,08, 01857 09,10,11,12,13,14,15,16, 01858 17,18,19,20,21,22,23,24, 01859 25,26,27,28,29,30,31,32, 01860 01861 *******************************************************************************/ 01862 void redraw_sw(int dig, char sw_num){ 01863 01864 char str_num[3]; // ascii code 01865 char sw; // GU-D Swich Number 01866 01867 str_num[2] = 0; // null終端 01868 01869 if ( dig >= 1 ){ 01870 str_num[0] = dig + 0x30; //convert ASCII 10の位 01871 } else { 01872 str_num[0] = 0x20; //space 01873 } 01874 01875 for ( sw = 17; sw <= 29; sw++ ){ 01876 01877 if ( sw >= 22 && sw <= 24 ){ 01878 continue; 01879 } 01880 01881 if ( sw <= 21 ){ 01882 str_num[1] = ( sw - 16 ) + 0x30; 01883 } else if ( sw >= 24 && sw <= 28 ){ 01884 str_num[1] = ( sw - 19 ) + 0x30; 01885 } else if ( sw == 29) { 01886 str_num[0] = ( dig + 1 )+ 0x30; 01887 str_num[1] = 0x30; 01888 } 01889 01890 if ( sw_num != sw ){ 01891 gu_set_button(sw,str_num); 01892 } else { 01893 gu_reverse(0x01); //gu_リバース指定 01894 gu_set_button(sw,str_num); 01895 gu_reverse(0x00); //gu_リバース解除 01896 } 01897 }//for 01898 } 01899 01900 /******************************************************************************* 01901 01902 CAL選択画面 #CAL登録画面 01903 01904 画面上にあるスイッチの配置 01905 01906 01,02,03,04,05,06,07,08, 01907 09,10,11,12,13,14,15,16, 01908 17,18,19,20,21,22,23,24, 01909 25,26,27,28,29,30,31,32, 01910 01911 *******************************************************************************/ 01912 void select_cal() 01913 { 01914 char crdata[3]; 01915 char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F 01916 char cswdata; // 0x00 or 0x01 01917 char *pcswnum = &cswnum; 01918 char *pcswdata = &cswdata; 01919 char calnum; //選択したCALナンバー 01920 01921 int digit = 0 ; //CAL番号 10の位の値 0~4 01922 bool redraw ; //再描画 01923 01924 read_regnum();//EEPROMに保存した選択CAL_NO.の読み出し 01925 01926 while(1){//ver3 01927 01928 redraw = false; 01929 01930 calnum = 0; //initial 01931 01932 gu_cls(); //GU-D 画面クリア 01933 01934 show_info(reg_num); 01935 01936 gu_fontsize(2); //change fontsize 01937 gu_cursor(0,0); 01938 //ver3.0.0 01939 //gu_print1("Select CAL."); 01940 gu_print1("CONFIG"); 01941 01942 //Set Button init ver3.0.0 01943 redraw_sw(calnum,0); 01944 01945 gu_set_button_font1(7,"slct"); 01946 gu_set_button_font1(8,"set"); 01947 01948 gu_button_up(24); 01949 gu_button_down(32); 01950 01951 while(1) { 01952 //タッチスイッチ読み出し 01953 i2c.read ((addr_gu + 0x01), crdata, 3, true); 01954 01955 if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。 01956 *pcswnum = crdata[1]; //スイッチ番号 01957 *pcswdata = crdata[2];//ON/OFF情報 01958 01959 if (cswdata == 0x01) { //タッチしたならば 01960 switch( cswnum ) { //SWの番号(位置) 01961 01962 case 23: //SW24 page up 01963 01964 if ( digit <= 3 ){ 01965 digit += 1; 01966 } else if ( digit == 4 ){ 01967 digit = 0; 01968 } 01969 01970 redraw_sw(digit,0); 01971 01972 //calnum = digit * 10 + 1; 01973 //show_info(calnum); 01974 01975 break; 01976 01977 case 31: //SW32 page down 01978 01979 if ( digit >= 1 ){ 01980 digit -= 1; 01981 } else if ( digit == 0 ) { 01982 digit = 4; 01983 } 01984 01985 redraw_sw(digit,0); 01986 01987 //calnum = digit * 10 + 1; 01988 //show_info(calnum); 01989 01990 break; 01991 01992 case 16: //SW17 01993 case 17: //SW18 01994 case 18: //SW19 01995 case 19: //SW20 01996 case 20: //SW21 01997 01998 calnum = cswnum - 15 + (digit*10); 01999 02000 redraw_sw(digit,cswnum + 1); 02001 02002 show_info(calnum); 02003 02004 break; 02005 02006 case 24: //SW25 02007 case 25: //SW26 02008 case 26: 02009 case 27: 02010 02011 02012 calnum = cswnum - 18 + (digit*10); 02013 02014 redraw_sw(digit,cswnum + 1); 02015 02016 show_info(calnum); 02017 02018 break; 02019 02020 case 28: //SW29 02021 02022 calnum = ((digit + 1 )*10); 02023 02024 redraw_sw(digit,cswnum + 1); 02025 02026 show_info(calnum); 02027 02028 break; 02029 02030 case 0x06: //SW7 ”slct"(CAL選択)ボタン 02031 02032 if ( calnum >= 1 && calnum <=6 ) { 02033 reg_num = calnum; 02034 02035 //ver3 EEPROM書込み Byte Write 02036 wdata[0] = adrs_calnum[0]; //byte address a15~8 02037 wdata[1] = adrs_calnum[1]; //byte address a7~a0 02038 wdata[2] = reg_num; 02039 Soushin = i2c.write (eeprom_adrs, wdata, 3); //send stop at end default value is false. 02040 02041 //GU-D 02042 gu_reverse(0x01); //gu_リバース指定 02043 gu_set_button_font1(7,"slct"); 02044 wait(0.2); 02045 gu_reverse(0x00); //gu_リバース解除 02046 02047 read_caliber(&calinfo,reg_num); 02048 02049 return; 02050 02051 } else if( calnum == 0 ) { 02052 //CALNo.選択しなければ、何もしないでこのサブを抜ける 02053 gu_reverse(0x01); //gu_リバース指定 02054 gu_set_button_font1(7,"slct"); 02055 wait(0.2); 02056 gu_reverse(0x00); //gu_リバース解除 02057 return; 02058 } 02059 02060 break; 02061 02062 case 0x07: //SW8 "set"ボタン 02063 02064 if ( calnum >= 1 && calnum <= 50 ) { 02065 gu_reverse(0x01); //gu_リバース指定 02066 gu_set_button_font1(8,"set"); 02067 wait(0.2); 02068 gu_reverse(0x00); //gu_リバース解除 02069 02070 setup_cal_information(calnum);//CAL情報登録画面へ 02071 02072 //return; 02073 redraw = true; 02074 } 02075 break; 02076 02077 } //switch 02078 02079 if (redraw){ 02080 break; //exit while 02081 } 02082 02083 }//if(cswdata == 0x01) { 02084 } //if(crdata[0] == 0x11 ) { 02085 wait(0.1);//タッチスイッチ入力読み出し間隔 02086 } //while(1) 02087 02088 } 02089 } 02090 02091 /******************************************************************************* 02092 02093 CAL情報登録画面 サブルーチン 02094 項目の表示 02095 02096 ver3.0.0 22.4.12 02097 02098 x=0 : vss_iop[V] 02099 x=1 : vss_ocp[V] 02100 x=2 : vss_voc[V] 02101 x=3 : low_limit_voc[V] 02102 x=4 : low_limit_iop[uA] 02103 x=5 : low_limit_ocp[uA] 02104 x=6 : up_limit_ocp[uA] 02105 x=7 : low_limit_ocp_v[V] 02106 x=8 : up_limit_ocp_v[V] 02107 x=9 : wait_iop[s] 02108 x=10 : wait_ocp[s] 02109 x=11 : wait_voc[s] 02110 x=12 : low_limit_resistor[Ω] 02111 x=13 : up_limit_resistor[Ω] 02112 x=14 : cal_name(ASCII) 02113 02114 /1.2.1 02115 x=0 : vss_iop[V] 02116 x=1 : vss_ocp[V] 02117 x=2 : vss_voc[V] 02118 x=3 : low_limit_voc[V] 02119 x=4 : low_limit_iop[uA] 02120 x=5 : low_limit_ocp[uA] 02121 x=6 : up_limit_ocp[uA] ver1.2.2 追加 02122 x=7 : wait_iop[s] 02123 x=8 : wait_ocp[s] 02124 x=9 : low_limit_resistor[Ω] 02125 x=10 : up_limit_resistor[Ω] 02126 / 02127 02128 *******************************************************************************/ 02129 void hyouji_cal_param(int x) 02130 { 02131 gu_fontsize(2); 02132 gu_cursor(0,4); 02133 gu_print1(" "); 02134 gu_cursor(0,6); 02135 gu_print1(" "); 02136 02137 gu_fontsize(2); 02138 gu_cursor(zahyou_para1[0],zahyou_para1[1]); 02139 gu_print1(cpara1[x]); 02140 gu_fontsize(2); 02141 gu_cursor(zahyou_para2[0],zahyou_para2[1]); 02142 gu_print1(cpara2[x]); 02143 02144 gu_fontsize(2); 02145 gu_cursor(zahyou_unit[0],zahyou_unit[1]); 02146 02147 if ( x == 12 || x == 13 ){ 02148 wdata[0] = 0xEA; //Ω 02149 i2c.write( addr_gu, wdata, 1); 02150 } else { 02151 gu_print1(cunit[x]); 02152 } 02153 02154 } 02155 02156 /******************************************************************************* 02157 02158 CAL情報登録画面 sub 02159 02160 para kind of parameter 02161 idata data value 02162 inc add number ex)0x64 0x0A 0x01 02163 02164 *******************************************************************************/ 02165 /*** 加算 ***/ 02166 void increase_param(int para, signed short *sdata, short inc) 02167 { 02168 switch ( para ) { //パラメータの項目によって上限値異なる 02169 case 0://vss_iop 02170 case 1://vss_ocp 02171 case 2://vss_voc 02172 case 3://low_limit_voc 02173 case 7://low_limit_ocp_v 02174 case 8://up_limit_ocp_v 02175 if(*sdata <= ( 4999 - inc )) { 02176 *sdata = *sdata + inc ; 02177 } 02178 break;//switch ( param ){ 02179 02180 case 4: //low_limit_iop 02181 case 5: //low_limit_o.c.p 02182 case 6: //up_limit_o.c.p 02183 if(*sdata <= ( 2500 - inc / 10 )) { 02184 *sdata = *sdata + inc /10 ; 02185 } 02186 break;//switch ( param ) 02187 case 9: //wait_iop 02188 case 10: //wait_ocp 02189 case 11: //wait_voc 02190 02191 if(*sdata <= ( 2550 - inc / 10 )) { 02192 *sdata = *sdata + inc / 10 ; 02193 } 02194 break;//switch ( param ) 02195 02196 case 12: //low_limit_resistor 02197 case 13: //up_limit_resistor 02198 if(*sdata <= ( 2550 - inc )) { 02199 *sdata = *sdata + inc; 02200 } 02201 break; 02202 02203 }//switch ( param ){ 02204 } 02205 02206 /*** 減算 ***/ 02207 void decrease_param(int para, signed short *sdata, short dec) 02208 { 02209 switch ( para ) { //パラメータの項目によって上限値異なる 02210 case 0://vss_iop 02211 case 1://vss_ocp 02212 case 2://vss_voc 02213 case 3://low_limit_voc 02214 case 7://low_limit_ocp_v 02215 case 8://up_limit_ocp_v 02216 02217 if(*sdata >= dec ) { 02218 *sdata = *sdata - dec; 02219 } 02220 break; 02221 02222 case 4://low_limit_iop 02223 02224 if(*sdata >= dec / 10 ) { 02225 *sdata = *sdata - dec / 10; 02226 } 02227 break; 02228 02229 case 5://low_limit_o.c.p 02230 case 6://up_limit_o.c.p 02231 02232 if(*sdata >= -2500 + dec / 10 ) { 02233 *sdata = *sdata - dec / 10; 02234 } 02235 break; 02236 02237 case 9: //wait_iop 02238 case 10: //wait_ocp 02239 case 11: //wait_voc 02240 02241 if(*sdata >= dec / 10 ) { 02242 *sdata = *sdata - dec / 10 ; 02243 } 02244 break;//switch ( param ) 02245 02246 case 12: //low_limit_resistor 02247 case 13: //up_limit_resistor 02248 02249 if(*sdata >= dec ) { 02250 *sdata = *sdata - dec; 02251 } 02252 break; 02253 02254 }//switch ( param ){ 02255 } 02256 02257 /******************************************************************************* 02258 02259 CAL NAME (ASCII) 02260 3文字で構成(ex.B61)。1文字づつ上下キーで変更する。 02261 範囲はASCII表において 0x30~0x5A 02262 02263 ver3.0.0 2022.4.13 02264 02265 *******************************************************************************/ 02266 /*** UP ***/ 02267 void up_ascii(char *c){ 02268 02269 if (*c >= 0x5A ){ 02270 *c = 0x30; 02271 } else if ( *c < 0x30 ){ 02272 *c = 0x30; 02273 } else { 02274 *c = *c + 1; 02275 } 02276 02277 } 02278 /*** DOWN ***/ 02279 void down_ascii(char *c){ 02280 02281 if (*c > 0x5A ){ 02282 *c = 0x5A; 02283 } else if ( *c <= 0x30 ){ 02284 *c = 0x5A; 02285 } else { 02286 *c = *c - 1; 02287 } 02288 02289 } 02290 /******************************************************************************* 02291 02292 CAL情報登録画面 表示 02293 02294 ****** Swich matrix ****** 02295 01,02,03,04,05,06,07,08, 02296 09,10,11,12,13,14,15,16, 02297 17,18,19,20,21,22,23,24, 02298 25,26,27,28,29,30,31,32, 02299 *************************** 02300 02301 *******************************************************************************/ 02302 void disp_setup_cal(char cal_num , int parameter){ 02303 02304 char wdata[2]; 02305 02306 gu_cls();//clear dispray 02307 gu_fontsize(1); 02308 gu_print1("SETUP No."); 02309 wdata[0] = ( cal_num / 10 ) + 0x30;//ver3.0.0 02310 wdata[1] = ( cal_num % 10 ) + 0x30;//show caliber number 02311 i2c.write(addr_gu, wdata, 2); 02312 02313 if( parameter == 14 ){ 02314 gu_button_up(sw_up_set[3]); 02315 gu_button_down(sw_down_set[3]); 02316 } 02317 02318 gu_set_button_font1(7,"esc"); 02319 gu_set_button_font1(8,"save"); 02320 gu_button_up(17); 02321 gu_button_down(25); 02322 gu_button_up(sw_up_set[0]); 02323 gu_button_up(sw_up_set[1]); 02324 gu_button_up(sw_up_set[2]); 02325 gu_button_down(sw_down_set[0]); 02326 gu_button_down(sw_down_set[1]); 02327 gu_button_down(sw_down_set[2]); 02328 02329 hyouji_cal_param(parameter); 02330 02331 } 02332 02333 02334 /******************************************************************************* 02335 02336 PASS WORD 画面 02337 02338 *******************************************************************************/ 02339 void pw(int* pflag){ 02340 02341 char crdata[3];//GUDからの受信データ 02342 char strnum[2]; 02343 char basho = 0; 02344 char word[YOSO]; 02345 char c[2];//GU-D SW 表示文字 02346 int j = 0; 02347 02348 gu_cls();//clear dispray 02349 02350 strnum[1] = 0;//NULL 02351 c[1]=0;//NULL 02352 02353 for ( int i = 0; i <=25; i++ ){ 02354 strnum[0] = i + 0x41; 02355 gu_set_button( (basho + 1 ) ,strnum); 02356 basho = basho + 1; 02357 } 02358 02359 wait(0.2); 02360 02361 int i = 0; 02362 02363 while(1) { 02364 02365 i2c.read ((addr_gu + 0x01), crdata, 3, true); 02366 02367 if (crdata[0] == 0x11 && crdata[2] == 0x01 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。&& タッチしたならば 02368 02369 word[j] = crdata[1] + 0x41; 02370 c[0] = word[j]; 02371 02372 gu_reverse(1); 02373 gu_set_button( (crdata[1] + 1 ) ,c); 02374 gu_reverse(0); 02375 02376 j = j + 1; 02377 02378 } 02379 02380 if ( j == YOSO ){ 02381 02382 while (1){ 02383 if ( word[i] != pass[i] ){ 02384 *pflag = 1; 02385 break; 02386 } 02387 if (i == ( YOSO - 1) ){ 02388 break; 02389 } 02390 02391 i += 1; 02392 } 02393 02394 wait(0.5); 02395 return; 02396 02397 }//if 02398 02399 wait(0.2); 02400 02401 }//while 02402 } 02403 /******************************************************************************* 02404 02405 CAL情報登録画面 MAIN 02406 別途システム設計図,EEPROMのシートを参照 02407 02408 ver3.0.0 02409 02410 param: 02411 0:vss_iop 02412 1:vss_ocp 02413 2:vss_voc 02414 3:low_limit_voc 02415 4:low_limit_iop 02416 5:low_limit_ocp 02417 6:up_limit_ocp 02418 7:low_limit_ocp_v 02419 8:up_limit_ocp_v 02420 9:wait_iop 02421 10:wait_ocp 02422 11:wait_voc 02423 12:LowLimitResistor 02424 13:UPLimitResistor 02425 14:CAL_name 02426 02427 *******************************************************************************/ 02428 void setup_cal_information(char cal_num) 02429 { 02430 int param; //設定するパラメータの選択 02431 char crdata[3]; //GU-Dからの受信DATA 3byte 02432 signed short sdata_cal[18]; //CAL設定条件 02433 signed short hyouji_data; 02434 int param_sum = 14; //パラメータの最大設定数 02435 char c_temp[4]; //CAL名設定条件 calinfo.name 02436 //int i; 02437 //short sdata_byte[16]; //EEPROM BYTEごとのDATA 1byte 02438 //char cmd_gu[32]; //gu-DへのI2Cコマンド用配列 1byte0 02439 //char adrs_cal; //EEPROM CAL情報を保存しているアドレス 0x90~ 02440 02441 int pwflag = 0; 02442 02443 pw(&pwflag); 02444 02445 if ( pwflag != 0 ){ 02446 return; 02447 } 02448 02449 //Load caliber information 02450 read_caliber(&calinfo,cal_num); 02451 02452 sdata_cal[0] = calinfo.vss_iop; 02453 sdata_cal[1] = calinfo.vss_ocp; 02454 sdata_cal[2] = calinfo.vss_voc; 02455 sdata_cal[3] = calinfo.low_limit_voc; 02456 sdata_cal[4] = calinfo.low_limit_iop; 02457 sdata_cal[5] = calinfo.low_limit_ocp; 02458 sdata_cal[6] = calinfo.up_limit_ocp; 02459 sdata_cal[7] = calinfo.low_limit_ocp_v; 02460 sdata_cal[8] = calinfo.up_limit_ocp_v; 02461 sdata_cal[9] = calinfo.wait_iop; 02462 sdata_cal[10] = calinfo.wait_ocp; 02463 sdata_cal[11] = calinfo.wait_voc; 02464 sdata_cal[12] = calinfo.low_limit_resistor; 02465 sdata_cal[13] = calinfo.up_limit_resistor; 02466 02467 c_temp[0] = calinfo.name[0]; 02468 c_temp[1] = calinfo.name[1]; 02469 c_temp[2] = calinfo.name[2]; 02470 c_temp[3] = calinfo.name[3]; 02471 02472 //初期表示はCAL名設定 02473 param = 14; 02474 disp_setup_cal(cal_num,param); 02475 02476 while(1) { 02477 i2c.read ((addr_gu + 0x01), crdata, 3, true); 02478 02479 if (crdata[0] == 0x11 && crdata[2] == 0x01 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。&& タッチしたならば 02480 //cswnum = crdata[1]; //スイッチ番号 02481 //cswdata = crdata[2];//ON/OFF情報 02482 02483 //タッチしたSWの番号(位置)による分岐 02484 02485 //sw17 パラメータ変更スイッチ(上) 02486 if ( crdata[1] == 16 ){ 02487 02488 if ( param <= param_sum -1 ) { 02489 param = param + 1; 02490 } else { 02491 param = 0; 02492 } 02493 02494 disp_setup_cal(cal_num,param); 02495 //hyouji_cal_param(param);//設定パラメータ表示 02496 02497 } 02498 02499 //case 0x18 ://sw25 パラメータ変更スイッチ(下) 02500 if ( crdata[1] == 24 ){ 02501 02502 if ( param >= 1 ) { 02503 param = param - 1; 02504 } else { 02505 param = param_sum; 02506 } 02507 02508 disp_setup_cal(cal_num,param); 02509 //hyouji_cal_param(param);//設定パラメータ表示 02510 02511 } 02512 02513 if ( crdata[1] == (sw_up_set[0] - 1)){ //increase 02514 02515 // if set caliber name .. ver3 02516 if ( param == 14 ){ 02517 up_ascii(&c_temp[0]); 02518 } else { 02519 increase_param(param, &sdata_cal[param], 1000); 02520 } 02521 } 02522 02523 if ( crdata[1] == (sw_up_set[1] - 1)){ //increase 02524 02525 if ( param == 14 ){ 02526 up_ascii(&c_temp[1]); 02527 } else { 02528 increase_param(param, &sdata_cal[param], 100); 02529 } 02530 } 02531 02532 if ( crdata[1] == (sw_up_set[2] - 1)){ //SW** increase 02533 02534 if ( param == 14 ){ 02535 up_ascii(&c_temp[2]); 02536 } else { 02537 increase_param(param, &sdata_cal[param], 10); 02538 } 02539 } 02540 02541 if ( crdata[1] == (sw_up_set[3] - 1)){ //SW** increase CAL名設定時に使用する 02542 02543 if ( param == 14 ){ 02544 up_ascii(&c_temp[3]); 02545 } 02546 } 02547 02548 if ( crdata[1] == (sw_down_set[0] - 1)){ //SW** decrease 02549 02550 if ( param == 14 ){ 02551 down_ascii(&c_temp[0]); 02552 } else { 02553 decrease_param(param, &sdata_cal[param], 1000); 02554 } 02555 } 02556 02557 if ( crdata[1] == (sw_down_set[1] - 1)){ //SW** decrease 02558 02559 if ( param == 14 ){ 02560 down_ascii(&c_temp[1]); 02561 } else { 02562 decrease_param(param, &sdata_cal[param], 100); 02563 } 02564 } 02565 02566 if ( crdata[1] == (sw_down_set[2] - 1)){ //SW** decrease 02567 02568 if ( param == 14 ){ 02569 down_ascii(&c_temp[2]); 02570 } else { 02571 decrease_param(param, &sdata_cal[param], 10); 02572 } 02573 } 02574 02575 if ( crdata[1] == (sw_down_set[3] - 1)){ //SW** decrease 02576 02577 if ( param == 14 ){ 02578 down_ascii(&c_temp[3]); 02579 } 02580 } 02581 02582 if ( crdata[1] == 6 ){ //SW7 "esc"ボタン 02583 02584 gu_reverse(1); 02585 gu_set_button_font1(7,"esc"); 02586 wait(0.2); 02587 gu_reverse(0);//ver3 02588 02589 return; //何もせずに抜ける 02590 } 02591 02592 if ( crdata[1] == 7 ){ //SW8 "save"保存ボタン 02593 02594 //ver3 CAL情報 代入 02595 //*** ver3 *** 02596 calinfo.vss_iop = sdata_cal[0]; 02597 calinfo.vss_ocp = sdata_cal[1]; 02598 calinfo.vss_voc = sdata_cal[2]; 02599 calinfo.low_limit_voc = sdata_cal[3]; 02600 calinfo.low_limit_iop = sdata_cal[4]; 02601 calinfo.low_limit_ocp = sdata_cal[5]; 02602 calinfo.up_limit_ocp = sdata_cal[6]; 02603 calinfo.up_limit_ocp_v = sdata_cal[7]; 02604 calinfo.low_limit_ocp_v = sdata_cal[8]; 02605 calinfo.wait_iop = sdata_cal[9]; 02606 calinfo.wait_ocp = sdata_cal[10]; 02607 calinfo.wait_voc = sdata_cal[11]; 02608 calinfo.low_limit_resistor = sdata_cal[12]; 02609 calinfo.up_limit_resistor = sdata_cal[13]; 02610 02611 calinfo.name[0] = c_temp[0]; 02612 calinfo.name[1] = c_temp[1]; 02613 calinfo.name[2] = c_temp[2]; 02614 calinfo.name[3] = c_temp[3]; 02615 02616 /*ver3 Byte Write CALNO.EEPROM 書込み 02617 reg_num = cal_num; 02618 wdata[0] = adrs_calnum[0]; 02619 wdata[1] = adrs_calnum[1]; 02620 wdata[2] = reg_num; 02621 02622 Soushin = i2c.write (eeprom_adrs, wdata, 3); //send stop at end 02623 wait(0.2); 02624 */ 02625 02626 /*** ver3 *** 02627 //CAL情報 >> EEPROM 02628 //送信完了ならば実行 02629 if(Soushin == 0) { 02630 02631 write_caliber_information(&calinfo, cal_num); 02632 02633 //ver1.2.3 02634 } else { 02635 gu_fontsize(1); 02636 gu_cursor(0,2); 02637 gu_print1("can not save cal no"); 02638 wait(2); 02639 return; 02640 } 02641 ***/ 02642 02643 /*** ver3 ***/ 02644 write_caliber_information(&calinfo, cal_num); 02645 02646 //送信完了ならば実行 02647 if(Soushin == 0) { 02648 gu_reverse(1); 02649 gu_set_button_font1(8,"save"); 02650 wait(0.2); 02651 gu_reverse(0);//ver3 02652 return;//CAL情報登録画面を抜ける 02653 02654 //ver1.2.3 02655 } else { 02656 gu_fontsize(1); 02657 gu_cursor(0,2); 02658 gu_print1("can not save cal information"); 02659 wait(2); 02660 return; 02661 } 02662 02663 }//end if 02664 }//end if 02665 02666 //gu-D表示 ver3 02667 gu_fontsize(2); 02668 gu_cursor(zahyou_val[0],zahyou_val[1]); //表示位置の指定 02669 02670 switch ( param ) { 02671 case 0://vss_iop 02672 case 1://vss_ocp 02673 case 2://vss_voc 02674 case 3://low_limit_voc 02675 case 7://low_limit_voc_v 02676 case 8://up_limit_voc_v 02677 hyouji_data = sdata_cal[param] * -1; 02678 gu_putdeck ( &hyouji_data ); 02679 break; 02680 02681 case 4://low_limit_iop 02682 case 5://low_limit_ocp 02683 case 6://up_limit_ocp 02684 hyouji_data = sdata_cal[param] * 10; 02685 gu_putdeck ( &hyouji_data ); 02686 break; 02687 02688 case 9: //wait_iop 02689 case 10: //wait_ocp 02690 case 11: //wait_voc 02691 //ver1.1.0 02692 hyouji_data = sdata_cal[param]; 02693 gu_putdec ( &hyouji_data ); 02694 break; 02695 02696 case 12://low_limit_resistor 02697 case 13://up_limit_resistor 02698 hyouji_data = sdata_cal[param]; 02699 gu_putdec ( &hyouji_data ); 02700 break; 02701 02702 case 14: //cal name ver3 02703 i2c.write(addr_gu, c_temp, 4); //3byte ascii code 02704 break; 02705 02706 }//swith 02707 wait(0.1);//gu-D 読込間隔の設定 02708 }//while 02709 } 02710 02711 /********************************* 02712 02713 Auto Mode (sub) 02714 自動測定モード 初期画面 02715 02716 *********************************/ 02717 void auto_int_hyouji() 02718 { 02719 //short st; 02720 char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte 02721 02722 gu_cls(); 02723 gu_fontsize(1); 02724 gu_print1("AUTO MODE CAL No."); 02725 cmd_gu[0] = reg_num + 0x30; 02726 i2c.write(addr_gu, cmd_gu, 1); 02727 gu_Button_power_on();//show button 02728 02729 } 02730 /******************************************************* 02731 02732 Auto Mode (Main) 02733 自動測定モード 画面 02734 ver1.04 パネルタッチ -> スタートスイッチで測定開始へ変更 02735 02736 *******************************************************/ 02737 void auto_run() 02738 { 02739 char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte 02740 char crdata[6]; 02741 //char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F 02742 //int i; 02743 //float fdata[4][4];//ファイル出力用 02744 //short sdata[4]; 02745 //short s; 02746 02747 read_regnum();//CAL登録No.読込 02748 read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入 02749 02750 auto_int_hyouji(); 02751 02752 //dac_init(); //DAC 初期化 02753 02754 //gu-D タッチスイッチ読み出し動作設定 p49 02755 cmd_gu[0]= 0x1F; 02756 cmd_gu[1]= 0x4B; 02757 cmd_gu[2]= 0x18; 02758 cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2 02759 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 02760 02761 wait(0.1); 02762 02763 Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true); 02764 02765 while(1) { 02766 //スタートスイッチで測定開始 02767 if ( sw_start == 0 ) { 02768 meas_sub(); 02769 } 02770 02771 wait(0.1); 02772 02773 crdata[0] = 0; 02774 crdata[1] = 0; 02775 crdata[2] = 0; 02776 02777 i2c.read ((addr_gu + 0x01), crdata, 3, true); 02778 02779 if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。 02780 02781 //cswnum = crdata[1]; //スイッチ番号 02782 //cswdata = crdata[2];//ON/OFF情報 02783 02784 //gu-D タッチスイッチ読み出し動作設定 p49 02785 cmd_gu[0]= 0x1F; 02786 cmd_gu[1]= 0x4B; 02787 cmd_gu[2]= 0x18; 02788 cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除 02789 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 02790 02791 if ( crdata[1] == 7 ) { 02792 02793 gu_Button_power_off();//電源ボタンイメージ反転表示 02794 wait(0.5); 02795 02796 led_off();//LED全消灯 02797 02798 return;//この関数を抜ける 02799 02800 } //end if 02801 02802 /* ver 1.1.1 タッチパネルで測定開始を削除 02803 else { 02804 02805 meas_sub();//測定用サブ 02806 02807 02808 } //else if 02809 */ 02810 02811 //gu-D タッチスイッチ読み出し動作設定 p49 02812 cmd_gu[0]= 0x1F; 02813 cmd_gu[1]= 0x4B; 02814 cmd_gu[2]= 0x18; 02815 cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除 02816 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 02817 02818 wait(0.1); 02819 02820 i2c.read ((addr_gu + 0x01), crdata, 3, true); 02821 02822 }//if 02823 wait(0.1); 02824 }//While 02825 02826 } 02827 02828 /* 02829 char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte 02830 char crdata[6]; 02831 char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F 02832 //int i; 02833 //float fdata[4][4];//ファイル出力用 02834 //short sdata[4]; 02835 //short s; 02836 02837 read_regnum();//CAL登録No.読込 02838 read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入 02839 02840 auto_int_hyouji(); 02841 02842 //dac_init(); //DAC 初期化 02843 02844 //gu-D タッチスイッチ読み出し動作設定 p49 02845 cmd_gu[0]= 0x1F; 02846 cmd_gu[1]= 0x4B; 02847 cmd_gu[2]= 0x18; 02848 cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2 02849 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 02850 02851 wait(0.1); 02852 02853 Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true); 02854 02855 while(1) { 02856 02857 wait(0.1); 02858 02859 crdata[0] = 0; 02860 crdata[1] = 0; 02861 crdata[2] = 0; 02862 02863 i2c.read ((addr_gu + 0x01), crdata, 3, true); 02864 02865 if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。 02866 cswnum = crdata[1]; //スイッチ番号 02867 //cswdata = crdata[2];//ON/OFF情報 02868 02869 //gu-D タッチスイッチ読み出し動作設定 p49 02870 cmd_gu[0]= 0x1F; 02871 cmd_gu[1]= 0x4B; 02872 cmd_gu[2]= 0x18; 02873 cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除 02874 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 02875 02876 //SWの番号(位置) 02877 if ( cswnum == 7 ) { 02878 02879 gu_Button_power_off();//電源ボタンイメージ反転表示 02880 wait(0.5); 02881 02882 led_off();//LED全消灯 02883 02884 return;//この関数を抜ける 02885 02886 } 02887 02888 //gu-D タッチスイッチ読み出し動作設定 p49 02889 cmd_gu[0]= 0x1F; 02890 cmd_gu[1]= 0x4B; 02891 cmd_gu[2]= 0x18; 02892 cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除 02893 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 02894 02895 wait(0.1); 02896 02897 i2c.read ((addr_gu + 0x01), crdata, 3, true); 02898 02899 } else if ( sw_start == 0 ) { //if 02900 02901 auto_int_hyouji(); 02902 02903 gu_cursor(0,2); 02904 gu_print1("Please Wait.."); 02905 gu_fontsize(2); 02906 02907 read_regnum();//CAL登録No.読込 02908 02909 read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入 02910 02911 auto_meas( number_of_channels );//2個測定 02912 02913 hantei( number_of_channels );//判定LED 02914 02915 wait(0.5); 02916 02917 gu_fontsize(1); 02918 gu_cursor(0,2); 02919 gu_print1("READY "); 02920 02921 } 02922 wait(0.1); 02923 }//While 02924 } 02925 */ 02926 02927 /* 02928 void auto_run() 02929 { 02930 char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte 02931 char crdata[6]; 02932 char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F 02933 //int i; 02934 //float fdata[4][4];//ファイル出力用 02935 //short sdata[4]; 02936 //short s; 02937 02938 read_regnum();//CAL登録No.読込 02939 read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入 02940 02941 auto_int_hyouji(); 02942 02943 //dac_init(); //DAC 初期化 02944 02945 //gu-D タッチスイッチ読み出し動作設定 p49 02946 cmd_gu[0]= 0x1F; 02947 cmd_gu[1]= 0x4B; 02948 cmd_gu[2]= 0x18; 02949 cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2 02950 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 02951 02952 wait(0.1); 02953 02954 Jyushin = i2c.read ((addr_gu + 0x01), crdata, 3, true); 02955 02956 while(1) { 02957 02958 wait(0.1); 02959 02960 crdata[0] = 0; 02961 crdata[1] = 0; 02962 crdata[2] = 0; 02963 02964 i2c.read ((addr_gu + 0x01), crdata, 3, true); 02965 02966 if ( crdata[0] == 0x11 && crdata[2] == 1 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。 02967 cswnum = crdata[1]; //スイッチ番号 02968 //cswdata = crdata[2];//ON/OFF情報 02969 02970 //gu-D タッチスイッチ読み出し動作設定 p49 02971 cmd_gu[0]= 0x1F; 02972 cmd_gu[1]= 0x4B; 02973 cmd_gu[2]= 0x18; 02974 cmd_gu[3]= 0x00;//SW状態変化時自動送信モード2解除 02975 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 02976 02977 //SWの番号(位置) 02978 if ( cswnum == 7 ) { 02979 02980 gu_Button_power_off();//電源ボタンイメージ反転表示 02981 wait(0.5); 02982 02983 led_off();//LED全消灯 02984 02985 return;//この関数を抜ける 02986 02987 } else { 02988 02989 auto_int_hyouji(); 02990 02991 gu_cursor(0,2); 02992 gu_print1("Please Wait.."); 02993 gu_fontsize(2); 02994 02995 read_regnum();//CAL登録No.読込 02996 02997 read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入 02998 02999 auto_meas( number_of_channels );//2個測定 03000 03001 hantei( number_of_channels );//判定LED 03002 03003 wait(0.5); 03004 03005 gu_fontsize(1); 03006 gu_cursor(0,2); 03007 gu_print1("READY "); 03008 03009 } //else if 03010 03011 //gu-D タッチスイッチ読み出し動作設定 p49 03012 cmd_gu[0]= 0x1F; 03013 cmd_gu[1]= 0x4B; 03014 cmd_gu[2]= 0x18; 03015 cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2解除 03016 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 03017 03018 wait(0.1); 03019 03020 i2c.read ((addr_gu + 0x01), crdata, 3, true); 03021 03022 }//if 03023 03024 wait(0.1); 03025 03026 }//While 03027 03028 } 03029 */ 03030 03031 /********************************* 03032 03033 Auto Mode (Sub) 03034 03035 *********************************/ 03036 void meas_sub() 03037 { 03038 auto_int_hyouji(); 03039 03040 gu_cursor(0,2); 03041 gu_print1("Please Wait.."); 03042 gu_fontsize(2); 03043 03044 //STX受信待ち抜け割込みイネーブル 03045 oneshot5.attach(&seq_timeout, 10); 03046 03047 //シーケンサからEXT受信するまでループ 03048 /* 03049 while(seq_name[0] == 2){ 03050 if(seq_name[3] == 3){ 03051 break; 03052 } 03053 wait(0.5); 03054 }//while 03055 */ 03056 03057 while(seq_name[0] == 50){ 03058 if(seq_name[3] == 51){ 03059 break; 03060 } 03061 wait(0.5); 03062 }//while 03063 03064 oneshot5.detach(); 03065 03066 read_regnum();//CAL登録No.読込 03067 03068 read_caliber(&calinfo,reg_num);//指定したCAL登録No.の情報を読込後、calinfoへ代入 03069 03070 auto_meas( number_of_channels );//2個測定 03071 03072 hantei( number_of_channels );//判定LED 03073 03074 seq_serialsend();//デバック用シーケンサ通信関数呼出 03075 03076 03077 //STX,EXT初期化 03078 seq_name[0] = 2; 03079 seq_name[3] = 3; 03080 03081 wait(0.5); 03082 03083 gu_fontsize(1); 03084 gu_cursor(0,2); 03085 gu_print1("READY "); 03086 03087 } 03088 03089 /******************************************************************************* 03090 03091 Auto Mode/SEQ Mode (sub) 03092 自動測定 03093 char noc -> 総測定数 1~4 03094 03095 *******************************************************************************/ 03096 void auto_meas(char noc) 03097 { 03098 int x[4] = {0,0,128,128}; //GU_D x座標 4個測定時の表示スタート位置 03099 int y[4] = {5,11,5,11}; //GU_D y座標 4個測定時の表示スタート位置 03100 int iy ; //GU_D y座標 2個測定時の表示スタート位置 03101 int i; 03102 short sdata[4]; 03103 03104 iy = 4;//GU_D 2個測定時の測定値の表示開始位置 y座標 03105 03106 if ( noc > 4 ) { 03107 noc = 4; 03108 } 03109 03110 //値の初期化 03111 for ( i = 0; i <= 3; i++) { 03112 I[i] = 0; 03113 R[i] = 0; //ver 1.1.1 03114 iop[i] = 0; 03115 voc[i] = 0; 03116 ocp[i] = 0; 03117 } 03118 03119 //判定用LED消灯 03120 led_off(); 03121 03122 //電源投入 03123 for ( i = 0; i <= ( noc - 1 ); i++) { 03124 dac_out( calinfo.vss_iop,i); //Vss設定 DAC_A~D 03125 } 03126 03127 wait( wait_poweron );//パワーブレイク復帰待機? 03128 03129 //Reset DUT 03130 for ( i = 0; i <= ( noc -1 ); i++) { 03131 io_reset[i] = 1; //R = VDD 03132 } 03133 03134 wait(time_reset); 03135 03136 for ( i = 0; i <= ( noc -1 ); i++) { 03137 io_reset[i] = 0; //R = "OPEN" 03138 } 03139 03140 //抵抗測定 03141 for ( i = 0; i <= ( noc -1 ); i++ ) { 03142 R[i] = meas_resistor(i); 03143 } 03144 03145 //display GU_D 03146 if ( number_of_channels <= 2 ) { //2個測定の時の表示 03147 gu_fontsize(2); 03148 gu_cursor(0,iy); 03149 gu_print1("[ch.1]"); 03150 gu_cursor(128,iy); 03151 gu_print1("[ch.2]"); 03152 //CH.1 表示 03153 gu_cursor(0, iy + 2); 03154 gu_print1("R "); 03155 display_resistor( R[0] ); 03156 //CH.2 表示 03157 gu_cursor(128, iy + 2); 03158 gu_print("R "); 03159 display_resistor( R[1] ); 03160 } else if( number_of_channels >= 3) { //3.4個測定の時の表示 03161 gu_fontsize(1); 03162 gu_cursor(x[0],y[0]); 03163 gu_print1("ch.1"); 03164 gu_cursor(x[1],y[1] ); 03165 gu_print1("ch.2"); 03166 gu_cursor(x[2],y[2]); 03167 gu_print1("ch.3"); 03168 03169 if ( number_of_channels == 4 ) { 03170 gu_cursor(x[3],y[3]); 03171 gu_print1("ch.4"); 03172 } 03173 03174 //CH.1~4 表示 03175 for ( i = 0; i <= ( number_of_channels - 1 ); i++) { 03176 gu_cursor( x[i], y[i] + 1 );//x座標指定 03177 gu_print1("R "); 03178 display_resistor( R[i] ); 03179 } 03180 } 03181 03182 //iop測定 03183 wait(calinfo.wait_iop);//Vss印加~リセット後からiop測定までの待機時間 03184 03185 meas_current_automode( noc );//電流測定サブ 測定値をI[]へ代入 03186 03187 for( i = 0; i <= ( noc - 1) ; i++) { 03188 iop[i] = I[i]; 03189 } 03190 03191 //display GU_D 03192 if ( number_of_channels <= 2 ) { //2個測定の時の表示 03193 gu_cursor(0, iy + 4 );//IOP測定値表示位置指定 03194 gu_print1("Iop "); 03195 gu_putdeci(&iop[0]); 03196 gu_cursor(128, iy + 4 ); 03197 gu_print1("Iop "); 03198 gu_putdeci(&iop[1]); 03199 } else { 03200 //CH.1~4 表示 03201 for ( i=0; i <= ( number_of_channels - 1 ); i++) { 03202 gu_cursor( x[i], y[i] + 2 ); //x座標指定 03203 gu_print1("Iop "); 03204 gu_putdeci(&iop[i]); 03205 } 03206 } 03207 03208 wait(0.01); 03209 03210 //過充電防止時電流測定 03211 for ( i = 0; i <= ( noc - 1 ); i++) { 03212 dac_out( calinfo.vss_ocp,i); //Vss設定 DAC_A~D //ver1.1.2 03213 } 03214 03215 wait( calinfo.wait_ocp ); 03216 03217 meas_current_automode( noc ); 03218 03219 for( i = 0; i <= ( noc - 1) ; i++) { 03220 ocp[i] = I[i]; 03221 } 03222 03223 //display GU_D 03224 if ( number_of_channels <= 2 ) { //2個測定の時の表示 03225 gu_cursor(0, iy + 6 );//IOP測定値表示位置指定 03226 gu_print1("OCP "); 03227 gu_putdeci(&ocp[0]); 03228 gu_cursor(128, iy + 6 ); 03229 gu_print1("OCP "); 03230 gu_putdeci(&ocp[1]); 03231 } else { 03232 //CH.1~4 表示 03233 for ( i=0; i <= ( number_of_channels - 1 ); i++) { 03234 gu_cursor( x[i], y[i] + 3 ); //x座標指定 03235 gu_print1("OCP "); 03236 gu_putdeci(&ocp[i]); 03237 } 03238 } 03239 03240 //VOC測定 03241 for ( i = 0; i <= ( noc - 1 ); i++) { 03242 dac_out( calinfo.vss_voc,i); //Vss設定 DAC_A~D 03243 } 03244 03245 wait( wait_voc_1 ); 03246 03247 //Reset DUT 03248 for ( i = 0; i <= ( noc -1 ); i++) { 03249 io_reset[i] = 1; //R = VDD 03250 } 03251 03252 wait( calinfo.wait_voc );//ver3 03253 03254 for ( i = 0; i <= ( noc -1 ); i++ ) { 03255 03256 voc[i] = meas_voltage(i); 03257 sdata[i] = voc[i] * -1; 03258 03259 } 03260 03261 //display GU_D 03262 if ( number_of_channels <= 2 ) { //2個測定の時の表示 03263 gu_cursor(0, iy + 8 );//IOP測定値表示位置指定 03264 gu_print1("Voc "); 03265 gu_putdeck(&sdata[0]); 03266 gu_print1("V"); 03267 gu_cursor(128, iy + 8 ); 03268 gu_print1("Voc "); 03269 gu_putdeck(&sdata[1]); 03270 gu_print1("V"); 03271 } else { 03272 //CH.1~4 表示 03273 for ( i=0; i <= ( number_of_channels - 1 ); i++) { 03274 gu_cursor( x[i], y[i] + 4 );//x座標指定 03275 gu_print1("Voc "); 03276 gu_putdeck(&sdata[i]); 03277 gu_print1("V"); 03278 } 03279 } 03280 03281 //R = "L" 03282 for ( i = 0; i <= ( noc -1 ); i++) { 03283 io_reset[i] = 0; //R = "OPEN" 03284 } 03285 03286 wait(0.1); 03287 03288 //Vss=0V 03289 for ( i = 0; i <= ( noc - 1 ); i++) { 03290 dac_out( 0, i );//Vss設定 DAC_A~D 03291 } 03292 03293 //ファイルオープン 03294 mkdir("/sd/mydir", 0777); 03295 03296 FILE *fp = fopen("/sd/mydir/iop.csv", "ab+");//ディレクトリとファイル名の指定,追加モード 03297 03298 if(fp == NULL) { 03299 /* ver1.1.3 03300 gu_fontsize(1); 03301 gu_cursor(0,2); 03302 gu_print1("Could not open file for SD card"); 03303 */ 03304 } else { 03305 for ( i = 0; i <= ( noc - 1 ); i++) { 03306 fdata[i][0] = iop[i] * 0.01; //1bitあたり0.01uA 03307 fdata[i][1] = ocp[i] * 0.01; //1bitあたり0.01uA 03308 fdata[i][2] = voc[i] * 0.001; //1bitあたり0.001V 03309 } 03310 03311 for( i = 0; i <= ( noc - 1 ); i++) { 03312 03313 switch ( i ) { 03314 case 0: 03315 fprintf(fp, "CH.1"); 03316 break; 03317 case 1: 03318 fprintf(fp, "CH.2"); 03319 break; 03320 case 2: 03321 fprintf(fp, "CH.3"); 03322 break; 03323 case 3: 03324 fprintf(fp, "CH.4"); 03325 break; 03326 } 03327 03328 fprintf(fp, " ");//excel 区切り位置 03329 if ( R[i] < res_vref && R[0] >= 0 ) { 03330 fprintf(fp, "%d", R[i]); 03331 } else { 03332 fprintf(fp,"OL"); 03333 } 03334 fprintf(fp, " "); 03335 fprintf(fp, "%f", fdata[i][0]); 03336 fprintf(fp, " "); 03337 fprintf(fp, "%f", fdata[i][1]); 03338 fprintf(fp, " "); 03339 fprintf(fp, "%f", fdata[i][2]); 03340 fprintf(fp, " "); 03341 }//for 03342 03343 //ファイルクローズ 03344 fprintf(fp, "\n"); 03345 fclose(fp); 03346 } 03347 03348 } 03349 03350 /********************************* 03351 03352 電流測定(iop/voc共通) 03353 char amount;//測定数 03354 03355 *********************************/ 03356 void meas_current_automode(char amount) //a quantity of measuring channel 03357 { 03358 int i; 03359 03360 //amount = number_of_channels; 03361 03362 //set range 03363 for ( i = 0; i <= ( amount - 1 ); i++) 03364 range[i] = 1; //range 10uA 03365 03366 wait(0.1); 03367 03368 //discharge condenser 03369 for ( i = 0; i <= ( amount - 1 ); i++) 03370 houden[i] = 1; //discharge condenser 03371 03372 wait(time_discharge);//discharge time 03373 03374 ch_num = 0; 03375 select_ich( ch_num ); //select channel that mesuring current 03376 houden[0] = 0; //start integral 03377 03378 oneshot1.attach ( &flip_ch1, time_integral ); 03379 03380 if ( amount >= 2 ) { 03381 wait(0.1); 03382 houden[1] = 0; 03383 oneshot2.attach ( &flip_ch2, time_integral ); 03384 } 03385 03386 if ( amount >= 3 ) { 03387 wait(0.1); 03388 houden[2] = 0; 03389 oneshot3.attach ( &flip_ch3, time_integral ); 03390 } 03391 03392 if ( amount == 4 ) { 03393 wait(0.1); 03394 houden[3] = 0; 03395 oneshot4.attach ( &flip_ch4, time_integral ); 03396 } 03397 03398 wait( time_integral + 0.3 );//wait Timeout 03399 03400 //discharge condenser 03401 for ( i = 0; i <= ( amount - 1 ); i++) 03402 houden[i] = 1; //discharge condenser 03403 03404 wait(time_discharge);//discharge time 03405 03406 //not discharge condenser 03407 for ( i = 0; i <= ( amount - 1 ); i++) 03408 houden[i] = 0; 03409 03410 //set range 03411 for ( i = 0; i <= ( amount - 1 ); i++) 03412 range[i] = 0; //range 1mA 03413 03414 oneshot1.detach(); 03415 oneshot2.detach(); 03416 oneshot3.detach(); 03417 oneshot4.detach(); 03418 03419 } 03420 03421 /********************************* 03422 DAC 初期設定 03423 LDACレジスタの設定 03424 内部リファレンス電圧のセットアップ 03425 入力シフトレジスタ: 03426 0011 1000 0000 0000 0000 0001 03427 (0x3F0001) 03428 *********************************/ 03429 void dac_init() 03430 { 03431 03432 //内部リファレンス電圧のセットアップ 03433 wdata[0] = 0x38; 03434 wdata[1] = 0x00; 03435 wdata[2] = 0x01;// 03436 03437 i2c.write ( addr_dac, wdata, 3); 03438 03439 wait(0.1); 03440 03441 //LDAC設定 03442 wdata[0] = 0x30; 03443 wdata[1] = 0x00; 03444 wdata[2] = 0x0F;// 03445 03446 i2c.write ( addr_dac, wdata, 3); 03447 03448 } 03449 03450 /************************************** 03451 DAC 電圧印加 03452 Vout = 2 * Vref(2.5V) * ( D /2^2 ) 03453 mvolt[mV] 0~5000で設定 03454 addrは、0x00~03.全チャネルは0x07で指定 03455 **************************************/ 03456 void dac_out(short mvolt, char addr) //addr DACA:0x00 DACB:0x01 DACC:0x02 DACD:0x03 allDACs:0x07 03457 { 03458 char command;//1byte 03459 short dacdata;//2byte 03460 03461 command = 0x02;//write to input register n 仕様書p25参照 03462 03463 dacdata = mvolt * 4095 / 2 / dac_vref ; //12bit mvolt[mV] 0~5000で設定する 03464 03465 dacdata = dacdata << 4; //後ろ4bitはdon't care bit 03466 03467 wdata[0] = command << 3 | addr; //1byte 03468 wdata[1] = dacdata >> 8 ; //1byte 03469 wdata[2] = dacdata & 0xFF;//1byte 03470 03471 i2c.write(addr_dac, wdata, 3); 03472 03473 } 03474 /********************************* 03475 ADC測定し、平均値を算出する 03476 03477 貰う値:平均値の分母 03478 渡す値:平均値 03479 *********************************/ 03480 void compute_adc(int adc_con, long *avg) //(ADCのCONFIG, 計算結果) 03481 { 03482 03483 //short sdata[10];//2byte 03484 long ldata[10];//4byte 03485 long nu;//平均値の分子 4byte 03486 long max; 03487 long min; 03488 char i; 03489 char x; 03490 //int n; 03491 03492 x = 10; 03493 03494 wdata[0] = adc_con; //ADC configuration data チャンネルの選択など 03495 i2c.write( addr_ADC1, wdata, 1 ); 03496 wait(0.1); 03497 03498 //平均値の母数の数、測定を実施。 03499 for( i=0; i<=(x-1); i++) { 03500 03501 i2c.read( addr_ADC1 + 0x01, rdata, 3); 03502 //2byte結合 03503 ldata[i] = rdata[0] & 0xFF; 03504 ldata[i] = ( ldata[i] << 8 ) | rdata[1]; 03505 03506 if ( ldata[i] >= 0x8000 ) { 03507 ldata[i] = ldata[i] | 0xFFFF0000; //4byteの補数へ変換 03508 } 03509 03510 wait(0.05); 03511 03512 }//for 03513 03514 //最大値を取得 03515 max = ldata[0]; 03516 for ( i=0; i<=(x-2); i++) { 03517 if ( ldata[i+1] > ldata[i]) { 03518 max = ldata[i+1]; 03519 } 03520 } 03521 //最小値 03522 min = ldata[0]; 03523 for ( i=0; i<=(x-2); i++) { 03524 if ( ldata[i+1] < ldata[i]) { 03525 min = ldata[i+1]; 03526 } 03527 } 03528 03529 //平均値 03530 nu = 0x00000000; //4byte 03531 for ( i=0; i<=(x-1); i++) { 03532 nu = nu + ldata[i]; 03533 } 03534 03535 *avg = ( nu - max - min ) / ( x - 2 ); 03536 03537 } 03538 03539 03540 /************************************** 03541 2バイトを10進数で表示する 0~65535 03542 format *0.000 03543 mV→uAへ変換(1/1000) 03544 プリアンプ GAIN 1/5 03545 ADC_LSB:0.25mV 03546 積分時間 2s 03547 容量 20uF 03548 **************************************/ 03549 void gu_putdeci(float* idata) 03550 { 03551 03552 float uA; //ver1.1.4 03553 long y; //ver1.1.4 03554 long x; //ver1.1.4 03555 03556 //千分の一、四捨五入。 03557 if ( *idata > 0 ) { 03558 uA = *idata + 0.5; 03559 } else { 03560 uA = *idata - 0.5; 03561 } 03562 03563 x = uA; //小数点以下切り捨て 03564 03565 //四捨五入 up to here 03566 03567 //プラスマイナスの表示 03568 if( x >= 0 ) { 03569 wdata[0] = 0x2B;//ascii "+" 03570 i2c.write(addr_gu, wdata, 1); 03571 03572 y = x; 03573 03574 } else { 03575 wdata[0] = 0x2D;//ascii "-" 03576 i2c.write(addr_gu, wdata, 1); 03577 03578 y = ( ~x ) + 0x01;//2の補数 03579 } 03580 03581 //y = y * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv 03582 03583 wdata[0] = (( y / 1000 ) % 10 ) + 0x30; 03584 03585 if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。 03586 wdata[0] = 0x20; 03587 03588 wdata[1] = (( y / 100 ) % 10 ) + 0x30; 03589 wdata[2] = 0x2E;//ASCII "." 03590 wdata[3] = (( y / 10 ) % 10 ) + 0x30; 03591 wdata[4] = ( y % 10 ) + 0x30; 03592 03593 //ver1.2.5 03594 //i2c.write(addr_gu, wdata, 5); 03595 //gu_print1("uA"); 03596 03597 if ( *idata > O_L * -100 && *idata < O_L * 100 ){ 03598 03599 i2c.write(addr_gu, wdata, 5); 03600 gu_print1("uA"); 03601 03602 }else{ 03603 03604 gu_print1("O.L"); 03605 03606 } 03607 //upto 03608 03609 } 03610 03611 /************************************** 03612 2バイトを10進数で表示する 0~65535 03613 format *0.000 03614 mV→uAへ変換(1/1000) 03615 プリアンプ GAIN 1/5 03616 ADC_LSB:0.25mV 03617 シャント抵抗1kΩ 03618 **************************************/ 03619 void gu_putdeci_mA(float* idata) 03620 { 03621 float uA; //ver1.1.4 03622 long y; //ver1.1.4 03623 long x; //ver1.1.4 03624 03625 //千分の一、四捨五入。 03626 if ( *idata > 0 ) { 03627 uA = *idata + 0.5; 03628 } else { 03629 uA = *idata - 0.5; 03630 } 03631 03632 x = uA; //小数点以下切り捨て 03633 03634 //四捨五入 up to here 03635 03636 //プラスマイナスの表示 03637 if( x >= 0 ) { 03638 wdata[0] = 0x2B;//ascii "+" 03639 i2c.write(addr_gu, wdata, 1); 03640 03641 y = x; 03642 03643 } else { 03644 wdata[0] = 0x2D;//ascii "-" 03645 i2c.write(addr_gu, wdata, 1); 03646 03647 y = ( ~x ) + 0x01;//2の補数 03648 } 03649 03650 //y = y * 5 * 0.25;//プリアンプのGAINが1/5なのでここで5倍.ADC14bit分解能で、1bitあたり0.25mv 03651 03652 /* 03653 wdata[0] = (( *y / 100000 ) % 10 ) + 0x30; 03654 03655 if( wdata[0] == 0x30 )//3桁目が零の場合、"0"を表示しない。 03656 wdata[0] = 0x20; 03657 */ 03658 03659 wdata[0] = (( y / 1000 ) % 10 ) + 0x30; 03660 03661 if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。 03662 wdata[0] = 0x20; 03663 03664 wdata[1] = (( y / 100 ) % 10 ) + 0x30; 03665 wdata[2] = 0x2E;//ASCII "." 03666 wdata[3] = (( y / 10 ) % 10 ) + 0x30; 03667 wdata[4] = ( y % 10 ) + 0x30; 03668 03669 i2c.write(addr_gu, wdata, 5); 03670 03671 gu_print1("mA"); 03672 03673 } 03674 03675 /************************************** 03676 2バイトを10進数で表示する 0~65535 03677 1/1000倍 format *0.000 03678 mV→V Ω→kΩ 03679 **************************************/ 03680 void gu_putdeck(short* x) 03681 { 03682 03683 short num; 03684 03685 //プラスマイナスの表示 03686 if( *x >= 0 ) { 03687 wdata[0] = 0x2B;//ascii "+" 03688 i2c.write(addr_gu, wdata, 1); 03689 num = *x; 03690 03691 } else { 03692 wdata[0] = 0x2D;//ascii "-" 03693 i2c.write(addr_gu, wdata, 1); 03694 03695 //*x = ( ~*x ) + 0x01;//2の補数 03696 num = *x * -1; 03697 } 03698 03699 wdata[0] = (( num / 10000 ) % 10 ) + 0x30; 03700 03701 if( wdata[0] == 0x30 )//2桁目が零の場合、"0"を表示しない。 03702 wdata[0] = 0x20; 03703 03704 wdata[1] = (( num / 1000 ) % 10 ) + 0x30; 03705 wdata[2] = 0x2E;//ASCII "." 03706 wdata[3] = (( num / 100 ) % 10 ) + 0x30; 03707 wdata[4] = (( num / 10 ) % 10 ) + 0x30; 03708 //wdata[5] = ( num % 10 ) + 0x30; 03709 03710 i2c.write(addr_gu, wdata, 5); 03711 03712 } 03713 03714 /******************************** 03715 03716 判定 LED点灯 03717 03718 ********************************/ 03719 void hantei(char noc) 03720 { 03721 int i; 03722 03723 //エラーフラグ 03724 for ( i=0; i<= 3 ; i++) { 03725 err_f[i] = 0; 03726 } 03727 03728 //ver1.2 03729 if (DEB_EN == 1) { 03730 voc[0] = 3100;//[mV] 03731 ocp[0] = -0.4*100;//[uA] 0.1uAのときocp[]の値は10 03732 iop[0] = 16.5*100;//[uA] 0.1uAのときicp[]の値は10 03733 voc[1] = 3100;//[V] 03734 ocp[1] = 0.4*100;//[uA] 03735 iop[1] = 16.5*100;//[uA] 03736 } 03737 //upto 03738 03739 for ( i = 0; i <= ( noc - 1 ); i++) { 03740 03741 /*ver1.1.3 規格設置値=0の場合は判定しない*/ 03742 if( voc[i] < calinfo.low_limit_voc && calinfo.low_limit_voc != 0) { 03743 err_f[i] = 1; 03744 } 03745 03746 if( iop[i] < calinfo.low_limit_iop ) { 03747 err_f[i] = 1; 03748 } 03749 03750 if( ocp[i] > calinfo.low_limit_ocp ) { 03751 err_f[i] = 1; 03752 } 03753 03754 //ver1.2.2 03755 if( ocp[i] < calinfo.up_limit_ocp && calinfo.up_limit_ocp != 0) { 03756 err_f[i] = 1; 03757 } 03758 03759 if( R[i] < calinfo.low_limit_resistor && calinfo.low_limit_resistor != 0 ) { 03760 err_f[i] = 1; 03761 } 03762 03763 if( R[i] > calinfo.up_limit_resistor && calinfo.up_limit_resistor != 0 ) { 03764 err_f[i] = 1; 03765 } 03766 03767 if( err_f[i] == 1) { 03768 led_red[i] = 1; 03769 } else { 03770 led_green[i] = 1; 03771 } 03772 03773 if ( SEQ_EN == 1 && err_f[i] == 0 ) { 03774 /*** ver3 03775 seq_hantei[i] = 1; 03776 ***/ 03777 seq_out[i] = 1; 03778 } 03779 03780 //ver1.2.3 03781 char *print_text; 03782 03783 if(DEB_EN == 1) { 03784 03785 gu_fontsize(1); 03786 gu_cursor(0,2); 03787 gu_print1(" "); 03788 03789 if(err_f[i] == 1) { 03790 03791 switch(i){ 03792 case 0: 03793 print_text="FAIL DUT1"; 03794 break; 03795 case 1: 03796 print_text="FAIL DUT2"; 03797 break; 03798 } 03799 03800 gu_fontsize(1); 03801 gu_cursor(0,2); 03802 gu_print1(print_text); 03803 wait(1); 03804 } 03805 if(err_f[i] == 0) { 03806 03807 03808 switch(i){ 03809 case 0: 03810 print_text="PASS DUT1"; 03811 break; 03812 case 1: 03813 print_text="PASS DUT2"; 03814 break; 03815 } 03816 03817 gu_fontsize(1); 03818 gu_cursor(0,2); 03819 gu_print1(print_text); 03820 03821 wait(1); 03822 } 03823 } 03824 //upto 03825 03826 }//for 03827 03828 03829 } 03830 03831 /******************************************************************************* 03832 03833 measure voltage 03834 測定CHを指定して、電圧値Rを返す 03835 char ch 0~3 -> 1ch ~ 4ch 03836 03837 ver3.0.0 リレー制御シーケンスを追加 03838 03839 *******************************************************************************/ 03840 short meas_voltage(char ch)//ch 0~3 -> 1ch ~ 4ch 03841 { 03842 char com; 03843 short sdata; 03844 03845 switch(ch) { 03846 case 0: 03847 /*** ver3 *****************/ 03848 rlen[4] = 1; //RLEN5="H" 03849 wait(ton_rr); 03850 /**************************/ 03851 03852 com = adc_config(2,0);//ch1(adc),12bit 03853 i2c.write( addr_ADC1, &com, 1); 03854 wait(0.1); 03855 sdata = read_adc(addr_ADC1); 03856 break; 03857 03858 case 1: 03859 03860 /*** ver3 *****************/ 03861 rlen[5] = 1; //RLEN6="H" 03862 wait(ton_rr); 03863 /**************************/ 03864 03865 com = adc_config(3,0);//ch2(adc),12bit 03866 i2c.write( addr_ADC1, &com, 1); 03867 wait(0.1); 03868 sdata = read_adc(addr_ADC1); 03869 break; 03870 03871 case 2: 03872 03873 /*** ver3 *****************/ 03874 rlen[6] = 1; //RLEN7="H" 03875 wait(ton_rr); 03876 /**************************/ 03877 03878 com = adc_config(2,0);//ch1(adc),12bit 03879 i2c.write( addr_ADC2, &com, 1); 03880 wait(0.1); 03881 sdata = read_adc(addr_ADC2); 03882 break; 03883 03884 case 3: 03885 03886 /*** ver3 *****************/ 03887 rlen[7] = 1; //RLEN8="H" 03888 wait(ton_rr); 03889 /**************************/ 03890 03891 com = adc_config(3,0);//ch2(adc),12bit 03892 i2c.write( addr_ADC2, &com, 1); 03893 wait(0.1); 03894 sdata = read_adc(addr_ADC2); 03895 break; 03896 03897 }// end switch 03898 03899 /*** ver3 ***/ 03900 //電圧測定用リレーを全てオフ 03901 for (int i = 4; i <= 7; i++){ 03902 rlen[i] = 0; 03903 } 03904 wait(toff_rr); 03905 /************/ 03906 03907 //プリアンプ倍率を代入して、電圧値を算出する(単位はmV) 03908 sdata = sdata * 5;//プリアンプ倍率 03909 03910 return ( sdata ); 03911 } 03912 03913 03914 /******************************************************************************* 03915 03916 measure resistor 03917 03918 測定CHを指定して、抵抗測定値Rを返す 03919 char ch 0~3 -> 1ch ~ 4ch 03920 03921 ver3.0.0 リレー制御追加 03922 03923 *******************************************************************************/ 03924 short meas_resistor(char ch)//ch 0~3 -> 1ch ~ 4ch 03925 { 03926 char com; 03927 short sdata; 03928 03929 switch(ch) { 03930 case 0: 03931 /* 03932 //ver1.2.0 03933 if (RL_EN == 1) { 03934 io[6] = 1; //外付けリレーON 03935 wait(TIME_RELAY_ON); 03936 } 03937 //up to here 03938 */ 03939 03940 /*** ver3 *****************/ 03941 rlen[0] = 1; //RLEN1="H" 03942 wait(ton_rr); 03943 /**************************/ 03944 03945 com = adc_config(0,0);//ch1(adc),12bit 03946 i2c.write( addr_ADC1, &com, 1); 03947 wait(0.1); 03948 sdata = read_adc(addr_ADC1); 03949 03950 /* 03951 //ver1.2.0 relay off 03952 if (RL_EN == 1) { 03953 io[6] = 0 ; 03954 } 03955 */ 03956 03957 break; 03958 03959 case 1: 03960 03961 /* 03962 //ver1.2.0 03963 if (RL_EN == 1) { 03964 io[7] = 1; //外付けリレーON 03965 wait(TIME_RELAY_ON); 03966 } 03967 //up to here 03968 */ 03969 03970 /*** ver3 *****************/ 03971 rlen[1] = 1; //RLEN2="H" 03972 wait(ton_rr); 03973 /**************************/ 03974 03975 com = adc_config(1,0);//ch2(adc),12bit 03976 i2c.write( addr_ADC1, &com, 1); 03977 wait(0.1); 03978 sdata = read_adc(addr_ADC1); 03979 03980 /* 03981 //ver1.2.0 03982 if (RL_EN == 1) { 03983 io[7] = 0; 03984 } 03985 */ 03986 03987 break; 03988 03989 case 2: 03990 /*** ver3 *****************/ 03991 rlen[2] = 1; //RLEN3="H" 03992 wait(ton_rr); 03993 /**************************/ 03994 03995 com = adc_config(0,0);//ch1(adc),12bit 03996 i2c.write( addr_ADC2, &com, 1); 03997 wait(0.1); 03998 sdata = read_adc(addr_ADC2); 03999 04000 break; 04001 04002 case 3: 04003 /*** ver3 *****************/ 04004 rlen[3] = 1; //RLEN4="H" 04005 wait(ton_rr); 04006 /**************************/ 04007 04008 com = adc_config(1,0);//ch2(adc),12bit 04009 i2c.write( addr_ADC2, &com, 1); 04010 wait(0.1); 04011 sdata = read_adc(addr_ADC2); 04012 04013 break; 04014 04015 }// end switch 04016 04017 /*** ver3 *********************/ 04018 //抵抗測定用リレーを全てオフ 04019 for (int i = 0; i <= 3; i++){ 04020 rlen[i] = 0; 04021 } 04022 wait(toff_rr); 04023 /*****************************/ 04024 04025 //検出用抵抗値を代入して、測定抵抗値を算出する(単位はmV,Ω) 04026 if ( sdata < res_vref ) { 04027 sdata =( rsense * sdata ) / ( res_vref - sdata); 04028 } else { 04029 sdata = res_vref;//overload 04030 } 04031 04032 return ( sdata ); 04033 } 04034 04035 04036 /********************************* 04037 04038 display resistor 04039 測定抵抗値を表示する 04040 04041 *********************************/ 04042 void display_resistor(short sdata)//測定値を表示する。 04043 { 04044 if ( sdata < res_vref && sdata >= 0 ) { 04045 gu_putdec(&sdata); 04046 } else { 04047 gu_print1(" OL ");//overload 04048 } 04049 gu_onebyte(0xEA);//ohm 04050 } 04051 04052 /************************************** 04053 4バイトを10進数で表示する 0~9999 04054 **************************************/ 04055 void gu_putdec(short* x) 04056 { 04057 04058 char cmd[4]; 04059 04060 //cmd[0] = (( *x / 100000 ) % 10 ) + 0x30; 04061 cmd[0] = (( *x / 1000 ) % 10 ) + 0x30; 04062 cmd[1] = (( *x / 100 ) % 10 ) + 0x30; 04063 cmd[2] = (( *x / 10 ) % 10 ) + 0x30; 04064 cmd[3] = ( *x % 10 ) + 0x30; 04065 04066 i2c.write(addr_gu, cmd, 4); 04067 04068 } 04069 /********************************* 04070 04071 LED 照度 04072 設定読込~反映 04073 //メモリから設定値を読み出して、LEDのPWMのDutyを設定する 04074 //LED1設定値&LED2設定値の計2Byte読込 04075 04076 *********************************/ 04077 void read_syoudo(char* c) 04078 { 04079 //char cmd; //gu-DへのI2Cコマンド用配列 1byte0 04080 //char csyoudo[4];//led出力用pwm duty 設定比1バイト255段階 04081 04082 float duty_pwm; //pwm パーセンテージ 04083 int i; 04084 04085 //メモリ10h番地(照度設定データ)読み出し 04086 //cmd[0] = 0x10; //ver3 04087 //Sequential Read 04088 04089 i2c.write (eeprom_adrs, adrs_syoudo, 2,true); //ver3 repeated start,true - do not send stop condition 04090 //i2c.write (slave_adrs, &cmd, 1,true); //ver3 send 1 byte remove stop condition 04091 slave_adrs = eeprom_adrs + 0x01; //ver3 read mode 04092 i2c.read (slave_adrs, rdata, 4); //read 4 byte 04093 04094 for ( i = 0; i <=3; i++) { 04095 c[i] = rdata[i]; 04096 } 04097 04098 //set pwm duty 04099 for ( i = 0; i <= ( number_of_channels - 1 ); i++) { 04100 04101 if(c[i] == 0x00) { 04102 c[i] = 0x32; 04103 } 04104 04105 duty_pwm = COP * c[i]; 04106 04107 leds[i].write (duty_pwm);//Set Duty 04108 } 04109 } 04110 /********************************* 04111 04112 LED 照度調整 (Main) 04113 04114 *********************************/ 04115 void adjust_illumination() 04116 { 04117 char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte0 04118 //char *pcmd = cmd_gu; 04119 //char msg; 04120 //char *pmsg = &msg; 04121 char crdata[3]; 04122 char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F gu-D スイッチNo. 04123 char cswdata; // 0x00 or 0x01 ONかOFFか 04124 char *pcswnum = &cswnum; 04125 char *pcswdata = &cswdata; 04126 char csyoudo[4];//led出力用pwm duty 設定比1バイト255段階 04127 char ch; 04128 float duty_pwm;//pwm パーセンテージ 04129 int i; 04130 int x[4] = {64,64,192,192}; //レベル値の表示位置 x座標 04131 int y[4] = {2,4,2,4}; //レベル値の表示位置 y座標 04132 // 04133 //EEPROMから照度データ読込とPWMDUTYセット 04134 read_syoudo( csyoudo ); 04135 // 04136 //画面表示 04137 gu_cls();//画面のクリア 04138 gu_fontsize(2); 04139 gu_print1("Adjust illumination "); 04140 //照度レベルを256段階で表示 04141 //LED1 04142 gu_cursor(0,16/8); 04143 gu_print1("LED1 Lv "); 04144 //LED2 04145 gu_cursor(0,32/8); 04146 gu_print1("LED2 Lv "); 04147 //LED3 04148 if( number_of_channels >= 3 ) { 04149 gu_cursor(128,2); 04150 gu_print1("LED3 Lv "); 04151 } 04152 //LED4 04153 if( number_of_channels >= 4 ) { 04154 gu_cursor(128,4); 04155 gu_print1("LED4 Lv "); 04156 } 04157 // 04158 for ( i = 0; i <= ( number_of_channels - 1 ); i++) { 04159 04160 gu_cursor(x[i],y[i]); 04161 04162 cmd_gu[0] = ((csyoudo[i] / 100) & 0xFF) + 0x30; 04163 cmd_gu[1] = (csyoudo[i] - (csyoudo[i] / 100) * 100) / 10 + 0x30; 04164 cmd_gu[2] = ((csyoudo[i] % 10) & 0xFF) + 0x30; 04165 i2c.write(addr_gu, cmd_gu, 3); 04166 } 04167 04168 // 04169 gu_fontsize(1); 04170 gu_cursor(0,56/8); 04171 gu_print1("LED1"); 04172 gu_cursor(32,56/8); 04173 gu_print1("fine"); 04174 gu_cursor(64,56/8); 04175 gu_print1("LED2"); 04176 gu_cursor(96,56/8); 04177 gu_print1("fine"); 04178 04179 if( number_of_channels >= 3) { 04180 gu_cursor(128,56/8); 04181 gu_print1("LED3"); 04182 gu_cursor(160,56/8); 04183 gu_print1("fine"); 04184 } 04185 if( number_of_channels >= 4) { 04186 gu_cursor(192,56/8); 04187 gu_print1("LED4"); 04188 gu_cursor(224,56/8); 04189 gu_print1("fine"); 04190 } 04191 // 04192 //gu-D タッチスイッチ読み出し動作設定 p49 04193 cmd_gu[0]= 0x1F; 04194 cmd_gu[1]= 0x4B; 04195 cmd_gu[2]= 0x18; 04196 cmd_gu[3]= 0x02;//SW状態変化時自動送信モード2 04197 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 04198 // 04199 //ボタンイメージの表示 04200 for ( i = 17; i < 17 + ( number_of_channels * 2 ); i++) { 04201 gu_button_up(i); 04202 } 04203 for ( i = 25; i < 25 + ( number_of_channels * 2 ); i++) { 04204 gu_button_down(i); 04205 } 04206 gu_Button_power_on();//show button 04207 wait(0.2); 04208 04209 while(1) { 04210 04211 i2c.read ((addr_gu + 0x01), crdata, 3); 04212 04213 if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。 04214 *pcswnum = crdata[1]; //スイッチ番号 04215 *pcswdata = crdata[2];//ON/OFF情報 04216 04217 if (cswdata == 0x01) { //タッチしたならば 04218 04219 switch ( number_of_channels ) { //ver1.1.0 04220 04221 case 1: 04222 case 2: 04223 if ( cswnum >= 20 && cswnum <= 23 ) 04224 cswnum = 0; 04225 04226 if ( cswnum >= 28 && cswnum <= 31 ) 04227 cswnum = 0; 04228 04229 break; 04230 04231 case 3: 04232 if ( cswnum >= 22 && cswnum <= 23 ) 04233 cswnum = 0; 04234 04235 if ( cswnum >= 30 && cswnum <= 31 ) 04236 cswnum = 0; 04237 04238 break; 04239 04240 } //switch 04241 04242 switch( cswnum ) { //SWの番号(位置) 04243 04244 case 22: 04245 case 20: 04246 case 16: 04247 case 18: 04248 04249 ch = ( cswnum - 16 ) / 2; //SWnoから選択したLEDNoの算出 04250 04251 gu_button_up_on( cswnum + 1 ); 04252 wait(0.2); 04253 gu_button_up( cswnum + 1 ); 04254 wait(0.1); 04255 04256 if(csyoudo[ch] <= 0xEF ) { 04257 csyoudo[ch] = csyoudo[ch] + 0x0A; 04258 } 04259 04260 break; 04261 04262 case 23: 04263 case 21: 04264 case 17: 04265 case 19: 04266 04267 ch = ( cswnum - 17 ) / 2; //SWnoから選択したLEDNoの算出 04268 04269 gu_button_up_on( cswnum + 1 ); 04270 wait(0.2); 04271 gu_button_up( cswnum + 1 ); 04272 wait(0.1); 04273 04274 if(csyoudo[ch] <= 0xFF ) { 04275 csyoudo[ch] = csyoudo[ch] + 0x01; 04276 } 04277 04278 break; 04279 04280 case 24: 04281 case 26: 04282 case 28: 04283 case 30: 04284 04285 ch = ( cswnum - 24 ) / 2; //SWnoから選択したLEDNoの算出 04286 04287 gu_button_down_on( cswnum + 1 ); 04288 wait(0.2); 04289 gu_button_down( cswnum + 1 ); 04290 wait(0.1); 04291 04292 if(csyoudo[ch] >= 0x0A ) { 04293 csyoudo[ch] = csyoudo[ch] - 0x0A; 04294 } 04295 04296 break; 04297 04298 case 25: 04299 case 27: 04300 case 29: 04301 case 31: 04302 04303 ch = ( cswnum - 24 ) / 2; //SWnoから選択したLEDNoの算出 04304 04305 gu_button_down_on( cswnum + 1 ); 04306 wait(0.2); 04307 gu_button_down( cswnum + 1 ); 04308 wait(0.1); 04309 04310 if(csyoudo[ch] >= 0x01 ) { 04311 csyoudo[ch] = csyoudo[ch] - 0x01; 04312 } 04313 04314 break; 04315 04316 case 7 ://SW.8 保存ボタンを押すと現在のLED照度をEEPROMへ保存する 04317 04318 wdata[0] = adrs_syoudo[0]; //word address 書込み先頭アドレス指定 04319 wdata[1] = adrs_syoudo[1]; //ver3 04320 04321 for ( i = 0; i <= ( number_of_channels - 1 ); i++) { 04322 wdata[ i + 2 ] = csyoudo[i]; //DATA_LED i 04323 } 04324 04325 Soushin = i2c.write (eeprom_adrs, wdata,( number_of_channels + 2 )); // ver3 全送信BYTE数は、書込みデータにBYTE ADDRESSの2byteを加算した数 04326 04327 if(Soushin == 0) { 04328 gu_Button_power_off();//電源ボタンイメージ反転表示 04329 wait(0.3); 04330 04331 return;//照度調整ルーチンを抜ける 04332 } 04333 } //switch 04334 04335 04336 04337 //PWMのDUTY設定 04338 04339 for( i = 0; i <= ( number_of_channels - 1 ); i++) { 04340 duty_pwm = COP * csyoudo[i]; 04341 leds[i].write (duty_pwm);//Set Duty 04342 } 04343 04344 04345 //照度レベルを256段階で表示 04346 //LED1 04347 gu_fontsize(2); 04348 04349 for ( i = 0; i <= ( number_of_channels - 1 ); i++) { 04350 04351 gu_cursor(x[i],y[i]); 04352 04353 cmd_gu[0] = ((csyoudo[i] / 100) & 0xFF) + 0x30; 04354 cmd_gu[1] = (csyoudo[i] - (csyoudo[i] / 100) * 100) / 10 + 0x30; 04355 cmd_gu[2] = ((csyoudo[i] % 10) & 0xFF) + 0x30; 04356 i2c.write(addr_gu, cmd_gu, 3); 04357 } 04358 } 04359 } //if 04360 04361 wait(0.1);//gu-D 読込間隔の設定 04362 04363 } 04364 } 04365 04366 /********************************* 04367 04368 サブ基板LED(判定用)全消灯 04369 04370 *********************************/ 04371 void led_off() 04372 { 04373 int i; 04374 04375 for( i = 0; i <= ( number_of_channels - 1 ); i++) { 04376 led_green[ i ] = 0; 04377 led_red[ i ] = 0; 04378 } 04379 04380 } 04381 /********************************* 04382 04383 Utility Main 04384 gu_D 輝度調整 タッチ感度調整 04385 04386 *********************************/ 04387 void utility() //輝度調整サブルーチン 04388 { 04389 04390 char cmd_gu[32] ; //gu-DへのI2Cコマンド用配列 1byte0 04391 //char *pcmd = cmd_gu; 04392 char clumi; //輝度設定用変数 01h<=n<=08h 04393 char* pclumi = &clumi; //ポインタの定義 04394 char msg; 04395 char *pmsg = &msg; 04396 char crdata[3]; 04397 char cswnum; //SW_No. sw1->0x00 ~~ sw32->0x1F 04398 char cswdata; // 0x00 or 0x01 04399 char *pcswnum = &cswnum; 04400 char *pcswdata = &cswdata; 04401 // 04402 //メモリ00h番地(輝度設定データ)読み出し 04403 //wdata[0] = 0x00; 04404 //Soushin = i2c.write (eeprom_adrs, wdata, 1,true); //読込先頭アドレス指定 ReStart 04405 Soushin = i2c.write (eeprom_adrs, adrs_kido, 2,true); //ver3 読込先頭アドレス指定 2byte 04406 Jyushin = i2c.read ((eeprom_adrs + 0x01), rdata, 1);//read 1byte 04407 *pclumi = rdata[0]; 04408 04409 //輝度設定更新 04410 if(*pclumi==0x00 || *pclumi > 0x08) *pclumi=0x05; 04411 gu_luminance(pclumi); 04412 04413 //画面表示 04414 gu_cls();//画面のクリア 04415 gu_print1("Set Display Brightness"); 04416 gu_cursor(0,16/8); 04417 gu_print1("LEVEL "); 04418 *pmsg = *pclumi + 0x30; 04419 gu_print1(pmsg); 04420 04421 gu_cursor(0,96/8); //ver1.1.0 04422 gu_print1("DELETE EEPROM_DATA"); 04423 gu_set_button_font1(30,"del"); 04424 04425 //SW状態変化時自動送信モード2 04426 cmd_gu[0]= 0x1F; 04427 cmd_gu[1]= 0x4B; 04428 cmd_gu[2]= 0x18; 04429 cmd_gu[3]= 0x02; 04430 i2c.write(addr_gu, cmd_gu, 4); //gu-D タッチスイッチ読み出し動作設定 p49 04431 04432 //ボタンイメージの表示 04433 gu_button_up(6);//show button 04434 gu_button_down(14);//show button 04435 gu_Button_power_on();//show button 04436 04437 while(1) { 04438 04439 i2c.read ((addr_gu + 0x01), crdata, 3, true); 04440 04441 if (crdata[0] == 0x11 ) { //個別タッチスイッチ状態読み出しフォーマット。識別子11h。 04442 *pcswnum = crdata[1]; //スイッチ番号 04443 *pcswdata = crdata[2];//ON/OFF情報 04444 04445 if (cswdata == 0x01) { //タッチしたならば 04446 switch( cswnum ) { //SWの番号(位置) 04447 case 5 ://SW6 04448 gu_button_up_on( 6 ); 04449 wait(0.2); 04450 gu_button_up( 6 ); 04451 wait(0.1); 04452 04453 if(clumi < 8 ) *pclumi = *pclumi + 1; 04454 04455 break; 04456 04457 case 13 ://SW14 04458 gu_button_down_on( 14 ); 04459 wait(0.2); 04460 gu_button_down( 14 ); 04461 wait(0.1); 04462 04463 if(clumi >= 1 ) *pclumi = *pclumi - 1; 04464 04465 break; 04466 04467 case 29: //SW30 04468 04469 gu_reverse(0x01); //gu_リバース指定 04470 gu_set_button_font1(30,"del"); 04471 gu_reverse(0x00); //gu_リバース解除 04472 04473 erace_calinfo(); 04474 04475 gu_set_button_font1(30,"del"); 04476 04477 break; 04478 04479 case 0x07 ://保存ボタンを押すと現在の輝度をEEPROMへ保存する 04480 04481 //wdata[0] = 0x00 ; //word address 書込み先頭アドレス指定 04482 //wdata[1] = *pclumi ; //DATA 04483 04484 wdata[0] = adrs_kido[0]; //ver3 04485 wdata[1] = adrs_kido[1]; //ver3 04486 wdata[2] = *pclumi ; //ver3 04487 04488 Soushin = i2c.write (eeprom_adrs, wdata, 3); //ver3 04489 04490 if(Soushin == 0) { 04491 gu_Button_power_off();//電源ボタンイメージ反転表示 04492 wait(0.5); 04493 return;//輝度調整ルーチンを抜ける 04494 } 04495 04496 } //switch 04497 04498 gu_luminance(pclumi);//輝度変更 04499 gu_cursor(0,16/8); 04500 gu_print1("LEVEL "); 04501 *pmsg = *pclumi + 0x30; 04502 gu_print1(pmsg); 04503 04504 } 04505 } //if 04506 04507 wait(0.1);//gu-D 読込間隔の設定 04508 04509 } 04510 } 04511 04512 /********************************* 04513 gu_D グラフィックデータ 04514 *********************************/ 04515 char gu_Button_MODE_data[] = { 04516 0x7F,0xF0,0x80,0x08,0x80,0x0C,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A, 04517 0x80,0x0A,0x80,0x0A,0x80,0x0A,0x80,0x0A,0x7F,0xF2,0x20,0x02,0x1F,0xFC,0x00,0x00, 04518 }; 04519 04520 void gu_set_button(char sw_num,char* text) 04521 { 04522 char x; 04523 char y; 04524 04525 //SW_NoからSWの座標を求める 04526 x = ((sw_num - 1) % 8 ) * 32; 04527 y = ((sw_num - 1) / 8 ) * 32; 04528 04529 gu_drawButton(x,y,32,32, gu_Button_MODE_data ); 04530 04531 // Change Font Size 04532 gu_fontsize(2); 04533 // set font width 04534 gu_fontWidth(Proportional1); 04535 gu_print_dot( x + 8,y + 8,text); 04536 // Change Font Size 04537 gu_fontsize(1); 04538 // set font width 04539 gu_fontWidth(1); 04540 } 04541 04542 void gu_set_button_font1(char sw_num,char* text) 04543 { 04544 char x; 04545 char y; 04546 04547 //SW_NoからSWの座標を求める 04548 x = ((sw_num - 1) % 8 ) * 32; 04549 y = ((sw_num - 1) / 8 ) * 32; 04550 04551 gu_drawButton(x,y,32,32, gu_Button_MODE_data ); 04552 04553 // Change Font Size 04554 gu_fontsize(1); 04555 // set font width 04556 gu_fontWidth(1); 04557 gu_print_dot( x + 2,y + 10,text); 04558 04559 } 04560 04561 char gu_Button_up_data[] = { 04562 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08, 04563 0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x18,0x04, 04564 0x20,0x00,0x38,0x04,0x20,0x00,0x78,0x04,0x20,0x00,0xF8,0x04,0x20,0x01,0xF8,0x04, 04565 0x20,0x03,0xF8,0x04,0x20,0x07,0xF8,0x04,0x20,0x0F,0xF8,0x04,0x20,0x1F,0xF8,0x04, 04566 0x20,0x1F,0xF8,0x04,0x20,0x0F,0xF8,0x04,0x20,0x07,0xF8,0x04,0x20,0x03,0xF8,0x04, 04567 0x20,0x01,0xF8,0x04,0x20,0x00,0xF8,0x04,0x20,0x00,0x78,0x04,0x20,0x00,0x38,0x04, 04568 0x20,0x00,0x18,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04, 04569 0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 04570 }; 04571 04572 void gu_button_up(char sw_num) 04573 { 04574 char x; 04575 char y; 04576 04577 //SW_NoからSWの座標を求める 04578 x = ((sw_num - 1) % 8 ) * 32; 04579 y = ((sw_num - 1) / 8 ) * 32; 04580 04581 gu_cursor( x, y/8 ); 04582 gu_RealTimeImage(32, 32, gu_Button_up_data); 04583 } 04584 04585 void gu_Button_up1() 04586 { 04587 gu_cursor(224,8); 04588 gu_RealTimeImage(32, 32, gu_Button_up_data); 04589 } 04590 04591 void gu_Button_up2() 04592 { 04593 gu_cursor(192,8); 04594 gu_RealTimeImage(32, 32, gu_Button_up_data); 04595 } 04596 04597 void gu_Button_up3() 04598 { 04599 gu_cursor(160,8); 04600 gu_RealTimeImage(32, 32, gu_Button_up_data); 04601 } 04602 04603 void gu_Button_up4() 04604 { 04605 gu_cursor(128,8); 04606 gu_RealTimeImage(32, 32, gu_Button_up_data); 04607 } 04608 04609 char gu_Button_down_data[] = { 04610 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08, 04611 0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x18,0x00,0x04, 04612 0x20,0x1C,0x00,0x04,0x20,0x1E,0x00,0x04,0x20,0x1F,0x00,0x04,0x20,0x1F,0x80,0x04, 04613 0x20,0x1F,0xC0,0x04,0x20,0x1F,0xE0,0x04,0x20,0x1F,0xF0,0x04,0x20,0x1F,0xF8,0x04, 04614 0x20,0x1F,0xF8,0x04,0x20,0x1F,0xF0,0x04,0x20,0x1F,0xE0,0x04,0x20,0x1F,0xC0,0x04, 04615 0x20,0x1F,0x80,0x04,0x20,0x1F,0x00,0x04,0x20,0x1E,0x00,0x04,0x20,0x1C,0x00,0x04, 04616 0x20,0x18,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04, 04617 0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 04618 }; 04619 04620 void gu_button_down(char sw_num) 04621 { 04622 char x; 04623 char y; 04624 04625 //SW_NoからSWの座標を求める 04626 x = ((sw_num - 1) % 8 ) * 32; 04627 y = ((sw_num - 1) / 8 ) * 32; 04628 04629 gu_cursor( x, y/8 ); 04630 gu_RealTimeImage(32, 32, gu_Button_down_data); 04631 } 04632 04633 void gu_Button_down1() 04634 { 04635 gu_cursor(224,12); 04636 gu_RealTimeImage(32, 32, gu_Button_down_data); 04637 } 04638 04639 void gu_Button_down2() 04640 { 04641 gu_cursor(192,12); 04642 gu_RealTimeImage(32, 32, gu_Button_down_data); 04643 } 04644 04645 void gu_Button_down3() 04646 { 04647 gu_cursor(160,12); 04648 gu_RealTimeImage(32, 32, gu_Button_down_data); 04649 } 04650 04651 void gu_Button_down4() 04652 { 04653 gu_cursor(128,12); 04654 gu_RealTimeImage(32, 32, gu_Button_down_data); 04655 } 04656 04657 char gu_Button_up_on_data[] = { 04658 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8, 04659 0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xE7,0xFC, 04660 0x3F,0xFF,0xC7,0xFC,0x3F,0xFF,0x87,0xFC,0x3F,0xFF,0x07,0xFC,0x3F,0xFE,0x07,0xFC, 04661 0x3F,0xFC,0x07,0xFC,0x3F,0xF8,0x07,0xFC,0x3F,0xF0,0x07,0xFC,0x3F,0xE0,0x07,0xFC, 04662 0x3F,0xE0,0x07,0xFC,0x3F,0xF0,0x07,0xFC,0x3F,0xF8,0x07,0xFC,0x3F,0xFC,0x07,0xFC, 04663 0x3F,0xFE,0x07,0xFC,0x3F,0xFF,0x07,0xFC,0x3F,0xFF,0x87,0xFC,0x3F,0xFF,0xC7,0xFC, 04664 0x3F,0xFF,0xE7,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC, 04665 0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 04666 }; 04667 04668 void gu_button_up_on( char sw_num ) 04669 { 04670 char x; 04671 char y; 04672 04673 //SW_NoからSWの座標を求める 04674 x = ((sw_num - 1) % 8 ) * 32; 04675 y = ((sw_num - 1) / 8 ) * 32; 04676 04677 gu_cursor( x, y/8 ); 04678 04679 gu_RealTimeImage(32, 32, gu_Button_up_on_data); 04680 } 04681 04682 void gu_Button_up_on2() 04683 { 04684 gu_cursor(192,8); 04685 gu_RealTimeImage(32, 32, gu_Button_up_on_data); 04686 } 04687 04688 char gu_Button_down_on_data[] = { 04689 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8, 04690 0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xE7,0xFF,0xFC, 04691 0x3F,0xE3,0xFF,0xFC,0x3F,0xE1,0xFF,0xFC,0x3F,0xE0,0xFF,0xFC,0x3F,0xE0,0x7F,0xFC, 04692 0x3F,0xE0,0x3F,0xFC,0x3F,0xE0,0x1F,0xFC,0x3F,0xE0,0x0F,0xFC,0x3F,0xE0,0x07,0xFC, 04693 0x3F,0xE0,0x07,0xFC,0x3F,0xE0,0x0F,0xFC,0x3F,0xE0,0x1F,0xFC,0x3F,0xE0,0x3F,0xFC, 04694 0x3F,0xE0,0x7F,0xFC,0x3F,0xE0,0xFF,0xFC,0x3F,0xE1,0xFF,0xFC,0x3F,0xE3,0xFF,0xFC, 04695 0x3F,0xE7,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC, 04696 0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 04697 }; 04698 04699 void gu_button_down_on(char sw_num) 04700 { 04701 char x; 04702 char y; 04703 04704 //SW_NoからSWの座標を求める 04705 x = ((sw_num - 1) % 8 ) * 32; 04706 y = ((sw_num - 1) / 8 ) * 32; 04707 04708 gu_cursor( x, y/8 ); 04709 04710 gu_RealTimeImage(32, 32, gu_Button_down_on_data); 04711 } 04712 04713 void gu_Button_down_on2() 04714 { 04715 gu_cursor(192,12); 04716 gu_RealTimeImage(32, 32, gu_Button_down_on_data); 04717 } 04718 04719 char gu_Button_power_on_data[] = { 04720 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x10,0x00,0x00,0x08, 04721 0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x03,0xF0,0x04, 04722 0x20,0x0F,0xFC,0x04,0x20,0x1F,0xFE,0x04,0x20,0x3C,0x0F,0x04,0x20,0x38,0x07,0x84, 04723 0x20,0x00,0x03,0x84,0x20,0x00,0x03,0xC4,0x20,0x00,0x01,0xC4,0x21,0xFF,0x01,0xC4, 04724 0x21,0xFF,0x01,0xC4,0x20,0x00,0x01,0xC4,0x20,0x00,0x03,0xC4,0x20,0x00,0x03,0x84, 04725 0x20,0x38,0x07,0x84,0x20,0x3C,0x0F,0x04,0x20,0x1F,0xFE,0x04,0x20,0x0F,0xFC,0x04, 04726 0x20,0x03,0xF0,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04,0x20,0x00,0x00,0x04, 04727 0x10,0x00,0x00,0x08,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 04728 }; 04729 04730 void gu_Button_power_on() 04731 { 04732 gu_cursor(224,0); 04733 gu_RealTimeImage(32, 32, gu_Button_power_on_data); 04734 } 04735 04736 04737 char gu_Button_power_off_data[] = { 04738 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xFF,0xF0,0x1F,0xFF,0xFF,0xF8, 04739 0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFC,0x0F,0xFC, 04740 0x3F,0xF0,0x03,0xFC,0x3F,0xE0,0x01,0xFC,0x3F,0xC3,0xF0,0xFC,0x3F,0xC7,0xF8,0x7C, 04741 0x3F,0xFF,0xFC,0x7C,0x3F,0xFF,0xFC,0x3C,0x3F,0xFF,0xFE,0x3C,0x3C,0x00,0x7E,0x3C, 04742 0x3C,0x00,0x7E,0x3C,0x3F,0xFF,0xFE,0x3C,0x3F,0xFF,0xFC,0x3C,0x3F,0xFF,0xFC,0x7C, 04743 0x3F,0xC7,0xF8,0x7C,0x3F,0xC1,0xE0,0xFC,0x3F,0xE0,0x01,0xFC,0x3F,0xF0,0x03,0xFC, 04744 0x3F,0xFC,0x0F,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC,0x3F,0xFF,0xFF,0xFC, 04745 0x1F,0xFF,0xFF,0xF8,0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 04746 }; 04747 04748 void gu_Button_power_off() 04749 { 04750 gu_cursor(224,0); 04751 gu_RealTimeImage(32, 32, gu_Button_power_off_data); 04752 } 04753 04754 /********************************* 04755 ノリタケ関数 04756 ここから 04757 **********************************/ 04758 // 04759 // Clear screen// 04760 void gu_cls() 04761 { 04762 04763 i2c.start(); 04764 i2c.write(addr_gu); 04765 i2c.write(0x0c); 04766 i2c.stop(); 04767 04768 } 04769 04770 void gu_drawButton(int x, int y, int w, int h, const char data[]) 04771 { 04772 h = h >> 3; // get height in byte 04773 y = y >> 3; // get Y location in byte 04774 04775 gu_cursor(x,y); 04776 // Realtime Image draw header 04777 04778 i2c.start(); 04779 i2c.write(addr_gu); 04780 gu_sendOneByte(0x1f); 04781 gu_sendOneByte(0x28); 04782 gu_sendOneByte(0x66); 04783 gu_sendOneByte(0x11); 04784 gu_sendOneByte( w & 0xff); 04785 gu_sendOneByte( w >> 8); 04786 gu_sendOneByte( h & 0xff); 04787 gu_sendOneByte( h >> 8); 04788 gu_sendOneByte(0x01); 04789 04790 for(int i = 0; i<w; i++) { 04791 if(i<8) { // 8 dots from left 04792 gu_sendOneByte(data[i*2]); 04793 if(h>2) { 04794 for(int j=0; j<(h-2); j++) { 04795 if((data[i*2]&0x01)==0) { 04796 gu_sendOneByte(0x00); 04797 } else { 04798 gu_sendOneByte(0xff); 04799 } 04800 } 04801 } 04802 gu_sendOneByte(data[i*2+1]); 04803 } else if (i > (w-8)) { // 8 dots from right 04804 04805 gu_sendOneByte(data[(16+i-w)*2]); 04806 if(h>2) for(int j=0; j<(h-2); j++) { 04807 if((data[(16+i-w)*2]&0x01)==0) { 04808 gu_sendOneByte(0x00); 04809 } else { 04810 gu_sendOneByte(0xff); 04811 } 04812 } 04813 gu_sendOneByte(data[(16+i-w)*2+1]); 04814 04815 } else { // in the middle 04816 gu_sendOneByte(data[14]); 04817 if(h>2) { 04818 for(int j=0; j<(h-2); j++) { 04819 if((data[14]&0x01)==0) { 04820 gu_sendOneByte(0x00); 04821 } else { 04822 gu_sendOneByte(0xff); 04823 } 04824 } 04825 } 04826 gu_sendOneByte(data[15]); 04827 } 04828 } 04829 04830 i2c.stop(); 04831 04832 } 04833 04834 04835 // ドット単位キャラクタ表示 p37 04836 void gu_print_dot(int x, int y, const char* ptext) 04837 { 04838 04839 i2c.start(); 04840 i2c.write(addr_gu); 04841 gu_sendOneByte(0x1f); 04842 gu_sendOneByte(0x28); 04843 gu_sendOneByte(0x64); 04844 gu_sendOneByte(0x30); 04845 gu_sendOneByte(x & 0xff); 04846 gu_sendOneByte(x >> 8); 04847 gu_sendOneByte(y & 0xff); 04848 gu_sendOneByte(y >> 8); 04849 gu_sendOneByte(0x00); 04850 04851 int i=0; 04852 int j=0; 04853 while(*(ptext+i)) { 04854 if (*(ptext + i++) =='%') { 04855 j+=2; //文字列終端”0%"までインクリメント 04856 } 04857 } 04858 04859 gu_sendOneByte(i-j); //キャラクタデータ長 04860 gu_print(ptext); //キャラクタデータ 04861 04862 i2c.stop(); 04863 04864 } 04865 04866 // 04867 // Print test// 04868 void gu_print(const char t[] ) 04869 { 04870 i2c.start(); 04871 i2c.write(addr_gu); 04872 04873 int i=0; 04874 int j=0; 04875 int k=0; 04876 while(t[i]) { 04877 if(t[i] != 37) { 04878 gu_sendOneByte(t[i++]); 04879 } else { 04880 i++; 04881 j=t[i++]-0x30; 04882 if(j>9) { 04883 j -= 7; 04884 } 04885 if(j>0x10) { 04886 j -= 0x20; 04887 } 04888 k=t[i++]-0x30; 04889 if(k>9) { 04890 k -= 7; 04891 } 04892 if(k>0x10) { 04893 k -= 0x20; 04894 } 04895 gu_sendOneByte(j*16+k); 04896 } 04897 } 04898 i2c.stop(); 04899 } 04900 04901 void gu_RealTimeImage(int w, int h, char data[]) 04902 { 04903 h = h >> 3; // get height in byte 04904 04905 i2c.start(); 04906 gu_sendOneByte(addr_gu); 04907 gu_sendOneByte(0x1f); 04908 gu_sendOneByte(0x28); 04909 gu_sendOneByte(0x66); 04910 gu_sendOneByte(0x11); 04911 gu_sendOneByte( w & 0xff); 04912 gu_sendOneByte( w >> 8); 04913 gu_sendOneByte( h & 0xff); 04914 gu_sendOneByte( h >> 8); 04915 gu_sendOneByte(0x01); 04916 for( int i=0; i < ( w * h ); i++) { 04917 gu_sendOneByte( data[i]); 04918 } 04919 i2c.stop(); 04920 } 04921 04922 // Draw RealTimeBitImage by dot 04923 void gu_RealTimeImage_dot(int x, int y, int w, int h, const char data[]) 04924 { 04925 i2c.start(); 04926 gu_sendOneByte(addr_gu); 04927 gu_sendOneByte(0x1f); 04928 gu_sendOneByte(0x28); 04929 gu_sendOneByte(0x64); 04930 gu_sendOneByte(0x21); 04931 gu_sendOneByte(x & 0xff); 04932 gu_sendOneByte(x >> 8); 04933 gu_sendOneByte(y & 0xff); 04934 gu_sendOneByte(y >> 8); 04935 gu_sendOneByte(w & 0xff); 04936 gu_sendOneByte(w >> 8); 04937 gu_sendOneByte(h & 0xff); 04938 gu_sendOneByte(h >> 8); 04939 gu_sendOneByte(0x01); 04940 for(int i=0; i<( w * ((h + 7)>>3)); i++ ) { 04941 gu_sendOneByte(data[i]); 04942 } 04943 i2c.stop(); 04944 } 04945 04946 04947 // Set Font width 04948 void gu_fontWidth(const char fontWidth) 04949 { 04950 /* 04951 gu_sendOneByte(0x1f); 04952 gu_sendOneByte(0x28); 04953 gu_sendOneByte(0x67); 04954 gu_sendOneByte(0x03); 04955 gu_sendOneByte(fontWidth); 04956 */ 04957 04958 char accom_gu[5] ; //gu-DへのI2Cコマンド用配列 04959 04960 accom_gu[0] = 0x1F; 04961 accom_gu[1] = 0x28; 04962 accom_gu[2] = 0x67; 04963 accom_gu[3] = 0x03; 04964 accom_gu[4] = fontWidth; 04965 04966 i2c.write(addr_gu, accom_gu, 5); 04967 04968 } 04969 04970 // 04971 // Move Cursor 04972 // 動作確認完了 2017/6/26 04973 void gu_cursor(int x, int y) 04974 { 04975 04976 /* 04977 gu_sendOneByte(0x1f); 04978 gu_sendOneByte(0x24); 04979 gu_sendOneByte(x%256); 04980 gu_sendOneByte(x>>8); 04981 gu_sendOneByte(y%256); 04982 gu_sendOneByte(y>>8); 04983 */ 04984 04985 char accom_gu[6] ; //gu-DへのI2Cコマンド用配列 04986 04987 accom_gu[0] = 0x1f; 04988 accom_gu[1] = 0x24; 04989 accom_gu[2] = x & 0xFF; 04990 accom_gu[3] = x >> 8; 04991 accom_gu[4] = y & 0xFF; 04992 accom_gu[5] = y >> 8; 04993 04994 i2c.write(addr_gu, accom_gu, 6); 04995 04996 } 04997 04998 // Font Body Size 04999 // 動作確認2017/6/26 05000 void gu_fontsize(const char code) 05001 { 05002 /* 05003 gu_sendOneByte(0x1f); 05004 gu_sendOneByte(0x28); 05005 gu_sendOneByte(0x67); 05006 gu_sendOneByte(0x01); 05007 gu_sendOneByte(code); 05008 */ 05009 char accom_gu[5] ; //gu-DへのI2Cコマンド用配列 05010 05011 accom_gu[0] = 0x1F; 05012 accom_gu[1] = 0x28; 05013 accom_gu[2] = 0x67; 05014 accom_gu[3] = 0x01; 05015 accom_gu[4] = code; 05016 05017 i2c.write(addr_gu, accom_gu, 5); 05018 05019 } 05020 05021 05022 // 05023 // Reverse video font 05024 void gu_fontReverse(int code) 05025 { 05026 05027 i2c.start(); 05028 gu_sendOneByte(addr_gu); 05029 gu_sendOneByte(0x1f); 05030 gu_sendOneByte(0x72); 05031 gu_sendOneByte(code); 05032 i2c.stop(); 05033 05034 } 05035 05036 void gu_touchPara(int x,int y) 05037 { 05038 i2c.start(); 05039 i2c.write(addr_gu); 05040 i2c.write(0x1F); 05041 i2c.write(0x4B); 05042 i2c.write(0x70); 05043 i2c.write(x & 0xFF); 05044 i2c.write(y & 0xFF); 05045 i2c.stop(); 05046 } 05047 05048 // Magnify Font キャラクタ拡大表示 05049 void gu_magnify(int x, int y) 05050 { 05051 gu_sendOneByte(0x1f); 05052 gu_sendOneByte(0x28); 05053 gu_sendOneByte(0x67); 05054 gu_sendOneByte(0x40); 05055 gu_sendOneByte(x); 05056 gu_sendOneByte(y); 05057 } 05058 05059 /********************************* 05060 ノリタケ関数 05061 ここまで 05062 **********************************/ 05063 // 05064 //Show text 05065 void gu_print1(const char* ptext) 05066 { 05067 i2c.write(addr_gu, ptext, strlen(ptext)); 05068 } 05069 // 05070 //輝度調整 05071 void gu_luminance(const char* cl) 05072 { 05073 i2c.start(); 05074 i2c.write(addr_gu); 05075 i2c.write(0x1F); 05076 i2c.write(0x58); 05077 i2c.write(*cl & 0xFF); 05078 i2c.stop(); 05079 } 05080 // 05081 //gu_Dクラス用 1バイト送信 05082 void gu_sendOneByte(char data) //arduino->mbed 05083 { 05084 i2c.write(data); 05085 //while(digitalRead(gu_MBUSY)==HIGH){} // wait for ready. 05086 //Serial.write(data); // send a byte. 05087 } 05088 // 05089 //CF+RF 05090 void gu_CRLF() 05091 { 05092 char com[2]; 05093 05094 com[0] = 0x0A; //LF 05095 com[1] = 0x0D; //CR 05096 i2c.write(addr_gu, com, 2); //LF+CR 05097 } 05098 // 05099 //リバース指定or解除 05100 void gu_reverse(char x) //リバース指定or解除 05101 { 05102 char com[3]; 05103 05104 com[0] = 0x1F; 05105 com[1] = 0x72; 05106 com[2] = x & 0xFF; //0x01:指定 0x00:解除 05107 i2c.write(addr_gu, com, 3); 05108 } 05109 //1byte送信用 05110 void gu_onebyte(char data) 05111 { 05112 i2c.write(addr_gu, &data, 1); 05113 } 05114 /***************************************** 05115 05116 SD CARD 05117 05118 *****************************************/ 05119 void sd_writetext(const char* ptext) 05120 { 05121 05122 mkdir("/sd/mydir", 0777); 05123 05124 FILE *fp = fopen("/sd/mydir/iop.txt", "w");//ディレクトリとファイル名の指定 05125 05126 if(fp == NULL) { 05127 05128 gu_fontsize(1); 05129 gu_cursor(0,2); 05130 /* ver1.1.3*/ 05131 gu_print1("No SD card"); 05132 //gu_print1("Could not open file for SD card"); 05133 //error("Could not open file for write\n"); 05134 05135 } 05136 05137 fprintf(fp, ptext); 05138 fclose(fp); 05139 05140 } 05141 05142 05143 05144 /**************************************** 05145 05146 シーケンサ通信 05147 05148 ****************************************/ 05149 //一定時間CAL名未送信 05150 void seq_timeout(){ 05151 /* 05152 seq_name[0] = 2; 05153 seq_name[3] = 3; 05154 */ 05155 seq_name[0] = 50; 05156 seq_name[3] = 51; 05157 } 05158 05159 05160 //CAL名受信 05161 void seq_serialrecive(){ 05162 05163 seq_name[0] = pc.getc(); 05164 seq_name[1] = pc.getc(); 05165 seq_name[2] = pc.getc(); 05166 seq_name[3] = pc.getc(); 05167 05168 //CAL番号だけ抽出 05169 reg_num = (seq_name[1] - 0x30) * 10; 05170 reg_num = reg_num + (seq_name[2] - 0x30); 05171 05172 //EEPROMへCAL番号を書き込み 05173 wdata[0] = adrs_calnum[0]; //byte address a15~8 05174 wdata[1] = adrs_calnum[1]; //byte address a7~a0 05175 wdata[2] = reg_num; 05176 Soushin = i2c.write (eeprom_adrs, wdata, 3); //send stop at end default value is false. 05177 05178 } 05179 05180 05181 //測定データ送信 05182 void seq_serialsend(/*int noc*/) //デバック時int nocコメントアウト 05183 { 05184 char STX = 2; 05185 char EXT = 3; 05186 int i; 05187 int CH[] = {1,2,3,4}; 05188 int noc = 4; 05189 05190 for(i = 0; i <= ( noc - 1); i++){ 05191 //PCデバック用 pc.→uart.に変更で装置用へ変更出来る 05192 pc.printf("%c" , STX); 05193 pc.printf("%d" , CH[i]); 05194 pc.printf("%c" , ','); 05195 pc.printf("%d" , seq_name[0]); 05196 pc.printf("%c" , ','); 05197 pc.printf("%d" , seq_name[3]); 05198 pc.printf("%c" , ','); 05199 pc.printf("%d" , reg_num); 05200 pc.printf("%c" , ','); 05201 pc.printf("%s\n" , calinfo.name); 05202 pc.printf("%c" , ','); 05203 05204 //アンテナ抵抗値 05205 if(R[i] < res_vref && R[0] >= 0){ 05206 pc.printf("%d" , R[i]); 05207 } 05208 else{ 05209 pc.printf("%s" , "OL"); 05210 } 05211 05212 pc.printf("%c" , ','); 05213 pc.printf("%f" , fdata[i][0]); //Iop 05214 pc.printf("%c" , ','); 05215 pc.printf("%f" , fdata[i][1]); //Idd 05216 pc.printf("%c" , ','); 05217 pc.printf("%f" , fdata[i][2]); //Voc 05218 pc.printf("%c" , ','); 05219 pc.printf("%f" , vocp[i]); 05220 pc.printf("%c" , ','); 05221 05222 if(err_f == 0){ //void hanteiのエラーフラグを流用 05223 pc.printf("%s" , "PASS"); 05224 } 05225 else{ 05226 pc.printf("%s" , "FAIL"); 05227 } 05228 05229 pc.printf("%c" , ','); 05230 pc.printf("%d" , cat); 05231 pc.printf("%c\n" , EXT); 05232 }//for 05233 05234 }
Generated on Thu Aug 4 2022 04:43:32 by
1.7.2