Прошивка AVR (ATMEGA328) различными программаторами (в том числе и из-под Arduino)

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

Итак, в качестве хобби я решил разработать для своей компании электронное устройство с «сердцем» в виде микропроцессора ATMEGA328P. Да-да, именно на основе той микросхемы, что применяется в Arduino. Только вот никакой обвязки вокруг микросхемы нет. В ней некуда подключать USB, полностью отсутствует и внешний стабилизатор питания, не говоря уже о каких-либо индикаторных светодиодах. И это чудо как-то нужно программировать, как-то заливать в него свою прошивку, как-то оживлять. Я уделил данному вопросу некоторое внимание в своей статье по детальному анализу среды разработки Arduino «Arduino IDE: разбираемся с меню Tools и некоторыми другими функциями», а в этой статье я лишь продолжу изыскания по своим наработкам.

atmel studio, blink, arduino, assempler, c++, c/c++, open, file, version7

Интерфейс Atmel Studio с импортированным Blink из Arduino

Прошивать ATMEGA можно при помощи Atmel Studio, специальной среды разработки для AVR. Среда обладает неплохим набором инструментов для полноценной разработки чего-либо под фирменные микроконтроллеры. В 7-й версии «из коробки» доступно создание проектов на С, С++ и на Assembler. Более того, возможно создание проекта из скетча Arduino. При всем при этом у разработчика в руках оказывается отладчик, с возможностью дизассемблирования кода, просмотра всех регистров и любого уголочка памяти микроконтроллера. Прямо-таки золотая мечта любого ардуиниста. А если учесть, что программировать и отлаживать код, в большинстве сценариев, можно на эмуляторе микроконтроллера, то очевидно, что Atmel Studio кроет Arduino IDE с заметными преимуществами. Но… Atmel Studio — профессиональный инструмент и для подавляющего большинства энтузиастов окажется слишком затратным по времени для изучения. Поэтому дальше речь пойдет больше про Arduino IDE в связке с AVRDUDE. Тем не менее, если вы вдруг, после знакомства с Atmel Studio почувствовали нестерпимый зуд от желания познакомиться с этой IDE поближе, то You Are Welcome. А мы же продолжим далее.

Способы программирования «голой» ATMEGA328

Программировать ATMega328, впрочем, и другие микроконтроллеры AVR, можно как напрямую из-под Arduino IDE, так и через AVRDUDE. При использовании AVRDUDE необходимо скомпилировать в Arduino IDE прошивку в файл с расширением hex. В этом случае прошить микроконтроллер можно через ISP (что означает это и другие сокращения я подробно разжевал в статье про Arduino IDE, ссылка выше по тексту). Для прошивки микроконтроллера напрямую из-под Arduino IDE, как прошиваются любые Arduino и совместимые с ними платы, необходима предварительная установка bootloader в микроконтроллер (осуществляется через ISP), а в дальнейшем можно прошивать и через USB-TTL преобразователь.

Для нормальной прошивки через USB-TTL на нем должен присутствовать вывод DTR, который программно-аппаратным способом сбрасывает микроконтроллер и тот загружается в bootloader. Который, в свою очередь, уже загружает прошивку через USB-TTL. Если подобного вывода нет, то при начале загрузки нужно применять человеческо-аппаратный способ перезагрузки микроконтроллера, т.е. жать пальцем на сброс. Если наловчиться, то таким образом можно вполне успешно прошивать AVR из-под Arduino IDE без разводки DTR на USB-TTL преобразователе.

Прошивка загрузчика (bootloader) возможна через ISP, хотя в некоторых случаях вы можете приобрести микроконтроллер в виде микросхемы, но с уже прошитым загрузчиком. Стоят такие микросхемы немного дороже, чем полностью пустые, но при этом нет необходимости мудрить с ISP программатором, думать о FUSE и загрузчике, все происходит намного проще. USB-TTL необходим не только для загрузки скетчей напрямую из Arduino IDE, но и для общения с микроконтроллером через последовательный порт (тот самый наш любимый Serial.println). А если учесть, что единственный вменяемый способ отладки в Arduino IDE — вывод в Serial, то без USB-TTL не обойтись никак. И получается, что для нормальной работы потребуется и ISP-программатор, и USB-TTL преобразователь. Поэтому стоит озаботиться тем и другим сразу.

