bool ShapeKeyMatrix::Verify( QString &sErrors, const QList<class PinItem *> &pins, const QList<class PropertyValue *> &values ) const { bool bSuccess = true; QSet<QString> pinsToCheck, notPinsToCheck; int nRows = GetPropertyValueInt( "Rows", values, 0 ); int nColumns = GetPropertyValueInt( "Columns", values, 0 ); for ( int i = 0; i < MAX_ROWS; i++ ) { QString s = QString("R%1").arg(i); if ( i < nRows ) pinsToCheck << s; else notPinsToCheck << s; } for ( int i = 0; i < MAX_COLUMNS; i++ ) { QString s = QString("C%1").arg(i); if ( i < nColumns ) pinsToCheck << s; else notPinsToCheck << s; } bSuccess = CheckPins( sErrors, pins, pinsToCheck ); if ( !CheckNotPins( sErrors, pins, notPinsToCheck ) ) bSuccess = false; return bSuccess; }
bool ShapeSelectorSwitch::Verify( QString &sErrors, const QList<class PinItem *> &pins, const QList<class PropertyValue *> &values ) const { bool bSuccess = true; int nOutputs = GetPropertyValueInt( "Outputs", values, 0 ); QSet<QString> pinsToCheck; for ( int i = 0; i < nOutputs; i++ ) pinsToCheck << QString::number( i+1 ); QSet<QString> notPinsToCheck; for ( int i = nOutputs; i < MAX_SELECTOR_PINS; i++ ) notPinsToCheck << QString::number( i+1 ); bSuccess = CheckPins( sErrors, pins, pinsToCheck ); if ( !CheckNotPins( sErrors, pins, notPinsToCheck ) ) bSuccess = false; return bSuccess; }
//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 */
int main(void) { POWER_ON(); // Turn the regulator ON PWRMODE_SETUP(); // Setup PWRMODE jumper input lcd_init(); // init LCD uint8_t tmp; ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Enable ADC, set Prescale to 8 unsigned int rhval = eeprom_read_word(&R_H_VAL); // R_H unsigned int rlval = eeprom_read_word(&R_L_VAL); // R_L ctmode = eeprom_read_byte(&CapTestMode); // Compile time choice of test modes (0x22) cp1 = (ctmode & 12) >> 2; // Capacitor pin 1, DEFAULT 0 cp2 = ctmode & 3; // Capacitor pin 2, DEFAULT 2 ctmode = (ctmode & 48) >> 4; // Capacitor test mode, DEFAULT is 0x02 for all 6 cap tests. wdt_disable(); // Disable watch dog timer. if(MCU_STATUS_REG & (1<<WDRF)) { // Examine for Watchdog RESETs That enters, if the Watchdog 2s were not put back Can occur, lcd_clear(); // if the program in a continuous loop " itself; tangled" has. lcd_eep_string(TestTimedOut); // Message - "Timeout!" _delay_ms(3000); // Wait 3 sec wdt_enable(WDTO_2S); // Wait two seconds; if on power it will reset; on battery it will turn itself off while(1) { POWER_OFF(); // Power down in BAT mode or RESET in PWR mode } } LCDLoadCustomChar(); // Custom indication Diode symbol into LCD load lcd_eep_string(DiodeIcon); // Message - diode icon Line1(); // jump to start of first line start: // re-entry point, if button is re-pressed #ifdef WDT_enabled wdt_enable(WDTO_2S); // Watchdog Timer on, 2 seconds? #endif PartFound = PART_NONE; // Default all results tmpPartFound = PART_NONE; // " " NumOfDiodes = 0; // || PartReady = 0; // || PartMode = 0; // || ca = 0; // || cb = 0; // \/ // -> // Startup Message //////////////////////////////////////// lcd_clear(); // lcd_eep_string(StartupMessage); // LCD: ACT v#.# [XXX] // -> // Power selection and Battery Testing //////////////////// if(PWRMODE_GET()) { // Get the PWRMODE jumper logic PowerMode = PWR_9V; // Set powermode to PWR_9V _delay_us(250); ReadADC(5 | (1<<REFS1)); // Measure the 9V battery Supply ( - diode drop) hfe[0] = ReadADC(5 | (1<<REFS1)); // if in battery mode. lcd_eep_string(BatMode); // Tell user device in BAT mode Line2(); if (hfe[0] < BAT_WEAK) { // Compare 9v reading with BAT_WEAK variable if(hfe[0] < BAT_DEAD) { // If the batter is considered dead then lcd_eep_string(Bat); lcd_eep_string(BatEmpty); // Tell the user battery is DEAD _delay_ms(3000); // Wait a bit. while(1) { // Forever loop POWER_OFF(); // keep trying to kill the power forever. } } lcd_clear(); lcd_eep_string(Bat); // Battery isnt dead; its just weak lcd_eep_string(BatWeak); // tell the user; but keep testing... Line2(); // Start second line } } else { PowerMode = PWR_5V; // Power mode is constent v5, skip battery check. lcd_eep_string(PwrMode); // Tell user we are running in PWR mode. Line2(); } // -> // Begin testing sequince. /////////////////////////////// lcd_eep_string(TestRunning); // Tell user the testing has begun... UpdateProgress("00%"); // Progress at 00% and Testing CheckPins(TP1, TP2, TP3); // || UpdateProgress("16%"); // \/ CheckPins(TP1, TP3, TP2); // TESTING... UpdateProgress("33%"); // CheckPins(TP2, TP1, TP3); // || UpdateProgress("50%"); // \/ CheckPins(TP2, TP3, TP1); // TESTING... UpdateProgress("66%"); // CheckPins(TP3, TP2, TP1); // || UpdateProgress("83%"); // \/ CheckPins(TP3, TP1, TP2); // Almost there! UpdateProgress("99%"); // Testing Completed or 99% //---------------------------------------------CAPACITOR--------------------------------------- // Separate measurement to the test on condenser if(((PartFound == PART_NONE) || (PartFound == PART_RESISTOR) || (PartFound == PART_DIODE)) && (ctmode > 0)) { // Condenser unload; otherwise possibly no measurement is possible R_PORT = 0; R_DDR = (1<<(TP1 * 2)) | (1<<(TP2 * 2)) | (1<<(TP3 * 2)); _delay_ms(10); R_DDR = 0; if(ctmode == NORMAL_CAP_TESTS) { // see if we want to do all 6 Cap Tests ReadCapacity(cp1, cp2); // No - just read the pins both ways. ReadCapacity(cp2, cp1); } else { // DEFAULT ctmode == 0x02 to do all tests Line2(); lcd_eep_string(TestCapV); UpdateProgress("00%"); ReadCapacity(TP3, TP1); UpdateProgress("16%"); ReadCapacity(TP3, TP2); UpdateProgress("33%"); ReadCapacity(TP2, TP3); UpdateProgress("50%"); ReadCapacity(TP2, TP1); UpdateProgress("66%"); ReadCapacity(TP1, TP3); UpdateProgress("83%"); ReadCapacity(TP1, TP2); UpdateProgress("99%"); } } lcd_clear(); // Finished, now evaluate, the results //---------------------------------------------DIODE------------------------------------------------ if(PartFound == PART_DIODE) { if(NumOfDiodes == 1) { // Standard-Diode lcd_eep_string(Diode); // Message - "Diode: " lcd_eep_string(Anode); // Message - "A=" lcd_data(GetPinAlias(diodes[0].Anode + ASCII_1)); // Display 1, 2, or 3 lcd_eep_string(NextK); // Message - ";C=" lcd_data(GetPinAlias(diodes[0].Cathode + ASCII_1)); // Display 1, 2, or 3 Line2(); // Start second line lcd_eep_string(Uf); // Message - "Uf=" lcd_string(itoa(diodes[0].Voltage, outval, 10)); lcd_eep_string(mV); // Message - "mV" goto end; } else if(NumOfDiodes == 2) { // dual diode if(diodes[0].Anode == diodes[1].Anode) { // Common Anode lcd_eep_string(DualDiode); // Message - "Double diode €" lcd_eep_string(CA); // Message - "CA" Line2(); // Start second line lcd_eep_string(Anode); // Message - "A=" lcd_data(GetPinAlias(diodes[0].Anode + ASCII_1)); // Display 1, 2, or 3 lcd_eep_string(K1); // Message - ";C1=" lcd_data(GetPinAlias(diodes[0].Cathode + ASCII_1)); // Display 1, 2, or 3 lcd_eep_string(K2); // Message - ";C2=" lcd_data(GetPinAlias(diodes[1].Cathode + ASCII_1)); // Display 1, 2, or 3 goto end; } else if(diodes[0].Cathode == diodes[1].Cathode) { // Common Cathode lcd_eep_string(DualDiode); // Message - "Double diode €" lcd_eep_string(CC); // Message - "CC" Line2(); // Start second line lcd_eep_string(K); // Message - "C=" lcd_data(GetPinAlias(diodes[0].Cathode + ASCII_1)); // Display 1, 2, or 3 lcd_eep_string(A1); // Message - ";A1=" lcd_data(GetPinAlias(diodes[0].Anode + ASCII_1)); // Display 1, 2, or 3 lcd_eep_string(A2); // Message - ";A2=" lcd_data(GetPinAlias(diodes[1].Anode + ASCII_1)); // Display 1, 2, or 3 goto end; } else if ((diodes[0].Cathode == diodes[1].Anode) && \ (diodes[1].Cathode == diodes[0].Anode)) { // Antiparallel lcd_eep_string(TwoDiodes); // Message - "2 diodes" Line2(); // Start second line lcd_eep_string(Antiparallel); // Message - "anti-parallel" goto end; } } else if(NumOfDiodes == 3) { // Series connection from 2 diodes; as 3 diodes one recognizes b = 3; c = 3; // Check to see if it is series connection of 2 diodes. // But 2 cathodes, and 2 anodes must agree. // Then the 2 diodes are a single dual-diode. if((diodes[0].Anode == diodes[1].Anode) || (diodes[0].Anode == diodes[2].Anode)) b = diodes[0].Anode; if(diodes[1].Anode == diodes[2].Anode) b = diodes[1].Anode; if((diodes[0].Cathode == diodes[1].Cathode) || (diodes[0].Cathode == diodes[2].Cathode)) c = diodes[0].Cathode; if(diodes[1].Cathode == diodes[2].Cathode) c = diodes[1].Cathode; if((b<3) && (c<3)) { lcd_eep_string(TwoDiodes); // Message - "2 diodes" Line2(); // Start second line lcd_eep_string(InSeries); // Message - "serial A=€€" lcd_data(GetPinAlias(b + ASCII_1)); // Display 1, 2, or 3 lcd_eep_string(NextK); // Message - ";C=" lcd_data(GetPinAlias(c + ASCII_1)); // Display 1, 2, or 3 goto end; } } } //---------------------------------------------TRANSISTOR-------------------------------------------- else if (PartFound == PART_TRANSISTOR) { if(PartReady == 0) { // 2nd examination never made, e.g. a transistor with protection diode. hfe[1] = hfe[0]; uBE[1] = uBE[0]; } if((hfe[0]>hfe[1])) { // If the amplification factor with the first test was higher: swap C and E hfe[1] = hfe[0]; uBE[1] = uBE[0]; tmp = c; c = e; e = tmp; } if(PartMode == PART_MODE_NPN) lcd_eep_string(NPN); // Message - "NPN" else lcd_eep_string(PNP); // Message - "PNP" lcd_eep_string(bstr); // Message - " B=" lcd_data(GetPinAlias(b + ASCII_1)); // Display 1, 2, or 3 lcd_eep_string(cstr); // Message - ";C=" lcd_data(GetPinAlias(c + ASCII_1)); // Display 1, 2, or 3 lcd_eep_string(estr); // Message - ";E=" lcd_data(GetPinAlias(e + ASCII_1)); // Display 1, 2, or 3 Line2(); // Start second line // Amplification factor compute, hFE = Emitter current/base current lhfe = hfe[1]; lhfe *= (((unsigned long)rhval * 100) / (unsigned long)rlval); // 500000/750 = 666.666r if(uBE[1]<11) uBE[1] = 11; lhfe /= uBE[1]; hfe[1] = (unsigned int) lhfe; lcd_eep_string(hfestr); // Message - "hFE=" lcd_string(utoa(hfe[1], outval, 10)); SetCursor(2,7); // Cursor on line 2, character 7 if(NumOfDiodes > 2) // Transistor with protection diode lcd_data(LCD_CHAR_DIODE); // Diode indicate else lcd_data(' '); for(c=0;c<NumOfDiodes;c++) { if(( (diodes[c].Cathode == e) && (diodes[c].Anode == b) && \ (PartMode == PART_MODE_NPN)) || ((diodes[c].Anode == e) && \ (diodes[c].Cathode == b) && (PartMode == PART_MODE_PNP))) { lcd_eep_string(Uf); // Message - "Uf=" lcd_string(itoa(diodes[c].Voltage, outval, 10)); lcd_data('m'); goto end; } } goto end; } //---------------------------------------------FET--------------------------------------------------- else if (PartFound == PART_FET) { // JFET or MOSFET if(PartMode & 1) // N-channel lcd_data('N'); else lcd_data('P'); // P-channel if((PartMode == PART_MODE_N_D_MOS) || (PartMode == PART_MODE_P_D_MOS)) { lcd_eep_string(dmode); // Message - "-D" lcd_eep_string(mosfet); // Message - "-MOS" } else { if((PartMode == PART_MODE_N_JFET) || (PartMode == PART_MODE_P_JFET)) lcd_eep_string(jfet); // Message - "-JFET" else { lcd_eep_string(emode); // Message - "-E" lcd_eep_string(mosfet); // Message - "-MOS" } } // Gate capacity if(PartMode < 3) { // Enrichment MOSFET lcd_eep_string(GateCap); // Message - " C=" ReadCapacity(b,e); // Measurement hfe[0] = (unsigned int)cv; if(hfe[0]>2) hfe[0] -= 3; utoa(hfe[0], outval2, 10); tmpval = strlen(outval2); tmpval2 = tmpval; if(tmpval>4) tmpval = 4; // If capacity > 100nF drop fractional part to fit on the LCD lcd_show_format_cap(outval2, tmpval, tmpval2); lcd_data('n'); } Line2(); // Start second line lcd_eep_string(gds); // Message - "GDS=" lcd_data(GetPinAlias(b + ASCII_1)); // Display 1, 2, or 3 lcd_data(GetPinAlias(c + ASCII_1)); // Display 1, 2, or 3 lcd_data(GetPinAlias(e + ASCII_1)); // Display 1, 2, or 3 if((NumOfDiodes > 0) && (PartMode < 3)) // MOSFET with protection diode; it gives only with enrichment FETs lcd_data(LCD_CHAR_DIODE); // Diode indicate else lcd_data(' '); // Blank if(PartMode < 3) { // Enrichment MOSFET gthvoltage=(gthvoltage/8); lcd_eep_string(vt); // Message - "Vt=" lcd_string(utoa(gthvoltage, outval, 10)); // Gate threshold voltage, was determined before lcd_data('m'); } goto end; } //---------------------------------------------THYRISTOR--------------------------------------------- else if (PartFound == PART_THYRISTOR) { lcd_eep_string(Thyristor); // Message - "Thyristor" Line2(); // Start second line lcd_eep_string(GAK); // Message - "GAC=" lcd_data(GetPinAlias(b + ASCII_1)); // Display 1, 2, or 3 lcd_data(GetPinAlias(c + ASCII_1)); // Display 1, 2, or 3 lcd_data(GetPinAlias(e + ASCII_1)); // Display 1, 2, or 3 goto end; } //---------------------------------------------TRIAC------------------------------------------------- else if (PartFound == PART_TRIAC) { lcd_eep_string(Triac); // Message - "Triac" Line2(); // Start second line lcd_eep_string(Gate); // Message - "G=" lcd_data(GetPinAlias(b + ASCII_1)); // Display 1, 2, or 3 lcd_eep_string(A1); // Message - ";A1=" lcd_data(GetPinAlias(e + ASCII_1)); // Display 1, 2, or 3 lcd_eep_string(A2); // Message - ";A2=" lcd_data(GetPinAlias(c + ASCII_1)); // Display 1, 2, or 3 goto end; } //---------------------------------------------RESISTOR---------------------------------------------- else if(PartFound == PART_RESISTOR) { lcd_eep_string(Resistor); // Message - "Resistor: €€" lcd_data(GetPinAlias(ra + ASCII_1)); // Display 1, 2, or 3 Pin data lcd_data('-'); lcd_data(GetPinAlias(rb + ASCII_1)); // Display 1, 2, or 3 Line2(); // Start second line if(rv[0] > HALF_ADC_RANGE) // Examine, how far the Voltages across the test resistances deviate from 512 hfe[0] = (rv[0] - HALF_ADC_RANGE); else hfe[0] = (HALF_ADC_RANGE - rv[0]); if(rv[1] > HALF_ADC_RANGE) hfe[1] = (rv[1] - HALF_ADC_RANGE); else hfe[1] = (HALF_ADC_RANGE - rv[1]); if(hfe[0] > hfe[1]) { radcmax[0] = radcmax[1]; rv[0] = rv[1]; // Result use, which is more near because of 512 (accuracy improves) rv[1] = rhval; // High - Test resistance } else rv[1] = rlval; // Low - Test resistance if(rv[0] == 0) rv[0] = 1; lhfe = (unsigned long)((unsigned long)((unsigned long)rv[1] * \ (unsigned long)rv[0]) / (unsigned long)((unsigned long)radcmax[0] - (unsigned long)rv[0])); // Resistance compute ultoa(lhfe,outval,10); if(rv[1] == rhval) { // 470k- Resisted? ra = strlen(outval); // Necessarily, in order to indicate comma for(rb=0;rb<ra;rb++) { lcd_data(outval[rb]); if(rb == (ra-2)) lcd_data(','); // comma } lcd_data ('K'); // Kilo ohm, if 470k uses resistance } else lcd_string(outval); lcd_data(LCD_CHAR_OMEGA); // Omega for ohms goto end; } //---------------------------------------------CAPACITOR--------------------------------------------- else if(PartFound == PART_CAPACITOR) { // Capacitor measurement lcd_eep_string(Capacitor); // Message - "Capacitor: €€" lcd_data(GetPinAlias(ca + ASCII_1)); // Display 1, 2, or 3 Pin - Data lcd_data('-'); lcd_data(GetPinAlias(cb + ASCII_1)); // Display 1, 2, or 3 Line2(); // Start second line tmpval2 = 'n'; // n for nF if(cv > 99999) { // Too big cv /= 1000; // convert to Micro Farads tmpval2 = LCD_CHAR_U; // change n to greek char for micro } ultoa(cv, outval, 10); // outval now a string version of cv tmpval = strlen(outval); lcd_show_format_cap(outval, tmpval, tmpval); lcd_data(tmpval2); // display the SI Suffix lcd_data('F'); // F for Farads goto end; } //---------------------------------------------NOT-FOUND-OR-DAMAGED--------------------------------------------------------- if(NumOfDiodes == 0) { // Nothing found. Tell user. lcd_eep_string(TestFailed1); Line2(); lcd_eep_string(TestFailed2); } else { // Data found but bad result or no positive ident lcd_eep_string(BadResult1); Line2(); lcd_eep_string(BadResult2); lcd_data(NumOfDiodes + ASCII_0); lcd_data(LCD_CHAR_DIODE); } end: while(!(ON_PIN_REG & (1<<RST_PIN))); // wait, to tracers released _delay_ms(200); for(hfe[0] = 0;hfe[0]<10000;hfe[0]++) { // 10 Seconds untill power off. if(!(ON_PIN_REG & (1<<RST_PIN))) // if the button is pressed, start all over goto start; wdt_reset(); // We want to wait the full 10 Seconds _delay_ms(1); // 1mS 10,000 times = 10 seconds } if(PowerMode==PWR_9V) { // If in battery mode; try to turn off; otherwise wait for a reset POWER_OFF(); } wdt_disable(); // Watchdog out // Continuous loop, no timer while(1) { if(!(RESET_GET())) // only one reaches, if the automatic disconnection was not inserted goto start; } return 0; } // End of main()