Andy's Electronics/Software Projects Page

This page shows examples of hardware projects I have designed and software I have written since the 1980s onward.
I have not put everything I have designed onto this page as there are too many items. I have separated this page into two sections - Hardware and then Software, Some items are by their nature a combination of the two aspects.


Hardware Example No. 1 - Manual Eprom programmer and Reader
Manual Eprom programmer
I designed this simple circuit in 1988 as a means of programming and reading EPROMS.
It has 4 Hexadecimal coded rotary switches which are connected to the ADDRESS lines of the Eprom.
An 8 Bit D.I.L. switch connected to the DATA lines, A Slider switch connected to the OE/CS pins and a small microswitch connected to the Programming pin, 2 Hexadecimal led displays monitoring the DATA lines.
To use the circuit for checking a byte in an Eprom.
Insert the Eprom (27C64/27C128) into the socket.
Set the slider switch to READ.
Set all 8 DIL switches to OFF.
Set the memory address on the Hex switches and switch on the 5V supply.
The data stored at the memory location in the Eprom as set on the Hex switches will be displayed on the LED displays.

To use the circuit for programming data into the Eprom.
Insert the Eprom (27C64/27C128) into the socket.
Set the slider switch to WRITE.
Set the required data to be blown on the DIL switches in binary.
Set the memory address on the Hex switches to the required storage location and switch on the 5V supply.
Press the microswitch (for approx 20ms) and the data will be stored at the memory location in the Eprom
this may be checked by setting the slider switch to READ.

Hardware Example No. 2 - Computer Controlled Eprom programmer

ZX Spectrum Eprom programmer  ZX Spectrum Eprom programmer shown connected to ZX Spectrum Program voltage selector board

Image 1 shows the main board with the Eprom module at the bottom (click on image for detailed view)
Image 2 shows the unit connected to the ZX Spectrum and the led location counter display on the right.
Image 3 shows the Programming voltage board, Giving voltages of 12.5V, 17.5V, 21V & 25V depending on Eprom.

I designed this system in 1989.
I wanted to be able to write Z80 programs in assembler and then blow the object code into an Eprom so that I could try
out programs in my Z80 development platform and phone timer (see Hardware examples 4 & 5)
As well as designing the hardware I had to write the software to control the programmer, this was manly done in Basic
but the actual routines for programming and reading the eproms were written in Z80 code.
Because the Z80 Assembler I was using was designed for generating code to be run on the ZX Spectrum it's self, It meant
that any references to addresses in memory or
jmp commands would not work when the resulting code was transferred to
an eprom. Because of this problem I wrote some code which checked through the resulting code and worked out which
values related to incorrect memory addresses which it then adjusted to allow for the new memory map of my Z80 development platform.

The one problem with using the Spectrum to develop software on was that all data had to be saved onto audio tapes.
But as I learnt more about the insides of the Spectrum I discovered that I could actually blow my OWN version of the
ROM and there was some space on it to add in my own code. I used this to my advantage :-
I blew the Z80 Assembler onto a 27C128 Eprom and added my own code to the space on the ROM which when run
using the
RANDOMIZE USR command, it would copy the data from the Eprom to the spectrums RAM ready for running.
This meant that I did not have to wait for the program to load from tape it would load in less than a second.

I standardised the format for storing programs in Eproms like this by using a header at the start of the Eprom which my
code (in the Spectrum Rom) would extract. Info like Start address, End address, Total bytes to copy and some text
which would be displayed on the screen when the loader program was activated.

The screen would show a message like this when the code was activated :-

 (C)1989 Andy Savage Software - ZX Insta-Load program
Program Loaded   : Z80 Zeus Assembler/Dissasembler Program
Object Code Size : 24823 Bytes
Start Address    : 40000

Insta-Load Eprom containing my Z80 assembler program Example "Insta-Load" Eprom containing my Z80 Assembler program.