Приобретая для разработки или опытов микроконтроллеры ATMEGA желательно сразу взять их с запасом. Стоят они недорого, а окирпичиваются они на начальном этапе обучения работы с ними ой как легко и просто. Да, конечно, восстановить микросхему можно, только вот придется применять еще один вид программатора — высоковольтный. Но рассмотрение подобного процесса слегка выходит за пределы данной статьи. Поэтому при прописывании FUSE стараемся не допускать ошибки и внимательно читаем описание самих микроконтроллеров от производителя. Я уже провел небольшую работу и выбрал неплохой (стандартный) загрузчик и произвел настройку FUSE для ATMEGA328P. Все необходимые материалы собрал в архив. Распаковывать его нужно в директорию, в которой у вас хранятся ваши скетчи в Arduino IDE, в той же директории располагается и папка libraries, куда Arduino IDE складывает все инсталлируемые библиотеки. Важно, для работы ATMEGA328 я использую встроенный, внутренний резонатор, а не внешний кварц. Если у вас другая конфигурация, то FUSE надо изменить под нее.

Для удобства программирования «голых» микросхем пришлось собрать небольшую плату с рычажной «панелькой» для микросхем.

connfly,atmega328p u, кнопка тактовая, панелька, ISP-разъем, матрешка

Собранная плата выглядит не так монстроидально, все провода спрятаны под платой.

Плата примитивна до безобразия. На ней присутствуют два светодиода (не забываем про резисторы), один подключен к разъему USB, второй к пину 7 Arduino (у микросхемы это 13-я ножка, предпоследняя в нижнем ряду). Единственная кнопка на плате заведена на 1-ю ножку микросхемы и соединяет ее с «землей» платы. Используется кнопка, как не трудно догадаться, для сброса микроконтроллера через сигнал Reset. Дополнительно на плате разведен 6-ти пиновый разъем для подключения ISP-программатора, а также шестипиновый разъем для подключения USB-TTL. Разъем USB применяется лишь для подачи внешнего питания на микросхему (фирменные ISP-программаторы проверяют наличие внешнего питания на микросхеме, но при этом сами ее не запитывают, поэтому требуется подключение внешнего питания).

atmega328, usb, схема, плата, светодиод, тактовая кнопка, разводка, панелька

Схема платы для программирования голеньких микросхем ATMEGA328.

Для питания микросхемы я использую напряжение 5V получаемое от USB, на такое же напряжение сделана и разводка у разъема USB-TTL. ATMEGA328P работает при напряжениях от 1.8 и до 5.5 вольт, так что сильно по поводу питания в плате заморачиваться не стоит, однако при работе не следует питать микроконтроллер напряжением ниже, чем 2.5 вольта если применяются операции записи во внутреннюю память. Могут быть сбои.

Для проверки того, что все собранно верно я слегка модифицировал обычный Blink из поставки Arduino IDE. Такой код так же удобно прошивать сразу вместе с загрузчиком, дабы убедиться, что все прошло так как следует.

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(7, OUTPUT);
  Serial.begin(19200);
  Serial.println("Blinker2Mod");  
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(7, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(500);                       // wait for a second
  digitalWrite(7, LOW);    // turn the LED off by making the voltage LOW
  delay(500);                       // wait for a second
  Serial.println("Blink...");  
}

Ну, что же, все вводные данные есть, можно приступать и к программированию.

Прошиваем AVR при помощи AVRISP mkii

Прошить ATMEGA328P можно при помощи AVRDUDE и скомпилированного при помощи Arduino исходного кода. Поскольку AVRDUDE является основным прошивальщиком в Arduino для прошивки без загрузчика, то он уже имеется в системе и обычно располагается в папке с установленной Arduino IDE, далее в hardware, tools, avr и там в папке bin. Можно найти его и поиском в системе на наличие файла avrdude.exe. AVRDUDE — утилита командной строки, поэтому работать с ней придется руками. Компилируем файл, указываем все параметры. А если ошибемся, то могут прописаться неверные fuses и чип скорее всего придется выкинуть.

