Про Ардуино и не только: Arduino as ISP
Arduino as ISP – программатор из Ардуино
Есть у меня пара идей для будущих публикаций, но в них будет использоваться программатор. Поэтому сегодня я расскажу о том, как превратить Ардуино в ISP программатор, для чего он нужен и как им пользоваться. А в качестве примера будет описана процедура прошивки загрузчика в Ардуино.
Что такое ISP?
ISP (In-System Programming) расшифровывается как внутрисхемное программирование. Это технология, которая позволяет программировать микроконтроллер, установленный в устройство. До появления этой технологии микроконтроллеры программировались перед установкой в устройство, а для их перепрограммирования требовалось их извлечение из устройства.
Существует 2 основных подхода внутрисхемного программирования:
- С использованием программатора. В этом случае программатор работает напрямую с памятью микроконтроллера, самостоятельно размещая байты прошивки по нужным адресам.
- С использованием загрузчика. Загрузчик, он же бутлоадер (от английского bootloader) – это программа, записанная обычно в конце ПЗУ микроконтроллера, которая берет на себя функции программатора. При включении микроконтроллера управление сначала передается загрузчику. Он проверяет наличие определенных условий, сообщающих о необходимости перейти в режим программирования. Если условия не выполнены, то управление передается основной программе, в противном случае загрузчик принимает данные по заранее определенному интерфейсу и размещает их в ПЗУ. Таким образом микроконтроллер перепрограммирует сам себя.
Одной из важнейших особенностей Ардуино является возможность программирования непосредственно через USB порт, без дополнительного программатора. Сразу после включения Ардуино запускается загрузчик, который работает несколько секунд. Если за это время загрузчик получает команду программирования от IDE по последовательному интерфейсу UART, то он принимает и загружает новую программу в память микроконтроллера.
Использование загрузчика существенно упрощает процесс перепрограммирования микроконтроллера, что особенно полезно при отладке. Но за удобство приходится платить. Во-первых, загрузчик занимает часть ПЗУ и для программы пользователя остается меньший объем памяти. Во-вторых, загрузчик не может изменить Fuse-биты и Lock-биты (в отличие от программаторов). Ну и, конечно, не обойтись без программатора, если вы хотите обновить бутлоадер или загрузить его в чистый МК. Таким образом существует ряд задач, которые могут быть выполнены только с использованием программатора. Если же у вас нет аппаратного программатора, то вместо него можно воспользоваться Ардуино, о чем и будет рассказано дальше.
Arduino as ISP. Прошивка загрузчика в Ардуино.
Итак, мы решили превратить Ардуино в программатор. Для примера попробуем прошить загрузчик в целевую плату Ардуино. Сначала подготовим плату, которую будем использовать в качестве программатора. Для этого загрузим в нее скетч ArduinoISP, его можно найти в стандартных примерах:
Теперь подсоединим к ней плату, в которую хотим прошить загрузчик. При прошивке используются линии SPI (Serial Peripheral Interface – последовательный периферийный интерфейс). Выводы MOSI, MISO и SCK обеих плат должны быть соединены, а вывод SS Ардуино-программатора подключается к выводу Reset целевой платы. И еще 2 провода нужны чтобы запитать целевую плату. Также может потребоваться предотвратить автоматическую перезагрузку платы-программатора, для этого между ее выводами Reset и GND нужно установить электролитический конденсатор на 10мкФ. Сначала можно попробовать без конденсатора, если же прошивка не начнется, то попробуйте добавить в схему конденсатор. По моим наблюдениям конденсатор нужен при использовании дешевых Ардуино-клонов (без контроллера ATmega8u2) в качестве программатора.
Если мы работаем с двумя платами Arduino Uno, то схема их подключения может выглядеть следующим образом:
Если используются не Uno, а другие платы Ардуино, то перед подключением программатора к целевой плате необходимо уточнить расположение на них выводов MOSI, MISO и SCK. Их расположение для различных плат приведено ниже в таблице. Как вы можете видеть, не на всех платах Ардуино линии SPI мультиплексированны с цифровыми выводами, поэтому для подключения к данному интерфейсу необходимо использовать разъем ICSP. Ниже показан пример подключения Uno в качестве программатора к плате Nano через ICSP разъем.
Плата Ардуино | MOSI | MISO | SCK | Уровень |
---|---|---|---|---|
Uno, Duemilanove | 11 или ICSP-4 | 12 или ICSP-1 | 13 или ICSP-3 | 5В |
Nano | 11 или ICSP-4 | 12 или ICSP-1 | 13 или ICSP-3 | 5В |
Pro Mini | 11 | 12 | 13 | 3.3В или 5В |
Mega1280, Mega2560 | 51 или ICSP-4 | 50 или ICSP-1 | 52 или ICSP-3 | 5В |
Leonardo | ICSP-4 | ICSP-1 | ICSP-3 | 5В |
Due | ICSP-4 | ICSP-1 | ICSP-3 | 3.![]() |
Zero | ICSP-4 | ICSP-1 | ICSP-3 | 3.3В |
101 | 11 или ICSP-4 | 12 или ICSP-1 | 13 или ICSP-3 | 3.3В |
Подключение Uno в качестве программатора к плате Nano через ICSP |
Обратите внимание на нумерацию выводов ICSP платы Nano: она начинается с правого нижнего угла. Поэтому на приведенной схеме Arduino Nano перевернута.
Теперь необходимо вернуться в Arduino IDE и изменить в ней параметры:
- В меню Инструменты > Плата выбираем вариант, соответствующий нашей целевой плате.
- В меню Инструменты > Программатор выбираем Arduino as ISP.
Подключаем плату-программатор к компьютеру, открытый в данный момент скетч значения не имеет, выбираем пункт меню Инструменты > Записать загрузчик и дожидаемся сообщения об успешном завершении операции.
Резюмируя вышеописанное, выделим основные шаги для прошивки загрузчика с использованием Ардуино в качестве ISP программатора:
- Запускаем Arduino IDE, открываем из примеров скетч ArduinoISP и загружаем его в плату Ардуино, которую будем использовать как программатор.
- Подключаем к Ардуино-программатору целевую плату по приведенной схеме.
- Меняем плату в Arduino IDE на целевую.
- Выбираем в IDE программатор Arduino as ISP.
- Записываем загрузчик в целевую плату командой из меню IDE.
Прошивка скетча с использованием Arduino as ISP
Еще один пример использования программатора – это загрузка скетча в целевую плату. Разумеется, это проще сделать привычным способом, подключив ее напрямую к компьютеру, но это может оказаться невозможным, например, при выходе из строя контроллера ATmega8u2/ATmega16u2 или преобразователя USB/UART.
- Открыть в Arduino IDE интересующий скетч.
- Загрузить скетч в целевую плату командой из меню IDE: Скетч > Загрузить через программатор.
Таким образом можно подарить вторую жизнь плате Ардуино, которую компьютер уже не видит через USB.
- Arduino UNO
- ATtiny85 ИС
- Светодиод
- Резистор 220 Ом
- Макет
- Проволочные перемычки
- Arduino Pin 13 — ATMega 16 Pin 8 (или SCK другого микроконтроллера)
- Arduino Pin 12 на ATMega 16 Pin 7 (или MISO другого микроконтроллера)
- Arduino Pin 11 — ATMega 16 Pin 6 (или MOSI другого микроконтроллера)
- Arduino Pin 10 на ATMega 16 Pin 9 (или СБРОС другого микроконтроллера)
- Arduino 5+ на ATMega 16 Pin 10 (или Vcc другого микроконтроллера)
- Arduino Gnd на ATMega 16 Pin 11 (или Gnd другого микроконтроллера)
- Конденсатор 10 мкФ между контактом сброса Arduino и контактом Gnd (+ve ветвь конденсатора должна подключаться к контакту сброса)
- Светодиод через соответствующий резистор на любом выводе микроконтроллера, которым вы будете управлять через код
Универсальный мини программатор из Ардуино Uno своими руками, прошивка ArduinoISP
Какое-то время у меня валялась Arduino Uno. И вот нашлось ей применение. Сделал удобный шилд для прошивки ходовых контроллеров в разных корпусах. Теперь данная отладочная плата активно используется. Шилд позволяет прошивать довольно много контроллеров от ATMEL, которые все еще популярны среди самодельщиков по многим параметрам. Итак, под катом изготовление шилда для прошивки микроконтроллеров Atmega8 (168/328), Attiny13(45/85), причем, как в DIP корпусах, так и в QFP и SOIC, используя адаптеры.
Ссылку я дал на похожую отладочную плату Arduini Uno, поскольку уже и не помню где брал свою. Моя платка с закосом под оргинал (конечно же это копия — поскольку брал в Китае):
Собственно, тут уже было немало обзоров на эту плату, поэтому перейдем сразу к шилду.
Схема шилда, довольно простая:
Конденсатор C4 позволяет не перезагружаться самой Arduino Uno во время прошивки, без него такое бывает и прошить не удается. На схеме видно два разъема для подключения контроллеров в корпусах dip28 и dip8. Для dip28 предусмотрен кварц с конденсаторами С2 и С3. Также на плате предусмотрен стандартный разъем ICSP для подключения, например, своих плат и их прошивки. Как и при типовом использовании, вывод 10 Arduino соединен с RESET программируемых контроллеров. Выводы 11, 12,13, представляющие ICSP соединены с аналогичными на подключаемых микроконтроллерах. На подключаемые контроллеры подается питание и земля от Arduino Uno. К выводам Arduino 7,8,9 через токоограничительные резисторы в 1КОм подключены индикационные светодиоды.

Платка получилась такая:
Желающие могут скачать файл платы, в формате для Sprint Layout. Также можно скачать готовые для заказа в Китае (или на местном производстве) gerber-файлы.
На плате видны две версии отверстий для dip28 в узком и широком корпусе, это сделано для подключения адаптера QFP32 в DIP28, обзор которого я делал здесь. Кроме того, если припаять разъем для узкой версии контроллера, то в отверстия для широкой версии можно припаять линейки штырьков и сразу тестировать прошитый контроллер. Для dip8 я также предусмотрел, помимо адаптера, отверстия для штырьков. Также имеются две версии ICSP разъемов широкий (10 контактов) и узкий (6 контактов), ну и все остальные детали, присутствующие на схеме. Светодиоды, резисторы и конденсаторы (22пФ) я использовал SMD 1206. Светодиоды распределил так: Зеленый — READY, Красный — ERROR, Желтый — PROG. Также предусмотрел штырьки для дополнительного питания и земли, которые могут потребоваться при тестировании прошиваемого контроллера.
Платы я заказывал в dirtypcbs.com, скорее всего я бы изготовил их ЛУТ-ом, но данный сервис разрешает панелизацию, а у меня как раз нашлось подходящее место на плате в заказе, да и спешки особой не было. Заводская плата выглядит все-таки гораздо лучше. Вот так они выглядят:
Припаиваем детали, я изготовил 2 версии, для широкого dip28:
Здесь я не стал припаивать штырьки и разъемы, так как планирую эту плату использовать для прошивки контроллеров с помощью адаптеров в корпусах SOIC и QFP.
Для узкого dip28:
Как видно из фото, для подключения микросхем в dip корпусах я использовал цанговые разъемы, мне они нравятся больше.
Адаптер QFP32 в DIP28 для подключения в широкую версию шилда:
Встает отлично:
Весь бутерброд, включая Arduino Uno:
Для узкой версии со вставленным контроллером ATtiny85:
Для прошивки контроллеров в SOIC8 корпусе я использую также адаптер:
Для того чтобы наша конструкция стала программатором, следует без шилда загрузить в Arduino Uno прошивку ArduinoISP, идущую в комплекте с любой версией Arduino IDE:
С таким шилдом стало очень удобно и быстро прошивать и тестировать контроллеры в различных корпусах, не боясь нарушить соединения как здесь:
Пример загрузки программы мигания диодом с помощью шилда и проверка его работы на месте:
На этом заканчиваю. Спасибо всем, кто дочитал до конца! Надеюсь, что кому-то приведенная информация окажется полезной. Всех со странным праздником: Старым Новым Годом!
Как запрограммировать микросхему микроконтроллера ATtiny85 с помощью Arduino Uno
Чип микроконтроллера ATtiny85 — это доступная и мощная альтернатива другим микроконтроллерам Arduino, особенно если вы хотите сократить свой проект. Чип имеет 8 контактов, шесть из которых являются контактами ввода-вывода (включая сброс), а два — контактами питания. Но как его запрограммировать, если у него нет USB-интерфейса, как у других плат микроконтроллеров? Итак, в этой статье я расскажу вам о процессе программирования для ATtiny85 9.0004 из Arduino IDE с помощью Arduino Uno. По сути, мы будем использовать Arduino UNO в качестве программатора ATtiny85 .
Компоненты, необходимые для программирования ATtiny85
Чип микроконтроллера ATtiny85 — введение
ATtiny85 компании Atmel — это высокопроизводительный 8-разрядный микроконтроллер с низким энергопотреблением, основанный на усовершенствованной архитектуре RISC. Этот чип микроконтроллера оснащен флэш-памятью ISP 8 КБ, EEPROM 512 байт, SRAM 512 байт, 6 линиями ввода-вывода общего назначения, 32 рабочими регистрами общего назначения, одним 8-разрядным таймером/счетчиком с режимами сравнения, одним 8-разрядным высокоскоростным таймер/счетчик, USI, внутренние и внешние прерывания, 4-канальный 10-разрядный аналого-цифровой преобразователь, программируемый сторожевой таймер с внутренним генератором, три программно выбираемых режима энергосбережения и debugWIRE для встроенной отладки. ATtiny85 Распиновка приведена ниже:
Большинство контактов ввода-вывода микросхемы имеют более одной функции. Ознакомьтесь с приведенной ниже таблицей, чтобы узнать описание контакта ATtiny85 для каждого контакта.
Номер контакта | Название контакта | Описание контакта |
1 | PB5(PCINT5/ADC0/dW) | PCINT5 : Прерывание смены контакта 0, Source5 СБРОС : Сброс Pin АЦП0: Входной канал АЦП 0 dW: отладка ПРОВОД В/В |
2 | PB3 (PCINT3/XTAL1/CLKI/ADC3) | PCINT3: Прерывание смены контакта 0, Source3 XTAL1: Кварцевый генератор Pin1 CLKI: Внешний тактовый вход АЦП3: Входной канал АЦП 3 |
3 | PB4 (PCINT4/XTAL2/CLKO/OC1B/ADC2) | PCINT4: Прерывание смены контакта 0, источник 4 XTAL2: Кварцевый осциллятор, контакт 2 CLKO: Выход системных часов OC1B: Таймер/Счетчик 1 Сравнить Совпадение B Выход АЦП2: Входной канал АЦП 2 |
4 | ЗЕМЛЯ | Контакт заземления |
5 | PB0(MOSI/DI/SDA/AIN0/OC0A/AREF/PCINT0) | MOSI: SPI Master Data Output / Slave Data Input DI: Ввод данных USI (трехпроводной режим) SDA: Ввод данных USI (двухпроводной режим) AIN0: Аналоговый компаратор, положительный вход OC0A: Timer/Counter0 Compare Match A output AREF: Внешнее аналоговое задание PCINT0: Прерывание смены контакта 0, источник 0 |
6 | PB1(MISO/D0/AIN1/OC0B/OC1A/PCINT1) | MISO: SPI Master Data Input / Slave Data Output DO: Вывод данных USI (трехпроводной режим) AIN1: Аналоговый компаратор, отрицательный вход OC0B: Таймер/счетчик 0 Сравните совпадение выхода B OC1A: Сравнение таймера/счетчика 1 Совпадение с выходом A PCINT1: Прерывание смены контакта 0, источник 1 |
7 | PB2 (SCK/USCK/SCL/ADC1/T0/INT0/PCINT2) | SCK: Последовательный тактовый вход USCK: Часы USI (трехпроводной режим) SCL: Часы USI (двухпроводной режим) АЦП1: Входной канал АЦП 1 T0: Таймер/счетчик 0 Источник тактового сигнала
INT0: Внешнее прерывание 0 Вход PCINT2: Прерывание смены контакта 0, источник 2 |
8 | ВКЦ | Напряжение питания Контакт |
Шаг 1: Настройка Arduino Uno в качестве интернет-провайдера:
Поскольку ATtiny85 — это всего лишь микроконтроллер, для его программирования требуется ISP (внутрисистемное программирование). Таким образом, чтобы запрограммировать ATtiny85, нам нужно сначала настроить Arduino Uno в качестве интернет-провайдера, чтобы он действовал как программатор для ATtiny85. Для этого подключите Arduino Uno к ноутбуку и откройте среду разработки Arduino IDE. После этого перейдите к Файл > Пример > ArduinoISP и загрузите код Arduino ISP.
Шаг 2: Схема для программирования ATtiny85:
Полная схема программирования ATtiny85 с Arduino Uno приведена ниже: IC. Полные соединения приведены в таблице ниже:
Пин ATtiny85 | Пин-код Arduino Uno |
Вкк | 5В |
ЗЕМЛЯ | ЗЕМЛЯ |
Контакт 2 | 13 |
Контакт 1 | 12 |
Контакт 0 | 11 |
Сброс | 10 |
Шаг 3: Программирование ATtiny85 с помощью Arduino IDE:
Чтобы запрограммировать ATtiny85 с помощью Arduino IDE, сначала нам нужно добавить поддержку ATtiny85 в Arduino IDE. Для этого перейдите в Файл > Настройки и добавьте ссылку ниже в URL-адреса менеджера дополнительных досок и нажмите «ОК». x-boards-manager/package_damellis_attiny_index.json
После этого перейдите к Tools > Board > Board Manager , найдите «attiny» и установите последнюю версию.
После его установки вы сможете увидеть новую запись в меню Board под названием ‘Attiny25/45/85’ .
Теперь перейдите к File > Examples > Basics и откройте пример Blink.
Измените номер контакта с LED_BUILTIN на 0.
Теперь вернитесь к Tools -> Board и выберите «Attiny25/45/85», затем выберите ATtiny85 в разделе Tools > Processor .
Теперь загрузите код. Если светодиод, подключенный к контакту 0 микросхемы Attiny85, мигает, значит, код загружен успешно.
Вот как можно запрограммировать микроконтроллер ATtiny85 с помощью Arduino IDE и Arduino Uno. Рабочее видео представлено ниже. Если у вас есть какие-либо вопросы, оставьте их в разделе комментариев. Вы также можете опубликовать свои технические вопросы на нашем форуме по электронике, чтобы получить более полное представление.
Используйте Arduino в качестве ISP-программатора для программирования микроконтроллеров AVR, отличных от Arduino. Hardware Fun
Tweet
программатор ISP для программирования этих микроконтроллеров вместо использования отдельного специального программатора AVR.
Ответ однозначный да, и я использую его все время, так как у меня валяется много Ардуино. Я подумал о написании учебника, чтобы он был полезен для других, кто хочет это сделать.
В этом уроке я покажу, как вы можете запрограммировать микроконтроллер AVR, отличный от Arduino, такой как AtMega 16/16A, используя Arduino в качестве программатора ISP.
Загрузка скетча Arduino ISP
По умолчанию Arduino IDE поставляется со скетчем ISP. Все, что вам нужно сделать, это открыть его в Arduino IDE (или с помощью моего make-файла Arduino), затем подключить Arduino к компьютеру, а затем загрузить скетч в Arduino.
На этом этапе вам не следует подключать что-либо еще к Arduino, и вы найдете скетч Arduino ISP в Файл -> Примеры -> ArduinoISP
Установка ядра Arduino для вашего микроконтроллера
Следующим шагом будет найти поддержку ядра Arduino для микроконтроллера, который вы хотите запрограммировать, а затем установить его.
Если вы хотите запрограммировать ATMega 16/16A, то вы можете использовать мое «дополнительное ядро Arduino». Я также написал отдельный учебник, объясняющий, как его использовать. Или, если вы хотите программировать микроконтроллеры ATtiny, вы можете использовать ядро ATtiny от Дэвида Меллиса, одного из соучредителей Arduino.
В большинстве случаев вам просто нужно поместить эти файлы ядра в /hardware
в папке вашего альбома для рисования, но обратитесь к документации используемой вами базовой библиотеки.
Подключение схемы
Следующим шагом является подключение микроконтроллера к Arduino. На приведенной ниже схеме показано, как подключить ATMega 16/16A. В целом принцип остается тем же и для других микроконтроллеров.
Запрограммируйте ATMega 16, используя Arduino в качестве ISP Programmer
Ниже приведены различные соединения контактов
Вот как выглядит мое соединение
Запрограммируйте ATMega 16, используя Arduino в качестве ISP Programmer
Запишите загрузчик/предохранитель
Следующий шаг — запишите загрузчик и/или предохранители.