воскресенье, 16 декабря 2018 г.

Прошиваем загрузчик micronucleus в ATtiny85

Отладочная плата ATtiny85. Micronucleus
Обычно для программирования микроконтроллеров используют программаторы - устройства, которые работают напрямую с памятью микроконтроллера и размещают в ней программу. Так при знакомстве с 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), подключаем Ардуино к компьютеру и загружаем в нее скетч.

Arduino as ISP. Запись загрузчика в ATtiny85


Подключение ATtiny85 к программатору

Подключая микроконтроллер к ISP программатору, нужно помнить, что программирование осуществляется по линиям связи SPI: выводы MOSI, MISO и SCK программатора и ATtiny85 должны быть соединены; вывод SS программатора соединяем с выводом RESET ATtiny85. И остается запитать микроконтроллер, соединив его VCC и GND с соответствующими выводами Ардуино. Возможно, потребуется установка электролитического конденсатора между GND и RESET Ардуино для предотвращения автоматической перезагрузки. Схема подключения показана ниже.

Подключение ATtiny85 к Ардуино для записи загрузчика

Тема использования Ардуино в качестве программатора была подробно описана ранее, поэтому, если возникнут вопросы, посмотрите статью Arduino as ISP - программатор из Ардуино.

Запись загрузчика в ATtiny85

Записать загрузчик в ATtiny85 можно разными способами. Я опишу два из них: 
  • с использованием среды разработки Ардуино, заточенной под Digispark. В этом случае запись загрузчика выполняется стандартными средствами IDE;
  • с использованием командной строки и программы avrdude, входящей в состав IDE Ардуино.
Выбирайте, какой вам способ удобнее.

Способ 1. Запись загрузчика из IDE Ардуино

Перейдите по ссылке https://sourceforge.net/projects/digistump/files/ и скачайте архив c IDE Ардуино, их там несколько версий. На данный момент самой свежей является версия 1.0.4 от 19.05.2013, ссылка для скачивания: DigisparkArduino-Win32-1.0.4-May19.zip

Распакуйте архив. Перейдите в папку \DigisparkArduino-Win32\Digispark-Arduino-1.0.4\hardware\digispark\, в ней нас интересует файл boards.txt, откройте его в текстовом редакторе и найдите строку digispark-tiny.bootloader.high_fuses=0x5f:

Редактирование фьюзов Digispark в файле boards.txt


Сейчас в этой строке указано значение 0x5f, его нужно изменить на 0xdf. Это значение старшего конфигурационного байта позволит использовать первый вывод микроконтроллера как вход внешнего сброса. Если вы не измените указанное значение, то при записи загрузчика из среды Ардуино первыми в микроконтроллер будут записаны конфигурационные байты, тем самым лишив вас вывода Reset и возможности дальнейшей работы с микроконтроллером. Соответственно, загрузчик также записан не будет. Поэтому внесите указанные изменения и сохраните файл.

Теперь запускаем IDE из папки \DigisparkArduino-Win32\Digispark-Arduino-1.0.4\ и выполняем следующие действия:

  1. Подключаем Ардуино к компьютеру. ATtiny85 уже должен быть подключен к Ардуино по приведенной схеме.
  2. В меню Сервис - Плата выбираем значение Digispark (Tiny Core).
  3. Выставляем последовательный порт.
  4. В меню Сервис - Программатор выбираем значение Arduino as ISP.
  5. Записываем загрузчик в ATtiny85 командой Сервис - Записать загрузчик и дожидаемся сообщения о завершении операции.

На этом запись загрузчика в 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 программатор). Данная команда установит нужные значения фьюзов. Будьте внимательны, т.к. неверные значения фьюзов могут залочить микроконтроллер. После проверки параметров подключаем Ардуино-программатор к компьютеру и выполняем команду. Ниже приведен мой результат выполнения:

Запись фьюзов в ATtiny85 для записи загрузчика Micronucleus

Теперь вводим команду для записи загрузчика в микроконтроллер:

avrdude -C ../etc/avrdude.conf -c arduino -p t85 -P com18 -b 19200 -U flash:w:t85_default.hex

Опять же вместо com18 и t85_default.hex укажите свой номер COM-порта и имя файла загрузчика. Выполняем команду и дожидаемся ее завершения:

Запись загрузчика Micronucleus в ATtiny85 при помощи avrdude

Запись загрузчика завершена! Отключаем микроконтроллер от программатора и проверяем его работу в отладочной плате, загрузив в него скетч Blink.