avr, avrduddes, avrdudess, avrdude gui, arduino, atmga328p

Интерфейс с установленными FUSEs, выбранным файлом для прошивки

А можно применить AVRDUDESS, специальную графическую оболочку, существенно облегчающую работу по прошивке AVR руками. При работе с AVRDUDESS важно проверить установку всех fuses, так как то, что было прописано в настройках платы в Arduino тут уже не имеет никакого значения, все нужно переустанавливать с нуля или считать с работающей микросхемы. Кстати, при помощи AVRDUDE или AVRDUDESS можно не только прошить AVR, но и считать прошивку, в откомпилированном виде, с микросхемы, если такая функция не была отключена при предыдущей прошивке, разумеется.

Для получения скомпилированной прошивки, в Arduino IDE выбираем меню Sketch, а в нем Export Compiled Binary, не забыв выбрать в качестве платы нашу ATmega328 on a Breadboard. В разных версия IDE пункт экспорта находился в разных меню, поэтому есть определенная сложность в его определении при обновлении версий.

проводник, arduino, blink, hex

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

Перед прошивкой еще раз проверяем все настройки в интерфейсе программы, выбираем верный чип, проверяем, что он читается, выбираем нужную прошивку и жмем на Go. Если последующая загрузка через bootloader не предполагается, то прошивать можно версию файла без загрузчика, экономится место и микросхема быстрее стартует (так как нет загрузчика, то управление передается сразу на основной код).

Прошиваем AVR при помощи AVRISP mkii из Arduino

Но прошивать AVR можно не только при помощи AVRDUDESS, но и напрямую из Arduino. В старых версиях Arduino IDE все было немного сложнее, для AVRISP требовался специальный драйвер, не идущий вместе с Atmel Studio, а свой собственный, нужно было вносить изменения в конфигурационные файлы Arduino IDE, но сейчас все стало намного проще.

avrisp, seedstudio

AVRISP от SeedStudio

По факту в железе я использую AVRISP 2.0 STK500 от SeedStudio. Программатор подключается по USB и работает в системе с драйвером USB-Serial CH340. Для работы с этим драйвером и программатором напрямую из-под Arduino IDE необходимо:

  • Выбрать в качестве платы нашу ATmega328P on a Breadboard.
  • Выбрать правильный COM-порт, на котором обосновался программатор.
  • Выбрать Atmel STK500 Development board в качестве программатора.

Затем в меню Sketch используем пункт Upload using Programmer. Скетч компилируется в бинарный код, а затем загружается через AVRDUDE и программатор в микроконтроллер. При помощи AVRISP можно только загрузить прошивку, никакого общения через последовательный порт (Serial.println) при помощи ISP не будет. Все работает только в одну сторону.

Если у вас возникли проблемы при закачке прошивки через ISP-программатор из-под Arduino IDE, то можно ознакомиться с оригинальной темой на Arduino.cc посвященной как раз решению подобного. И еще раз повторюсь по поводу разницы между Atmel AVR Development board и AVRISP mkii. Первое это плата, позволяющая заниматься разработкой на основе микроконтроллеров семейства AVR. А AVRISP это часть этой платы, интегрированный программатор, который, может существовать и в виде отдельного, более дешевого, устройства. Соответственно сейчас имеет смысл обращаться внимание на Atmel Development board версии 2 и выше, а также программатор AVRISP mkii. Хотя с другой стороны, сама Atmel уже не продается AVRISP mkii и вместо него рекомендует приобретать Atmel-ICE, позволяющий не только прошивать микросхемы, но и отлаживать код прямо в чипе.

Прошиваем AVR при помощи «красного» модуля на CP2102 и с 5 выводами

В наименовании CP2102 модуль USB2TTL скорее не название модуля, а название чипа, который и производит преобразование из USB в TTL и обратно. Сам чип изготавливается Silicon Labs. На сайте производителя можно ознакомиться со спецификацией на модуль или же скачать драйвера (у меня на Win10 драйвера оказались уже в наличии, чип определяется как Silicon Labs CP210x USB to UART Bridge и занимает доступный COM-порт).

Несмотря на то, что сам чип оснащен множеством выходов, а о них ниже, изготовитель модуля распаял только 2 из них, всего же на плате со стороны UART-интерфейса располагается 5 выходов.

txd. rxd, cts, rts, dsr, dtr, dcd, out, in, расшифровка

Типы вводов/выводов UART. Out выход с чипа в UART, In вход с UART в чип USB2TTL.

Согласно спецификации чипа, для успешной работы необходимо подключить только TXD и RXD, собственно, как раз асинхронные (последовательные, где данные передаются в виде последовательности по одному проводнику) шины по обмену данными. Одна шина для приема, одна для передачи. Помимо TXD и RXD на плате модуля присутствует вывод «земля», питание 5V и питание 3.3V со встроенного стабилизатора.

cp2102, cp210x, красный, red, 5 pins, USB2TTL, USB to UART

Красный модуль на чипе CP2102 с пятью выводами.

Для чего может быть использован этот модуль? Во-первых, для подачи питания от USB на плату для прошивки «голенького» микроконтроллера. Напомню, что для прошивки программатором через ISP интерфейс необходимо наличие внешнего питания на микроконтроллере. Так же можно использовать его для обмена между ПК и микроконтроллером через последовательный порт. Например, можно к микроконтроллеру подключить терминал и передать команду в микроконтроллер или же просто посмотреть диагностический вывод. Терминал можно использовать как встроенный в Arduino IDE, а можно взять и отдельный, к примеру PuTTY.

При установленном загрузчике в микроконтроллер его можно прошить и из-под Arduino IDE, однако, ввиду того что на модуле не разведен до отдельного вывода сигнал DTR, то нужно наловчиться нажимать кнопку сброса на микроконтроллере (точнее на плате под него). При достаточном умении можно так приноровиться, что операция по прошивке будет происходить с первого раза.

Как подключать выходы? Поскольку ATmega328 работает в диапазоне напряжений от 1.8 и до 5.5 В, то при работе от ПК я подключаю выход 5В, он идет без стабилизатора на плате (стабилизатор на 3.3В на модуле слабенький). Так же подключаю «землю» и выходы TXD/RXD. И с последними есть небольшая хитрость. Их нужно подключать перекрестно. Выход платы TXD подключаем на вход RXD микроконтроллера. А вход платы RXD подключаем к выходу TXD микроконтроллера. Не забываем, что xXD входы/выходы сугубо однонаправленные.

Прошиваем AVR при помощи «черного» модуля на CH430 и с 6 выводами

Модуль USB2TTL с гордым наименованием CH340 скорее, так же, не название модуля, а название чипа, который и производит преобразование из USB в TTL и обратно. Сам чип изготавливается китайской компанией WCH. На сайте производителя можно ознакомиться со спецификацией на модуль (все на китайском) или же скачать драйвера (у меня на Win10 драйвера оказались уже в наличии, чип определяется как USB-SERIAL CH340 и занимает доступный COM-порт). Вообще, судя по спецификации, чипы CH340 многостаночники, они предназначены не только для связи USB и UART, но и для подключения IrDA (инфракрасный порт) и принтеров, работающих по последовательной шине.

Несмотря на то, что в спецификации на сам чип указано его несметное количество входов и выходов, но производитель модуля распаял только 2 из них для подключения к UART, а всего выводов со стороны UART 6. К списку выводов CP2102 добавился VCC с перемычкой, которая может быть установлена на замыкание VCC и V3 выходов, а может быть полностью удалена. Когда перемычка установлена, то используется питание 3.3В, когда же она снята, то все работает на 5В. Честно говоря, я так и не понял магическое действие перемычки между VCC и 3V. Питание на плату для прошивки я все равно подаю 5В и при этом положение перемычки на работоспособность никак не влияет.

USB2TTL, USB to UART, ch430, 6 pins, перемычка, 6 выводов

"Черный модуль" на основе CH430.

Применение «черного» модуля точно такое же, как и «красного». Прошивать ATmega328 можно только при установленном загрузчике, да и то придется потренироваться в нажатии кнопки reset. В качестве источника питания модуль работает без нареканий, данные по последовательному порту пересылаются в обе стороны. Подключение осуществляется аналогично, с перехлестом TX/RX входов/выходов.

