Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 12 июля 2022 года; проверки требует 1 правка.
Внутрисхемное программирование (англ. , сокр. , также in-circuit serial programming, ICSP) — технология программирования электронных компонентов (ПЛИС, микроконтроллеры и т. п.), позволяющая программировать компонент, уже установленный в устройство. До появления этой технологии компоненты программировались перед установкой в устройство, для их перепрограммирования требовалось их извлечение из устройства.
Главным преимуществом технологии является возможность объединения процесса программирования и тестирования при производстве, исключив отдельную фазу программирования компонентов перед окончательной сборкой. Технология также позволяет производителям устройств обойтись без закупки заранее запрограммированных компонентов, выполняя программирование прямо в процессе производства. Это позволяет снизить стоимость производства и вносить изменения в программируемую часть устройства без остановки производства.
Микросхемы, имеющие возможность внутрисхемного программирования, обычно имеют специальную схему, генерирующую напряжения, необходимые для программирования, из обычного напряжения питания, а также схему для коммуникации с программатором посредством последовательного интерфейса (большинство микросхем использует вариации протокола JTAG). Программирование через интерфейс ISP происходит по пяти линиям связи: MOSI, MISO, SCK, RESET и GND.
Существуют два основных способа ISP:
Преимущество загрузчика заключается в том, что возможно программирование МК через любой имеющийся у него интерфейс любым удобным протоколом (даже зашифрованным, если загрузчик возьмёт на себя и расшифровку). Загрузчик также удобен при удалённом обновлении прошивки МК. Недостаток — часть ПЗУ недоступна для размещения основной программы.
После того как загрузчик записал в память микроконтроллера прошивку, он в дальнейшем или запускает прикладную программу сам или ожидает какой-то команды от управляющей программы на компьютере, это зависит от реализации конкретного загрузчика.
Программатор ПЗУ с ультрафиолетовым стиранием
По типу микросхем
Универсальные программаторы могут поддерживать все вышеперечисленные типы.
По подключению микросхемы
Параллельные программаторы содержат разъём, в который и вставляется программируемая микросхема. Внутрисхемные пригодны только для тех микросхем, в которых поддерживается внутрисхемное программирование, то есть позволяют прошивать микросхему, не вынимая её из устройства.
При покупке параллельного программатора стоит обратить внимание на качество разъёма, в который устанавливается микросхема. Обычный одноразовый разъём долго не прослужит; программатор должен иметь цанговые разъёмы — а ещё лучше ZIF. В дорогих программаторах есть несколько разъёмов — под разные виды корпусов.
По подключению к компьютеру
Первые программаторы были автономными — для набора прошивки имелась клавиатура или коммутационная панель. С распространением ПК такие программаторы были полностью вытеснены подключаемыми к компьютеру — специальная программа (которая также называется программатором) передаёт прошивку с компьютера, а программатору остаётся только записать её в память микросхемы.
Для подключения программаторов могут применяться:
Специализированные платы изредка применялись до появления USB, так как позволяли достичь максимальных скоростей обмена данными. Впрочем, одновременно они делали программатор стационарным.
По дополнительным функциям
(Здесь указаны как аппаратные, так и программные функции.)
Одним из самых мощных отладочных инструментов в микроконтроллерной среде является JTAG — внутрисхемный отладчик.
Суть тут в чем — через JTAG адаптер микроконтроллер подключается напрямую к среде программирвания и отладки, например к AVR Studio. После чего микроконтроллер полностью подчиняется студии и дальше шагу не может ступить без ее разрешения. Доступна становится пошаговое выполнение кода, просмотр/изменение всех регистров, работа со всей периферией и все это в реальном микроконтроллере, а не в программной эмуляции. Можно ставить точки останова (breakpoints) на разные события — для ICE1 три штуки. В общем, сказка, а не инструмент.
К сожалению в AVR микроконтроллерах JTAG доступен далеко не везде, как правило контроллеры с числом ног меньше 40 и обьемом памяти меньше 16КБ такого удовольствия лишены (там, правда, часто бывает debugWire, но на коленке сделать его адаптер еще никому не удалось, а фирменный JTAG ICEII или AVRDragon стоят довольно больших денег). А поскольку у меня в ходу в основном Tiny2313, Mega8, Mega8535 и прочая мелочевка, то мне JTAG что собаке пятая нога — не поддерживается он в этих МК.
Тем не менее, поддашвись многочисленным просьбам, я сварганил этот агрегат и сейчас покажу вам как им пользоваться.
Велосипед изобретать я не стал и взял широко известный проект от scienceprog.com
Схема несложная, требует ATMega16 и чуть чуть обвяза. В качестве интерфейса можно поставить MAX232 и воткнуть все это дело в COM порт, а можно сделать на FT232RL и тогда интерфейсом будет USB.
Только если будете делать на FT232 то рекомендую питание брать не от USB, а от целевого устройства. Дело в том, что если подключишь JTAG на FT232 с запиткой от USB к незапитанной целевой схеме (например по ошибке или недосмотру) то целевая схема запитается через защитные диоды паразитным питанием, т.к. на выводах FT232 будет высокий уровень. Что черевато тем, что может сдохнуть либо JTAG контроллер, либо контроллер целевой платы.
Поэтому пусть лучше JTAG адаптер питается от целевой платы, а не наоборот.
Я же не стал мудрить и сделал на MAX232 — с USB у меня напряг вечный, а COM порты свободны. Тем более это дешевле.
Однако я не обломался развести плату и под FT232RL суть та же.
В остальном же, как видите, разводка почти один в один, а USB часть взял и своего прошлого поста про FT232. Кстати, разводя вот такие вот маленькие кусочки схем вроде блока с FT232 я их сохраняю в макросы и потом, когда надо, собираю из них печатную плату как из конструктора. Очень удобно! Рекомендую!
Вытравили плату, запаяли компоненты. Получилась вот такая вот платка:
Теперь надо прошить контроллер. Вообще, по науке, сначала прошивается bootloader, потом из AVR Studio делается обновление прошивки JTAG ICE до последней версии. Но я нашел путь проще, на сайте pol-sem.narod.ru был обнаружен уже готовый HEX файл который просто надо залить в МК и все.
Поэтому цепляем к нашему адаптеру программатор, благо все штыри нужные (MISO, MOSI, GND, RST, SCK, Vcc) есть. А то что они не в нужном порядке стандартного AVR ISP разьема, так это не беда — я временно распотрошил колодку своего программатора и одел отдельные пины как надо. Однократная же процедура, чего мучаться разводить еще и ISP разъем.
Заливаем прошивку.
Выставляем Fuse биты.
Тут надо быть внимательными, так как существует несколько нотаций FUSE — прямая (по даташиту, где 0 = ON, 1=OFF) и инверсная (1 = ON, 0 = OFF). В прямой нотации работает UNIPROF, в инверсной нотации работает PonyProg и USBASP _AVRDUDE_PROG.
Определить в какой нотации работает твой программатор очень просто. Дjстаточно подключиться к своему МК и нажать кнопку чтения Fuse битов и посмотреть на бит SPIEN если галка стоит — нотация инверсная. Потому как по дефолту SPIEN включен всегда (без него невозможно прошить МК через ISP внутрисхемно).
Прошиваются Fuse следующим образом:
Если прошивать голый бутлоадер, то надо включить бит BOOTRST и подключившись через студию сделать обновление прошивки JTAG, залив через AVRProg файл upgrade.ebn (лежит он где то в каталоге AVR Studio). А после прошивки выключить BOOTRST.
Все, девайс готов к работе. Теперь осталось его только испытать в деле.
Работа с JTAG AVR ICE
Особо заморачиваться я не буду, так что покажу на простом примере мигания светодиодов.
Запускаем студию, создаем новый проект.
Выбираем язык программирования, пусть это будет Assembler.
Задаем имя проекта.
А далее, в разделе Debug Platform выбираем не AVR Simulator как раньше, а JTAG ICE.
В правом окне выбираем отлаживаемый кристалл, (у меня это Mega16) и жмем финиш. Все, дальше как обычно, вбиваем текст программы. Я не стал мудрить и по быстрому настрогал следующее:
Вот так вот просто. Если ее скомпилить, прошить и запустить, то диоды будут моргать с бешеной частотой, так как никаких задержек не предусмотрено. А что же будет из под JTAG?
Беру свою новоиспеченную отладочную плату на Mega16, подключаю к порту А три светодиода.
Подключаю к плате JTAG адаптер — четыре провода интерфейса (TDO,TDI,TMS,TCK) и два силовых Vcc на плюс и GND на землю — JTAG адптер запитан от целевой платы и все готово к работе.
Жму в студии компиляцию и запуск (Ctrl+F7). Проект по быстрому компилится, тут же через JTAG заливается в МК (JTAG может заменить программатор) адаптер при этом весело перемигивается светодиодом. Программа встает на выполнение, бодро показывая стрелочкой начало программы.
Можно трассировать! Тыкаю по F11 — прога исполняется по одной команде, показывая стрелочкой где я нахожусь в данный момент. После каждого выполнения команды SBI — у меня на плате зажигается соответствующий светодиод. Круто, блин! Как в каком-нибудь Proteus только без глюков и все вживую! Пробежался дальше по тексту — после CBI диоды погасли, как и положено. Вот как это выглядит вживую:
Дальше решил поразвлекаться. Не меняя программу, не перекомпиливая, не выходя из режима отладки. Открываю в AVR Studio вкладку I/O View
Протыкиваю там галочки:
Снимаю прогу с паузы (F5 — Run). Тычу осциллографом в ногу PD7 (OC2)
ЫЫЫ!!! ШИМ!!! Ставлю прогу на паузу, меняю биты в OCR2 запускаю снова — коэффициент заполнения изменился. Хы. Ручное управление 🙂
Так что с JTAGом если хочешь получить по быстрому какую нибудь фиговину вроде генератора даже не надо прогу писать — взял и включил вручную что тебе нужно. Богат AVR периферией 🙂
Жмем Connect и мы в эфире, главное не забыть выйти из режима откладки в студии. A VRPROG сам определяет тип контроллера, можно выбрать файл с флешем и/или епромом и прошить их. Отдельного разговора заслуживает вкладка Fuses.
В отличии от большинства программаторов, тут уже не придется париться по поводу битов SUT:CKSEL — все выбирается из понятного списка, написанного человеческим языком:
Наигрался, зафотографировал для статьи, упаковал в красивый корпус. Даже не поленился и обложечку сфигачил. Очень уж мне игрушка понравилась.
Файлы к статье:
Программа для микроконтроллера пишется на любом удобном языке программирования, компилируется в бинарный файл (или файл формата intel HEX) и заливается в микроконтроллер посредством программатора.
Итак, первым шагом в освоении микроконтроллера обычно становится программатор. Ведь без программатора невозможно загнать программу в микроконтроллер и он так и останется безжизненным куском кремния.
Что же представляет из себя это устройство?
В простейшем случае программатор это девайс который связывает микроконтроллер и компьютер, позволяя с компа залить файл прошивки в память контроллера. Также нужна прошивающая программа, которая по специальному протоколу загонит данные в микроконтроллер.
Программаторы бывают разные под разные семейства контроллеров существуют свои программаторы. Впрочем, бывают и универсальные. Более того, даже ту же простейшую AVR’ку можно прошить несколькими способами:
Внутрисхемное программирование (ISP)
Самый популярный способ прошивать современные контроллеры. Внутрисхемным данный метод называется потому, что микроконтроллер в этот момент находится в схеме целевого устройства — он может быть даже наглухо туда впаян. Для нужд программатора в этом случае выделяется несколько выводов контроллера (обычно 3.5 в зависимости от контроллера).
К этим выводам подключается прошивающий шнур программатора и происходит заливка прошивки. После чего шнур отключается и контроллер начинает работу.
У AVR прошивка заливается по интерфейсу SPI и для работы программатора нужно четыре линии и питание (достаточно только земли, чтобы уравнять потенциалы земель программатора и устройства):
Сам же разъем внутрисхемного программирования представляет собой всего лишь несколько штырьков. Лишь бы на него было удобно надеть разъем. Конфигурация его может быть любой, как тебе удобней.
Однако все же есть один популярный стандарт:
Для внутрисхемной прошивки контроллеров AVR существует не один десяток разнообразных программаторов. Отличаются они в первую очередь по скорости работы и типу подключения к компьютеру (COM/LPT/USB). А также бывают безмозглыми или со своим управляющим контроллером.
Безмозглые программаторы, как правило, дешевые, очень простые в изготовлении и наладке. Но при этом обычно работают исключительно через архаичные COM или LPT порты. Которые найти в современном компьютере целая проблема. А еще требуют прямого доступа к портам, что уже в Windows XP может быть проблемой. Плюс бывает зависимость от тактовой частоты процессора компьютера.
Так что твой 3ГГЦ-овый десятиядерный монстр может пролететь, как фанера над Парижем.
Программаторы с управляющим контроллером лишены многих проблем безмозглых. Они без особых проблем работают через USB. А если собраны на COM порт, то без извращенских методик работы с данными — как честный COM порт. Так что адаптеры COM-USB работают на ура. И детали подобрать можно покрупней, чтобы легче было паять. Но у этих программаторов есть другая проблема — для того чтобы сделать такой программатор нужен другой программатор, чтобы прошить ему управляющий контроллер. Проблема курицы и яйца. Широко получили распространение такие программаторы как:
Внутрисхемное программирование, несмотря на все его удобства, имеет ряд ограничений.
Микроконтроллер должен быть запущен, иначе он не сможет ответить на сигнал программатора. Поэтому если неправильно выставить биты конфигурации (FUSE), например, переключить на внешний кварцевый резонатор, а сам кварц не поставить. То контроллер не сможет запуститься и прошить его внутрисхемно будет уже нельзя. По крайней мере до тех пор пока МК не будет запущен.
Также в битах конфигурации можно отключить режим внутрисхемной прошивки или преваратить вывод RESET в обычный порт ввода-вывода (это справедливо для малых МК, у которых RESET совмещен с портом). Такое действо тоже обрубает программирование по ISP.
Параллельное высоковольтное программирование
Обычно применяется на поточном производстве при массовой (сотни штук) прошивке чипов в программаторе перед запайкой их в устройство.
Параллельное программирование во много раз быстрей последовательного (ISP), но требует подачи на RESET напряжения в 12 вольт. А также для параллельной зашивки требуется уже не 3 линии данных, а восемь + линии управления. Для программирования в этом режиме микроконтроллер вставляется в панельку программатора, а после прошивки переставляется в целевое устройство.
Для радиолюбительской практики он особо не нужен, т.к. I SP программатор решает 99% насущных задач, но тем не менее параллельный программатор может пригодиться. Например, если в результате ошибочных действий были неправильно выставлены FUSE биты и был отрублен режим ISP. Параллельному программатору на настройку FUSE плевать с высокой колокольни. Плюс некоторые старые модели микроконтроллеров могут прошиваться только высоковольтным программатором.
Из параллельных программаторов для AVR на ум приходит только:
А также есть универсальные вроде TurboProg 6, BeeProg, ChipProg++, Fiton которые могут прошивать огромное количество разных микроконтроллеров, но и стоят неслабо. Тысяч по 10-15. Нужны в основном только ремонтникам, т.к. когда не знаешь что тебе завтра притащат на ремонт надо быть готовым ко всему.
Прошивка через JTAG
Вообще JTAG это отладочный интерфейс. Он позволяет пошагово выполнять твою программу прям в кристалле. Но с его помощью можно и программу прошить, или FUSE биты вставить. К сожалению JTAG доступен далеко не во всех микроконтроллерах, только в старших моделях в 40ногих микроконтроллерах. Начиная с Atmega16.
Компания AVR продает фирменный комплект JTAG ICEII для работы с микроконтроллерами по JTAG, но стоит он (как и любой профессиональный инструмент) недешево. Около 10-15тыр. Также есть первая модель JTAG ICE. Ее можно легко изготовить самому, а еще она встроена в мою демоплату Pinboard.
Прошивка через Bootloader
Многие микроконтроллеры AVR имеют режим самопрошивки. Т.е. в микроконтроллер изначально, любым указанным выше способом, зашивается спец программка — bootloader. Дальше для перешивки программатор не нужен. Достаточно выполнить сброс микроконтроллера и подать ему специальный сигнал. После чего он входит в режим программирования и через обычный последовательный интерфейс в него заливается прошивка. Подробней описано в статье посвященной бутлоадеру.
Достоинство этого метода еще и в том, что работая через бутлоадер очень сложно закосячить микроконтроллер настолько, что он не будет отвечать вообще. Т.к. настройки FUSE для бутлоадера недоступны.
Бутлоадер также прошит по умолчанию в главный контроллер демоплаты Pinboard чтобы облегчить и обезопасить первые шаги на пути освоения микроконтроллеров.
Pinboard II
Прошивка AVR с помощью демоплаты Pinboard II (для Pinboard 1.1 все похоже)
При работе с микроконтроллерами важнейшим девайсом являетя программатор, именно он может залить в МК нашу программу. Он же часто становится камнем преткновения на пути освоения AVR.
Дело в том, что для работы простейшего программатора, не требующего в своем составе микроконтроллера, нужен компьютер с COM или LPT портом, причем желательно с частотой процессора не выше гигагерца-двух. Да операционную систему подревней — WinXP или Win2K. А это ныне редкость.
С другой стороны, для USB программаторов нужно предварительно прошить контроллер. А чем его прошить? Вот тут и возникает проблема курицы и яйца — как прошить контроллер программатора не имея программатора.
Не так давно появилось решение позволяющее сделать надежный и быстрый USB программатор AVR на базе тупой, непрограммируемой, логики.
Bitbang, что это такое и с чем его едят
Это не что иное как прямое управление выводами какого либо порта. В COM порт можно отправить байт через какой либо высокоупровневый API и он просто выйдет через линию TX потоком стандартого RS232 сигнала.
А можно достучаться напрямую до регистров отвечающих за состоянием каждого пина порта и дрыгая их как нам угодно сэмулировать через тот же COM порт не только RS232, но и SPI, I2C или Dallas 1-wire, HD44780 протокол, применив простейший тупой обвяз. Это и будет битбанг.
В старых программаторах вроде SiProg (PonyProg) или в схеме Громова так и было сделано с COM портом. И работало надежно и стабильно. Но, увы, СОМ порт ушел в небытье, а при попытке сделать то же самое с виртуальным COM портом на конвертере USB-RS232 ничего не получалось. Т.к. заточен он был все же на работу нормального COM порта, а для битбанга приходилось извращаться. В результате такие схемы либо не работали вовсе, либо работали ОЧЕНЬ медленно, прошивая контроллер за час-полтора, что ни в какие ворота не лезет.
Все изменилось с появлением микросхемы конвертера USB-UART FT232R у которой стал доступен битбанг режим не через виртуальный COM порт, а напрямую через драйвер FTDI. И вот тут наступила нирвана.
За битбанг там отвечает 8 выводов. Вот их раскладка.
В даташите ее нет, но она есть в аппликухе Application Note AN_232R-01 for the FT232R and FT245R Bit Bang Modes
В результате, из одной только FTDI получается первоклассный скоростной программатор, прошивающий 16кб прошивки за 10-12 секунд и это вместе с верификацией!!!
А из деталей надо ТОЛЬКО микросхему FT232RL, два конденсатора на 0.1uF и гнездо USB. В СЕ! Ну и проводочки естественно.
Схема включения получается следующей:
Но у этого программатора есть один минус — он не отдает линию RESET по завершении программирования. Поэтому чтобы схема стартанула надо выдрать из платы разьем ISP, что очень неудобно. Я взял и добавил к этой схеме буфферную микросхему. 74HC244, ту самую которая использовалась в программаторе STK200.
Эта микросхема является буффером и по сигналу ОЕ переводить выходные линии в Z состояние. Подал на ОЕ высоки уровень — считай что отрезал программатор от программируемой схемы. Осталось только тумблерок RUN/PROG поставить и одним движением осуществлять запуск.
Но тумблер мне было ставить вломы, поэтому я решил сделать кнопочный переключатель на RS- триггере. Сам триггер собрал на двух 2И-НЕ элементах микросхемы стандартной логики 74HC00 (вроде нашей К155ЛА3 только жрет намного меньше). На это ушло два вентиля. Кнопочки перекидывают его из режима RUN в режим PROG, кондер на одной из кнопок задает начальное положение при включении.
Вытравил и спаял:
Управляющий софт:
Теперь о софте. Шьется все посредством программы avrdude, причем, как я понял, это не простая дудка, а немного переделанная и с дополнительной библиотечкой именно для битбанга. Потому как со старой, то что под USBASP ничего не заработало. А также немного подправленный avrdude.conf, где определен новый программатор.
Работает в винде (в ХП точно, в остальных не проверял, нету у меня их), в линухе и говорят даже на маке.
Линухом я не пользуюсь, мак для меня бесполезен (а с шалфея еще и прет круче! =) ), поэтому показывать буду в винде:
Итак, первым делом дергай у меня архив с похаченной дудкой и конфигом. Также надо тебе поставить драйвера FTDI и воткнуть железку в USB, чтобы в системе появился виртуальный COM порт. Это будет означать что все встало и работает.
Дальше распакуй архив с avrdude где нибудь поближе, C:FTBB например. Консольные утилиты, особенно забугорные, очень не любят русские названия, а также длинные имена с пробелами.
Теперь разберемся с дудкой. Вообще это очень могучая программа, она поддерживает по моему вообще все возможные программаторы. Но консольная, так что потребуется некоторая сноровка. Для примера накачу бутлоадер на ATmega16
Итак, для прошивки нам потребуется командная строка такого вида:
avrdude.exe -p m16 -c ftbb -P ft0 -U flash:w:m16boot.hex:a
avrdude.exe -p m16 -c ftbb -P ft0 -U flash:w:m16boot.hex:a -В 4800
Шить, конечно, будет медленно, раз так в 10 медленней. Но ведь никто не запрещает вначале переткнуть fuse биты на более скоростную частоту, а потом вернуть обратно? 😉
Запустив это, ты должен увидеть на экране разные прогрессбары, вроде таких:
avrdude.exe: 16310 bytes of flash written
avrdude.exe: verifying flash memory against m16boot.hex:
avrdude.exe: load data flash data from input file m16boot.hex:
avrdude.exe: input file m16boot.hex auto detected as Intel Hex
avrdude.exe: input file m16boot.hex contains 16310 bytes
avrdude.exe: reading on-chip flash data:
О fuse битах
Я их шью вот такой строкой (Warning!!! Справедливо ТОЛЬКО ДЛЯ ATmega16, для других AVR значение FUSE байтов другие — надо уточнять по даташиту иначе можно заблокировать кристалл!!!):
avrdude.exe -p m16 -c ftbb -P ft0 -B 4800 -U hfuse:w:154:m -U lfuse:w:228:m -U lock:w:63:m
Тут старший, младший и биты защиты задаются просто числом. Если перевести его в двоичное, то получим конкретные биты. Не очень удобный способ, зато ошибиться с нотацией сложней. Скорость сразу же делаю маленькой, т.к. они все равно прошиваются мгновенно на любой скорости.
А вообще, чтобы не заморачиваться со всемии этими строками и ключами создал себе командный файл burnboot.cmd в который вписал две строчки:
avrdude.exe -p m16 -c ftbb -P ft0 -B 4800 -U hfuse:w:154:m -U lfuse:w:228:m -U lock:w:63:m
avrdude.exe -p m16 -c ftbb -P ft0 -U flash:w:m16boot.hex:a
И теперь шью в один тычок. Вначале накатываются фузы, чтобы скорость тактовую поднять и шить на предельной скорости, потом вкатываю прошивку.
Также есть GUI оболочка на avrdude, правда у ней fuse биты тоже выставляются числом. Но зато можно пути выбирать через стандартные диалоги. Также, надеюсь YOURDEVICE допилит свою оболочку под USBASP до работы с этим программатором. Процесс уже пошел, но пока там сыровато и многие моменты не пашут.
Как юзать
1. Воткнуть ISP кабель в прошиваемую плату.
2. Нажать кнопку PROG — должна загореться зеленая лампочка. Программатор готов к работе.
3. Прошить прошивку, фузы, биты защиты.
4. Нажать кнопку RUN — программатор отпустит линию RESET и контроллер начнет выполнять программу.
Файлы и ссылки к статье
Модифицированный avrdude + все либы и конфиги для него. Там же GUI и мой батник
Схема программатора в формате Spring Layout
Страница автора bitbang метода для FTDI
В общем, программатор получился рулезный. Быстрый и удобный. На аппартном USB конвертере, не требует прошивки собственного контроллера как в USBASP и крайне прост, а в качестве бонуса дает еще и USB-UART интерфейс для отладки.
Остается лишь небольшая такая проблема, вытравить плату и припаять вот это:
Но я уверен, у тебя все получится, может не с первого, так с n-ного раза, но наверняка! =)




