Меню

Программатор для arduino своими руками

Программатор для arduino своими руками

Универсальный AVR-программатор на Arduino.

Автор: AV_K
Опубликовано 31.10.2016
Создано при помощи КотоРед.

Как то понадобилось мне позаливать скетч из Arduino IDE в мелкий восьминогий ATTiny85, как правило, для этого используется Arduino с соответствующим скетчем ArduinoISP. Несколько китайских клонов Arduino Nano у меня имелось, поэтому и использовал их. Все бы хорошо, но мне не недоставало одного вывода. Точнее он имеется у тини (вывод RESET), но чтобы задействовать его как цифровой вход, нужно запрограммировать соответствующий фьюз. С помощью ArduinoISP это можно сделать только один раз, и последующие попытки заливки скетчей с помощью этого и других программаторов ISP становятся невозможными, поскольку вывод с функцией RESET становится не доступным. Если дальнейшей модификации скетча (программы) не требуется, то и проблем нет, но в процессе разработки какого то устройства требуется неоднократная перепрошивка мк. Выход из этой ситуации один – использование высоковольтного программатора. Для AVR контроллеров с выводами 8, 14 используется высоковольтное последовательное программирование, а для мк с выводами 20 и больше – высоковольтное параллельное. Я озадачился поиском подобного программатора, но для меня было принципиально важно, чтобы он был на основе Arduino и работал из под Arduino IDE. Рассматривал вариант использования восстановителя фьюзов для тини, но уж очень хлопотная получается перепрошивка. Это нужно сначала восстановить фьюз, затем перепрошить мк, затем фьюз и т.д. В силу своих скромных способностей в программировании, вариант самому написать скетч для высоковольтного программатора на Arduino отпадал. А вот поиск в инете увенчался успехом. Спасибо парню по имени Matthias Neerache, который создал для нас этот уникальный софт для ардуино.

Итак, какие функции умеет выполнять Arduino под управлением этой «подопытной обезьяны» (ScratchMonkey). Из мануала —

ScratchMonkey использует расширенную версию протокола STK500v2. Он реализует следующие методы программирования:

— ISP (In-Sistem Programming) внутрисхемное программирование использует 4х проводный протокол SPI для программирования и поддерживается почти всеми AVR мк. Главный недостаток – при определенных установках фьюзов может быть не пригодным для использования. В ISP режиме ScratchMonkey работает аналогично встроенному в IDE ArduinoISP программатору. Однако, ScratchMonkey немного более универсальный, поддерживает микроконтроллеры с более чем 128КБ флэш-памяти, и может работать с различными настройками фьзов определяющих режим генератора тактовой частоты мк. Имеет дополнительный выход XTAL (сигнал тактовой частоты), что позволяет запрограммировать мк с настройкой фьюзов на внешний генератор. Кроме того, ScratchMonkey может эмулировать SPI (на те же пины) на более низкой частоте чем аппаратный SPI (Limp Mode), что позволяет программировать мк с внутренним генератором тактовой частоты, настроенным на 128 кГц.

— HVSP (High Voltage Serial Programming) высоковольтное последовательное используется для программирования мк 8 и 14 пин и не зависит от состояния фьюзов. Требует внешний источник 12В и транзисторный ключ для подачи высокого напряжения на RESET пин.

— HVPP (High Voltage Parallel Programming) высоковольтное параллельное используется для программирования мк от 20 пин и выше, не зависит от состояния фьюзов. Также требует внешний источник 12В и транзисторный ключ для подачи высокого напряжения на RESET пин.

Читайте также:  Реконструкция дверей межкомнатных своими руками

— TPI (Tiny Programming Interface) Тини программный интерфейс для мк семейства ATtiny4/5/9/10 (SOT23-6 package). ТПИ использует только 3 вывода, и может работать либо в режиме низкого напряжения или в режиме высокого напряжения. RESET пин может использоваться как обычные линии ввода/вывода.

Более чем достаточно функций для моих целей. Для начала тестирования составил простейшую схему (рис.1) на основе диаграммм из мануала ScratchMonkey и изготовил на макетке типа шилда для Arduino Nano (клона), Рис.2,3 (только ISP и HVSP режимы). Транзистор любой n-p-n.

Для начала этот программатор нужно “прописать” в ArduinoIDE . Делаем так: в папке ScratchMonkey/hardware/scratchmonkey , находим и открываем файл programmers.txt , копируем из него строки:

scratchmonkey_stk500v2.name=ScratchMonkey (STK500 Mode)
scratchmonkey_stk500v2.communication=serial
scratchmonkey_stk500v2.protocol=stk500v2

scratchmonkey_stk500v2_hvsp.name=ScratchMonkey HVSP (STK500 Mode)
scratchmonkey_stk500v2_hvsp.communication=serial
scratchmonkey_stk500v2_hvsp.protocol=stk500hvsp

Вставляем эти строки в аналогичный файл IDE: arduino-1.6.12/hardware/arduino/avrp/rogrammers.txt. Добавляем к этим строчкам еще по 3 строки (выделены на рис.4), без них не работает. Открываем ArduinoIDE и видим, что добавились два программатора ScrstchMonkey (Рис.5).

В IDE открываем скетч ScratchMonkey.ino и прежде чем залить в Arduino добавим одну строчку. Дело в том, что при высоковольтном последовательном программировании было выявлено, что пин D11Arduino, подающий напряжение питания на мк при обращении к нему остается в 1, а значит программируемый мк остается под напряжением все время, что «не есть гуд». Я не знаю с какой целью автор это упустил, но при параллелном программировании питание отключается после обращения к мк. Открываем вкладку с файлом SMoHWIF_HVSP.h, находим функцию Stop() и добавляем строку digitalWrite(HVSP_VCC, LOW) Рис.6.

Компилим и заливаем скетч в Arduino (без шилда). Вставляем Arduino в шилд, подключаем к разъему (ISP или HVSP) через переходник Attiny. Для режима HVSP подключаем 12V. В пункте Инструменты/Программатор выбираем соответствующий программатор (Рис.5). В пункте «Плата» выбираем предварительно установленные тини. Как добавить ATTiny в IDE здесь. Открываем в IDE файл скетча для тини и заливаем в мк кнопкой «Загрузка» или «Загрузить через программатор».

Что бы сделать действительно универсальный программатор AVR микроконтроллеров из Arduino родилась такая схема, Рис.7, реализующая все возможности ScratchMonkey.

Как видим схема гораздо проще, по сравнению с программаторами с аналогичными возможностями. На линии портов установлены ограничительные резисторы 1кОм, с целью предотвращения кз на этих линиях при неблагоприятных условиях. DD2 – dc/dc конвертер на микросхеме ME2149F 5/12V c Aliexpres Рис.8.

Или самодельный на MC34063, Рис.9. Рис.9

SA1 включает высокое напряжение и переключает низковольтный и высоковольтный режимы. Светодиоды показывают состояние программатора. Разъем XR1 (Debag) для дополнительной отладки программатора, если что-то пойдет не так и сообщений avrdude не достаточно. Подключается к выводам RX и общий конвертера USB/UART, например к такому, Рис.10:

На компе запускается еще один ArduinoIDE и включается монитор предварительно выбранного порта. В мониторе будет выводиться информация ввиде как на рис. 11 слева. Расшифровка этой информации также показана на рисунке. Режим отладки «включается» в файле SmoConfig.h, где в одной из строк
#undef DEBUG_ISP
#undef DEBUG_HVSP
#undef DEBUG_HVPP
#undef DEBUG_TPI
#undef DEBUG_COMM
#undef нужно заменить на #define . Залить скетч заново в Arduino. Следует отметить, что процессы чтения/записи в режиме отладки замедляются раз в 100.

Читайте также:  Простые оригинальные открытки своими руками

При параллельном программировании к разъему HVPP контроллеры подключаются согласно таблице 1 и даташиту.

Чтобы работали индикаторы и программатор TPI, как заявляет автор, необходимо пропатчить исходники avrdude, заново собрать и скомпилировать.

Кому интересно как это делается можно посмотреть здесь , но сначала нужно пропатчить ( внести изменения в исходники avrdude). Patch –файл можно найти в папке ScratchMonkey — avrdude.patch.

Пропатченные и скомпилированные файлы avrdude.exe и avrdude.conf вставляются в папки ArduinoIDE вместо штатных файлов. В файл programmers.txt вставляются строки:

scratchmonkey.name=ScratchMonkey ISP/TPI
scratchmonkey.communication=serial
scratchmonkey.protocol=scratchmonkey
scratchmonkey.program.protocol= scratchmonkey
scratchmonkey.program.tool=avrdude
scratchmonkey.program.extra_params=-P

scratchmonkey_hvsp.name=ScratchMonkey HVSP
scratchmonkey_hvsp.communication=serial
scratchmonkey_hvsp.protocol=scratchmonkey_hvsp
scratchmonkey_hvsp.program.protocol= scratchmonkey_hvsp
scratchmonkey_hvsp.program.tool=avrdude
scratchmonkey_hvsp.program.extra_params=-P

scratchmonkey_hvpp.name=ScratchMonkey HVPP
scratchmonkey_hvpp.communication=serial
scratchmonkey_hvpp.protocol=scratchmonkey_pp
scratchmonkey_hvpp.program.protocol= scratchmonkey_hvpp
scratchmonkey_hvpp.program.tool=avrdude
scratchmonkey_hvpp.program.extra_params=-P

Готово. В списке программаторов IDE должны добавиться три программатора:

При программировании должны работать индикация и TPI программирование.

Так как ScratchMonkey использует avrdude, то он будет работать и с оболочками дуды. Например с AVR8-Barn-O-Mat (барномат), необходимо только в установках указать пути расположения файлов avrdude, тогда при следующем запуске «барномата» в списках программаторов увидим ScratchMonkey. Оболочки удобны при заливке HEX-файлов.

Источник

Программатор для EPROM на Arduino

Понадобилось при изучении и ремонте компьютеров, которые старше меня, прошивать ПЗУшки. Тесты оперативной памяти и периферии проводить. Нормального программатора у меня на тот момент не было.

Собрать на логике для LPT порта, конечно, можно, но данный вариант был отброшен, так как для использования пришлось бы включать ещё какого-нибудь старичка. В современных компах все ещё встречается данный интерфейс (правда не полноценный разъем, а на гребенке) да и купить плату в PCI слот тоже не проблема, но возникают уже сложности с софтом. Он был написан очень давно, когда работа с портами ввода/вывода в операционных системах велась иначе. Соответственно, в современных версиях Windows ПО не будет работать.

Сразу стоит оговориться, что про существование TL866 знаю. И даже в процессе разработки все же его купил себе, но он не в состоянии прошить микросхемы, которые требуют высокое напряжение программирования. Максимум 18 вольт (TL866+ или 21 для предыдущей версии).

Беглое гугление привело меня к данному репозиторию. Собрав программатор, я смог сдампить пару интересующих чипов. А вот с прошивкой все оказалось куда сложнее… Софт этого просто не умеет… Его, конечно, можно обмануть, выставив неправильный чип, но работает это не во всех случаях и явно не наш метод

Очень сильно огорчил пользовательский интерфейс, который, вместо классического варианта с предоставлением права выбора порта пользователю, проходился по всем доступным последовательным интерфейсам. Соответственно, все устройства перезагружаются. Особенно обидно, наверное, когда у тебя 3D принтер уже часов 10 печатает детальку с флешки, а тут такая подстава.

Мир OpenSource прекрасен тем, что ты можешь взять проект и дописать его под свою задачу. В данном случае исходных кодов к графическому интерфейсу нет. По крайней мере я их не нашел, хотя можно было написать разработчику. Стало интересно и появился небольшой повод для изучения Qt. Так что софт будет кросплатформенный.

Читайте также:  Простые ступени для крыльца своими руками

Берем за основу схему из предыдущего проекта и дорабатываем устройство до требуемого функционала. Решил пожертвовать поддержкой EEPROM в софте. Возможно, это не совсем удачное решение, но для электрически стираемых чипов уже не нужно такое высокое напряжение. При доработке опирался на самую объемную микросхему (27C512 для DIP28) и убрал всю путаницу относительно адресных ножек. Весь адрес будет задаваться исключительно при помощи сдвиговых регистров (74HC595). Это освободит дополнительные ноги самого микроконтроллера, которые понадобятся для управления подачей напряжения программирования. А все необходимые сигналы (PRG) можно получить модификацией адреса перед загрузкой в регистры.

Принцип подачи напряжения программирования остался прежним. Изменения только в области защиты выводов микроконтроллера и сдвиговых регистров. Заменил резисторы (1 КОм) на диоды с подтяжкой к лог. 0. Это менее агрессивный вариант. Хотя, справедливости ради, и резисторы работают.

Изучив документацию на все интересующие чипы, определил, что требуется три точки подачи Vpp:

  1. 27C16 на 21 ногу микросхемы (23 ногу DIP28 сокета)
  2. 27C32 и 27C512 на сигнал #OE (Output Enable)
  3. 27C64, 27C128, 27C256 на 1 ногу микросхем

Микросхемы 27C16 и 27C32 от остальных отличаются корпусом, так что им требуется подавать напряжение питания на 26 ножку сокета. Это адресная нога A13 для более емких собратьев. Тока с выхода сдвигового регистра должно хватить для работы, но на время загрузки данных его выходы переходят в Z состояние. Подобный режим допустим, но включение на чтение или запись одной ячейки вряд ли является нормой. Поэтому под управление питания установлен дополнительный транзистор. И ещё один потребовался для 27C16, которому на время чтения необходимо подать на вход Vpp 5 вольт. Можно, конечно, на время чтения выставить напряжение программирования на значения 5 вольт, но переключаться между 25 и 5 вольтами неудобно.

Если есть свободные ноги АЦП, то почему бы не измерять напряжение программирования? Плата разведена под Arduino Nano. На нем имеются два дополнительных входа, которые кроме как для АЦП использовать нельзя. На самом деле это особенность многих микроконтроллеров AVR в корпусе для поверхностного монтажа. На китайских Arduino UNO частенько есть входы A6 и A7. С учетом того, что напряжение может быть до 30 вольт (вроде больше всего хотят отечественные РФ5, 25 вольт), рассчитываем делитель из того, что есть в наличии. Точность в 0.5 вольта для данной задачи вполне достаточна. Эта функция — защита от дурака, а не вольтметр.

Можно, конечно, было заморочиться и выступать в качестве ШИР (широтно импульсное регулирование) контроллера, но ножек свободных не осталось. Поэтому на печатной плате есть посадочное место для преобразователя DC-DC Step Up на чипе MT3608, которые за копейки доступны на али.

По схеме на этом все.

Алгоритм работы с данными микросхемами очень прост. С ним можно ознакомится в небольшом видео.

Источник