Прошиваем AVR при помощи «синего» модуля на CP2102 и с 6 выводами с DTR

Модуль USB2TTL с гордым наименованием CP2102 и скорее не названием модуля, а названием чипа, который и производит преобразование из USB в TTL и обратно. Сам чип изготавливается Silicon Labs. На сайте производителя можно ознакомиться со спецификацией на модуль или же скачать драйвера (у меня на Win10 драйвера оказались уже в наличии, чип определяется как Silicon Labs CP210x USB to UART Bridge и занимает доступный COM-порт).

CP2102, dtr, 5v, 3v, txd, txr, usb2ttl, usb to uart

Модуль на основе CP2102 с 6-ю выводами включая DTR

Несмотря на то, что сам чип оснащен множеством выходов, а о некоторых из них ниже, изготовитель модуля распаял только 3, всего же на плате со стороны UART-интерфейса располагается 6 выходов. В отличии от «красного» модуля помимо TX/RX тут выведен еще и DTR. При первом подключении на выходе DTR у меня оказалось 0 вольт, что соответственно означало нажатую и удерживаемую кнопку Reset. Микроконтроллер не стартовал. Пришлось перезагрузить модуль и на DTR все встало на свои места. Так же обнаружилась несовместимость при подключенном контакте DTR с подключенным AVR ISP. Пришлось DTR временно отключать для возможности осуществления прошивки.

При наличии загрузчика, уже установленного в микроконтроллере, загрузка скетчей Arduino возможно и из Arduino IDE. Если загрузчик не установлен, то его необходимо предварительно установить.

PS. С синим модулем на CP2102 есть небольшая странность. Я так и не научился нормально заливать прошивку с его помощью. Да, он успешно «нажимает» на Reset при начале загрузки, но «кнопку» не отпускает и Arduino IDE при попытке прошивки выпадает по таймауту. Даже 10 кОм подтягивающий к питанию резистор на контакт сброса микроконтроллер не помог. Хотя, если через секунду-другу отключать контакт DTR руками, то прошивка происходит нормально. С чем связана такая особенность, я так и не разобрался.

PSS. Так же на этом модуле, а у меня их два, замечено, что вывод 3.3В вовсе не выдает 3.3, а шарашит на всех 5В. Что может быть критично при работе с микросхемами с пониженным напряжением.

Прошиваем AVR при помощи FabISP мимикрирующего под USBTiny44/USBTiny85 с 6 выводами ISP

Модуль FabISP является детищем FabLab MIT (того самого, Массачусетского Технологического). По сути FabLab — мастерская при университетах, где студенты могут сваять что-то своими руками. Вот один из студентов и навяаял внутрисхемный программатор для AVR на основе USBTinyIPS. Ознакомиться с его творчеством, равно как и скачать драйвера под программатор можно на страничке отчета студента по проделанной работе. Страничка уже находится в архиве, поэтому не ясно как долго она просуществует. Но FabISP используется в учебных курсах и видимо не скоро совсем уйдет с арены.

fabisp, fab isp, avr, программатор atmel1618

FabISP в исполнении китайских товарищей.

Интересная особенность. Через 6-ти пиновый кабель, который, кстати не поставляется вместе с модулем, FabISP может питать и микроконтроллер. В таком случае не требуется дополнительное питание, как у AVRISP mkii. Так же хочу заметить, что оригинальный FabISP требует предварительной прошивки и программатора, по типу того же AVRIPS. Но с Китая модули (GY ARDUINO ISP V2) приходят уже прошитыми, что существенно облегчает задачу.

avr, avrdudess, atmega328p, fablab, usbtiny, usb

Прошивка ATmega328P посредством AVRDUDESS через FabLAB USBTiny

Я не стал устанавливать драйвера со странички студента, а установил их от Lady Ada (изобретателя USBTiny). После установки драйверов программатор определился как Atmel USB Devices – USBtiny. Для того, чтобы программатором можно было пользоваться, необходимо распаять, если она у вас не распаяна, перемычку SJFAB (в некоторых нотациях это перемычка обзывается как SJ1). Перемычка используется для возможности программирования самого программатора. Более того на плате присутствует и вторая перемычка SJ2 (или же SJVCC). Она отвечает за подачу питания на микроконтроллер с программатора. Если ее распаять, то для микроконтроллера потребуется внешнее питание. Ознакомиться со схемой можно все с того же сайта MIT.

