§ Главный файл

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

#define BLINK_DELAY_MS 1000

int main (void)
{
    /* Установка пина 5 на PORTB как OUTPUT */
    DDRB |= _BV(DDB5);

    while(1) {

        // Включить пин 5 на высокий уровень (HIGH)
        PORTB |= _BV(PORTB5);

        // Задержка в миллисекундах
        _delay_ms(BLINK_DELAY_MS);

        // Выключить (LOW) пин 5, индикатор выключается
        PORTB &= ~_BV(PORTB5);
        _delay_ms(BLINK_DELAY_MS);
    }
}

§ makefile

all: main.o
	avr-gcc -mmcu=atmega328p main.o -o main
	avr-objcopy -O ihex -R .eeprom main main.hex
	avr-objdump -d main > main.lst

flash:
	avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:led.hex

main.o: main.c
	avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c main.c -o main.o

§ Принципы компиляции

# Компиляция
avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o main.o main.c

# Сборка
avr-gcc -mmcu=atmega328p main.o -o main

# Создание HEX-файла
avr-objcopy -O ihex -R .eeprom main main.hex

# Загрузка на плату
avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:main.hex

# Листинг кодов
avr-objdump -d main > main.lst