Attiny85 прошивка по usb
Итак, программировать ATtiny85 будем в IDE Arduino, причем ее версия должна быть не ниже 1.6.4, а для прошивки нам потребуется программатор. В качестве программатора я буду использовать Ардуино Уно. Эта тема подробно описана в статье Arduino as ISP, поэтому сегодня не станем заострять на ней внимание. Можно использовать и другие программаторы, например, рассмотренный недавно USBasp. В этом случае пропустите следующий пункт и переходите к настройке IDE.
Подготовка программатора Arduino as ISP
Запускаем IDE Arduino, открываем скетч ArduinoISP (меню Файл > Примеры > ArduinoISP), подключаем Ардуино к компьютеру и загружаем в нее скетч. На этом плату Ардуино пока можно отложить, займемся настройкой IDE.
Добавление ATtiny85 в список плат IDE Arduino
Теперь в IDE открываем меню Файл > Настройки и в появившемся окне нажимаем кнопку рядом с полем ввода дополнительных ссылок для Менеджера плат. В открывшемся окне вставляем скопированную ранее ссылку новой строкой. Нажимаем OK для сохранения изменений и выхода из настроек:
Следующий шаг - установка файлов для поддержки ATtiny85. Переходим в меню Инструменты > Плата > Менеджер плат. Чтобы не искать в списке интересующий нас пакет, отфильтруем его, введя в текстовом поле слово tiny. Выбираем пакет attiny by David A. Mellis и нажимаем установить. После выполнения установки закрываем окно Менеджера плат:Подключение ATtiny85 к программатору
Технология внутрисхемного программирования (ISP) использует линии интерфейса SPI. Поэтому выводы MOSI, MISO, SCK ATtiny85 подсоединяем к одноименным выводам Ардуино; вывод RESET ATtiny85 к цифровому выводу 10 Ардуино. Запитываем микроконтроллер от линий 5V и GND Ардуино. И, возможно, потребуется установить электролитический конденсатор между выводами Reset и GND Ардуино, чтобы предотвратить автоматическую перезагрузку. Ниже показаны распиновка микроконтроллера ATtiny85 и схема его подключения к Ардуино.Загрузка скетча в ATtiny85
Откроем скетч Blink из стандартных примеров Ардуино (меню Файл > Примеры > Basics > Blink). Заменим в скетче текст LED_BUILTIN на 0 в трех местах, должно получиться:
Теперь в списке плат выберем ATtiny25/45/85, конкретную модель микроконтроллера укажем в меню Процессор. В меню Clock выберем значение Internal 8MHz. И, поскольку в качестве программатора мы используем Ардуино, выберем значение Arduino as ISP в меню Программатор:
Для проверки работы скетча подключим к микроконтроллеру светодиод: длинным выводом к PB0, коротким к GND. Светодиод начнет мигать, только интервал составит не 1 секунду, а 8 (при условии, что мы имеем дело с новым/чистым микроконтроллером). И вот почему: новые микроконтроллеры идут с завода с запрограммированным фьюзом CKDIV8 (Divide clock by 8), что приводит к делению тактовой частоты на 8. Поэтому сейчас мы сбросим данный фьюз, чтобы микроконтроллер работал на частоте 8МГц.
Изменение тактовой частоты ATtiny85
Работу с фьюзами я уже описывал в статье Что такое фьюзы. Чтение и запись фьюзов Ардуино. Тогда для работы с ними использовалась программа avrdude. Но сейчас для сброса фьюза CKDIV8 мы поступим проще: установка конфигурационных байтов входит в процедуру записи загрузчика, поэтому в IDE Arduino переходим в меню Инструменты и выбираем команду Записать загрузчик. В действительности запись загрузчика в микроконтроллер не произойдет, т.к. его просто нет в используемом нами пакете. Но зато будут перезаписаны конфигурационные байты, новые значения будут взяты из файла boards.txt, в них как раз бит CKDIV8 сброшен. Также будет очищена память программ, поэтому скетч нужно будет загрузить в микроконтроллер еще раз.
После выполнения указанных действий ATtiny85 заработает на частоте 8МГц и светодиод начнет мигать с интервалом в 1 секунду. Микроконтроллер можно отключить от Ардуино и запитать от источника 3-5В.
Когда вы в очередной раз захотите изменить тактовую частоту ATtiny85, нужно будет выбрать соответствующее значение в меню Инструменты > Clock и повторно выполнить команду Записать загрузчик. И, как вы можете видеть, в меню выбора частоты доступно значение 16МГц - оно получается умножением тактовой частоты внутреннего RC-генератора (8МГц). Этой опцией не могут похвастаться даже старшие микроконтроллеры семейства mega. Такой способ тактирования применен в плате Digispark, построенной на ATtiny85.
Обычно для программирования микроконтроллеров используют программаторы - устройства, которые работают напрямую с памятью микроконтроллера и размещают в ней программу. Так при знакомстве с ATtiny85 мы прошивали ее при помощи программатора, в роли которого выступала плата Ардуино Уно. Но при этом программирование самих плат Ардуино или Digispark, которая построена на том же ATtiny85, осуществляется без программатора. Это возможно благодаря записанному в них загрузчику, он принимает код новой программы по последовательному интерфейсу и размещает его в ПЗУ микроконтроллера. И сегодня я хочу рассказать о том, как записать загрузчик Micronucleus в ATtiny85.
Micronucleus - это загрузчик, предназначенный для AVR микроконтроллеров серии tiny, с минимальным USB интерфейсом и кросс-платформенным программным обеспечением на основе libusb для загрузки в микроконтроллер. Он примечателен тем, что позволяет подключать микроконтроллеры к USB без использования специализированных контроллеров, используя лишь минимальную обвязку. Все необходимые функции для программирования через USB реализованы в загрузчике программно. По утверждению авторов, Micronucleus - самый маленький USB-загрузчик для AVR ATtiny.
Для записи загрузчика в ATtiny85 нужен программатор. Я опишу процедуру записи с использованием Ардуино Уно в качестве программатора, поскольку считаю этот способ наиболее доступным для поклонников Ардуино. Также нам понадобится отладочная плата как на фото в начале этой статьи. На ней присутствует необходимая для USB обвязка и DIP панелька для установки ATtiny85. После записи загрузчика она позволит подключать ATtiny85 к компьютеру через USB. По сути мы получим клон Digispark и сможем программировать его из среды Ардуино, используя пакет Digistump. Поэтому, если вы не знакомы с программированием плат Digispark, то вам следует заглянуть в мою предыдущую статью Что такое Digispark
Подготовка программатора Arduino as ISP
Итак, займемся подготовкой программатора. Я использую Ардуино Уно, но для этих целей подойдет любая другая плата. Запускаем IDE Arduino, открываем скетч ArduinoISP (меню Файл > Примеры > ArduinoISP), подключаем Ардуино к компьютеру и загружаем в нее скетч.
Подключение ATtiny85 к программатору
Подключая микроконтроллер к ISP программатору, нужно помнить, что программирование осуществляется по линиям связи SPI: выводы MOSI, MISO и SCK программатора и ATtiny85 должны быть соединены; вывод SS программатора соединяем с выводом RESET ATtiny85. И остается запитать микроконтроллер, соединив его VCC и GND с соответствующими выводами Ардуино. Возможно, потребуется установка электролитического конденсатора между GND и RESET Ардуино для предотвращения автоматической перезагрузки. Схема подключения показана ниже.
Тема использования Ардуино в качестве программатора была подробно описана ранее, поэтому, если возникнут вопросы, посмотрите статью Arduino as ISP - программатор из Ардуино.
Запись загрузчика в ATtiny85
Записать загрузчик в ATtiny85 можно разными способами. Я опишу два из них:- с использованием среды разработки Ардуино, заточенной под Digispark. В этом случае запись загрузчика выполняется стандартными средствами IDE;
- с использованием командной строки и программы avrdude, входящей в состав IDE Ардуино.
Способ 1. Запись загрузчика из IDE Ардуино
Распакуйте архив. Перейдите в папку \DigisparkArduino-Win32\Digispark-Arduino-1.0.4\hardware\digispark\, в ней нас интересует файл boards.txt, откройте его в текстовом редакторе и найдите строку digispark-tiny.bootloader.high_fuses=0x5f:
Сейчас в этой строке указано значение 0x5f, его нужно изменить на 0xdf. Это значение старшего конфигурационного байта позволит использовать первый вывод микроконтроллера как вход внешнего сброса. Если вы не измените указанное значение, то при записи загрузчика из среды Ардуино первыми в микроконтроллер будут записаны конфигурационные байты, тем самым лишив вас вывода Reset и возможности дальнейшей работы с микроконтроллером. Соответственно, загрузчик также записан не будет. Поэтому внесите указанные изменения и сохраните файл.
Теперь запускаем IDE из папки \DigisparkArduino-Win32\Digispark-Arduino-1.0.4\ и выполняем следующие действия:
На этом запись загрузчика в ATtiny85 завершена. Можно отсоединить микроконтроллер от программатора и попробовать загрузить в него скетч, следуя инструкции из предыдущей статьи.
Есть еще один момент, о котором стоит упомянуть. В файле boards.txt после значений конфигурационных байтов вы можете увидеть строку: digispark-tiny.bootloader.file=micronucleus-1.06-upgrade.hex - это имя файла загрузчика. Если вы захотите записать в ATtiny85 другую версию загрузчика, то нужно изменить имя файла в этой строке, а сам файл поместить в папку \DigisparkArduino-Win32\Digispark-Arduino-1.0.4\hardware\digispark\bootloaders\micronucleus\. О том, где можно скачать другие версии загрузчика и чем они отличаются, я хочу рассказать более подробно.
Версии Micronucleus
Micronucleus - это загрузчик с открытым исходным кодом, вы можете найти его на github. Там же доступны для скачивания скомпилированные релизы. На момент написания данной статьи актуальная версия загрузчика 2.04. Это переработанная и улучшенная версия по сравнению с предыдущей ветвью 1.x, последний ее релиз - 1.11. Последним официальным релизом для плат Digispark является версия 1.06, относительно использования других версий Micronucleus разработчики Digispark не дают никаких гарантий. Но это не значит, что они не будут работать. Итого перед вами 3 ссылки для скачивания интересующих релизов загрузчика.
Релизы micronucleus могут отличаться не только номером версии, но и модификацией. Например, если в имени файла загрузчика присутствует слово jumper, то это означает, что для загрузки новой программы в микроконтроллер необходимо будет установить джампер между пятым цифровым выводом (Reset) и землей. В противном случае загрузчик не будет ждать 5 секунд и сразу перейдет к выполнению программы. Загрузчики, в имени которых присутствует upgrade, позволяют перезаписывать сами себя, то есть выполнять обновление загрузчика без использования программатора. Это может быть полезным при использовании вывода Reset в качестве обычного цифрового пина, когда у нас нет возможности обновить загрузчик по SPI.
Способ 2. Запись загрузчика с использованием avrdude
Если у вас есть опыт работы с avrdude и нет желания скачивать очередную версию IDE только ради прошивки микроконтроллера, то этот способ для вас. Для начала скачаем файл загрузчика по одной из приведенных в предыдущем пункте ссылок. Я буду прошивать в ATtiny85 загрузчик t85_default.hex версии 2.04. Файл загрузчика нужно скопировать в папку с avrdude, чтобы в командной строке не пришлось указывать путь к нему. Напомню, что программа avrdude входит в состав IDE Arduino и находится в папке Arduino_dir\hardware\tools\avr\bin\, где Arduino_dir - это путь к IDE Arduino. Теперь, находясь в папке с avrdude, запускаем командную строку и вводим следующую команду:
avrdude -C ../etc/avrdude.conf -c arduino -p t85 -P com18 -b 19200 -U lfuse:w:0xF1:m -U hfuse:w:0xDF:m -U efuse:w:0xFE:m
Только не забудьте указать свой COM-порт, на котором висит Ардуино (ISP программатор). Данная команда установит нужные значения фьюзов. Будьте внимательны, т.к. неверные значения фьюзов могут залочить микроконтроллер. После проверки параметров подключаем Ардуино-программатор к компьютеру и выполняем команду. Ниже приведен мой результат выполнения:
Теперь вводим команду для записи загрузчика в микроконтроллер:
avrdude -C ../etc/avrdude.conf -c arduino -p t85 -P com18 -b 19200 -U flash:w:t85_default.hex
Опять же вместо com18 и t85_default.hex укажите свой номер COM-порта и имя файла загрузчика. Выполняем команду и дожидаемся ее завершения:
Запись загрузчика завершена! Отключаем микроконтроллер от программатора и проверяем его работу в отладочной плате, загрузив в него скетч Blink.
На этом всё. Надеюсь, данная статья вам помогла. Если остались вопросы, пишите в комментариях.
Представляю вашему вниманию новый компактный Bootloader для AVR Tiny 45/85. Данный автозагрузчик распространяется под лицензией GNU GPL, как того требует лицензия V-USB. Основой для данного автозагрузчика послужил ATtiny85 USB Boot Loader от Embedded Creations и его потомок micronucleus-t85, используемый платами Digispark.
Также как и вышеупомянутые, TinyHID Loader основан на библиотеке V-USB.
Ключевые особенности:
А почему вообще AVR Tiny 85?
Экономика должна быть экономной, господа. А с AVR Tiny x5 вы экономите дважды да ещё и в двух вопросах. Первый — это вопрос цены: «тиньки» дешевле «мег». Но персонально у Tiny x5 есть PLL генератор, позволяющий также отказаться от кварцевого резонатора. Так что экономим на нём да и на двух конденсаторах. Кроме того есть ещё и вопрос места на плате. В QNF корпусе таракан размером 2,5 на 2,5 мм. И снова нам не нужен резонатор. Всю схему можно легко уместить на смехотворных 12x5 мм. Как резюме — использование AVR Tiny 85 уместно всегда, и особенно для USB девайсов пока не появится необходимость в функционале, которого данный таракан не поддерживает (например когда нужно много IO портов)
А зачем специальный автозагрузчик?
Автозагрузчиков для AVR Mega пруд пруди, но с Tiny 85 всё не так просто. Для понимания этих сложностей, излагаю алгоритм работы классики:
- Если конфигурационный бит BOOTRST установлен в 0, то после перезапуска контроллер начинает исполнение не с нулевого адреса, а с Boot Reset Address (специфичен для разных моделей и может настраиваться).
- По Boot Reset Address располагается сам автозагрузчик, который первым делом перемещает таблицу прерываний на Boot Reset Address.
- автозагрузчик определяет, нужно ли грузиться ему самому или нет. Если нужно, то он запускается как обычная прошивка, хоть и расположенная не в нулевом адресе.
- Если загружать автозагрузчик не надо, то он перемещает таблицу прерываний обратно на нулевой адрес, и переводит туда же управление, тем самым загружая прикладную прошивку.
- Во время записи данных на Flash, автозагрузчик продолжает работать с USB протоколом, отвечая на запросы хоста.
- Также область памяти автозагрузчика является незаписываемой, что не даёт автозагрузчику повредить себя.
А теперь нюансы 85-ой Tiny:
- ATtiny всегда загружается с нулевого адреса, сконфигурировать его на другой адрес нельзя.
- Вектора прерываний также никуда не переносятся.
- Во время записи контроллер приостанавливает работу на 4.5 мс, и не на что не способен реагировать.
- Ну и аппаратной защиты от самозаписи у автозагрузчика тоже нет.
И способы обхода.
- Очищенная память заполнена единицами, которые трактуются контроллером как NOP. А это значит что после сброса, управление до автозагрузчика таки дойдёт. Хоть перед этим и будет выполнены полторы тысячи NOP-ов.
- Но для функционирования USB протокола этого ещё мало. Нужна также реакция на прерывание PCINT0. Таблицу векторов прерываний перемещать нельзя, но можно записать в эту таблицу адреса автозагрузчика. Поэтому сразу после первой загрузки автозагрузчик записывает в RESET и PCINT0 вектора адреса своих обработчиков.
- Во время записи прикладной прошивки автозагрузчик также заменяет RESET и PCINT0 вектора.
- Изначальные RESET и PCINT прикладной прошивки автозагрузчик пишет в адреса непосредственно перед автозагрузчиком.
- Доработка V-USB шного обработчика PCINT0 таким образом, чтобы он мог вызывать PCINT0 обработчик прикладной прошивки. Условием для работы обработчика автозагрузчика считаем TCCR1 == 0 && TCNT1 == 0xff. Иначе запускаем обработчик приложения.
- Задержка перед выполнением записи или очистки памяти. В это время контроллер успевает сообщить хосту о успехе операции, и хост его не теряет.
- После проведения операции очистки памяти, автозагрузчик всегда записывает свои вектора RESET и PCINT0.
- Перед записью прикладной прошивки, автозагрузчик производит очистку FLASH из конца в начало. Такое направление очистки гарантирует, что даже если процесс очистки/записи будет прерван неожиданным отключением питания, автозагрузчик останется в рабочем состоянии. Либо первая страница FLASH ещё не затёрта/уже записана, и управление на автозагрузчик перейдет по вектору. Либо очищена вся память, и управление перейдет на автозагрузчик через цепочку NOP-ов.
- Производится программная проверка записи в автозагрузчик вместо аппаратной.
Более подробно о особенностях работы автозагрузчика на AVR Tiny 85 можно почитать на сайте Embedded Creations на английском
А зачем изобретать велосипед?
Использование классических MEGA-вских автозагрузчиков на AVR tiny не возможно по причинам, описанным в предыдущей главе. Но даже без них есть 2 реализации автозагрузчика: ATtiny85 USB Boot Loader и micronucleus-t85, и обе они эмулируют некогда популярный программатор USBasp. А вышеупомянутый программатор работает на хосте через библиотеку libusb. Это замечательная и многофункциональная библиотека, и её использование под Mac OS или Linux элементарно как 2x2. И если вы свои творения собираетесь использовать сами, то TinyHID Loader вам может приглянуться разве что более компактными размерами. Но вот под Windows 8.1 x64 установка libusb драйвера уже не является тривиальной задачей. Глубоко-глубоко в настройках есть пункт, позволяющий разово перезагрузить компьютер с отключенной проверкой электронной подписи драйверов. И горе тому, кто будет объяснять типичному юзеру этот способ. Поэтому основной идеей было создание автозагрузчика, способного работать через HID Feature Report-ы. Для всех HID устройств используются стандартные драйвера ОС, и дополнительные ставить не надо. Также оказалось, что отказ от поддержки avrdude приносит возможность сократить вес загрузчика. При отключении всех опций кроме записи/очистки FLASH и программного выхода в прикладную прошивку, автозагрузчик весит 2кб, что меньше чем у конкурентов.
А как использовать?
Для начала нужно сконфигурировать прошивку. Для этого нужно скорректировать файл firmware/usbloader/usbloader.h под вашу схему и ваши нужды:
При этом не нужно заботиться, чтобы USB_CFG_DPLUS_BIT попал на ногу INT0, так как автозагрузчиком используется прерывание PCINT0, которое можно сконфигурировать на любую ногу.
В приведённом выше варианте загрузчик укладывается в 2кб, хотя и впритык. Включение любых дополнительных опций выведет его за эти пределы, и придётся заодно менять его расположение в памяти. Делается это по разному в зависимости от того, используете ли вы AtmelStudio, или Makefile
Atmel Studio
Удостоверьтесь, что выбрана конфигурация Release.
Откройте свойства проекта, перейдите на вкладку Toolchain, и в пункте «AVR/GNU Linker/Memory Settings» уменьшите значение ".text=0xc00". Уменьшать можно только порциями по 32 слова. То есть 0xbe0, 0xbc0, 0xba0. 0xba0 хватит для работы всех доступных опций, дальше уменьшать не надо. Помимо этого, нужно также уменьшить значение константы BOOTLOADER_WADDRESS. Это можно сделать на странице «AVR/GNU C Compiler/Symbols». Значение должно равняться значению ".text bash">TinyLoaderCmd.exe firmware.hex
А если в вашей прошивке добавить функцию загрузки автозагрузчика:
То перепрошивка превратиться для пользователя в нажатие одной кнопки. А ваш проект в то время:
- Сообщит вашей прошивке, что нужно загрузить автозагрузчик.
- Дождётся (Loader.TryGetLoader) момента, когда система подцепит автозагрузчик.
- Запишет новую прошивку.
- Сообщит автозагрузчику, что нужно загрузить прошивку.
- Дождётся момента, когда система подцепит вашу новую прошивку.
А если понадобился другой набор опций?
Поставили полный набор опций и новая прошивка теперь не влезает? Или жалеете, что не добавили возможность чтения памяти? Ну или вам вообще не подходит TinyHID Loader, и без avrdude жизнь не мила? А ведь микроконтроллер уже не только прошит, но и запаян. И выпаивать его совсем не хочется. Не вопрос — TinyHID Loader умеет перерошивать сам себя!
Алгоритм самоперепрошивки такой:
В конце концов, ПРОСТО загрузить USB-Linux c arduino ide под него.
Нет-же, в этот раз свет клином сошелся на Диджиспарке и ДЕСЯТКЕ — зря что-ли платил $3 за ESD-лицензию?.
"Уж если я чего решил, то выпью обязательно" пел Высоцкий, и как Вы поняли — таки да!
Ладно, с присказками закончили — бутаем комп, заходим в биос.
Находим пункт устройства/порты — USB — да, Digispark не работает с USB-3
Отключаем совместимось USB3-Disable (У некоторых просто может выставляться режим порта — ставим USB-2 Compatible)
У меня этот пункт назывался xHCI — Disable
Не торопитесь выходить — включите отладку — Debug-Enable
Опять на моем биосе эта функция зовется иначе — EHCI — Enable
Гуд? Загрузили винду?
Не торопитесь входить в ArduinoIde!
Снесите для начала Все установленные ранее дрова под digistump/digispark!
WIN-x — выполнить — regedit — поиск ищем digistump в реестре и беспощадно удаляем, F3 — поиск дальше!
Повторяем процедуру со словом digispark.
Контролный reboot в голову — винда все-же ;-)
Теперь нам нужно сделать две закачки — правильный комплект дров с лоадером — micronucleus по ссылке
У меня это была версия micronucleus-2.0a4-win.zip
Еще нужна прога ArduinoIde с предустановленной поддержкой Digispark-a — идем сюда:
качаем последний ArduinoIDE, моя версия(на 07.06.2018) — DigisparkArduino-Win32-1.0.4-May19.zip, извлекаем содержимое.
На 64-битке — работает!
Распаковываем/сетапим наш микронуклеус драйвер.
Окей, запускаем DigisparkArduino версии 1.0.4!
Старый? А Вам Шашечки или Ехать?
Its a Sparta — это винда!
Лулзов добавляет, трейдмарк Sparta, под которым у меня импульсный паяльник и набор отверточек.
Но не торопитесь подключать плату в Usb порт!
Выбираем (в ArduinoIDE ) Сервис-Плата-Digispark (Tiny Core)
Наконец пришло время поморгать светодиодом ;-)
Загружаем Ctrl-U (ведь правда мы еще не вставляли плату в ЮСБ? ЭТО ВАЖНО!!)
Вот только после такой надписи внизу — включаем Digispark в порт.
иначе он будет бесцельно блинкать появляясь и исчезая в устройствах — как первый спутник земли!
Если ВСЕ пункты выполнялись внимательно и последовательно, то мы получим подобную картинку
Читайте также: