C++| ARDUINO IDE | ESP8266. Указатели (типы данных)


Что такое Arduino?

Arduino — это компания, которая разрабатывает аппараты и программы для робототехники и не только. Фактически компания зародилась в 2003 году, когда Эрнандо Барраган в рамках учебной работы создал первую версию платформы Arduino Wiring.

Wiring является библиотекой языка программирования С/С++. Это «расширение» предназначено для работы с платами Arduino. Для передачи кода нашей плате используется среда разработки Arduino IDE. В ней и происходит написание программы.


Среда разработки Arduino IDE

Другие системы исчисления

Данные в памяти микроконтроллера хранятся в двоичном представлении, но помимо него существуют и другие системы исчисления, в которых мы можем работать. Постарайтесь сразу запомнить и понять, что переводить числа из одной системы исчисления в другую не нужно, Ардуино абсолютно всё равно, в каком формате вы скармливаете значение переменной, они автоматически будут интерпретированы в двоичный вид. Разные системы исчисления введены в первую очередь для удобства программиста. Теперь по сути: ардуино поддерживает (да в целом другого и не нужно) четыре классических системы исчисления: двоичную, восьмеричную, десятичную и шестнадцатеричную. Да, и до неё добрались. Краткая напоминалка: 16-ричная система имеет 16 значений на один разряд, первые 10 как у десятичной, остальные – первые буквы латинского алфавита: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f. С десятичной системой всё просто, пишем числа так, как они выглядят. 10 это десять, 25 это двадцать пять, и так далее. Двоичная (Binary) имеет префикс 0b (ноль бэ) или B, то есть двоичное число 101 запишется как 0b101 ИЛИ B101. Восьмеричная (Octal) имеет префикс 0 (ноль), например 012. Шестнадцатеричная (hexadecimal) имеет префикс 0x (ноль икс), FF19 запишется как 0xFF19.

БазисПрефиксПримерОсобенности
2 (двоичная)B или 0b (ноль бэ)B1101001цифры 0 и 1
8 (восьмеричная)0 (ноль)0175цифры 0 – 7
10 (десятичная)нет100500цифры 0 – 9
16 (шестнадцатеричная)0x (ноль икс)0xFF21Aцифры 0-9, буквы A-F

Основная фишка 16-ричной системы в том, что она позволяет записывать длинные десятиричные числа короче, например один байт (255) запишется как 0xFF, два байта (65 535) как 0xFFFF, а жуткие три байта (16 777 215) как 0xFFFFFF. Вы не представляете (или уже имеете представление), насколько удобно и понятно это позволяет работать с цветами и оттенками. Двоичная же система обычно используется для наглядного представления данных и низкоуровневых конфигураций различного железа. Например конфиг кодируется одним байтом, каждый бит в нём отвечает за отдельную настройку (вкл/выкл), и передав один байт вида 0b10110100 можно сразу кучу всего настроить, к этому мы вернёмся в уроке работа с регистрами из раздела продвинутых уроков. В документации по этому поводу пишут в стиле “первый бит отвечает за это, второй за то” и так далее.

Установка Arduino IDE

Для использования среды Arduino IDE можно установить программу на свой компьютер или использовать онлайн-версию программы (необходима регистрация). Разберем, как установить программу на Windows 8/10.

  1. Переходим на официальный сайт Arduino. В пункте Download выбираем необходимую операционную систему.

  1. Попадаем на страницу с возможностью пожертвовать деньги на дальнейшее развитие Arduino. Нажмем на кнопку «Just download», чтобы установить программу без пожертвований.

3. Нас отправляют на сайт Microsoft Store, где нажимаем «Получить».

Программа установлена и готова к работе.

Пользовательские типы (Pro)

В языке есть инструмент typedef, позволяющий создать свой тип данных, основанный на другом стандартном. Зачем? С одной стороны для удобства программиста, с другой – чтобы его запутать =) Я никогда им не пользовался, но для разбора чужих кодов из инторнета это знать нужно! Итак, typedef работает следующим образом: typedef тип имя; – создать новый тип данных имя на основе типа тип. Пример:

typedef byte color;

Создаёт тип данных под названием color, который будет абсолютно идентичен типу byte (то есть принимать 0-255). Теперь с этим типом можно создавать переменные:

color R, G, B;

Создали три переменные типа color, который тот же byte, только в профиль. Это всё! Есть ещё один важный момент, касающийся структур struct и перечислений enum – в кодах из интернета вы часто встретите использование typedef перед struct и enum. В чистом языке Си это имеет большой смысл, но в C++ это наоборот является проблемой. typedef в ардуино-прошивках используют программисты, которые пришли с Си и по привычке используют typedef, на плюсах делать этого не нужно.

Почему не нужно использовать typedef для struct и enum

В языке Си (без ++) при создании структуры/перечисления по ярлыку нужно писать слово struct/enum перед ярлыком, иначе будет ошибка. Либо саму структуру нужно объявить как typedef // НА СИ, НЕ ++ // делаем так struct myStruct { byte x; byte y; }; struct myStruct kek; // создать структуру kek // или так typedef struct myStruct { byte x; byte y; }; myStruct kek; // создать структуру kek В С++ (и на Ардуино) этого делать не нужно! Наоборот, typedef в этом применении может приводить к ошибкам. Например:

// используя typedef вы не можете // объявить структуру сразу. // Вот это приведёт к ошибке при // попытке обратиться к члену структуры typedef struct { byte x; byte y; } kek; // вот это тоже приведёт к ошибке typedef struct myStruct { byte x; byte y; } kek; // Единственным вариантом останется // работа по ярлыку typedef struct myStruct { byte x; byte y; }; myStruct kek; // вот серьёзно, нужны ли вам такие проблемы?

