Programming AVR with Eclipse and WinAVR

This is a log of what I have done to get Eclipse running with WinAVR on Windows XP. Maybe it’s helpfull for others.
Prerequisites

  • Download a Java Runtime JRE or JDK, if you do not have already. Anything greater 1.4.2 should be ok.
  • Download Eclipse 3.2.2 here
  • Download the CDT 3.1.2 plugin for Eclipse C/C++ development here
  • Download WinAVR 20070525 here


Install WinAVR

Start the executable and choose a directory to install to. Mine goes to c:winavr-20070525.

Install Eclipse

Extract the downloaded zip into a directory, e.g. c:Programmeeclipse. Eclipse is now already working. You may want to create a desktop shortcut for the executable.

Install CDT

Extract the zip into a tmp directory. Then select the contents of the features and plugins folder and copy them to the respective folders beneath the eclipse folder.

Startup

  • Open eclipse. It will ask for a workspace folder. If you are new to eclipse, choose a folder, where you would like to put your source code.
  • It starts with the Java perspective, but we want C/C++. Select “Open Perspective” from the upper right corner. Then select “Other”. Then select “C/C++”. Your screen should now show the perspective for C development.

Start a Project

  • Now select “File/New” of the menu. Then select “Managed make C project”. This creates a project with automated make. You do not have to take care of the makefile yourself.
  • Enter “test” as project name and select “next”.
  • Select “executable (gnu on windows)” as Project type. We will change this later.
  • “Debug” and “Release” are ok as targets. Release only is also ok.
  • Select “finish”.
  • Ignore the warning for now that appears in the problems tab.

Configuration

Now we have to configure the settings for the WinAVR compiler and linker.

  • Select “Project -> properties”. If “properties” are greyed out, then click on the project folder “test” to select it. Now the “properties” menu should be selectable.
  • Select “C/C++ Build” on the left list.
  • Select “Release” as configuration. We will change this target only. If you want to configure the “Debug” target as well, then go through these steps again.
  • Select the “GCC C Compiler” in the tree below.
  • Change “gcc” to “avr-gcc”
  • Select “symbols” and enter a new symbol for the speed of your board, e.g. “F_CPU=4096000″.
  • Select “Directories” and add “C:WinAVR-20070525avrinclude” to the includes.
  • Select “Miscellaneous” and enter your type of controller, e.g. “-mmcu=atmega8″.
  • Select “GCC C Linker” and change “gcc” to “avr-gcc”.
  • Select the tab “Build Steps”.
  • To convert the executable into a hex file, we use a post build step. Enter “Post-build step” as
    "avr-objcopy -j .text -j .data -O ihex test.exe test.hex".
  • Select “ok” to close the properties dialog.

