Отладка в arduino ide

Обновлено: 06.07.2024

Библиотека Simple Dumping Monitor для Arduino-совместимых контроллеров на базе микроконтроллеров ATmega позволяет выводить дампы регистров, таймеров и памяти RAM, Flash и EEPROM, а также дамп таблицы векторов прерываний.

Библиотекой версии 0.21 поддерживаются микроконтроллеры:

  • ATmega48P/88P/168P/328P -- платы Arduino
  • ATmega640/1280/1281/2560/2561 -- платы Arduino MEGA
  • ATmega16U4/32U4 -- платы Arduino Leonardo
  • ATmega164A/PA/324A/PA/644A/PA/1284/P -- платы Sanguino/Daiduino

Начиная с версии 0.6 в библиотеку добавлены функции простого символьного отладчика.

В скомпилированном виде библиотека занимает около 11 Кб памяти (около 15 Кб - Arduino Mega). Требования к ОЗУ (RAM) не превышают 1 Кбайт (277 байт для примера dumpmon.pde, 377 байт для примера dumpmonDebug.pde).

Для использования библиотеки, нужно скачать файл с архивом. В архиве находится папка DumpMon, которую нужно распаковать в директорий libraries директория с библиотеками Arduino IDE. В результате должно получиться libraries/DumpMon .

В папке DumpMon/Examples находится скетч-пример dumpmonDebug.pde, который демонстрирует использование библиотеки для отладки скетча.

Команды отладчика библиотеки Simple Dumping Monitor

После успешной компиляции скетча и загрузки его в память Arduino, нужно открыть окно Serial Monitor, включить нужную скорость обмена (в примерах используется скорость 19200 бод). После этого можно отправлять Arduino команды для просмотра наблюдаемых переменных и управления отладкой:

  • ? -- вывод подсказки.
  • W -- вывод значений наблюдаемых переменных.
  • S -- перевод отладчика в режим пошагового выполнения.
  • N -- выполнить программу до следующей точки останова.
  • G -- выполнение программы в обычном режиме.
  • A -- повторить предыдущую команду.
  • С -- продолжить вывод дампа (для команды W -- повторить вывод).

Команды и адреса можно вводить как в нижнем, так и в верхнем регистрах. Значения переменных и адресов выводятся в шестнадцатиричном формате.

Для использования отладчика библиотеки Simple Dumping Monitor, необходимо добавить в функцию setup() скетча вызов функции инициализации библиотеки, а также добавить переменные для наблюдения в список наблюдаемых переменных.

Функция dumpmonSetup() принимает два параметра:

  • Скорость обмена последовательного порта USART в бодах (бит/сек.).
  • Начальный режим отладчика (по умолчанию - пошаговый, что соответствует значению STEP_MODE ).

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

По умолчанию библиотека использует последовательный порт Serial ( USART0 ). Для использования другого последовательного порта микроконтроллеров ATmega1280/2560 ( Serial1 , Serial2 или Serial3 ) следует добавить в вызов функции dumpmonSetup() ссылку на данный порт:

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

Примечание. Вызывать функцию breakpoint() из функций-обработчиков прерываний не следует, работать не будет.

Сессия отладки с библиотекой Simple Dumping Monitor

После успешной компиляции и загрузки скетча в память Arduino, для начала отладки следует открыть окно Serial Monitor (меню Tools), и установить скорость обмена, используемую в скетче. В данном случае 19200 бод (бит/сек.).

В окне Serial Monitor мы увидим информацию об очередной точке останова:

Введём команду N и нажмём клавишу Enter или кнопку Send, чтобы передать её Arduino.

Теперь понятно, что выводит отладчик. Первой строкой выводится номер останова и идентификатор точки останова. Затем выводится дамп переменных наблюдения в формате: адрес переменной, символьная метка, значение в шестнадцатиричном формате и значение в символах ASCII. Для строковых переменных значение выводится в виде ASCII-текста.

Посмотрим память по адресу переменной text , отправив команду M140. Отладчик выведет дамп памяти, начиная с адреса 0x0140 .

Поскольку переменная text имеет тип указателя на массив символов типа char , то значение 0x0127 - это адрес строки, на которую указывает переменная text в данный момент. Выведем дамп командой M127 .

Снова выведем список переменных наблюдения командой W :

Всё верно - строковая константа "Example" хранится в RAM по адресу 0x0127 , на который в данный момент указывает переменная text .

Запустим скетч на выполнение командой G . Затем остановим его командой S или N .

Значения счётчиков совпадают в младших 16 битах. По старшим 16 битам счётчика lcount можно увидеть, что за это время счётчик count успел несколько раз обнулиться. В моём случае это 2 раза. А также переменная текст имеет значение "Debug" и регистр PORTB имеет значение 0x20 , что означает, что бит 5 находится в состоянии логической единицы, то есть светодиод в данный момент должен светиться. Смотрю на Arduino - так и есть, светится.

В этой статье поговорим о том, как отлаживать программы на плате Arduino UNO с помощью debugWire. Я частенько использую эту платку или Nano для отладки своих программ в Atmel Studio (использовать Arduino IDE у меня рука не поднимается). И так начнем.

Что можно сделать с помощью debugWire?

Прочитать память контроллера, выполнить пошаговую отладку кода, установить точки останова программы, прочитать регистры и значения на портах ввода/вывода и т.п.

Что для этого будет необходимо?

— Arduino Uno
— Atmel Studio 6
— AVR Dragon программатор-отладчик

Подготавливаем железо

В даташите на Atmega328 говорится:

«Конденсаторы, подключенные к пину RESET, должны отключены при использовании debugWire. Все внешние источники сброса должны быть отключены»

Если проверить схему Arduino Uno, можно увидеть, что к RESET подключен конденсатор 100нФ. В старых версиях Arduino необходимо было снять этот конденсатор для отключения RESET. На новых платах есть специальная перемычка, которая может быть разрезана и запаяна вновь, если потребуется.


Подготовка софта

Просто компилируем код в Atmel Studio, нет необходимости заливать программу отдельно через AVR DUDE, AVR Dragon сам сделает это через debugWire.

Подключаем железо

Подключаем ISP от AVR Dragon к ISP Arduino Uno. Обратите внимание, что контакт 1 подключается к PIN1 на другом устройстве, т.е. MISO подключается к MISO. AVR Dragon и Arduino запитываются каждый через свой USB разъем. В настройках выбираем использовать AVR Dragon в качестве отладчика.

Atmel studio debugwire arduino

Открываем меню программирования Tools > Device Programming

Atmel studio debug wire arduino

Собственно устанавливаем фьюз-бит DWEN. В даташите также сказано что LOCK биты не должны быть запрограммированы.

Atmel studio фьюзы

Запускаем debugWire

1. После того как прошили фьюзы временно отключаем питание Arduino Uno.
2. Устанавливаем debugWire как интерфейс для программирования и отладки


3. Жмем «Start Debugging and Break» или Alt+F5. Можно просто нажать F5, а уже потом точки останова расставить. Отладка запускает прошивку тоже.
4. Отлаживаем программу, устанавливаем где надо точки останова, наблюдаем за регистрами и портами ввода-вывода.
5. Останавливаем отладку Ctrl+Shift+F5, изменяем код и возвращаемся к пункту 3.
6. Жмем меню «Debug > Disable debugWIRE» Это меню доступно только во время отладки, так что, если что жмем снова F5. После это DWEN сбрасывается и можно снова использовать ISP.
Вот и все.

Похожие публикации по теме:


Подключение устройства к сети Ethernet

Управление инкрементальным энкодером на AVR

Управление инкрементальным энкодером на AVR


Режим Power-down микроконтроллеров серии Tiny

PTD-208z

Реализация протокола PELCO-D на Arduino

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

UART

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

Среда Arduino IDE не содержит отладчика, что создает определенные проблемы в поиске ошибок кода программы. Без ошибок программы сразу не пишутся. Формальные ошибки выявляются при компиляции, а с алгоритмическими и вычислительными ошибками намного сложнее.

В интернете описывается много способов отладки программ, которые используют дополнительные библиотеки, программы, аппаратные адаптеры. Но основная функция отладки это увидеть состояние программы, узнать значение переменных. Это можно сделать, передав нужную информацию на компьютер через последовательный интерфейс. Физическое подключение платы Ардуино к компьютеру через USB кабель существует всегда. Среда Arduino IDE имеет монитор последовательного порта, позволяющий получать и посылать данные обмена с платой. Можно передать на компьютер любую информацию о состоянии программы и вывести ее на дисплей. Меня такой способ отладки вполне устраивает. Только вместо монитора Arduino IDE я иногда использую свои программы, которые выводят данные в удобном мне виде.

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

Последовательный интерфейс UART.

UART в переводе это универсальный асинхронный приемопередатчик. Данные UART передаются последовательным кодом в следующем формате.

Протокол UART

Каждый бит передается за равные промежутки времени. Время передачи одного бита определяется скоростью передачи. Скорость передачи указывается в бодах (бит в секунду). Кроме битов данных интерфейс UART вставляет в поток биты синхронизации: стартовый и стоповый. Таким образом, для передачи байта информации требуется 10 битов, а не 8. Погрешность временных интервалов передачи битов должна быть не более 5% (рекомендуется не более 1,5%).

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

  • в неактивном режиме выход UART находится в высоком состоянии;
  • передача байта начинается со стартового бита (низкого уровня);
  • передача байта заканчивается стоповым битом (высокого уровня);
  • данные передаются младшим битом вперед;
  • для передачи байта требуется 10 битов;
  • время передачи одного байта рассчитывается исходя из скорости передачи и количества битов (10).

Часто используются следующие стандартные скорости передачи интерфейса UART.

Скорость передачи,
бод
Время передачи одного бита, мкс Время передачи байта,
мкс
4800 208 2083
9600 104 1042
19200 52 521
38400 26 260
57600 17 174
115200 8,7 87

Обмен информацией через UART происходит в дуплексном режиме, т.е. передача данных может происходить одновременно с приемом. Для этого в интерфейсе UART есть два сигнала:

  • TX – выход для передачи данных;
  • RX – вход для приема данных.

При соединении двух UART устройств выход TX одного устройства соединяется со входом RX другого. А сигнал TX второго UART подключается к входу RX первого.

Последовательный интерфейс UART в Ардуино.

Любая плата Ардуино имеет, как минимум, один аппаратный последовательный интерфейс UART. Платы Arduino Mega и Arduino Due имеют по три порта.

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

Плата Arduino UNO имеет один порт UART, сигналы которого подключены к выводам 0 (сигнал RX) и 1 (сигнал TX). Сигналы имеют логические уровни TTL (0…5 В). Через эти выводы (0 и 1) можно подключить к плате другое устройство имеющее интерфейс UART.

Кроме функции связи с другими контроллерами порт UART платы Arduino UNO используется для загрузки в контроллер программы из компьютера. Для этого к этим же сигналам (RX и TX) подключены соответствующие выводы микросхемы ATmega16U2 - преобразователя интерфейса USB/UART. Микросхема преобразователя подключена через резисторы сопротивлением 1 кОм.

Фрагмент схемы платы Arduino UNO R3.

Схема Arduino UNO R3

Таким образом, при свободных выводах 0 и 1 платы Ардуино сигналы с микросхемы ATmega16U2 поступают на контроллер ATmega328. А если к плате подключить внешнее UART устройство, то его сигналы будут иметь приоритет, т.к. ATmega16U2 подключена через резисторы.

Преобразователь интерфейса ATmega16U2 позволяет подключать плату Ардуино к компьютеру через USB порт. На компьютер устанавливается драйвер. Он создает на компьютере виртуальный COM порт. Через него и происходит обмен. Такая технология описана на примере другого преобразователя интерфейсов PL2303 USB-UART по этой ссылке. Там же есть информация о вариантах UART интерфейсах с разными уровнями сигналов.

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

Библиотека Serial для работы с UART Ардуино.

Для работы с аппаратными UART контроллерами в Ардуино существует встроенный класс Serial. Он предназначен для управления обменом данными через UART. Перед тем, как рассказать о функциях класса Serial я хочу пояснить разницу в формате данных обмена.

Через последовательный интерфейс данные всегда передаются в двоичном коде. Вопрос как эти данные интерпретировать, как воспринимать. Например, передан двоичный код “01000001” (десятичный 65). Как его отобразить на экране? Может быть передано число 65 и на экране надо вывести ”65”. А может это код буквы ”A”, тогда на экране надо написать ”A”. Просто необходимо знать в каком формате передаются данные.

В классе Serial данные могут передаваться в двух форматах:

Например, монитор последовательного порта в программе Arduino IDE принимает данные как ASCII текст. Для того, чтобы он вывел на экран компьютера число “65” надо передать коды символов “6” и “5”. А код ”65” монитор отобразит как символ “A”.

Основные функции класса Serial.

void begin(long speed)

Разрешает работу порта UART и задает скорость обмена в бод (бит в сек). Для задания скорости передачи данных рекомендуется использовать стандартные значения (таблица в разделе “Последовательный интерфейс UART”).

Serial.begin(38400); // инициализация порта, скорость 38400 бод

void end(void)

Отключает порт UART, освобождает выводы RX и TX.

Serial.end(); // закрыть порт UART

int available(void)

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

int n;
n= Serial. available(); // в n число принятых байтов

int read(void)

Возвращает очередной байт из буфера последовательного порта. Если буфер пуст – возвращает число – 1 (0xffff).

receiveByte= Serial.read(); // чтение байта из буфера

void flush(void)

Ожидает окончания передачи данных из буфера последовательного порта.

Serial.flush(); // ждем окончания передачи

print()

Выводит данные через последовательный порт UART в виде ASCII символов. Функция имеет различные формы вызова для разных форматов и типов данных.

Данные типа byte выводятся кодом числа

println()

int d= 83;
Serial.print(d, DEC); // вывод строки “83”
Serial.println(d, DEC); // вывод строки “83 \r \n”

int write()

Выводит двоичные данные через последовательный порт UART. Возвращает количество переданных байтов.

int peek(void)

Возвращает следующий байт из буфера последовательного порта, не удаляя его из буфера. Если буфер пуст, то возвращает значение -1. Функция возвращает то же значение, что и функция read().

int readBytes(* buf, len)

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

setTimeout(long time)

Задает время тайм-аута для функции readBytes(). Время time указывается в мс, по умолчанию оно равно 1000 мс.

void serialEvent()

Вызывается при поступлении данных в последовательный порт. По сути – прерывание по приему данных последовательным портом.

// код для обработки данных порта

Применение класса Serial.

Класс Serial встроенный. Для него не надо искать библиотеку и подключать ее. Чтобы использовать UART достаточно в setup() разрешить работу порта и задать скорость:

void setup()
Serial.begin(9600); // инициализируем порт, скорость 9600
>

Теперь можно передавать данные с помощью функций print() или write().

Если через порт выводится несколько байтов, то класс Serial записывает их в программный буфер и последовательно по байту передает данные в контроллер UART по мере передачи.

unsigned int i=0;
void setup()
Serial.begin(9600); // инициализируем порт, скорость 9600
>

Тестовое окно

При поступлении данных на вход UART класс Serial записывает их в программный буфер. Для чтения данных из буфера необходимо сначала проверить, есть ли они там.

if( Serial.available() > 0 )
// есть данные

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

unsigned int i=0;
void setup()
Serial.begin(9600); // инициализируем порт, скорость 9600
>

Тестовое окно

Отладка программ с помощью последовательного порта на Ардуино.

Принцип отладки простой.

  • С помощью последовательного порта и функций класса Serial мы можем передать на компьютер информацию о состоянии программы.
  • С помощью монитора последовательного порта Arduino IDE или другой программы мы можем эти данные увидеть на экране компьютера.
  • Этими же программными средствами можно передать данные в программу Ардуино и повлиять на ее работу.

Для кнопок, подключенных по схеме предыдущего урока, скетч программы выглядит так.

// отладка кнопок с помощью порта UART

Button button1(BUTTON_1_PIN, 20); // создание объекта кнопка 1
Button button2(BUTTON_2_PIN, 20); // создание объекта кнопка 2

void setup()
Serial.begin(9600); // инициализируем порт, скорость 9600
MsTimer2::set(2, timerInterupt); // задаем прерывания по таймеру с периодом 2 мс
MsTimer2::start(); // разрешаем прерывание
>

// обработка прерывания
void timerInterupt()
button1.scanState(); // вызов метода обработки сигнала кнопки 1
button2.scanState(); // вызов метода обработки сигнала кнопки 2
>

Монитор порта Arduino IDE

Только необходимо, чтобы скорости обмена были одинаковы в программе и мониторе (у меня 9600 бод).

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

В следующем уроке научимся считывать значения сигналов на аналоговых входах платы Ардуино.

Изучаем Arduino без Arduino c помощью Tinkercad и его сервиса Схемы.

Изучаем Arduino без Arduino c помощью Tinkercad и его сервиса Схемы.

С каждым годом робототехника становиться популярнее. Для разработки роботов и простых проектов используется платформа Arduinо, но для изучения данной платформы нужно купить Arduino UNO или NANO, резисторы, светодиоды, соединительные провода, макетную плату, сервоприводы, двигателя, дисплей, реле, датчики и сенсоры. Начальное вложение от 2 т. руб. при покупке минимального набора на Aliexpress. Если покупать в наших магазинах стоимость может быть в 2-3 раза больше. Стоит ли покупать железки для изучения робототехники? На данный вопрос можно ответить, попробовав свои силы в сборке схем и программировании Arduino в Tinkercad и его сервисе Circuits.

Что такое Arduino?

Что такое Arduino?

Arduino — торговая марка аппаратно-программных средств для построения простых систем автоматизации и робототехники, ориентированная на непрофессиональных пользователей.

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

Файловая система SPIFFS в ESP8266 и ESP32

Файловая система SPIFFS в ESP8266 и ESP32

У микроконтроллеров ESP8266 и ESP32 есть своя файловая система SPIFFS (Serial Peripheral Interface Flash File System). Из названия понятно, что она работает по шине SPI.

SPIFFS аналогична файловой системе компьютера , но имеет ряд ограничений. Она позволяет создавать, редактировать файлы в тестовых форматах.

Управляем Arduino через USB. Библиотека Serial.

Управляем Arduino через USB. Библиотека Serial.

Набор функций Serial служит для связи устройства Ардуино с ПК или другими устройствами, поддерживающими последовательный интерфейс обмена данными. Все платы Arduino имеют хотя бы один последовательный порт (UART). Для обмена данными Serial используют цифровые порты ввод/вывода 0 (RX) и 1 (TX), а также USB порт. Важно учитывать, что если вы используете функции Serial, то нельзя одновременно с этим использовать пины 0 и 1 для других целей.

Программа Arduino IDE бесплатно для Windows, Mac OS, linux. Прошиваем Arduino

Программа Arduino IDE бесплатно для Windows, Mac OS, linux. Прошиваем Arduino

В связи с постоянными вопросами по софту для Arduino и ЧПУ. Решил снять несколько видео роликов посвященных данной теме.

Arduino IDE можно пользоваться без установки на компьютер с Windows необходимо скачать архив в формате .zip.

Читайте также: