Electronic Projects Online - Eprom Programmer Mark 2
Originally published by Paul Stenning in ETI, November 1994

The Harris CDP6402 may be replaced with a Harris HD6402.

A common requirement for the electronics hobbyist today is a cheap straight-forward EPROM Programmer, suitable for occasional use, without the extra features found on many commercial units.  The EPROM Programmer presented here is designed to address these requirements, and can be used to program the standard 27 family of devices, from 2764 to 27512. It can be used with any IBM PC compatible computer as the controller and data source.

progpic The 27 series family of EPROMs has now been around for many years, so long in fact that the smaller 24 pin devices in this family (2708, 2716 and 2732) are almost obsolete and are now more expensive than a 2764.  For this reason it was felt to be unnecessary to accommodate these devices in this design since they would significantly increase the complexity.

The design presented here has avoided the usual "Catch 22" situation of requiring a programmed EPROM to make the EPROM programmer work, and the design uses readily available components to reduce the likelihood of obsolescence.  The unit is powered from an external PSU, supplying +5V @ 200mA and +12.6V @ 200mA.  A suitable design is featured elsewhere in this magazine.

The programmer itself is dumb and is controlled by the host computer via the RS232 serial port (COM1 or COM2).  Device selection and operation mode is set by front panel switches.

The accompanying software is available on disk from the author.  The software will operate on any PC running MS-DOS or PC-DOS version 3.0 or later and having at least 512K of RAM and one RS232 serial port.  A hard disk and a colour monitor are strongly recommended.  The software is written in Microsoft QuickBASIC V4.5, and the full source code is supplied for those wishing to enhance or modify it.  This source code is also compatible with QBASIC, as supplied with MS-DOS 5.0 and later.  You do not need QuickBASIC or QBASIC to use this disk.  The disk also contains the software for a matching EPROM Emulator planned for publication next month.  A description of the software operation is given later.

The unit may also be suitable for use with other types of home computer having an RS232 serial port, although this has not been tested and no software is available.  It will definitely not work with Commodore Amiga computers, due to a peculiarity in the serial port handling.

Please note that the programming algorithm used may not be exactly as specified in some EPROM manufacturer's data sheets.  Because of this, the unit cannot be guaranteed to program every device successfully, however no problems have been experienced to date.

How it Works

The circuit diagram is spread over a number of illustrations.  Although it may initially look complex, it is in fact relatively straightforward.  When a "-" follows a signal name (for example STROBE-), this shows that the line is active low.  When a number is followed by an "h" this indicates that the number is hexadecimal.

The RS232 (serial) interface, buffering and clock are shown in figure *.  IC3 (6402) is a UART (Universal Asynchronous Receiver/Transmitter) which basically converts serial data to parallel and vice-versa.  The device supports most common serial data formats, in this application it is configured to give eight data bits, one stop bit and no parity checking.  The data rate is set by the crystal controlled clock circuit (IC2), which in most cases will be set to 9600 Baud.

IC1 is the RS232 buffer, converting the 5V data from the UART to the +/- 10V RS232 standard, and vice-versa.  This device contains a voltage doubler and voltage invertor circuit, producing +/- 10V rails from a single +5V input.  The four external capacitors (C1 to C4) are required for these circuits.

A byte of serial data arriving on pin 20 of IC3 will be converted to parallel data, which will appear on pins 5 to 12.  Pin 19 will go high, and no further data can be received until pin 18 is taken low momentarily.  One gate of IC4 causes this to happen, R3 and C8 create a slight delay giving the STROBE- pulse adequate width for clocking other devices.  When pin 23 is pulsed low, the parallel data on pins 26 to 33 is transmitted in serial form from pin 25.

R4, D1, C9 and one gate of IC4 produce the power-on reset pulse for IC3, IC5 and IC6.  SW1 allows the circuit to be reset again as required.

