Arduino icsp для чего
Перейти к содержимому

Arduino icsp для чего

  • автор:

What is an ICSP pin?

What is an ICSP pin? I have read that it is an AVR and a tiny programming header for the Arduino, but what is an AVR and what does an ICSP pin do?

Niteesh Shanbog's user avatar

1 Answer 1

ICSP stands for In Circuit Serial Programming, which represents one of the several methods available for programming Arduino boards. Ordinarily, an Arduino bootloader program is used to program an Arduino board, but if the bootloader is missing or damaged, ICSP can be used instead. ICSP can be used to restore a missing or damaged bootloader.

A typical Arduino ICSP header has six pins, arranged 2×3. The article Connecting the Programmer: In-Circuit Serial Programming (ICSP) at Sparkfun describes some of the functions of ICSP pins, which include MISO, MOSI, SCK, V+, Ground, and Reset.

Each ICSP pin usually is cross-connected to another Arduino pin with the same name or function. For example, MISO on an Uno or Nano’s ICSP header is connected to MISO / digital pin 12; MOSI on the ISCP header is connected to MOSI / digital pin 11; and so forth. Note, MISO, MOSI, and SCK pins taken together make up most of an SPI interface.

Several Arduinos, including the Uno, have two ICSP headers. One of them is for use with the ATmega328 (or similar), and the other for use with the ATmega16U2 (or similar) chip that implements USB. When present, this allows reprogramming the USB chip.

AVR refers to the instruction set architecture used in a family of Atmel microcontrollers. Several Arduinos – Mega, Uno, Nano, Micro – use AVR chips. Others, like the Zero and Due, instead use ATSAM3 chips, with an ARM instruction set architecture.

Arduino icsp для чего

  • 5V с помощью этого пина мы подаем питание с платы на внешние устройства. Независимо от источника питания самой платформы напряжение на этом пине остается неизменным.
  • 3.3V — для некоторых датчиков ( например, барометр BMP180) питание в 5 V слишком высокое, именно поэтому на плате дополнительно выведено питание в 3.3 V. С точки зрения пользователя, кроме номинала выходного напряжения, этот выход питания ничем не отличается от своего «соседа» 5V.
  • GND — ground (земля), минус.
  • Vin — пин предназначен для подачи внешнего питания ( 7-12 В) , если мы не используем USB-порт или гнездо питания.
  • IOREF — этот вывод предоставляет платам расширения информацию о рабочем напряжении микроконтроллера Ардуино. В зависимости от напряжения, считанного с вывода IOREF, плата расширения может переключиться на соответствующий источник питания либо задействовать преобразователи уровней, что позволит ей работать как с 5В, так и с 3.3В-устройствами.
  • RESET— этот пин используется для программной перезагрузки платы.
  • Пины А0-А5 имеют возможность считывать извне псевдо-аналоговый сигнал, а также передавать его на внешние устройства.
  • Что такое псевдо-аналоговый сигнал? Аналоговым является непрерывный сигнал, например свет и звук. Для его представления в памяти микроконтроллера он переводится в цифровой путем измерения «высоты» сигнала через определенный промежуток времени. Для получения сигнала, максимально приближенного к аналоговому, необходимо увеличить частоту дискретизации сигнала, т.е. увеличить количество замеров «высоты» аналогового сигнала за секунду.
  • Для того, чтобы иметь возможность обратиться к этим пинам, в программе необходимо использовать команды:
  • Порты А4 и А5 поддерживают I2C

Блок пинов ANALOG IN на Arduino

  • Цифровые пины, обозначаемые как digital, используются для чтения и передачи цифрового сигнала, т.е. «0» или «1» («есть сигнал», «нет сигнала»).
  • Для обращения к этим пинам используются команды:
  • Также у цифровых портов (3,5,6,9,10,11), имеющих обозначения «
  • ICSP-разъём предназначен для внутрисхемного программирования микроконтроллера ATmega328P. С использованием библиотеки SPI данные выводы могут осуществлять связь с платами расширения по интерфейсу SPI. Линии SPI выведены на 6-контактный разъём, а также продублированы на цифровых пинах 10(SS), 11(MOSI), 12 (MISO), 13(SCK). Микроконтроллер ATmega328P.
  • Сердцем платформы Arduino Uno является 8-битный микроконтроллер семейства AVR-ATmega 328

Блок пинов ICSP ATmega328

  • ICSP-разъём предназначен для внутрисхемного программирования микроконтроллера ATmega16U2.
  • Микроконтроллер ATmega16U2 на версии Arduino Uno обеспечивает связь микроконтроллера ATmega328P с USB-портом компьютера. При подключении к ПК Arduino Uno определяется как виртуальный COM-порт. Прошивка микросхемы 16U2 использует стандартные драйвера USB-COM, поэтому установка внешних драйверов не требуется. Аналоги Arduino могут иметь «на борту» CH340 или FT232RL. для которых необходимо дополнительно устанавливать драйверы.

Блок пинов ICSP ATmega16U2.

Распиновка Arduino UNO. Назначение и описание контактов

Платы разработки Ардуино предлагают своим пользователям множество преимуществ, поэтому они идеально подходят для создания различных и интересных устройств. В этой статье мы приводим назначение и описание выводов платы Arduino UNO R3 на базе 8-битного микроконтроллера AVR ATmega328P.

Содержание

1. Arduino UNO распиновка выводов

Большинство моделей Ардуино, включая самую популярную Arduino UNO R3, оснащены 8-битным микроконтроллером AVR ATmega328P. Дорожки на печатной плате соединяют выводы микроконтроллера с гребенкой контактов. Благодаря этому мы можем подключить к Arduino внешние устройства, такие как Arduino Shield, светодиоды, транзисторы, датчики, потенциометры и другие.

Контакты Arduino UNO R3 включают в себя 14 цифровых контактов, 6 аналоговых контактов, разъемы питания, разъем USB и разъем для дополнительного внешнего программатора USB-ASP. Полная схема распиновки платы Arduino UNO R3 показана на следующем рисунке:

Arduino - общая распиновка выводов

2. Arduino — питание платы

Как подключить Arduino к питанию. Как и любое другое электронное устройство, для работы платы Ардуино необходимо подключить питающее напряжение. Питание к Arduino UNO R3 может подаваться тремя способами.

  • Первый способ — использовать разъем питания Arduino 5,5 мм/2,1 мм (круглый). В данном случае выходное напряжение должно быть в диапазоне от 7В до 12В.
  • Второй способ — подать на вывод «VIN» напряжение от внешнего источника в диапазоне от 7В до 12В. Это может быть лабораторный блок питания или два литий-ионных аккумулятора формата 18650, соединенных последовательно. Вывод «VIN» подключен к выпрямительному диоду, что предотвращает повреждение в случае подключения напряжения с обратной полярностью.
  • Третий способ — также питание можно подать через разъем USB типа B — как при подключении Ардуино к компьютеру, так и при питании от зарядного устройства для смартфона. Необходимо иметь в виду, что USB компьютера обеспечивает максимальный ток до 500 мА.

Arduino - питание платы

Мощность блока питания следует подобрать в соответствии с энергопотреблением разрабатываемого устройства. Независимо от выбранного источника питания, схема должна соединяться с землей (GND). На плате Ардуино есть пять контактов «GND», которые гальванически связаны друг с другом.

Также на плате есть контакт «RESET», который после короткого замыкания на землю, например, с помощью кнопки на плате, вызывает временное отключение питания и перезапуск Arduino.

На Arduino можно подать внешний источник опорного напряжения через вывод «IOREF».

3. Arduino — аналоговые контакты

У Arduino UNO 6 аналоговых входов («A0» — «A5»). Эти входы соединены через мультиплексор с входом аналого-цифрового преобразователя (АЦП) микроконтроллера ATmega328.

АЦП преобразовывает входной аналоговый сигнал в диапазоне 0В-5В в цифровую форму. Разрешение АЦП в Ардуино составляет 10 бит. Это означает, что количество уровней напряжения на входе преобразователя равно 1023 с разрешением 4,89 мВ. Разрешение можно расширить с помощью опорного напряжения ниже 5В, которое подается на вывод «AREF».

