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; }
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; }