The pinouts of the four EPROM types handled by this unit are shown in the table below.

  PIN    2764    27128   27256   27512
 #  1     VPP     VPP     VPP     A15
    2     A12     A12     A12     A12
    3     A7      A7      A7      A7
    4     A6      A6      A6      A6
    5     A5      A5      A5      A5
    6     A4      A4      A4      A4
    7     A3      A3      A3      A3
    8     A2      A2      A2      A2
    9     A1      A1      A1      A1
   10     A0      A0      A0      A0
   11     D0      D0      D0      D0
   12     D1      D1      D1      D1
   13     D2      D2      D2      D2
   14     GND     GND     GND     GND
   15     D3      D3      D3      D3
   16     D4      D4      D4      D4
   17     D5      D5      D5      D5
   18     D6      D6      D6      D6
   19     D7      D7      D7      D7
 # 20     CE      CE      CE/PP   CE/PP
   21     A10     A10     A10     A10
 # 22     OE      OE      OE      OE/VPP
   23     A11     A11     A11     A11
   24     A9      A9      A9      A9
   25     A8      A8      A8      A8
 # 26     NC      A13     A13     A13
 # 27     PP      PP      A14     A14
   28     VCC     VCC     VCC     VCC

    NC    =   No Connection
    PP    =   Program Pulse, Negative Going
    OE    =   Output Enable (Active Low)
    CE    =   Chip Enable (Active Low)
    VPP   =   Programming Voltage
    VCC   =   Supply Voltage
    GND   =   Ground (0V)

It can be seen from the above that most of the pins are the same for all devices.  Only 5 pins require special attention, these are 1, 20, 22, 26 and 27, and are marked with a "#" next to the pin number.

Pin 26 is not used on the 2764 and A13 on the other devices, since A13 is outside the addressing range of the 2764 there is no problem leaving it connected to Pin 26 when handling these devices.

SW2 selects which signals arrive at the other four pins.  This can be followed through with the circuit diagram and the table above - and does not need a tedious description from me.  Note that 2764 and 27128 share the same switch position.

SW3 selects either Program or Read mode.  With this switch in the centre (Off) position the EPROM receives 5V power only and can be safely removed from the socket (SK2).

Counters IC5 and IC6 are connected to the EPROM address lines, and are arranged to increment each time a byte of data is received.  I will describe the full operation sequence for both Read and Program modes shortly.

IC7 is a tri-state buffer and is enabled in Program mode only.  In this mode it connects the received data from the UART to the EPROM.  Although the 74LS245 is bidirectional, in this application it operates in one direction only because pin 1 is permanently connected to 0V.

OK, it's time to own up!  The circuitary around IC10, TR1 and TR2 is an afterthought.  If you look at the internal photo of the prototype you will see the Veroboard (don't worry, the current PCB is correct).  I missed the fact that 27256 and 27512 EPROMs need a supply of 6V instead of 5V when programming.

Since there are no spare sections on SW3, I am using the section that connects the programming pulse to pin 20.  If the unit is switched to Read, or to Prog and 2764/27128, pin 20 of the socket will be low.  If it is switched to Prog and 27256 or 27512 it will be high, except when actually programming in which case it will be high with the 1ms negative going programming pulses.  This high level turns on TR1 via R17.  TR1 discharges C19, which will not charge significatly during the 1ms periods when TR1 is off.  This low level keeps TR2 off, allowing R13 and R14 to bias the GND pin of IC10 to about 1.2V, giving an output of about 6.2V.  When Pin 20 is low, TR2 is off and TR1 is on.  The GND pin of IC10 is therefore connected to 0V, giving an output of 5V.

I chose 6.2V because some devices need 6V while others need 6.25V, in either case the tolerance is +/- 0.25V.  The voltage tends to drop slightly on load due to the varying current from the GND pin of IC10, so I tended towards the high end of the acceptable range.  Some EPROMs draw 100mA or more, so a 1A regulator IC was chosen in preferance to a 100mA part.  IC10 draws it's power from the 12.6V programming supply so this should be suitably rated.

Assume that SW3 is in the Read position.  When a byte of data is received, it appears on lines R0-R7, and the Strobe- line pulses low as described previously.

Note that in Read mode the actual value of the byte received is irrelevant, since IC7 is disabled.  However the receipt of a byte causes the unit to send a byte, which is what we need.

Since the Prog- line is high, pin 13 of IC4 will be held high by D3, so the Strobe- pulse will have no effect in this section of the circuit.  This arrangement of diodes on the input of an invertor gate produces a NOR function.

