/**************************************** *  LC_METER ***************************************/ #include <16f88.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOMCLR,NOIESO,NOFCMEN,NODEBUG #use fixed_io(a_outputs=PIN_A0,PIN_A1,PIN_A2,PIN_A3,PIN_A4) #use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3) #use delay(clock = 8000000) // clock 8MHz int timer_loop, gate_flag, counter_H, cal_flag; long counter_ML, ref; long freq_data, freq_ave; float fx, fref, x; /********LCD LIBLARY**************************/ //data output sub function void lcd_out(int code, int flag) { swap(code); output_b((code & 0x0F)); delay_ms(1); if (flag == 0) output_high(PIN_A0); //表示データの場合 else output_low(PIN_A0); //コマンドデータの場合 delay_us(2); //NOP output_high(PIN_A1); //strobe out delay_us(4); //NOP output_low(PIN_A1); //reset strobe delay_us(5); } //1文字表示関数 void lcd_data(int asci) { lcd_out(asci, 0); //上位4ビット出力 lcd_out(asci<<4, 0); //下位4ビット出力 delay_us(50); //50μsec待ち } //LCD COMMAND OUT void lcd_cmd(int cmd) { lcd_out(cmd, 1); //上位4ビット出力 delay_us(10); lcd_out(cmd<<4, 1); //下位4ビット出力 delay_ms(2); //2msec待ち } //LCD ALL CREAR void lcd_clear() { lcd_cmd(0x01); //初期化コマンド出力 delay_ms(15); //15msec待ち } //LCD INITIAL Function void lcd_init() { // set_tris_b(0); //モードセット delay_ms(500); lcd_out(0x30,1); //DL=1 8bit mode set delay_ms(5); lcd_out(0x30,1); //8bit set delay_ms(1); lcd_out(0x30,1); //8bit set delay_ms(1); lcd_out(0x20, 1); //4bit set delay_ms(1); lcd_cmd(0x28); //DL=0,N=1(2line),F=0(5x7dot) delay_us(50); lcd_cmd(0x08); //display off delay_us(50); lcd_cmd(0x0C); //display on delay_us(50); lcd_cmd(0x01); //display clear lcd_cmd(0x06); //Entry delay_ms(1); lcd_cmd(0x01); } /********ここから FREQ COUNTER*******************/ //Timer2 Function #int_timer2 void isr2() { timer_loop++; //loop count up if (timer_loop > 4) { timer_loop = 0; //loop_count reset setup_timer_1(T1_DISABLED); //T1 Gate close setup_timer_2(T2_DISABLED,0xFA,10); //T2 Gate close gate_flag = 1; //gate close flag ON } } //Timer1 Function #int_timer1 void isr1() { counter_H++; } // FREQ COUNT FUNCTION int32 freq_count() { timer_loop = 0; counter_H = 0; counter_ML = 0; gate_flag = 0; setup_timer_1(T1_EXTERNAL_SYNC | T1_DIV_BY_1); // setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); set_timer1(0); set_timer2(0); setup_timer_2(T2_DIV_BY_16,0xF9,10); enable_interrupts(INT_TIMER1); enable_interrupts(INT_TIMER2); enable_interrupts(GLOBAL); while(1) { if(gate_flag == 1) //gate close then { counter_ML = get_timer1(); freq_data = counter_ML; return(freq_data); } } } /////Calculate Average long ave_keisan() { int i; int32 sum_data; sum_data = 0; for (i=0; i<0x05; i++) { output_low(PIN_A2); //555 trig delay_us(2); //trig pulse width output_high(PIN_A2); freq_data = freq_count(); sum_data = sum_data + freq_data; delay_ms(10); } freq_data = sum_data / 5; return (freq_data); } /////keisan1 float keisan1(float fref, float fx, long ref) { // x = ((fref / fx) * (fref / fx) - 1) * ref; x =((fref / fx) * (fref / fx) - 1) * ref; return(x); } /////keisan2 float keisan2(float fref, float fx, long ref) { x = ((fx / fref) - 1) * ref; return(x); } ///// メイン関数 void main() { int range, t1_range, t2_range; int32 limit; set_tris_a(0x00); //all output set_tris_b(0xF0); //RB4-7 input setup_adc_ports(NO_ANALOGS); range = 0; // initilize output_low(PIN_A4); //range 0x0 cal_flag =1; output_high(PIN_A2); //555 trig high output_high(PIN_A3); //CAL Relay on lcd_init(); //LCD initializ lcd_clear(); //LCD clear lcd_data("LC Meter"); delay_ms(1000); lcd_clear(); lcd_data("CAL TEST"); delay_ms(1000); while(1) { do { t1_range = (input_B() & 0x30); //RB4,5 range input delay_ms(100); t2_range = (input_B() & 0x30); //RB4,5 range input delay_ms(100); } while(t1_range != t2_range); //range SW chattaring if (range != t2_range) { cal_flag = 1; //cal_mode set range = t2_range; output_high(PIN_A3); //CAL Relay ON delay_ms(100); //Relay on time } /********ここからRANGEに応じた処理*********/ switch(range)  //RB4,5 input { case 0x00:  //L_meas L_Range output_low(PIN_A4);    //Range Relay OFF delay_ms(20); ref = 102;  //L_ref =100uH limit = 100;  //range0 100mH max freq_data = ave_keisan(); break; case 0x10: //L_meas H_range output_high(PIN_A4); //Range Rely ON delay_ms(20); ref = 102; //L_ref = 100uH limit = 1000; //range1 10H max freq_data = ave_keisan(); break; case 0x20: //C_meas L_range ref = 160; //C_ref=100pF limit = 1500000; //range2 1uF max freq_data = ave_keisan(); break; case 0x30: //C_meas H_Range ref = 1; //Cref=1uF limit = 105; //max 105uF freq_data = ave_keisan(); break; defalut: break; } if (cal_flag == 1) //cal_mode { fref = freq_data; cal_flag = 0; //cal_flag reset output_low(PIN_A3); //cal relay off lcd_clear(); lcd_cmd(0x01); lcd_data("CAL OK"); lcd_cmd(0xC0); //LCD 2nd line printf(lcd_data,"%6.0f0Hz",fref); delay_ms(2000); } else { fx = freq_data; // lcd_clear(); // lcd_data("Meas OK"); if (range < 0x30) { x = keisan1(fref, fx, ref); //L_meas & C_L meas } else { x = keisan2(fref, fx, ref); //C_H meas } } if (x > limit) { lcd_cmd(0xC0); //LCD 2nd line lcd_data(" over "); } switch(range) { case 0x00: lcd_cmd(0x01); lcd_data(" Lx = "); lcd_cmd(0xC0); //LCD 2nd line if (x < 1000) printf(lcd_data,"%3.2fuH",x); if ((1000 <= x) && (x <100000)) { x = x / 1000; printf(lcd_data,"%3.2fmH",x); } break; case 0x10: lcd_cmd(0x01); lcd_data(" Lx = "); lcd_cmd(0xC0); //LCD 2nd line x = x / 1000000; if (x <= 20) printf(lcd_data,"%2.3fH",x); break; case 0x20: lcd_cmd(0x01); lcd_data(" Cx = "); lcd_cmd(0xC0); //LCD 2nd line if (x < 1000) // x<1000pF printf(lcd_data,"%3.2fpF",x); if ((1000 <= x) && (x <10000)) // 1000pF