Идея этого устройства у меня возникла, когда я натолкнулся на исходники программатора USBasp на GitHub. Покопавшись немного в исходных кодах, я подумал, а почему бы просто не переписать функции работы с программируемым микроконтроллером по SPI протоколу на функции программирования по параллельному высоковольтному протоколу. Это позволит работать с «залоченными» неправильно установленными fuse-битами микроконтроллерами с помощью привычных всем инструментов, основанных на avrdude да ещё и по USB! Тем более, что сама avrdude является, к тому же, кроссплатформенной утилитой, и под неё написано много графических оболочек на любой вкус.
За основу программатора я решил взять микроконтроллер Atmega16, так как он имеет достаточное количество портов ввода/вывода, стоит недорого, в пределах 1-1,5$ на aliexpress, при покупке партией в 5-10 штук и имеет достаточное количество памяти. При желании исходный код можно легко адаптировать под Atmega8535/32/64/644 без изменения схемы. Можно было бы использовать Atmega8/88/168/328, но тогда не хватило бы портов на джамперы и светодиоды.
Схема программатора также основана на схеме оригинального USBasp, только в отличии от него дополнительно на борту имеется DC-DC преобразователь напряжения (на микросхеме mc34063a, при отсутствии данной микросхемы можно использовать готовый модуль или вообще подать 12В отдельно с внешнего блока питания), ключи управления напряжениями 5В и 12В (на транзисторах Q1,Q2,Q3 и Q4) для программируемого микроконтроллера и разъём (P1) для программирования в параллельном режиме. Подключение к шине USB, джамперы, светодиоды и стандартный ISP разъём аналогичны таковым в оригинальном USBasp.
Плата программатора при использовании большинства компонентов в SMD исполнении получилась очень компактной — 55х45 мм.
Возможно, кто-то обратит внимание на большое количество незадействованных контактов разъёма для программирования. Это сделано так, потому что у меня уже имелись адаптеры для некоторых корпусов AVR от другого программатора, и мне не хотелось делать новые, в общем — унификация!
На моей плате дополнительно выведен разъём сигналов UART. Это было необходимо для отладки прошивки и разбора исходного кода. Хотя исходники есть в свободном доступе, было не совсем понятно, как работают некоторые функции, а конкретно — чтение ID, чтение/запись fuse и lock битов. Поэтому при написании прошивки пришлось создавать сразу два проекта: первый — это обычный USBasp, адаптированный под Atmega16 и дополнительно с настроенным UART для получения отладочной информации, второй — это уже основной проект с функциями параллельного программирования. Первый проект был нужен, во первых, чтобы проверить в целом работоспособность исходников на Atmega16 (в частности — софтового USB), во вторых — понять логику работы avrdude (для этого пришлось расставлять отладочные «ловушки» с выводом информации по UART). Во втором (основном) проекте уже отлаживалась работа параллельного интерфейса.
Про два проекта я рассказал не просто так. Данная плата программатора может работать в двух режимах: как обычный USBasp через ISP разъём, так и в параллельном режиме. Но, к сожалению, не одновременно (хотя, при желании, можно это реализовать с некоторыми ограничениями, так как память Atmega16 заполнена примерно на 40%, возможно, когда-нибудь добавлю такую функцию). А на данный момент есть две отдельные прошивки.
В итоге была реализована работа с большинством видов микроконтроллеров AVR8 с различными способами программирования в высоковольтном режиме: AVR с полной шиной управления (это основная масса в корпусах от 28 ног и более, такие как Atmega48/8/88/168/328/8515/8535/16/32/128/2560 и т.д.), AVR с объединёнными сигналами программирования (такие как Attiny2313/2323 и т.д.), AVR с последовательным высоковольтным программированием (в корпусах менее 20 ног, в основном в 8-ногих — attiny25/45/85 и т.д.).
Из функций реализовано: чтение ID, чтение и запись fuse и lock битов, стирание, чтение и запись flash, чтение eeprom, запись eeprom реализована только для AVR с последовательной шиной высоковольтного программирования, так как остальные используют постраничную запись eeprom, а USBAsp — побайтную. Адаптация функций записи flash оказалось не тривиальной задачей, так как принципы записи в последовательном и параллельном режимах немного отличаются (в частности, при последовательном программировании младший и старший байты слова можно добавлять в страницу по отдельности, а при параллельном только вместе), поэтому пришлось добавить некоторые ухищрения и костыли в код.
Также я не удалял из прошивки функции программирования по шине TPI (но не проверял их работу, так как у меня нет соответствующих микроконтроллеров). Файлы прошивок будут прикреплены в конце статьи.
Минусом программирования AVR в параллельном режиме — является необходимость подключения большого количества сигналов (около 20), в отличие от «6 проводков» ISP. Поэтому для разных корпусов нужны адаптеры. Я нарисовал схему подключения некоторых самых ходовых корпусов AVR:
Также в конце статьи, кроме основной платы программатора, я добавлю рисунки плат адаптеров в формате *.lay6.
Схемы подключения других моделей AVR можно посмотреть в datasheet в разделе «Memory programming», все datasheet-ы есть в открытом доступе.
Ну и последнее — это софт. В качестве софта используется обычная avrdude (консольная версия или любая оболочка, вроде SinaProg, Khazama, Avrdudes или любая другая на Ваш вкус). Скорость SCK в программаторе можно не выбирать, так как она ни на что не влияет. Работа ничем не отличается от обычного USBAsp-а.
Работу программатора я проверил на нескольких микроконтроллерах (различными типами подключения) на Wingows x64 и на Linux aarch64. Прошивал микроконтроллер и устанавливал его в конечное устройство, всё работает. Также сама avrdude всегда верифицирует прошитые данные после записи, всё проходит без сбоев (кроме не реализованной записи eeprom, как я писал выше).
Данный проект также есть на GitHub. Также там имеются исходники. Все обновления буду выкладывать там.
На этом — всё. Если моя статья кому-то понравилась, не поленитесь поставить сердечко под статьёй.
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
U1 | МК AVR 8-бит | ATmega16 | 1 | |||
U2 | DC/DC импульсный конвертер | MC34063A | 1 | |||
Q1, Q3 | Биполярный транзистор | MMBT3904 | 2 | |||
Q2 | Биполярный транзистор | КТ502Е | 1 | |||
Q4 | Биполярный транзистор | BC856 | 1 | |||
D1, D2 | Стабилитрон | BZV55-B3V6 | 2 | |||
D3, D4 | Диод Шоттки | 1N5819 | 2 | |||
R1, R2 | Резистор | 68 Ом | 2 | |||
R3, R4 | Резистор | 10 кОм | 2 | |||
R5 | Резистор | 0.22 Ом | 1 | |||
R6 | Резистор | 180 Ом | 1 | |||
R7, RPUP | Резистор | 1.5 кОм | 2 | |||
R8 | Резистор | 12 кОм | 1 | |||
R9 | Резистор | 810 Ом | 1 | необходим подбор номинала | ||
R10, R11, R14, R15 | Резистор | 1 кОм | 4 | |||
R12, R16 | Резистор | 4.7 кОм | 2 | |||
R13, R17 | Резистор | 2.2 кОм | 2 | |||
R18-R20 | Резистор | 680 Ом | 3 | |||
C1, C2 | Конденсатор | 18 пФ | 2 | |||
C3-C5 | Конденсатор | 0.1 мкФ | 3 | |||
C6 | Конденсатор | 10мкФх10В | 1 | |||
C7 | Конденсатор | 510 пФ | 1 | |||
C8 | Конденсатор | 100мкФх25В | 1 | |||
X1 | Кварцевый резонатор | 16MHz | 1 | |||
Led1-Led3 | Светодиод | любой | 3 | |||