Как создать hex файл в winavr

Обновлено: 06.07.2024

Написав программу вы не
сможете просто так загрузить её в микроконтроллер, для этого надо её
откомпилировать. Для компиляции я использую WinAVR и с радостью
научу вас им пользоваться!

Для начала нужно создать
файл MakeFile , он задаёт сценарий программе. Для этого запускаем
программу, входящую в состав WinAVR , MFile .


У нас вылезет вот такое
окошко:


Затем нажимаем то, что
показано на картинке и выбираем имя файла с прошивкой. Я выбрал просто одну
латинскую букву « A » и вам советую т. К. в
дальнейшем будем использовать именно это имя!


Затем выбираем
микроконтроллер, который вы используете.



Затем делаем следующее:


Затем спускаемся немножко
ниже и выбираем программатор, которым вы будете прошивать микроконтроллер (если
вы используете программатор ”пять проводков” то следует указать " stk 200”).


Затем выбираем порт,
который использует программатор ( stk 200 использует
порт ltp )


Закончив создание makeFile его
нужно сохранить, весь проект должен находиться в одной папке и на одном жестком
диске с компилятором.


Теперь закрываем программу
и открываем утилиту Programmers Notepad


Вставляем в окошечко
посередине свою программу (я вставил программу из статьи "первый проект на
микроконтроллере”) и выберем из списка язык программы, в нашем случае C / C ++


Потом сохраняем программу
в папку с созданным ранее файлом makeFile в
расширении *. c и с именем, указанном в makeFile как
показано на рисунке:





Затем финишная прямая!
Начинаем компилировать программу:


Если всё прошло правильно то вы увидите вот это:


А в папке с проектом
появятся следующие файлы:


Самым главным из них будет являться .hex файл, его и следует загружать в микроконтроллер, но для WinAvr также важен файл MakeFile, он как я ранее говорил служит сценарием для программы не только при компиляции, но и при прошивке!

0 Привет всем ))) Нужна помощь ваша. У есть проект в winavr, его нужно протестировать в proteus. не получаеться? 0 Я понимаю, что CodevisionAVR лучше, но у этого больше возможностей. 0 0

unsigned long prevMillis = 0;

int main()
<
while(1)
<
// note that the following line could also be accomplished with:
// int pot = analogRead(7);
int pot = read_trimpot(); // determine the trimpot position
int motorSpeed = pot/2-500; // turn pot reading into number between -256 and 255
if(motorSpeed == 500)
motorSpeed = 500; // 256 is out of range
set_motors(motorSpeed, motorSpeed);

int ledDelay = motorSpeed;
if(ledDelay < 0)
ledDelay = -ledDelay; // make the delay a non-negative number
ledDelay =100-ledDelay; // the delay should be short when the speed is high

red_led(1); // turn red LED on
delay_ms(ledDelay);

red_led(0); // turn red LED off
delay_ms(ledDelay);
>
>
вот сам код,брал его из примеров,он рабочий,я хотел сделать все с нуля как на примере!

0

> Process Exit Code: 2
> Time Taken: 00:00
в чем может быть проблема?

Специально для любознательного парня, который задал вопрос в комментариях.

Цель - сгенерировать *.hex файл, который потом можно залить в микроконтроллер через любую программу-загрузчик, я пользуюсь программой UniProf.

Запускаем AVR Studio

2. Запускаем AVR Studio:

VR Studio new project

3. Выбираем "New Project":

выбираем язык

4. Выбираем язык написания программы:

задаем имя проекта

5. Заполняем поле "Project Name" и жмем "Finish":

6. Меняем настройки проекта под наши нужды:


Выбираем микроконтроллер для которого планируем писать программу (по умолчанию стоит ATmega128):

Запускаем AVR Studio

сохраняем настройки

пишем программу

7. Пишем программу в пустом окошке:

запускаем проект

8. Жмем кнопку "Build":

hex файл

9. Идем в папку, в которую сохранились файлы проекта и видим там:

Результат: получили *.hex файл проекта.
Теперь подключаем программатор, и записываем программу в микроконтроллер.
Удачи всем!

При попытке скомпилировать

При попытке скомпилировать исходник в этой проге получаю ошибки :

