bool go_TestChips()
{
	printf(" Begin Chip %c Test\n", chipPosChar[chipPos]);
	prober.printf("MoveChuckContact");
	tb.mDelay(200);

	while (true)
	{
		int bin = 0;
		bool repeat;
		if (!TestSingleChip(bin,repeat)) break;

		int nRep = settings.errorRep;
		if (nRep > 0 && repeat)
		{
			prober.printf("BinMapDie %i", bin);
			prober.printf("MoveChuckSeparation");
			tb.mDelay(100);
			prober.printf("MoveChuckContact");
			tb.mDelay(200);
			if (!TestSingleChip(bin,repeat)) break;
			nRep--;
		}

		if (keypressed())
		{
			prober.printf("BinMapDie %i", bin);
			printf(" wafer test interrupted!\n");
			break;
		}

		// prober step
		int rsp;
		char *answer = prober.printf("BinStepDie %i", bin);
		if (sscanf(answer, "%i", &rsp)!=1) rsp = -1;
		if (rsp != 0) printf(" RSP %s\n", answer);
		tb.mDelay(100);

		// last chip ?
		if (rsp == 0)   // ok -> next chip
			continue;
		if (rsp == 703) // end of wafer -> return
		{
			prober.printf("MoveChuckSeparation");
			return true;
		}

		printf(" prober error! test stopped\n");
		break;
	}

	prober.printf("MoveChuckSeparation");
	return false;
}
Esempio n. 2
0
bool go_TestChips()
{
	int x, y;
	int rsp;

	prober.SendCmd("MoveChuckSeparation");

	// --- read actual map position
	if (prober.SendCmd("ReadMapPosition")) return false;
	
	if (sscanf(prober.GetParamString(), "%i %i", &x, &y) != 2) return false;
	CChipPos map(x, y, CChipPos::Id2Pos(chipPos));

	// --- skip excluded chips
	while (IsExcludedChip(map))
	{
		rsp = prober.SendCmd("StepNextDie");
		if (rsp == 703) return true; // end of wafer
		if (rsp != 0) return false; // error

		if (sscanf(prober.GetParamString(), "%i %i", &x, &y) != 2)
			return false;
		map.Set(x, y, CChipPos::Id2Pos(chipPos));
	}

	// --- loop all chips -------------------------------------------
	printf(" Begin Chip %c Test\n", CChipPos::Id2Pos(chipPos));

	while (true)
	{
		int bin = 0;
		bool repeat;
		// --- test chip
		prober.SendCmd("MoveChuckContact");
		if (!TestSingleChip(bin,repeat)) break;
		prober.SendCmd("MoveChuckSeparation");

		// --- retest chip if not working
		int nRep = settings.errorRep;
		while (nRep > 0 && repeat)
		{
			prober.SendCmd("BinMapDie %i", bin);
			tb.mDelay(100);
			prober.SendCmd("MoveChuckContact");
			tb.mDelay(300);
			if (!TestSingleChip(bin,repeat)) repeat = false;
			prober.SendCmd("MoveChuckSeparation");
			nRep--;
		}

		// --- manual interruption
		if (keypressed())
		{
			prober.SendCmd("BinMapDie %i", bin);
			printf(" wafer test interrupted!\n");
			break;
		}

		// --- step to the next chip
		int rsp = prober.SendCmd("BinStepDie %i", bin);
		if (rsp == 703) return true; // end of wafer
		if (rsp != 0) break; // error

		sscanf(prober.GetParamString(), "%i %i", &x, &y);
		map.Set(x, y, CChipPos::Id2Pos(chipPos));

		// --- skip excluded chips
		while (IsExcludedChip(map))
		{
			rsp = prober.SendCmd("StepNextDie");
			if (rsp == 703) return true;  // end of wafer
			if (rsp != 0) return false;   // prober error

			if (sscanf(prober.GetParamString(), "%i%i", &x, &y) != 2)
			{
				printf(" RSP no response\n");
				return false;
			}

			map.Set(x, y, CChipPos::Id2Pos(chipPos));
		}
	} // while

	return false;
}