Программирование avr микроконтроллеров linux

Программирование avr микроконтроллеров linux

Программирование AVR под Linux

Автор: ANALOG, pletnevroma@mail.ru
Опубликовано 07.08.2013
Создано при помощи КотоРед.

Предисловие:

Наверное каждый кто пишет программы под AVR микроконтроллеры и имеет на компе Linux задумывался о том чтобы писать именно на нем. И часто это оказывается не так просто. Проблема тут в отсутствии единого подхода. Каждый выкручивается как может. В отличии от Windows, где поставил AVRstudio и все готово. (конечно и под винду есть другие варианты, но статья не об этом). Лично для меня этот вопрос был одной из главных трудностей при переходе на Linux. И даже когда я уже по большей части сидел только на нем, все равно частенько приходилось загружать Windows чтоб запустить родную студию 🙂 Поэтому я решил написать статейку на эту тему. Надеюсь она снимет некоторые вопросы у желающих писать программки для AVR под линуксом. Статья ориентирована скорее на начинающих, поэтому все будет подробно разжевано, а все консольные команды с пояснениями. Используется дистрибутив Linux Ubuntu, но все прокатит и на любом другом.

Что нам для этого понадобится:

geany — прокачанный текстовый редактор с кучей вкусностей о которых ниже, в нем мы будем писать исходные коды.
avra или gcc-avr — компилятор для AVR, он превратит наш исходный код в прошивку для контроллера.
avrdude — крутой прошивальщик который поддерживает кучу разных программаторов и контроллеров, с его помощью будем заливать прошивку в контроллер.
Устанавливаем все это добро. Открываем терминал и вводим:

sudo apt-get install geany
sudo apt-get install avra
sudo apt-get install gcc-avr
sudo apt-get install avrdude

Возможно, некоторых программ не будет в стандартных репозиториях — тогда репозитории с ними нужно подключить, отредактировав файл /etc/apt/sources.list (после этого не забываем sudo apt-get update) или собрать из исходников. Короче, если что-то из этого на ваш дистрибутив не поставится — погуглите.

Теперь нам понадобится папка с аппноутами для каждого микроконтроллера. Можно взять из недр AVRstudio у кого она есть, но там в дефайнах используется символ ‘#’ на который ругается avra, так что во вложениях к статье есть архив с «хорошими» дефайнами. В эту же папку я кладу свои файлики с макросами которые я использую. Когда все это есть можно уже в принципе приступать к написанию кода. У меня в домашней директории есть папка Projects, а в ней папка AVR, в которой у меня лежит папка APPNOTES а так же все проекты (каждый в отдельной папке).
Таким образом путь, скажем, к дефайну для ATmega8

/Projects/AVR/APPNOTES/m8def.inc
А к исходному коду проекта Example

/Projects/AVR/Example/Example.asm
Все дальнейшее в статье будет изложено исходя из такой структуры, хотя от этого мало что зависит и не составит труда адаптировать все это дело к другой системе.
Пишу я все на ассемблере, но опять же, не составит труда проделать то же самое на С, просто надо использовать gcc-avr вместо avra.

Итак, приступим:

1. Создаем в Geany файл Example.asm с исходным кодом

2. Компилируем его с помощью avra:
avra —includepath

/Projects/AVR/APPNOTES Example.asm
Опция —includepath указывает путь к папке, из которой будут браться все инклуды по умолчанию.
Т.е. в коде подключение файла с дефайнами будет выглядеть как .include «tn2313def.inc»
Примечательно, что в справке к avra эта опция значится как —includedir, но если так и ввести, то сама же avra начинает на это ругаться 🙂 так что пишем именно —includepath
Если в коде будут встречены ошибки, avra напишет нам об этом в консольку, с указанием номеров строк с ошибками. Если компиляция прошла успешно, то мы получим файлик Example.hex который нам и назо залить в контроллер.

3. прошиваем контроллер через avrdude
sudo avrdude -p t2313 -c usbasp -U flash:w:Example.hex
Опции:
-p указывем тип контроллера
-c — используемый программатор
-U указывает файл, с которым будет работать прошивальщик
Модификаторы flash:w: определяют каким образом будет использоваться указанный файл. В данном случае — запись во флеш.