Arduino - аналоговые контакты

Частота дискретизации преобразователя АЦП составляет примерно 9600 Гц. АЦП будет безупречно обрабатывать данные пока сигнал будет ниже половины частоты дискретизации АЦП, т.е. не более 4800Гц.

Типичные приложения с использованием АЦП Arduino: аналоговые датчики, потенциометры, а также управление голосом через микрофон (VoIP).

4. Arduino — цифровые контакты

У Arduino Uno 14 цифровых контактов («D0» — «D13»), которые можно настроить как входы или выходы. Один из этих контактов «D13» подключен к встроенному светодиоду.

Максимальный ток (нагрузка) каждого цифрового контакта составляет 20 мА. Цифровые выводы работают с логическими состояниями: низкое состояние означает лог.0, а высокое состояние — лог.1. Если цифровые контакты Ардуино настроены как выходы, то низкое напряжение равно 0 В, а высокое равно 5 В.

Arduino - цифровые контакты

Если же цифровые контакты сконфигурированы как входы, принимающие сигналы от внешних устройств, то логические уровни будут другие. Ардуино интерпретирует входное напряжение в диапазоне 0,0В — 0,8В как низкое состояние («0»), а в диапазоне 2,0В до 5,0В как высокое состояние («1»). Диапазон 0,8В — 2,0В означает запрещенное состояние, в котором нет права на изменение логического состояния.

5. Arduino — цифровые выводы с функцией генерации сигналов ШИМ

В дополнение к своей стандартной функциональности некоторые цифровые контакты используются для генерации сигнала ШИМ. Выходы ШИМ в Arduino: «D3», «D5», «D6», D9», «D10» и «D11». По умолчанию частота ШИМ Arduino составляет 490 Гц.

Arduino - цифровые выводы с функцией генерации сигналов ШИМ

Величина скважности определяет, в течение какой части периода на цифровом выводе находиться низкое состояние. Например, если скважность ШИМ-сигнала составляет 40%, то при пиковом напряжении 5В среднее значение напряжения такого сигнала будет равно 2В. Соответственно, чем больше значение коэффициента заполнения, тем выше среднее значение сигнала ШИМ.

Популярными приложениями, использующие ШИМ-сигнал, являются регуляторы скорости электродвигателя, регуляторы яркости светодиодного освещения, музыкальные синтезаторы.

6. Arduino — коммуникационные контакты — интерфейс UART

Ардуино использует несколько интерфейсов для связи с внешними устройствами. Одним из них является протокол UART (Universal Asynchronous Receiver-Transmitter — универсальный асинхронный приемник-передатчик). Это последовательный протокол, реализованный с помощью цифровых выводов:

  • «D0» («RX» — приемник, который получает сигнал от внешнего устройства)
  • «D1» («TX» — передатчик, который отправляет сигнал на внешнее устройство)

Arduino - коммуникационные контакты - интерфейс UART

UART обеспечивает связь с внешними модулями, а также с компьютером, к которому он подключается через USB разъем.

7. Arduino — коммуникационные контакты — интерфейс SPI

Другим интерфейсом, является SPI (Serial Peripheral Interface — последовательный периферийный интерфейс ). Это последовательный протокол, который позволяет микроконтроллеру обмениваться данными с одним или несколькими устройствами. Данный протокол обеспечивает синхронную связь с другим микроконтроллером в топологии Master — Slave.

Arduino - коммуникационные контакты - интерфейс SPI

В Arduino UNO R3 шина SPI имеет следующие контакты:

  • SS (Slave Select) — пин «D10» — выбор адреса ведомого устройства, с которым должен связаться микроконтроллер
  • SCK (Serial Clock) — пин «D13» — тактовый сигнал, синхронизирующий передачу данных в обе стороны
  • MISO (Master Input Slave Output) — пин «D12» — линия отправки информации от ведомых устройств к ведущему устройству
  • MOSI (Master Output Slave Input) — пин «D11» — линия, которая отправляет информацию от ведущего устройства к ведомым устройствам

8. Arduino — коммуникационные контакты — интерфейс I 2 C

