Программируем на С/С++ в Visual Studio под Arduino

Источник: habrahabr

Этот пост поможет начинающим сэкономить несколько часов(дней) для настройки среды Visual Studio для разработки под Arduino на языке С/C++.

 

Преамбула

 Пару месяцев назад увидел у преподавателя некую платку, подключенную к компьютеру. На платке были видны семисегментные индикаторы и несколько светодиодов. Преподаватель разбирался в каком-то коде, платка тем временем живо сигнализировала ему что-то. Меня сразу заинтересовало, чем это он там занимается… Однако, всё, что я смогу узнать у него - это то, что платку зовут отладочной. Путём недолгого гугления выхожу на игрушку под названием "Arduino". Заказываю себе Arduino mega, та что с Atmega1280 (всего $29.99) и через две недели бегу на почту получать заветную игрушку.

Фабула

 Т.к. я являюсь заядлым Windows-разработчиком, привыкшим к среде VS, то я решил сразу отвлечься от родной среды Arduino IDE.

 Итак, нам понадобится:
Собственно, сама среда;
Visual Assist X - опционально, для облегчения разработки. Заменяет собой встроенный IntelliSense встроенный в VS. Еще куча дополнительных опций. Платное;
WinAVR последней версии. Это компилятор программ на С/С++ для "платформы" AVR;
avr-libc. Минимальная реализация стандартной библиотеки С для AVR. Содержит такие полезные функции, как, например, _delay_ms или _delay_us (задержка в милли- и микросекундах);
Avrdude. Желательно свежей версии, универсальный программатор для AVR;
FTDI Virtual Com Port Drivers. Не вдаваясь в подробности, будем называть это "драйверами для Arduino";
AvrStudio - опционально. Имеет встроенный симулятор микроконтроллера, позволяющий пошагово отлаживать программу;
Arduino schematic. Этот pdf-файл понадобится для того, чтобы узнать к каким портам МК подключены выходы Arduino.

 Всё гуглится на раз.

 Итак, приступим. Устанавливаем WinAVR, avr-libc, скачивам Avrdude. Подключаем Arduino к компьтеру и устанавливаем драйвера. Создаём "makefile project" в Visual Studio. Заполняем поля так, как на рисунке ниже.

В месте, куда установился WinAVR в поддиректории sample находится Makefile, который можно использовать для сборки проекта. Копируем себе, в папку созданного makefile project, и изменяем некоторые строки:

MCU = atmega1280

F_CPU = 16000000

FORMAT = ihex

TARGET = ATMEGA-1280-DEV-BOARD

SRC = $(TARGET).C

Первая строчка обозначает тип микроконтроллера. Для Arduino mega это atmega1280;
Вторая строчка задаёт частоту, на которой будет работать наш МК;
Третья строка - формат выходного файла. Лучше оставить intel hex;
Четвёртая - имя вашего проекта;
Пятая - список исходных файлов проекта.

PROGRAMMER_FLAGS = -p m1280 -c arduino -b 57600 -P COM3 -U flash:w:$(TARGET).hex

 Эта строка будет передаваться в качестве параметров для Avrdude.
Опция -p указывает тип девайса, который будем шить;
-с указывает тип программатора. Arduino использует протокол обмена информацией позаимствованный у программатора STK500, поэтому здесь можно смело вписывать stk500. Однако, в новой версии avrdude добавили в качестве программатора Arduino, поэтому с пущей уверенностью вписываем сюда arduino;
Следующая опция указывает на какой скорости будет происходить передача данных. Здесь всегда нужно ставить 57600;
Опция -P указывает порт, к которому подключен программатор;
Последняя опция указывает какую конкретно операцию следует выполнить. Для нас это загрузка в флеш-память микроконтроллера программы.

 Изменяем секцию all примерно так:
all: build program
 Добавляем к списку задачи "program". Это позволит при удачной компиляции автоматически грузить прошивку в МК.

 В принципе, всё готово. Пробуем написать минимальную программу (моргалку светодиодом L). Смотрим в файлик arduino-mega-schematic.pdf и видим, что 13 порт Arduino есть ни что иное, как PB7. Пишем примерно следующую программу:

#include <avr/io.h>

#include <util/delay.h>

 

int main()

{

  DDRB = 0xFF;

  while(true)

  {

    PORTB /= (1 << 7);

    _delay_ms(500);

    PORTB &= ~(1 << 7);

    _delay_ms(500);

  }

  return 0; 

}

 

* This source code was highlighted with Source Code Highlighter.

 Минимальный интерфейс для работы с портами ввода-вывода:

#include "utils.h"

 

class Port

{

public:

  Port(PORT& p) : _p(p) {};

  Port& operator! ();

  Port& operator+= (uint8 b);

  Port& operator-= (uint8 b);

  Port& operator= (Port& p);

  void SetLow();

  void SetHigh();

  PORT& GetValue();

  bool ClearBit(uint8 b);

  bool SetBit(uint8 b);

  void Pulse(uint8 t);

  void PulseBit(uint8 b, uint8 t);

private:

  PORT& _p;

};


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=27255