Simple function IC tester circuit using bi-directional LPT parallel port or serial port
LOGIC PROLOG
What is mean logic-1 or logic-0? Logic-1 and logic-0 strongly connection between the state at one moment and one condition. Logic-1 means any states are in the condition of high voltage close to Vcc voltage, and logic-0 means any states that close to netral or ground voltage. Is that just right that?. What about logic philosophy? Logic philosophy are like this, at one state, logic-0 cannot be made to be come logic-1 but logic-1 can be made to be logic-0. So if we want to exam the output of any devices (like and gate, or gate, not gate, buffer, counter, etc.), the output logic must be keep to be logic-1, then the input logic can be applied and the output logic will be changed by the result.
SALUTATION
This project was dedicated to Paul Stenning at http://www.paulandmark.u-net.com/electron/ where the idea come when I saw his project. The project used a standard serial port type. I got quiet difficult to find this type IC. So I made the parallel port version. The concept is still the same. I changed only the part of serial to parallel convertion data. But my program still can used both hardware, serial port type or parallel port version. Certainly I didn't try the serial version, because I didn't build it, so if someone have found any bugs, please report it to me. I will fix it. Thanks to Paul because of his great thinking. I myself already tried a long time ago to make a device like this (simple ic-tester) to test any other ICs in my junk trash can. Thank you very much Paul'S !!!
THE PARALLEL VERSION IC-TESTER
Some part was changed to accomodate the parallel type port. The original clock circuit, RS-232 buffers and interface was omitted and replace with the parallel port interface and the flip-flop latch changed with 8-bit latch, so the circuit is more simpler. Other parts are still the same accept that the selector switch to select the IC power was changed to relay devices. So we can make the device a little automatic selecting pin power. Here is the complete circuit diagram
click the below images for zooming
The device must used bi-directional LPT parallel port (because the standard LPT parallel port can not accomodate the data interchange). All control signals are used to make the combination of control function for PPI-8255. More about explanation for this IC type can be seen at another topic, LPT extender and expander). This IC configured for port-A as output port, port-B as input port and port-C as output port. Port-A used to send logic state to IC under test, port-B used to read logic state from IC under test and port-C used for input decoder to select the enable function of latches and buffers of IC under test and also to activated the relay power circuits. Tabel I-1. shows the functional truth table for operational of this PPI-8255 for our purpose.
A1 | A0 | Reset | Description | |||
X | X | X | X | 0 | 1 | DP side is tri-state (Hi-Z) |
X | X | X | X | 1 | X | All ports as input ports (reset) |
0 | 0 | 1 | 0 | 0 | 0 | DP side to port-A (write port-A) |
0 | 1 | 0 | 1 | 0 | 0 | Port-B to DP side (read port-B) |
1 | 0 | 1 | 0 | 0 | 0 | DP side to port-C (write port-C) |
1 | 1 | 1 | 0 | 0 | 0 | DP side to port-CW (write port-CW) |
1 | 1 | 0 | 1 | 0 | 0 | Not allowed for 8255A-5, but accepted for 82C55 type (read port-CW) |
As usual, DP port LPT is used for data interchange, PS port LPT used partly for identify card, and PC port LPT used for controlling the PPI-8255. As for identify card, like EPROM Programmer Card application, I used 2-bits for this purpose. But in that card, PS-7 seems like a redundancy function. Because it is inverting input, so if the PS-7 bit is not connected/released or broken, the reading also true. So I make some advanced used for this PS-7 bit. In this IC-Tester card, this bit used for detecting power-on from the card. If the card is still connected but the power is off, the program can not continue. Please you compare this function with both card. All of PC port LPT are used for controlling. I already selected these bits for our used. PC-5 bit as usual used for bidirectional enable, PC-3 bit used for WR signal (note that PC-3 is inverting input), PC-2 bit used for RD signal (this is normal input), PC-1 bit used for selecting address A1 (note that PC-1 is inverting input) and PC-0 used for selecting address A0 (this also an inverting input). The others functions, reset and Chip Select (CS) enable by used the combination of PC-3 and PC-2 bits. The explanation of these functional utilization can be obtain at LPT extender and expander topic. Tabel I-2. shows the bits should be apply to this port for our purpose as needed by tabel I-1.
DP-7 ~ DP-0 | 8-bit data port | |||||||
PS-7 (Inv.) | PS-3 | Card Identify | ||||||
X | 0 | IC-Tester card detect | ||||||
1 | X | Power-on detect | ||||||
PC-7 (Unused) | PC-6 (Unused) | PC-5 (Bidirectional Enable) | PC-4 (IRQ Enable) | PC-3 (Inv.) Used for | PC-2 Used for | PC-1 (Inv.) Used for A1 | PC-0 (Inv.) Used for A0 | Control port |
X | X | 0 | 0 | 0 | 1 | X | X | Stand-by mode (Hi-Z) |
X | X | 0 | 0 | 1 | 0 | X | X | Reset |
X | X | 0 | 0 | 1 | 1 | 1 | 1 | Writing port-A |
X | X | 1 | 0 | 0 | 0 | 1 | 0 | Reading port-B |
X | X | 0 | 0 | 1 | 1 | 0 | 1 | Writing port-C |
X | X | 0 | 0 | 1 | 1 | 0 | 0 | Writing port-CW |
C-7 | C6 | C-5 | C-4 | C-3 | C-2 | C-1 | C-0 | OUTPUT |
0 | 0 | 0 | Enable latch data pin-1 ~ pin-8 | |||||
0 | 0 | 1 | Enable latch data pin-9 ~ pin-16 | |||||
0 | 1 | 0 | Enable latch data pin-17 ~ pin-24 | |||||
0 | 1 | 1 | Enable buffer data pin-1 ~ pin-8 | |||||
1 | 0 | 0 | Enable buffer data pin-9 ~ pin-16 | |||||
1 | 0 | 1 | Enable buffer data pin-17 ~ pin-24 | |||||
1 | 1 | 0 | Spare (unused) | |||||
1 | 1 | 1 | Stand-by mode (steady state) | |||||
1 | 1 | 1 | 1 | 1 | User 24-pins IC power select | |||
1 | 1 | 1 | 1 | 0 | 24-pins IC power select | |||
1 | 1 | 1 | 0 | 1 | 20-pins IC power select | |||
1 | 1 | 0 | 1 | 1 | 16-pins IC power select | |||
1 | 0 | 1 | 1 | 1 | 14-pins IC power select | |||
0 | 1 | 1 | 1 | 1 | User-pins IC power select |
HARDWARE
I already built this prototype by using double sided PCB using protel software design. The design was still crowded, but it worked. Many jumper must be made to both sides, because we didn't have a fabricate one (this create manually). I used a tiny email wire (or you may use wire from nyy cable). Even its already double layer, it needs also many jumper, so don't forget to put it in the right way.
Here is the PCB artwork looks like (35.800 Bytes).
Note that the common copper clad of top layer is ground and the common copper clad of bottom layer is Vcc. Don't forget to test it with ohm tester (bell check). this copper side both layer must not short circuited. Also Vcc and ground for any IC must be checked there were connected or not. Its better if we used many socket for ICs, because if any IC known defect, it can be easyly replaced with the new one. Many hours must lost here if you didn't do it well, careful!!! Here also I made PCB adapter (8.349 Bytes) for 20-pins, 16-pins and 14-pins IC to 24-pins socket. View of these adapter constructions are as follow (8.968 Bytes).
SOFTWARE
Original software written in Quick Basic style, I prever write it in Pascal style (may be later in Delphi for windows based). As usual the hardware can be connected to any LPT parallel port, and the software will automatically checking the card existence. For any one who has already built the serial version, still can use this software. But I did not tested the serial version by myself, please report it if you found any bugs. Below is part of the routine to detect the card, initialization it and routine for I/O transfer, implementation of the description before.
TYPE LPT_Port = (LPT_1, LPT_2, LPT_3, No_LPT); Mode_PPI = (Port_A, Port_B, Port_C, Port_CW, Port_Hi_Z, PPI_Rst); Dec_Port_C = (Set_Latch_1, Set_Latch_2, Set_Latch_3, Set_Buffer_1, Set_Buffer_2, Set_Buffer_3, Set_Spare, Steady_State); Mode_Port = (COM_1, COM_2, LPTs); Pin_IC = (Pin_24, Pin_20, Pin_16, Pin_14, User_Pin, Not_Set); CONST Ada_Port : BOOLEAN = FALSE; Ada_Card : BOOLEAN = FALSE; Bi_Direct : BOOLEAN = FALSE; PC_Port : ARRAY[0..2] OF WORD = ($03F8,$02F8,$0278); { 'COM1','COM2','LPT1' } DP : ARRAY[LPT_Port] OF WORD = ($3BC, $378, $278, $3BC); { Data Port } PS : ARRAY[LPT_Port] OF WORD = ($3BD, $379, $279, $3BD); { Status Port } PC : ARRAY[LPT_Port] OF WORD = ($3BE, $37A, $27A, $3BE); { Control Port } Port_PPI : ARRAY[Mode_PPI] OF WORD = ($000F, { Port-A PPI as output port} $0022, { Port-B PPI as input port} $000D, { Port-C PPI as output port} $000C, { Port-CW PPI as output port} $0004, { Port-Hi-Z PPI } $0008); { Reset PPI } Set_Mode_PPI = $0082; { Port-A, Port-C = Output } { Port-B = Input, Mode = 0 } Set_Dec_Port_C : ARRAY[Dec_Port_C] OF BYTE = ($F8, { Latch 1 Aktif } $F9, { Latch 2 Aktif } $FA, { Latch 3 Aktif } $FB, { Buffer 1 Aktif } $FC, { Buffer 2 Aktif } $FD, { Buffer 3 Aktif } $FE, { Spare Bit } $FF); { Steady State } Tegangan_IC : ARRAY[Pin_IC] OF BYTE = ($F7, { Vcc=pin-24, Gnd=pin-12 } $EF, { Vcc=pin-22, Gnd=pin-12 } $DF, { Vcc=pin-20, Gnd=pin-12 } $BF, { Vcc=pin-19, Gnd=pin-12 } $7F, { Vcc=pin-24, Gnd=pin-1 } $FF); { Vcc=none, Gnd=none, external supply } Port_A_PPI = $03; { Note that Port-A through Port-CW } Port_B_PPI = $02; { are inverting to PC-0 and PC-1 } Port_C_PPI = $01; Port_CW_PPI = $00; PROCEDURE Cek_Card; VAR Kode_1, Kode_2, Kode_3 : BYTE; Dummy : BYTE; BEGIN Ada_Port := FALSE; Ada_Card := FALSE;Bi_Direct := FALSE; IF (Set_Port = LPTs) THEN { Parallel Port } BEGIN FOR LPT := LPT_1 TO LPT_3 DO BEGIN IF (NOT Ada_Port) OR (NOT Ada_Card) THEN BEGIN IF PORT[PC[LPT]] <> Set_Dec_Port_C[Steady_State] THEN Ada_Port := TRUE; IF Ada_Port THEN BEGIN PORT[DP[LPT]] := $44; { Send code byte 'Dummy' } Dummy := PORT[PC[LPT]]; PORT[PC[LPT]] := Dummy OR $20; { Cek bi-directional port } IF PORT[DP[LPT]] <> $44 THEN Bi_Direct := TRUE; PORT[PC[LPT]] := Dummy; IF Bi_Direct THEN BEGIN IF ((PORT[PS[LPT]] AND $88) = $80) THEN Ada_Card := TRUE { Cek IC-Tester Card } ELSE Ada_Card := FALSE; { PS_3 = normal, PS_7 = Inverting } END; { When open, PS are all in hi-z } END; END; IF Ada_Port AND Ada_Card THEN { Normally PS[LPT] = $7F (?) } BEGIN Port_DP := DP[LPT]; Port_PC := PC[LPT]; Port_PS := PS[LPT]; IF Bi_Direct THEN Inisialisasi_PPI; END; END; END; END; PROCEDURE Inisialisasi_PPI; BEGIN IF Set_Port = LPTs THEN BEGIN PORT[PC[LPT]] := Port_PPI[PPI_Rst]; { Give a pulse } PORT[PC[LPT]] := Port_PPI[PPI_Rst]; { Give a pulse } PORT[PC[LPT]] := Port_PPI[Port_Hi_Z]+Port_CW_PPI; PORT[DP[LPT]] := Set_Mode_PPI; PORT[PC[LPT]] := Port_PPI[Port_CW]; { Give a pulse } PORT[PC[LPT]] := Port_PPI[Port_Hi_Z]+Port_CW_PPI; PORT[DP[LPT]] := Set_Dec_Port_C[Steady_State]; PORT[PC[LPT]] := Port_PPI[Port_C]; { Give a pulse } PORT[PC[LPT]] := Port_PPI[Port_Hi_Z]+Port_C_PPI; END; Temp_Port := Set_Port; END; PROCEDURE Tulis_Port_A(Datanya : BYTE); BEGIN PORT[DP[LPT]] := Datanya; PORT[PC[LPT]] := Port_PPI[Port_A]; { Give a pulse } PORT[PC[LPT]] := Port_PPI[Port_Hi_Z]+Port_A_PPI; END; PROCEDURE Tulis_Port_C(Datanya : BYTE); BEGIN PORT[DP[LPT]] := Datanya; PORT[PC[LPT]] := Port_PPI[Port_C]; { Give a pulse } PORT[PC[LPT]] := Port_PPI[Port_Hi_Z]+Port_C_PPI; END; FUNCTION Baca_Port_B : BYTE; VAR Temp : BYTE; BEGIN PORT[PC[LPT]] := Port_PPI[Port_B]; { Give a pulse } Temp := PORT[DP[LPT]]; PORT[PC[LPT]] := Port_PPI[Port_Hi_Z]+Port_B_PPI; Baca_Port_B := Temp; END; |
No comments:
Post a Comment