Все, в принципе тут можно и остановиться, но ведь это неудобно до жути — каждый раз руками лапами вбивать всю эту лабуду в консоль. Да еще и в голове держать синтаксис команд, а она-то не резиновая. Вот тут то и настало время «вкусностей» Geany, из-за которых мы именно его и выбрали. Geany задуман как редактор именно для программистов, поэтому в нем есть три абстрактных действия с файлами: компиляция, сборка и запуск. При этом пользователь может сам определить какие команды должны выполняться в этих действиях.
Таким образом, мы получаем возможность повесить запуск avra на действие «компиляция» (или gcc-avr если вы пишете на С) а на «запуск» — avrdude. Еще останется свободным «сборка».
Запускаем наш редактор, открываем файл с исходником и жмем Сборка — Установить комманды сборки.
Видим вот такое окошко:

Читайте также:  Linux создать временный файл

В поля «Скомпилировать» и «Выполнить» (на скрине подсвечено оранжевеньким) вводим соответственно команды для компиляции и прошивки в кристалл программы.
Все замечательно, но как указать имя файла если мы заранее его не знаем? Тут на помощь приходят 4 шаблона, которые Geany подставляет в команды в процессе их выполнения:
%f — имя текущего файла (в данном случае это Example.asm)
%e — имя текущего файла без расширения (Example)
%d — путь к папке, в которой лежит текущий файл (

/Projects/AVR/Example/)
%p — путь к текущему проекту (я так и не разобрался что это значит, но не важно :))
Так что команда для компиляции будет выглядеть так:

avra —includepath

sudo avrdude -p t2313 -c usbasp -U flash:w:%e.hex

Теперь для того чтобы программа скомпилировалась достаточно нажать F8 (или кнопочку с треугольником и кружочком в самом верху), а чтобы прошилась в контроллер — F5 (или кнопочку с шестеренками).

Так гораздо удобнее, но все еще не идеально — avrdude требует запуска через sudo, поэтому нужно каждый раз вводить пароль при прошивке. Для устранения этой досадной несправедливости откроем терминал и введем:

sudo chmod +s /usr/bin/avrdude

Этим мы открываем права на запуск avrdude. Теперь можно запускать avrdude без sudo:

avrdude -p t2313 -c usbasp -U flash:w:%e.hex

Но и теперь процесс не полностью автоматизирован — если мы вдруг решили написать прогу для другого контроллера, то по прежнему нужно лезть в настройки и менять опцию -p у avrdude. Как заставить Geany самому распознавать контроллер? А например по строчке .include «m8def.inc» которая есть в каждой программе.
Для этого давайте напишем небольшой скрипт, который будет это делать. Вернее я его уже написал, а вам предлагается только почитать комментарии к нему, или даже просто скопипастить 🙂 Вот он:

WARNING. В статье не отображаются бекслэши, поэтому они заменены обычными слешами красного цвета: /

PART=`grep -m 1 » / .include / «.*def / .inc / «» %f | grep -o » / (tn / |m / )6 / +» | sed «s/tn/t/g»` && echo «target device: $PART» && avrdude -p $PART -c usbasp -U flash:w:»%e.hex» && exit

(В конце статьи есть файлик filetypes.asm, в котором все это есть. Можно вместо переписывания скриптов просто закинуть его куда надо (

Всю эту здоровенную строку нужно вбить в поле «Выполнить»
Пояснения:
Сначала мы создаем строковую переменную PART, в которую заносим результат выполнения скрипта, определяющего тип контроллера (о самом скрипте чуть ниже)
Затем выводим в консоль название распознанного контроллера (просто так, для справки), потом запускаем avrdude, подставляя в него нужную опцию, ну и в конце я добавил exit чтоб окно терминала само закрывалось после удачной прошивки.
У связки && есть одна приятная особенность: следующая команда выполняется только в случае успешного завершения предыдущей. Таким образом, если при прошивке что-то пошло не так терминал не закроется и мы сможем почитать об ошибках.
Теперь подробнее о скрипте:
первый grep находит в файле с исходником строчку вида .include «[тут что угодно]def.inc», опция -m 1 указывает что не стоит продолжать поиск, если хотя бы одна строка найдена.
Второй получает то что нашел первый и его задача из всей строки высосать именно название контроллера. Делается это с помощью шаблона, задающего вид имени контроллера и опции -o которая говорит ему чтоб выводил только тот кусок что нашел, а не всю строку. Я использую только меги и тиньки, поэтому у меня только tn и m, но вы можете адаптировать скрипт и для других серий. Например для xmega будет (tn|m|x) а для AT90S (tn|m|x|4) (у AT90S название только из цифр) ну и так далее.
Последняя команда sed заменяет tn на t. Дело в том, что в аппноутах от Атмела тинька 2313 например зовется как tn2313, а avrdude ее понимает как t2313. Вот и приходится изворачиваться.

Ну вот, теперь все совсем уж замечательно и в конечном виде команды компиляции и прошивки выглядят так:

avra —includepath

PART=’grep -m 1 » / .include / «.*def / .inc / «» %f | grep -o » / (tn / |m / )6 / +» | sed «s/tn/t/g»‘ && echo «target device: $PART» && avrdude -p $PART -c usbasp -U flash:w:»%e.hex» && exit

Осталась последняя маленькая деталь, которую стоит обсудить — фьюзы.
В принципе, avrdude позволяет их устанавливать, но для этого нужно укурившись даташитом пересчитать их в шестнадцатеричную систему и потом подсунуть в avrdude. Учитывая высокую вероятность ошибки и крайнюю трагичность ее последсятвий такой вариант сразу отметается. Мы же будем для этого юзать графическую оболочку к avrdude — avr 8 burn’o’mat. Качаем deb-пакет с их сайта, устанавливаем. У меня он просто так ставиться не захотел, пришлось подредактировать кое-что. Во вложениях к статье — исправленный deb-пакет. Если возникнут с этим проблемы — пишите в форум, разберемся.

При первом запуске ее нужно настроить. Переходим во вкладку Settings — AVRDUDE
Видим вот такое окно:

Сюда нужно ввести путь к avrdude, к файлу с ее настройками, тип вашего программатора и порт к которому он подключен. В общем, ставим все как на скрине.
Все, после этого выбираем нужный контроллер, жмем Fuses и правим их как надо.

Перед исправлением фьюзов сначала обязательно их считывайте с кристалла! Да и вообще, поаккуратней с ними 🙂

Можно даже запуск avr8-burn-o-mat повесить на оставшееся свободным действие «Сборка». Тогда вообще все просто замечательно выходит: F8 — скомпилировать, F5 — прошить, F9 — поправить фьюзы.

Ну вот и все, теперь вы сможете с легкостью писать AVR программки из-под вашего любимого линукса.
Удачи вам и правильных фьюзов 🙂

Источник

Программирование МК AVR в ОС Ubuntu

Поставил я себе такую ОС — Ubuntu 9.04. Конечно же особо в ней в игрушки не поиграешь годится она, в основном, только для работы. Ну и решил я попробовать в ней программировать контроллеры AVR.
На просторах интернета, в принципе, достаточно много всякой всячины которая поможет в освоении программирования AVR под Linux.
Но как обычно я столкнулся с тем, что много всего ну ничего толком. Везде советуют ставить Eclipse или KontrollerLab (как оно меня достало).
Ну вы конечно же догадались, что что-то у меня с ними пошло не так как хотелось бы. В общем методом догадок и высокоинтеллектуального тыка я стал экспериментировать. И вот до чего я дошел.

Открываем менеджер пакетов Sinaptic и в поиске пишем gcc-avr. Отмечаем для установки gcc-avr, avr-libc, avrdude.
Можно конечно же и так:

$sudo apt-get install gcc-avr avr-libc avrdude

Ну для старта все что нужно вроде бы установили.

Далее создадим в корне системы папочку под названием AVR (путь к папке: /AVR)
В качестве редактора можно использовать nano (в терминале прописываем nano),
но я пользовался обычным текстовым редактором gedit (в терминале прописываем $sudo gedit)
В нем напишем свой код ну например:

#include
#include
#include

int main(void)
<
DDRx=0xff;
while (1)
<
PORTx=0xff;
_delay_ms(100);
PORTx=0x00;
_delay_ms(100);
>
>

Далее сохраняем наш текст с расширением main.c в папочке AVR (путь к файлу: /AVR/main.c).

Теперь переходим к компиляции кода.
Запустим терминал и пропишем такой код:

$avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -o /AVR/main.o /AVR/main.c

Долго искал нужную строку, в итоге взял ее просто из WinAvr :).

avr-gcc — компилятор, -mmcu=наш контроллер(сейчас atmega8), -DF_CPU=тактовая частота в Гц, -Os-Оптимизатор кода, -o-OUT, /AVR/main.o-выходной файл с расширением .o который получим из .c, /AVR/main.c -наш си файл.

Не забываем работать под root иначе система не пустит.
Enter и если зайдем в наш каталог /AVR то увидим файлик с расширением .o.

Далее в терминале (он же консоль) введем:
$avr-objcopy -O ihex /AVR/main.o /AVR/main.hex

Ну долго объяснять не буду просто скажу, что перегоняем наш файл main из main.o в main.hex.
Ну вот наша прошивка готова к заливке в нашу ATmega8.

Нам понадобится конечно же программатор.
Использовать будем программатор stk500v2 by Petka (Работает просто отлично заливает мгновенно, не отваливается от порта, правда использовал я вместо FT232 CP2102. Огромное спасибо за схемку и прошивки.)

Источник

Программирование микроконтроллеров AVR под LINUX

От простого к cложному. Вместе разберемся!

Страницы

28 февраля 2014 г.

Книга: настройка программной среды в Linux

В этом разделе будут подробно рассмотрены этапы установки и настройки различных программ и утилит, показаны примеры их использования.

В частности будут рассмотрены:

Avrdude — консольная программа для прошивки микроконтроллеров
AVR burn-o-mat — графическая оболочка к Avrdude
Avra — ассемблер для AVR микроконтроллеров фирмы Atmel

23 февраля 2014 г.

Книга: avrdude

Avrdude: прошивка МК из консоли

Какие программные продукты потребуются? Потребуется avrdude — утилита для прошивки МК, которая поддерживает кучу разных программаторов и контроллеров.

Подготавливаем рабочее пространство

Допустим имеется файл в прошивкой микроконтроллера Example.hex, который потребуется залить в контроллер. Допустим мы используем программатор USBasp.

avrdude -p t2313 -c usbasp -U flash:w:Example.hex

Опции:
-p — указывем тип контроллера, например для Tiny2313 именно t2313
-c — указываем используемый программатор, например usbasp
-U — указываем файл для прошивки и Модификаторы
flash:w: — модификаторы уточняют куда производить запись, во flash.

Однако нас огорчит ошибка:

avrdude: usb_open(): cannot read serial number «error sending control message: Operation not permitted»

Дело в том, что udev (линуксовый менеджер устройств), исходно не дает любому пользователю писать на какое попало устройство. Нам нужно подружить USBasp с udevом.

Найдем USBasp в списке подключенных устройств командой lsusb :

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 003: ID 046d:c52f Logitech, Inc. Wireless Mouse M305 Bus 003 Device 025: ID 16c0 : 05dc VOTI shared ID for use with libusb

Последняя строка — наша цель. 16с0 — это код производителя, а 05dc — это код устройства. Нам нужно создать файл с правилом для udev, файл должен располагаться тут:

Правило означает, что мы дали пользователям, входящим в группу adm, права доступа 666 (запись и чтение) к устройству 16c0:05dc. На моем LinuxMint 15 пользователь под которым я работаю уже входил в группу adm (администраторы), поэтому в правиле указал именно её. Прописывание группы users и добавление себя в неё (как многие советуют) желаемого результата не давало, без sudo не запускалось.

Итого, нам требуется дать в консоле такую команду:

echo ‘SUBSYSTEM==»usb», SYSFS==»16c0″, SYSFS==»05dc», GROUP=»adm», MODE=»0666″‘ | sudo tee /etc/udev/rules.d/10-usbasp.rules

Отсоединяем USBasp от порта, выходим из учетки, потом заходим снова и подсоединяем USBasp. Avrdude должен начать запускаться без sudo. [смутно помню потребовалось ли выходить из учетки, или после рестарта udev все уже заработало. ]

Прошивка консольной утилитой avrdude

Для того,чтобы залить прошивку в микроконтроллер необходимо выполнить команду:

avrdude -c usbasp -p m8 -U flash:w:имя_файла.hex

где -p m8 — это модель микроконтроллера.В данном случае atmega 8.

Дополнительно можно прошить и фьюзы, дописав:

Где ХХ — соотвествующие фьюзы микроконтроллера, необходимые для конкретной прошивки.

На некоторых микроконтроллерах (например на серии ATtiny) включен по умолчанию фьюз CKDIV8, который устанавливает делитель на 8 и из-за этого USBasp не программирует такие микроконтроллеры пока не установить перемычку JP3 на плате USBasp.

Для настройки фьюзов

Для настройки фьюзов воспользуйтесь калькулятором фьюзов чтобы выставить нужные настройки, в том числе выключить делитель CKDIV8.
Фьюзы прошиваются через командой

avrdude -c usbasp -p имя_м/к -U lfuse:w:0xХХ:m

avrdude -c attiny85 usbasp -p -U lfuse:w:0x62:m

При программировании через Arduino IDE можно установить нужные фьюзы выбрав в меню «записать загрузчик», выбрав перед этим необходимый микроконтроллер.

Пробуем работать с avrdude
Подключаем любой МК, попробуем считать его сигнатуру:

avrdude: warning: cannot set sck period. please check for usbasp firmware update. avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.00s avrdude: Device signature = 0x1e9007 avrdude: safemode: Fuses OK avrdude done. Thank you.

Видим что все как-бы в порядке. , программа выдала варнинг, но успешно считала сигнатуру. Кстати, 0x1e9007 это TINY13.

Книга: Автоматизация Geany на основе MAKE файлов

Автоматизация Geany.
Вариант 2: на основе MAKE файлов.

Это достаточно удобный способ может сперва показаться слишком запутанным. В папке с каждым проектом создается Makefile в котором указывается указываем модель контроллера, фьюзы, путь к компилятору и его конкретный вариант avra/gavrasm/gcc-avr, модель программатора и программа прошивки.

Если в процессе разработки мы понимаем, что далее требуется начать работать с другой конфигурацией и контроллером, редактируем три строчки в начале make-файла.

Итак, создадим новый проект в Geany. В настройках выбирем: Сборка- Установить команды сборки. Появится такое меню:

Настоим — для этого нужно прописать следующие команды (названия произвольные):
«Скомпилировать» — make compile FILE=%e
«Прошить» — make program FILE=%e
«Очистить» — make clean FILE=%e
«Взвесить» — make size FILE=%e

Теперь нужно написать собственно сам make-file и положить его в папку проекта.
Это удобная система, потом при любом проекте указываем модель контроллера, фьюзы и готово. По моему даже лучше чем выбирать из списка всё это в окнах настройки проекта. Естественно, makefile можно создать и получше но тут будет совсем простой для простых проектов.
Не забываем про табуляцию перед командой, иначе будет ошибка.

Файл выглядит так:

# Makefile for programming AVR in Geany
#Параметры проекта:

MK=t13
LFuse=0x7A
HFuse=0xFF

# Более глобальные переменные.
ASM=avra
ISP=avrdude
INCLUDEDIR=/usr/share/avra/includ

compile:
$(ASM) -I $(INCLUDEDIR) -l $(FILE) $(FILE).asm 2>&1|grep -v PRAGMA
program : $(FILE).hex
$(ISP) -c usbasp -p $(MK) -U flash:w:$(FILE).hex:i -U lfuse:w:$(LFuse):m -U hfuse:w:$(HFuse):m
clean:
rm -f $(FILE).cof $(FILE).eep.hex $(FILE).hex $(FILE).obj *

Теперь правим его под себя — указываем тип своего МК и fuse.
Не забываем про табуляцию перед командой, иначе будет ошибка. Также, некоторые редакторы вставляют в файл свои невидимые символы BOM в результате чего тоже будет ошибка. Советую править Makefile используя geany, с ним проблем невидимых символов и табуляции не будет.

Обычно выдается ошибка такого вида:

Makefile:1: *** пропущен разделитель. Останов.

ИТОГО, в Geany доступны автоматические действия:
«Компилировать» — или иконка с пирамидой и шаром, или F8
«Взвесить» —
«Прошить» — иконка с шестеренкой, или F9

Все «наши» созданные команды содержатся в пункте верхнего меню Сборка.

Источник

Оцените статью