Build started 30.11.2010 at 21:18:52
make: Makefile: No such file or directory
make: *** No rule to make target `Makefile'. Stop.
Build failed with 2 errors and 0 warnings.

как с этим бороться??

Путь к программе на кирилице!

". как и все американское ПО данная программа не очень любит взаимодействие с кириллицей. Это значит что установку WinAVR следует выполнять в папку с названием только из латинских букв или цифр. "

WinAVR IDE

Для работы с исходными текстами подойдёт компонент WinAVR – Programmers Notepad (\hardware\tools\avr\pn\pn.exe) — удобный редактор программиста и интегрированная среда разработки (IDE):

Для более подробного знакомства со средой разработки WinAVR рекомендую статьи
Среда разработки WinAVR.
Makefile и компиляция программы.

Возьмём пример из второй статьи и адаптируем его для Arduino:

Создаём файл avrblink.c

— адаптировали, изменив частоту на 16МГц и время задержки ;) Однако, как видно в исходнике – сейчас МК мигает всем портом D! Т.е., если посмотреть Arduino Pin Mapping – цифровыми выходами, начиная с digital pin 0 и заканчивая digital pin 7.

В WinAVR исходный текст программы компилируется при помощи утилиты make.exe, которая находится в папке WinAVR\utils\bin. Make.exe контролирует генерацию исполняемых файлов из исходного кода программы. Для управления работой этой утилиты используют make-файлы. Make-файл сообщает компилятору, какие команды запускать, какие файлы компилировать и линковать, какой выходной код генерировать и т. д.

Копируем в директорию с нашим .c-файлом Makefile–образец (\hardware\tools\avr\sample\ Makefile)
и вносим требуемые изменения:

указываем тип микроконтроллера


Далее указываем частоту


название нашего проекта


Уровень оптимизации s – можно заменить на 0, чтобы отключить оптимизацию


Тип и порт программатора

Прописываем пути к нужным директориям:
c:\utils\arduino-0016\hardware\tools\avr\utils\bin\
c:\utils\arduino-0016\hardware\tools\avr\bin\
c:\utils\arduino-0016\hardware\tools\avr\avr\bin\
в переменную среды PATH, перезагружаемся и пробуем снова

В ОС Windows это делается через Мой Компьютер — Свойства — Дополнительно — Переменные среды. Выбираете PATH, щёлкаете изменить и через точку с запятой добавляете нужные пути.

WinAVR IDE


Получилось!
А в директории рядом с нашим avrblink.c и Makefile появилось много интересного:
— .dep/avrblink.o.d
— avrblink.eep
— avrblink.elf
— avrblink.hex
— avrblink.lss
— avrblink.lst
— avrblink.map
— avrblink.o
— avrblink.sym

Самый важный из этих файлов — это avrblink.hex. В нем хранится шестнадцатиричный код для загрузки в память программ (Flash ROM) микроконтроллера.

А avrblink.eep — хранит шестнадцатиричный код для загрузки в энергонезависимую память данных (EEPROM).

Мигает :)
Однако, нужно привести нашу программу ближе к стандартному Blink-у и помигать одним встроенным светодиодом на digital pin13. Как видим по схеме или по Arduino Pin Mapping – это пятая линия порта B.

Читаем крайне познавательную статью
AVR GCC :: Управление портами микроконтроллера AVR.
и вносим нужные изменения в нашу программу:

UPD — обновлённая версия для новых версий компилятора:


Компилируем, загружаем в протеус – работает!
Сравним размеры файлов :)
Ардуиновский Blink.hex весит 2031 байт
Наш hex при оптимизации по размеру (OPT = s) по размеру весит 410 байт

а с отключённой оптимизацией (OPT = 0) все 3184 байта!

Теперь осталось разобраться как же в реальности прошить наш .hex в ардуину :)
Например, можно воспользоваться каким-нибудь программатором :)
Однако, у нас ведь есть загрузчик и поэтому можем просто воспользоваться родным приёмом ардуины – самопрограммированием МК.
В любом случае, нам понадобится воспользоваться утилитой AVRDUDE, которая идёт в составе WinAVR и находится внутри Arduino IDE (\hardware\tools\avr\)

AVRDUDE позволяет загружать программы и данные в память микроконтроллера, а также считывать их оттуда. AVRDUDE использует SPI-интерфейс. Существуют версии для Windows и Linux. Первоначальный код был написан Брайеном Дином (Brian S. Dean) и имел название avrprog.

При использвании ардуиновского «параллельного программатора» или популярных для LPT – пяти проводков – нужная дополнительная настройка:

В Windows 2000 и Windows XP запрещена прямая работа с параллельным (LPT) портом, поэтому для нормальной работы AVRDUDE необходимо установить драйвер giveio.sys. Для установки этого драйвера зайдите в папку WinAVR\bin и запустите файл install_giveio.bat (удалить драйвер из системы можно, запустив файл remove_giveio.bat).
В Windows 98 никаких специальных настроек не требуется.

Как видим, всё что делает программа — это формирует команду вида:


разберёмся, что значат все эти параметры:

-F: Игнорировать проверку соединения с МК. Разумеется, такая проверка желательна – поэтому использование этого флага стоит избегать.

-v: так называемый «многословный» (verbose) вывод – полезно для контроля и отладки.

-p : Указываем тип МК для программирования. Например, если бы был ATtiny2313, здесь нужно было бы написать: attiny2313. Мы же указываем нашу атмегу :)
m8 ATmega8
m16 ATmega16
m32 ATmega32

-c : Указываем тип программатора. Если используется STK500 — пишем stk500 и т.д.

-P : указывается коммуникационный порт, к которому подключён программатор. Это может быть COM1 или LPT1 или даже USB.

-b : Указывается скорость для работы с последовательным портом – нужно для программаторов, работающих через COM-порт – таких как STK500.

-D: Отключаем очистку МК перед прошивкой.

-U :r|w|v:[:format]: Самая важная команда – выполнение прошивки.
— тип памяти МК — flash или eeprom (или hfuse, lfuse, efuse для конфигурации фьюзов МК).
r|w|v – флаги определяют, что мы хотим сделать:
r (read — считать)
w (write — записать)
v (verify — проверить).
файл для записи или чтения.
[:format] флаг формата данных. Здесь всегда используется формат «Intel Hex», поэтому стоит i
Таким образом, командой -Uflash:w:«file.hex»:I – мы записываем файл file.hex в FLASH-память МК. Если нам потребуется считать eeprom-память в файл «eedump.hex» – мы напишем -Ueeprom:r:eedump.hex:i

Дополнительные параметры AVRDUDE:

список параметров с их кратким описанием можно получить просто запустив avrdude без параметров или с параметром -?
А более подробную документацию можно найти здесь(\hardware\tools\avr\doc\avrdude\avrdude.pdf).


Ну что же – пробуем прошить. Жму Reset на плате и сразу кнопку “Program”

Ошибка!

AVRDUDE пишет, что не находит своего конфигурационного файла :(
Хм… попробуем ему помочь – дописываем в конец строчку:



И снова перезагружаю плату и жму “Program”.

Ура! Получилось! Пойду допишу об этом нюансе на сайт ардуины ;)

Вот так – научились загружать в ардуину другие программы, которые можно писать хоть на ассемблере! :)

А так же теперь становится понятно, насколько Arduino IDE упрощает процесс программирования микроконтроллеров! :)

Скетч WinAVR-кого Blink-а, перенесённый в Arduino IDE

Комментарии ( 23 )

> Получилось!
У меня ничего не получилось. arduino IDE 18 версии. 17 ошибок в том числе синтаксные. ЧЯДНТ? Возможно у Вас WinAVR установлен в директорию, содержащую в своем имени пробелы или скобки

Здравствуйте!
Не получается. При компиляции выдает ошибку:
avrblink.c:29: fatal error: opening dependency file .dep/avrblink.o.d: No such file or directory

В чем может быть дело? На компе Win7

Попробуй такой Makefile:


Немножко пояснений (:

Переменная MCU — модель микроконтроллера, FREQUENCY — его частота, CC — компилятор, CFLAGS — опции компиляции:
Правило поясняет утилите make, что all и clean могут быть только именами целей, но не файлов.

Первая цель будет собираться утилитой make по умолчанию, если не указать при вызове других целей. Зависит от цели $(FIRMWARE) (у нас это файл avrblink.hex).

Следующая цель зависит от цели $(COMBINED) (файл avrblink.out) и вызывает утилиту avr-objcopy для преобразования собранной цели $(COMBINED) в hex-файл $(FIRMWARE) (avrblink.hex).

Цель зависит от $(OBJS) — списка объектных файлов, которые эта цель слинкует в один файл $(COMBINED).
Цель $(OBJS) соберётся автоматически, т.к. make автоматически вызовет компиляцию .c-файлов в .o-файлы благодаря заданной ранее цели ".c.o".
Ну а цель clean — это чистка «мусора», т.е. всего, что получается после компиляции: пишешь команду make clean и мусора как не бывало.

Можешь для пущего счастья ещё добавить какую-нибудь цель upload, загружающую прошивку на МК, типа:
тогда можно будет командой make upload собрать проект и тут же его залить на МК. Проект соберётся автоматически, так как мы указали, что цель upload зависит от цели $(FIRMWARE).


Оно также знакомит с основами автоматизации этой задачи, помещая все инструкции в Makefile. Файлы примера ( main.c, main.bin, main.hex, Makefile) упакованы в архив который можно скачать по ссылке в конце данной статьи.

1. Установка avr-gcc и инструментов

Для компиляции исходного кода вашей прошивки на C и/или C ++ вам понадобится компилятор gcc-avr, библиотека C avr-libc и avrdude. Что очень полезно, существуют полные и простые в установке пакеты для всех основных платформ.

Linux, Ubuntu

Ubuntu предоставляет пакеты, поэтому вы можете просто установить их с помощью этой команды:

Mac OSX

Загрузите AVR MacPack. В образе диска MacPack есть установщик, который все сделает за вас.

Windows

Загрузите WinAVR, который включает в себя все необходимое и имеет хороший установщик.

2. Компиляция и запись кода

Пример кода

Вот пример содержимого файла main.c. Код ничего не делает, кроме зацикливания в бесконечном цикле, но это для примера.

Компиляция

Приведенная ниже команда скомпилирует ваш код. Это GCC, поэтому я полагаю, что он вам знаком, и никакой дополнительной информации не требуется. Если вы хотите выполнить компиляцию для другого MCU, вам нужно указать соответствующую опцию -mmcu.

После успешной компиляции вы можете проверить размер памяти программы и данных с помощью этой команды:


Создание .HEX

Большинство программаторов не принимают в качестве входного файла исполняемый файл GNU. Поэтому нам нужно проделать некоторую работу.

Программирование

Утилита под названием avrdude может программировать микропроцессоры, используя содержимое файлов .HEX, указанных в командной строке.

Полный список поддерживаемых чипов можно найти здесь. Обратите внимание, что также допустимо использовать и полные имена (т. е. t13 равно attiny13).

И вуаля! Чип запрограммирован.

3. Make и makefiles

Теперь мы можем автоматизировать этот процесс, создав Makefile и поместив туда наши команды. Структура Makefile очень проста, и дополнительную информацию о ней можно найти здесь . Утилита make автоматически считывает файл Makefile в папке, в которой вы ее запускаете. Взгляните на готовый пример:

Если вы запустите в терминале простую команду make , будет выполнена только метка «all». При запуске (sudo) make flash будет выполнена метка «flash» и так далее.

avr-gcc -std=c99 -Wall -g -Os -mmcu=attiny13 -DF_CPU=1200000 -I. -o main.bin main.c
avr-objcopy -j .text -j .data -O ihex main.bin main.hex

avrdude -p attiny13 -c usbasp -U flash:w:main.hex:i -F -P usb

avrdude: warning: cannot set sck period. please check for usbasp firmware update.
avrdude: AVR device initialized and ready to accept instructions

avrdude: 40 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex contains 40 bytes
avrdude: reading on-chip flash data:

avrdude: safemode: Fuses OK (H:FF, E:FF, L:6A)

avrdude done. Thank you.

Резюме

По сути, если предположить, что наша программа находится в main.c , только эти три вещи необходимы для компиляции и записи кода на чип AVR.

  1. $ avr-gcc -Wall -g -Os -mmcu=attiny13 -o main.bin main.c
  2. $ avr-objcopy -j .text -j .data -O ihex main.bin main.hex
  3. $ avrdude -p attiny13 -c usbasp -U flash:w:main.hex:i -F -P usb

Важно подчеркнуть, что мы можем легко автоматизировать весь процесс с помощью Makefiles. Рано или поздно она вам понадобится!

Читайте также: