Банальная проблема незапуска AVR, решение которой глубоко под землей
Представим: купили вы новый камень для своего проекта, а он — зараза — не шьется! Все собрано правильно, программатор правильный — всё равно ошибка. Знакомо? Мне да. Поэтому я решил написать про это статью.
Немного предыстории
Понадобилась мне значит Atmega32, купил, впаял, пытаюсь прошить — ошибка!
Ошибка avrdude
Лезем в гугл, где вам предложат:
Другая история — попалась мне Atmega328p, друг попросил накатить загрузчик. Ошибка такая же. Похоже на случай описанный ранее? На первый взгляд да. А вот когда начнем разбираться.
Прошиваем Atmega32
Я, как и многие другие, использую дешевой китайский программатор USBasp.
USBasp
Некоторые программаторы приходят со сбитыми элементами, непропаями и соплями. Даже если вы купите USBasp в нашем магазине, то скорее всего он будет собран в том же китайском подвале, что и его собратья купленные в китайских интернет-магазинах.
На программаторе мы видим 3 джампера: прошивка программатора — JP1, напряжение питания — JP2, и незапаяный джампер JP3 — прошивка на пониженной скорости.
Что такое «низкая скорость прошивки» и почему важна частота?
Пока перенесёмся из мира электроники, мир наш. Представим что на работе раз в час приходит начальник, чтобы проверить, как вы работаете. Время появления начальника вам известно, соответственно, вы начинаете работать и не получаете пинков от него. Но в один прекрасный момент, начальник начинает приходить раз в 45 минут, но вы этого не знаете. Так же и с МК, если он настроен на 16 MHz, но будет кварц на 8 MHz, чип не будет работать. Настройки частоты задаются фьюзами. За источник тактирования отвечают CKSEL. В зависимости от частоты, меняется скорость прошивки. Обычно на новых камнях стоят одни из этих источников тактирования:
External 16 MHz
Internal 128 KHz
Для работы с чипом имеющим частоту меньше 1 МГц, нужно снизить скорость прошивки. Это можно сделать перемычкой JP3 на программаторе, или в настройках используемой вами программы. После этого Atmega32 прошилась!
Прошиваем Atmega328p
В этом случае колдовать со скоростью прошивки не пришлось. Но пришлось поиграть с кварцами. Просто глядя на камень его настройки установить невозможно. А если МК не запускается, определить фьюзы даже с программатором это бесполезная затея. Не буду томить — в моем случае какой-то китаец настроил Atmega328p на External 8 MHz. Подключаем чип к программатору, жмем «Записать загрузчик» и.
Готово!
Далее не забываем подкинуть кварц на выбранную вами частоту. В Arduino IDE частота меняется здесь (в большинстве кастомных ядер):
Выбранная частота 16MHz
Если все равно не работает
Первый вариант: вы перебрали не все кварцы. По-хорошему, у вас должно быть достаточно разных кварцев — на 16, 8, 4 MHz. В последнее время появились микроконтроллеры с частотой 20 MHz, но их достаточно мало. Однако и такой вариант следует предусмотреть. Вот полный список частот Atmega32, на свой чип гуглите:
Все частоты AVR
Второй вариант: вы выбрали не тот чип. Например, вот модификации atmega328:
Тот ли чип вы выбрали?
Третий вариант: МК в мусорку. Попался с брачком, ну или сгорел.
Заключение
Описанные в статье проблемы выявить и устранить не всегда бывает легко, но возможно. Надеюсь статья была вам полезна, и вы узнали что-то новое или справились с проблемой. Если есть вопросы, пишите в комментарии, а на этом я с вами прощаюсь, всем удачи и всем, пока!
Atmega328P — Не Могу Перепрошить
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.
Последние посетители 0 пользователей онлайн
- Ни одного зарегистрированного пользователя не просматривает данную страницу
Сообщения
,50/60 Гц (12 А) Потребляемая мощность при 2 Ом:350 Вт!! 300 Ватт там Максимум!
Прошивка AVR (ATMEGA328) различными программаторами (в том числе и из-под Arduino)
Мир «Arduino» чрезвычайно разросся за последние несколько лет. Еще, казалось бы, совсем недавно возможность собрать что-то из цифровой электроники своими руками представлялось фантастической идеей, воплотить которую могут, пожалуй, только гении, то сегодня соединить несколько датчиков между собой и записать программу в микроконтроллер может почти любой с руками растущими чуть выше пояса. В сети полно ресурсов ломящихся от мегабайтов полезных статей о том, как запрограммировать тот или иной алгоритм под Arduino (тут, конечно, стоит понимать, что в экосистему Arduino попадают далеко не только оригинальные платы от итальянцев). А вот если вам захочется копнуть немного дальше и глубже, то вы столкнетесь с информационным вакуумом, отделяющим мир обычных любителей от мира продвинутых электронщиков. И, казалось бы, между этими двумя мирами — настоящая пропасть, перешагнуть через которую отважится не каждый. Но я попробовал, получилось и возникло желание как-то зафиксировать свой опыт, дабы в последствии им можно было бы делиться с окружающими или же вернуться к записи и освежить воспоминания, если вдруг что-то позабылось.
Итак, в качестве хобби я решил разработать для своей компании электронное устройство с «сердцем» в виде микропроцессора ATMEGA328P. Да-да, именно на основе той микросхемы, что применяется в Arduino. Только вот никакой обвязки вокруг микросхемы нет. В ней некуда подключать USB, полностью отсутствует и внешний стабилизатор питания, не говоря уже о каких-либо индикаторных светодиодах. И это чудо как-то нужно программировать, как-то заливать в него свою прошивку, как-то оживлять. Я уделил данному вопросу некоторое внимание в своей статье по детальному анализу среды разработки Arduino «Arduino IDE: разбираемся с меню Tools и некоторыми другими функциями», а в этой статье я лишь продолжу изыскания по своим наработкам.
Интерфейс 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 надо изменить под нее.
Для удобства программирования «голых» микросхем пришлось собрать небольшую плату с рычажной «панелькой» для микросхем.
Собранная плата выглядит не так монстроидально, все провода спрятаны под платой.
Плата примитивна до безобразия. На ней присутствуют два светодиода (не забываем про резисторы), один подключен к разъему USB, второй к пину 7 Arduino (у микросхемы это 13-я ножка, предпоследняя в нижнем ряду). Единственная кнопка на плате заведена на 1-ю ножку микросхемы и соединяет ее с «землей» платы. Используется кнопка, как не трудно догадаться, для сброса микроконтроллера через сигнал Reset. Дополнительно на плате разведен 6-ти пиновый разъем для подключения ISP-программатора, а также шестипиновый разъем для подключения USB-TTL. Разъем USB применяется лишь для подачи внешнего питания на микросхему (фирменные ISP-программаторы проверяют наличие внешнего питания на микросхеме, но при этом сами ее не запитывают, поэтому требуется подключение внешнего питания).
Схема платы для программирования голеньких микросхем 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 и чип скорее всего придется выкинуть.
Интерфейс с установленными FUSEs, выбранным файлом для прошивки
А можно применить AVRDUDESS, специальную графическую оболочку, существенно облегчающую работу по прошивке AVR руками. При работе с AVRDUDESS важно проверить установку всех fuses, так как то, что было прописано в настройках платы в Arduino тут уже не имеет никакого значения, все нужно переустанавливать с нуля или считать с работающей микросхемы. Кстати, при помощи AVRDUDE или AVRDUDESS можно не только прошить AVR, но и считать прошивку, в откомпилированном виде, с микросхемы, если такая функция не была отключена при предыдущей прошивке, разумеется.
Для получения скомпилированной прошивки, в Arduino IDE выбираем меню Sketch, а в нем Export Compiled Binary, не забыв выбрать в качестве платы нашу ATmega328 on a Breadboard. В разных версия IDE пункт экспорта находился в разных меню, поэтому есть определенная сложность в его определении при обновлении версий.
Откомпилированные файлы модифицированного мигателя. Версия с загрузчиком почти в половину больше.
Перед прошивкой еще раз проверяем все настройки в интерфейсе программы, выбираем верный чип, проверяем, что он читается, выбираем нужную прошивку и жмем на Go. Если последующая загрузка через bootloader не предполагается, то прошивать можно версию файла без загрузчика, экономится место и микросхема быстрее стартует (так как нет загрузчика, то управление передается сразу на основной код).
Прошиваем AVR при помощи AVRISP mkii из Arduino
Но прошивать AVR можно не только при помощи AVRDUDESS, но и напрямую из Arduino. В старых версиях Arduino IDE все было немного сложнее, для AVRISP требовался специальный драйвер, не идущий вместе с Atmel Studio, а свой собственный, нужно было вносить изменения в конфигурационные файлы Arduino IDE, но сейчас все стало намного проще.
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 выходов.
Типы вводов/выводов UART. Out выход с чипа в UART, In вход с UART в чип USB2TTL.
Согласно спецификации чипа, для успешной работы необходимо подключить только TXD и RXD, собственно, как раз асинхронные (последовательные, где данные передаются в виде последовательности по одному проводнику) шины по обмену данными. Одна шина для приема, одна для передачи. Помимо TXD и RXD на плате модуля присутствует вывод «земля», питание 5V и питание 3.3V со встроенного стабилизатора.
Красный модуль на чипе 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В и при этом положение перемычки на работоспособность никак не влияет.
«Черный модуль» на основе 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 с 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 в исполнении китайских товарищей.
Интересная особенность. Через 6-ти пиновый кабель, который, кстати не поставляется вместе с модулем, FabISP может питать и микроконтроллер. В таком случае не требуется дополнительное питание, как у AVRISP mkii. Так же хочу заметить, что оригинальный FabISP требует предварительной прошивки и программатора, по типу того же AVRIPS. Но с Китая модули (GY ARDUINO ISP V2) приходят уже прошитыми, что существенно облегчает задачу.
Прошивка 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. Только слегка изменена форма платы, вместо трехвыводного кварца используется двухвыводной, да и корпуса нет. В целом все тоже самое.
Китайский синий программатор-клон 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 и 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 можно получить неработающее устройство по причине несовместимого драйвера, который установился автоматически.
Выбор требуемого драйвера в настройках устройства в 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.
На официальном сайте итальянцев есть даже несколько инструкций как превратить обычную плату 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 автором kvv в следующих категориях:
DIY Soft железо статья
Микроконтроллеры ATmega328P / ATtiny45 программирование
Фирмой «Atmel», наряду с огромным ассортиментом чипов, выпускаются микроконтроллеры двух видов, снискавшие особое признание в обществе электронщиков. Микроконтроллер ATmega328P и другой продукт компании «Atmel» – чип ATtiny45. Обе популярных микросхемы несколько отличаются одна от другой. Тем не менее, чтобы запрограммировать микроконтроллер ATmega328P либо прошить чип ATtiny45 программным кодом, применяется практически одинаковый схематичный и программный подход. Рассмотрим подробнее технические способы: программирование ATmega328P и ATtiny45, а также необходимое для прошивки указанных микроконтроллеров программное обеспечение.
Микроконтроллеры ATmega328P и ATtiny45 семейства AVR
Программируемый чип ATmega328P представлен 28-контактным микроконтроллером, входящим в семейство AVR. Микроконтроллер хорошо знаком обладателям конструктора «Ардуино», где используется в качестве основного компонента электронного набора.
Однако микроконтроллер ATmega328P способен делать куда больше, чем выжимает из этого чипа популярный электронный конструктор «Arduino». Доказательств тому масса, стоит лишь посмотреть фирменный даташит (datasheet) микроконтроллера ATmega328P.
Микроконтроллеры семейства AVR нашли широчайшее применение в практике конструирования электронных устройств различной сложности. Серия ATMega и ATiny часто выбираются для аппаратного программирования
В тесной связке с «братом по крови» выступает другая микросхема — ATtiny45. Но здесь налицо явная отличительная черта: микроконтроллер ATtiny45 имеет 8-контктный форм-фактор.
Микросхема ATtiny45 обладает многими функциями, присущими AT328P. Однако функциональность ATtiny45 несколько ограничена по причине малого числа контактов ввода-вывода.
Традиционно программирование ATmega328P и ATtiny45 осуществляется через последовательный периферийный интерфейс (SPI). Контактная шина на 3 проводника, плюс «земля». По шине данных следуют сигналы:
- Вход приёма данных (MOSI)
- Выход передачи данных (MISO)
- Вход синхронизации приёма(SCK)
Сигнал SCK (SCLK) генерирует ведущее устройство (программатор). Этим сигналом обеспечивается синхронная приём/передача между ведущим и ведомым устройствами. По сути, интерфейс SPI следует рассматривать «синхронной» коммуникационной шиной.
Выбор физических программаторов под AVR микроконтроллеры
Существует масса программаторов, которыми доступно программировать ATmega328P и ATtiny45. Например, профессиональная разработка «Atmel-ICE» от родной чипам компании «Atmel».
Фирменный программатор считается лучшим из всех, пригодных прошивать AVR и другие микросхемы. На китайском AliExpress можно найти по цене от 5000 руб. и выше.
AVR Pocket Programmer: 1 — входной интерфейс USB; 2 — ISP коллектор; 3 — выходной интерфейс ISP; 4 — буферные элементы 74АС125; 5 — переключатель режима питания; 6 — основной чип ATtiny 2313
Для любителей-электронщиков этот вариант финансово обременительный. Поэтому логичным видится более простой выбор – USB программатор «AVR Pocket Programmer». Нечто подобное доступно купить, к примеру, здесь. В продаже есть другие, более дешёвые программаторы (от 200 руб.), но не проверенные на практике.
На крайний случай несложно собрать программатор «AVR Pocket Programmer» своими руками. Принципиальная схема устройства построена на чипе ATtiny2313. Внешние элементы – лишь несколько резисторов, стабилитронов, светодиодов.
Принципиальная схема программатора AVR Pocket Programmer — достаточно простая, вполне доступная для сборки устройства программирования своими руками
Сигнальные линии (MICO, MOSI, SCK) желательно (но не обязательно) буферизировать. Поэтому следует дополнить схему буфером, к примеру, использовать микросхему 74AC125.
Такой буфер, кстати, применяется на фирменной сборке. Не исключается и транзисторный вариант буфера.
Для работы схемы программатора потребуется драйвер под USB. Возможно, потребуется также программный продукт Zadig, универсальный инсталлятор под Windows для установки общих драйверов USB (версия под Windows 7 и выше):
- WinUSB
- Libusb-Win32
- Libusb0
- LibusbK
Прошивка и утилиты для «AVR Pocket Programmer» находятся здесь. Драйвер программатора предпочтительно ставить в систему Windows до подключения физической схемы к ПК.
Подключение микроконтроллера и программирование
Микроконтроллеры AVR программируются через интерфейс SPI посредством маршрутизации сигналов через шесть линий:
- VCC (напряжение питания),
- GND (сигнальная земля),
- RST (программный сброс),
- MOSI (приём данных),
- MISO (передача данных),
- SCK (сигнал синхронизации).
Для маршрутизации всех отмеченных сигналов между устройствами, как правило, используется один из двух стандартизированных разъемов:
- 6-контактный разъем (2×3).
- 10-контактный разъём (2×5).
Разъёмы соединяются с платой программатора и программируемым устройством через шлейф-кабель. Фирменная плата программатора «AVR Pocket Programmer» комплектуется всеми необходимыми аксессуарами.
Два типа контактных разъёмов интерфейса ISP применимы к использованию при работе совместно с инструментом программирования
На фирменной плате программатора присутствует переключатель режима питания. Если переключатель находится в положении «Power Target», плата запитана напряжением 5В от USB.
Иначе, в положении переключателя «No Power», питание на контакте 5В отсутствует. Этот вариант — «No Power», используется для программирования чипов с малым питающим напряжением (3,3В или 1,8В).
Микроконтроллеры: программирование утилитой AVRDUDE
Утилита AVRDUDE — это инструмент для командной строки Windows. Чтобы применить этот инструмент, нужно запустить «командную строку» Windows (Пуск -> Выполнить). Затем рекомендуется проверить готовность утилиты вводом команды:
avrdude -c usbtiny -p atmega328p
Команда предполагает наличие подключенного к системному разъёму программатора микроконтроллера ATmega328P. Для чипа другой серии команда, соответственно, несколько изменится.
Так, для микроконтроллера ATtiny45 строка будет выглядеть следующим набором:
avrdude -c usbtiny -p t45
Если схематично подключения программатора и программируемой микросхемы в норме, утилита выдаст примерно следующий терминальный текст:
Стандарты изготовления микроконтроллеров предполагают внедрение идентификаторов. При первом запуске утилита определяет этот идентификатор
Эта базовая команда утилиты позволяет идентифицировать подключенный микроконтроллер AVR. Инструмент AVRDUDE в процессе проверки читает идентификатор чипа.
Идентификаторы программируемых микросхем отличаются в зависимости от типа AVR. Тот же микроконтроллер ATmega328P идентифицируется как 0x1E950F, что и отмечено в окне выдачи.
Следующим шагом, когда проверено рабочее состояние схемы, можно следовать далее — читать и записывать программный код с помощью утилиты AVRDUDE.
Часть памяти чипа, которая обычно прошивается данными, это Flash — энергонезависимая область, где хранятся программы.
Прошивку Flash-памяти выполнит команда:
avrdude c usbtiny p atmega328p U flash:w:test.hex
или для варианта с ATtiny45:
avrdude c usbtiny p t45 U flash:w:test.hex
Примечание: имя файла «test.hex» только в качестве примера.
Процедура записи Flash-памяти требует некоторого времени. Несколько больше, чем при чтении данных. При этом строка состояния командного терминала всегда изменяется при чтении, записи, проверке устройства.
Примерно такой выглядит последовательность чтения записи памяти микроконтроллера утилитой в терминальном окне программного инструмента
Опция «U» команды AVRDUDE управляет чтением и записью памяти микропроцессора. Этой опцией пользователь указывает на работу с флеш-памятью.
Дополнительно символом «w» указывается функция записи и следом через двоеточие указывается имя (и расположение) файла (в примере test.hex), содержимое которого требуется записать в память.
Опция «U» также используется для чтения содержимого памяти AVR. Например, следующая команда позволит считать содержимое памяти чипа AVR и сохранить в файле под названием «test.hex»:
avrdude c usbtiny p atmega328p U flash:r:test.hex:r
или для варианта с ATtiny45:
avrdude c usbtiny p t45 U flash:r:test.hex:r
Инструмент поддерживает работу только с файлами, имеющими расширение «*.hex»!
Прочесть развёрнуто об утилите программирования и применяемых в процессе командах можно на этом блоге.
Программирование микроконтроллера ATmega8
Практика электронщиков (начинающих и уже достаточно опытных) отмечает частое пользование ещё одним чипом из серии AVR, именуемым даташит «ATmega8». Несмотря на приличный «возраст» с момента своего рождения, эта микросхема остаётся не менее популярной, чем упомянутые выше микроконтроллеры.
Благодаря этой микросхеме удаётся собирать электронные устройства нередко уникальные по своим техническим возможностям
Форм-фактор: 28-контактный (PDIP) либо 32-контактный (TQFP), причём 23 контакта из 28 – это линии ввода/вывода общего назначения. Для питания микросхемы потребуется стабилизированный источник 5В, а для удобства использования рекомендуется применить колодку (сокет) на 28 контактов.
Чтобы понять азы процедуры программирования, достаточно запрограммировать, например, функцию включения /выключения светодиода. Для решения задачи потребуется присоединить электронный элемент — светодиод, к любому контакту ввода/вывода микроконтроллера ATmega8.
Например, выбрать 28 контакт, обозначенный на схеме «PC5», входящий в 7-контактный набор PC0 — PC6 (порт C). Следует отметить: согласно схеме ATmega8, имеются также другие наборы контактов, имеющих отношение к порту B (PB0-PB7) и порту D (PD0-PD7).
Ресурсы программирования ATmega8
Нужно подготовить программный код для прошивки микросхемы. Потребуется компилятор языка программирования «C». Соответственно, необходим также программатор под загрузку скомпилированного кода в память микроконтроллера.
В качестве компилятора обычно используется фирменное программное средство «Atmel Studio 7.0» (установщик онлайн). Для прошивки микросхемы ATmega8 опять же удачно выступает утилита AVRDUDE.
Заставка фирменного компилятора программного кода от компании «Atmel». Мощное средство, необходимое для создания уникальных дампов
Далее пошаговый процесс программирования можно описать следующим образом:
- Запускается компилятор «Atmel Studio 7».
- В меню выбрать «Новый проект» (New Project) и далее «AVR GCC».
- Затем указать месторасположения сохранения проектного файла.
- Перейти «Далее» (Next) и выбрать из списка симуляторов ATmega
- Завершить кнопкой «Finish» после чего можно писать программный код.
Первая нитка программного кода:
#include <avr / io.h>
Функция Include включает системную библиотеку в проект, обеспечивая доступ к основным функциям ввода / вывода и макросам.
int main()
Вторая строчка указывает точку входа в программу пользователя. Отсюда программа пользователя стартует.
Дальше необходимо обозначить вывод порта C. В данном случае — «PC5». Для этого используется специальный регистр DDRC:
DDRC = 0x20;
Значение регистра 0x20 задаёт целевую «1» для контакта «PC5», согласно двоичному представлению. Тем самым пользователь открывает действие на активацию контакта «PC5».
Следующий шаг, решение непосредственно поставленной задачи — включение и выключение светодиода исполнением кода. Если нужен бесконечный цикл, решение может быть таким:
Простейший программный код для микроконтроллера ATmega8, которые заставляет мерцать подключенный к микросхеме светодиод
Завершающий этап компиляции кода выбор опции меню «Сборка» (Build). В результате «Atmel Studio 7» создаст файл с расширением .hex, с именем, указанным пользователем. Например: «test.hex». Останется только записать программный код в память микроконтроллера с помощью прошивки.
КРАТКИЙ БРИФИНГ
Z-Сила — публикации материалов интересных полезных для социума. Новости технологий, исследований, экспериментов мирового масштаба. Социальная мульти-тематическая информация — СМИ .