Home

In theory it is possible to use the parallel printer port of a PC to recover the fuse settings of an Arduino Uno. If the SPI serial interface of an Arduino is not working then the fuses may need reprogramming by using the high voltage (12 volt) parallel method. By sharing some of the data pins it should be possible to set the low and high fuses to a state that will enable the SPI serial mode to operate. The rest of the chip can then be programmed using the SPI interface. This web page describes a possible circuit for doing this.

I have bought several Chinese Arduino Uno's through eBay. Two of them did not work. So I have had a go at making a programmer to reprogram the fuses. One of the Uno's had a crystal that was only soldered in on one leg and so I soldered that in properly and that one works OK now. The other Uno I tried reprogramming the fuses but that failed to fix it. So I do not know if my programmer works. I did not want to try it on a good working Uno in case it damaged it or set the fuses in a not working configuration. So does my programmer work ? I do not know. This information is here to help any one else who fancies making such a beast. It's not a beginners project, there's lots of wires and it would be helpful if you can code. The code included here is in Microsoft Visual C version 6 that's a really old version but it can be imported into Visual Studio 8 or later. The code is intended for Windows XP, there's a problem with getting access to the printer port on later versions of Windows such as Windows 7 and Windows 10. I think the free version of Visual Studio 2015 for Windows 10 can create XP programs although I have not tried that myself.

The code originally came from this web site http://elm-chan.org/works/avrx/report_e.html My programmer contains both SPI and parallel mode interfaces. The programmer has fourteen NE555 chips configured as drivers. Twelve for the data signals and two for turning the power supplies on and off. Two power supplies 9 volt and 18 volt regulated down to 5 volt and 12 volt. Three voltage regulators one of which can be software switched on and off. The SPI part of my programmer has the same wire connections as the one here http://elm-chan.org/works/avrx/rs/avrx_lpt.png but without the link from pins 12 to 9. You can build just the SPI part of my programmer using only three NE555's. I have tested that and that part works OK. I have successfully used the SPI part of my programmer to read values from a working Arduino Uno.

I have a partial Eagle schematic eagle-schematic.zip that can be downloaded from the webpage here https://flimirx.wixsite.com/filecab/pp

Use the LibreOffice spreadsheet Arduino-parallel.ods as a reference for wiring everything else, it can be downloaded from the webpage here https://flimirx.wixsite.com/filecab/pp

The spreadsheet also contains a sheet for calculating the PC parallel port values.

The programmer that I built varies from the schematic in the following ways:

  • I used a KA7805 instead of the switchable LM2596S 5 volt regulator.

  • I did not have Eagle libraries for a couple of the components. Where the schematic shows a IRF9530 MOSFET I used actually used a IRF9540.

  • Where the schematic shows a 2SC1307 NPN transistor I used actually used a C3944A.

I just used components that I already had. You should be able to use anything similar.

All of the NE555's use pin 4 as the input, that probably looks a bit odd because that is the NE555 reset pin, but it works well. Pin 2 is grounded. The output pin 3 follows the pin 4 voltage and the pin 7 output gives the opposite voltage. Pin3 is used for all outputs except for the 12 volt control signals and NE555-13 which use pin 7. The NE555's are pretty good as drivers, they have a decent output and short circuit protection and you can buy a huge bunch for less than a couple of UK pound on eBay. They are a bit slow with a typical output rise time of 200 nano seconds but that's not a problem with this circuit. The outputs from the NE555's each have a current limit resistor on them of 2k except for the MOSI signal that is 1k and the SCK signal which is 500 ohm. The current limit resistors are needed to protect your Arduino in the unlikely case that it is stuck with it's outputs active.

This programmer is intended for Arduino Uno boards with soldered in chips. If you have a pluggable chip you would be better off using another socketed programmer. You need to prepare your Uno board by cutting a few tracks before you can use it with this programmer. The web page here gives instructions on how to do that. https://sites.google.com/site/arduinotechdev/prepare

pp35.jpg
schematic.jpg

I did not need R19. You might depending on which components you use to switch the 12 volts.

Resistor pad numbering.

I used 1/4 watt resistors and the legs on them are too thin to make good contact in the breaboard. I cut a piece of PCB and soldered them on to that. They are numbered from the left:

1 The first four resistors, joined on the bottom (only two of these are used).

2 The 5th and 6h resistors, joined on the bottom.

3 The 7th resistor (not used).

4 to 18 are all single resistors.

The two pads on the right are used for connecting 5volts and ground wires together.

pp33.jpg

Where I have used resistors on the breadboard I have soldered pins on to their legs so they plug in tightly.

You can see I have lots of LED's on the breadboard. They are optional, if you use LED's they each should have a 330 ohm in series with them.

A page containing more photos is here https://sites.google.com/site/arduinotechdev/thumbsviewer

Nick Gammon's forum has a tried and test 12 volt supply on this web page.

https://www.gammon.com.au/forum/?id=12898

I think my 12 volt supply is working OK because the Arduino pulses the RDY/BSY line in response to the commands but I do not have the test equipment to check the timing.

Newer XP releases run an autodetect sequence on the parallel port where

every 5 seconds for about a minute or so. It seems that this autodetect may

be triggered when the parallel port is first accessed.

Solution:

The problem can be solved by creating a specific key in the registry

database:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Parport\Parameters\DisableWarmPoll

This registry entry should be of type DWORD and have a value of 1

(0x00000001).

The owner of this web site accepts no responsibilty for any loss or damage you might incur using the information or code on this web page. You use it entirely at your own risk.

The information and code on this web page may and most likely contains errors.

Back to the home page

Last updated 26 January 2017.