USBTiny-MkII slim - компактный и быстрый USB-программатор для микроконтроллеров AVR, совместимый с фирменным программатором AVRISP-MKII от Atmel. Немалая стоимость оригинала поспособствовала появлению его многочисленных клонов, и самым удачным из них, пожалуй, является именно USBTiny-MkII SLIM. Устройство может программировать все 8-разрядные AVR-микроконтроллеры, обладающие возможностью внутрисхемного программирования (поддерживаются интерфейсы ISP, TPI и PDI).
MkII обладает следующими возможностями:
Интерфейс TPI (Tiny Programming Interface) используется для программирования low-end микроконтроллеров Atmel серий ATtiny4, ATtiny5, ATtiny9, ATtiny10, ATtiny20, ATtiny40. TPI по сути обычный USART с двунаправленной линией данных (TPIDATA), тактовым сигналом (TPICLK) и линией сброса (RESET). Подробнее об этом интерфейса можно почитать в атмеловском документе AVR918. Также для этого документа доступны исходные коды прошивки программатора TPI на основе микроконтроллера ATmega324P.
Про интерфейс PDI можно почитать в атмеловском документе AVR1612.
Высокая скорость работы обеспечивается использованием микроконтроллеры AT90USB162 с аппаратной поддержкой USB. Кроме микроконтроллера на плате программатора имеется двунаправленный преобразователь уровня напряжения GTL2003, LDO-стабилизатор (MCP1825S-3302ED) на 3.3В, джампер для выбора напряжения питания программируемого МК (3.3В/5В) и пара светодиодов-индикаторов режима работы.
Схема показана на рисунке:
Сборка печатной платы не должна вызывать проблем. Стоит только заметить, что стабилизатора IC3 имеет специфическую цоколёвку и не получится вместо его поставить распространённую микросхему вроде AMS1117. Тут надо ставить LF33, либо MCP1825S-3302ED, либо другой, совместимый по выводам. Также не стоит пытаться заменять преобразователь уровней GTL2003 на более распространённый и дешёвый MAX2003 - с последним будет работать плохо и нестабильно.
Светодиод LED1 можно поставить зелёного цвета свечения - он сигнализирует о подаче питания, LED2 горит при активности устройства (т.е., при чтении/записи в МК), тут более уместен, например, красный цвет свечения.
Плата в сборе выглядит так:
Микроконтроллеры AT90usb162 хороши тем, что для их программирования не нужен программатор, т.к. они поставляются с уже прошимым bootloader-ом, и прошивку можно "залить" подключив устройство через USB порт. Но это (как правило) не относится к микросхемам, купленным в Китае. У последних bootloader традиционно отсутсвует. Если вы оказались "счастливым" обладателем такого МК, то придётся прошивать загрузчик самостоятельно. Это можно сделать любым другим AVR-программатором (например, usbasp) временно подпаяв проводки MISO/MOSI/SCK/RESET и питание прямо к платке. Я для этих целей соорудил платку-адаптер под разъём TQFP-32. Прошивку загрузчика можно найти в сети, либо скачать по ссылке внизу этой статьи. Также не помешает проверить FUSE-биты, они должны бать такие: HIGH = 0xD9, LOW = 0xDE
Когда загрузчик на месте, программатор можно подключать к USB и загружать в него прошивку. Для этого в интернетах обычно предлагают использовать утилиту FLIP, которая выложена на сайте Atmel, причём, разных версий и под разные ОС. Последняя верися 3.4.7 без встроенной явы не запустится на 64-битных ОС выдав ошибку о том, что Java-виртуальная машина не найдена (хотя ява стоит). Аналогичная сборка со встроенной явой выдаст точно такую же ошибку. Чтобы выяснить причину такого безобразия, я расковырял файл flip.exe и обнаружил внутри его jar-файл (он расположен почти в самом начале экзешника, и легко ищется в hex-редакторе по сигнатуре 'PK' и последующему характерному заголовку jar-ки). Вырезав и запустив этот jar, я получил ошибку JNI при загрузке динамических библиотек, которые оказались 32-битными. Вывод: дання утилита в принципе не будет работать в 64-битной Windows (причём, на сайте Atmel об этом ни слова не сказано). Ещё можно скачать старую версию FLIP 2.4.6, которая написана на чистой яве и прекрасно работает везде, в том числе и на 64-битных ОС. Но эта версия не поддерживает AT90usb162. Итог - про FLIP лучше навсегда забыть.
Atmel Studio умеет прошивать AT90usb162 "из коробки". Для этого идём в главное меню, Сервис -> Device Programming, или нажимаем Ctrl+Shift+P. В появившемся окне выбираем инструмент "Atmel Mega DFU" и микроконтроллер AT90USB162:
Теперь перейдя на вкладку Memories, можем читать и писать прошивку и фьюзы:
Прошивка программатора основана на проекте AVRISP-MKII из библиотеки LUFA с открытым исходным кодом. Пара слов о её конфигурировании:
Частота кварца может быть 8 МГц или 16 МГц и задаётся в файле Projects/AVRISP-MKII/makefile, параметр F_CPU, по умолчанию там 16 МГц.
В файле конфигурации Projects/AVRISP-MKII/Config/AppConfig.h помимо конфигурации выводов МК есть парочка интерсных параметров:
#define RESET_TOGGLES_LIBUSB_COMPAT
// #define FIRMWARE_VERSION_MINOR 0x11
Первый параметр включает возможность быстрого переключения между режимами Jungo (который для Avr/Atmel Studio) и LibUSB (для avrdude) драйвером в одной
прошивке. Для переключения режимов достаточно замкнуть джампер сброса (RST), после чего в системе появится отдельное устройство с другим
серийным номером. При этом программатор моргнёт светодиодами два раза, если находится в режиме Jungo и четыре раза, если включен режим LibUSB.
В обоих случаях потребуется установка соответствующих драйверов (это касается Windows, в Linux и MacOS libusb установлен “из коробки”).
Кстати, программатор запоминает последний выбранный режим, и после повторного подключения он стартует именно в нём. А ещё он запоминает
последнюю используемую частоту SCK. И всё это включается параметром RESET_TOGGLES_LIBUSB_COMPAT
. По умолчанию этот параметр включен.
Иногда после выхода очередного обновления для AtmelStudio возникали проблемы - программатор переставал поддерживаться, т.к. его версия
оказывается ниже требуемой. В этом случае надо раскомментировать параметр FIRMWARE_VERSION_MINOR
и указать в нём версию прошивки.
Например, у меня AtmelStudio 7 захотела прошивку версии не ниже 1.18, вместо обнаруженной 1.14. После раскомментирования параметра
FIRMWARE_VERSION_MINOR
и установки его в 0x18 проблема была решена. На всякий случай, я увеличил его (с запасом) до 0x30,
скомпилированную прошивку можно скачать в конце статьи.
Корпус я решил распечатать на 3d-принтере, для чего была спроектирована моделька. Т.к. для программирования через ISP-разъём обычно используются 10-проводные шлейфы, то для удобства работы решено было добавить ещё 10-пиновый ISP-разъём. Последний вынесен на заднюю стенку корпуса. Сам корпус состоит из двух половинок, которые склеиваются между собой. Под джамперы, светодиоды и разъёмы программатора (и подписи к ним) сделаны окошки.
Вот так выглядит получившаяся 3d-моделька:
В нижней половине сделаны углубления для выступающих частей джамперов, в итоге плата ложиться на дно корпуса и плотно там фиксируется.
Корпус я печатал из ABS-пластика. Для придания ему большего эстетизма, корпус был отшлифован и обработан в ацетоновой бане. Т.к. под рукой не было мелкой наждачки, шлифовал лезвием обычного канцелярского ножа, располагаемым перпендикулярно обрабатываемой поверхности. После того, как поверхность распечатки стала более-менее ровной, детали были помещены на 30 минут в ёмкость с парами ацетона.
Вот как выглядел корпус до (снизу на фото) и после (сверху на фото) постобработки:
Плата в корпусе:
Для 10-пинового разъёма был вырезан небольшой кусок макетной платы (из стеклотекстолита) чтобы предотвратить продавливание контактов в будущем. После впаивания разъёма в такую платку, они точно никуда не денутся. После чего разъём подпаивался проводками с обратной стороны платы программатора и приклеивался суперклеем к нижней части корпуса. В завершении две половинки корпуса склеивались между собой.
При использовании avrdude надо в командной строке задать тип программатора так: -c avrisp2 -P usb
или так -c avrispmkII -P usb
.
При работе с AtmelStudio сначала необходимо установить драйвера. После первого включении программатора в USB-порт чего драйвера должны установиться автоматически. Если этого не произошло, то надо вручную указать каталог, в который установлена AtmelStudio. Устройство успешно работает как с AvrStudio4, так и с AtmelStudio6, как в 32-битный, так и в 64-битных версиях Windows.
Не знаю, на счёт более ранних версий, но AtmelStudio7 точно умеер работать с libusb-драйвером. Таким образом, можно смело переводить программатор в режим libusb (замыканием джампера RST так, чтобы после перезапуска оба светодиода моргнули два раза одновременно) и забыть про режимы.
Драйверы LibUSB под Windows проще всего установить автоматическим установлятором драйверов Zadig. Под Linux и MacOS ничего устанавливать не продётся. После скачивания Zadig в меню Options включаем "List All Devices". После чего из списка устройств выбираем "AVRISP mkII" (сначала надо перевести программатор в режим libusb). Осталось нажать кнопку для смены текущий драйвера на libusb-win32.
Если в будущем возникнет необходимость обновить прошивку MkII, то сначала замыкается джампер HWB, затем RST, после чего устройство определяется студией как "Atmel Mega DFU".