Hardware Example No. 3 - Phone call charge timer (Mark I)

Phone call timer Phone Call charge timer unit.I designed this unit in 1987.

It allows you to keep track of how much a phone call is costing as you talk.
Simply set the RATE SELECTION switch to the required zone type/Charge band and when the caller answers you
set the unit to START. It automatically adds a single unit straight away and from then onwards it increments the unit count display every t seconds (where t is determined by the zone/Charge band as stated in British Telecom's information).
when you hang up simply set the unit to STOP and multiply the UNITS by the current price per unit (i.e. 21*5.74p)
If you write down the cost each time you make a call then you can work out the total cost each quarter.
The circuit is based around a ZN1034E Timer IC.

Hardware Example No.4 - Phone call charge timer (Mark II)

Phone call charge timer (Mark II) - Inside view showing Z80 bottom left    Phone call charge timer (Mark II) - View of case

Image 1 shows the inside of the unit - Z80 bottom left, Software in the central ZIF socket, 2 batteries top right.
Image 2 shows the front of the unit with the keypad and LCD.

I designed this unit in 1990.
This unit is much more sophisticated than the previous version.

It has the following additional points :-
LCD dot matrix display
Real time clock (Automatically knows what charge band is)
Battery backed memory (8 Kbytes) to keep a copy off all calls made.
Preset budget amount alarm (i.e. It beeps to warn if you have been on the phone longer than your intended preset limit)

It is based around a Z80 processor with 6264 Ram, M3002-16 Real time clock IC (Battery backed) connected to the
Maskable interrupt and a 16 button keypad with a 74C922 Keyboard decoder IC connected to the Non-Maskable interrupt.
I wrote the software on a Sinclair ZX Spectrum computer in Assembly language and programmed the object code
into the Eprom using an Eprom programmer that I also designed and wrote the software for. (See No. 2 above)

Hardware Example No. 5 - Z80 Development platform

Z80 Development platform.  --- Z80 Dev platform, Ram tower --- Ram tower for the Z80 Dev platform

I built this in 1989 and developed it over 2 years.

It is based around Z80 processor running at 2.45MHz.
It started of as 1 section with the processor and memory but over time I kept adding new bits to it.
I used this as a means to develop my software skills and to learn how to control different bits of hardware.

After 2 years it had the following features :-
LCD dot matrix display.
Real Time clock.
Voice synthesizer. (SPO256A-AL2)
16 button keyboard interface.
6 off 8 bit I/O ports.
8 Bit ADC (ZN447E) and 8 Bit DAC (ZN428E)
A Ram "tower". So called due to the way I constructed it. This seemed the simplest way to connect the required ram chips together. All data and address lines are common. Only the CS lines need to be separated. So I used 2 pieces of strip board with the IC sockets connected at regular intervals. Fitted with 7 off 6264 Ram chips (Total 57344 bytes of memory)

The configuration shown in the image is as a sound sampler. The software fitted to it allows you to sample sounds into the RAM and play them back at different speeds and start points or backwards.

Hardware Example No. 6 - ZX spectrum Sound Synthesizer.

Sound synthesiser (Component side)
   Sound synthesiser (Track side) PCB etched by me.

I designed this card in 1987.
It is a 3 channel sound synthesizer card for use with the Sinclair ZX Spectrum.
The sound generators on this card are controlled by sending data into the control registers of the Sound chip.
It is based around a Yamaha AY-3-8913 IC.
I decided to have a go at designing a PCB for this one, I used transfers and a pen and etched it myself, I was quite pleased with the results.

Hardware Example No. 7 - Adapted Radio alarm Clock.

Adapted radio alarm clock.  Inside alarm clock

Image 1 shows the completed alarm clock in a plastic ABS box with the "mains out" lead in front of it.
Image 2 shows the insides - Original alarm clock PCB mounted at the top. My mains interface PCB at the bottom, Back-up
battery on the left and the mains transformer on the right.

I designed this in 1987.
Someone gave me a bed side radio/Alarm clock that they did not want, the radio in it was of very poor quality (Only AM)
I decided to take it apart to see if I could improve it. I discovered that the Radio and clock parts were on separate PCB's, With some control wires between them which applied power to the Radio circuit when activated by the alarm.
I dismantled the entire clock and removed the Radio circuitry. I then fitted the clock part into a new case and designed a circuit which allowed the clock circuit to control mains apparatus.
I used a MOC3020 Opto isolator and a TIC226D Triac on a custom made PCB which slotted into the case as shown.
This new improved Clock now had the facility to be able to connect anything mains to it that you wanted switching on in the morning. I connected it to a full size Radio but you can connect anything mains upto 6 Amps. I have been using this adapted clock for well over 22 years now without any problems.

Hardware Example No. 8 - Xenon Strobe unit.

Xenon strobe unit Xenon strobe unit. (Strobe bulb on right, step-up transformer at bottom)

I built this unit in 1984.
The circuit runs from a 9V supply and has a transformer wired back to front with a push-pull oscillator driving into the secondary windings thus producing a high voltage from the primary. There is also a xenon flash trigger transformer to provide the 3Kv striking voltage to trigger the flash. this is controlled by means of a opto isolator.
It is one of the first PCB's that I etched my self.
This unit produces a very bright flash at a variable frequency t. (Where t=15Hz to 0.1Hz), it can also be driven from an external trigger source such as No.1 spark plug HT lead on a car engine as an aid to tuning the engine.
I tried lots of experiments with the unit, some very interesting effects can be achieved on things such as Food mixers, Fans, Mains air pumps, drills but the best experiment was with a dripping stream of water. When you adjusted the frequency just right it was possible to make the water freeze in mid flight or go backwards up in the air.

Hardware Example No. 9 - Stereo 2 channel Audio mixer unit.

2 Channel stereo audio mixer unit 2 channel audio mixer.I designed and built this unit in 1991.

The mixer circuitry is based on TL084 op amps.
At the time I had started to compose my own music using a midi synthesizer and a midi drum machine. I wanted to be able to mix the 2 audio signals together. So I produced this unit, it has individual controls of the input levels and master output levels (Left and Right), Connections to the unit are made via gold phono sockets on the top of the unit.

Hardware Example No. 11 - Model Radio Control system

Radio control Transmitter unit Radio control RX circuitry

Image 1 shows the Transmitter unit with the lid up in the air, RF PCB in the bottom.
Image 2 shows the Receiver circuits with a servo unit connected to channel 2. The interchangeable crystal socket on left.

I built this system in 1983.
This is the first item I produced that had RF components in it. Because I could not afford a metal box I had to use a home made wooden box which I lined with Aluminum foil.
This unit has 8 channels which each can control a servo motor on the model. In this unit I only connected the first 2 channels to servos which I fitted to a boat.

Hardware Development tools I produced lots of modules which I found useful for quickly making circuits.
Here are a few examples :-

Dev tool - Pulse counter 

4 digit led counter The PCB above has 4 off 4026 7 segment display driver counter IC's on it which are linked together in series.
When the circuit has power applied to it, it resets to 0000. When the clock input wire goes from 0V to 5V (if supply is 5V) it causes the total count to increase by 1.

Dev tool - Data board

Data input board I designed this module so that I could "inject" a digital value into data lines.
The data is entered via toggle switches and the value is shown in both binary and Hexadecimal formats.

Dev tool - Astable 

Astable clock and Mono stable unit.The unit above has a 4047 Astable/Monostable IC inside it. I have wired it up in such a way as to allow the unit to be configured in many different modes.

Dev tool - Digital potentiometer 

Digital PotentiometerI designed the unit above so that I could achieve a variable resistance based on digital data from 4 lines.
Inside the unit are values of resistor which double in size (i.e 1K, 2K, 4K, 8K) these resistors are connected in series with the ends of this circuit being accessible on the box. Each resistor can be shorted out by a 4066 analogue switch. Each control line to each switch is available on the ribbon cable. So depending on what binary count is applied to the unit, it will give a resistance relative to it.

Example :-0000 = 15K
0001 = 14K
0010 = 13K
0011 = 12K
1110 = 1K
1111 = 0K

Dev tool - Binary counter

Binary up/down counter.The module above has 4 off 74HC193 binary counter IC's connected in series. It can be made to count up or down depending on the position of the toggle switch. The count can be reset by the button in the middle. The binary count will increase or decrease by 1 each time the clock wire changes state.

Dev tool - Address bus decoder

Address Bus decoder module.
The module above has 2off 7430 IC's and 1 7427 IC's. I used this module for address decoding applications

Software Example No. 1 - LED RESISTOR WIZARD

Visual basic example - LED WIZARD Program 

LED WIZARD (Visual Basic V4) This is a Microsoft Visual Basic V4 program that I wrote in 1996.
It calculates the required series resistance to make the desired current flow through a Light Emitting Diode.
It caters for 5 different types of L.E.D.
The engineer simply selects the type of led then sets the applied voltage
and required current sliders. The program shows the required series resistance to give these values.

Software Example No. 2 - Dos Program Menu Launcher

DOS Program menu launcher screen 

Dos Program menu (Written in C)

I wrote this program in 1996 in C.
This program came about because where I work, the test technicians have many different test programs that have to be run
on the PC.
Because they were not computer literate and it was awkward remembering which directory each program was located in.
An additional problem was that the PC's that were used for running these programs on were 8088 or 286's at best,
So it was not possible to use one of the menu programs that are available today because they do not run on such low spec machines with CGA monitors.
I tried to keep the program as simple as possible so as not to use too much base ram. One method I employed was to have the menu text read in as a text file. This way you could save valuable bytes and allow easy editing of the menu data.

When the program is run, it looks for the file menudata.txt and analyses it, stripping out the relevant text to print it on screen.
When the operator presses a key it tests the key press with the first character on each line of the test file until a match is found.
If it matches then it changes to the directory and launches the program using the
system command. When the launched program is exited you are presented once again with the menu.
When the user pressed % it would automatically run the DOS
Edit command and load it with the menudata text script ready
for altering. (Or you could use the Windows notepad)
I also programmed into the menu a screensaver which if the user did not press a key for 10 mins then the screen would go
black and the current time would ricochet about the screen until a key was pressed.

Example MENUDATA.TXT Script file read in by my program that produces the screen shot above:-

**************** Menu data file ********************
Z - Print wizard !\dos\printwiz
T - Borland Turbo C !\tc\tc
W - Windows !\windows\win
X - XtreeGold !\XTG3\X
S - Scandisk !\DOS\SCANDISK
D - Defragmentation !\DOS\DEFRAG
W - MultiWriter !\MW\MW
1 - Doom Game !\games\doom\doom
2 - Doom 2 Game !\games\doom2\doom2
% - Edit menu log file !\DOS\EDIT MENUDATA.TXT!


Software Example No. 3 - College assignment of text file analyser program.

Screen shots of program in action (Animated 4 frames only) 

Animated screen shot of program in action. I wrote this program in 1996 as part of my C programming coursework.
I had to write a program that would read a text file in from floppy disk and analyse it, Calculating how many of each vowel there was and how many characters there were in total.
I made my program perform this task with real time counters and a % progress count.

Software Example No. 4 - Printer Wizard utility program.

Print Wizard screen shot 

- Print Wizard The screen shot above shows that style 4-Ultra mode has been chosen and the left gutter has been adjusted to 12.33mm by the user. When S was pressed on the keyboard it would set the printer to this mode. Confirmed by the printer beeping 3 times.

I wrote this program in 1995 in C after getting a copy of the BJ10sx printer programmer's manual.
I had written a similar program for my Atari STE, But now I was starting to use the PC to write programs I decided to rewrite this utility program in C.

The program allows you to program a Canon BJ10sx printer so that when you send a text file to it, it will print it in a very small font size which makes it simpler to follow program listings because you can get more text onto a page.
Example: In "ULTRA" mode set to max = 165 lines by 137 columns (A total of 22605 characters on a single A4 sheet)
The program allowed you to adjust the Left gutter (to allow for a hole punch) by using the cursor keys, When the user changed the columns amount it would show the gutter distance in real time in mm from the edge of the paper.
The program has 4 possible font sizes to choose from. I generally used the ULTRA mode when debugging programs.


Software Example No. 5 - Time Lapse Video program

Atari STE with digitiser atached

Atari STE with digitiser attached.

The above image shows the Atari STE computer with the Video digitiser hardware connected to the expansion port on the left and the "weatherman's button" connected to the joystick port on the right.

Written in 1992, Developed over a period of 2 years.
2172 Lines of GFA Basic code.
400 Lines of 68000 Assembler code.This is a program that is run on a ATARI 4160STE computer (68000 based computer) It requires a video digitiser connected to the expansion port and a video camera. The video digitiser hardware (Rombo's Vidi-st) came with some basic digitising software which I was not overly impressed with. But I noticed that on the last page of the manual that came with it were detailed Machine code interface run points. This is a small relocatible machine code program that allows the programmer to gain access to the control of the digitiser hardware.I started experimenting by supplying the interface code with a series of incremental memory addresses and making it store an image every 30 seconds while I had a video camera pointing up at clouds in the sky. I then wrote a routine to playback these stored frames to the screen in quick succession. I was stunned by the result. Because you do not have to rely on the eyes image retention time (due to each image remaining on screen unlike cinema film) it meant that you could produce impressive results. From this point onwards I kept adding new features to my program, The end result was a very sophisticated program which had the following features :-Frame store of 130 images. (320*200*16 colours)

Frame storage options of -
(1) Full speed 12fps.
(2) Grab a frame every t seconds (t= 0.5 Seconds to 24 Hours).
(3) Grab a frame every time you press a "weather man's" type button connected to the joystick port. Various Playback options -
(1) Play frames forward in loop
(2) Play frames backward in loop
(3) Play frames in yo-yo loop
(4) Play frames relative to mouse X or Y position
(5) Save menu to allow you to save the produced sequence to hard disk.
(6) Reduce all frames by a quarter (I wrote this routine in 68000 assembler)
(7) Play with real time animation overlay mode below....Real-time animation overlay mode allows you to digitise a sequence of frames and then while they are playing you can draw on to them anything including a previously digitised image. This image is then recorded on top of the existing animation sequence and incorporated into the playback sequence. This image is pasted into the sequence in real time (while playing) by pressing the mouse button. This overlay feature allowed some very fancy effects to be done.Because you could use the "Weather man's button" to grab a frame on demand, it meant that you could make your own simple animated cartoons by taking a frame and then moving the object(s) slightly and taking another frame.

Because the output from the Atari STE is a composite Video signal, it was possible to use a video recorder to record the
animation sequences.
The frames in the video below were digitised using my software, then saved to disk in the ".PI1" format. I used GemView V2.24 to convert them to ".GIF format".
Then imported them into the PC using Animation Shop.

Demo video.
Please wait for all 24 frames to load in (2min 10sec at 33.6Kbs)...............

Demo Video of timelaspe generated footage 

Short (24 frame) animation of footage produced from timelapse

Since creating this software back in the 1990s, computing has come on a long way and these days its very easy to create time-lapse videos and even show them on the interent for all to see. Since 2006 I have been using youtube to show off my time-lapse creations.
To see them visit my youtube channel


Click on the logo below to visit my homepage
click here to goto my home page.