Sunday 26 August 2012

Burning hex files using USBasp

AVRDude is excellent program for burning hex code into microcontroller. USBasp is awesome USB based programmer for the AVR. In this tutorial we will see how to use AVRdude for burning hex files into AVR microcontroller using USBasp.
AVRdude is not readily available for windows installation. Windows version of AVRdude is bundled with WinAVR compiler. Before we start : Download WinAVR from here.

Introduction:
In order to program any microcontroller you need the .HEX file. It is nothing but the machine code for the microcontroller. This file is generated by the corresponding assembler software, which converts assembly code into machine code. Assembly can be  produced by third party cross compiler software or can be handwritten.

After you finish the installation of WinAVR, AVRdude executables can be found at :
<WinAVR Installation Directory>\bin
Complete documentation of AVRdude can be found at:
<WinAVR Installation Directory>\doc\avrdude\avrdude.pdf


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 :)
- Open the command prompt. (Press WinKey + R. Run dialogbox will appear. Type cmd and press enter.)

- Navigate to the directory where .hex file is located. For example :
> cd D:\mega16_kitCD\sample code\ex01_simple_input_output\Exe
> d:



- To burn the hex file enter following command. Consider for example name of my hex file is io.hex :
> 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 :
- Open notepad
- Type our avrdude command. i.e. copy paste following line into notepad.
avrdude –c usbasp –p m16 –u –U flash:w:io.hex
- Save the file with filename “burn.bat” and put it into the directory, which has the hex file.
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:
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

No comments:

Comments System