I have purchased several of these Chinese USBasp programmers with the metal case covers. These are very nicely built.
You can also get them cheaper in bulk for about $4.00 ea.
They are based on the USBasp circuit design with an Atmega8L. The problem with these are they do not actually use the USBasp firmware. They do not work direclty with avrdude. They emulate an USB HID device so they can install without any Windows drivers. The catch is they need to use a special Windows GUI (progisp.exe) program to burn AVRs. They are based on the MX-USBISP-V3.00 2012-05-20 pcb. See image.
I found that you can reprogram these with the fischl.de usbasp.atmega8.2009-02-28.hex or usbasp.atmega8.2011-05-28.hex firmware and they seem to work great.
1) They usually have the lock bits set so you will have to erase it first.
2) Also the back of the pcb have three solder bridges that need to be removed. See image.
3) Short the two holes the arrows are pointing from to the UP label. This is the RESET line for self-programming.
Just a heads up. If anyone get the error like below when using the programmer (after reflashed), it is because the programmer tries to send data too fast.
avrdude: error: programm enable: target doesn’t answer. 1
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
This programmer doesn't have the jumper to set the speed. Fortunately, the firmware supports the -B bitclock option which can be used to change the ISP speed. If you use avrdude, just pass the -B parameter like below (the the higher the bitclock, the slower the ISP speed):
avrdude -c usbasp -P usb -p m328p -v -B 10
With Arduino IDE, as hiduino have shown me (note there is a semicolon after the bitclock):
There is no direct way to control the programming speed from the IDE. However, you can configure the defaults in avrdude.conf to slow down the programming. Just keep in mind this will affect all programming from avrdude.
Look for this line in avrdude.conf (around line 320):
# default_bitclock = 2.5;
Remove the comment tag and change it to somewhere around 10 to 20:
default_bitclock = 15;
That should slow the programming down enough.
Actually, if you want to be more specific.
For target AVRs down to running at 1MHz you can use:
default_bitclock = 3;
For target AVRs down to running at 128KHz you can use:
default_bitclock = 32;
Then if you dare go down to 16KHz:
default_bitclock = 128;