При прошивке через FabISP необходимо обратить внимание, что поскольку программатор использует порт USB, то в AVRDUDESS необходимо так же выбрать порт USB. Никакого моста на последовательные порты не создается. При прошивке в Arduino IDE в качестве программатора выбираем USBTiny. Порт выбирать не требуется. В среде отсутствует возможность выбрать USB, поэтому опция просто игнорируется, AVR находит программатор самостоятельно.

Соответственно, при помощи FabISP можно прошивать внутрисхемно, в том числе и загрузчик, как при помощи AVRDUDE, так и напрямую из Arduino IDE (порт можно не указывать, загружаем через меню Sketch – Upload Using Programmer или Burn bootloader, в качестве программатора выбираем USBtinyISP).

Прошиваем AVR при помощи USBtinyISP

Следующий модуль на рассмотрении для применения при прошивке — китайский синий модуль гордо обзывающийся USBtinyISP. Модуль построен на микросхеме ATTINY2313A-PU. По сути программатор есть ни что иное, как полная копия оригинального программатора USBtiny от AdaFruit. Только слегка изменена форма платы, вместо трехвыводного кварца используется двухвыводной, да и корпуса нет. В целом все тоже самое.

usbtiny, usbtinyisp, китайский, недорогой, Arduino

Китайский синий программатор-клон USBtinyISP

Программатор подцепляется стандартными драйверами от Lady Ada (см. вариант про FabISP) и определяется как USB-устройство. На плате разведено питание 5V, что позволяет программировать микроконтроллеры без внешнего питания. Впрочем, отключается оно перемычкой на плате.

Из особенностей платы можно упомянуть наличие двух колодок для подключения программируемого микроконтроллера. Один со стандартным 6-pin, второй 10-pin. По факту они идентичны и подключение 10-pin не добавит никакой супер способности, так как все выводы больше 6-го заполнены «землей».

Прошиваем AVR при помощи FT232RL FT232 FTDI синего программатора с переключателем напряжений, 6-pin выводом

Данный программатор весьма и весьма популярен, в виду своего раннего происхождения и множеством удобных функций. Он появился на свет так давно, что на нем распаян разъем Mini-USB, который мне пришлось побегать поискать, чтоб его подключить к USB-порту. Модуль построен на чипе FTDI FT232RL.

Из интересного на плате обнаружен не только набор выводов USB2TTL, но и 6-pin вывод ISP, который именно так и подписан. Так же необходимо помнить, что фирма производитель FTDI с некоторого момента времени начала внедрять в свою продукцию функцию FTDIChip-ID™, которая позволяет идентифицировать уникальный номер микросхемы через программный интерфейс. Эдакая защита от китайских подделок. Соответственно с родными микросхемами работают любые драйвера производителя, а с поддельным только до версии 2.08.14. Так же следует обратить внимание, что для данной микросхемы присутствуют два вида драйверов: для виртуального последовательного порта (VCP) и для прямого доступа к функциям D2XX. Штатная поставка драйверов D2XX включает и VCP, тогда как VCP ограничивается только USB2TTL функциями.

ftdi, ttl, usb2ttl, isp, power, программатор

Синий программатор на основе микросхемы от FTDI с переключателем, TTL и ISP.

На плате присутствует переключатель напряжений 3.3V и 5V, он работает, но только для TTL уровней. На выводы питания, как TTL, так и ISP всегда подается 5V. При установке драйверов D2XX в системе образуется два устройства. Одно это виртуальный COM-порт, второе это USB Serial Converter.

В целом, TTL часть программатора работает так же, как и у всех остальных USB2TTL модулей, а вот с IPS пришлось помучаться. Помучаться, но безрезультатно. Для прошивки через AVRDUDE и программатор на FT232RL требуется собранный AVRDUDE с поддержкой pthread. Данная поддержка по умолчанию присутствует под Linux, но в Windows ее необходимо устанавливать дополнительно. А затем перекомпилировать AVRDUDE из исходных кодов. Удовольствие сомнительное, тем более что другие программаторы лишены этой неприятности. Хотя, у FT232RL присутствует и положительная сторона — наличие сразу двух интерфейсов ISP и TTL.

Подключаем AVR при помощи Hama USB-2-Serial кабелем на чипе Prolific PL2303RA

Подключиться к микроконтроллеру можно и обычным USB-COM кабелем. В принципе, на старых ПК, где еще присутствовали COM-разъемы и настоящие, железные порты, можно было обмениваться информацией с микроконтроллером напрямую.

кабель, конвертер

Кабель-конвертер интерфейса USB2TTL от Hama

Для подключения достаточно всего 3-х проводов: GND, RXD и TXD. При желании можно подключить так же и прочие выводы для большего удобства. В общем, ничего интересного.

Подключаем AVR при помощи NoName USB-2-TTL кабелем на чипе Prolific PL2303HXA

Ничем не примечательный кабель черного цвета и немного большим, чем обычно, разъемом USB, стоит копейки, но позволяет не хуже других подключаться по последовательному интерфейсу к AVR (и прочим системам, умеющим работать по Serial). Однако, в кабеле кроется хитрость. А именно то, что компания производитель чипа, на основе которого и реализовано подключение по USB, закончила его поддержку в далеком 2012 году. И подключая кабель к системам на основе Win10 можно получить неработающее устройство по причине несовместимого драйвера, который установился автоматически.

prolific, driver, versions, usb-to-serial

Выбор требуемого драйвера в настройках устройства в Win10 для чипов разного времени выпуска.

И в чем загвоздка? В том, что некоторые китайские компании до сих пор продолжают выпускать поддельные чипы. И соответственно устройства на их основе. И с новыми драйверами они не работают. Для того, чтобы появилась возможность работы с таким устройством, необходимо установить старый драйвер и в ручном режиме назначить его к проблемному устройству. Кстати, узнать версию чипа можно при помощи специализированной программулины от Prolific, которая опознает чип. Только вот, для ее работы опять же нужен драйвер.

После установки соответствующего драйвера кабель может выполнять свои функции. Кстати, в одной системе (Win10) может быть установлено несколько драйверов Prolific и все устройства, при условии ручного подключения драйверов, продолжают работать.

Прошиваем AVR при помощи Arduino AVP ISP Shield от DIYMORE

Шилд от DIY More, пожалуй, самый интересный образчик сегодняшнего обзора. Не секрет, что в ISP программатор можно превратить любую плату Arduino (и даже обычный микроконтроллер ATmega328). Все дело в том, что для того, чтобы стать программатором ISP, нужно иметь цифровые выходы, которые можно превратить в выходы ISP: MISO, SCK, RST, MOSI. На всех оригинальных и не очень, платах Arduino Uno (и многих других) вообще специально разведен ISP 6-пин коннектор. Через него можно запрограммировать сам микроконтроллер на плате.

DIYMORE AVR ISP shield, RoboDyn Uno R3, ATmega328P, analog, isp_5pin, isp_10pin, power, atmel

DIYMORE AVR ISP shield установленный на RoboDyn Uno R3. В панельке ATmega328P.

На официальном сайте итальянцев есть даже несколько инструкций как превратить обычную плату Arduino в ISP программатор: «Как превратить Arduino в ISP программатор» и «И как программировать ATmega328 без всего остального». У меня уже есть плата с удобной колодкой для установки микросхем, соответственно я могу воспользоваться ей, для прошивки микроконтроллера (соединив кабелем ISP разъемы). Этот вариант уже рассматривался, тем более, что в сети обнаружился весьма интересный вариант в виде платы-расширения для Arduino Uno с удобной колодкой для установки микросхемы, светодиодами, динамиком ISP 6-пин выводом, местом для установки 6-пин UART вывода, место для установки 10-пин ISP вывода.

Плата устанавливается как плата расширения на Arduino Uno. Причем не обязательно это должен быть оригинал от итальянцев. Все отлично взгромоздилось на клон от Robot Dyn. А затем все так же замечательно и прошилось.

