CUSTOMELECTRONICS.RU
Информационно-учебный блог о разработке электроники
Эл. почта: info@customelectronics.ru

Программирование Arduino на C в AVR Studio

Arduino — это готовая отладочная плата и очень простой язык для программирования, упрощающая начало работы с микроконтроллерами ценой размера и быстродействия программ. С недавних пор Atmel добавила поддержку бутлоадера Arduino в AVR Studio, то есть можно писать загружать без программатора программы написанные хоть на C, хоть на C++, хоть на Assembler. Более того — можно в AVR Studio писать код на языке Processing/Wiring.
Рекомендую начать чтение статьи с update’а в конце!
В этой статье мы предлагаем пошаговую инструкцию по установке ПО для программирования Arduino с использованием AVR Studio. За основу мы брали обзор расширений AVR Studio с сайта easyelectronics.ru. Все примеры мы будем запускать на нашей плате EduBoard.

Установка Arduino IDE

Мы используем версию Arduino 1.5.2. Скачать ее можно на официальном сайте. Последняя версия (1.6.2-r2 на момент написания статьи) по каким-то причинам не работает с микроконтроллером Atmega8.
Вы скачаете zip-архив с уже развернутой средой. Останется только распаковать ее в директорию с программами.

Установка Atmel Studio

Скачать среду можно на официальном сайте Atmel. Для этого вам потребуется регистрация на сайте. Обязательно пройдите ее — это понадобится и при установке расширений. Обратите внимание, что она работает только под Windows! Подойдут для нашей задачи только версии выше 6.0, то есть 6.1, либо 6.2!

Установка расширения Arduino для AVR Studio

Выберите пункт меню Tools -> Extension Manager. Перед вами откроется окно:

Extension Manager

Extension Manager

Выберите пункт меню «Arduino IDE for Atmel Studio 6.1 & 6.2″ и нажмите кнопку «Download». Вам предложат ввести логин/пароль. Сделайте это и не забудьте поставить галочку «Remeber me». После этого через браузер начнется загрузка файла ArduinoForAtmelStudio.msi. После загрузки установите его и перезапустите AVR Studio.

Настройка AVR Studio

После перезапуска вы увидите окно первоначальной настройки расширения. В этом окне необходимо указать директорию в которой установлена среда Arduino.

Configuring Visual Micro

Configuring Visual Micro

Вы увидите, что вас появилась новая панель инструментов:

Панель Visual Micro

Панель Visual Micro

На ней необходимо выбрать плату, которую вы используете (в нашем случае Arduino NG or older w/ ATmega8) и номер COM-порта к которому она подключена. Больше настроек доступно в меню Tools -> Visual Micro.

Инструменты Visual Micro

Инструменты Visual Micro

Начало работы

В AVR Stuidio запустите менеджер проектов «New Project». Выберите сценарий Arduino Sketch:

Настройка проекта

Настройка проекта

В файле проекта с расширением .ino вы увидите стандартный формат Arduino-скетча. На плате к выводу d13 подключен светодиод. Это вывод микроконтроллера PB5. Для примера помигаем этим светодиодом. Удалите весь код и введите вот это:

#include <avr/io.h>
#define F_CPU 16000000UL //16MHz
#include <util/delay.h>
int main(void) {
	DDRB  |= 1<<5;
	PORTB &= ~1<<5;
	while(1) {
		PORTB |= 1<<5;
		_delay_ms(100);
		PORTB &= ~1<<5;
		_delay_ms(100);
	}
}

После этого выберите пункт меню Debug -> Start Without Debugging. Среда скомпилирует код и загрузит его на плату, после чего светодиод должен будет замигать с частотой 5Гц.

Итоги

Таким образом вы можете использовать готовое железо от создателей Arduino и их бутлоадер и при этом писать хорошие программы.
Для примера, код, приведенный в примере, занимает 148 байт в памяти контроллера (то есть 2% для ATmega8) и та же самая программа, написанная на Processing/Wiring занимает 920 байт или 12% памяти ATmega8.
На данный момент, мы активно работаем над созданием целого курса по программированию Arduino на C.

UPD

Я смотрю тема пользуется популярностью и я хочу прояснить несколько моментов.
Есть три способа, которые я пробовал, чтобы запрограммировать Arduino-совместимую плату на С:

  1. Писать прямо на в Arduino IDE на С. Надо понимать, что Processing/Wiring это не язык, а просто набор макросов и библиотек. Когда вы на нем пишите, то он смотрит в своих заголовочниках, преобразует ваш простой для человека код в С и затем компилирует стандартным компилятором AVR GCC. Если вы напишите код на С, то он не будет обращаться к своим либам и сразу все скомпилирует как надо, НО!… при этом линковщик добавит к вашему проекту все что ему заблагорассудится. Достоинства в том, что кроме Arduino IDE вам ничего не надо. Недостаток в магии, которая спрятана от разработчика. Этот метод часто используют в тех случаях, когда нужно реализовать функцию, которую наши итальянские друзья в своем языке не предусмотрели.
  2. Способ предложенный в этой статье (на самом деле самый странный, ибо совмещает все недостатки). Идеологически, этот extension нужен для того, чтобы программировать на Processing/Wiring и использовать в качестве интерфейса Atmel Studio. Еще есть платный функционал, позволяющий дебажить код, но его я не пробовал. Так вот, по сути при программировании происходит все то же самое, что и при первом варианте, но вы работаете в другой IDE. При этом с точки зрения результата получаете одно и то же. Если вы программировали Arduino, и решили сделать это на С — смело пишите прямо в Arduino IDE. Если не нравится интерфейс, то можно использовать нормальный редактор (рекомендую, Sublime Text). Если вы работаете в Atnel Studio и хотите прошивать вашу плату прямо из ее интерфейса или писать в нем на Processing/Wiring (вдруг!), то этот аддончик для вас. Кстати, студия работает только под виндой, то есть способ сразу не для всех. Эту статью я написал только потому, что нашел новый для себя способ, но он мне не нравится.
  3. Третий способ, как мне кажется, лучший для продвинутого пользователя. Сначала все происходит как обычно — пишешь код, компилируешь и получаешь hex-файл. Затем, помня что у тебя в руках обычная отладочная плата с бутлоадером, качаешь утилиту, которая к этому бутлоадеру мжет обратиться и передать в память ваш код. Здесь мы уже выкладывали пошаговую инструкцию. В этом случае разработчик получает максимальный контроль над всеми функциями, но могут возникнуть и проблемы из-за использования стороннего бутлоадера.

Хочется раскрыть еще один момент, который происходит в Arduino. Чтобы вы не делали, Arduino IDE обязательно будет сама включать периферию. Например, запустит таймеры. И если вы захотите с ними поработать на С, то можете обнаружить, что работают они не так, как вы ожидали. И это может стать настоящей проблемой. И таких примеров много, то есть много и потенциальных граблей, костылей и багов.
Если вы просто заливаете hex-файл, то проблемы могут возникнуть только из-за бутлоадера. Пока я нашел только одну — после завершения работы бутлоадера остается включен UART. Если вы пишете через Arduino IDE, то она в ваш код вставит его отключение и кто знает что еще. Если вы просто хотите запустить свой hex, то контроль за ногами UART’а вы не получите. Придется руками в свой проект добавить отключение UART. Подробно этот артефакт и примеры кода описаны в этой статье.
Ну, и в заключение. На большинстве Arduino-совместимых плат есть разъем для ISP-программатора. Если купить этот программатор у китайцев за 3-4 доллара вы быстро забудете про все эти проблемы.

Мы будем очень рады, если вы поддержите наш ресурс и посетите магазин наших товаров shop.customelectronics.ru.

Метки: , Просмотров: 55183