Горячие клавиши Arduino IDE

Для упрощения работы в Arduino IDE используются «горячие клавиши» или хоткеи, от английского hotkeys, что в переводе и означает «горячие клавиши». Это комбинации клавиш на клавиатуре, которые выполняют различные действия в операционной системе и программах. Все команды доступны через меню «Файл», но через хоткеи работать гораздо быстрее.

Разберем горячие клавиши и их назначение.

Правка

Ctrl+Zотмена одной операции
Ctrl+Yвозврат одной отмененной операции
Ctrl+Fпоиск по коду
Atrl+Aвыделение всего кода
Ctrl+Pпечать содержимого вкладки
Ctrl+Xвырезать выделенный код
Ctrl+Cкопировать выделенный код
Ctrl+Vвставить выделенный код

Компиляция и загрузка

Ctrl+Rкомпиляция скетча
Ctrl+Uзагрузить скетч
Ctrl+Shift+Uзагрузить скетч с помощью программатора

Сохранение и работа с вкладками

Ctrl+Sсохранить текущий скетч
Ctrl+Shift+Sсохранить текущий скетч с выбором имени сохраняемого файла
Ctrl+Wзакрыть текущую вкладку
Ctrl+Shift+Nновая вкладка
Ctrl+Alt+Стрелка вправопереключение на вкладку справа от активной
Ctrl+Alt+Стрелка влевопереключение на вкладку слева от активной

Другое

Ctrl+Nоткрыть новое окно редактора
Ctrl+Oоткрыть существующий файл скетча
Ctrl+Слэш ( / или русская точка)закомментирование строки
Ctrl+Kоткрыть папку со скетчами
Ctrl+Tавтоформатирование кода
Ctrl+Shift+Mмонитор порта
Ctrl+, (русская буква Б)страница настроек Arduino IDE.

Синтаксис

  • Тела функций заключаются в фигурные скобки { }
  • Каждая команда заканчивается точкой с запятой ;
  • Метод применяется к объекту через точку. Пример: Serial.begin();
  • Вызов функции или метода всегда заканчивается скобками, даже если функция не принимает параметров. Пример: loop()
  • Разделитель десятичных дробей – точка. Пример: 0.25 У запятой тут другое применение
  • Запятыми перечисляются аргументы функций и методов, а также членов массива. Пример: digitalWrite(3, HIGH); массив – int myArray[] = {3, 4, 5 ,6}; Также запятая является самостоятельным оператором, но об этом поговорим отдельно в другом уроке
  • Одиночный символ заключается в одиночные кавычки ‘а’
  • Строка и массив символов заключается в двойные кавычки «строка»
  • Имена переменных могут содержать латинские буквы в верхнем и нижнем регистре (большие и маленькие), цифры и нижнее подчеркивание. Пример: myVal_35 .
  • Имена переменных не могут начинаться с цифры. Только с буквы или нижнего подчёркивания
  • Регистр имеет значение, т.е. большая буква отличается от маленькой. Пример: переменные val и Val – не одно и то же.


К синтаксису также можно отнести комментарии, т.к. в разных языках они выделяются по-разному. Комментарий это обычный текст, который игнорируется на этапе компиляции. Комментарии нужны для пояснения кода, как себе самому, так и другим возможным его читателям. В C++ у нас два типа комментариев:

  • Однострочный комментарий // однострочный комментарий // компилятор меня игнорирует =(
  • Многострочный комментарий /* Многострочный комментарий */

Шаблон программы. Функции setup() и loop()

Комментарии

В начале программы принято указывать некоторые комментарии. Здесь автор кода может написать о себе, о программе и ее назначении. Для обозначения комментария в начале строки пишем 2 символа «//», например:

// Файл «matrixb.h» содержит определение класса Matrix_B, реализацию // его методов в программе «program2.vcproj» // Класс Matrix_B является базовым для класса Matrix_D // Создатель программы: Иванов Иван Иванович, 7а // Версия 1.0 от 14.02.14

Шаблон программы

Сама по себе программа напоминает дом. Наш «дом» состоит из 2х частей:

  1. Функция setup() выступает в качестве «фундамента дома».
  2. Функция loop() напоминает жилую часть дома: здесь и «живет» сама программа.

Запустим Arduino IDE и напишем шаблон программы:

void setup() { } void loop() { }

После setup и loop скобки () пишутся без пробела. Внутри скобок пробел отсутствует. Сами функции пишутся маленькими буквами. Фигурные скобки располагаются одна под другой на следующих строчках после имени функции.

Если вы все написали правильно, то ваша функция станет другого цвета.

Разберем подробнее назначение каждой функции.

Функция setup()

Функция setup() — это подготовка. Это первая функция, выполняемая программой. Она выполняется только один раз сразу после включения платы или ее перезапуска кнопкой reset. setup() используется чтобы завести новые функции, настроить ПИНы платы, создать переменные. Функция должна быть включена в программу, даже если в ней нет никакого содержания.

Функция loop()

После функции setup() управление переходит к функции loop(). В переводе с английского loop — это петля. Функция делает в точности то, что означает её имя — непрерывно выполняется заново. Она позволяет программе что-то изменять, возвращать данные и управлять платой Arduino.

От Arduino и wiring к AVR Studio и чистому СИ


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

Описано будет всё (для ), от начала и до конца, — установка и подготовка необходимого программного обеспечения, сборка простейшего программатора «Громова» (не стоит пугаться, там всего три диода и семь резисторов), прошивка МК и написание кода в AVR Studio. Весь процесс будет сопровождаться иллюстрациями и примерами.