На этом всё. Надеюсь, данная статья вам помогла. Если остались вопросы, пишите в комментариях.

15 комментариев:

  1. Для Attiny13 такое можно сделать ?

    ОтветитьУдалить
    Ответы
    1. Нет.
      Вообще версии Micronucleous начиная с 2.0 поддерживают все микроконтроллеры семейства tiny. Но для загрузчика требуется чуть менее 2КБ памяти, тогда как в ATtiny13 ее всего 1КБ.

      Удалить
  2. Жаль, а в описании платы(фото в самом верху) написано , что поддержка Attiny13.
    Спасибо.

    ОтветитьУдалить
  3. Доброй ночи,
    пытаюсь повторить прошивку загрузчика в чистый Attiny85
    Если по второму варианту, то такая ошибка

    D:\Digispark-Arduino-1.0.4\hardware\tools\avr\bin>avrdude -C ../etc/avrdude.conf -c arduino -p t85 -P com8 -b 19200 -U lfuse:w:0xF1:m -U hfuse:w:0xDF:m -U efuse:w:0xFE:m
    Running AVRDUDE...

    avrdude_original: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
    avrdude_original: AVR device initialized and ready to accept instructions

    Reading | ################################################## | 100% 0.05s

    avrdude_original: Device signature = 0x1e9005
    avrdude_original: Expected signature for ATtiny85 is 1E 93 0B
    Double check chip, or use -F to override this check.

    avrdude_original done. Thank you.

    Это у меня не правильная тинька? Хотя на чипе написано верно все..

    ОтветитьУдалить
    Ответы
    1. это с резистором между ресет и питанием.
      а без резистора вообще

      avrdude: stk500_recv(): programmer is not responding
      avrdude: initialization failed, rc=-1
      Double check connections and try again, or use -F to override
      this check.

      avrdude: stk500_recv(): programmer is not responding

      avrdude done. Thank you.

      Удалить
    2. Добрый день.
      Судя по сигнатуре 0x1e9005 у вас ATtiny12. В него загрузчик записать не получится, памяти мало.

      Удалить
    3. а резистор не нужен между сбросом и питанием? просто так то ошибка другая, гуглил нашел у иностранцев, что они шьют загрузчик с резистором, добавил - стал писать неверную сигнатуру.
      а теперь вот думаю, что похоже зря я его добавил..

      Удалить
    4. Нужен. Ошибка другая потому что без резистора ардуино (программатор) перезагружается, вместо того чтобы отозваться на обращения от avrdude. Поэтому последний и говорит "programmer is not responding".

      Удалить
    5. Вот я олень..
      Конденсатор то на ардуино (программатор) я подключил сразу, чтобы не сбрасывалось. Но не взлетело.
      Начал читать иностранцев и неправильно понял их - они иногда резистор подключают вместо конденсатора, а меня чето замкнуло (видать нельзя ночью ковыряться :)) что это они говорят подключить еще резистор между ногами тиньки. Вот я его воткнул в макетку - получилось у меня конденсатор на программаторе и резистор на программируемой тиньке..
      Получается если резистор убрать - будет опять твоя схема и там "programmer is not responding". Походу контакты плохие или спалил что-то. Попробую подпаяться сразу к ногам AT85 и попробовать еще раз.
      спасибо

      Удалить
  4. Добрый день.
    При попытке произвести загрузку бутлоадера, ругается на любой файл hex
    Invalid file format. В чем может быть причина?

    ОтветитьУдалить
    Ответы
    1. Добрый день!
      Если ругается на формат, то, вероятнее всего, в этом и проблема. Откуда взят hex?

      Удалить
    2. Разобрались в чем ошибка?
      На днях ко мне обратились с вопросом по прошивке usbasp. avrdude выдавал:
      avrdude: invalid file format '\usbasp.atmega8.2011-05-28.hex' in update specifier
      avrdude: error parsing update operation 'flash:w:c:\usbasp.atmega8.2011-05-28.hex'

      У вас так же? Если да, то дело не в формате файла, а в том, как указан путь к нему в команде. Переместите файл прошивки в папку с avrdude и попробуйте без указания пути.

      Удалить
  5. Этот комментарий был удален автором.

    ОтветитьУдалить
  6. Прошу подсказать параметры конденсатора.
    Спасибо

    ОтветитьУдалить
    Ответы
    1. Я использовал на 10мкФ. Не обязательно именно такой ёмкости, можно подобрать экспериментально.

      Удалить