Part IV – The “Hello World” project

Now you have the basic hardware tools, its time to setup the software environment.The main software you will need are:

After downloading them install them in your computer. It is better to install WinAVR in root of a drive like c:\winavr or d:\winavr. Also please install WinAVR first then AVR Studio, this will let AVR Studio detect the compiler. Now you are ready to write you first microcontroller program !!! In this tutorial, you will learn the basic steps required for any microcontrollers based project. We will write a basic “hello world” project, which is a simple LED blinker in MCU empire to demonstrate these basic steps.

Step I Entering and compiling code.

Start “AVR Studio” from Start Menu->All programs->Atmel AVR Tools-> AVR Studio 4 You will be presented with a Project wizard as shown below.

AVR Studio Project Wizard

Fig – AVR Studio Project Wizard

Project Delails

Fig – Project Details

 
Select AVR GCC in Project type then enter a suitable project name say “hello” and select a location in you hard disk. Then click next. Make sure that “Create initial file” and “Create folder” option is checked.

Device Selection

Fig – Device Selection

 
In this dialog box select AVR Simulator in “Debug Platform” list and select the AVR MCU depending on the type of MCU installed on your development board, in Device list. Click finish. After that you will be presented with an Integrated Development Environment-IDE. As shown below.

AVR Studio main window

Fig – AVR Studio main window

 
This IDE will help you in editing, modifying, and compile source program. After a project is compiled it gives you a “.hex” file ready to burn to your MCU. The main parts of the window are
  • Project Area – displays all the files source and header in the current project. You can add and remove files by the context menu of different groups like “source file” , “header files” etc. Double click a file to open it in the editor.

  • Code Editor – Here you enter and edit the files.

  • Message Area – Here AVR Studio will show errors and warning generated by compile when it tries to compile a source file.
Now copy past or type the following code in the code editor.

#include <avr/io.h>
#include <util/delay.h>

void Wait()
{
   uint8_t i=0;
   for(;i<23;i++)
      _delay_loop_2(0);
}

void main()
{
   //Set PORTC0 as output

   DDRC=0b00000001;

   while(1)
   {
      //Set PC0=High(+5v)
      PORTC|=0b00000001;
      Wait();

      //Set PC0=Low(GND)
      PORTC&=0b11111110;
      Wait();
   }
}


If you don’t understand the program don’t worry, the next tutorial will teach you how to setup and use general purpose IO ports in AVR.

Go to Project->Configuration Options to bring the Project option dialog.

AVR Studio main window

Fig – Setting CPU frequency and compiler optimization

 
Enter the CPU frequency. If you are using xBoard™ or xBoard™ MINI enter 16Mhz i.e. 16000000. In addition, select optimization as -O2. Click ok. Now you have entered the code now time to compile and build the project. Press F7 or select Build->Build or click the toolbar button for Build active configuration. If the code is error free AVR studio will show you the following message.

AVR Studio Build Success

Fig – Message

 
“Build succeed with 1 warning. Don’t worry about the one warning it is due to the fact that ANSI standard suggest that return type of main() must be one, but for MCU platform there is no environment or operating system that will receive this returned value. So return type of main() is void. Now you have successfully compiled you first project, what you have got after compilation and build is “.hex file”. You can find it in a folder named “default” in you project folder. It has same name as you project, in this case “hello.hex”

Finding the hex file

Fig – Finding “hello.hex” file

 

Step II Programming the MCU with “hello.hex”.

Now its time to burn this hex file to your MCU. To know how to burn the hex file to you MCU refer to you programmers manual. You can use eXtreme electronics USB AVR Programmer to burn hex files to you mcu (see shop section). Detailed procedure is given in “programmer” folder in its support CD.

Programming Using PonyProg.

This is the programmer we made in the previous tutorial. Its use is simple. Start Ponyprog, you will get a screen similar to this.

pony prog avr programmer

Fig – Ponyprog main window.

 
First, you need some setup. Go to menu setup->interface setup and make setting like this.

pony prog avr programmer