Сразу оговорюсь, компьютер должен быть оснащен СОМ-портом (переходник USB to COM плохо работает). Если у вашего компьютера сзади нет такого разъёма, то он наверняка есть на материнской плате (в виде штырьков), тогда всё решается вот таким «выбросом»

Увы, для владельцев ноутбуков без СОМа, статья представляет лишь академический интерес.

Итак начнём…

Что понадобится?

«Софт»

UniProf — универсальная программа для прошивки различных микроконтроллеров ATmega, простая и удобная, а главное, отлично работающая с нашим программатором. Автор — российский разработчик Михаил Николаев.

Конечно, прошивать МК можно и из AVR Studio, но для этого нужен специальный программатор. Поэтому писать код мы будем в студии, а полученные hex-файлы прошивать UniProf`ом посредством нашего самодельного программатора. Помимо этого будет описан способ прошивки из командной строки.

Пользователям Linux придётся воспользоваться либо виртуалкой, либо Wine. У меня с вайном не получилось, ни в какую не видится порт, а с виртуалкой я не пробовал.

Скачать:

UniProf Просто распакуйте в удобное место.

AVR Studio — это среда программирования, разработанная специалистами компании Atmel Corporation занимающейся производством различных микроконтроллеров (ATmega, XMEGA, MCS-51, ARM, AVR, AVR32), в том числе тех, что используются в ардуино (ATmega168, ATmega328, ATmega32u4, MEGA2560).

На данный момент, на сайте производителя имеется седьмая версия этой среды, однако мы воспользуемся более старой и проверенной временем версией 4.19. Она стабильна, работает на любом, даже устаревшем, железе, включает в себя всё необходимое и по-прежнему пользуется популярностью.

В дополнение потребуется компилятор AVR toolchain.

В Wine работает без нареканий (Debian 8.5, wine1.6).

Скачать:

AVR Studio 4.19

AVR toolchain Сначала установите студию, а потом toolchain. Именно в таком порядке.

Заодно скачайте текстовый редактор с «человеческим лицом» — Notepad++, ибо стандартный Блокнот — это поделка спившегося дьявола.

Скачать:

Notepad++

Весь софт бесплатный.

«Железо»

Эксперименты будем ставить над Arduino pro mini с микросхемой ATmega328. Частота кварца (8/16Мгц), равно как и напряжение (3.3/5v), не имеют значения. (см. ниже)


В дальнейшем вы будете программировать различные МК фирмы Atmel, но для первого раза эта плата самое то. Она хороша тем, что практически, это голый контроллер с минимальной «обвязкой» и распаяннами пинами. Как раз то, что нужно.

О маркировках на микроконтроллерах

После названия идут цифры, которые, чаще всего, показывают объём памяти.

Буква после цифр указывает на параметры питающего напряжения.

Нет буквы — напряжение питания контроллера находится в пределах 4,5-5,5 вольт. L — версии контроллеров, работающих на пониженном (Low) напряжении питания (2,7 — 5,5 вольт). V — версии контроллеров, работающих на низком напряжении питания (1,8-5,5 вольт). U — версии контроллеров, работающих на сверхнизком напряжении питания (0,7-5,5 вольт). P — малопотребляющие версии (до 100 нА в режиме Power-down). A — уменьшен ток потребления, перекрывается весь диапазон тактовых частот всех версий, напряжение питания 1,8-5,5 вольт (в некоторых моделях, добавлены новые возможности и новые регистры. При этом сохранена полная совместимость с предыдущими версиями).

Микроконтроллеры «А» и «не-А» обычно имеют одинаковую сигнатуру, что вызывает некоторые трудности, так как Fuse-bit’ы отличаются.

Примеры:

ATmega8 — объем памяти программ 8 килобайт, напряжение питания — 4,5-5,5 вольт. ATmega8L — объем памяти программ 8 килобайт, напряжение питания — 2,7-5,5 вольт. ATtiny43U — объем памяти 4 килобайта, модификация — 3, напряжение питания — 0,7-5,5 вольт. ATtiny44А — объем памяти 4 килобайта, модификация — 4, уменьшенный ток потребления, напряжение питания 1,8-5,5 вольт.

Бывает так, что контроллер без буквы может иметь пониженное напряжение питания (1,7 или 1,8 вольт). Это надо уточнять в даташите.

Пример:

ATtiny841 — объем памяти 8 килобайт, модификация — 41, напряжение питания — 1,7-5,5 вольт.

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

Одна или две буквы идущие после частоты обозначают тип корпуса:

P — DIP A — TQFP M — MLF TS — SOT-23 J — PLCC A — UDFN/USON C — CBGA CK — LGA S — EIAJ SOIC SS — узкий корпус JEDEC SOIC T — TSOP X — TSSOP

Следующая (после типа корпуса) буква означает температурный диапазон и особенности изготовления:

C — коммерческий температурный диапазон (0—70°C). A — температурный диапазон −20—85°C, с использованием бессвинцового припоя. I — индустриальный температурный диапазон (-40—85°C). U — индустриальный температурный диапазон (-40—85°C), с использованием бессвинцового припоя. H — индустриальный температурный диапазон (-40—85°C), с использованием NiPdAu. N — расширенный температурный диапазон (-40—105°C), с использованием бессвинцового припоя. F — расширенный температурный диапазон (-40—125°C). Z — автомобильный температурный диапазон (-40—125°C). D — расширенный автомобильный температурный диапазон (-40—150°C).

Программатор «Громова»

Мощность резисторов от 0.125 Вт. Диоды – любые импульсные, со временем восстановления не более 50 нс (например 1N4148, КД522, КД510) у меня стоят 1N4001.

И последнее — это ответная часть СОМ-порта (DB9).

Провода используйте не слишком длинные. Между компьютером и программатором сантиметров 30, а между программатором и МК сантиметров 10-15. Питание для МК можно взять с USB-порта.

Мой программатор выглядит так:

Схема соединения

Соединяем ардуину с программатором…


… подсоединяем программатор в сом-порт и подаём питание.

Если у вас ардуина на 3.3v (8Mhz), то можете смело подавать на неё 5 вольт. Тут дело вот в чём, контроллер может работать с кварцем 16МГц только от 4.5 до 5.5 вольт, если подать меньше то кварц не «раскачается», а если установить кварц на 8МГц, то будет работать в диапазоне от 2.7 — 5v. Таким образом делают ардуины с пониженным энергопотреблением, а подавать 5 вольт можно почти на любые ATmeg`и.

