Feel Good.

19 января 2015

Hello world для ATmega328 + avr-gcc + avrdude (USBasp)


Хочу поделиться своим опытом знакомства с микроконтроллером ATmega328. Но сначала небольшое отступление.
Наверное уже все читали или уж точно слышали про Arduino. На мой взгляд, Arduino хорошая платформа для ознакомления с миром микроконтроллеров. Низкий порог вхождения и богатый набор различных библиотек, несомненно, является ключевым достоинством этой платформы. Под словом платформа я понимаю само устройство и штатная IDE с набором библиотек. Но к сожалению, ради обеспечения низкого порога вхождения штатная IDE вынуждена многое делать неявно для программиста. Например, процесс компиляции и прошивки, или даже формирование конечного main-файла с подключением всех include. Именно эти неявные действия и создают пробелы в знаниях при изучении платформы.
Итак, наши цели:
  1. Написать программку на чистом C, которая будет мигать светодиодом (aka "Hello world!" только для МК)
  2. Собрать прошивку для МК
  3. Настроить fuses bits нашего МК
  4. Прошить МК
Естественно все действия постараемся проделать из-под консоли.


Начнем с железной части.
  1. МК ATmega328 (тот самый, что используется и в Arduino)
  2. Кварц на 16Mhz и два конденсатора на 22пФ
  3. Светодиод
  4. Резисторы 1кОм и 10кОм
  5. Программатор USBasp (как устройство)
  6. Источник питания на 5В.
Все это необходимо будет подключить по схеме:

Подготовка программной среды.
  1. Компилятор avr-gcc
  2. Программатор avrdude (как софт)
Для ОС Windows все придется скачать и установить самому руками.
Для ОС Ubuntu процесс намного проще:
sudo apt-get install gcc-avr avr-libc binutils-avr
sudo apt-get install avrdude

Весь наш код будет состоять из одного main.c файла:
Теперь необходимо собрать нашу программу:
avr-gcc -Wall -Os -mmcu=atmega328p main.c -o main.o

После чего необходимо подготовить HEX-образ для загрузки его в МК:
avr-objcopy -j .text -j .data -O ihex main.o main.hex

Перед тем как загрузить HEX-образ, МК необходимо настроить, делается это выставлением fuse bits. Установка fuse bits одна из самых ответственных частей. Собственно при неправильных настройках можно случайно заблокировать свой МК, так что будьте особо внимательны! К счастью, выставление fuse bits редкая операция, и требуется обычно лишь один раз.
Для подбора значений fuse bits я воспользовался калькулятором. Для нашего случая команда конфигурации выглядит так (16Мгц должно хватить, чтобы помигать светодиодом :)):
avrdude -c usbasp -p atmega328p -U lfuse:w:0xff:m -U hfuse:w:0xda:m -U efuse:w:0x05:m

Собственно загрузка HEX-образа в МК:
avrdude -p atmega328p -c usbasp -U flash:w:main.hex:i

Если все шаги были пройдены успешно, то после включения МК мы увидим мигающий светодиод.

 
PS: Код проекта выложил на github, в который включил makefile для удобства сборки и прошивки.
Советую обратить внимание на команду:
avr-objdump -h -S main.o > main.lss

2 комментария: