While developing the Retro Adapter I managed accidentally
lock a couple of ATmega168s by programming the fuse bit which disables RESET, thus
disabling serial program downloading too. The AVR was attached to a keypad matrix which
caused the programmer to accidentally set it.

In order to recover an AVR and restore the SPI programming interface you need to use
High Voltage Programming mode. Unfortunately HV programmers are not very common, so I
decided to look into making one.

While I still plan to make a full programminger in the long term, for now I have adapted
Jeff Keyzer's Arduino based HV programmer to use an ordinary ATmega8. The design is
fairly simple and easy to make on matrix board or even breadboard. It also works with the
ATmega48/88/168 family.

The design could easily be adapted to rescue almost any other AVR. All that is required is
the program code updating with the correct fuse values and if necessary the wiring altered
to suit.

My thanks go to Gustavo Spadari for pointing out a bug in the code and testing with
an ATmega48V.

Hardware

Schematic (click for printable version)

Note that the 16MHz xtal is not required. The code work work at 1MHz on the internal
RC oscillator.

Connection map:

ATmega8

ATmega168

PD0

PB0

PD1

PB1

PD2

PB2

PD3

PB3

PD4

PB4

PD5

PB5

PD6

PC0

PD7

PC1

PB1

PD4

PB2

PD3

PB3

PD2

PB4

PD1

PB5

PD5

PC2

PC2

PC3

PB6 (XTAL1)

PC4

PD6

PC5

PD7

PB0

Vcc, AVcc

In the schematic the two AVRs are connected directly. Adding 1KΩ resistor to every
line will provide some protection for the ATmega8 against inserting the target AVR
incorrectly. The only line which should not have a resistor is the one from PB0 to
Vcc/AVcc. My matrix board build omitted them.

When powered on, the LED lights up to indicate that the device is ready. When the
button is pushed it dims for approximately 1 second while setting the fuses, then comes
back on to signal that the programming cycle is complete.

The circuit requires a dual 5V and 12V power supply. A DC-DC converter could be used to
generate 12V, as only a very small amount of current is required to hold the RESET line of
the target AVR at 12V.

High voltage programming works by holding the RESET line at 12V. The ATmega8 controls the
programming process by first powering up the target AVR (the mega48/88/168 in the schematic)
and then applying 12V via the transistor.

In the schematic the ATmega8 is clocked by a 16MHz crystal, but in practice any crystal
or even the internal RC oscillator should work (however they are untested). The code
includes some delay loops, however they are only minimum time delays so it should not
matter if they run for longer than expected.

Firmware

The code is based on Jeff Keyzer's Arduino code, but converted to ordinary C code that
uses AVR-GCC. This removes all dependencies on the Arduino hardware and makes things a
lot clearer and easier to work with for those of us who don't use that platform.

It would not be too tricky to extend the code to other AVRs or even add a USB/RS232
interface to turn it in to a full programmer. However, I am instead planning to make
Jacob Here's USB
high voltage programmer and producde a PCB for it, as it is already more advanced and
supports a number of AVRs.