Testing the Configuration

  • Right-click on your project folder and select “New -> Source File”
  • Enter “test.c”. Now write a small test program.
    
    /*
     * test.c
     */
    #include <util/delay.h>
    #include <avr/io.h>
    #define LED PD4
    
    int main(void) {
      // define pd4 as output
      DDRD |= (1 << LED);
    
      while (1) {
        PORTD |= (1 << LED);    // switch on
        _delay_ms(100);
        _delay_ms(100);
        PORTD &= ~(1 << LED);    // switch off
        _delay_ms(100);
        _delay_ms(100);
      }
    return 0;
    }
  • Saving triggers an automated build run. The console output should look like this:
    **** Build of configuration Release for project test ****
    make -k all
    
    Building file: ../test.c
    Invoking: GCC C Compiler
    
    avr-gcc -DF_CPU=4096000 -I"C:WinAVR-20070525avrinclude" -O3 -Wall -c
    -fmessage-length=0 -mmcu=atmega8 -MMD -MP -MF"test.d" -MT"test.d" -o"test.o" "../test.c"
    Finished building: ../test.c
    
    Building target: test.exe
    
    Invoking: GCC C Linker
    avr-gcc  -o"test.exe"  ./test.o
    Finished building target: test.exemake --no-print-directory post-build
    
    avr-objcopy -j .text -j .data -O ihex test.exe test.hex
    
    Build complete for project test
  • Now open up a command line in your project folder. Create a batch file “flash.bat” to transfer the hex file to your controller. This depends on your controller, programmer, etc. Mine looks like this:
    c:winavrbinavrdude -v -F -p ATmega8 -c avr910 -P com4 -U flash:w:%1:i. The -F switch is in the to force writing, even if the device signature is not recognized. Its just reversed. Omit it if you have no problems with that.
  • Now start the batch file to program your controller.
    C:dataavrtest>flash Releasetest.hex
    C:dataavrtest>c:winavrbinavrdude -v -F -p ATmega8 -c avr910 -P com4 -U flash:w:Releasetest.hex:i
    
    avrdude: Version 5.1cvs
    
             Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
    
    System wide configuration file is "c:winavrbinavrdude.conf"
    
    Using Port            : com4
             Using Programmer      : avr910
             AVR Part              : ATMEGA8
             Chip Erase delay      : 10000 us
             PAGEL                 : PD7
             BS2                   : PC2
             RESET disposition     : dedicated
             RETRY pulse           : SCK
             serial program mode   : yes
             parallel program mode : yes
             Timeout               : 200
             StabDelay             : 100
             CmdexeDelay           : 25
             SyncLoops             : 32
             ByteDelay             : 0
             PollIndex             : 3
             PollValue             : 0x53
             Memory Detail         :
    
    Block Poll               Page
          Polled
               Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  Max
    W   ReadBack
               ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ---
    -- ---------
               eeprom         4    10   128    0 no        512    0      0  9000  90
    00 0xff 0xff
               flash         33     6    64    0 yes      8192   64    128  4500  45
    00 0xff 0x00
               lfuse          0     0     0    0 no          1    0      0  2000  20
    00 0x00 0x00
               hfuse          0     0     0    0 no          1    0      0  2000  20
    00 0x00 0x00
               lock           0     0     0    0 no          1    0      0  2000  20
    00 0x00 0x00
               calibration    0     0     0    0 no          4    0      0     0
     0 0x00 0x00
               signature      0     0     0    0 no          3    0      0     0
     0 0x00 0x00
    Programmer Type : avr910
             Description     : Atmel Low Cost Serial Programmer
    Found programmer: Id = "AVR ISP"; type = S
        Software Version = 2.3; Hardware Version = 2.0
    Programmer supports auto addr increment.
    Programmer supports the following devices:
        Device code: 0x1c = (unknown)
        Device code: 0x55 = ATtiny12
        Device code: 0x01 = ATtiny13
        Device code: 0x56 = ATtiny15
        Device code: 0x13 = AT90S1200
        Device code: 0x28 = AT90S4414
        Device code: 0x20 = ATtiny84
        Device code: 0x4c = AT90S2343
        Device code: 0x30 = AT90S4433
        Device code: 0x6c = AT90S4434
        Device code: 0x38 = AT90S8515
        Device code: 0x68 = AT90S8535
        Device code: 0x41 = ATMEGA103
        Device code: 0x46 = (unknown)
        Device code: 0x44 = (unknown)
        Device code: 0x03 = (unknown)
        Device code: 0x75 = ATMEGA6490
        Device code: 0x74 = ATMEGA6450
        Device code: 0x63 = (unknown)
        Device code: 0x64 = ATMEGA163
        Device code: 0x79 = (unknown)
        Device code: 0x14 = (unknown)
        Device code: 0x15 = (unknown)
        Device code: 0x16 = (unknown)
        Device code: 0x17 = (unknown)
        Device code: 0x72 = ATMEGA32
        Device code: 0x60 = ATMEGA161
        Device code: 0x76 = ATMEGA8
        Device code: 0x77 = (unknown)
        Device code: 0x3b = (unknown)
        Device code: 0x6a = (unknown)
        Device code: 0x5e = ATTINY26
        Device code: 0x29 = (unknown)
        Device code: 0x2a = (unknown)
        Device code: 0x2b = (unknown)
        Device code: 0x06 = (unknown)
        Device code: 0x07 = (unknown)
        Device code: 0x08 = (unknown)
        Device code: 0x21 = (unknown)
        Device code: 0x09 = (unknown)
        Device code: 0x0a = (unknown)
        Device code: 0x22 = (unknown)
        Device code: 0x23 = (unknown)
        Device code: 0x24 = (unknown)
        Device code: 0x0b = (unknown)
        Device code: 0x0c = (unknown)
        Device code: 0x0d = (unknown)
        Device code: 0x18 = (unknown)
        Device code: 0x19 = (unknown)
        Device code: 0x25 = (unknown)
        Device code: 0x26 = (unknown)
        Device code: 0x27 = (unknown)
        Device code: 0x1a = (unknown)
        Device code: 0x1b = (unknown)
        Device code: 0x4b = (unknown)
        Device code: 0x4d = (unknown)
        Device code: 0x4e = (unknown)
        Device code: 0x4f = (unknown)
    
    avrdude: AVR device initialized and ready to accept instructions
    
    Reading | ################################################## | 100% 0.06s
    
    avrdude: Device signature = 0x07931e
    
    avrdude: Expected signature for ATMEGA8 is 1E 93 07
    
    avrdude: safemode: lfuse reads as FF
    avrdude: safemode: hfuse reads as D9
    
    avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
    
    To disable this feature, specify the -D option.
    
    avrdude: erasing chip
    
    avrdude: reading input file "Releasetest.hex"
    avrdude: writing flash (122 bytes):
    Writing | ################################################## | 100% 0.53s
    
    avrdude: 122 bytes of flash written
    
    avrdude: verifying flash memory against Releasetest.hex:
    avrdude: load data flash data from input file Releasetest.hex:
    avrdude: input file Releasetest.hex contains 122 bytes
    avrdude: reading on-chip flash data:
    Reading | ################################################## | 100% 0.25s
    
    avrdude: verifying ...
    avrdude: 122 bytes of flash verified
    avrdude: safemode: lfuse reads as FF
    avrdude: safemode: hfuse reads as D9
    avrdude: safemode: Fuses OK
    
    avrdude done.  Thank you.
    
    C:dataavrtest>
  • If all went well and you see an LED flashing, congratulations, you did it.

Notes

If you look closely at the steps where I program the controller, you will notice, that I do not use the avr-dude that came with the last WinAVR release. I tried it, but it refused to work, always complaining about not beeing able to verify the fuses. I went on with my old avr-dude which worked perfect.

17 thoughts on “Programming AVR with Eclipse and WinAVR

  1. Alex, thanks for taking the time to create this helpful log. I was able to successfully get your example to compile. I am trying a slightly more complex application that have built many times in the past. The one question I have that you might have some insight into is:

    My project uses a series of files located in the source trees “/lib” directory which all have a “.a” extension. I was wondering how to include these into eclipse. I was guessing that I add them to the “Libraries (-l)” area in the “Libraries” section of the “CGG C Linker” setting in the “Tool Settings” tab of the “C/C++ Build” properties. Is that correct?

    “C/C++ Build/Tool Settings/ GCC C Linker/Libaries/Libaries (-l)”

    Any hints?

    Thanks again for taking the time to help.

    Richard

    Like

  2. Pingback: Doug Daniels Dev Journal » links for 2007-06-07

  3. Thx for nice tutorial…

    I gave eclipse a serious effort, but sometimes i responds slow or worse freeze. ( A lot of nice stuff but very vital functions works slow or unreliable )

    Then I tried CodeBlocks, http://www.codeblocks.org

    In less then 1 hour I had everything working RockSolid compared to eclipse ( Reading the link below ). And better than CodeVision !!!

    http://www.frozeneskimo.com/electronics/arm-tutorials/adapting-codeblocks-ide-for-arm-development/

    Thanks a lot for very interesting blog Alex !! I will keep an eye on your gps solution.

    /DarkWing

    Like

  4. Alex, thanks for taking the time to post this. Quick question, do you know how to set up avrdude to work in a more “integrated” fashion with eclipse? (e.g., associate it with some kind of button or something… and take in the parameters configured for the project for cpu type, target, etc.) ? Thanks much!

    (I’m working on a Mac but…should be more or less the same… FWIW I did a writeup for setting up the AVR tools on Mac here if anyone is looking: http://bot-thoughts.blogspot.com/2008/02/avr-programming-on-mac.html)

    Thanks again!
    Michael

    Like

  5. Hi Alex!

    Thank you for this great tutorial!

    I’ve a question for you,…
    Are you able to do the same tutorial but for ecplise 3.3 ?
    I really do not find the location of the eclipse3.2 propriety in the 3.3!

    Like

  6. Thank you for tha answer, I find out the 3.3 plugin “Avr plugin” …. now it seems to work properly!

    Thanks again!

    Like

  7. I just tried AVR plugin version 2.2. Following steps are now already handled by the plugin: “gcc” to “avr-gcc”, setting F_CPU, adding “avr/include” and setting -mmcu

    The only thing that remains is to add avr-objcopy to post-build steps (unless your programer tool can handle ELF files).

    Like

  8. Hello,
    I am able to run Eclipse and compile my code for Atmega8. Can you help me with the programmer part as to where I can get the hardware and binaries to program

    Thanks,
    Vineet.

    Like

  9. Hi Alex!

    I follow the steps just like you describe but when I try to compile my program occurs this error:

    “multiple target patterns. Stop.”

    Do you have any idea about what happening?

    Thanks

    Jordan

    Like

  10. Hi Alex,
    thanks for this tutorial. However, in AVR/Target Hardware, my MCU is not recognized (none of them are). And I cannot edit a configuration in AVR/AVRDude/Programmer. Do you know why Eclipse doesn’t see the config files for ATmega168?
    Cheers,
    Pierre-Jean

    Like

  11. Pingback: Eclipse IDE untuk pengembangan program Atmel AVR & Atmel 89S (Windows Linux Ubuntu) « Pikir dan Rasa

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s