How to Update the Firmware on a Cheap USBasp-Clone

34K2016

Intro: How to Update the Firmware on a Cheap USBasp-Clone

This is a small guide to flashing new firmware onto a USBasp-clone like mine. This guide is specifically written for the USBasp-clone seen in the pictures, however it should still work with others. The wiring is shown on step 5, there is a TL;DR on step 9.

Enjoy!

STEP 1: ​The Problem

Avrdude tells me that the programmer I am using has outdated firmware. The normal jumper for self-programming does not exist on my board. Here is how to fix that. Schematics for the USBasp can be found at fischl.de.

STEP 2: Materials Needed

You will need...

  • A soldering iron
  • An Arduino (preferably Nano)
  • Some jumper wires
  • A PC with the Arduino IDE and avrdude installed

STEP 3: The Solution

In order for us to flash new firmware onto the ATmega8, we need to gain control of its RESET pin. Normally, a jumper on the USBasp can be closed to enable self-programming, however the manufacturer of my board did not include one.

On the ATmega8, the RESET pin is pin 29, the fourth pin on the top from the left. It is connected to a 10k pull-up resistor to 5V. We have to connect it to pin 5 of the ICSP header.

We could try to solder a wire directly onto the resistor or the pin itself, however it is tedious and can damage your board. (I tried it and ripped off the pull-up resistor, I don't recommend it) Also, there is a much easier way!

Although manufacturer did not include a real jumper to enable self-programming, he did put a header underneath the microcontroller. We can simply solder a wire across and...

STEP 4: Voilà!

We have connected the two reset pins! The two holes on the bottom connect pin 29 and pin 14 of the microcontroller.

STEP 5: Setting Up the Arduino

To flash the new firmware onto the programmer, we need another programmer, in this case an Arduino with the ArduinoISP sketch on it. Just to make sure that your setup is the same, please uncomment line 81

// #define USE_OLD_STYLE_WIRING

Now connect the Arduino with the ICSP header on your programmer.

Arduino		USBasp
5V		Pin 2 (VCC)
GND		Pin 4/6/8/10 (GND)
Pin 10		Pin 5 (Reset)
Pin 11		Pin 9 (MISO)
Pin 12		Pin 1 (MOSI)
Pin 13		Pin 7 (SCK) 

The USBasp remains unplugged from the PC.

Open a terminal and type

avrdude -cavrisp -pm8 -b19200 -P[Your port number goes here, it should be the same as in the Arduino IDE]

If everything goes right, avrdude should print out some information about the ATmega8 (fuses, signature, etc.)

STEP 6: Flashing the ATmega8

To flash the chip, we still need the firmware. Head over to fisch.de and download the newest version. Extract the archive and navigate to it using the shell.

Compiling the code did not work for me, but fortunately the archive contains all the compiled programs under

bin/firmware

Here you should see three .hex files. Pick the one with the same name as your chip. My programmer uses an ATmega8, so I picked

usbasp.atmega8.yyyy-mm-dd.hex

With a working connection to the ATmega8, flashing it should require only typing

avrdude -cavrisp -pm8 -b19200 -P[PORT] -U flash:w:[hex file]

If everything was done correctly, avrdude should write and verify the selected firmware.

STEP 7: Making Sure the Programmer Works

To use the USBasp as a programmer again, we have to remove the connection between pin 29 and pin 14. Cutting the jumper on the bottom should suffice, however removing it cannot hurt either.


You can try it out by plugging it back into the PC and typing

avrdude -cusbasp -pm8

Even if avrdude cannot reach the target, it should at least acknowledge the new firmware of our programmer.

STEP 8: Troubleshooting

Should avrdude show an error like this, it probably has something to do with the auto-reset feature of the Arduino. To circumvent this, please add a capacitor between RESET and GND of the Arduino. It is generally recommended to use a 10µF capacitor, however in my case, a 100µF capacitor worked just fine.

Should you get an error like

avrdude: error: programm enable: target doesn't answer. 1

or an invalid signature is returned, please check your wiring. I had a problem with my power cables rusting and not conducting electricity anymore. I recommend checking all jumper wires beforehand.

Also make sure to switch pin 11 and pin 12 on the Arduino, if the problem persists.

Please also make sure to set the correct baud rate for the Arduino as ISP, 19200. It can be set with the option

-b19200

If you have any questions or have spotted a mistake, please let me know :)

STEP 9: TL;DR

  1. Solder a wire across the two pins on the bottom of the board
  2. Set up an Arduino as ISP, making sure to enable the old wiring schema
  3. Connect the Arduino to the programmer through the ICSP header
  4. Flash the new firmware onto the programmer
  5. Remove the connection on the bottom
  6. Don't rip off any SMD resistors

10 Comments

Hi there!
I have the same USBasp, as you mention. I put a bit of solder between the two resets pins. Im using an Arduino Mega 2560, but 'im get stuck in the step 5, when run avrdude there's no response from the USBasp. I used pins as you mention, then flip pins for MISO to MOSI (as said by Andromeda45), and then tried with to 51, 50, 52, but is always the same.
What I'm doing wrong? is the USBasp crap?
Oops, finally got a microscope, the chip is an ATmega8L and firmware loaded fine. Only problem: Avrdudess won't recognize it, The mfr code is wrong, but Arduino IDE will use it to upload sketches just fine.
I have a usbasp with an atmega48p and cannot compile the firmware for 2011-05-28. I believe the problem is that gcc has changed. I know that the atmega88 is in the same family, but the hex file for it is too big for the 48? (usbasp.atmega88.2011-05-28.hex: 4,716 / 4,096 Bytes (115.14%)). Does this mean if my usbasp has an atmeg48 I won't be able to upgrade it to use with an attiny10?
Thank you for a great guide. I have almost the same programmer, just the programming jumpers are brought out so I could just use one cable to connect these (correctly connected if blue led on the programmer turns off when avrdude queries the board). I did have some issues understanding how exactly to connect the wires, so when i finally managed to update the firmware, i took a few pictures. Trying to post them here now in a hope they might help someone
Thanks, I too have a BATEmcu EvUSBasp. Following your instructions I flashed the latest firmware (usbasp.atmega8.2011-05-28.hex) using an Arduino Nano as ISP. I'm pretty sure flashing worked, it successfully verified "verifying flash memory against usbasp.atmega8.2011-05-28.hex: ... 4700 bytes of flash verified". However, I still get the message "warning: cannot set sck period. please check for usbasp firmware update." when using it... I'm not sure the firmware is actually the issue here...
Thank you for a most awesome guide:-). I had to swap pins 11 & 12, but I did have a copy Arduino Nano based on the 328P, with a CH340 USB interface. My ASP was exactly same as your BAITE one described here, and because if this @RussellA26 the direct connection will not work!
My ASP now takes 2 seconds to upload a HEX, whereas before it took a staggering 10 seconds to upload the same HEX, got to love 1.5MHz! Yip Yah!
Dear i have one question? If i burn the atmega8.hex file to atmega8 already bootloaded not programmed new ic using a programmer. if i make my own usbasp using this atmega8 it my work or not?

Thanks! I bought one of these with the old firmware and I needed to update it. Worked great.

I too had the build errors, but from looking at them I think it'd be fairly easy to fix -- there'd need to be a "const" added on the lines specified. I didn't bother, though, so I can't confirm that.

One tip: Once the Arduino-as-ISP is programmed (and not before!), you can plug the two ICSP headers together rather than worry about pin numbers on the Arduino side. The pins are broken out to that header, so if you have that 6-pin ICSP cable it makes it a lot easier.

Also, my board has a 3.3/5v header and a JP2 and JP3 (the latter two are not installed). For that case, JP2 seems to be the one to short for self-program.