The Read- signal however is low, so the Strobe- pulse will pass through D5 and the two gates of IC4, arriving on pin 8.  PP- is currently high (I'll explain this line in a moment), so the Strobe- signal will appear inverted on pin 4 of IC4.  C14, R11 and D9 act as a basic monostable, giving a very brief negative going pulse on the Send- line as IC4 pin 4 goes low.

This Send- pulse causes the UART (IC3) to transmitt the data on it's pins 26-33.  These pins are connected to the EPROM data pins, so the data transmitted is that contained in the current EPROM address.  RN1 holds the lines high if no EPROM is fitted, since IC3 is a CMOS device.

Pin 24 of IC3 will go low once the data is safely in it's buffer and will go high again once it has been transmitted.  This signal is connected to the clock input of IC5 to increment the address.

The next time a byte is received, the data in the next EPROM memory location will be transmitted, and so on.  Providing the user presses the Reset button when requested, the software and programmer will remain in step.

We will now look at the Program mode, where the Prog- line is low.  IC7 is enabled due to its pin 19 being low.  The data received by the programmer will therefore be coupled to the EPROM data lines.

The situation with our diode NOR gates is now reversed, so the Strobe- pulse will appear on pin 12 of IC4, and not pin 8.  Another CR monostable circuit (R8, D4 and C16) produces a brief negative going Prg- pulse.

IC8 and IC9 generate the 1 millisecond programming pulse.  The lower two gates form a S-R flip-flop.  When the Prg- pulse occurs, pin 6 of IC9 will go high, causing pin 12 to go low.  This takes the reset pin of IC8 low, so that it can count the pulses on it's clock input.  This pulse train (Clock2) is from the crystal controlled clock circuit (IC2) and has a frequency of 19.2KHz (2.4576MHz divided by 128), which equates to a period of 52.1uS.  When 19 of these pulses have been counted (19 * 52.1uS = 0.99ms), pin 8 of IC9 will go low, reversing the state of the S-R flip-flop and reseting IC8 again.

Thus a 0.99ms negative going pulse will appear on the PP- line.  The specification calls for 1ms +/- 5%, so 0.99ms is fine.  This PP- signal will go to the appropriate pin on the EPROM, set by SW2.  The rising edge of PP- will produce a negative pulse on Send- (via D7), as before.  A byte of data will therefore be sent once the programming operation is complete.  This will also cause the address counters to be incremented as described previously.  The value of the data sent is not important since it's purpose is to tell the softwsre that the programming step is done - however it will be the same as the data received.

Therefore to program the EPROM, it is simply necessary for the software to send one byte of data, and wait to receive something back before sending the next one.

The use of discrete components to produce other types of logic function from a logic invertor gate may seem odd, but it means I can do the job with one IC instead of four!


The unit is assembled on a single sided PCB. A number of wire links are required, which should be fitted before any components, since some pass underneath ICs.  I would suggest that the resistors are fitted next, followed by the ICs, then the capacitors, then the remaining parts.  Fit a link wire between COM and 96 to set the Baud rate to 9600.  Fit SIL header strip or Veropins for the off-board connections.

Fit a 28-way IC socket in the EPROM socket position.  Plug three more sockets into this, then plug the ZIF (Zero Insertion Force) socket into the top.  If this stack feels unsteady use some Araldite or similar to hold it together.

The interwiring is shown in figure *.  This should be carried out at this stage, since it is necessary for testing.  After testing the board can be fitted into the case.

The connections for both 9 and 25 way serial connectors, use whatever matches the socket on your computer.  On the prototype a 9 way D connector (serial) and a 6 way DIN socket (DC input) were fitted to the case.

The rotary switch connections are shown by giving the pin number or letter marked on the switch body.  Please take great care with these, since there are 16 wires to each switch and an error could be difficult to track down.  I used coloured ribbon cable, and still managed to get one wrong!


Connect the unit to a 5V and 12.6V supply.  If a test meter is to hand, check for about +9V on pin 2 and -9V on pin 6 of IC1 (MAX232).

Connect the unit to the serial port on your PC, and run the program "SER-TEST.EXE" on the software disk.  When prompted, type "1" or "2" followed by <Enter> to say which serial port you are using.  The program does nothing more exciting than wait for you to enter a 2-digit hex number (followed by <Enter>) and then sends it to the programmer.  It then attempts to read back a number, if it's successful it prints the number otherwise it prints "**".  To exit just press <Enter> on it's own.  All the responses in this section will be shown with quotes ("") around them - just type the number (followed by <Enter>), don't type the quotes.

Connect the programmer to your PC's serial port and a suitable power supply.  Switch the programmer to 27512 and Read, and press Reset.  Type "00" on the computer, and the software should respond with "FF".  Whatever two digit hex number you type now should bring the response "FF", since the unit is reading the EPROM data lines, which with no EPROM will be pulled high by RN1.

We will now pull one of the data lines low, to give a different reading.  Fit a piece of wire between pins 9 and 12 of the EPROM ZIF socket.  If you type a number now the unit will return "FE".  Leave one end of the wire in pin 12, and connect the other end in turn to pins 10, 11, 13, 14, 15, 16 and 17.  Type a number in each case and you should get the following responses - "FD", "FB", "F7", "EF", "DF", "BF" and "7F" respectively.  Remove the piece of wire, and switch the unit to Off.  Now if you type a number the unit will not respond so the software will show "**".

Now switch the programmer to Program.  Type "00", and "00" should be returned.  Using a logic probe, test meter or oscilloscope, check the logic levels on pins 9, 10, 11, 13, 14, 15, 16 and 17.  They should all be low.

Now type "01".  The unit should return "01", and pin 9 should now be high, and the others should remain low.  Now enter "02", "04", "08", "10", "20", "40" and "80" in turn.  In each case the unit should return the number you entered.  After each entry, check the logic levels on the data pins, only one should be high in each case - 10, 11, 13, 14, 15, 16 and respectively.

Switch the unit back to Read, and press Reset.  Press Enter on it's own to quit the software then run "ADR-TEST.EXE", which is also on the disk.  Since the address counters are incremented when a byte is sent, it would take a long time to get the count to 65535 manually!  ADR-TEST does it automatically, and pauses at four points to allow you to check the logic levels.  Follow the instructions on screen.  The table below shows the expected logic levels on the address pins at the four pause points.

 Addr Line   A15 A14 A13 A12 A11 A10  A9  A8  A7  A6  A5  A4  A3  A2  A1  A0
 Socket Pin   1   27  26  2   23  21  24  25  3   4   5   6   7   8   9   10
 Count                             Expected Logic Level
     0        0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 21845        0   1   0   1   0   1   0   1   0   1   0   1   0   1   0   1
 43690        1   0   1   0   1   0   1   0   1   0   1   0   1   0   1   0
 65535        1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

If these readings are OK, and the preceding tests were also successful you can be fairly confident that the unit is working correctly.  The only sections that weren't checked were some of the device and mode switching.  However the likelihood of problems here is remote if you were careful with the switch wiring.

If you have a blank EPROM and a suitable hex file available, you can try programming a device using the information given shortly.

The Case

The prototype was constructed in a plastic case, 190mm * 165mm * 68mm, see parts list for details.  A suitable overlay for the front panel is shown in figure *. Two photocopies may be taken (enlarge to 162mm * 64mm), one can then be used as a drilling template while the other may fixed to the front panel with clear self-adhesive vinyl.

Cut a rectangular hole in the centre of the top for the ZIF socket, then mount the PCB on suitable spacers.  The sockets for DC power input and RS232 input are fitted on the rear panel.


The software for this project is supplied on one 3.5" 720K disk (now available for download - link at top of page).  Please note that this disk also contains the software for a matching EPROM Emulator, planned for publication next month.

Since the various programs extend to over 2500 lines of BASIC source code, it would make boring reading to print it in the magazine.  A printed listing is not available since it would be more expensive than a disk to produce.

The software is supplied as-is, and Paul Stenning cannot accept any liability for any loss or damage however caused.  The source code is supplied so that you may modify the software for your own use only.  The software may not be redistributed in either it's original or in a modified form.

A batch file is supplied on the disk to simplify installation.  Insert the disk in the drive, type "A:" then "INSTALL", and the batch file will make a \EPROM directory on your drive C:, and copy the software to there.  If you do not have a hard disk, make a working copy of the disk using DISKCOPY, then put the original away.  Do not write-protect your working copy or the software will not work.

If you are using Windows, suitable icon, PIF and group files are supplied on the disk.  Some parts of the software will operate much slower under Windows, particularly the initialisation when the serial port is opened.  However it will run in the background (probably very slowly) if you are using 386 Enhanced Mode.

The main software of interest for this project is spread over two programs, "PROGRAM.EXE" and "HEX-CONV.EXE".  The first of these is the main control software for the programmer, while the second converts various industry standard hex file formats to and from the EPROM programmer format.  Formats supported include Intel, Motorola S-Record (3 variants), Tektronix, RCA Cosmac, Binary Image, ASCII Hex (3 variants) and ASCII Binary (4 variants) - so you should be able to find something suitable!

Additional programs on the disk are "EMULATE.EXE" which controls next months EPROM Emulator, and "SPLIT2.EXE" & "SPLIT4.EXE" which divide Intel hex files into 2 or 4 files for 16 and 32 bit systems respectively.  Since the full BASIC source code is given for all of these programs, it would be possible to create one large program containing all the facilities - if someone had more time than me!  I would be interested to see any enhanced versions.

When "PROGRAM.EXE" is started, the Device Selection Menu will appear.  From here you choose the type of device you will be using, either 2764, 27128, 27256 or 27512.  CMOS versions of these devices can also be handled, so if you are using a 27C128 you would choose 27128.

One important point regarding programming voltages.  Early 2764 and 27128 devices required a programming voltage of 21V.  If the device is marked 27C64, 27C128, 2764A or 27128A it will require 12.5V.  Any non-CMOS device without an 'A' suffix will require 21V.  If in doubt, try programming with 12.5V first, no damage will occur but the device will not be programmed.  If a 12.5V device is programmed with 21V it will be destroyed.  21V devices can be programmed by this unit, but you will need to provide an appropriate voltage, and a heatsink for IC10.

Once you have chosen the device required, the Main Menu will appear.  Option 1 allows you to read an EPROM, and save the data to disk.  The data is saved and loaded ASCII-Text format which is peculiar to this software.  "HEX-CONV.EXE" will convert to and from this format.

When Option 1 is selected you will be told where to set the switches, and to insert the EPROM to be read.  You will then be asked for a filename, simply enter 8 alpha-numeric characters - the extension is fixed to .HEX and does not need to be typed.  If a file of that name already exists it will be overwritten.  Now sit back and wait, the progress will be shown on the screen.

Option 2 allows you to check an EPROM is blank.  A blank device will have "FF" in all locations.  The operation is the same as above but no filename is needed.  Note that if no device is fitted, the blank test will pass since the data lines are pulled high by RN1.

An EPROM can only be erased by exposing the window in the case to Ultra-Violet light.  If a proper eraser is used this will take about 20 minutes.  Replacement tubes for these are available for about #10 and will fit into some fluorescent torches - leave out any clear plastic or glass in front of the tube since this will block UV.  Be very careful not to look at this light.

I have not yet found a completely successful alternative.  A disco type 2' UV fluorescent tube will erase a device in about two days!  I have been told that a camera flash gun will erase a device in about 4 flashes, but it did not work with my point-and-shoot camera.  A professional flash unit will probably be rather more successful.

Option 3 allows you to program an EPROM from data on disk.  Operation is the same as above, but the programming process will take about twice as long as reading.  Once the programming is complete you will be asked if you wish to program the device.

Option 4 allows you to verify an EPROM.  This checks the EPROM against a file on disk, and is normally done after programming to make sure the programming was successful.

Option 5 allows you to change the EPROM type as previously.  Option 6 lets you run the Hex File Convertor program, "HEX-CONV.EXE" - this is detailed below.  Option 7 lets you access a DOS Shell, type "EXIT" to return to the programmer.  To quit the Programmer, press Escape.

The Hex File Convertor is equally simple to use.  When it is started, you get the Load Menu.  Choose the file format of the existing file, then enter the filename when requested.  As previously, the file extension is .HEX and need not be typed.

Once the file is loaded, the Save Menu will appear.  Choose the file format you want, then type the filename.  If a file of that name already exists it will be overwritten without warning - so be careful!

The file "HEX-CONV.TXT" gives information on all the file formats, and samples are provided on the software floppy disk, in the \HEX directory.


Elsewhere in this issue you will find a suitable power supply for this unit.  It will supply 5V at up to 500mA and 12.6V at up to 250mA.  This will also power next month's EPROM Emulator.

Coming next month is a matching EPROM Emulator.  This emulates the same range of devices as the programmer, and can save hours programming and erasing EPROMs when doing software development work.  It needs a single 5V supply and can be powered from the host circuit (if it can spare 100mA) or from the power supply mentioned above.


Resistors (0.25W 5% or better)

R1                                               4M7
R2                                               2K2
R3                                               1K0
R4,7,9,14,17                                     47K
R5,6,8,10,11,16                                  4K7
R12                                              100R
R13                                              470R
R15,18                                           22K
RN1                                              10K x 8 Resnet

Capacitors (all 16V or greater)

C1,2,3,4,5                                       22u
C6,7                                             22p
C8,16,17                                         2n2
C9                                               10u
C10,11,12,13,14,18,20                            100n
C15                                              47u
C19                                              1u0


IC1                                              MAX232
IC2                                              74HCT4060
IC3                                              CDP6402 (Maplin QQ04E)
IC4                                              74HCT14
IC5,8                                            74HCT4024
IC6                                              74HCT4040
IC7                                              74LS245
IC9                                              74LS10
IC10                                             7805
TR1,2                                            BC548
D1,2,3,4,5,6,7,8,9                               1N4148


XT1                                              2.4576MHz
SK1                                              9 or 25 way D
SK2                                              28 way ZIF socket
SK3                                              DC INPUT
SW1                                              push to make
SW2,3                                            4 pole 3 way rotary

PCB, Case, knobs, wire.