MOSI, MISO и т.д., это шина SPI.

UniProf

Написать программу это пол дела, надо её ещё в контроллер как-то впихнуть. Вот и уделим этому побольше внимания.
Хорошо бы было, чтоб в вашу ардуину был залит стандартный Blink (с «завода» она с ним и поставляется).

Отсюда и далее, самовольно никакие кнопки не нажимайте!

Запускаем UniProf… Возможно выскочит такое окно:


Это связано с LPT-портом, так что просто нажмите ОК.

Следом откроется окно программы:

Если порт выбран не правильно, то появится окно с предложением…

Нажмите ОК и выберите нужный порт.

Если МК не определился автоматически, тогда появится окно с ручным выбором:

К сожалению в списке нету atmega328, поэтому выбираем mega32 (у них одинаковый объём flash-памяти) и жмём ОК.

После этого, вместо надписи unknown появится подключённый контроллер…

32K — это объём Флеш-памяти, а 1024 — объём EEPROM.

Теперь, если у вас всё как на картинке, тогда откройте справку и внимательно ознакомьтесь с тем, что там написано. Автор был весьма лаконичен, так что много времени это не займёт. Кнопки пока не нажимайте.

Ознакомились? Отлично, теперь можем двигаться дальше. Уберите «галочку» возле EEPROM и увидите изменившийся интерфейс:


После снятия «галки» EEPROM, чтение и запись этой области памяти не производится.

Поскольку мы будем оперировать hex-файлами, то уберём «галочки» General и BIN, а так же установим «галочку» Тормоз!, это увеличит время чтения/записи, но зато повысит стабильность.

Ну вот, пришло время попробовать прочитать наш МК. Поставьте обратно «галочку» EEPROM и нажмите кнопочку Read .

Процесс не быстрый так что придётся подождать. Внизу будет ползти синие квадратики и в правом нижнем углу отсчитываться циферки. За первый проход прочитается область PROGRAM, а за второй EEPROM.

У меня новая ардуина с зашитым в неё стандартным Blink`ом (при подключении программатора диод перестанет мигать). Если у вас то же самое, то взору предстанет такая картина:

Справа мы видим что в EEPROM ничего нет, а слева, в PROGRAM, записанная программа (как я уже говорил, это Blink). Теперь стрелочкой «вниз» прокрутите ползунок до того как данные закончаться…

… а теперь прокрутите до конца. Вы увидите ещё данные, — это ардуиновский bootloader.

Сейчас я предлагаю отвлечься от моей статьи и почитать про устройство МК вот здесь, это сильно приумножит понимание материала. Написано всё очень хорошо и понятно. Ну, а как прочтёте — возвращайтесь обратно и продолжим…

Снимите «галочку» с EEPROM. Она нам особо то и не нужна, зато будет видно, что стоит «галочка» Тормоз!

Теперь давайте сохраним всё что прошито в контроллере, чтоб после экспериментов была возможность вернуть его в исходное состояние.

Нажмите кнопку и сохраните прошивку назвав её как-нибудь типа — origProMini328.hex. Всё, теперь у вас есть бекап.

Двигаемся дальше. Нажмите кнопку , удалив тем самым всё из контроллера…

… и следом нажмите уже знакомую кнопку Read . После этого Вы увидите что все ячейки в PROGRAM пустые. Удалена не только программа, но и ардуиновский bootloader. То есть теперь вы не сможете загружать скетчи традиционным методом. Потом, если захотите, легким мановением руки восстановите всё из бекапа.

Сейчас мы прошьём контроллер таким же «Blink`ом», только написаным в AVR Studio.

Вот так выглядит код:

#define F_CPU 16000000UL #include #include #define PIN_PB5 5 // PB5 (ардуина — D13) #define PIN_PB5_PORT PORTB #define PIN_PB5_DDR DDRB int main(void) { PIN_PB5_DDR = 1 << PIN_PB5; // устанавливаем PIN_PB5 (PB5 (ардуина — D13)) как ВЫХОД while(1) { PIN_PB5_PORT = 1 << PIN_PB5; _delay_ms(300); PIN_PB5_PORT = 0 << PIN_PB5; _delay_ms(300); } return 0; } Если вы используете ардуину с кварцем на 8Мгц, то в этом нет ничего страшного, просто диод будет мигать в два раза реже.

А вот, сколько он занимает места:

Скачайте файл 328test.hex куда-нибудь и откройте кнопкой , затем прошейте кнопкой

Важно! Перед каждой прошивкой делайте очистку контроллера кнопкой , а если не помните очищали или нет, то проверяйте кнопкой

Если установить «галочку» Write 0xFF, то все неиспользуемые ячейки заполнятся числом 0xFFFF.

