- ATmega. Прошивка ATmega через USBasp и avrdude
- Задача
- Решение
- Подготовка окружения
- Подключение оборудования
- Написание кода
- Компиляция кода
- Загрузка прошивки в МК
- Изменение FUSE-битов
- ATmega. Прошивка ATmega через USBasp и Arduino IDE
- Задача
- Для реализации потребуется
- Реализация
- Прошиваем Arduino программатором USBASP
- Start with a new Atmega328 project
- Let’s start
- Program atmega328 using usbasp programmer
ATmega. Прошивка ATmega через USBasp и avrdude
Ранее производил прошивку МК средствами Arduino IDE, на эту тему есть отдельная статья Прошивка ATmega через USBasp и Arduino IDE. Время идет, пора переходить на более тонкие инструменты, в частности C и avrdude. Программируем, собираем, прошиваем.
Задача
Тестовую программу мигания светодиодом на C, скомпилировать в файл прошивки и загрузить результат в МК ATmega 328 P.
Решение
Разработку, прошивку и дальнейшее описание буду вести на Debian 9, но все необходимые компоненты есть и под Windows.
Подготовка окружения
Первым делом подготовим окружение, как писал выше: разработка на C, компиляция прошивки средствами avr-gcc, загрузка прошивки средствами avrdude, через программатор USBasp.
Для установки необходимого собрал следующий набор:
# apt-get install avr-libc gcc-avr binutils-avr avrdude
В Debian драйвера для USBasp устанавливать не надо, они есть в составе ядра. Для Windows необходимо скачать и установить драйвер с сайта разработчика fischl.de.
Подключение оборудования
На данном этапе не должно вызвать вопросов, но для порядка опишу подключение. Подключаем микроконтроллер к программатору USBasp: выводы SCK, MISO, MOSI, RESET, VCC. Так же не забываем к выходу D0 через резистор 220 Ом подключить анод светодиода, катод к GND.
Написание кода
На данный момент нет разницы в чем будет написан код, для себя выбрал Atom. Создаем файл с расширением .c, например main.c, в котором напишем код мигания светодиодом:
#define F_CPU 16000000UL // Частота работы МК от внешнего кварца #include #include void main() < DDRD = 0xFF; // Все выводы порта D как выход PORTD = 0x00; // На всех выводах установим 0 while (1) < PORTD |= (1 >
Первой строкой явно указываю частоту с которой должен работать МК, т.к. у меня подключен внешний кварцевый резонатор на 16 МГц. Остальное ясно из комментариев.
Компиляция кода
Для компиляции будем пользоваться двумя командами(полного описания команд и их ключей приводить не буду, ибо каждая из них повод для отдельных статей и они легко находятся в интернете):
avr-gcc — производит компиляцию C в объектный файл.
К данной команде используем ключи:
- -mmcu для указания типа МК, в данном случае ATmega 328P;
- -DF_CPU для указания частоты с которой работает МК.
avr-gcc -g -Os -mmcu=atmega328p -DF_CPU=16000000UL main.c -o main.o
После выполнения команды в каталоге появится файл main.o
avr-objcopy — производит преобразование объектного файла в hex.
avr-objcopy -O ihex main.o main.hex
После выполнения команды в каталоге появится файл main.hex. Файл прошивки готов, необходимо загрузить его на МК.
Ссылки ни на какие статьи не привожу, т.к. просмотренные не содержат полного описания, только отрывочные сведения.
Загрузка прошивки в МК
. Внимание Настоятельно рекомендую перед выполнением команды avrdude ознакомиться с описанием ключей и все операции производить только после проверки написанного, во избежание окиричивания МК. Все дальнейшие расчеты на свой страх и риск!
Воспользуемся утилитой avrdude, к данной команде используем ключи:
- -c для указания программатора, в данном случае USBasp;
- -p для указания типа МК, в данном случае ATmega 328P;
- -U ключ для указания с каким типом памяти мы работаем, что именно делаем, и указываем файл источник/приемник. В данном случает производится запись во flas-память МК из файла main.hex.
Мне понравилось описание ключей и примеров на сайте ph0en1x.net.
avrdude -c usbasp -p atmega328p -U flash:w:main.hex
После выполнения команды МК оживает и начинает выполнять заложенные в код алгоритмы.
Изменение FUSE-битов
. Внимание Настоятельно рекомендую перед выполнением команды avrdude ознакомиться с описанием ключей и все операции производить только после проверки написанного, во избежание окиричивания МК. Все дальнейшие расчеты на свой страх и риск!
Но не все так гладко. В коде между включением и выключением указана задержка в 1 секунду, а на практике светодиод горит более 10 секунд. Вооружился секундомером, замер показал 16 секунд. Получается МК работает на частоте 1 МГц, вместо 16 МГц.
Чтение документации показало, что необходимо МК указать на какой частоте он должен работать при подключении внешнего кварцевого резонатора. Для ATmega 328P указывается 3 байтами: lock, lfuse, hfuse.
Для расчета значений этих байтов есть калькуляторы фьюзов, обязательно необходимо проверить получившиеся значения с документацией! Для себя собрал следующую команду:
avrdude -c usbasp -p atmega328p -U lock:w:0xFF:m -U lfuse:w:0xFF:m -U hfuse:w:0xD9:m
После выполнения команды МК начал работать на положенной ему частоте.
ATmega. Прошивка ATmega через USBasp и Arduino IDE
Как и обещал в статье Переходник ATmega TQFP в DIP описываю пример прошивки МК ATmega через USBasp и Arduino IDE.
Задача
На МК ATmega (в частности ATmega 328P-PU) загрузить прошивку средствами USBasp программатора и Arduino IDE, и продемонстрировать ее работу.
Для реализации потребуется
- МК ATmega;
- USBasp программатор. Заказывал на aliexpress.com, обошелся он порядка 90 рублей. В комплекте сам программатор и шнурок;
- Компьютер с установленным Arduino IDE;
- Отладочная плата;
- Соединительные провода;
- Резистор 220 Ом;
- Светодиод.
Реализация
Первым делом подключаем ATmega к USBasp программатору через выводы SCK, MISO, MOSI, RESET. Не забываем про питание ATmega, я использовал тот же программатор.
Для проверки работы подключим светодиод: к выходу SCK подключить резистор 220 Ом, к резистору подключаем анод светодиода, катод подключаем к выходу GND.
Раз уж это первый опыт прошивки МК, то будем использовать пример «Blink». Открываем Arduino IDE и переходим в меню «Файл — Примеры — 1.Basics — Blink».
Теперь необходимо указать IDE каким программатором мы пользуемся. Переходим в меню «Инструменты — Программатор» в появившемся списке выбираем пункт «USBasp».
Остается загрузить наш скетч на МК, переходим в меню «Скетч» и выбираем пункт «Загрузить через программатор» или нажимаем сочетание клавиш Ctrl + Shift + U. Наблюдаем за ходом проверки скетча, его заливки на МК и радуемся результату!
Теперь при подаче питания на МК будет выполняться загруженный на него скетч.
ВНИМАНИЕ. В ходе написания статьи ни одного МК не пострадало.
Прошиваем Arduino программатором USBASP
При замене чипа на arduino или при изготовлении самодельной Arduino часто возникает необходимость в прошивке чистого чипа Atmega328/168. У многих возникают с этим проблемы, опишу процесс по пунктам.
Для прошивки нам понадобится сама Arduino с распаянным / установленным чипом и программатор USBASP.
Из софта нужны будут следующие файлы:
Загрузчик (Bootloader) ATmegaBOOT_168_atmega328 (скачать)
Программа для прошивки и установки правильных fuse битов , я использую AVRDUDE_PROG, это таже AVRDUDE только с GUI интерфейсом. (скачать)
Теперь подключаемся к Arduino по IСSP.
Замыкаем JP3 на USBASP, так как частота нового контроллера слишком мала.
Открываем AVRDUDE_PROG, и сразу переключаемся на вкладку FUSES выставляем все как на картинке
В примере на картинке FUSES установленны для ARDUINO NANO 328!
Вот список для остальных контроллеров:
Фьюзы установленные по умолчанию в Arduino (только с ATmega328)
Arduino Uno
Low Fuse 0xFF
High Fuse 0xDE
Extended Fuse 0x05
Arduino Duemilanove or Nano w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05
Arduino BT w/ ATmega328
Low Fuse 0xFF
High Fuse 0xD8
Extended Fuse 0x05
LilyPad Arduino w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05
Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
Low Fuse 0xFF
High Fuse 0xDA
Extended Fuse 0x05
После прошивки FUSES прошиваем загрузчик.
Start with a new Atmega328 project
Every time I need to create something with the famous atmega328p (the chip on every arduino), I’m doing those follow steps I decided to share.
Let’s start
To prepare a board for a generic atmega328 project, we need:
This could seems a very minimal installation but the atmega328 could also run without an external oscillator, but it’s really better to have one (we avoid a lot of issues while programming and debugging). I’ll show you some project that doesn’t need the crystal in next article.
Capacitors are not mandatory neither (with crystal, without crystal there’s not need at all for them) but better to follow specifications. I’ve some project running without them but only the crystal without any issues.
Ok… The pins we are going to wire the oscillator are the 9 and 10, while caps are between GND (pin 8) and above pins. Pretty easy no?
I’m using the common usbasp programmer to talk with the atmega, you can find it on ebay for 4$ (or less).
Beginning to play is easy as wiring our usbasp programmer to the chip. The pinout for wiring is easy to found on the web, my usbasp as the ISP10 pin socket so let’s prepare the female part for convenience on our board with the information we found:
Looking at atmega pinmapping we easily found how to connect the ISP header to our atmega:
Program atmega328 using usbasp programmer
We are going to use the Arduino IDE to talk with t he chip, to achieve that we need to explain the IDE how to use the usbasp instead of using the default arduino programmer.
In order to do this, open Arduino IDE and select USBasp in Tools > Programmer menu. If it’s not present, you need to add follow lines in programmers.txt in your sketchbook/hardware folder (close Arduino IDE before doing this):
usbasp.name=USBaspusbasp.communication=usbusbasp.protocol=usbasp
Let’s test our setup with the blink sketch (File > Example > Basic > Blink) uploading the code through the usbasp programmer (File > Upload with programmer) or pressing Shift and click on Upload icon! Do not forget to add a led on correct pin:
After upload you should see the led blink once a second.