During my tries to burn an Arduino-bootloader on an ATMEGA168, I tested a fistful (yes, exactly five!) programmers. Here, I like to share my experiences. But also the members of the Arduino community have been assiduous and improved the description for burning a bootloader, and also the capability of the Arduino environment (Arduino 0009) for burning bootloaders a lot (see here)! I did not test out yet, so maybe things I did not succeed in, do work now.
The Programmer described in Arduino-Playground (see ) is known as "DAPA" by programmers software. With this, it was simple to burn an Arduino bootloader on ATMEGA8 properly, even just with the menu of the Arduino environment (the Arduino-environment had to be started with Administrator privileges and GIVEIO had to be installed). So that, I do not mention ATMEGA 8 later, since there the simplest method works fine.
Burning the bootloader-hex on an ATMEGA 168 results in an interesting problem: After the upload of the bootloader, it's possible to upload software - but only once. The uploaded software works fine, exactly as it's expected. But it's not possible to upload a new one- the bootloader was overwritten by the sketch because of the wrong settings of the fuses. - I did not find any way to set the fuses on an ATMEGA168 correctly with a DAPA programmer.
The programmer known as "BSD" is similar to the DAPA, just with different connexions. Since this programmer is known by ”AVRDude”, one can upload the bootloader with ”UISP” (contained in Arduino package) and set the fuses with AVRDude (or do all with AVRDude).
Upload the bootloader with uisp:
uisp -dpart=ATmega168 -dprog=bsd -dlpt=0x378 --wr_lock=0x3F
uisp -dpart=ATmega168 -dprog=bsd -dlpt=0x378 --erase --upload if=bootloader\ATMegaBOOT_168.hex -v
uisp -dpart=ATmega168 -dprog=bsd -dlpt=0x378 --wr_lock=0xCF
Anyway, in some cases, it did not work and the ATMEGA 168 became inprogrammable- only to be refreshed with high voltage programming - see fourth paragraph. Later I found out this must be because of too low signal levels of my parallel port. Because it worked with the STK-200 compatible programmer.
The hardware description for another programmer, known as "STK200" by the programs, I found here at 
Since I'm an anxious person, I added 1kOhm Resistors to all lines (except GND, of course) connecting my parallel port with the programmer. In this programmer, a 74LS244 works as line driver and amplifies the signals from parallel port and the ATMEGA, which was necessary for my laptop's parallel port. This programmer is easy and fast to build on a drilled board ("Veroboard"), the 74LS244 is cheap and easily available at electronic stores.
Also, one can get that kind of programmer for around 10 Euros at electronic shops or ebay.
With that, I got no problems in programming and setting fuses with AVRDude (see the description linked above).
A friend of mine had a STK500-Evaluation board lying about, now being part of my stuff-collection :-) The software "AVR-Studio" supplied with that and the high-voltage-programming mode allowed to "repair" the ATMEGAs becoming unavailable by the tries with the BSD-programmer. This is a fine toy, also works with RS232 to USB connectors. The disadvantage is the necessity to apply the ATMEGA to the awful built-in sockets for high-voltage programming mode.
A wonderful description how to use AVR-Studio for programming the Arduino bootloader is in the Arduino playground at .
The last possibility I tried out was to use the STK500 as ISP with AVR-Studio (by the way: freely available, just Google about). I did not test that Software with the other ISPs above; perhaps this may interest me later.
This is a wonderful combination and overall solution when experimenting with other fuses and different crystals.
Since the original STK-500 is good, but not very handy, I made a more handy one. The version I chosed is described in . It needs only a few cheap components and works like a charm (tested with Windows XP). Since I own this toy, I never needed the original STK-500 again.