После прошивки отсоедините контакт Reset (программа прижимает его к «земле» не давая стартануть) и ардуина оживёт, мигая с интервалом в 300мс. Можно не отсоединять контакт, а просто нажать кнопку отладки . Обсуждать эту кнопку мы не будем, так как заниматься отладкой вы будете в AVR Studio.

После закрытия окна отладки нужно заново выбрать контроллер, если это не происходит автоматически.

Обратите внимание, скетч написанный в IDE Arduino занимает ~940 байт, а в AVR Studio 178 байт. Что же касается скорости «дерганья ногами» (если и там и там убрать delay), то разница будет примерно в 20 раз. Это связано с особенностью среды IDE Arduino и языка используемого в ней. Впрочем, вскоре вы сами со всем познакомитесь.

Остались ещё две кнопки — и , они отвечают за установку фьюзов микроконтроллера.

Фьюзы (fuses) — это три или четыре (в зависимости от МК) байта расположенных в определённой области памяти, биты (fuse bit) которых отвечают за конфигурацию контроллера (тактовую частоту, использование внутреннего или внешнего кварца, включение/отключение watch dog и т.д.), они не затрагиваются при прошивке или стирании контроллера и устанавливаются отдельно.

Тема фьюзов серьёзная и требует вдумчивого изучения. Сейчас мы не будем их рассматривать по нескольким причинам: во-первых, в ардуине уже прошиты необходимые fuse bits, во-вторых, в программе uniprof не получится их правильно изменить (в списке нет ATmega328) и в третьих, лучше это отложить на будущее, когда освоитесь и будете чувствовать себя уверенней.

Чтобы удовлетворить любопытство, нажмите кнопку и в открывшемся окне нажмите кнопки Read, но не в коем случае не нажимайтеWrite

Вот так собственно и выглядят биты фьюзов. Повторюсь, не нажимайте Write, это приведёт к непредсказуемым последствиям так как у нас выбран контроллер mega32, а не atmega328.

Когда до них дойдёт дело, тогда воспользуетесь онлайн-калькулятором и узнаете, какой бит за что отвечает. О том как прошить см. ниже.

Теперь закройте окно с фьюзами и сам uniprof, и пойдём дальше…

Добавлено позднее. Вот версия uniprof, в которой есть atmega328. Автор доработки.

AVRDude

Uniprof как и многие другие, похожие программы, являются лишь графической надстройкой над программой AVRDude (AVR Downloader-Uploader), которая то и выполняет все выше описанные действия над микроконтроллером. Поскольку AVRDude не имеет собственного графического интерфейса с ней нужно работать из командной строки. Кому-то это может показаться неудобным, однако всё как раз наоборот, работа из консоли просто великолепна. Удобство, проста и отсутствие привязки к какой либо ОС, ибо avrdude существует, наверно, для всего. Сейчас вы в этом убедитесь.

Для пользователей

Avrdude входит в состав AVR toolchain, поэтому установите его (предварительно установив AVR Studio) как написано в начале статьи.

Откройте «Командную строку» (далее буду называть — терминал) от имени администратора, и командой…

cd \ … перейдите в корень диска
С.

Введя команду:

avrdude -h

Вы должны увидеть справочную информацию.

Если всё так, тогда avrdude готов к работе и можно продолжать.

Теперь нужно добавить наш программатор в конфигурационный файл avrdude (C:\Program Files (x86)\Atmel\AVR Tools\AVR Toolchain\bin\avrdude.conf). Откройте его в программе Notepad++ и после надписи «PROGRAMMER DEFINITIONS» добавьте вот такие строки:

programmer id = «gromov»; desc = «serial port banging, reset=dtr sck=rts mosi=txd miso=cts»; type = serbb; reset = 4; sck = 7; mosi = 3; miso = 8; ; Программатор использует технологию Bit-banging.


Следите за тем, чтоб при копировании, кавычки оставались именно кавычками, а то они могут изменится (из-за разницы кодировок) и avrdude будет ругаться.

Сохраните и закройте файл, он больше не нужен.

Вернитесь в терминал и дайте команду проверки связи МК с программатором:

avrdude -n -c gromov -P com1 -p m328p У вас может быть другой сом-порт.

Если связь есть, то ответ будет такой:

Далее я опишу настройку avrdude для Linux, а после этого буду писать команды для обоих ОС (поскольку они одинаковые)…

Установите avrdude

sudo apt install avrdude

Введя команду:

avrdude -h

Вы должны увидеть справочную информацию.

Если всё так, тогда
avrdude готов к работе.
Настройте порт:

sudo stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflsh Это надо делать после каждого ребута компа, ну или в rc.local добавьте.

Где /dev/ttyS0 — это com1, /dev/ttyS1 — com2 и т.д. В дальнейшем, в командах я буду писать /dev/ttyS0, у вас может быть /dev/ttyS1 и т.д.

Добавьте программатор в конфигурационный файл /etc/avrdude.conf

sudo nano /etc/avrdude.conf

После надписи «PROGRAMMER DEFINITIONS» добавьте вот такие строки:

programmer id = «gromov»; desc = «serial port banging, reset=dtr sck=rts mosi=txd miso=cts»; type = «serbb»; reset = 4; sck = 7; mosi = 3; miso = 8; ; Программатор использует технологию Bit-banging.


Следите за тем, чтоб при копировании, кавычки оставались именно кавычками, а то они могут изменится (из-за разницы кодировок) и avrdude будет ругаться.

Сохраните и закройте файл.

Дайте команду проверки связи МК с программатором:

sudo avrdude -n -c gromov -P /dev/ttyS0 -p m328p

Если связь есть, то ответ будет такой:

Здесь различия между операционными системами заканчиваются и команды продублированы.

Добавим к команде аргумент -v или -v -v (можно добавлять к любым командам) для вывода полной информации:

avrdude -n -v -c gromov -P com1 -p m328p ###WIN### sudo avrdude -n -v -c gromov -P /dev/ttyS0 -p m328p ###Linux###


Вывод avrdude, что в windows, что в linux одинаковый, поэтому далее скрины буду делать только в win.

Тут уже больше информации, например, видно какие установлены фьюзы. Здесь они выводятся в шестнадцатеричных (HEX) числах. Например hfuse 0xDA, в двоичной системе выглядит так — 11011010. То есть это те самые биты, которые выставляются «галочками» в графических интерфейсах.

Когда будете разбираться с фьюзами, помните, в микроконтроллерах ATmega фьюзы инвертированы. То есть 0 — это включено, а 1отключено. В онлайн-калькуляторах из-за этого возникают непонятки (см. ниже).

Прочитаем прошивку из области flash (то же самое, что и PROGRAM в uniprof) командой:

avrdude -c gromov -P com1 -p m328p -U flash:r:readfl.txt:h ###WIN### sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h ###Linux###

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

Прошивка считана и записана в файл readfl.txt. Буква h (hex) в конце, указывает на то, что данные надо записать в шестнадцатеричном формате. Если написать букву b (binary), запишется в двоичной системе, а если r (raw), то данные будут в «сыром» виде (крякозябры).

Отсюда и далее предполагается, что win-пользователи находятся в корне диска С (C:\), а linux-юзеры работают из домашней папки, соответственно файлы будут сохраняться туда же (если не прописать иного пути). Прошивки, которые будут заливаться в МК, должны лежать там же.

Для win файл будет лежать здесь C:\readfl.txt, а для linux, в /home/user/readfl.txt. Можете открыть этот файл и поглядеть.

Чтение EEPROM:

avrdude -c gromov -P com1 -p m328p -U eeprom:r:reader.txt:h ###WIN### sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:r:reader.txt:h ###Linux###

Чтение flash и eeprom вместе:

avrdude -c gromov -P com1 -p m328p -U flash:r:readfl.txt:h -U eeprom:r:reader.txt:h ###WIN### sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h -U eeprom:r:reader.txt:h ###Linux###

Стирание контроллера:

avrdude -e -c gromov -P com1 -p m328p ###WIN### sudo avrdude -e -c gromov -P /dev/ttyS0 -p m328p ###Linux###


Отключите ножку «ресет» — диод мигать не будет, программа стёрта.

Прошьём МК скаченным ранее файлом 328test.hex. Лежит в корне диска C (c:\328test.hex) в windows или в домашней папке (/home/user/328test.hex) в linux.

avrdude -c gromov -P com1 -p m328p -U flash:w:328test.hex ###WIN### sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:328test.hex ###Linux###


Теперь если отключить «ресет», контроллер оживёт.

Обратите внимание. При прошивке МК через avrdude, стирать контроллер необязательно, программа делает это сама. Однако если указать параметр -D, тогда МК не будет очищаться автоматически.

Прошивка EEPROM:

avrdude -c gromov -P com1 -p m328p -U eeprom:w:eeprom.hex ###WIN### sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:w:eeprom.hex ###Linux###

Чтение всех фьюзов:

avrdude -c gromov -P com1 -p m328p -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h -U lock:r:lock.txt:h -U efuse:r:efuse.txt:h ###WIN### sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h -U lock:r:lock.txt:h -U efuse:r:efuse.txt:h ###Linux###


У каких-то контроллеров может не быть каких-то фьюзов.

Чтение только Low fuse:

avrdude -c gromov -P com1 -p m328p -U lfuse:r:lfuse.txt:h ###WIN### sudo avrdude -c gromov -P com1 -p m328p -U lfuse:r:lfuse.txt:h ###Linux###

Low fuse отвечает за выбор источника тактового сигнала (внутренний, внешний), его частоту и за паузу перед стартом контроллера после подачи на него питания. Сейчас у вас там записано значение — 0xff, что соответствует внешнему кварцу от 8-ми и выше МГц.

Сейчас мы прошьём другой lfuse, который переведёт вашу ATmeg`у на работу от внутреннего генератора на 8Мгц.

avrdude -c gromov -P com1 -p m328p -U lfuse:w:0xe2:m ###WIN### sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U lfuse:w:0xe2:m ###Linux###

Если у вас ардуина на 16МГц, то диод будет мигать в два раза медленней. В дальнейшем, при кодинге в AVR Studio, можно указывать частоту 8 МГц, а кварц отпаять, тем самым заполучив в своё распоряжение еще два свободных цифровых пина.

Но это потом, а сейчас вернём все как было прошив прежний фьюз:

avrdude -c gromov -P com1 -p m328p -U lfuse:w:0xff:m ###WIN### sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U lfuse:w:0xff:m ###Linux###

Диод будет мигать правильно.

Фьюзы можно прошивать как по отдельности так и вместе:

avrdude -c gromov -P com1 -p m328p -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m ###WIN### sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m ###Linux### Эти команды давать не нужно. Привожу их для наглядности.

В дальнейшем, когда потребуется использовать другие контроллеры, будете в онлайн-калькулятре расставлять «галочки», получать значения (по ссылке они в верхнем левом углу) в hex-формате и прошивать.

Вот очень хорошая статья про FUSE. И ещё…

Теперь осталось разобраться с параметрами avrdude и можно будет переходить к заключительной части.

-c gromov — тип программатора, вернее название под которым он записан в конфиге (avrdude.conf). -P com1 — ну тут всё и так понятно. -p m328p — обозначение тип МК. -U — после этой опции указывается область памяти (flash, eeprom, xfuse), над которой будет производится какие-либо действия (r — чтение, w — запись). Двоеточия служат разделителями.

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

Псевдонимы МК uc3a0512 — AT32UC3A0512 c128 — AT90CAN128 c32 — AT90CAN32 c64 — AT90CAN64 pwm2 — AT90PWM2 pwm2b — AT90PWM2B pwm3 — AT90PWM3 pwm316 — AT90PWM316 pwm3b — AT90PWM3B 1200 — AT90S1200 (****) 2313 — AT90S2313 2333 — AT90S2333 2343 — AT90S2343 (*) 4414 — AT90S4414 4433 — AT90S4433 4434 — AT90S4434 8515 — AT90S8515 8535 — AT90S8535 usb1286 — AT90USB1286 usb1287 — AT90USB1287 usb162 — AT90USB162 usb646 — AT90USB646 usb647 — AT90USB647 usb82 — AT90USB82 m103 — ATmega103 m128 — ATmega128 m1280 — ATmega1280 m1281 — ATmega1281 m1284p — ATmega1284P m1284rfr2 — ATmega1284RFR2 m128rfa1 — ATmega128RFA1 m128rfr2 — ATmega128RFR2 m16 — ATmega16 m161 — ATmega161 m162 — ATmega162 m163 — ATmega163 m164p — ATmega164P m168 — ATmega168 m168p — ATmega168P m169 — ATmega169 m16u2 — ATmega16U2 m2560 — ATmega2560 (**) m2561 — ATmega2561 (**) m2564rfr2 — ATmega2564RFR2 m256rfr2 — ATmega256RFR2 m32 — ATmega32 m324p — ATmega324P m324pa — ATmega324PA m325 — ATmega325 m3250 — ATmega3250 m328 — ATmega328 m328p — ATmega328P m329 — ATmega329 m3290 — ATmega3290 m3290p — ATmega3290P m329p — ATmega329P m32u2 — ATmega32U2 m32u4 — ATmega32U4 m406 — ATMEGA406 m48 — ATmega48 m48p — ATmega48P m64 — ATmega64 m640 — ATmega640 m644 — ATmega644 m644p — ATmega644P m644rfr2 — ATmega644RFR2 m645 — ATmega645 m6450 — ATmega6450 m649 — ATmega649 m6490 — ATmega6490 m64rfr2 — ATmega64RFR2 m8 — ATmega8 m8515 — ATmega8515 m8535 — ATmega8535 m88 — ATmega88 m88p — ATmega88P m8u2 — ATmega8U2 t10 — ATtiny10 t11 — ATtiny11 t12 — ATtiny12 t13 — ATtiny13 t15 — ATtiny15 t1634 — ATtiny1634 t20 — ATtiny20 t2313 — ATtiny2313 t24 — ATtiny24 t25 — ATtiny25 t26 — ATtiny26 t261 — ATtiny261 t4 — ATtiny4 t40 — ATtiny40 t4313 — ATtiny4313 t43u — ATtiny43u t44 — ATtiny44 t45 — ATtiny45 t461 — ATtiny461 t5 — ATtiny5 t84 — ATtiny84 t85 — ATtiny85 t861 — ATtiny861 t88 — ATtiny88 t9 — ATtiny9 x128a1 — ATxmega128A1 x128a1d — ATxmega128A1revD x128a1u — ATxmega128A1U x128a3 — ATxmega128A3 x128a3u — ATxmega128A3U x128a4 — ATxmega128A4 x128a4u — ATxmega128A4U x128b1 — ATxmega128B1 x128b3 — ATxmega128B3 x128c3 — ATxmega128C3 x128d3 — ATxmega128D3 x128d4 — ATxmega128D4 x16a4 — ATxmega16A4 x16a4u — ATxmega16A4U x16c4 — ATxmega16C4 x16d4 — ATxmega16D4 x16e5 — ATxmega16E5 x192a1 — ATxmega192A1 x192a3 — ATxmega192A3 x192a3u — ATxmega192A3U x192c3 — ATxmega192C3 x192d3 — ATxmega192D3 x256a1 — ATxmega256A1 x256a3 — ATxmega256A3 x256a3b — ATxmega256A3B x256a3bu — ATxmega256A3BU x256a3u — ATxmega256A3U x256c3 — ATxmega256C3 x256d3 — ATxmega256D3 x32a4 — ATxmega32A4 x32a4u — ATxmega32A4U x32c4 — ATxmega32C4 x32d4 — ATxmega32D4 x32e5 — ATxmega32E5 x384c3 — ATxmega384C3 x384d3 — ATxmega384D3 x64a1 — ATxmega64A1 x64a1u — ATxmega64A1U x64a3 — ATxmega64A3 x64a3u — ATxmega64A3U x64a4 — ATxmega64A4 x64a4u — ATxmega64A4U x64b1 — ATxmega64B1 x64b3 — ATxmega64B3 x64c3 — ATxmega64C3 x64d3 — ATxmega64D3 x64d4 — ATxmega64D4 x8e5 — ATxmega8E5

AVR Studio

Пользователи линукс могут воспользоваться wine.
Надеюсь у вас уже всё установлено, поэтому запускаем AVR Studio…


Здесь нам предлагается создать новый проект, либо открыть старый. Нажимаем
New Project


Выбираем AVR GCC, так как писать будем на СИ, а не на ассемблере. Даём название проекту и ставим «галочки». Выбираем Location (я создал папку AVR на диске С:\) там будут автоматически создаваться папки с проектами. Нажимаем Next


Выбираем AVR Simulator, так как у нас нету специального программатора, позволяющего вести отладку, и наш микроконтроллер — ATmega328p. Жмём Finish.

После этих манипуляций студия готова к работе.

Слева — пути к проекту. По центру — текстовый редактор, в котором пишется код. Справа — регистры контроллера. Внизу-слева отладочная информация.

Из кнопочек нам пока интересны эти —

• Сборка проекта. • Сборка проекта и запуск отладки. • Компиляция файла. • Очистка. • Настройка проекта. Вот её то и нажмите…


Здесь можно изменить тип МК, установить тактовую частоту (мы её пропишем прямо в коде), уровень оптимизации, а так же определить, какие файлы будут создаваться. Пощёлкайте для интереса иконки слева и нажмите
Отмена. Я не буду объяснять эти и другие опции, а позже дам ссылку с грамотным описанием.
Теперь скопируйте код написанный в начале статьи и вставьте его в редактор:


Тактовую частоту, мы прописали в коде потому, что этого требует библиотека delay.h.

Далее, нажмите кнопку «Сборка проекта» и в нижнем окне увидите результат работы.


Сборка прошла успешно, ошибок и предупреждений нет.

Теперь отправляемся по пути C:\AVR\my328\default\, находим там сотворённый нами hex-файл — my328.hex и прошиваем его в контроллер. Чем прошивать (avrdude или uniprof) выбирайте сами.

В avrdude это будет выглядеть так:

avrdude -c gromov -P com1 -p m328p -U flash:w:\AVR\my328\default\my328.hex ###WIN### avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:my328.hex ###Linux###


Отключите «ресет» и увидите как диод мигает раз в секунду. Надеюсь, что убедил вас в простоте и удобстве командной строки.

Чтобы обратно сделать ардуину ардуиной у вас есть бекап.

Как уже было написано выше, я не буду вдаваться в объяснения работы с AVR Studio, равно как и давать уроки по языку СИ. Во-первых, это не входило в мои планы (я лишь хотел помочь осуществить переход от Arduino к AVR Studio), во-вторых, у меня вряд ли получится это сделать лучше, чем написано на сайте easyelectronics.ru.

Вот ссылки на уроки по программированию МК, про фьюзы, про устройство портов ввода-вывода, про botloader и пособие по .

Я же в дальнейшем, планирую выкладывать различные ардуиновские проекты перенесённые в AVR Studio.

На этом всё, спасибо.

Оптимальное подключение ESP8266

Подключение ESP8266ПримечаниеUSB-TTL
VCCESP8266 подключайте к внешнему источнику питания >300мА, 3,3V
GNDвсе контакты GND должны быть соединены вместе: ESP8266, USB-TTL и источника питанияGND
TX (UTXD)RX
RX (URXD)TX
GPIO0подтягивающий к питанию резистор 10kDTR (если на вашем USB-TTL не разведен пин DTR, то вам придется вручную переключать GPIO0 на землю для перевода ESP8266 в режим прошивки)
RESET (RSBT, REST)подтягивающий к питанию резистор 10k, также можете добавить кнопку, соединяющую RESET и GND для ручного сброса модуляRTS (если на вашем USB-TTL не разведен пин RTS, то вам придется вручную перезагружать модуль )
CH_PD (CH_EN)подтягивающий к питанию резистор 10k
GPIO15 (MTDO)подтягивающий к земле резистор 10k (для тех модулей, где выведен пин GPIO15)
GPIO2подтягивающий к питанию резистор 10k (на схеме не показан, но рекомендуется для увеличения стабильности)
GPIO16для успешного выхода из режима Deep Sleep необходимо соединить пины ESP8266 GPIO16 и RESET через резистор 470 Ом (на схеме не показан)

Примечания.

1. Не на всех модулях выведены все пины. Перед приобретением модуля ознакомьтесь с видами модулей и их распиновкой.

2. Если на вашем USB-TTL конвертере выведены пины CTS и DSR — для автозагрузки прошивки они вам не помогут, т.к. работают только на вход.

3. Для стабильной работы ESP8266 требуется источник стабилизированного питания 3,3 вольт, ток более 250 миллиампер. Использование питания от USB-TTL конвертера может привести к нестабильности в работе.

Минимальное подключение ESP8266

Минимальное подключение ESP8266 (повышенная стабильность)

Более подробно, со всеми деталями, о подключении ESP8266 вы можете прочитать в нашей статье ESP8266 – подключение и обновление прошивки

Нам понадобится

  • Отладочная плата AVR. Предпочтительно Arduino UNO/Piranha UNO или любая другая плата AVR, совместимая с Ethernet шилдом. Если Ваша панель использует большое количество переменных и/или Ваш скетч использует большое количество библиотек, необходимо использовать отладочную плату на базе микроконтроллера с большей статической и динамической памятью, такую как Arduino MEGA или Piranha ULTRA
  • Ethernet шилд W5500 (если Вы используете шилд на базе чипа ENC28J60, необходимо использовать отладочную плату на базе микроконтроллера с большей статической и динамической памятью, такую как Arduino MEGA или Piranha ULTRA, при этом необходимо скачать и установить последнюю версию библиотеки UIPEthernet и изменить в скетче Ethernet.h на UIPEthernet.h).
  • Провод RJ45-RJ45 категории cat5e.
  • Маршрутизатор со свободным гнездом RJ-45 LAN.
  • Подключение к сети Интернет.
Рейтинг
( 2 оценки, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]