Developing in C for the ATmega328P: Using Windows 10

7 minute read

Where I setup the Standard C tool chain (avr-gcc) for the ATmega328P on Windows 10.

If you are looking to install the AVR toolchain for C using Windows Subsystem for Linux, go here.

Sources

Background

Windows has two different operating environments, Windows (the Graphical User Interface or GUI) and the command line interface (CLI). The former is the typical method of using Windows, particularly when using applications such as Word, Excel and Powerpoint. The latter is used for program automation and Windows program development and it is typically entered by typing cmd in the Windows search bar. We’ll introduce a new and improved method, shortly.

We want to use the command line environment to develop C software for the Uno. Unfortunately, the GCC compiler for C while intended for use in a command line environment, the environment is expected to be Linux and not Windows CLI.

To resolve this issue we’ll do two things, we’ll install the Windows Terminal to interface with the CLI and a special set of applications that were compiled to run under Windows.

Start by testing with the Arduino IDE!

After performing these steps on multiple machines, I’ve found it best to install and test using the Arduino IDE before going forward with the installation instructions below. This will reduce the errors to something more manageable and having the Arduino IDE is handy for its Serial Monitor as well it provides an easy method to identify the serial port the Uno is connected.

If you haven’t installed the Arduino IDE, I would recommend installing from the Windows Store, it is the easiest process. Once installed, connect your Uno to your computer and compile and upload the blink sketch. Don’t continue until you’ve been successful, otherwise the remaining instructions will be far too difficult to complete.

Introduction

Microsoft has introduced a new application for interacting with the command line. The new application called Windows Terminal or Terminal will work with the Windows CLI environment, Azure Cloud environments and with Windows Subsystem for Linux.

Install Windows Terminal

Install the Windows Terminal application via the Windows Store. Be sure the version you install was developed by Microsoft. Once installed, you may open using the Open button in the Store or in subsequent uses, search for Terminal in the Windows Search bar and open it there. It might be helpful to pin to the Taskbar for future access.

When it is first opened, it will be in the Command prompt or CLI environment. This is the environment we’ll need to use, to develop code using the C tool chain for the Uno.

Terminal Opens in Windows Environment

Terminal Opens in Windows Environment

Large Version to see detail

Install the Tool Chain

Download the avr-gcc directory

We can’t use the Linux-based version of the tool chain, as it won’t run in the Windows CLI. We’ll need to download and install a special set of applications, which have been created specifically to run in Windows CLI.

Click on link to download avr-gcc-11.1.0-x64-windows.zip

Note: We use Zak Kemble’s pre-made AVR-GCC bundle, however, the latest version has some issues, so we are using version 11.1.

Install the avr-gcc directory

To install:

  1. Extract the contents of the zip file by right clicking on the file and select “Extract All…”.
  2. Have it to extract to the Downloads directory (current directory) by clicking Next.
  3. Open another Explorer window and in that window click on Local Disk (C:).
  4. Select the folder “Program Files(x86)” then drag and drop the “avr-gcc 12.10…” directory into the “Program Files(x86)” directory.
Drag Folder into Program Files(x86)

Drag Folder into Program Files(x86)

Large Version to see detail

Add Folder to Execution Path

Once we have it where we want to run it, we need to add that location to our execution path.

To do this, go to the Search bar and begin to enter environment, this will bring up the “Edit the System Environment Variables Control Panel” in the results window, click on it.

Search bar for environment

Search bar for environment

Large Version to see detail

This will open a window called System Properties, click on Environment Variables… at the bottom

Click on Environment Variables...

Click on Environment Variables...

Large Version to see detail

In the next window, select Path, in the top window and click on Edit… under the top window.

select Path...click on Edit...

select Path...click on Edit...

Large Version to see detail

In the Edit environment variable window,

  1. IMPORTANT! Click on New (If you don’t, you will lose the path to Windows Applications.)
  2. Click Browse.
    Click first on New then second on Browse

    Click first on New then second on Browse

    Large Version to see detail

Then broswe to the location where you stored avr-gcc…. As you can see from the image below:

  1. Click on This PC
  2. Click on Local Disk (C:)
  3. Click on Program Files(x86…)
  4. Click on avr-gcc…
  5. Select the bin directory
  6. Press OK.

Follow the numbers to select the correct folder

Follow the numbers to select the correct folder

Large Version to see detail

Please confirm your Path Environmental Variable looks like the image below, before you click on OK on each window which has opened to back out of the exercise.

Confirm this image!

Confirm this image!

Large Version to see detail

Confirm Installation

Open a Terminal window by typing Terminal in the Windows search bar and hitting return. In the Terminal window, enter the following commands. Type or copy/paste each command separately, pressing return after each one:

avr-gcc --version
make --version
git --version
avrdude

Confirm each component is installed

Confirm each component is installed

Large Version to see detail

The application avrdude will show more detail, however, on the last line of the printout, the version number needs to be 6.4 or 7.0.

Congratulations, you are now ready to code in C for the Arduino Uno! Let’s start!

Use the tool chain

Before you start, you might need one more application, a code editor. A code editor is similar to a word processor such as Microsoft Word, however, it provides important capabilities like text only (no special characters) and it will highlight the syntax of the code being written. A very popular and free version for Windows is Notepad++. I will use it for the following examples. I recommend you install Notepad++ or use one that is to your liking.

Test Code

You will want to select the code in the box below, copy it then you will paste it into Notepad++ editor window.

#include <avr/io.h>
#include <util/delay.h>
 
#define BLINK_DELAY_MS 100
 
int main (void)
{
 /* set pin 5 of PORTB for output*/
 DDRB |= _BV(DDB5);
 
 while(1) {
  /* set pin 5 high to turn led on */
  PORTB |= _BV(PORTB5);
  _delay_ms(BLINK_DELAY_MS);
 
  /* set pin 5 low to turn led off */
  PORTB &= ~_BV(PORTB5);
  _delay_ms(BLINK_DELAY_MS);
 }
}

Testing the Code

In this step, we’ll setup a specific folder for developing C. I called it test. We’ll add a file called main.c, the we’ll compile/link the file on to the Uno.

cd
mkdir test
cd test 
# copy the file from above and we'll call it main.c
start notepad++ main.c
# paste the contents above into the file and save it

Notes on the steps

  • I’m using Notepad++ as my editor to keep this simple, this will be a copy and paste from code above into a file on your system.
  • Using cd test will take you to the new folder test you just created.
  • start notepad++ main.c will open a file called main.c in the Notepad++ editor. The window will be empty as main.c is a new file. Once you paste the file into Notepad++, it will look like this:
    main.c in the Notepad++ editor

    main.c in the Notepad++ editor

Large Version to see detail

Enter the commands below to compile/link your file. I recommend using copy and paste, attempting to type them in by hand might be difficult. As we did with testing the versions of the software, copy each command and paste it into the Terminal window, then hit return. T

avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o main.o main.c
avr-gcc -mmcu=atmega328p main.o -o main
avr-objcopy -O ihex -R .eeprom main main.hex

Your window will now look similar to this, note that the compile, link and load operations won’t have output (unless you have errors.):

main.c in the Notepad++ editor

main.c in the Notepad++ editor

Large Version to see detail

Our last step is to load the main.hex file on to the Uno. We use averdude to upload code to the Uno. We’ll use the following command:

avrdude -F -V -c arduino -p ATMEGA328P -P COM3 -b 115200 -U flash:w:main.hex

Notice the “COM3”? You will want to change the “COM3” to the port name that you wrote down in the Arduino IDE port assignment in the earlier step. When you run the averdude command above successfully, you will see the following:

Successful averdude upload

Successful averdude upload

Large Version to see detail

AND your Uno will be blinking at a much faster rate!

If you see this instead:

Typical averdude failure

Typical averdude failure

Large Version to see detail

  • Is the Arduino IDE installed, have you tested it, and it worked?
  • Have you closed the Arduino IDE?
  • Are you sure you are using the right port? Double check the number using the Arduino IDE and make sure the port name matches the port name on your averdude command.

Next Steps

  1. Developing in C for the ATmega328P: Using Git

Comments powered by Talkyard.