Итак, чтобы воспользоваться AVR ISP shield сперва в Arduino-носитель нужно закачать скетч ArduinoISP. Скетч входит в стандартную поставку Arduino IDE и располагается в примерах. Залить скетч можно как обычным способом, через загрузчик (по USB), так и через ISP на плате Arduino при помощи одного из вышеописанных программаторов ISP. Напомню, что если загружать скетч из Arduino IDE посредством Upload using programmer, то скетч загрузится в плату без загрузчика. И для того, чтобы им потом плату можно было прошивать по USB придется отдельно загрузить в нее загрузчик. Данная операция осуществляется в том числе и через Arduino IDE (Burn bootloader), разумеется, с использованием ISP программатора. Однако, если скомпилировать скетч через Export compiled Binary, то можно загрузить через ISP-программатор и AVRDUDESS (или просто AVRDUDE) прошивку вместе с загрузчиком.

Но, рекомендуется идти простым путем, а именно загрузкой по USB из среды Arduino IDE скетча ArduinoISP. После загрузки можно устанавливать плату, важно не воткнуть ее со смещением, и микроконтроллер сверху (выемкой в сторону ручки). В качестве программатора выбирается ArduinoISP, так же необходимо выбрать нужный тип микроконтроллера. Прошивка осуществляется через Upload using programmer (через обычную кнопку загрузки скетч закачается в носитель).

Еще одна особенность AVR ISP Shield. На ней, как и на плате Arduino Uno присутствует вывод ISP 6-пин. И если установить плату AVR ISP Shield на Arduino Uno, то задаешься вопросом — к какому микроконтроллеру дает доступ этот разъем? К тому, что установлен в колодку или к тому, что стоит в Arduino? Ответ находится очень просто — экспериментом. Разъем на AVR ISP Shield дает доступ только к микроконтроллеру, что установлен на колодке. Запрограммировать плату Arduino-носитель через шилд не выйдет. Нужно его снять и подключиться к разъему ISP самой платы Arduino. С другой стороны, AVR ISP Shield можно использовать вообще без Arduino-носителя (Uno), просто подключив 6-ти пиновый разъем к ISP-программатору (не забыв про питание). Точно так же можно подключить и USB2TTL, дабы получать вывод с Serial.

Пробрасывает ли AVR ISP Shield вывод в последовательный порт на плату носитель с установленной ArduinoISP? Нет, такой функции не предусмотрено, хотя ее ничто не мешает реализовать. Ну почти ничего. Во-первых, необходимо физически соединить выводы с колодки на AVR ISP Shield к необходимым pin-ам, а затем произвести проброску чтения с этих пинов в скетче ArduinoISP с выводом их в стандартный Serial. Текущие версии фреймворка Arduino позволяют провернуть подобную операцию. Связь будет односторонней, только с микроконтроллера на плате и в порт носителя, но тем не менее, подобный подход позволит в одном устройстве соединить сразу две функции. Что, согласитесь, удобно.

Выводы

Благодаря своей невыносимой популярности, прошить AVR от Atmel можно тысячью и одним способом. И приведенные выше «адаптеры», и программные продукты — лишь маленькая часть всего многообразия систем и средств по прошивке. В обзор не попал интересный ISP-программатор USBasp. Хотя его с успехом заменяет TinyISP. Однако, в последних ревизиях, от 2011 года в USBasp вроде бы как была задекламирована функция совмещения в одном устройстве и ISP-программатора, и Serial интерфейса. На некоторых картинках в сети даже попадаются подписи с выведенными Rx/Tx на десятипиновую колодку, но похоже, что кроме железной поддержки требуется еще и программная реализация. А так хотелось бы иметь в одной устройстве программатор вместе с последовательным интерфейсом. Хотя, некоторые производители, например, Pololu выпускают подобные устройства, да и программатор на FTDI-чипе не исключение, хотя его и не удалось запустить под Windows.

За время испытания, у меня не вышло разобраться с проблемой с не отпусканием «кнопки» сброса при программировании через загрузчик и USB2TTL адаптер. Причины сего так и остались покрытыми мраком. Приходилось вручную отключать пин DTR, и только после этого происходила загрузка в штатном режиме.



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