Atmega328p программа для прошивки
Ранее производил прошивку МК средствами Arduino IDE, на эту тему есть отдельная статья Прошивка ATmega через USBasp и Arduino IDE. Время идет, пора переходить на более тонкие инструменты, в частности C и avrdude. Программируем, собираем, прошиваем.
Задача
Тестовую программу мигания светодиодом на C, скомпилировать в файл прошивки и загрузить результат в МК ATmega 328 P.
Решение
Разработку, прошивку и дальнейшее описание буду вести на Debian 9, но все необходимые компоненты есть и под Windows.
Подготовка окружения
Первым делом подготовим окружение, как писал выше: разработка на C, компиляция прошивки средствами avr-gcc, загрузка прошивки средствами avrdude, через программатор USBasp.
Для установки необходимого собрал следующий набор:
В Debian драйвера для USBasp устанавливать не надо, они есть в составе ядра. Для Windows необходимо скачать и установить драйвер с сайта разработчика fischl.de.
Подключение оборудования
На данном этапе не должно вызвать вопросов, но для порядка опишу подключение. Подключаем микроконтроллер к программатору USBasp: выводы SCK, MISO, MOSI, RESET, VCC. Так же не забываем к выходу D0 через резистор 220 Ом подключить анод светодиода, катод к GND.
Написание кода
На данный момент нет разницы в чем будет написан код, для себя выбрал Atom. Создаем файл с расширением .c, например main.c, в котором напишем код мигания светодиодом:
Первой строкой явно указываю частоту с которой должен работать МК, т.к. у меня подключен внешний кварцевый резонатор на 16 МГц. Остальное ясно из комментариев.
Компиляция кода
Для компиляции будем пользоваться двумя командами(полного описания команд и их ключей приводить не буду, ибо каждая из них повод для отдельных статей и они легко находятся в интернете):
К данной команде используем ключи:
- -mmcu для указания типа МК, в данном случае ATmega 328P;
- -DF_CPU для указания частоты с которой работает МК.
После выполнения команды в каталоге появится файл main.o
После выполнения команды в каталоге появится файл main.hex. Файл прошивки готов, необходимо загрузить его на МК.
Ссылки ни на какие статьи не привожу, т.к. просмотренные не содержат полного описания, только отрывочные сведения.
Загрузка прошивки в МК
. Внимание Настоятельно рекомендую перед выполнением команды avrdude ознакомиться с описанием ключей и все операции производить только после проверки написанного, во избежание окиричивания МК. Все дальнейшие расчеты на свой страх и риск!
Воспользуемся утилитой avrdude, к данной команде используем ключи:
- -c для указания программатора, в данном случае USBasp;
- -p для указания типа МК, в данном случае ATmega 328P;
- -U ключ для указания с каким типом памяти мы работаем, что именно делаем, и указываем файл источник/приемник. В данном случает производится запись во flas-память МК из файла main.hex.
После выполнения команды МК оживает и начинает выполнять заложенные в код алгоритмы.
Изменение FUSE-битов
. Внимание Настоятельно рекомендую перед выполнением команды avrdude ознакомиться с описанием ключей и все операции производить только после проверки написанного, во избежание окиричивания МК. Все дальнейшие расчеты на свой страх и риск!
Но не все так гладко. В коде между включением и выключением указана задержка в 1 секунду, а на практике светодиод горит более 10 секунд. Вооружился секундомером, замер показал 16 секунд. Получается МК работает на частоте 1 МГц, вместо 16 МГц.
Чтение документации показало, что необходимо МК указать на какой частоте он должен работать при подключении внешнего кварцевого резонатора. Для ATmega 328P указывается 3 байтами: lock, lfuse, hfuse.
Для расчета значений этих байтов есть калькуляторы фьюзов, обязательно необходимо проверить получившиеся значения с документацией! Для себя собрал следующую команду:
Популярнейшая программа AVRDUDE_PROG 3.3 предназначена для программирования микроконтроллеров AVR ATmega и ATtiny:
1. Возможность самостоятельного добавления программаторов, настройки скорости программирования и т.п;
2. Возможность самостоятельного добавления МК;
3. Редактирование и настройка отображения Fuses битов;
4. Выбор инверсных или прямых Fuses битов;
5. Окна вывода значений Fuses битов в HEX формате;
6. Сохранение настроек программирования при закрытии программы, т.е. при последующем открытии все настройки восстановятся.
В прошлой статье я рассказал о простом (но очень хорошем) программаторе для прошивки микроконтроллеров AVR ATmega и ATtiny - USBASP AVR программатор. В той же статье я указал какие программы поддерживают данный программатор. Наиболее лучшей из них, на мой взгляд, является программа AVRDUDE_PROG автором которой является Сергей Боднар. О ней мы сегодня и поговорим.
Последняя версия программы AVRDUDE_PROG - 3.3 , из программы всегда можно попасть на сайт разработчика и скачать новые версии.
Программа очень проста в использовании, имеет приятный интуитивно понятный интерфейс на русском языке, поддерживает очень много различных программаторов и практически все микроконтроллеры ATmega и ATtiny. Немаловажно и то, что в программу можно самому вносить изменения - добавлять программаторы, микроконтроллеры, изменять некоторые настройки (все подробно расписано на сайте разработчика).
Программа не требует установки на компьютер, необходимо только разархивировать скачанный файл и можно сразу приступать к работе, поддерживаются все разновидности Windows - от ХР до 10.
Окно запущенной программы AVRDUDE_PROG:
Что есть что:
1:
- окно выбора типа микроконтроллера
- кнопка "Стереть все" - очищает все внутренности микроконтроллера
2:
- чтение калибровочных ячеек микроконтроллера
В данном примере показаны четыре калибровочные ячейки микроконтроллера ATmega8 для внутреннего RC генератора:
ВВ - для частоты 1 МГц (частота по умолчанию)
BD - для частоты 2 МГц
В2 - для частоты 4 МГц
В2 - для частоты 8 МГц
При тактировании микроконтроллера ATmega8 частотой 1 МГц от внутреннего RC генератора (по умолчанию) содержимое первой калибровочной ячейки автоматически учитывается микроконтроллером для подстройки внутреннего генератора. При других частотах - содержимое соответствующей калибровочной ячейки необходимо вручную вводить в регистр микроконтроллера для получения более стабильной частоты (если такое нужно). К примеру, в конструкции "Трехканальный термостат, термоморегулятор, таймер. ", которая работает с тактовой частотой 8 МГц от встроенного генератора с внутренней RC цепочкой, требуется перед прошивкой ЕЕPROM памяти записать в определенную ячейку HEX файла значение калибровочной ячейки для частоты 8 МГц.
3:
- выбор HEX файла для прошивки Flash памяти микроконтроллера, сверка записанного файла с оригиналом, чтение данных из памяти
4:
- выбор HEX или EEP файла для прошивки EEPROM памяти микроконтроллера, сверка и чтение
5:
- выбор программатора (по умолчанию - USBASP)
Если вы будете пользоваться программой скачанной с сайта разработчика то там, по умолчанию (первым в списке), будет идти "USBASP", у меня на картинке 4 разновидности USBASP программатора:
- Usbasp_1M
- Usbasp_4M
- Usbasp_8M
- Usbasp-32кГц
Дело в том, что программатор USBASP позволяет записывать файлы прошивки с двумя скоростями:
- для МК с тактовой частотой 1,5 МГц и выше (без перемычки на J3) - скорость записи 375 кГц
- для МК с тактовой частотой менее 1,5 МГц (с перемычкой на J3) - скорость записи 5 кГц
Для нормальной записи прошивки в МК требуется скорость в 4 раза меньше, чем установленная тактовая частота.
Для прошивки нового МК, у которого по умолчанию тактовая частота 1 МГц, необходимо устанавливать в программаторе перемычку на разъем J3, а сама скорость - 5 кГц, в некоторых случаях начинает нервировать.
Для того, чтобы не портить нервы, не дергаться с перемычкой, я программно установил 4 варианта скорости записи, которые выбираются в зависимости от текущей тактовой частоты МК:
- Usbasp_1M - скорость 187,5 кгЦ, для частот 1-4 МГц
- Usbasp_4M - скорость 375 кГц, для частот 4-8 МГц
- Usbasp_8M - скорость 750 кГц, для частот 8 и более МГц
- Usbasp-32кГц - скорость 4 кГц, для часового кварца
Все эти установки прописаны в самом начале файла "programm.ini" где скорость записи зависит от ключа "-В" и числа после него:
6:
- выбор отображения FUSE битов - прямой (как в UniProf и даташитах) и инверсный (как в PonyProg)
7:
- окно вывода служебной информации о выполняемых и выполненных операциях
Внешний вид окна "FUSES" программы AVRDUDE_PROG:
Тут все просто - расставляем в нужном виде галочки или убираем их и программируем FUSE биты. Если что-то намудрили - нажатие кнопки "По умолчанию" приведет установки FUSE битов в значения "по умолчанию" (сами FUSE биты в МК не изменятся!). Очень внимательно устанавливайте FUSE биты - ошибка может привести к отказу микроконтроллера.
Хочу обратить ваше внимание на самую распространенную ошибку при установки FUSE битов. В большинстве случаев мы изменяем только биты ответственные за выбор источника тактирования и частоту тактирования, к примеру для ATmega8 это: CKSEL0-CKSEL3. По умолчанию у ATMEGA8 тактовая частота 1 МГц от внутреннего генератора - сброшен бит CKSEL0 (стоит галочка). Нам, допустим, нужно установить тактовую частоту 8 МГц от внутреннего генератора - сбросить бит CKSEL2 (поставить галочку), что мы и делаем. Но при этом ЗАБЫВАЕМ УСТАНОВИТЬ БИТ CKSEL0 (убрать галочку)!. В результате, программируя FUSE биты, мы получаем совершенно иной результат - программа не работает, а МК не реагирует на программатор. Забыв сбросить бит CKSEL0 мы получаем другой источник тактирования МК - внешний RC. Отчаиваться не надо, главное разобраться в том, что вы получили в результате. В нашем примере - внешний RC, смотрим даташит, подсоединяем к соответствующим входам МК сопротивление и конденсатор (по схеме из даташита и с нужными номиналами) и восстанавливаем контроль над МК.
Внешний вид окна "Автоматическое программирование" AVRDUDE_PROG:
Здесь можно задать первоначальные настройки для разных случаев использования программы.
Как видите - программа AVRDUDE_PROG проста и понятна в использовании, за что и скажем спасибо Сергею Боднару!
Первая проблема с которой столкнутся пользователи Windows8 и Windows10 - установка драйвера для USBasp.
Проблема в том, что эти операционные системы просят, что бы у драйвера была какая-то цифровая подпись, а у драйверов для USBasp на сегодняшний день её нет. Проблема решается отключением проверки этих цифровых подписей. Для этого перезагружаем компьютер с нажатой клавишей Shift. Появляется экран, на котором выбираем "Диагностика"
На следующем экране появляется список действий, которые мы можем сделать. Выбираем на нём "Не проверять цифровые подписи драйверов", жмём цифру 7
Подключим наш программатор к микрочипу. Для удобства я купил макетную плату и соединительные проводки. Соединяем микрочип с программатором согласно схеме
У Atmega8 в TQFP корпусе выводы располагаются следующим образом
К 9 и 10 выводу микроконтроллера присоединяем кварцевый резонатор.
Здесь стоит пояснить значение этого резонатора.Скорее всего в купленном вами микроконтроллере выставлены настройки (fuses) на работу от внешнего тактового генератора, т.е. от кварца. Поэтому, что бы его прошить, нужно что бы он был подключён к этому самому кварцу. Для перепрошивки кварц можно взять любой попавшийся вам под руку. Я когда впервые перепрошивал просто выпаял его из какого-то сломанного устройства, вот он маленький на фото.
Его хватило что бы микроконтроллер перепрошился. Если же ваш микроконтроллер изначально настроен на работу от внутреннего тактового генератора, то для прошивки кварц вам не нужен, можно обойтись и без него.
Для того, что бы можно было прошивать микрочип прямо из среды разработки Arduino, нужно залить на чип ардуиновский загрузчик. Для этого воспользуемся программой avrdude и онлайн конструктором загрузчиков для ардуино. На странице онлайн конструктора загрузчиков переходим в самый низ и видим конструктор
1. Выбираем "Внутренний генератор" если не хотим использовать кварцевый резонатор, либо выбираем "Внешний генератор" если хотим увеличить скорость работы чипа.
2. Выбираем модель микроконтроллера (в нашем случаем Atmega328)
Первое что мы делаем - скачиваем наш загрузчик в виде hex файла. Если конструктор по какой-то причине не работает, можно скачать загрузчик для atmega328 для внутреннего генератора здесь.
Ниже мы видим блок файла boards.txt для Arduino IDE. Я долго пытался подключить этот блок, что бы в среде ардуино появился выбор платы, но мне это почему-то не удалось, в итоге обошёлся без этого.
Ещё ниже мы видим подсказку как залить загрузчик через программу avrdude и программатор USBasp. Я делаю следующим образом:
-Создаю bat файл в папке avrdude и копирую в bat эту строку
avrdude -c usbasp -p atmega328p -U flash:w:a328p_8MHz_e2_de_5.hex -U lfuse:w:0xe2:m -U hfuse:w:0xde:m -U efuse:w:0x5:m
Цена и размер — это только пара причин, по которым использование платы Arduino для конкретных проектов может оказаться за гранью разумного. Зачастую они слишком большие или слишком дороги для целого ряда применений, особенно если требуется сделать несколько экземпляров. Хорошим способом получить простоту применения, присущую платформе Arduino, и при этом избавиться от всех этих недостатков является использование отдельного микроконтроллера ATmega328P и программирование его посредством среды разработки Arduino IDE и её упрощённой версии языка Си. Однако без начального загрузчика (bootloader) платформы Arduino сам по себе микроконтроллер ATmega328P не получится программировать с помощью среды Arduino IDE.
Цель этого руководства — понять, как работает начальный загрузчик платформы Arduino и как его записать в память микроконтроллера ATmega328P.
Начальный загрузчик платформы Arduino
Начальный загрузчик весьма похож на систему BIOS, работающую на ПК, и выполняет две задачи:
- Отслеживает, не пытается ли компьютер загрузить программу в микросхему через последовательный порт. Если компьютер начинает загрузку, то он принимает код и сохраняет его в специально отведённой области памяти микроконтроллера таким образом, чтобы при этом не затереть самого себя.
- Если компьютер не инициирует загрузку кода, то загрузчик командует микросхеме начать выполнение кода, который уже находится в памяти. Как только загрузчик записал в память программу и запустил её, плата Arduino будет непрерывно выполнять программу, пока подаётся питание.
Запись начального загрузчика в микроконтроллер может пригодиться не только, чтобы отдельно использовать микросхему ATmega328P, саму по себе. Это может пригодиться на случай, например, если вам понадобится заменить микроконтроллер на плате Arduino Uno или для спасения неисправной платы, которая перестала принимать код.
Запись начального загрузчика в микроконтроллер
Существует немало способов записи загрузчика платформы Arduino в микроконтроллер, но мы остановимся на самом простом, который предполагает использование платы Arduino в качестве внутрисхемного программатора ISP (In-System Programmer).
В процессе производства электронных устройств программу в микроконтроллеры обычно загружают уже после монтажа на печатную плату. Такая операция называется внутрисхемным программированием ISP (In-System Programming), и для неё необходимы специальный разъём на плате, через который получают доступ к микроконтроллеру при записи программы. Большинство плат Arduino оснащены таким разъёмом с выводами 2×3, который используется для одной из разновидностей ISP — внутрисхемного последовательного программирования ICSP (in-circuit serial programming).
Читайте также: