Андрей Смирнов
Время чтения: ~16 мин.
Просмотров: 0

Ошибки компиляции arduino nano и их решения

Тестирование микросхемы Atmega16U2

Если ваша плата не прошла тест обратной петли, и вы уверены, что USB-кабель исправен, то вы можете протестировать сам чип Atmega16U2. На плате есть разъем ICSP (In Circuit Serial Programming), рядом с чипом Atmega16U2 и рядом с разъемом USB.

Сначала отключите питание (отсоедините кабель USB и любой кабель питания).

Затем вы можете подключить разъем ICSP через 6 проводов-перемычек к известному исправному Uno, как показано на фото:

Пин выходами для заголовка ICSP являются (сверху):

Контакт 1 на заголовке ICSP рядом с чипом Atmega16U2 отмечен маленькой белой точкой рядом с буквой «F» в «AREF». Контакт 1 на заголовке ICSP рядом с чипом ATmega328P помечен маленькой белой точкой под «N» в «ON».

Double- проверьте свою проводку.

Затем на плате «заведомо хорошо» установите эскиз «Atmega_Board_Detector», как описано в Страница программиста загрузчика Atmega . Код находится по адресу GitHub – nickgammon / arduino_sketches . Если вы нажмете кнопку «Загрузить» на этой странице, вы получите ряд полезных набросков. Тот, который вам нужен, называется «Atmega_Board_Detector».

После установки откройте последовательный монитор, установите его на 115200 бод, и вы должны увидеть что-то вроде этого:

Однако, если вы получаете сообщение, подобное этому:

Это может означать, что ваш ATmega16U2 не работает.

Миньон из втулки от туалетной бумаги

Карандашницы.

Из жёлтой бумаги вырезают полоску, равную высоте втулки и оклеивают ею цилиндр. Закрывают картонным кругом донышко. Из голубого листа выкраивают комбинезон, из серого – глазки-окуляры. Всё это приклеивают к основе. Фломастером рисуют швы. Чтобы конструкция не переворачивалась под тяжестью карандашей, утяжеляют основание, укладывая внутрь небольшой металлический диск.

Последовательность работы.

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

Пенал.

Ошибка exit status 1 при компиляции для плат uno, mega и nano

И самое частое сообщение, для пользователей уно, которое выскакивает в среде разработки – exit 1. И оно же самое дискомфортное для отладки приложения, ведь тут необходимо учесть чуть ли не ядро системы, чтобы понять, где же кроется злополучный баг.

В документации указано, что это сообщение указывает на то, что не запускается ide Аrduino в нужной конфигурации, но на деле есть ещё десяток случаев, при которых вы увидите данное сообщение. Однако, действительно, не забывайте проверять разрядность системы, IDE и просматривать, какие библиотеки вам доступны для обращения на текущий момент.

Синтаксические ошибки

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

Сразу же при покупке они получают готовый набор библиотек на С99 и возможность, по необходимости, подтянуть необходимые модули в опен-соурс источниках.

Но и здесь не избежать множества проблем, с которыми знаком каждый программист, и одна из самых неприятных – ошибка компиляции для платы Аrduino nano, с которой вам придется столкнуться не раз. Что же эта строчка означает, какие у неё причины появления, и главное – как быстро решить данную проблему?

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

Как несложно догадаться, компиляция – приведение кода на языке Си к виду машинного (двоичного) и преобразование множественных функций в простые операции, чтобы те смогли выполняться через встроенные операнды процессора. Выглядит всё достаточно просто, но сам процесс компиляции происходит значительно сложнее, и поэтому ошибка во время проведения оной может возникать по десяткам причин.

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

Мы узнали, к чему приводит данный процесс, давайте разберёмся, как он происходит:

Первое, что делает компилятор – подгружает все инклуднутые файлы, а также меняет объявленные дефайны на значения, которое для них указано. Это необходимо затем, чтобы не нужно было по нескольку раз проходиться синтаксическим парсером в пределах одного кода. Также, в зависимости от среды, компилятор может подставлять функции на место их объявления или делать это уже после прохода синтаксическим парсером

В случае с С99, используется второй вариант реализации, но это и не столь важно.
Далее он проверяет первичный синтаксис. Этот процесс проводится в изначальном компилируемом файле, и своеобразный парсер ищет, были ли описаны приведенные функции ранее, подключены ли необходимые библиотеки и прочее

Также проверяется правильность приведения типов данных к определенным значениям. Не стоит забывать, что в С99 используется строгая явная типизация, и вы не можете засунуть в строку, объявленную integer, какие-то буквенные значения. Если такое замечается, сразу вылетает ошибка.
В зависимости от среды разработки, иногда предоставляется возможность последний раз протестировать код, который сейчас будет компилироваться, с запуском интерпретатора соответственно.
Последним идет стек из различных действий приведения функций, базовых операнд и прочего к двоичному коду, что может занять какое-то время. Также вся структура файлов переносится в исполняемые exe-шники, а затем происходит завершение компиляции.

Как можно увидеть, процесс не так прост, как его рисуют, и на любом этапе может возникнуть какая-то ошибка, которая приведет к остановке компиляции. Проблема в том, что, в отличие от первых трех этапов, баги на последнем – зачастую неявные, но всё ещё не связанные с алгоритмом и логикой программы. Соответственно, их исправление и зачистка занимают значительно больше времени.

А вот синтаксические ошибки – самая частая причина, почему на exit status 1 происходит ошибка компиляции для платы Аrduino nano. Зачастую процесс дебагинга в этом случае предельно простой.

Вакансии

Программирование аппаратно-программных средств arduino, разработка чертежей в SolidWorks.

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

Не стоит этого страшиться – этот процесс вполне нормален. Все претензии выводятся на английском, например, часто можно увидеть такое: was not declared in this scope. Что это за ошибка arduino – на самом деле ответ уже скрыт в сообщении. Функция или переменная просто не были задекларированы в области видимости.

Для Хэллоуина: миньон из тыквы и кабачка

Пример платы

«Arduino Uno» – это не просто одна вещь , которая может дать сбой. Он имеет несколько основных компонентов, и, возможно, только один из них вышел из строя (если есть). Смотрите эту справочную фотографию:

  • Процессор Atmega16U2 – это интерфейс интерфейса с USB-соединением
  • Процессор Atmega328P – это «основной» процессор, который на нем есть эскиз
  • Регулятор напряжения – он преобразует входное питание от разъема питания в 5 В
  • Индикатор питания (зеленый) – с пометкой «Вкл»
  • Светодиодный индикатор (желтый) с маркировкой «L» – подключен через операционный усилитель к цифровому контакту 13
  • Светодиоды Rx и Tx (желтые) – они указывают, что USB-чип (Atmega16U2) получает или передача

Обратите внимание, что светодиоды Rx и Tx не подключены напрямую к цифровым контактам 0 и 1 на плате (помечены как Rx и Tx). Они загораются, только если вы осуществляете последовательную связь через USB , а не если у вас есть что-то (например, GPS), подключенное непосредственно к цифровым контактам 0 и 1

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

Это не означает, что что-то ошибочно отправляет данные.

Основные ошибки

Ошибка: «avrdude: stk500_recv(): programmer is not responding»

Смотрим какая у нас плата? Какой порт используем? Сообщаем ардуино о правильной плате и порте. Возможно, что используете Nano, а указана Mega. Возможно, что указали неверный порт. Всё это приводит к сообщению: «programmer is not responding».

Решение:

В Arduino IDE в меню «Сервис» выбираем плату. В меню «Сервис → Последовательный порт» выбираем порт.

Ошибка: «a function-definition is not allowed here before ‘{‘ token»

Забыли в коде программы (скетча) закрыть фигурную скобку }.

Решение:

Обычно в Ардуино IDE строка с ошибкой подсвечивается.

Ошибка: «No such file or directory  /  exit status 1»

Подключаемая библиотека отсутствует в папке libraries.

Решение:

Скачать нужную библиотеку и скопировать её в папку программы — как пример — C:\Program Files\Arduino\libraries. В случае наличия библиотеки — заменить файлы в папке.

Ошибка: «expected initializer before ‘}’ token  /  expected ‘;’ before ‘}’ token»

Забыли открыть фигурную скобку {, если видим «initializer before». Ошибка «expected ‘;’ before ‘}’ token» — забыли поставить точку с запятой в конце командной строки.

Решение:

Обычно в Ардуино IDE строка с ошибкой подсвечивается.

Ошибка: «… was not declared in this scope»

Arduino IDE видит в коде выражения или символы, которые не являются служебными или не были объявлены переменными.

Решение:

Проверить код на использование неизвестных выражений или лишних символов.

Синтаксические ошибки

Перечислим наиболее часто встречающиеся варианты ошибок компиляции Arduino/Genuino:

  • Ошибка a function-definition is not allowed here before ‘{‘ token. Эта ошибка означает, что вы забыли закрыть фигурную строку. Проверьте все функции и внутренние блоки кода. Для каждой открывающей скобки должна найтись и закрывающая. Arduino IDE поможет вам – щелкните открывающий знак “{“ и программа подсветит закрывающий.

  • Ошибка expected initializer before ‘}’ token. Возникает в обратной ситуации: когда вы забыли открыть или нечаянно стерли открывающую фигурную скобку. Иногда такая ошибка возникает, если есть несколько закрывающих скобок без открывающей. В любом случае нужно внимательно просмотреть код и привести скобки в порядок.
  • Ошибка ‘что-то там’ was not declared in this scope. Означает, что ардуино обнаружила в коде слова, не являющиеся служебными и не объявленные как переменные. Как правило, ошибка возникает, если вы действительно забыли продекларировать переменные или методы. Также возможно, что вы случайно написали лишние символы или стерли знак комментария, после чего ваши мысли ардуино стал воспринимать как команды.
  • Ошибка undefined reference to `loop’. Возникает, если вы случайно удалили или переименовали функцию loop. Ардуино не сможет запустить скетч без команду, указанных в этом блоке. Если вы напортачили с функцией setup, то ошибка будет выглядеть соответственно: undefined reference to `setup’. Выход в обоих случаях один – вернуть loop или setup на свое место в скетче.

Попробуйте загрузить эскиз

Важно: Если вы возникают проблемы с загрузкой эскизов, удаляйте все подключенные устройства (например, экраны). Также удалите соединительные провода, вставленные в разъемы платы

В частности, ничего не должно быть подключено к цифровым контактам 0 и 1 (Rx и Tx), потому что это будет мешать взаимодействию с загружающим компьютером.

Выберите один из Простой пример набросков (например, Blink) и попробуйте загрузить его. Вот что вы должны увидеть:

Светодиод «L» должен мигать 3 раза. Это связано с тем, что основной чип сбрасывается по команде из процесса загрузки.

Светодиод «Rx» должен быстро мигать. Это инструкции из процесса загрузки, пытающегося активировать загрузчик.

Светодиод «Tx» должен быстро мигать. Это процессор, подтверждающий загруженные данные.

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

Если мигает только индикатор «Rx», это может быть связано с проблемой загрузчика или чипа основного процессора (Atmega328P). Кто-то стучит, но дома никого нет!

Проверьте тип платы

Если светодиоды мигают, но вы получаете сообщение, подобное этому:

Проверьте тип платы:

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

Если светодиоды вообще не мигают, возможно, выбран неправильный порт связи.

Проверьте порт связи:

Если возможно, попробуйте другой ПК / Mac

Попробуйте Arduino на другом ПК / Mac, если он у вас есть. Это может сузить вопрос о том, есть ли у вас проблемы с конкретным компьютером, к которому вы его подключили, или с компьютерами в целом.

Выполните тест обратной связи

  • Отключите все экраны и другие провода.
  • Отключите плату от источника питания.
  • Подключите перемычку от RESET к GND (оранжевый провод на фото) Подключите перемычку от Rx к Tx (белый провод на фото)
  • Подключите USB-кабель и запустите терминальную программу, такую ​​как Terminal Monitor в Arduino IDE. Напечатайте что-нибудь и отправьте это (например, нажмите Enter в мониторе терминала).
  • Все, что вы вводите, должно быть возвращено.

Если все возвращается назад: это подтверждает, что у вас правильный коммуникационный порт, USB-кабель в порядке, а чип интерфейса USB (Atmega16U2), вероятно, в порядке.

Если ничего не отображается, проверьте:

  • У вас правильный порт связи.
  • Попробуйте другой кабель. Некоторые дешевые USB-кабели имеют только провода питания, а не провода данных.
  • Проверьте, установлен ли драйвер устройства для Arduino. Вам, вероятно, не нужно делать это, если эта плата ранее работала на этом компьютере, но может быть целесообразно сделать это, если вы впервые подключаете эту плату к этому компьютеру.

Ошибки библиотек

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

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

Ошибки библиотек

Огромное количество ошибок при компиляции для Arduino может быть вызвано неправильно подключенными библиотеками или ошибками внутри самих библиотек. Рассмотрим только некоторые из них:

  • Ошибка fatal error: … No such file or directory. Возникает, если вы подключаете библиотеку, которую не установили предварительно в папку libraries. Ардуино просто не может найти указанный файл декларации и дает об этом знать.
  • Сообщение об ошибке в одном из подключенных файлов. Означает, что вы скачали плохо написанную библиотеку или пытаетесь подключить несовместимые библиотеки. Обратитесь на форум к разработчику библиотеки или еще раз проверьте корректность структуры вашего приложения.
  • Ошибки типа redefinision of void setup’ – возникают, если в подключаемой библиотеке автор зачем то уже объявил функции, которые в используете в своем скетче. Нужно переименовать методы (у себя или в бибилиотеке)

Ошибки библиотек

Огромное количество ошибок при компиляции для Arduino может быть вызвано неправильно подключенными библиотеками или ошибками внутри самих библиотек. Рассмотрим только некоторые из них:

  • Ошибка fatal error: … No such file or directory. Возникает, если вы подключаете библиотеку, которую не установили предварительно в папку libraries. Ардуино просто не может найти указанный файл декларации и дает об этом знать.
  • Сообщение об ошибке в одном из подключенных файлов. Означает, что вы скачали плохо написанную библиотеку или пытаетесь подключить несовместимые библиотеки. Обратитесь на форум к разработчику библиотеки или еще раз проверьте корректность структуры вашего приложения.
  • Ошибки типа redefinision of void setup’ – возникают, если в подключаемой библиотеке автор зачем то уже объявил функции, которые в используете в своем скетче. Нужно переименовать методы (у себя или в бибилиотеке)

Онлайн-курсы

Проблемы со сторожевым таймером

Таймер сторожевого таймера (по умолчанию выключен) можно настроить на сброс процессора после определенного времени. время. Целью является восстановление после зависания процессора, развернутого в полевых условиях. Однако, если таймер установлен на короткий период (например, 16 мс), процессор может снова выполнить сброс, прежде чем загрузчик сможет что-либо предпринять.

Симптомы: вы не можете загружать новые эскизы , Некоторые современные загрузчики (например, Optiboot) предпринимают шаги, чтобы остановить эту проблему как одну из первых вещей, которые они делают. Однако другие этого не делают.

Это может быть трудно исправить, поскольку после запуска эскиза у вас возникает проблема его сброса, и если у вас есть проблема, вы не можете заменить эскиз. Люди часто сообщают, что для восстановления необходимо записать новый загрузчик. Однако это только потому, что, как побочный эффект, запись загрузчика стирает текущий эскиз.

Там есть способ восстановления. Выполните следующие действия:

  • Полностью отключите плату (отсоедините USB-кабель).
  • Удерживайте нажатой кнопку сброса и удерживайте ее нажатой. вниз (или проложите перемычку от контакта RESET к контакту GND). Это останавливает запуск эскиза проблемы и, таким образом, активирует сторожевой таймер.
  • Удерживая нажатой кнопку «Сброс», снова подключите USB-кабель.
  • Начните загрузку эскиза, у которого нет этой проблемы. (например, моргание)
  • Как только среда IDE сообщит о «выгрузке», отпустите кнопку сброса (или удалите перемычку).
  • Теперь она должна загрузить OK – как эскиз, который активированный сторожевой таймер никогда не запускался.

Проверьте питание

USB power

Подключите плату к компьютеру с помощью USB-кабеля и убедитесь, что зеленый светодиод «Вкл» горит.

Используйте мультиметр и пару перемычка приводит к проверке между выводом 5 В и выводом GND (показано стрелкой внизу). Вы должны получить около 5,0 В (у меня 5,04 В на моем).

(Вы можете купить дешевый мультиметр примерно за 10 долларов, если у вас его нет, но вам лучше получить лучший примерно за 50 долларов – проверьте все сайты и магазины электроники.)

Также проверяйте между 3,3 В контакт и GND – вы должны получить 3,3 В.

Если вы не получаете 5 В при подключенном USB-кабеле, убедитесь, что другой конец подключен к вашему компьютеру. Также попробуйте другой кабель.

Разъем питания

Если вы используете или планируете использовать разъем питания (с надписью «power» в «на фото» отсоедините USB и подключите источник питания – который должен быть от 7 до 12 В постоянного тока с положительным контактом на центральном выводе.

Измерьте выводы 5 В и 3,3 В, как указано выше. Вы по-прежнему должны видеть те же напряжения на них.

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

Синтаксические ошибки

Перечислим наиболее часто встречающиеся варианты ошибок компиляции Arduino/Genuino:

  • Ошибка a function-definition is not allowed here before ‘{‘ token. Эта ошибка означает, что вы забыли закрыть фигурную строку. Проверьте все функции и внутренние блоки кода. Для каждой открывающей скобки должна найтись и закрывающая. Arduino IDE поможет вам – щелкните открывающий знак “{“ и программа подсветит закрывающий.
  • Ошибка expected initializer before ‘}’ token. Возникает в обратной ситуации: когда вы забыли открыть или нечаянно стерли открывающую фигурную скобку. Иногда такая ошибка возникает, если есть несколько закрывающих скобок без открывающей. В любом случае нужно внимательно просмотреть код и привести скобки в порядок.
  • Ошибка ‘что-то там’ was not declared in this scope. Означает, что ардуино обнаружила в коде слова, не являющиеся служебными и не объявленные как переменные. Как правило, ошибка возникает, если вы действительно забыли продекларировать переменные или методы. Также возможно, что вы случайно написали лишние символы или стерли знак комментария, после чего ваши мысли ардуино стал воспринимать как команды.
  • Ошибка undefined reference to `loop’. Возникает, если вы случайно удалили или переименовали функцию loop. Ардуино не сможет запустить скетч без команду, указанных в этом блоке. Если вы напортачили с функцией setup, то ошибка будет выглядеть соответственно: undefined reference to `setup’. Выход в обоих случаях один – вернуть loop или setup на свое место в скетче.

Ошибки компиляции плат Arduino uno

Другая частая оплошность пользователя, которая порождает вопросы вроде, что делать, если Аrduino не видит порт, заключается в том, что вы попросту забываете настроить среду разработки. IDE Ардуино создана под все виды плат, но, как мы указывали, на каждом контроллере помещается лишь ограниченное количество библиотек, и их наполнение может быть различным.

Соответственно, если в меню среды вы выбрали компиляцию не под тот МК, то вполне вероятно, что вызываемая вами функция или метод просто не будет найдена в постоянной памяти, вернув ошибку. Стандартно, в настройках указана плата Ардуино уно, поэтому не забывайте её менять. И обратная ситуация может стать причиной, по которой возникает проблема загрузки в плату на Аrduino uno.

Рейтинг автора
5
Материал подготовил
Максим Иванов
Наш эксперт
Написано статей
129
Ссылка на основную публикацию
Похожие публикации