РадиоКот >Схемы >Цифровые устройства >Примочки к ПК >

Теги статьи:

Еще раз о параллельном программаторе на базе STK500

Автор: _abk_, loxox@yandex.ru
Опубликовано 03.02.2016
Создано при помощи КотоРед.

Не ошибается только тот, кто ничего не делает.
Важный постскриптум - в самом конце статьи.
Прочесть обязательно!

 

 

Несколько лет назад на волне популярности микроконтроллеров AVR Atmel среди радиолюбителей  в форуме  на РадиоКоте возникла тема параллельного программатора (в форуме - HVProg), плавно перешедшая в итоге к обсуждению программатора на основе отладочной платы STK500 от Atmel (https://radiokot.ru/forum/viewtopic.php?f=57&t=864&sid=3599b79de8d0d8ef8971cefa647e2e3f). С тех пор времена изменились, стали доступны куда более совершенные МК иных производителей, не проблема найти и все программирующие программаторы, в том числе за вполне небольшие деньги от китайских братьев. Однако идея самодельного параллельного программатора по-прежнему периодически будоражит пытливые умы радиокотят,  и тема в форуме медленно разрастается, становясь все менее читабельной. Терпения искать на 140 страницах полезную информацию хватает немногим, и возникает большое количество дублирующих вопросов, авторам которых лень читать всю ветку.

     В помощь лентяям попробую кратко обобщить основные аспекты параллельного программаторостроения на основе схемы STK500 (она есть в архиве в конце статьи), которые обсуждались и прошли практическую проверку в упомянутой теме на форуме. Кроме того, не лишним будет напомнить некоторые общеизвестные сведения о программировании МК AVR. Кому-то изложение может показаться излишне подробным, однако некоторые вопросы, задаваемые на форуме, побуждают повторять достаточно простые вещи. Что-то я мог упустить, о чем-то спорили на форуме, и каждый остался при своем мнении, не совпадающим с другими. Поэтому вы имеете право хранить молчание, возражать или иметь свое собственное мнение :)  И, конечно, спасибо всем, кто со мной спорил или благодарил.

Что такое «параллельный» программатор, и зачем он нужен.

     Следует напомнить, что в целом МК AVR поддерживают 3 режима программирования:
1. режим последовательного программирования по интерфейсу SPI (LVSP) – всем известный и применяемый в подавляющем большинстве случаев, и позволяющий программировать впаянный чип прямо в плате (in system, ISP). Режим поддерживают, пожалуй, все существующие программаторы, начиная от «пяти проводков» до фирменного AVR ISP и самых «навороченных».
2. режим последовательного программирования при высоком напряжении (HVSP);
3. режим параллельного программирования при высоком напряжении, в котором (режиме) данные записываются и читаются побайтно по параллельной шине (HVPP).
     Переключение МК во второй и третий режимы требует подачи управляющего «высокого» (+12В) напряжения на вывод Reset МК. Понятно, что в этих режимах программирование МК, уже впаянных в плату, требует принятия дополнительных мер для непопадания напряжения +12В в цепи на плате, присоединенные к выводу сброса. В случае параллельного режима понадобилось бы предусмотреть также подключение относительно большого числа выводов.
     Какие именно режимы поддерживает конкретный МК, можно узнать из даташитов на них. Так, например, МК с небольшим числом выводов (большинство AVR Tiny) не позволяют реализовать режим параллельного программирования.

     Когда же нельзя обойтись самым простым и удобным режимом последовательного программирования по интерфейсу SPI?
     Вообще говоря, таких принципиальных случаев – два.
Первый: модель МК не поддерживает режим. Например, Tiny11 программируется только в режиме 2, а Tiny28 допускает исключительно параллельное программирование (режим 3).
     Нас больше интересует случай
Второй, когда в результате ошибочного или умышленного конфигурирования контроллера при установке фьюзов отключается SPI или вывод Reset конфигурируется как вывод порта. После этого последовательное программирование по SPI становится невозможным и микроконтроллер «умирает». Теперь что-то изменить можно только в режимах 2 или 3 в зависимости от модели МК.


     Одно время я увлекался поделками на младших 8-ногих тиньках.  Нравилось «вылизать» код так, чтобы он вошел в 1Кбайт памяти и "летал", (кто помнит программирование на Б3-34 или М220, меня поймет :)  да еще, например, с 8-разрядной семисегментной LED-индикацией. Часто выводов не хватало, и приходилось задействовать ножку Reset как порт ввода-вывода. МК становился однократно программируемым :).


     Надо упомянуть еще ситуацию, когда контроллер конфигурируется на тактирование от внешнего кварца, который не подключен к МК. Случай сколь частый, столь же и простой - разрешается или подключением внешнего кварцевого резонатора, или подачей тактового сигнала от внешнего генератора и позволяет обойтись программированием по SPI, используя простой программатор (те же «пять проводков») и не требуя «особенного» программатора. Так, например, Андрей Рыжков (aka PROTTOSS) в своей версии «последовательного» программатора AVR910 (https://www.prottoss.com/projects/AVR910.usb.prog/avr910_usb_programmer.htm) предусмотрел для таких случаев отдельный источник тактового сигнала частотой 1МГц.
     Между тем, упомянутые проблемы могут быть разрешены программатором, поддерживающим все режимы программирования AVR и дающим полную свободу разработчику, в том числе и делать глупые ошибки. Нелишне сказать также и о том, что скорость программирования в параллельном режиме значительно выше, чем в последовательных, что в некоторых случаях может быть важно.

А не подойдет ли нам STK500?


    Подойдет. Оригинальная схема отладочной платы STK500 от Atmel имеет встроенный программатор и позволяет программировать в любом из перечисленных выше режимов. Более того, этот программатор работает с AVR Studio и CodeVision AVR, что весьма удобно.
     Итак, плата STK500 содержит следующие основные функциональные узлы:


1. управляющий МК Atmega8535;
2. интерфейс связи с ПК через COM-порт;
3. буферный каскад для выхода тактового сигнала;
4. два узла для установки из внешней программы напряжения питания целевого МК Vtg и напряжения Vref, регулируемых ШИМ сигналом;
5. узел для автоматического обновления прошивки управляющего контроллера, собранный на контроллере AT90S1200;
6. источники питания +5В и коммутируемый +12В, работающий от генератора микросхемы интерфейса RS232;
7. адаптер для установки в панельки и подключения различных контроллеров AVR;
8. другие вспомогательные цепи.

     Идея использовать отладочную плату STK500 от Atmel, как основу для программатора, совместимого с софтом Атмела, восходит к Tobias’у Hammer’у сотоварищи, проделавшим «обрезание» оригинальной схемы (https://www.der-hammer.info/hvprog/index.htm) . От нее остались только сам МК, интерфейс с ПК, источник +5В и цепи управления напряжением +12В. Получилось просто, хорошо и легко повторяемо.
     Последующее применение этого варианта показало, что было обрезано слишком много, и кое-какие (в том числе, очень нужные) функции были утрачены. Так, например, режим параллельного программирования при высоком напряжении в случае ошибочной установки фьюзов или отключения Reset предусматривает программирование в два этапа с манипуляцией (подачей-снятием) напряжением питания целевого контроллера (Vtg) в процессе программирования. Вариант Hammer’а этого не позволяет.
     Попытку улучшить вариант Hammer’а сделал Multik, добавив управляемый от PD5 стабилизатор на LM317 и вернув в схему оригинальный инвертор тактового сигнала, запитанный от Vtg (https://multikonelectronics.com/subpage.php?p=18&i=25#Hammer). Одновременно Multik’ом была исправлена и ошибка в разводке адаптера для ATtiny26. Однако примененное включение LM317, не позволяющее снять Vtg полностью и достаточно быстро, и, особенно, использующее как задающее напряжение для стабилизатора сигнал PWM с вывода PD5, не выглядит оптимальным. По-видимому, именно этот каскад мог быть виновником нестабильной работы такого варианта программатора, не раз отмеченной участниками форума. Тем не менее, все принципиальные шаги для восстановления функциональности Multik’ом были сделаны, за что ему большое спасибо.


     Таким образом, полнофункциональный программатор для МК AVR (ATtiny, ATmega) на основе STK500 должен иметь следующие обязательные узлы:

1. Управляющий МК Atmega8535 с оригинальной прошивкой, проверенной временем и реализующей все, что нужно. Замечу, что нет никакой необходимости сохранять узел для автоматического обновления прошивки, присутствующий в STK500.

2. Интерфейс связи с ПК. Замена RS232 на USB интерфейс весьма желательна в связи с редкостью COM-портов на ПК и возможностью отказаться от внешнего источника питания для программатора, запитав его от USB-порта.

3. Буферный каскад для выхода тактового сигнала. Запитанный от Vtg, этот каскад исключает возможность паразитного питания целевого МК в моменты отключения Vtg. Полезен он также и для обеспечения качества тактового сигнала при возможной работе на длинный шлейф с повышенной емкостью.

4. Узел для коммутации напряжения питания целевого МК Vtg. Узел нужен для правильной реализации алгоритма программирования. Должен достаточно быстро включать/отключать напряжение Vtg по наличию/отсутствию управляющего ШИМ-сигнала на выводе PD5.

5. Источники питания +5В и коммутируемый сигналом на выводе PD3 +12В. Источник +12В должен обеспечивать ток в несколько миллиампер, основной потребитель которых – цепь индикации на светодиоде. Вывод Reset целевого МК потребляет от +12В не более 250 мкА. Напряжение +12В можно получить от +5В USB, применив любой маломощный DС-DС преобразователь. Источник +5В (USB) должен обеспечивать ток до 300-400 мА.

6. Адаптер для установки в панельки и подключения различных контроллеров AVR.

7. Другие вспомогательные цепи (коммутация +12В, цепи сброса, индикации, разъемы).

 

    Для иллюстрации сказанного привожу структурную схему программатора:

 

  Рис.1 Структурная схема

 

     На этом можно было бы и закончить, но в форуме периодически появляются сетования на то, что нет «полной» схемы «самого лучшего» варианта программатора. Между тем немало форумчан собрали свои «самые лучшие» варианты и весьма довольны их работой. Объясняется все очень просто: если алгоритм программирования, зашитый в управляющий ATmega8535, обеспечен корректной работой исполнительных узлов и цепей, то программатор будет работать. При этом каждый узел может быть собран из того подходящего, что есть под рукой, чем и объясняется многообразие вариантов схем и конструкций. Остается только собрать (спаять) все без ошибок.
В сравнении же различных вариантов схем узлов программатора немного смысла. Все варианты не лучше и не хуже. Нет принципиальной разницы, например, как выполнен интерфейс с ПК: на FT232BM или RL, PL-2303 или CP2102; или на MAX232 для COM-порта. Можно и готовый китайский модуль взять. Кому-то удобнее работать с DIP-корпусами, кому-то - с SMD. Все зависит от желания и возможностей программаторостроителя. Но в любом случае, для сохранения полной функциональности в части программирования все перечисленные выше узлы в изделии должны присутствовать.

Вариант практической реализации.


     В качестве иллюстрации сказанного могу привести свой «самый лучший» вариант программатора на базе схемы отладочной платы STK500. Он обеспечивает полный функционал программатора STK500 и собран из перечисленных выше «кубиков». В нем нет ничего оригинального, за исключением, пожалуй, тривиального узла коммутации Vtg, который мне нравится простотой решения и эффективностью. Подчеркну еще раз: этот вариант приводится только как пример одного из многих возможных вариантов выбора и реализации.
     При выборе «кубиков» были учтены следующие соображения.
     Мне нужен был малогабаритный программатор, не требующий дополнительного внешнего источника питания, для работы «в полях», преимущественно по SPI и с возможностью, когда надо, подключить адаптер для параллельного программирования.
     Когда я делал свой вариант, то постарался учесть накопленный коллективный опыт и выявленные на форуме баги и добиться работы программатора для всего поддерживаемого AVRStudio перечня МК и во всех режимах (LVSP,HVSP,HVPP), при этом не перегружая схему излишествами. Замечу попутно, что участие в обсуждении на форуме заставили немало почитать и заметно повысили уровень познаний в этой сфере :) Так что спасибо коллегам!


1. Первый вопрос, который надо было решить – выбрать внешнее питание или питание от +5USB. Я выбрал второе, потому что это избавляет от необходимости иметь при себе дополнительный источник питания.
2. Следующий шаг - интерфейс связи с ПК: COM-порт или USB. USB логичнее, и согласуется с п.1.
3. SMD или DIP. Это дело вкуса, остроты зрения и твердости рук, я выбрал SMD - удобнее, быстрее, технологичнее. Да и FTDI-шка в корпусе TQFP, опять же, уже присутствует…
4. Формирователь-буфер тактового сигнала убережет от непонятных проблем при программировании, когда то программирует, то нет. Обязательно делать, взята оригинальная схема.
5. Питание программируемого МК (Vtg). Можно было бы просто подать +5В, как у Hammer’a, и не заморачиваться. ISP работать будет. По большей части будет работать и HVPP. Кроме тех случаев, когда выключен SPI или вывод сброса сконфигурирован, как порт в/в, и для программирования потребуется управлять Vtg. Т.е., кроме тех случаев, для которых параллельный программатор особенно нужен. Поэтому питанием Vtg необходимо управлять. В ряде форумных вариантов использована LM317, а иногда еще и ОУ LM358 со своим отрицательным питанием. Мне показалось, что это лишнее усложнение. Программатор должен подавать/снимать питание и все. А это можно сделать простым ключом на транзисторе.
6. В адаптере надо правильно развести панельку для Tiny26.
7. Нужен хороший источник питания. Программатор в режиме HVPP может потреблять до 300-400 мА, поэтому большинство имевшихся у меня (китайских?) USB шнуров давали слишком большое падение напряжение на самих себе. По этой же причине лучше не применять самовосстанавливающийся предохранитель в цепи питания. А вот обычный плавкий на 0,5 А не помешает.

     Исходя из этих соображений, за основу был взят USB-вариант от Sema (https://radiokot.ru/lab/controller/41/), дополненный инвертором-буфером от STK500 и ключом для коммутации Vtg. В исходном образце подкупили минимальные габариты платы (4,5х6см), изящная разводка и рациональная компоновка, за что еще раз спасибо автору. Минимум переделок!
     Потребовалась лишь небольшая доразводка и пара навесных проводков, чтобы разместить на плате два недостающих узла – инвертор и ключ. Разъем IDC20, на который выведены сигналы программатора, не является стандартизированным, и не было никакого смысла переразводить его, подгоняя под ответный разъем адаптера от Hammer’а. Проще и быстрее сделать переходник для подключения адаптера. В итоге все уместилось в корпус от электронной кассовой ленты размером 85х55х22 мм, да еще и место осталось.

 

  Рис.2 Фото готового программатора

 

     Адаптер заимствован у Multik’a, в его плате выводные блокировочные конденсаторы заменены на SMD, а перемычки выполнены печатью на второй стороне.
     Вот «полная схема» программатора, в которую вошли все перечисленные принципиальные доработки, и которая делает все то же, что делает программатор в составе отладочной платы STK500.

 

  Рис.3 Принципиальная схема

 

     Для пытливых на схеме выделены цветом и пронумерованы функциональные блоки. Цифры соответствуют приведенному ранее перечню блоков и структурной схеме (Рис.1). Сохранена нумерация деталей схемы от Sem’ы, введенные дополнительные элементы продолжают ее.


     И, наконец, в архивах в конце статьи собран весь материал, необходимый для сборки описанного варианта программатора. Кроме схемы программатора в формате .jpg (Shem.zip), в архивах можно найти печатные платы программатора и адаптера в .lay (01.zip), прошивки (.ebn , .hex) и фьюзы для hex-варианта (02.zip). Есть там и плата отдельного адаптера для Atmega8515(4414) в DIP и TQFP-корпусах. Повторюсь еще раз, распайки разъема IDC20 на платах программатора и адаптера в моем варианте не совпадают! Соединяются они переходным кабелем, изготовленным в соответствии с таблицей соответствия номеров контактов обоих разъемов IDC20, вложенной в архив Shem.zip. Отдельные архивы содержат схемы и платы в формате DipTrace, а также драйвера для FTDI. Обещанная схема STK500 тоже есть.

     В заключение можно отметить, что в своем окончательном варианте, который здесь описан, программатор ни разу меня не подвел. Было изготовлено два экземпляра, и через них прошли все МК семейства ATmega и почти все «тиньки». Бракованные не попадались. Неизменно радовали скорость программирования и полный контроль над фьюзами. А тем, кто начинает осваивать AVR-ки и планирует обзавестись самоизготовленным программатором, рекомендую именно этот (в любом подходящем варианте) и желаю успеха в сборке!

 

P.S.

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

Выражаю благодарность Александру Фролову - внимательному читателю, обнаружившему мои ошибки. Все они - в схемах, и вот их полный перечень:

-не подключен к питанию вывод 6 U1;
-не подключен к питанию исток Q7;
-не соединены выводы 1 и 2 U2 с выводами 33 и 32 U4;
-левый вывод R18 должен быть подключен к Gnd, а не к +5 Вольт.

 

 

Ссылки:


1. Форум по HVProg на «Радиокоте» (https://radiokot.ru/forum/viewtopic.php?f=57&t=864&sid=3599b79de8d0d8ef8971cefa647e2e3f);
2. AVR910 от PROTTOSS’а (https://www.prottoss.com/projects/AVR910.usb.prog/avr910_usb_programmer.htm);
3. HVProg от Hammer’a (https://www.der-hammer.info/hvprog/index.htm);
4. HVProg от Multik’a (https://multikonelectronics.com/subpage.php?p=18&i=25#Hammer);
5. USB HVProg от Sema (https://radiokot.ru/lab/controller/41/)

 


Файлы:
В формате DipTrace
Печатные платы
Схемы
Прошивки и фьюзы
Драйвер FTDI
Схема STK500


Все вопросы в Форум.