void update_display(int ser_fd) { lcd_line1(ser_fd); char buffer[20]; sprintf(buffer, "%0.2f (%0.1f) %s", g_temperature_now, g_thermostat_temperature, g_last_state?"on ":"off"); write(ser_fd, &buffer[0], strlen(buffer)); }
void show_Cap13(void) { uint8_t key_pressed; // lcd_clear(); #ifdef POWER_OFF uint8_t times; for (times=0;times<250;) #else while (1) /* wait endless without the POWER_OFF option */ #endif { init_parts(); // set all parts to nothing found // cap.v_loss = 0; // clear vloss for low capacity values (<25pF)! ReadCapacity(TP3, TP1); PartFound = PART_CAPACITOR; #ifdef SamplingADC if (cap.cpre==-12 && cap.cval<100) { // if below 100 pF, try the alternative measuring method for small capacitors cap.cval = sampling_cap(TP3,TP1,0); cap.cpre = sampling_cap_pre; } #endif if (cap.cpre > -15) { /* Capacity below the detection limit */ cap.cpre_max = cap.cpre; // show_cap will display the cap.cval_max value cap.cval_max = cap.cval; show_cap(1); // with [C] at the end of line } else { /* no cap detected */ lcd_line1(); lcd_MEM2_string(CAP_13_str); // 1-||-3 lcd_spaces(LCD_LINE_LENGTH - 3 - _lcd_column); lcd_MEM2_string(CMETER_13_str); // "[C]" at the end of line 1 lcd_line2(); lcd_data('?'); lcd_clear_line(); // clear to end of line 2 #if (LCD_LINES > 2) lcd_line3(); lcd_clear_line(); // clear old Vloss= message #endif } #if defined(POWER_OFF) && defined(BAT_CHECK) Bat_update(times); #endif key_pressed = wait_for_key_ms(SCREEN_TIME); #ifdef WITH_ROTARY_SWITCH if ((key_pressed != 0) || (rotary.incre > 3)) break; #else if (key_pressed != 0) break; #endif #if defined(POWER_OFF) times = Pwr_mode_check(times); // no time limit with DC_Pwr_mode #endif } /* end for times */ lcd_clear(); // clear to end of line } /* end show_Cap13() */
/* ****************************************************************** */ void show_C_ESR() { uint8_t key_pressed; message_key_released(C_ESR_str); #ifdef POWER_OFF uint8_t times; for (times=0;times<250;times++) #else while (1) /* wait endless without the POWER_OFF option */ #endif { PartFound = PART_NONE; ReadBigCap(TP3,TP1); if (PartFound == PART_CAPACITOR) { lcd_line1(); // clear old capacity value lcd_clear_line(); lcd_line1(); lcd_data('C'); lcd_data('='); DisplayValue(cap.cval_max,cap.cpre_max,'F',3); cap.esr = GetESR(cap.cb,cap.ca); lcd_line2(); // clear old ESR value lcd_clear_line(); lcd_line2(); lcd_MEM_string(&ESR_str[1]); if (cap.esr < 65530) { DisplayValue(cap.esr,-2,LCD_CHAR_OMEGA,2); } else { lcd_data('?'); // too big } } else { lcd_clear(); lcd_MEM2_string(C_ESR_str); } key_pressed = wait_for_key_ms(1000); #ifdef WITH_ROTARY_SWITCH if ((key_pressed != 0) || (rotary.incre > 3)) break; #else if (key_pressed != 0) break; #endif } /* end for times */ } /* end show_C_ESR() */
int main(int argc, char **argv) { uint8_t mcusr; char startupmsg[17]; startmain: cli(); mcusr = MCUSR; MCUSR = 0; TOGGLE_BEGIN(); BSP_startmain(); /* Disables the watchdog timer. */ serial_init(); serial_send_rom(startup_message); serial_drain(); SERIALSTR("*** Reset reason:"); if (mcusr & (1 << WDRF)) SERIALSTR(" WD"); if (mcusr & (1 << BORF)) SERIALSTR(" BO"); if (mcusr & (1 << EXTRF)) SERIALSTR(" EXT"); if (mcusr & (1 << PORF)) SERIALSTR(" PO"); SERIALSTR("\r\n"); twi_ctor(); timekeeper_ctor(); lcd_init(); // Show the startup reason on the LCD. strcpy(startupmsg, "Startup: ----"); if (mcusr & (1<<3)) startupmsg[9] = 'W'; if (mcusr & (1<<2)) startupmsg[10] = 'B'; if (mcusr & (1<<1)) startupmsg[11] = 'X'; if (mcusr & (1<<0)) startupmsg[12] = 'P'; lcd_line1(startupmsg); _delay_ms(500); buttons_ctor(); alarm_ctor(); timedisplay_ctor(); timesetter_ctor(); /* Drain the serial output just before the watchdog timer is reenabled. */ serial_drain(); /* Turn off interrrupts until we have initialised the rest of the hardware, and after QF_run() has properly initialised the active objects. Interrupts go back on in QF_onStartup() */ QF_INT_LOCK(); /* Initialize the BSP. Enables the watchdog timer. */ BSP_init(); QF_run(); goto startmain; }
// check some EEprom values for correct values void EE_check_init(void) { #if (!defined(SamplingADC) || (PROCESSOR_TYP != 328)) && !defined(USE_EEPROM) uint8_t tt; // read test value tt = (uint8_t)eeprom_read_byte(&EE_ESR_ZEROtab[0]); // this value will never be changed by calibration if (tt != ESR_ZERO) goto init_ee; #ifdef AUTO_CAL uint8_t tt0; // value of first c_zero_tab uint8_t ww; // loop counter tt0 = tt; // init tt0 value for (ww=0;ww<7;ww++) { //checking loop tt = (uint8_t)eeprom_read_byte(&c_zero_tab[ww]); if (ww == 0) tt0 = tt; // save first value // for forth element, tt must be tt0 or tt0+1 if ((ww == 3) && ((tt != tt0) && (tt != (tt0+1)) && (tt != (tt0+2)) )) goto init_ee; if ((tt > 190) || (tt < 10)) goto init_ee; // value too low or too big } #endif return; init_ee: // init all EEprom values lcd_line1(); lcd_data('E'); lcd_data('E'); #ifdef AUTO_CAL // write the correction value for ADC internal 1.1V reference (void) eeprom_write_byte((uint8_t *)(&RefDiff), (uint8_t)REF_R_KORR); // offset for true reference Voltage // write the correction value for comparator 1.1V reference (void) eeprom_write_word((uint16_t *)(&ref_offset), REF_C_KORR); // hold zero offset + slew rate dependend offset // write all 7 c_zero_tab values (void) eeprom_write_word((uint16_t *)(&c_zero_tab[0]),((C_NULL)*256) + (C_NULL)); (void) eeprom_write_byte((uint8_t *)(&c_zero_tab[2]),(C_NULL+TP2_CAP_OFFSET)); (void) eeprom_write_byte((uint8_t *)(&c_zero_tab[3]),(C_NULL+2)); (void) eeprom_write_byte((uint8_t *)(&c_zero_tab[4]),(C_NULL+TP2_CAP_OFFSET)); (void) eeprom_write_word((uint16_t *)(&c_zero_tab[5]),((C_NULL)*256) + (C_NULL)); #endif // write 4 EE_ESR_ZEROtab values (void) eeprom_write_word((uint16_t *)(&EE_ESR_ZEROtab[0]),(ESR_ZERO*256)+ESR_ZERO); (void) eeprom_write_word((uint16_t *)(&EE_ESR_ZEROtab[2]),(ESR_ZERO*256)+ESR_ZERO); #if ((LCD_ST_TYPE == 7565) || (LCD_ST_TYPE == 1306)) (void) eeprom_write_byte((uint8_t *)(&EE_Volume_Value), VOLUME_VALUE); #endif #ifdef WITH_ROTARY_SWITCH // (void) eeprom_write_byte(&EE_RotarySwitch,0); // no switch is detected #endif wait_about1s(); // time to read the "EE" message, initialization of EEprom finished #endif }
void show_Resis13(void) { uint8_t key_pressed; message_key_released(RESIS_13_str); // "1-|=|-3 .." #ifndef RMETER_WITH_L lcd_set_cursor(0,6); lcd_MEM_string(RL_METER_str); // " [R]" or "[RL]" #endif #ifdef POWER_OFF uint8_t times; for (times=0;times<250;) #else while (1) /* wait endless without the POWER_OFF option */ #endif { init_parts(); // set all parts to nothing found GetResistance(TP3, TP1); GetResistance(TP1, TP3); lcd_line1(); // lcd_set_cursor(0,0); if (ResistorsFound != 0) { show_resis(TP1,TP3,1); } else { /* no resistor found */ #ifdef RMETER_WITH_L lcd_MEM_string(RESIS_13_str); lcd_MEM_string(RL_METER_str+4); // " [R]" or "[RL]" #endif lcd_line2(); lcd_data('?'); // too big #if LCD_LINES>2 lcd_next_line(0); #endif lcd_clear_line(); } #if defined(POWER_OFF) && defined(BAT_CHECK) Bat_update(times); #endif key_pressed = wait_for_key_ms(1000); #ifdef WITH_ROTARY_SWITCH if ((key_pressed != 0) || (rotary.incre > 3)) break; #else if (key_pressed != 0) break; #endif #if defined(POWER_OFF) times = Pwr_mode_check(times); // no time limit with DC_Pwr_mode #endif } /* end for times */ lcd_clear(); } /* end show_Resis13() */
/** Main routine for midi-link. **/ int main(void) { /** Disable watchdog. **/ wdt_disable(); /** setbits for the LEDs. **/ // DDRC |= _BV(5); DDRC |= _BV(4); sr165_init(); lcd_init(); lcd_line1(); lcd_puts("HELO"); for (;;) { uint16_t sr = sr165_read16(); lcd_line1(); lcd_putnumber16(sr); } /** Initialize UART. **/ uart_init(); usb_midi_init(); /** Initialize D12 pins and stack. **/ d12_pins_init(); d12_init(); /** Enable interrupts. **/ sei(); uint8_t uart_configured = 0; for (;;) { if (d12_device_is_configured() && (uart_configured == 0)) { /* discard data in uart buffer */ while (uart_avail()) { uart_getc(); } uart_configured = 1; } if (uart_configured < 100) { _delay_ms(10); uart_configured++; } else { /** Handle midi from UART and from USB. **/ midi_link_main(); } /** Handle usb status. **/ d12_main(); /* check ep2 again because of d12 bug */ uint8_t status; do { d12_read_cmd(D12_CMD_SELECT_EP + D12_MIDI_EP_OUT, &status, 1); if ((status & 1) && d12_device_is_configured() && (uart_configured > 100)) { handle_midi_ep_out(); } } while (status & 1); } }
/* *************************************************** */ void make_frequency() { #define MAX_FREQ_NR 19 uint8_t key_pressed; uint8_t freq_nr; uint8_t old_freq; message_key_released(F_GEN_str); // display f-Generator and wait for key released // OC1B is connected with 680 Ohm resistor to TP2 (middle test pin) TCCR1A = (0<<COM1B1) | (1<<COM1B0) | (0<<WGM11) | (0<<WGM10); // CTC mode, count to OCR1A TIMSK1 = 0; // no interrupt used OCR1A = 1; // highest frequency OCR1B = 0; // toggle OC1B at this count TIFR1 = (1<<OCF1A) | (1<<OCF1A) | (1<<TOV1); // reset interrupt flags TCCR1C = 0; TCCR1B = (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10); // set counter mode R_PORT = 0; // set all resistor port outputs to GND #if PROCESSOR_TYP == 644 R_DDR = (1<<PIN_RL1) | (1<<PIN_RL2) | (1<<PIN_RL3); // set TP1, DDD4(TP2) and TP3 to output #else R_DDR = (1<<PIN_RL1) | (1<<PIN_RL3); // set TP1 and TP3 to output #endif ADC_PORT = TXD_VAL; ADC_DDR = (1<<TP1) | TXD_MSK; //connect TP1 to GND DDRB |= (1<<DDB2); // set output enable TCCR1B = (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); // no clock divide old_freq = 0; freq_nr = MAX_FREQ_NR - 1; // start with 1 MHz #ifdef POWER_OFF uint8_t new_points; // one point for every 30 seconds wait time uint8_t shown_points; // one point for every 30 seconds wait time uint8_t times; // total wait time shown_points = 0; for (times=0; times<240; times++) #else while (1) /* wait endless without option POWER_OFF */ #endif { #define KEYPRESS_LENGTH_10ms 0 #ifdef POWER_OFF new_points = (times+10) / 30; if (new_points != shown_points) { // count of points has changed, build LCD line1 new lcd_line1(); lcd_clear_line(); // clear line 1 lcd_line1(); lcd_MEM2_string(F_GEN_str); // display f-Generator shown_points = new_points; for (new_points=0; new_points<shown_points ;new_points++) { lcd_data('.'); // show elapsed time, one point is 30 seconds } } #undef KEYPRESS_LENGTH_10ms #define KEYPRESS_LENGTH_10ms 20 /* change frequency only with >200ms key press */ #endif if (old_freq != freq_nr) { // new frequency is selected if (freq_nr > MAX_FREQ_NR) freq_nr -= (MAX_FREQ_NR + 1); old_freq = freq_nr; // update the last active frequency number #ifdef FOUR_LINE_LCD lcd_line2(); lcd_clear_line(); // clear line 2 for previous frequency lcd_line2(); lcd_space(); // add a space to row 1 of line2 switch_frequency(freq_nr + MAX_FREQ_NR); lcd_line4(); lcd_clear_line(); // clear line 4 for next frequency lcd_line4(); lcd_space(); // add a space to row 1 of line4 switch_frequency(freq_nr + 1); lcd_line3(); lcd_clear_line(); // clear line 3 for new frequency lcd_line3(); lcd_data('>'); switch_frequency(freq_nr); #else lcd_line2(); lcd_clear_line(); // clear line 2 for next frequency lcd_line2(); switch_frequency(freq_nr); #endif } /* end if (old_freq != freq_nr) */ key_pressed = wait_for_key_ms(1000); #ifdef POWER_OFF #ifdef WITH_ROTARY_SWITCH if ((key_pressed != 0) || (rotary.incre > 0)) times = 0; // reset counter, operator is active #else if (key_pressed != 0) times = 0; // reset counter, operator is active #endif #endif #ifdef WITH_ROTARY_SWITCH if (rotary.incre > FAST_ROTATION) break; // fast rotation ends voltage measurement if (rotary.count >= 0) { freq_nr += rotary.count; // increase the frequency number by rotary.count } else { freq_nr += (MAX_FREQ_NR + 1 + rotary.count); // decrease the frequency by rotary.count } #endif if (key_pressed > KEYPRESS_LENGTH_10ms) freq_nr++; // longer key press select next frequency if(key_pressed >= 80) break; // more than 0.8 seconds } /* end for times */ TCCR1B = 0; // stop counter TCCR1A = 0; // stop counter ADC_DDR = TXD_MSK; // disconnect TP1 R_DDR = 0; // switch resistor ports to Input DDRB &= ~(1<<DDB2); // disable output } /* end make frequency */
/* *************************************************** */ void show_vext() { #ifdef WITH_VEXT uint8_t key_pressed; uint8_t key_long_pressed; unsigned int Vext; // show the external voltage message_key_released(VOLTAGE_str); key_long_pressed = 0; #ifdef POWER_OFF uint8_t times; for (times=0;times<240;times++) #else while (1) /* wait endless without option POWER_OFF */ #endif { #ifdef TPex2 lcd_line1(); // 2 Vext measurements lcd_clear_line(); lcd_line1(); #else lcd_line2(); // only one measurement use line 2 lcd_clear_line(); lcd_line2(); #endif /* TPex2 */ #ifdef WITH_UART uart_newline(); // start of new measurement uart_newline(); // start of new measurement #endif lcd_MEM_string(Vext_str); // Vext= Vext = W5msReadADC(TPext); // read external voltage // ADC_DDR = TXD_MSK; //activate Software-UART #if EXT_NUMERATOR <= (0xffff/U_VCC) DisplayValue(Vext*EXT_NUMERATOR/EXT_DENOMINATOR,-3,'V',3); // Display 3 Digits of this mV units #else DisplayValue((unsigned long)Vext*EXT_NUMERATOR/EXT_DENOMINATOR,-3,'V',3); // Display 3 Digits of this mV units #endif #ifdef TPex2 lcd_line2(); lcd_clear_line(); lcd_line2(); #ifdef WITH_UART uart_newline(); // start of new measurement #endif lcd_MEM_string(Vext_str); // Vext= Vext = W5msReadADC(TPext); // read external voltage #if EXT_NUMERATOR <= (0xffff/U_VCC) DisplayValue(Vext*EXT_NUMERATOR/EXT_DENOMINATOR,-3,'V',3); // Display 3 Digits of this mV units #else DisplayValue((unsigned long)Vext*EXT_NUMERATOR/EXT_DENOMINATOR,-3,'V',3); // Display 3 Digits of this mV units #endif #endif /* TPex2 */ key_pressed = wait_for_key_ms(1000); #ifdef POWER_OFF #ifdef WITH_ROTARY_SWITCH if ((key_pressed > 0) || (rotary.incre > 0)) times = 0; // reset the loop counter, operator is active if (rotary.incre > 5) break; // fast rotation ends voltage measurement #else if (key_pressed > 0) times = 0; //reset the loop counter, operator is active #endif #endif if (key_pressed > ((1000/10)-6)) { key_long_pressed++; // count the long key press } if (key_pressed == 0) key_long_pressed = 0; //reset the key long pressed counter if (key_long_pressed > 4) break; // five seconds end the loop } /* end for times */ #endif /* WITH_VEXT */ } /* end show_vext() */
//begin of transistortester program int main(void) { uint8_t ii; unsigned int max_time; #ifdef SEARCH_PARASITIC unsigned long n_cval; // capacitor value of NPN B-E diode, for deselecting the parasitic Transistor int8_t n_cpre; // capacitor prefix of NPN B-E diode #endif #ifdef WITH_GRAPHICS unsigned char options; #endif uint8_t vak_diode_nr; // number of the protection diode of BJT union { uint16_t pw; uint8_t pb[2]; } rpins; uint8_t x, y, z; //switch on ON_DDR = (1<<ON_PIN); // switch to output ON_PORT = (1<<ON_PIN); // switch power on #ifndef PULLUP_DISABLE RST_PORT |= (1<<RST_PIN); // enable internal Pullup for Start-Pin #endif uint8_t tmp; //ADC-Init ADCSRA = (1<<ADEN) | AUTO_CLOCK_DIV; //prescaler=8 or 64 (if 8Mhz clock) #ifdef __AVR_ATmega8__ // #define WDRF_HOME MCU_STATUS_REG #define WDRF_HOME MCUCSR #else #define WDRF_HOME MCUSR #if FLASHEND > 0x3fff // probably was a bootloader active, disable the UART UCSR0B = 0; // disable UART, if started with bootloader #endif #endif wait500ms(); #if (PROCESSOR_TYP == 644) || (PROCESSOR_TYP == 1280) #define BAUD_RATE 9600 // UBRR0H = (F_CPU / 16 / BAUD_RATE - 1) >> 8; // UBRR0L = (F_CPU / 16 / BAUD_RATE - 1) & 0xff; // UCSR0B = (1<<TXEN0); // UCSR0C = (1<<USBS0) | (3<<UCSZ00); // 2 stop bits, 8-bit // while (!(UCSR0A & (1<<UDRE0))) { }; // wait for send data port ready #ifdef SWUART_INVERT SERIAL_PORT &= ~(1<<SERIAL_BIT); #else SERIAL_PORT |= (1<<SERIAL_BIT); #endif SERIAL_DDR |= (1<<SERIAL_BIT); #endif tmp = (WDRF_HOME & ((1<<WDRF))); // save Watch Dog Flag WDRF_HOME &= ~(1<<WDRF); //reset Watch Dog flag wdt_disable(); // disable Watch Dog #ifndef INHIBIT_SLEEP_MODE // switch off unused Parts #if PROCESSOR_TYP == 644 #ifdef PRUSART1 PRR0 = (1<<PRTWI) | (1<<PRSPI) | (1<<PRUSART1); #else PRR0 = (1<<PRTWI) | (1<<PRSPI) ; #endif // PRR1 = (1<<PRTIM3) ; #elif PROCESSOR_TYP == 1280 PRR0 = (1<<PRTWI) | (1<<PRSPI) | (1<<PRUSART1); PRR1 = (1<<PRTIM5) | (1<<PRTIM4) | (1<<PRTIM3) | (1<<PRUSART3) | (1<<PRUSART2) | (1<<PRUSART3); #else PRR = (1<<PRTWI) | (1<<PRSPI) | (1<<PRUSART0); #endif // disable digital inputs of Analog pins, but TP1-3 digital inputs must be left enabled for VGS measurement DIDR0 = ((1<<ADC5D) | (1<<ADC4D) | (1<<ADC3D) | (1<<ADC2D) | (1<<ADC1D) | (1<<ADC0D)) & ~((1<<TP3) | (1<<TP2) | (1<<TP1)); TCCR2A = (0<<WGM21) | (0<<WGM20); // Counter 2 normal mode TCCR2B = CNTR2_PRESCALER; //prescaler set in autoconf #endif /* INHIBIT_SLEEP_MODE */ sei(); // enable interrupts lcd_init(); //initialize LCD // ADC_PORT = TXD_VAL; // ADC_DDR = TXD_MSK; if(tmp) { // check if Watchdog-Event // this happens, if the Watchdog is not reset for 2s // can happen, if any loop in the Program doen't finish. lcd_line1(); lcd_MEM_string(TestTimedOut); //Output Timeout wait_about3s(); // time to read the Timeout message switch_tester_off(); return 0; } #ifdef PULLUP_DISABLE #ifdef __AVR_ATmega8__ SFIOR = (1<<PUD); // disable Pull-Up Resistors mega8 #else MCUCR = (1<<PUD); // disable Pull-Up Resistors mega168 family #endif #endif //#if POWER_OFF+0 > 1 // tester display time selection #ifndef USE_EEPROM EE_check_init(); // init EEprom, if unset #endif #ifdef WITH_ROTARY_SWITCH // rotary_switch_present = eeprom_read_byte(&EE_RotarySwitch); rotary.ind = ROT_MSK+1; //initilize state history with next call of check_rotary() #endif #ifdef WITH_HARDWARE_SERIAL // ii = 60; ii = 30; #else #if 1 for (ii=0; ii<60; ii++) { if (RST_PIN_REG & (1 << RST_PIN)) break; // button is released wait_about10ms(); } #else ii = 0; if (!(RST_PIN_REG & (1<<RST_PIN))) { // key is still pressed ii = wait_for_key_ms(700); } #endif display_time = OFF_WAIT_TIME; // LONG_WAIT_TIME for single mode, else SHORT_WAIT_TIME if (ii > 30) { display_time = LONG_WAIT_TIME; // ... set long time display anyway } #endif // WITH_HARDWARE_SERIAL #if POWER_OFF+0 > 1 empty_count = 0; mess_count = 0; #endif ADCconfig.RefFlag = 0; Calibrate_UR(); // get Ref Voltages and Pin resistance #ifdef WDT_enabled wdt_enable(WDTO_2S); //Watchdog on #endif #ifdef WITH_MENU if (ii >= 60) { while(function_menu()); // selection of function } #endif //***************************************************************** //Entry: if start key is pressed before shut down loop_start: #if ((LCD_ST_TYPE == 7565) || (LCD_ST_TYPE == 1306)) lcd_command(CMD_DISPLAY_ON); lcd_command(CMD_SET_ALLPTS_NORMAL); // 0xa4 #endif lcd_clear(); // clear the LCD ADC_DDR = TXD_MSK; // activate Software-UART init_parts(); // reset parts info to nothing found Calibrate_UR(); // get Ref Voltages and Pin resistance lcd_line1(); // Cursor to 1. row, column 1 #ifdef BAT_CHECK // Battery check is selected Battery_check(); #else lcd_MEM_string(VERSION_str); // if no Battery check, Version .. in row 1 #endif /* BAT_CHECK */ // begin tests #if FLASHEND > 0x1fff if (WithReference) { /* 2.5V precision reference is checked OK */ #if POWER_OFF+0 > 1 if ((mess_count == 0) && (empty_count == 0)) #endif { /* display VCC= only first time */ lcd_line2(); lcd_MEM_string(VCC_str); // VCC= Display_mV(ADCconfig.U_AVCC,3); // Display 3 Digits of this mV units lcd_refresh(); // write the pixels to display, ST7920 only wait_about1s(); // time to read the VCC= message } } #endif #ifdef WITH_VEXT unsigned int Vext; // show the external voltage while (!(RST_PIN_REG & (1<<RST_PIN))) { lcd_clear_line2(); lcd_MEM_string(Vext_str); // Vext= ADC_DDR = 0; //deactivate Software-UART Vext = W5msReadADC(TPext); // read external voltage // ADC_DDR = TXD_MSK; //activate Software-UART uart_newline(); // MAURO replaced uart_putc(' ') by uart_newline(), 'Z' #if EXT_NUMERATOR <= (0xffff/U_VCC) Display_mV(Vext*EXT_NUMERATOR/EXT_DENOMINATOR,3); // Display 3 Digits of this mV units #else DisplayValue((unsigned long)Vext*EXT_NUMERATOR/EXT_DENOMINATOR,-3,'V',3); // Display 3 Digits of this mV units #endif lcd_refresh(); // write the pixels to display, ST7920 only wait_about300ms(); // delay to read the Vext= message } #endif /* WITH_VEXT */ #ifndef DebugOut lcd_line2(); //LCD position row 2, column 1 #endif EntladePins(); // discharge all capacitors! if(PartFound == PART_CELL) { lcd_clear(); lcd_MEM_string(Cell_str); // display "Cell!" #if FLASHEND > 0x3fff lcd_line2(); // use LCD line 2 Display_mV(cell_mv[0],3); lcd_space(); Display_mV(cell_mv[1],3); lcd_space(); Display_mV(cell_mv[2],3); #endif #ifdef WITH_SELFTEST lcd_refresh(); // write the pixels to display, ST7920 only wait_about2s(); AutoCheck(0x11); // full Selftest with "Short probes" message #endif goto tt_end; } #ifdef WITH_SELFTEST #ifdef AUTO_CAL lcd_cursor_off(); UnCalibrated = (eeprom_read_byte(&c_zero_tab[3]) - eeprom_read_byte(&c_zero_tab[0])); if (UnCalibrated != 0) { // if calibrated, both c_zero_tab values are identical! c_zero_tab[3] is not used otherwise lcd_cursor_on(); } #endif #ifdef WITH_MENU AutoCheck(0x00); //check, if selftest should be done, only calibration #else AutoCheck(0x01); //check, if selftest should be done, full selftest without MENU #endif #endif #if FLASHEND > 0x1fff lcd_clear_line2(); //LCD position row2, column 1 #else lcd_line2(); //LCD position row2, column 1 #endif lcd_MEM_string(TestRunning); //String: testing... lcd_refresh(); // write the pixels to display, ST7920 only #ifdef WITH_UART uart_putc(0x03); // ETX, start of new measurement uart_newline(); // MAURO Added #endif // // check all 6 combinations for the 3 pins // High Low Tri CheckPins(TP1, TP2, TP3); CheckPins(TP2, TP1, TP3); CheckPins(TP1, TP3, TP2); CheckPins(TP3, TP1, TP2); CheckPins(TP2, TP3, TP1); CheckPins(TP3, TP2, TP1); // Capacity measurement is only possible correctly with two Pins connected. // A third connected pin will increase the capacity value! // if(((PartFound == PART_NONE) || (PartFound == PART_RESISTOR) || (PartFound == PART_DIODE)) ) { if(PartFound == PART_NONE) { // If no part is found yet, check separate if is is a capacitor #ifdef DebugOut lcd_data('C'); #endif EntladePins(); // discharge capacities //measurement of capacities in all 3 combinations ReadCapacity(TP3, TP1); #ifdef DebugOut lcd_data('K'); #endif #if DebugOut != 10 ReadCapacity(TP3, TP2); #ifdef DebugOut lcd_data('K'); #endif ReadCapacity(TP2, TP1); #ifdef DebugOut lcd_data('K'); #endif #endif } #ifdef WITH_UJT // check for UJT if (PartFound==PART_DIODE && NumOfDiodes==2 // UJT is detected as 2 diodes E-B1 and E-B2... // && ResistorsFound==1 // ...and a resistor B1-B2 && diodes.Anode[0]==diodes.Anode[1] // check diodes have common anode // && (unsigned char)(ResistorList[0]+diodes.Anode[0])==2 // and resistor is between cathodes ) // note: there also exist CUJTs (complementary UJTs); they seem to be (even) rarer than UJTs, and are not supported for now { CheckUJT(); } #endif /* defined WITH_UJT */ #ifdef WITH_XTAL if (PartFound==PART_NONE || ((PartFound==PART_CAPACITOR) && (cap.cpre_max == -12))) { // still not recognized anything? then check for ceramic resonator or crystal // these tests are time-consuming, so we do them last, and only on TP1/TP3 sampling_test_xtal(); } #endif //All checks are done, output result to display #ifdef DebugOut // only clear two lines of LCD lcd_clear_line1(); #else lcd_clear(); // clear total display #endif _trans = &ntrans; // default transistor structure to show if (PartFound == PART_THYRISTOR) { #ifdef WITH_GRAPHICS lcd_big_icon(THYRISTOR|LCD_UPPER_LEFT); lcd_draw_trans_pins(-8, 16); lcd_set_cursor(0,TEXT_RIGHT_TO_ICON); // position behind the icon, Line 1 lcd_MEM_string(Thyristor); //"Thyristor" #else lcd_MEM_string(Thyristor); //"Thyristor" PinLayout(Cathode_char,'G','A'); // CGA= or 123=... #endif goto TyUfAusgabe; } if (PartFound == PART_TRIAC) { #ifdef WITH_GRAPHICS lcd_big_icon(TRIAC|LCD_UPPER_LEFT); lcd_draw_trans_pins(-8, 16); lcd_set_cursor(0,TEXT_RIGHT_TO_ICON); // position behind the icon, Line 1 lcd_MEM_string(Triac); //"Triac" #else lcd_MEM_string(Triac); //"Triac" PinLayout('1','G','2'); // CGA= or 123=... #endif goto TyUfAusgabe; } #ifdef WITH_PUT if (PartFound == PART_PUT) { static const unsigned char PUT_str[] MEM_TEXT = "PUT"; lcd_MEM_string(PUT_str); _trans=&ptrans; PinLayout('A','G',Cathode_char); goto TyUfAusgabe; } #endif #ifdef WITH_UJT if (PartFound == PART_UJT) { static const unsigned char UJT_str[] MEM_TEXT = "UJT"; lcd_MEM_string(UJT_str); PinLayout('1','E','2'); #ifdef SamplingADC static const unsigned char eta_str[] MEM_TEXT = " eta="; lcd_next_line(0); ResistorChecked[ntrans.e - TP_MIN + ntrans.c - TP_MIN - 1] = 0; // forget last resistance measurement GetResistance(ntrans.c, ntrans.e); // resistor value is in ResistorVal[resnum] DisplayValue(ResistorVal[ntrans.e - TP_MIN + ntrans.c - TP_MIN - 1],-1,LCD_CHAR_OMEGA,2); lcd_MEM_string(eta_str); //"eta=" DisplayValue(ntrans.gthvoltage,0,'%',3); #else /* ! SamplingADC */ static const unsigned char R12_str[] MEM_TEXT = "R12="; lcd_next_line(0); lcd_MEM_string(R12_str); //"R12=" DisplayValue(ResistorVal[ntrans.e - TP_MIN + ntrans.c - TP_MIN - 1],-1,LCD_CHAR_OMEGA,2); lcd_data(','); DisplayValue(((RR680PL * (unsigned long)(ADCconfig.U_AVCC - ntrans.uBE)) / ntrans.uBE)-RRpinPL,-1,LCD_CHAR_OMEGA,3); #endif /* SamplingADC */ goto tt_end; } #endif /* WITH_UJT */ if (PartFound == PART_CAPACITOR) { #if FLASHEND > 0x3fff if ((cap.ca + cap.cb) == (TP1 + TP3)) { show_Cap13(); // repeated capacity measurement goto shut_off; // key was pressed or timeout } show_cap(0); // show capacity in normal way and measure additional parameters #else show_cap_simple(); // show capacity in normal way and measure additional parameters #endif goto tt_end; } /* end PartFound == PART_CAPACITOR */ #ifdef WITH_XTAL if (PartFound == PART_CERAMICRESONATOR) { // static const unsigned char cerres_str[] MEM_TEXT = "Cer.resonator "; lcd_MEM_string(cerres_str); if (sampling_measure_xtal()) goto loop_start; goto tt_end; } if (PartFound == PART_XTAL) { // static const unsigned char xtal_str[] MEM_TEXT = "Crystal "; lcd_MEM_string(xtal_str); if (sampling_measure_xtal()) goto loop_start; goto tt_end; } #endif // ======================================== if(PartFound == PART_DIODE) { // ======================================== if(NumOfDiodes == 1) { //single Diode // lcd_MEM_string(Diode); //"Diode: " #if FLASHEND > 0x1fff // enough memory (>8k) to sort the pins and additional Ir= DiodeSymbol_withPins(0); GetIr(diodes.Cathode[0],diodes.Anode[0]); // measure and output Ir=x.xuA #else // too less memory to sort the pins DiodeSymbol_withPins(0); #endif UfAusgabe(0x70); // mark for additional resistor and output Uf= in line 2 #ifndef SamplingADC /* load current of capacity is (5V-1.1V)/(470000 Ohm) = 8298nA */ ReadCapacity(diodes.Cathode[0],diodes.Anode[0]); // Capacity opposite flow direction if (cap.cpre < -3) { /* capacity is measured */ #if (LCD_LINES > 2) lcd_line3(); // output Capacity in line 3 #endif lcd_MEM_string(Cap_str); //"C=" #if LCD_LINE_LENGTH > 16 DisplayValue(cap.cval,cap.cpre,'F',3); #else DisplayValue(cap.cval,cap.cpre,'F',2); #endif } #else // SamplingADC showdiodecap: cap.cval=sampling_cap(diodes.Cathode[0],diodes.Anode[0],0); // at low voltage lcd_next_line_wait(0); // next line, wait 5s and clear line 2 DisplayValue(cap.cval,sampling_cap_pre,'F',2); #ifdef PULLUP_DISABLE lcd_data('-'); cap.cval=sampling_cap(diodes.Cathode[0],diodes.Anode[0],1); // at high voltage if (cap.cval < 0) cap.cval = 0; // don't show negativ value DisplayValue(cap.cval,sampling_cap_pre,'F',2); #if LCD_LINE_LENGTH > 16 lcd_MEM_string(AT05volt); // " @0-5V" #else lcd_MEM_string(AT05volt+1); // "@0-5V" #endif uart_newline(); // MAURO Diode ('A') #else #warning Capacity measurement from high to low not possible for diodes without PULLUP_DISABLE option! #endif /* PULLUP_DISABLE */ #endif goto end3; } else if(NumOfDiodes == 2) { // double diode lcd_data('2'); lcd_MEM_string(Dioden); //"diodes " if(diodes.Anode[0] == diodes.Anode[1]) { //Common Anode DiodeSymbol_CpinApin(0); // 1-|<-2 DiodeSymbol_ACpin(1); // ->|-3 UfAusgabe(0x01); #ifdef SamplingADC goto showdiodecap; // double diodes are often varicap; measure capacitance of one of them #else goto end3; #endif } if(diodes.Cathode[0] == diodes.Cathode[1]) { //Common Cathode DiodeSymbol_ApinCpin(0); // 1->|-2 DiodeSymbol_CApin(1); // -|<-3 UfAusgabe(0x01); #ifdef SamplingADC goto showdiodecap; // double diodes are often varicap; measure capacitance of one of them #else goto end3; #endif // else if ((diodes.Cathode[0] == diodes.Anode[1]) && (diodes.Cathode[1] == diodes.Anode[0])) } if (diodes.Cathode[0] == diodes.Anode[1]) { // normaly two serial diodes are detected as three diodes, but if the threshold is high // for both diodes, the third diode is not detected. // can also be Antiparallel diode_sequence = 0x01; // 0 1 SerienDiodenAusgabe(); goto end3; } if (diodes.Cathode[1] == diodes.Anode[0]) { diode_sequence = 0x10; // 1 0 SerienDiodenAusgabe(); goto end3; } } else if(NumOfDiodes == 3) { //Serial of 2 Diodes; was detected as 3 Diodes diode_sequence = 0x33; // 3 3 /* Check for any constellation of 2 serial diodes: Only once the pin No of anyone Cathode is identical of another anode. two diodes in series is additionally detected as third big diode. */ if (diodes.Cathode[0] == diodes.Anode[1]) { diode_sequence = 0x01; // 0 1 } if (diodes.Anode[0] == diodes.Cathode[1]) { diode_sequence = 0x10; // 1 0 } if (diodes.Cathode[0] == diodes.Anode[2]) { diode_sequence = 0x02; // 0 2 } if (diodes.Anode[0] == diodes.Cathode[2]) { diode_sequence = 0x20; // 2 0 } if (diodes.Cathode[1] == diodes.Anode[2]) { diode_sequence = 0x12; // 1 2 } if (diodes.Anode[1] == diodes.Cathode[2]) { diode_sequence = 0x21; // 2 1 } // if((ptrans.b<3) && (ptrans.c<3)) if(diode_sequence < 0x22) { lcd_data('3'); lcd_MEM_string(Dioden); //"Diodes " SerienDiodenAusgabe(); goto end3; } } // end (NumOfDiodes == 3) lcd_MEM_string(Bauteil); //"Bauteil" lcd_MEM_string(Unknown); //" unbek." lcd_line2(); //2. row lcd_data(NumOfDiodes + '0'); lcd_data('*'); lcd_MEM_string(AnKat_str); //"->|-" lcd_MEM_string(Detected); //" detected" goto not_known; // end (PartFound == PART_DIODE) // ======================================== } else if (PartFound == PART_TRANSISTOR) { // ======================================== #ifdef SEARCH_PARASITIC if ((ptrans.count != 0) && (ntrans.count !=0)) { // Special Handling of NPNp and PNPn Transistor. // If a protection diode is built on the same structur as the NPN-Transistor, // a parasitic PNP-Transistor will be detected. ReadCapacity(ntrans.e, ntrans.b); // read capacity of NPN base-emitter n_cval = cap.cval; // save the found capacity value n_cpre = cap.cpre; // and dimension ReadCapacity(ptrans.b, ptrans.e); // read capacity of PNP base-emitter // check if one hfe is very low. If yes, simulate a very low BE capacity if ((ntrans.hfe < 500) && (ptrans.hfe >= 500)) n_cpre = -16; // set NPN BE capacity to low value if ((ptrans.hfe < 500) && (ntrans.hfe >= 500)) cap.cpre = -16; // set PNP BE capacity to low value if (((n_cpre == cap.cpre) && (cap.cval > n_cval)) || (cap.cpre > n_cpre)) { // the capacity value or dimension of the PNP B-E is greater than the NPN B-E PartMode = PART_MODE_PNP; } else { PartMode = PART_MODE_NPN; } } /* end ((ptrans.count != 0) && (ntrans.count !=0)) */ #endif // not possible for mega8, change Pin sequence instead. if ((ptrans.count != 0) && (ntrans.count != 0) && (!(RST_PIN_REG & (1 << RST_PIN)))) { // if the Start key is still pressed, use the other Transistor #if 0 if (PartMode == PART_MODE_NPN) { PartMode = PART_MODE_PNP; // switch to parasitic transistor } else { PartMode = PART_MODE_NPN; // switch to parasitic transistor } #else PartMode ^= (PART_MODE_PNP - PART_MODE_NPN); #endif } #ifdef WITH_GRAPHICS lcd_set_cursor(0,TEXT_RIGHT_TO_ICON); // position behind the icon, Line 1 lcd_big_icon(BJT_NPN|LCD_UPPER_LEFT); // show the NPN Icon at lower left corner if(PartMode == PART_MODE_NPN) { // _trans = &ntrans; is allready selected a default lcd_MEM_string(NPN_str); //"NPN " if (ptrans.count != 0) { lcd_data('p'); // mark for parasitic PNp } } else { _trans = &ptrans; // change transistor structure lcd_update_icon(bmp_pnp); // update for PNP lcd_MEM_string(PNP_str); //"PNP " if (ntrans.count != 0) { lcd_data('n'); // mark for parasitic NPn } } #else /* only character display */ if(PartMode == PART_MODE_NPN) { // _trans = &ntrans; is allready selected a default lcd_MEM_string(NPN_str); //"NPN " if (ptrans.count != 0) { lcd_data('p'); // mark for parasitic PNp } } else { _trans = &ptrans; // change transistor structure lcd_MEM_string(PNP_str); //"PNP " if (ntrans.count != 0) { lcd_data('n'); // mark for parasitic NPn } } lcd_space(); #endif // show the protection diode of the BJT vak_diode_nr = search_vak_diode(); if (vak_diode_nr < 5) { // no side of the diode is connected to the base, this must be the protection diode #ifdef WITH_GRAPHICS options = 0; if (_trans->c != diodes.Anode[vak_diode_nr]) options |= OPT_VREVERSE; lcd_update_icon_opt(bmp_vakdiode,options); // show the protection diode right to the Icon #else /* only character display, show the diode in correct direction */ char an_cat; // diode is anode-cathode type an_cat = 0; #ifdef EBC_STYLE #if EBC_STYLE == 321 // Layout with 321= style an_cat = (((PartMode == PART_MODE_NPN) && (ntrans.c < ntrans.e)) || ((PartMode != PART_MODE_NPN) && (ptrans.c > ptrans.e))); #else // Layout with EBC= style an_cat = (PartMode == PART_MODE_NPN); #endif #else // Layout with 123= style an_cat = (((PartMode == PART_MODE_NPN) && (ntrans.c > ntrans.e)) || ((PartMode != PART_MODE_NPN) && (ptrans.c < ptrans.e))); #endif if (an_cat) { lcd_MEM_string(AnKat_str); //"->|-" } else { lcd_MEM_string(KatAn_str); //"-|<-" } #endif /* !WITH_GRAPHICS */ } /* endif vak_diode_nr < 6 */ #ifdef WITH_GRAPHICS lcd_draw_trans_pins(-7, 16); // show the pin numbers lcd_next_line(TEXT_RIGHT_TO_ICON); // position behind the icon, Line 2 lcd_MEM_string(hfe_str); //"B=" (hFE) DisplayValue(_trans->hfe,-2,0,3); lcd_next_line(TEXT_RIGHT_TO_ICON+1-LOW_H_SPACE); // position behind the icon+1, Line 3 lcd_data('I'); if (_trans->current >= 10000) { lcd_data('e'); // emitter current has 10mA offset _trans->current -= 10000; } else { lcd_data('c'); } lcd_equal(); // lcd_data('='); DisplayValue16(_trans->current,-6,'A',2); // display Ic or Ie current lcd_next_line(TEXT_RIGHT_TO_ICON); // position behind the icon, Line 4 lcd_MEM_string(Ube_str); //"Ube=" Display_mV(_trans->uBE,3-LOW_H_SPACE); last_line_used = 1; #ifdef SHOW_ICE if (_trans->ice0 > 0) { lcd_next_line_wait(TEXT_RIGHT_TO_ICON-1-LOW_H_SPACE); // position behind the icon, Line 4 & wait and clear last line lcd_MEM2_string(ICE0_str); // "ICE0=" DisplayValue16(_trans->ice0,-6,'A',2); // display ICEO } if (_trans->ices > 0) { lcd_next_line_wait(TEXT_RIGHT_TO_ICON-1-LOW_H_SPACE); // position behind the icon, Line 4 & wait and clear last line lcd_MEM2_string(ICEs_str); // "ICEs=" DisplayValue16(_trans->ices,-6,'A',2); // display ICEs } #endif #else /* character display */ PinLayout('E','B','C'); // EBC= or 123=... lcd_line2(); //2. row lcd_MEM_string(hfe_str); //"B=" (hFE) DisplayValue(_trans->hfe,-2,0,3); #if FLASHEND > 0x1fff lcd_space(); lcd_data('I'); if (_trans->current >= 10000) { lcd_data('e'); // emitter current has 10mA offset _trans->current -= 10000; } else { lcd_data('c'); } lcd_equal(); // lcd_data('='); DisplayValue16(_trans->current,-6,'A',2); // display Ic or Ie current #endif #if defined(SHOW_ICE) lcd_next_line_wait(0); // next line, wait 5s and clear line 2 lcd_MEM_string(Ube_str); //"Ube=" Display_mV(_trans->uBE,3); if (_trans->ice0 > 0) { lcd_next_line_wait(0); // next line, wait 5s and clear line 2 lcd_MEM2_string(ICE0_str); // "ICE0=" DisplayValue16(_trans->ice0,-6,'A',3); } if (_trans->ices > 0) { lcd_next_line_wait(0); // next line, wait 5s and clear line 2 lcd_MEM2_string(ICEs_str); // "ICEs=" DisplayValue16(_trans->ices,-6,'A',3); } #endif #endif /* WITH_GRAPHICS */ #ifdef SHOW_VAKDIODE if (vak_diode_nr < 5) { lcd_next_line_wait(0); // next line, wait 5s and clear line 2/4 DiodeSymbol_withPins(vak_diode_nr); lcd_MEM_string(Uf_str); //"Uf=" mVAusgabe(vak_diode_nr); uart_newline(); // MAURO not verified ('D') } /* end if (vak_diode_nr < 5) */ #endif #ifdef WITH_GRAPHICS PinLayoutLine('E','B','C'); // Pin 1=E ... uart_newline(); // MAURO OK BJT ('E') #endif goto tt_end; // end (PartFound == PART_TRANSISTOR) // ======================================== } else if (PartFound == PART_FET) { /* JFET or MOSFET */ // ======================================== #ifdef WITH_GRAPHICS unsigned char fetidx = 0; lcd_set_cursor(0,TEXT_RIGHT_TO_ICON); // position behind the icon, Line 1 #endif if((PartMode&P_CHANNEL) == P_CHANNEL) { lcd_data('P'); //P-channel _trans = &ptrans; #ifdef WITH_GRAPHICS fetidx = 2; #endif } else { lcd_data('N'); //N-channel // _trans = &ntrans; is allready selected as default } lcd_data('-'); // minus is used for JFET, D-MOS, E-MOS ... uint8_t part_code; part_code = PartMode&0x0f; #ifdef WITH_GRAPHICS if (part_code == PART_MODE_JFET) { lcd_MEM_string(jfet_str); //"JFET" lcd_big_icon(N_JFET|LCD_UPPER_LEFT); if (fetidx != 0) { lcd_update_icon(bmp_p_jfet); // update the n_jfet bitmap to p_jfet } } else { // no JFET if ((PartMode&D_MODE) == D_MODE) { lcd_data('D'); // N-D or P-D fetidx += 1; } else { lcd_data('E'); // N-E or P-E } if (part_code == (PART_MODE_IGBT)) { lcd_MEM_string(igbt_str); //"-IGBT" lcd_big_icon(N_E_IGBT|LCD_UPPER_LEFT); if (fetidx == 1) lcd_update_icon(bmp_n_d_igbt); if (fetidx == 2) lcd_update_icon(bmp_p_e_igbt); if (fetidx == 3) lcd_update_icon(bmp_p_d_igbt); } else { lcd_MEM_string(mosfet_str); //"-MOS " lcd_big_icon(N_E_MOS|LCD_UPPER_LEFT); if (fetidx == 1) lcd_update_icon(bmp_n_d_mos); if (fetidx == 2) lcd_update_icon(bmp_p_e_mos); if (fetidx == 3) lcd_update_icon(bmp_p_d_mos); } } /* end PART_MODE_JFET */ #else /* normal character display */ if (part_code == PART_MODE_JFET) { lcd_MEM_string(jfet_str); //"-JFET" } else { // no JFET if ((PartMode&D_MODE) == D_MODE) { lcd_data('D'); // N-D or P-D } else { lcd_data('E'); // N-E or P-E } if (part_code == (PART_MODE_IGBT)) { lcd_MEM_string(igbt_str); //"-IGBT" } else { lcd_MEM_string(mosfet_str); //"-MOS " } } /* end PART_MODE_JFET */ if (part_code == PART_MODE_IGBT) { PinLayout('E','G','C'); // SGD= or 123=... } else if (part_code == PART_MODE_JFET) { PinLayout('?','G','?'); // ?G?= or 123=... } else { PinLayout('S','G','D'); // SGD= or 123=... } #endif /* WITH_GRAPHICS */ vak_diode_nr = search_vak_diode(); if(vak_diode_nr < 5) { //MOSFET with protection diode; only with enhancement-FETs #ifndef WITH_GRAPHICS #if FLASHEND <= 0x1fff char an_cat; // diode is anode-cathode type an_cat = 0; #ifdef EBC_STYLE #if EBC_STYLE == 321 // layout with 321= style an_cat = (((PartMode&P_CHANNEL) && (ptrans.c > ptrans.e)) || ((!(PartMode&P_CHANNEL)) && (ntrans.c < ntrans.e))); #else // Layout with SGD= style an_cat = (PartMode&P_CHANNEL); /* N or P MOS */ #endif #else /* EBC_STYLE not defined */ // layout with 123= style an_cat = (((PartMode & P_CHANNEL) && (ptrans.c < ptrans.e)) || ((!(PartMode & P_CHANNEL)) && (ntrans.c > ntrans.e))); #endif /* end ifdef EBC_STYLE */ // show diode symbol in right direction (short form for less flash memory) if (an_cat) { lcd_data(LCD_CHAR_DIODE1); //show Diode symbol >| } else { lcd_data(LCD_CHAR_DIODE2); //show Diode symbol |< } #endif #endif /* not WITH_GRAPHICS */ #ifdef WITH_GRAPHICS options = 0; if (_trans->c != diodes.Anode[vak_diode_nr]) options |= OPT_VREVERSE; lcd_update_icon_opt(bmp_vakdiode,options); // update Icon with protection diode #endif } /* end if NumOfDiodes == 1 */ #ifdef WITH_GRAPHICS lcd_draw_trans_pins(-7, 16); // update of pin numbers must be done after diode update lcd_next_line(TEXT_RIGHT_TO_ICON); // position text behind the icon, Line 2 #if LCD_LINES > 6 lcd_next_line(TEXT_RIGHT_TO_ICON); // double line #endif if((PartMode&D_MODE) != D_MODE) { //enhancement-MOSFET lcd_MEM_string(vt_str+1); // "Vt=" Display_mV(_trans->gthvoltage,2); //Gate-threshold voltage //Gate capacity ReadCapacity(_trans->b,_trans->e); //measure capacity lcd_next_line(TEXT_RIGHT_TO_ICON); // position text behind the icon, Line 3 lcd_show_Cg(); // show Cg=xxxpF #ifdef SHOW_R_DS lcd_show_rds(TEXT_RIGHT_TO_ICON-1); // show RDS at column behind the icon -1 #endif } else { /* depletion mode */ if ((PartMode&0x0f) != PART_MODE_JFET) { /* kein JFET */ ReadCapacity(_trans->b,_trans->e); //measure capacity lcd_show_Cg(); // show Cg=xxxpF #ifdef FET_Idss } else { // it is a JFET // display the I_DSS, if measured if (_trans->uBE!=0) { static const unsigned char str_Idss[] MEM_TEXT = "Idss="; lcd_MEM_string(str_Idss); DisplayValue16(_trans->uBE,-6,'A',2); } #endif } // set cursor below the icon #define LINE_BELOW_ICON ((ICON_HEIGHT/8)/((FONT_HEIGHT+7)/8)) #if LCD_LINES > 6 lcd_set_cursor((LINE_BELOW_ICON + 1) * PAGES_PER_LINE,0); #else lcd_set_cursor(LINE_BELOW_ICON * PAGES_PER_LINE,0); #endif lcd_data('I'); #if (LCD_LINE_LENGTH > 17) lcd_data('d'); #endif lcd_equal(); // lcd_data('='); DisplayValue16(_trans->current,-6,'A',2); lcd_MEM_string(Vgs_str); // "@Vg=" Display_mV(_trans->gthvoltage,2); //Gate-threshold voltage #ifdef SHOW_ICE // Display also the cutoff gate voltage, idea from Pieter-Tjerk if (_trans->ice0<4800) { // can't trust cutoff voltage if close to 5V supply voltage, since then the transistor may not have been cut off at all lcd_next_line_wait(0); lcd_data('I'); #if (LCD_LINE_LENGTH > 17) lcd_data('d'); #endif lcd_equal(); // lcd_data('='); DisplayValue16(0,-5,'A',2); lcd_MEM_string(Vgs_str); // "@Vg=" Display_mV(_trans->ice0,2); // cutoff Gate voltage #endif } #ifdef SHOW_R_DS lcd_show_rds(0); // show Drain-Source resistance RDS at column 0 #endif } /* end of enhancement or depletion mode WITH_GRAPHICS */ #else /* character display */ if((PartMode&D_MODE) != D_MODE) { //enhancement-MOSFET //Gate capacity lcd_line2(); // line 2 ReadCapacity(_trans->b,_trans->e); //measure capacity lcd_show_Cg(); // show Cg=xxxpF lcd_MEM_string(vt_str); // " Vt=" Display_mV(_trans->gthvoltage,2); //Gate-threshold voltage #ifdef SHOW_R_DS lcd_show_rds(0); // show Drain-Source resistance RDS at column 0 #endif } else { // depletion #if FLASHEND > 0x1fff if ((PartMode&0x0f) != PART_MODE_JFET) { /* kein JFET */ lcd_next_line(0); // line 2 ReadCapacity(_trans->b,_trans->e); //measure capacity lcd_show_Cg(); // show Cg=xxxpF #ifdef FET_Idss } else { // it is a JFET // display the I_DSS, if measured if (_trans->uBE!=0) { lcd_next_line(0); static const unsigned char str_Idss[] MEM_TEXT = "Idss="; lcd_MEM_string(str_Idss); DisplayValue16(_trans->uBE,-6,'A',2); } #endif } lcd_next_line_wait(0); // line 2 or 3, if possible & wait and clear last line #endif lcd_data('I'); // show I=xmA@Vg=y.yV at line 2 or 3 #if (LCD_LINE_LENGTH > 17) lcd_data('d'); #endif lcd_equal(); // lcd_data('='); DisplayValue16(_trans->current,-6,'A',2); lcd_MEM_string(Vgs_str); // "@Vg=" Display_mV(_trans->gthvoltage,2); //Gate-threshold voltage #ifdef SHOW_ICE // Display also the cutoff gate voltage, idea from Pieter-Tjerk if (_trans->ice0<4800) { // can't trust cutoff voltage if close to 5V supply voltage, since then the transistor may not have been cut off at all lcd_next_line_wait(0); lcd_data('I'); #if (LCD_LINE_LENGTH > 17) lcd_data('d'); #endif lcd_equal(); // lcd_data('='); DisplayValue16(0,-5,'A',2); lcd_MEM_string(Vgs_str); // "@Vg=" Display_mV(_trans->ice0,2); // cutoff Gate voltage } #endif #ifdef SHOW_R_DS lcd_show_rds(0); // show Drain-Source resistance RDS at column 0 #endif } /* end of enhancement or depletion mode */
// not enough Flash space for ShowIcons at ATmega328 // Show all Icons on the screen, up to four at one screen void ShowIcons(void) { #define ShowTime 15000 /* 15 seconds wait time, or key press, or rotary encoder movement */ uint8_t cc; lcd_clear(); lcd_big_icon(BJT_NPN|LCD_UPPER_LEFT); lcd_update_icon_opt(bmp_vakdiode, OPT_VREVERSE); lcd_big_icon(BJT_NPN|LCD_UPPER_RIGHT); lcd_update_icon(bmp_pnp); // update for PNP lcd_set_cursor(5,0); lcd_MEM_string(NPN_str); lcd_set_cursor(5,(LCD_LINE_LENGTH / 2)); lcd_MEM_string(PNP_str); wait_for_key_ms(ShowTime); lcd_clear(); lcd_big_icon(N_JFET|LCD_LOWER_LEFT); lcd_big_icon(N_JFET|LCD_LOWER_RIGHT); lcd_update_icon(bmp_p_jfet); // update to P_JFET lcd_set_cursor(2,1); lcd_data('N'); // N-Type lcd_data('-'); lcd_MEM_string(jfet_str); lcd_set_cursor(2,1+(LCD_LINE_LENGTH / 2)); lcd_data('P'); // P-Type lcd_data('-'); lcd_MEM_string(jfet_str); wait_for_key_ms(ShowTime); lcd_clear(); lcd_big_icon(N_E_IGBT|LCD_UPPER_LEFT); lcd_big_icon(N_E_IGBT|LCD_UPPER_RIGHT); lcd_update_icon(bmp_p_e_igbt); // update to P-E-IGBT lcd_set_cursor(5,0); lcd_data('N'); // N-Type lcd_data('-'); lcd_data('E'); // Enhancement Type lcd_MEM_string(igbt_str); lcd_set_cursor(6,(LCD_LINE_LENGTH / 2)); lcd_data('P'); // P-Type lcd_data('-'); lcd_data('E'); // Enhancement Type lcd_MEM_string(igbt_str); wait_for_key_ms(ShowTime); lcd_clear(); lcd_big_icon(N_E_IGBT|LCD_LOWER_LEFT); lcd_update_icon(bmp_n_d_igbt); // update to N-D-IGBT lcd_big_icon(N_E_IGBT|LCD_LOWER_RIGHT); lcd_update_icon(bmp_p_d_igbt); // update to P-D-IGBT lcd_set_cursor(1,0); lcd_data('N'); // N-Type lcd_data('-'); lcd_data('D'); // Depletion Type lcd_MEM_string(igbt_str); lcd_set_cursor(2,(LCD_LINE_LENGTH / 2)); lcd_data('P'); // P-Type lcd_data('-'); lcd_data('D'); // Depletion Type lcd_MEM_string(igbt_str); wait_for_key_ms(ShowTime); lcd_clear(); lcd_big_icon(N_E_MOS|LCD_UPPER_LEFT); lcd_big_icon(N_E_MOS|LCD_UPPER_RIGHT); lcd_update_icon(bmp_p_e_mos); // update to P-E-MOS lcd_set_cursor(5,0); lcd_data('N'); // N-Type lcd_data('-'); lcd_data('E'); // Enhancement Type lcd_MEM_string(mosfet_str); lcd_set_cursor(6,(LCD_LINE_LENGTH / 2)); lcd_data('P'); // P-Type lcd_data('-'); lcd_data('E'); // Enhancement Type lcd_MEM_string(mosfet_str); wait_for_key_ms(ShowTime); lcd_clear(); lcd_big_icon(N_E_MOS|LCD_LOWER_LEFT); lcd_update_icon(bmp_n_d_mos); // update to N-D-MOS lcd_big_icon(N_E_MOS|LCD_LOWER_RIGHT); lcd_update_icon(bmp_p_d_mos); // update to P-D-MOS lcd_set_cursor(1,1); lcd_data('N'); // N-Type lcd_data('-'); lcd_data('D'); // Depletion Type lcd_MEM_string(mosfet_str); lcd_set_cursor(2,1+(LCD_LINE_LENGTH / 2)); lcd_data('P'); // P-Type lcd_data('-'); lcd_data('D'); // Depletion Type lcd_MEM_string(mosfet_str); wait_for_key_ms(ShowTime); #if (ICON_ELEMENTS == 14) lcd_clear(); lcd_big_icon(TRIAC|LCD_UPPER_LEFT); lcd_big_icon(THYRISTOR|LCD_UPPER_RIGHT); wait_for_key_ms(ShowTime); lcd_clear(); lcd_big_icon(INDUCTOR|LCD_LOWER_LEFT); lcd_big_icon(CAPACITOR|LCD_LOWER_RIGHT); lcd_big_icon(RESISTOR|LCD_UPPER_LEFT); lcd_big_icon(RESISTORS|LCD_UPPER_RIGHT); wait_for_key_ms(ShowTime); lcd_clear(); lcd_big_icon(DIODE_C_A|LCD_UPPER_LEFT); lcd_big_icon(DIODES_C_A_C_A|LCD_UPPER_RIGHT); lcd_big_icon(DIODES_A_C_C_A|LCD_LOWER_LEFT); lcd_big_icon(DIODES_C_A_A_C|LCD_LOWER_RIGHT); wait_for_key_ms(ShowTime); #endif lcd_clear(); lcd_line1(); lcd_MEM_string(Resistor_str); // -[=]- lcd_line2(); lcd_MEM_string(Inductor_str); // -ww- lcd_line3(); lcd_MEM_string(CapZeich); // capacitor sign lcd_line4(); lcd_MEM_string(AnKat_str); //"->|-" lcd_space(); lcd_MEM_string(KatAn_str); //"-|<-" // show character set for (cc=0;cc<(0x7f-0x20);cc++) { if ((cc%16) == 0) { // begin new line if((cc%64) == 0) { wait_for_key_ms(ShowTime); lcd_clear(); } lcd_set_cursor(((cc/16)%4)*2,0); } lcd_data(cc+0x20); } /* end for cc */ wait_for_key_ms(ShowTime); lcd_clear(); #ifdef LCD_CYRILLIC for (cc=0;cc<((Cyr_ja+1-Cyr_B)+(Cyr_schtsch+1-Cyr_D));cc++) { if ((cc%16) == 0) { // begin new line lcd_set_cursor(((cc/16)%4)*2,0); } if (cc <= (Cyr_ja-Cyr_B)) { lcd_data(cc + Cyr_B); } else { lcd_data(cc + Cyr_D - (Cyr_ja + 1 - Cyr_B)); } } /* end for cc */ wait_for_key_ms(ShowTime); lcd_clear(); #endif }
/* ****************************************************************** */ void show_C_ESR() { uint8_t key_pressed; message_key_released(C_ESR_str); #ifdef POWER_OFF uint8_t times; for (times=0;times<250;) #else while (1) /* wait endless without the POWER_OFF option */ #endif { PartFound = PART_NONE; ReadBigCap(TP3,TP1); if (PartFound == PART_CAPACITOR) { #if LCD_LINES > 2 lcd_line2(); // set to line2 #else lcd_line1(); // set to line1 #endif lcd_data('C'); lcd_equal(); // lcd_data('='); DisplayValue(cap.cval_max,cap.cpre_max,'F',3); lcd_clear_line(); // clear to end of line 1 cap.esr = GetESR(cap.cb,cap.ca); #if LCD_LINES > 2 lcd_line3(); // use line 3 #else lcd_line2(); // use line 2 #endif lcd_MEM_string(&ESR_str[1]); if (cap.esr < 65530) { DisplayValue16(cap.esr,-2,LCD_CHAR_OMEGA,2); } else { lcd_data('?'); // too big } lcd_clear_line(); // clear to end of line } else { // no cap found #if LCD_LINES > 2 lcd_clear_line2(); // clear C value lcd_line3(); lcd_clear_line(); // clear old ESR value #else lcd_line1(); // lcd_MEM2_string(C_ESR_str); lcd_clear_line(); lcd_clear_line2(); // clear old ESR value #endif } #if defined(POWER_OFF) && defined(BAT_CHECK) Bat_update(times); #endif key_pressed = wait_for_key_ms(1000); #ifdef WITH_ROTARY_SWITCH if ((key_pressed != 0) || (rotary.incre > 3)) break; #else if (key_pressed != 0) break; #endif #ifdef POWER_OFF times = Pwr_mode_check(times); // no time limit with DC_Pwr_mode #endif } /* end for times */ } /* end show_C_ESR() */
void GetFrequency(uint8_t range) { unsigned char taste; // set if key is pressed during measurement #if PROCESSOR_TYP == 644 unsigned long freq_count; // the counted pulses in 1 second #endif unsigned long long ext_period; unsigned long freq_from_per; uint8_t ii; uint8_t mm; /* range has set the lowest bit to use the 16:1 frequency divider permanently. */ /* The upper bits of range specifies the input selection. */ /* 0 = external input, 2 = channel 2, 4 = HF Quartz, 6 = LF Quartz */ #if PROCESSOR_TYP == 644 FDIV_DDR |= (1<<FDIV_PIN); //switch to output if ((range & 0x01) == 0) { FDIV_PORT &= ~(1<<FDIV_PIN); // switch off the 16:1 divider } else { FDIV_PORT |= (1<<FDIV_PIN); // use frequency divider for next measurement } FINP_DDR |= (1<<FINP_P0) | (1<<FINP_P1); // switch both pins to output FINP_PORT &= ~(1<<FINP_P0); // clear lower bit of input selection FINP_PORT &= ~(1<<FINP_P1); // clear higher bit of input selection if (range == 0) { message_key_released(FREQ_str); // Frequency: in line 1 } else if (range == 1) { message_key_released(HFREQ_str); // High Frequency: in line 1 } else if (range < 4) { /* 2+3 */ FINP_PORT |= (1<<FINP_P0); // set lower bit of input selection FINP_PORT &= ~(1<<FINP_P1); // clear higher bit of input selection } else if (range < 6) { /* 4+5 */ FINP_PORT &= ~(1<<FINP_P0); // clear lower bit of input selection FINP_PORT |= (1<<FINP_P1); // set higher bit of input selection message_key_released(H_CRYSTAL_str); // HF Quarz: in line 1 } else { /* 6+7 */ FINP_PORT |= (1<<FINP_P0); // set lower bit of input selection FINP_PORT |= (1<<FINP_P1); // set higher bit of input selection message_key_released(L_CRYSTAL_str); // LF Quarz: in line 1 } #else message_key_released(FREQ_str); // Frequency: in line 1 #endif taste = 0; // reset flag for key pressed for (mm=0;mm<240;mm++) { // ************************************************************************* // *********** straight frequency measurement by counting 1 second ********* // ************************************************************************* //set up Counter 0 // Counter 0 is used to count the external signal connected to T0 (PD4 or PB0) FREQINP_DDR &= ~(1<<FREQINP_PIN); // switch frequency pin to input wait1ms(); // let capacitor time to load to 2.4V input #if PROCESSOR_TYP == 1280 TCCR3A = 0; // normal operation, no output TCNT3 = 0; // set counter 3 to zero ext_freq.dw = 0; // set external frequency to zero TIFR3 = (1<<TOV3); // clear OV interrupt of timer 3 TIMSK3 = (1<<TOIE3); // enable OV interrupt of timer 3 #else TCCR0A = 0; // normal operation, no output TCNT0 = 0; // set counter to zero ext_freq.dw = 0; // set external frequency to zero TIFR0 = (1<<TOV0); // clear OV interrupt of timer 0 TIMSK0 = (1<<TOIE0); // enable OV interrupt of timer 0 #endif // start counter after starting second counter timer 1 // set up counter 1 to measure one second TCCR1A = 0; // normal operation #define CNT1_END_VAL ((F_CPU / 256UL) + 1) #define CNT1_DIVIDER (1<<CS12) #if CNT1_END_VAL > 0xffff #undef CNT1_END_VAL #undef CNT1_DIVIDER #define CNT1_END_VAL ((F_CPU / 1024UL) + 1) #define CNT1_DIVIDER ((1<<CS12) | (1<<CS10)) #if F_CPU != ((F_CPU / 1024UL) * 1024UL) #warning F_CPU can not be divided by 1024, measured frequency is wrong! #endif #else #if F_CPU != ((F_CPU / 256UL) * 256UL) #warning F_CPU can not be divided by 256, measured frequency is wrong! #endif #endif OCR1B = CNT1_END_VAL; // set to 1 second (counter 0 is started with 1) OCR1A = 1; // start counter 0 with first count TCNT1 = 0; // set counter to zero GTCCR |= (1<<PSRSYNC); // reset clock precounter TIFR1 = (1<<OCF1B) | (1<<OCF1A); // clear Output compare match TIMSK1 = (1<<OCIE1B) | (1<<OCIE1A); // enable the Compare A match and Compare B match interrupt sei(); // set interrupt enable TCCR1B = CNT1_DIVIDER; // divide CPU clock by 256, start counter // both counter are running now, wait for counter 1 reach OCR1A for (ii=0;ii<50;ii++) { wait20ms(); // first count of counter 1 (<32us) has started the counter 0 wdt_reset(); if (!(RST_PIN_REG & (1<<RST_PIN))) taste = 1; // user request stop of operation #if PROCESSOR_TYP == 1280 if (TCCR3B == 0) break; // timer 3 is stopped by interrupt #else if (TCCR0B == 0) break; // timer 0 is stopped by interrupt #endif } // one second is counted #if PROCESSOR_TYP == 1280 TCCR3B = 0; // stop timer 3, if not stopped by timer 1 compare interrupt ext_freq.w[0] = TCNT3; // add lower 16 bit to get total counts #else TCCR0B = 0; // stop timer 0, if not stopped by timer 1 compare interrupt ext_freq.b[0] = TCNT0; // add lower 8 bit to get total counts #endif #if PROCESSOR_TYP == 644 freq_count = ext_freq.dw; // save the frequency counter #endif #if (LCD_LINES > 3) lcd_line3(); lcd_clear_line(); lcd_line4(); lcd_clear_line(); lcd_clear_line2(); #else lcd_clear(); // clear total display #endif lcd_data('f'); lcd_equal(); // lcd_data('='); #if PROCESSOR_TYP == 644 if ((FDIV_PORT&(1<<FDIV_PIN)) == 0) { Display_Hz(ext_freq.dw, 7); } else { // frequency divider is activ Display_Hz(ext_freq.dw*FREQ_DIV, 7); } #else Display_Hz(ext_freq.dw, 7); #endif #if PROCESSOR_TYP == 644 lcd_space(); if ((FDIV_PORT&(1<<FDIV_PIN)) != 0) { lcd_data('/'); // Frequency divider is activ } else { lcd_space(); // Frequency divider is not activ } #endif FREQINP_DDR &= ~(1<<FREQINP_PIN); // switch frequency pin to input if (TCCR1B != 0) { // Exact 1000ms period is only with "end of period" from timer1 interrupt. // When stopped with the for loop, the time is too long because wait call does not // respect CPU time used for interrupts and loop itself. // For this case show ? behind the Hz. lcd_data('?'); } TCCR1B = 0; // stop timer 1 TIMSK1 = 0; // disable all timer 1 interrupts if ((ext_freq.dw < FMAX_PERIOD) && (ext_freq.dw > 0)) { // ************************************************************************* // ******** Period measurement by counting some periods ******************** // ************************************************************************* pinchange_max = ((10 * (unsigned long)ext_freq.dw) + MHZ_CPU) / MHZ_CPU; // about 10000000 clock tics pinchange_max += pinchange_max; // * 2 for up and down change FREQINP_DDR &= ~(1<<FREQINP_PIN); // switch frequency pin to input wait1ms(); // let capacitor time to load to 2.4V input #if PROCESSOR_TYP == 1280 TCNT3 = 0; // set counter 3 to zero ext_freq.dw = 0; // reset counter to zero TIFR3 = (1<<TOV3); // clear OV interrupt TIMSK3 = (1<<TOIE3); // enable OV interrupt // counter 3 ist started with first pin change interrupt pinchange_count = 0; EICRB = (0<<ISC61) | (1<<ISC60); // set int6 pin change EIFR |= (1<<INTF6); // clear interrupt 6 flag PCMSK_FREQ |= (1<<PCINT_FREQ); // enable int6 #else TCNT0 = 0; // set counter 0 to zero ext_freq.dw = 0; // reset counter to zero TIFR0 = (1<<TOV0); // clear OV interrupt TIMSK0 = (1<<TOIE0); // enable OV interrupt // counter 0 ist started with first pin change interrupt pinchange_count = 0; PCIFR = (1<<PCI_CLEAR_BIT); // clear Pin Change Status PCICR |= (1<<PCI_ENABLE_BIT); // enable pin change interrupt #endif sei(); PCMSK_FREQ |= (1<<PCINT_FREQ); // monitor PD4 PCINT20 or PB0 PCINT8 pin change for (ii=0;ii<250;ii++) { wait20ms(); wdt_reset(); if (!(RST_PIN_REG & (1<<RST_PIN))) taste = 1; // user request stop of operation if ((PCMSK_FREQ & (1<<PCINT_FREQ)) == 0) break; // monitoring is disabled by interrupt } /* end for ii */ #if PROCESSOR_TYP == 1280 TCCR3B = 0; // stop counter 3 PCMSK_FREQ &= ~(1<<PCINT_FREQ); // disable int6 ext_freq.w[0] = TCNT3; // add lower 16 bit to get total counts #else TCCR0B = 0; // stop counter 0 PCMSK_FREQ &= ~(1<<PCINT_FREQ); // stop monitor PD4 PCINT20 or PB0 PCINT8 pin change PCICR &= ~(1<<PCI_ENABLE_BIT); // disable the interrupt ext_freq.b[0] = TCNT0; // add lower 8 bit to get total counts #endif // lcd_clear_line2(); // wait50ms(); // let LCD flicker to #if (LCD_LINES > 3) lcd_line3(); // use line3 to report the period with 4-line LCD #else lcd_line2(); // report period on line 2 of 2-line LCD #endif lcd_data('T'); lcd_equal(); // lcd_data('='); ext_period = ((unsigned long long)ext_freq.dw * (200000/MHZ_CPU)) / pinchange_max; #if PROCESSOR_TYP == 644 if ((FDIV_PORT&(1<<FDIV_PIN)) != 0) { // frequency divider is activ, period is measured too long ext_period = ext_period / FREQ_DIV; } #endif if (pinchange_max > 127) { DisplayValue(ext_period,-11,'s',7); // show period converted to 0.01ns units } else { //prevent overflow of 32-Bit DisplayValue((unsigned long)(ext_period/100),-9,'s',7); // show period converted to 1ns units } if (ii == 250) { lcd_data('?'); // wait loop has regular finished } else { if (ext_period > 249500) { #if (LCD_LINES > 3) lcd_line4(); // use line 4 of 4-line LCD to report the computed frequency #else lcd_line1(); // overwrite line 1 of 2-line LCD to report the computed frequency #endif lcd_data('f'); lcd_equal(); // lcd_data('='); if (ext_period > 1000000000) { // frequency in 0.000001Hz (1e11*1e6)/(0.01ns count) freq_from_per = (unsigned long long)(100000000000000000) / ext_period; DisplayValue(freq_from_per,-6,'H',7); // display with 0.000001 Hz resolution } else { // prevent unsigned long overflow, scale to 0.0001 Hz // frequency in 0.0001Hz (1e11*1e4)/(0.01ns count) freq_from_per = (unsigned long long)(1000000000000000) / ext_period; DisplayValue(freq_from_per,-4,'H',7); // display with 0.0001 Hz resolution } lcd_data('z'); FREQINP_DDR &= ~(1<<FREQINP_PIN); // switch frequency pin to input } } } /* end if 1 < ext_freq < FMAX_PERIOD */ #if PROCESSOR_TYP == 644 if ((FDIV_PORT & (1<<FDIV_PIN)) == 0) { // frequency divider is not activ if ( ((freq_count >= FMAX_PERIOD) && (freq_count < ((unsigned long)FMAX_PERIOD*FREQ_DIV))) || (freq_count > FMAX_INPUT) ){ FDIV_PORT |= (1<<FDIV_PIN); // use frequency divider for next measurement } } else { // frequency divider is activ if ((freq_count < (FMAX_PERIOD/FREQ_DIV)) && ((range & 0x01) == 0)) { FDIV_PORT &= ~(1<<FDIV_PIN); // switch off the 16:1 divider } } #endif // taste += wait_for_key_ms(SHORT_WAIT_TIME/2); TIMSK0 = 0; // disable all timer 0 interrupts taste += wait_for_key_ms(2000); #ifdef WITH_ROTARY_SWITCH if ((taste != 0) || (rotary.incre > 2)) break; #else if (taste != 0) break; #endif } /* end for mm */ return; } // end GetFrequency()
void show_cap_simple(void) #endif { // lcd_MEM_string(Capacitor); lcd_line1(); lcd_testpin(cap.ca); //Pin number 1 lcd_MEM_string(CapZeich); // capacitor sign #if FLASHEND > 0x1fff uint8_t present_res; // true, if resistor symbol is shown in Row 1 uint8_t present_esr; uint8_t present_vloss; GetVloss(); cap.esr = GetESR(cap.cb, cap.ca); // get ESR of capacitor present_esr = (cap.esr < 65530); present_vloss = (cap.v_loss != 0); #if (LCD_LINES > 2) present_res = present_esr; // show every time a well ESR value is detected, Vloss extra line #else #if FLASHEND > 0x3fff present_res = (present_esr && (!present_vloss || how)); #else present_res = (present_esr && (!present_vloss)); #endif // show Vloss additionally in line 2 , or no Vloss #endif if (present_res) { lcd_MEM_string(Resistor_str+1); // [=]- } #endif /* FLASHEND > 0x1fff */ lcd_testpin(cap.cb); //Pin number 2 #if FLASHEND > 0x1fff #if FLASHEND > 0x3fff if (how) { // Vloss is allways shown in separate line lcd_spaces(LCD_LINE_LENGTH - 3 - _lcd_column); lcd_MEM2_string(CMETER_13_str); // "[C]" at the end of line 1 } else { #endif /* FLASHENF > 0x3fff */ #if (LCD_LINES <= 2) /* Vloss in line 1 */ if (cap.v_loss != 0) { lcd_MEM_string(VLOSS_str); // " Vloss=" DisplayValue16(cap.v_loss,-1,'%',2); } #endif lcd_clear_line(); // clear to end of line #if FLASHEND > 0x3fff } /* end of if (how) */ #endif #else lcd_clear_line(); // clear to end of line #endif /* FLASHEND > 0x1fff */ // - - - - - - - - - - - - - - - - - - - - - - lcd_line2(); //2. row DisplayValue(cap.cval_max,cap.cpre_max,'F',4); #if FLASHEND > 0x1fff if (present_esr) { lcd_MEM_string(ESR_str); // " ESR=" DisplayValue16(cap.esr,-2,LCD_CHAR_OMEGA,2); } lcd_clear_line(); // - - - - - - - - - - - - - - - - - - - - - - #if LCD_LINES > 2 lcd_line3(); if (present_vloss ) { lcd_MEM_string(&VLOSS_str[1]); // "Vloss=" DisplayValue16(cap.v_loss,-1,'%',2); } lcd_clear_line(); #else /* only two lines */ #if FLASHEND > 0x3fff if (how && present_vloss) #else if (present_vloss) #endif { lcd_next_line_wait(0); // show vloss after waiting lcd_MEM_string(&VLOSS_str[1]); // "Vloss=" DisplayValue16(cap.v_loss,-1,'%',2); lcd_clear_line(); // clear to end of line } #endif #else lcd_clear_line(); #endif /* FLASHEND > 0x1fff */ } /* end show_cap or show_cap_simple */