Ардуино также имеет шину I 2 C, которая обеспечивает связь между двумя компонентами. Для платы UNO R3 связь по I 2 C реализована с помощью двух контактов:

  • SDA (Data Series) — пин «A4» для передачи данных по шине I 2 C
  • SCL (Serial Clock) — пин «A5» тактового сигнала, синхронизирующий передачу данных по шине I 2 C в обе стороны

Arduino - коммуникационные контакты - интерфейс I2C

Каждое внешнее устройство, которое обменивается данными с Arduino через шину I 2 C, имеет свой уникальный адрес, например, 0x23. К одной шине одновременно может быть подключено до 255 устройств.

9. Arduino — контакты прерывания

В микроконтроллерах, таких как ATmega238P, встроенных в Arduino, мы можем инициировать процедуру внешнего прерывания. Внешнее прерывание — системное прерывание, которое инициируется автоматически с уровня взаимодействующего устройства или вручную с уровня пользователя по причине внешних сигналов.

Простейшим примером использования прерывания является подсчет количества импульсов и определение частоты от внешнего источника сигнала.

Arduino - контакты прерывания

В Arduino UNO R3 за прерывания отвечают следующие контакты:

  • «INT0» — пин «D2»
  • «INT1» — пин «D3»

Активацию и деактивацию каждого из прерываний можно настроить индивидуально в программе: запуск как по спадающему, так и по нарастающему фронту, а также по низкому и высокому состоянию.

10. Arduino — разъем ICSP на UNO R3

ICSP (In-Circuit Serial Programming — внутрисхемное последовательное программирование) — 6-контактный разъем, позволяющий подключить внешний программатор USB-ASP. Это решение реализовано для пользователей, предпочитающих «традиционное» программирование на языках Си и Ассемблер и желающих сэкономить дополнительно 5кБ памяти микроконтроллера, которую занимает загрузчик Ардуино.

Про Ардуино и не только

Arduino as ISP - программатор из Ардуино

Есть у меня пара идей для будущих публикаций, но в них будет использоваться программатор. Поэтому сегодня я расскажу о том, как превратить Ардуино в ISP программатор, для чего он нужен и как им пользоваться. А в качестве примера будет описана процедура прошивки загрузчика в Ардуино.

Что такое ISP?

ISP (In-System Programming) расшифровывается как внутрисхемное программирование. Это технология, которая позволяет программировать микроконтроллер, установленный в устройство. До появления этой технологии микроконтроллеры программировались перед установкой в устройство, а для их перепрограммирования требовалось их извлечение из устройства.

Существует 2 основных подхода внутрисхемного программирования:

  • С использованием программатора. В этом случае программатор работает напрямую с памятью микроконтроллера, самостоятельно размещая байты прошивки по нужным адресам. Микроконтроллер в этом процессе не участвует.
  • С использованием загрузчика. Загрузчик, он же бутлоадер (от английского bootloader) — это программа, записанная обычно в конце ПЗУ микроконтроллера, которая берет на себя функции программатора. При включении микроконтроллера управление сначала передается загрузчику. Он проверяет наличие определенных условий, сообщающих о необходимости перейти в режим программирования. Если условия не выполнены, то управление передается основной программе, в противном случае загрузчик принимает данные по заранее определенному интерфейсу и размещает их в ПЗУ. Таким образом микроконтроллер перепрограммирует сам себя.

Использование загрузчика существенно упрощает процесс перепрограммирования микроконтроллера, что особенно полезно при отладке. Но за удобство приходится платить. Во-первых, загрузчик занимает часть ПЗУ и для программы пользователя остается меньший объем памяти. Во-вторых, загрузчик не может изменить Fuse-биты и Lock-биты (в отличие от программаторов). Ну и, конечно, не обойтись без программатора, если вы хотите обновить бутлоадер или загрузить его в чистый МК. Таким образом существует ряд задач, которые могут быть выполнены только с использованием программатора. Если же у вас нет аппаратного программатора, то вместо него можно воспользоваться Ардуино, о чем и будет рассказано дальше.

Arduino as ISP. Прошивка загрузчика в Ардуино.

Итак, мы решили превратить Ардуино в программатор. Для примера попробуем прошить загрузчик в целевую плату Ардуино. Сначала подготовим плату, которую будем использовать в качестве программатора. Для этого загрузим в нее скетч ArduinoISP, его можно найти в стандартных примерах:

ArduinoISP sketch file

Теперь подсоединим к ней плату, в которую хотим прошить загрузчик. При прошивке используются линии SPI (Serial Peripheral Interface — последовательный периферийный интерфейс). Выводы MOSI, MISO и SCK обеих плат должны быть соединены, а вывод SS Ардуино-программатора подключается к выводу Reset целевой платы. И еще 2 провода нужны чтобы запитать целевую плату. Также может потребоваться предотвратить автоматическую перезагрузку платы-программатора, для этого между ее выводами Reset и GND нужно установить электролитический конденсатор на 10мкФ. Сначала можно попробовать без конденсатора, если же прошивка не начнется, то попробуйте добавить в схему конденсатор. По моим наблюдениям конденсатор нужен при использовании дешевых Ардуино-клонов (без контроллера ATmega8u2) в качестве программатора.

Если мы работаем с двумя платами Arduino Uno, то схема их подключения может выглядеть следующим образом:

Arduino as ISP схема подключения

Если используются не Uno, а другие платы Ардуино, то перед подключением программатора к целевой плате необходимо уточнить расположение на них выводов MOSI, MISO и SCK. Их расположение для различных плат приведено ниже в таблице. Как вы можете видеть, не на всех платах Ардуино линии SPI мультиплексированны с цифровыми выводами, поэтому для подключения к данному интерфейсу необходимо использовать разъем ICSP. Ниже показан пример подключения Uno в качестве программатора к плате Nano через ICSP разъем.

Плата Ардуино MOSI MISO SCK Уровень
Uno, Duemilanove 11 или ICSP-4 12 или ICSP-1 13 или ICSP-3
Nano 11 или ICSP-4 12 или ICSP-1 13 или ICSP-3
Pro Mini 11 12 13 3.3В или 5В
Mega1280, Mega2560 51 или ICSP-4 50 или ICSP-1 52 или ICSP-3
Leonardo ICSP-4 ICSP-1 ICSP-3
Due ICSP-4 ICSP-1 ICSP-3 3.3В
Zero ICSP-4 ICSP-1 ICSP-3 3.3В
101 11 или ICSP-4 12 или ICSP-1 13 или ICSP-3 3.3В
Arduino as ISP схема подключения Nano
Подключение Uno в качестве программатора к плате Nano через ICSP

Обратите внимание на нумерацию выводов ICSP платы Nano: она начинается с правого нижнего угла. Поэтому на приведенной схеме Arduino Nano перевернута.

Теперь необходимо вернуться в Arduino IDE и изменить в ней параметры:

  1. В меню Инструменты > Плата выбираем вариант, соответствующий нашей целевой плате.
  2. В меню Инструменты > Программатор выбираем Arduino as ISP.

Резюмируя вышеописанное, выделим основные шаги для прошивки загрузчика с использованием Ардуино в качестве ISP программатора:

  • Запускаем Arduino IDE, открываем из примеров скетч ArduinoISP и загружаем его в плату Ардуино, которую будем использовать как программатор.
  • Подключаем к Ардуино-программатору целевую плату по приведенной схеме.
  • Меняем плату в Arduino IDE на целевую.
  • Выбираем в IDE программатор Arduino as ISP.
  • Записываем загрузчик в целевую плату командой из меню IDE.

Прошивка скетча с использованием Arduino as ISP

Еще один пример использования программатора — это загрузка скетча в целевую плату. Разумеется, это проще сделать привычным способом, подключив ее напрямую к компьютеру, но это может оказаться невозможным, например, при выходе из строя контроллера ATmega8u2/ATmega16u2 или преобразователя USB/UART. Если при этом основной микроконтроллер Ардуино остался рабочим, то мы можем прошить его, используя программатор. Для этого выполняем все шаги, описанные выше, но на последнем этапе вместо записи загрузчика необходимо:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *