Embedded Electronics Blog

AVRDude Tutorial : Burning hex files on Atmel AVR using USBasp and AVRdude

The AVRdude is excellent program for burning hex code into Atmel AVR microcontroller. USBasp is awesome USB based Atmel AVR programmer. In this tutorial we will see how to use AVRdude for burning hex files into AVR microcontroller using USBasp.

AVRdude is available for Windows and Linux installations. It can be downloaded from the avrdude’s download portal given below.

Introduction

In order to program AVR microcontroller you need the .HEX file. It is nothing but the machine code for the microcontroller. This file is generated by the AVR assembler, which converts assembly code into machine code. Assembly code can be  produced by third party C cross compiler software or can be handwritten. Typically everyone uses Atmel Studio, or Arduino environment to write programs in C language. After compiling, these tools generate .hex file as their output.

AVRdude executables for Windows (or tar archive for linux) can be found at:
All releases : http://download.savannah.gnu.org/releases/avrdude/ look for version 6.3
Windows exe : http://download.savannah.gnu.org/releases/avrdude/avrdude-6.3-mingw32.zip

Download and extract this executable in a suitable folder. I have personally used usbasp and avrdude on Windows 7 and Windows 10 platforms.

NOTE 1: Make sure the path for the avrdude’s folder is added to the PATH environment variable, otherwise “avrdude.exe” cannot be accessed fron any random directory on the command prompt. Refer to this page on how to add a path to PATH environment variable.

NOTE 2: When you connect your USBasp hardware to the Windows 10 machine, you will need to download and install the drivers for the same.

Connections

– Connect the USBasp to PC.
– Connect SPI programming pins of USBasp to the AVR microcontroller. Following figure shows sample schematic diagram, if you have different AVR, then connect MOSI,MISO, SCK, RESET and GND pins of that uC to corresponding pins of USBasp.

– Give +5V supply to the microcontroller.
VIMP: If you are burning a fresh microcontroller, close the Slow Serial Clock jumper of USBasp. Since many brand new microcontroller are factory programmed for internal 1MHz oscillator. USBasp uses very high speed serial clock for faster programming. Thus you will have to specifically tell USBasp to use slow serial clock. This setting is done by above mentioned jumper.

NOTE: If you have uC which has internal oscillator enabled and after the programming you are not planning to change its fuse bits back to external clock setting, then you can skip the crystal.

Executing AVRdude:

Fortunately AVRdude is command line tool, so that you can be very sure of what you are doing with your uC Or Unfortunately AVRdude is command line tool, so you will have to spend little time to get familiar with it 🙂

> cd D:\mega16_kitCD\sample code\ex01_simple_input_output\Exe
> d:

> set PATH=%PATH%;c:\avrdude_6_3\;
> avrdude –c usbasp –p m16 –u –U flash:w:io.hex

You should see something like this :

Thats all !!! It is as simple as that ! 🙂

Explanation for command

avrdude –c usbasp –p m16 –u –U flash:w:io.hex

-c : Indicates the programmer type. Since we are using the USBasp programmer, argument “usbasp” is mentioned.

-p : Processor. We are using ATmega16, hence “m16”. Note ATmega16 has two variants, one is “ATmega16L” (slow speed version) and “ATmega16” normal 16MHz version. However their device signature is same and hence you will have to use “m16” as parameter for both the AVRs. This applies to all AVRs having “L” variants.

-u : Disables the default behavior of reading out the fuses three times before programming, then verifying at the end of programming that the fuses have not changed. Always use this option. Many times it happens that we forget to switch on the AVR’s +5V power supply, then at the end of programming cycle, avrdude detects inconsistent fuses and tries to reprogram them. Since there is no power supply, fuses gets programmed incorrectly and entire microcontroller gets screwed up(means becomes useless). Thus always use this option.

-U  :  memtype:op:filename[:format]

Perform a memory operation. Multiple ‘-U’ options can be specified in order to operate on multiple memories on the same command-line invocation.

    memtype

The memtype field specifies the memory type to operate on.

calibration   One or more bytes of RC oscillator calibration data.
eeprom       The EEPROM of the device.
efuse         The extended fuse byte.
flash          The flash ROM of the device.
fuse           The fuse byte in devices that have only a single fuse byte.
hfuse          The high fuse byte.
lfuse           The low fuse byte.
lock            The lock byte.

   op

The op field specifies what operation to perform:

r        read the specified device memory and write to the specified file
w       read the specified file and write it to the specified device memory
v       read the specified device memory and the specified file and perform a verify operation

   filename

Specify the hex file name. If file is not in current directory specify file name with appropriate path.

   format

Format need not be specified, for hex files, avrdude will automatically detect the format.

The trick to do it quickly : The Batch file :

It is extremely boring to type such a long command every time you program the uC. Therefore to avoid this you can create something called as Batch file. It is a text file which contains series of commands which will be executed by dos command processor. To create batch file follow these steps :

Now whenever you recompile your program and want to burn it, simply double click on burn.bat. This will execute avrdude command that we have typed in it.

Possible errors and problems


1)couldn’t find usbasp:

found 5 busses
found 5 busses
avrdude: error: could not find USB device “USBasp” with vid=0x16c0 pid=0x5dc

This happens when USBasp is not connected or not recognized by the PC. Try to connect it to different USBport. Make sure that “Self programming” jumper of USBasp is open. Always disconnect AVR from USBasp, before plugging USBasp to the PC.

2)target does not answer

found 5 busses

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 check.

avrdude done.  Thank you.

Check the connections of USBasp with uC. Check the  power supply of the uC. Check whether you have connected the crystal and decoupling capacitors. If everything is fine and still you are getting this error, then it indicates that either ur uC is dead or its fuse bits have got screwed up.

I hope this post will help you to get started with AVRdude. Feedback is welcome.

Reference

Complete documentation of AVRdude can be found at:
http://download.savannah.gnu.org/releases/avrdude/avrdude-doc-6.3.pdf

#atmel-avr #avrdude #usbasp #burning #flashing #programming

Exit mobile version