Как прошить загрузчик ардуино в атмегу 328
Перейти к содержимому

Как прошить загрузчик ардуино в атмегу 328

  • автор:

Flashing Arduino Bootloader on Atmega328p Microcontroller

Cost and size, just to mention a few, makes using an Arduino board in certain projects an overkill, often times its always too big, or too expensive for the scope of the project especially when it’s a project that we need to make several units. One good way to retain the simplicity that comes with the use of the Arduino platform while avoiding all other deficiencies is to use the Atmega328p microcontroller alone and program it using the Arduino IDE and its simplified version of the C programming language. However, the atmega328p microcontroller cannot be used with the Arduino IDE until it is flashed with the Arduino bootloader.

Our goal for this tutorial will be to understand how the Arduino bootloader works and how an Atmeg328p microcontroller can be flashed with it.

Atmega328P mcu

The Arduino Bootloader

Programming microcontrollers can be a bit tricky, as they require special programmers and .hex files, not to mention the huge knowledge of the C programming language required to write the code. It’s not beginner friendly, thus to eradicate these issues, Arduino created a .hex file which can be installed on AVR chips that allow you to program the board over a serial port, ensuring all that is needed to program a microcontroller (after installing the hex file) is a serial connection between the microcontroller and the Computer which can be achieved using a USB to UART adapter. This hex file is called the Arduino Bootloader.

The bootloader is very similar to the BIOS Running on a PC and performs two tasks:

  1. It monitors the serial communication line to see if the computer is trying to program it. If this is the case, it accepts the code from the computer and stores it in a specific location in the memory of the microcontroller in such a way that the bootloader itself is not overwritten.
  2. When the computer isn’t trying to upload code to the microcontroller, the bootloader instructs the chip to run the code that’s already stored in memory. Once it locates and runs your program, the Arduino continuously loops through the program and does so as long as the board has power.

Asides from the need to use the Atmega328p in standalone mode, flashing the microcontroller with the bootloader may be necessary when you need to replace the microcontroller on your Uno board for instance or when you need to restore a bricked board which no longer allows code uploads.

Burning the Bootloader to a Microcontroller

There are quite a number of techniques for burning the Arduino bootloader to the microcontroller but we will focus on using the easiest method which involves the use of the Arduino board as an In-System Programmer (ISP).

During the manufacturing process for electronic devices, microcontrollers are usually programmed after they have been mounted on the PCB. This Programming process is referred to as In-System Programming (ISP) and it requires the PCB to have certain header pins through which the microcontroller can be accessed for programming. Most Arduino and Arduino boards also come with this feature as they usually have 2X3 pin headers which are used for a form of In-System programming known as in-circuit serial programming (ICSP). The header pins comprise of 3 SPI pins (MOSI(D11), MISO(D12), SCK(D13)), VCC, GND and a reset pin and these are the pins used to program the microcontroller on the Arduino. By connecting a Atmeg328p microcontroller to these pins, we will be able to flash the Atmeg328p microcontroller with the Arduino bootloader.

Required Components

The following components are required to follow this tutorial;

  1. Arduino Uno/Duemilanove
  2. Jumper Wires
  3. BreadBoard
  4. Atmega328p microcontroller
  5. 16 MHz crystal oscillator
  6. 22pf capacitors

Bootloader Upload Procedure

1. Prepare the Arduino as an ISP Programmer

Under the examples shipped with the Arduino IDE is the “Arduino as ISP” example which when uploaded to an Arduino board transforms the board into an ISP programmer. Open the example and Upload to your Arduino Uno or Duemilanove.

Arduino as ISP Example

2. Wiring

Next, connect the Atmega328p to be flashed to the Arduino via a breadboard as shown in the Schematics below.

Schematics

Below is a pin map of the connections so it is easier to follow.

Arduino – Atmega328P

Some setups include extra parts like LEDs which are used to monitor the bootloading status, but these are not necessary, as long as your connections are correct, burning the bootloader takes only a couple of minutes.

3. Burn the Bootloader

With the connections done, we are now ready to burn the bootloader.

Prepare the Arduino IDE by going to tools, Boards, then select the Arduino Uno as the board type. With that done, go to tools>programmer and select “Arduino as ISP” as the programmer. The final action to burn the bootloader is to go to tools and select Burn Bootloader. It will take the board you selected and search the board.txt file for the bootloader associated to it in the bootloader folder. It is important that your Arduino IDE is properly installed with all the board files as this will not work if the selected board type is not available, but its a very rare scenario.

Select Burn Bootloader

With this done, You should now be able to upload any code directly from the Arduino IDE to the Atmega328P microcontroller and use it for standalone purposes.

With the bootloader now on the chip, you can start uploading custom Arduino sketches to it following the tutorial here.

That’s it for this tutorial, Thanks for reading. Feel free to drop any question you might have as regards this via the comment section.

Прошивка 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. Такой код так же удобно прошивать сразу вместе с загрузчиком, дабы убедиться, что все прошло так как следует.

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

Прошиваем 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, и только после этого происходила загрузка в штатном режиме.

Опубликовано 04.08.2019 автором kvv213 в следующих категориях:
DIY Soft железо статья

How to flash new Arduino bootloader to ATMega328 chipset hardware

There’s headache ( or even nightmare ) for those who wanna build customized Arduino hardware, as it required to burn Arduino bootloader onto new ATMega328 chipset. (assuming you are using arduino pro mini as form factor ).

I come across same problem when i was designing a mini extensible arduino, i need a way to burn arduino bootloader into brand new chipset.

I got the USB_ISP but it never work.

I finally solved it by using arduino as ISP method, but it require some tricks …. ( official arduinoISP is a trap ) [Basic Concept]

The idea is using one arduino to redirect and burn the bootloader code to target atmega328 chipset.

Highlight: ( from official arduino guideline )

  1. Open the ArduinoISP firmware (in Examples) to your Arduino board.
  2. Must use Arduino 1.0: you need to make one small change to the ArduinoISP code. Find the line in the heartbeat() function that says “delay(40);” and change it to “delay(20);”. Don’t waste time on Arduino 1.5, it never work for me.
  3. Select the items in the Tools > Board and Serial Port menus that correspond to the board you are using as the programmer (not the board being programmed).
  4. Upload the ArduinoISP sketch.
  5. Wire your Arduino board to the target as shown in the diagram below. (Note for the Arduino Uno and duemilanove:10 uF capacitor between reset and ground is optional, but 120ohm between 5v and reset is a must )
  1. Select the item in the Tools > Board menu that corresponds to the board on which you want to burn the bootloader(not the board that you’re using as the programmer). See the board descriptions on the environment page for details.
  2. Choose Tools > Programmer > Arduino as ISP
  3. Use the Tools >Burn Bootloader command.
  1. Using arduino duemilanove or uno as ISP
  2. Arduino chipset must be ATmega328
  3. On burner arduino, when flashing the Arduino ISP firmware, must use arduino 1.0x version , 1.5 never work
  4. On burner arduino, must connect 120ohm resistor to 5v and reset pin to prevent auto-reset ( why? )
  5. The target ATMega328 Arduino hardware required to be a completed circuit with crystal and other components
  6. For those who still not work, you may reference to Sparkfun — Uploading Code-Hard way section

The following module is to avoid repeat wiring and facilitates the firmware burning process.

Above picture is the Arduino ISP and i have slots so that it can plug into my tiny arduino.

The official Arduino ISP firmware have 3 debug LED signal, i also extend an ICSP socket on right bottom corner, it can be used to burn firmware / bootloader to other official arduino product with ATMega328.

The advantage of directly burning firmware to ATMega328 is that it eliminate the bootloader 3 sec startup delay, but it require this ISP burner instead of using serial port for writing firmware in the future.

Прошивка загрузчика на микроконтроллере ATMEGA328P

Цена и размер — это только пара причин, по которым использование платы Arduino для конкретных проектов может оказаться за гранью разумного. Зачастую они слишком большие или слишком дороги для целого ряда применений, особенно если требуется сделать несколько экземпляров. Хорошим способом получить простоту применения, присущую платформе Arduino, и при этом избавиться от всех этих недостатков является использование отдельного микроконтроллера ATmega328P и программирование его посредством среды разработки Arduino IDE и её упрощённой версии языка Си. Однако без начального загрузчика (bootloader) платформы Arduino сам по себе микроконтроллер ATmega328P не получится программировать с помощью среды Arduino IDE.

Цель этого руководства — понять, как работает начальный загрузчик платформы Arduino и как его записать в память микроконтроллера ATmega328P.

Прошивка загрузчика на микроконтроллере ATMEGA328P

Начальный загрузчик платформы Arduino

Программирование микроконтроллеров может оказаться непростой задачей, поскольку для этого необходимы специальные программаторы и файлы программ в шестнадцатеричном формате с расширением.hex, не говоря уже о глубоких знаниях языка программирования Си, на котором пишутся программы. Это довольно сложно для новичков, поэтому в рамках проекта Arduino был создан специальный файл формата.hex, после установки которого в микросхему семейства AVR можно программировать платы через последовательный порт. При этом всё что вам понадобится — это подсоединить последовательный интерфейс микроконтроллера к компьютеру, что можно осуществить с помощью преобразователя из USB в UART. Этот специальный файл носит название – Загрузчик (Bootloader) Arduino.

Начальный загрузчик весьма похож на систему BIOS, работающую на ПК, и выполняет две задачи:

  1. Отслеживает, не пытается ли компьютер загрузить программу в микросхему через последовательный порт. Если компьютер начинает загрузку, то он принимает код и сохраняет его в специально отведённой области памяти микроконтроллера таким образом, чтобы при этом не затереть самого себя.
  2. Если компьютер не инициирует загрузку кода, то загрузчик командует микросхеме начать выполнение кода, который уже находится в памяти. Как только загрузчик записал в память программу и запустил её, плата Arduino будет непрерывно выполнять программу, пока подаётся питание.

Запись начального загрузчика в микроконтроллер может пригодиться не только, чтобы отдельно использовать микросхему ATmega328P, саму по себе. Это может пригодиться на случай, например, если вам понадобится заменить микроконтроллер на плате Arduino Uno или для спасения неисправной платы, которая перестала принимать код.

Запись начального загрузчика в микроконтроллер

Существует немало способов записи загрузчика платформы Arduino в микроконтроллер, но мы остановимся на самом простом, который предполагает использование платы Arduino в качестве внутрисхемного программатора ISP (In-System Programmer).

В процессе производства электронных устройств программу в микроконтроллеры обычно загружают уже после монтажа на печатную плату. Такая операция называется внутрисхемным программированием ISP (In-System Programming), и для неё необходимы специальный разъём на плате, через который получают доступ к микроконтроллеру при записи программы. Большинство плат Arduino оснащены таким разъёмом с выводами 2×3, который используется для одной из разновидностей ISP — внутрисхемного последовательного программирования ICSP (in-circuit serial programming).

Разъём содержит 3 вывода интерфейса SPI – MOSI (D11), MISO (D12), SCK (D13) и выводы питания и земли (VCC, GND), а также вывод сброса (Reset). Через эти выводы и производится загрузка программ в микроконтроллер на плате Arduino. Подключив эти выводы к микроконтроллеру ATmega328P, мы сможем записать в его память начальный загрузчик (BootLoader) Arduino.

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

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