Fig – Ponyprog Setup

 
Select the serial port in which your programmer is connected. Beware there may be more that 1 available com port showing there and usually only one is available outside the PC the rest are internal and may be connected to your modem. So make sure you have selected a port that is connected to your programmer and not to your modem. Next, go to set up->calibration. Now you are done. Connect the programmer you have made to you PCs serial port and connect its ISP connector to the target you have made. Switch on the target. The software is self explanatory with easy to use GUI in the top tool bar there is a selection for type of chip you want to program. Select “AVR Micro” and select the type of Micro( like ATmega8) in box next to it.
  1. Select the hex file you want to program using the File->Open Program(FLASH) file.
  2. Command->Erase.
  3. Command->Write Flash
  4. Command->Verify Program(FLASH)
  5. If every thing is correct, your MCU is programmed successfully.
  6. Disconnect programmer from the Target and switch it off.

Step III Electrical Connections.

This is a very simple project you don’t need any complicated connection.You may be using any of our development boards like xBoard™, xBoard™ MINI or simpler xCards™. You just need to figure out where is the MCU ports (which is programmed to blink LED, in this case PORT C’S 0TH BIT) connector on the board. They are clearly marked in the boards. After finding it, connect the LED as follows to the MCU port .Or you can make your own target boards as explained in previous tutorials. I am not showing all the connection here because I have already shown in previous tutorials.

led blinking with avr and gcc

Fig – Connecting a LED.

The VCC (5v) required is also available in the board and marked as “spare 5V” or something like that. After all connections connect power supply (make sure the polarity is correct) to the board and switch on. The power indicator LED of board should glow and the LED connected to the MCU’s port should blink on and off. Now you can relax and enjoy than light blinking with all that modern sophisticated technology behind it and you first dedicated embedded program doing all the magic.

Now go on with your imagination tweak the program, modify delay and switching logic to get interesting patterns blinking. The limit is your imagination.

 

Note

Note: For More information on using AVR studio see AVR GCC Plugin Help in the Help Menu

Download PDF version | Get Adobe Reader Free !!!

What’s next

Next we will learn about the GPIO ports, i.e. the General Purpose IO ports. They are the most fundamental type of interface between MCU and real world.

Facing problem with your embedded, electronics or robotics project? We are here to help!
Post a help request.

Avinash

Avinash Gupta is solely focused on free and high quality tutorial to make learning embedded system fun !

More Posts - Website

Follow Me:
FacebookLinkedInGoogle Plus

32 thoughts on “Part IV – The “Hello World” project

  • Pingback: Using IR remote with AVR MCUs - Part II | eXtreme Electronics

  • Pingback: AVR Project – Relay Timer with ATmega8 AVR MCU | eXtreme Electronics

  • Pingback: Sound Generation by AVR Micro - Tutorial I | eXtreme Electronics

  • By Mahmudur - Reply

    hi there,
    i am new in AVR programming… these tutorials are really helping me a lot to understand the basics of AVR.

    well, lets come to the point, in the above program “uint8_t” is used for the data type of variable “i”. as i said before, i am novice, so can you please explain what is the difference between a regular data type and “uint8_t” or “uint16_t”

    thank you

  • Pingback: Interfacing MMA7260 Triple Axis Accelerometer with ATmega32 - AVR Tutorial | eXtreme Electronics

  • Pingback: Interfacing Graphical LCD with AVR MCU - Part II | eXtreme Electronics

  • Pingback: 4x3 4x4 Matrix Keypad Interface with Atmel AVR Microcontrollers | eXtreme Electronics

  • By Manu - Reply

    Hi Avinash,

    I need one info from you..
    If you have any idea about RF tx & rx which can support distance >200-500m.
    please let me know…
    Iam in urgent requirement of that for my new project.

    Thanking in anticipation.

    Regards,
    Manu

  • Pingback: Handling Text and Fonts in ProGFX | eXtreme Electronics

  • By Mathilde Roatch - Reply

    The publish is in reality the great on this worthy subject. I match in together with your conclusions and looking out ahead to your coming updates. Simply saying many thanks won’t simply be enough, for the fantastic readability inside your writing. I’ve grabbed your rss feed to remain knowledgeable of any updates. Gratifying work and much achievement in your corporation dealings!

  • Pingback: AVR Project – ATmega8 based RMP Meter | eXtreme Electronics

  • Pingback: Interfacing Ultrasonic Rangefinder with AVR MCUs | eXtreme Electronics

  • By Shahin - Reply

    Dear Mr. Avinash

    Your tutorials are really great.
    I am trying to install WinAVR and AVR studio as you mentioned in tutorial_4. but after installing winAVR-20100110-install, when i try to install AVR Studio4.13sp2 an warning message
    “AVR Studio 4.13 must be installed”
    is showing.
    Would you please suggest me what should I do?

    Shahin

  • Pingback: AVR Project – ATmega8 Based Smart Code Lock | eXtreme Electronics

  • By nikhil - Reply

    hi avinash i need your help urgently …my avr studio hangs on compling and shuts down… i tried reinstalling the software as also tryin an updated version but still the problem persists..

  • Pingback: Analog Clock on GLCD – Drawing the Face | eXtreme Electronics

  • By Abhishek - Reply

    How do I know what frequency value should I enter in the frequency box. It has to be different for different boards.

  • By vishnu - Reply

    hai avinash,

    AVR programmer was not available here .it will take days to get the programmer.so our professor gave us a circuit for programmer.we are soldering it now.can you tell me about fuse bit settings and how to do it.we are doing with a 12mhz frequency.what is the fuse bit settings for it and how will we set it.first we set separately one by one
    then avr became locked.2nd time we did it simultaneously then error was shown.can you help me please?

    • By Avinash - Reply

      @Vishnu,

      Why don’t you ask your “professor” who is guiding you. Coz he gets paid for that !

      I am not so educated.

  • Pingback: Using LCD Module with AVRs | eXtreme Electronics

  • By Srinivas - Reply

    Very good site of information and best priced goods.
    The writer should be thanked..

  • By Upendra - Reply

    Explained in very simple language with Microwave appliance.

  • By padmini krishna - Reply

    my elf file is not getting generated. what do i do?

  • By Uttam Dutta - Reply

    May I ask you a basic question, here no external crystal is used , means internal oscillator of microcontroller is used, what is the frequency of this oscillator, You write
    uint8_t i=0;
    for(;i<23;i++)
    _delay_loop_2(0);
    So how many millisecond or microsecond for number 23,how this number is related to internal frequency of microcontroller and desired delay time, how this calculation done
    Regards,
    Uttam Dutta

    • By Avinash - Reply

      _delay_loop_2(n);

      burns 4 CPU cycles for each n.

      For example n=1 will burn 4 CPU cycles.
      n=2 will burn 8 CPU cycles

      argument n is of type 16 bit unsigned integer.
      So it can be from 0 to 65535.

      since passing 0 to a delay function is useless so they made it to represent value 65536 (2^16)

      so _delay_loop_2(0); will burn 4 x 65536 = 262144 cycles.

      and for(;i<23;i++) will repeat this 23 times = 262144 = 6,029,312 cycles.

  • By Shahin Ansari - Reply

    Hi Avinash,
    Thanks for putting this content together. I am really new to embedded programming. My question is if AVR Studio and Atmel Studio are the same IDE.

    • By Avinash - Reply

      AVR Studio is now renamed as Atmel studio

  • By abhay - Reply

    hello i am working on digital voice recorder avr application note 335 i am using the vmlab and winavr gcc compiler but when i run the program it will give the error i got confused when i tried sample source code on atmega8 for led blink application it will run and hex file is generated i have USBisp programmer which support avrbascom extreme and avrdude but i want to use winavr gcc and avr dude to burn the same i surfed on net most people preffered avr studio 4 i have atmel studio 7 which will be the better solution plz guide me……ASAP

  • By Shahid Nadeem Burki - Reply

    Really great work. I tried and it works

  • By Akhil - Reply

    Hi Avinash

    I am not using an xboard. I connected the programmer directly to atmega8Apu using a breadboard. What frequency should I set. Moreover when I click the build it shows build started but its not proceeding further.

    Thanks in advance

  • By Petros - Reply

    Avinash
    so many thanks for these instructions. Any idea why your Wait() routine takes my AtMega8 about 5-6 seconds to execute on a 16MHz crystal? Based on bibliography for _delay_loop_2(0) and on your responses to other people’s comments that should work out to ~1/2 second intervals, for this particular tutorial, right? However my cct takes about 10 times that. Am I missing something here?

    My circuit is built on a breadboard, if that counts for anything, but the circuit is identical to your schematics (i.e. cap sizes etc.)
    Thanks

Leave a Reply

Your email address will not be published. Required fields are marked *


six + = 14

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>