Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
	//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 */
Ejemplo n.º 4
0
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()