Программирование AVR Arduino MEGA 2560 Thu, March 28 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Arduino MEGA 2560 Печать
Добавил(а) microsin   

Плата Arduino Mega 2560 работает на микроконтроллере ATmega2560 [2]. У платы есть 54 цифровых порта ввода/вывода (GPIO), из которых 15 могут использоваться как выходы PWM (ШИМ), 16 аналоговых входов (коммутатор на входе АЦП), 4 порта UART (аппаратный последовательный порт), тактовый генератор на кварцевом резонаторе 16 МГц, коннектор USB (виртуальный COM-порт, через который плата программируется и может управляться из консоли), разъем для джека питания, коннекторы для подключения программатора и кнопка сброса. На плате есть все, что необходимо для поддержки нормальной работы микроконтроллера. Просто подключите плату к компьютеру кабелем USB, или подайте на неё питание от адаптера AC-DC или батареи, и плата готова к работе. Плата совместима с большинством шилдов, разработанных для плат Arduino Duemilanove или Arduino Diecimila (это самые популярные, мейнстримовские платы на основе микроконтроллера ATmega328P).

ArduinoMega2560 R3 top ArduinoMega2560 R3 bottom

Примечание: совсем не понравилось, что обратная сторона платы покрыта сплошным слоем белой шелкографии. Дешевые понты, зачем было так делать? Можно было просто нанести дополнительные метки возле коннекторов - для удобства.

Плата Arduino Mega 2560 стала обновлением для платы Arduino Mega, которую может заменить.

Mega2560 отличается от всех предыдущих плат тем, что она не использует микросхему драйвера FTDI USB-to-serial. Вместо этого применен дополнительный микроконтроллер ATmega16U2 (или ATmega8U2 в ревизиях 1 и 2 плат), который запрограммирован как устройство USB CDC (то же самый преобразователь USB-to-serial, виртуальный COM-порт).

В ревизии 2 платы Mega2560 есть резистор, подтягивающий сигнал HWB микроконтроллера ATmega8U2 к земле, что упрощает его перевод в режим DFU (это режим самопрограммирования через USB, или USB-загрузчик, подробнее см. [3]).

В ревизии 3 платы есть следующие новые возможности:

• Разводка портов 1.0: добавлены выводы портов SDA и SCL, которые расположены возле вывода AREF, и 2 новых ножки, размещенные возле вывода RESET, а также добавлен вывод IOREF, который позволит шилдам адаптироваться к напряжению, которое предоставляет плата (т. е. к логическим уровням сигналов). В будущем шилды будут совместимы как с платами, которые используют 5V AVR, так и с платами наподобие Arduino Due, которые работают от 3.3V. Второй контакт никуда не подключен, он зарезервирован для будущего использования.
• Улучшена схема сброса (RESET).
• Микроконтроллер Atmega16U2 заменил 8U2.

[Общие параметры]

Микроконтроллер ATmega2560-16AU в корпусе TQFP100
Рабочее напряжение питания 5V
Напряжение адаптера AC-DC Рекомендуется 7..12V, предельные значения 6..20V
Портов ввода/вывода (GPIO) 54 (из них 15 могут предоставить ШИМ)
Входов ADC (АЦП) 16
Выходной ток порта GPIO 40 мА
Выходной ток вывода 3.3V 50 мА
Объем памяти программ (FLASH) 256 кбайт, из которых 8 кбайт занято под UART-загрузчик Arduino
Объем оперативной памяти (SRAM) 8 кбайт
Объем энергонезависимой памяти (EEPROM) 4 кбайт
Рабочая тактовая частота 16 МГц

Микроконтроллер ATmega2560, установленный на плату, имеет на борту 256 килобайт памяти программ (FLASH), из которых 8 килобайт занято под загрузчик кода (UART-загрузчик Arduino). Таким образом, пользователь может использовать для своих целей 248 килобайт памяти программ (для микроконтроллеров это довольно много). Оперативная память составляет 8 килобайт. В микроконтроллере имеется также энергонезависимая память (EEPROM) на 4 килобайта, значения в которой сохраняются между выключениями питания. В памяти EEPROM можно хранить различные конфигурационные данные программируемой системы.

[Схема, цоколевка коннекторов портов]

Схема состоит из 2 логически независимых частей: первая это все, что относится к микроконтроллеру ATmega2560 (сброс, питание, тактирование, порты ввода/вывода, коннекторы для них, индикационный светодиод L), и вторая часть - все что относится к организации виртуального COM-порта через интерфейс USB (микроконтроллер ATmega16U2, его тактирование, питание, сброс, индикация, система запуска загрузчика и т. п.). Ниже приведены обе эти схемы.

ATmega2560

Arduino Mega 2560 main unit

ATmega16U2 (мост USB CDC)

Arduino Mega 2560 USB CDC unit

У микроконтроллера ATmega2560 корпус TQFP100 с большим количеством 8-разрядных портов ввода/вывода (GPIO). Каждая ножка порта привязана к разряду какого-то 8-битного регистра. Таких регистров 11 штук, и они условно носят имена PORTA, PORTB, PORTC, PORTD, PORTE, PORTF, PORTG, PORTH, PORTJ, PORTK, PORTL. Наружу из корпуса микроконтроллера на ножки обычно выведены все разряды порта, но иногда это не так (например, для некоторых разрядов портов D, E, G, H, J ножек не хватило). Ниже на рисунке показана общая разводка портов ввода/вывода платы.

Arduino Mega 2560 port legend

На коннекторы платы выходят также общий провод (GND), шины питания (5V, 3.3V), сигнал сброса RESET, опорное напряжение АЦП AREF.

Некоторые ножки портов выполняют специальные функции. Например, какие-то порты кроме обычной функции GPIO (программно управляемые порты DIGITAL) могут формировать ШИМ (PWM), некоторые могут работать как входы АЦП (входы коммутатора ADC, ANALOG IN), некоторые совмещены с портами UART (COMMUNICATION) и т. п. Ниже на рисунке приведена подробная функциональная диаграмма платы Arduino Mega 2560, где описаны все эти функции.

Arduino Mega 2560 func diagram

Каждый из 54 цифровых портов Mega2560 может программно использоваться либо как вход, либо как выход (см. функции pinMode(), digitalWrite(), digitalRead()). Они работают с логическими уровнями 5V (т. е. выходной уровень лог. 0 соответствует низкому напряжению, близкому к 0V, а выходной уровень лог. 1 соответствует напряжению, близкому к 5V; пороговое напряжение, когда уровень не определен, близко к 2.4..2.5V). Втекающий или вытекающий ток выхода может составлять не более 40 мА на один вывод порта. Если порт настроен как вход, то можно программно к нему подключить внутренний плюсовой нагрузочный резистор (по умолчанию он отключен) 20..50 кОм.

Дополнительно некоторые ножки портов могут выполнять различные специальные функции, связанные с внутренними периферийными устройствами микроконтроллера ATmega2560, загрузчиком и программными библиотеками Arduino.

Последовательные порты Serial. Это последовательные порты UART, с которыми связаны специальные зарезервированные имена Serial (порт 0 RX, порт 1 TX), Serial1 (порт 19 RX, порт 18 TX), Serial2 (порт 17 RX, порт 16 TX), Serial3 (порт 15 RX, порт 14 TX). Всего получается 4 аппаратных последовательных порта, у каждого из которых есть цифровой сигнал приема RX и передачи TX. Порт Serial (порт 0 RX, порт 1 TX) имеет специальное назначение: он подключен к соответствующим сигналам моста USB CDC на ATmega16U2, и используется для загрузчика кода и для обмена данными с Serial Monitor [4].

Внешние аппаратные прерывания по изменению лог. уровня (External Interrupts). Это INT0 (порт 2), INT1 (порт 3), INT2 (порт 21), INT3 (порт 20), INT4 (порт 19), INT5 (порт 18). Эти порты могут быть сконфигурированы так, что будут вызывать срабатывание прерывания по лог. 0, спаду или нарастанию логического сигнала, или по изменению его значения (подробнее см. документацию по функции attachInterrupt()).

ШИМ (PWM). Это порты от 2..13 и от 44..46. Они могут аппаратно формировать аналоговые уровни (медленно меняющееся напряжение, звук, сигналы произвольной формы) с помощью широтно-импульсной модуляции (подробнее см. описание функции analogWrite()).

SPI. Это тоже последовательный интерфейс, но в отличие от UART он синхронный, т. е. имеет специальный сигнал тактирования для битов приема и передачи [5]. Интерфейс SPI работает на портах 50 (MISO), 51 (MOSI), 52 (SCK) и 53 (SS). Обмен данными через SPI в среде программирования Arduino возможен с помощью SPI library. Сигналы SPI также напрямую выведены на коннектор внутрисхемного программирования ICSP, который по цоколевке совместим с другими платами Arduino (Arduino Uno, Arduino Duemilanove и Arduino Diecimila).

LED. Индикационный светодиод традиционно подключен к цифровому порту 13. Когда выход порта 13 в состоянии лог. 1, то светодиод горит, если в состоянии лог. 0, то погашен.

TWI. Это последовательный интерфейс, занимает порты 20 (SDA) и 21 (SCL). Аббревиатура расшифровывается как Two Wire Interface (двухпроводный интерфейс), это то же самое, что и I2C. Обмен данными через TWI в среде программирования Arduino возможен с помощью Wire library. Имейте в виду, что номера портов TWI отличаются от плат Arduino Duemilanove или Arduino Diecimila.

ADC. ATmega2560 имеет на борту 16 аналоговых входов каждый из которых может оцифровывать уровень напряжения 10 битами (т. е. 1024 градации). По умолчанию опорное напряжение равно 5V (можно оцифровывать уровни от 0 до 5V), но можно изменить верхний предел измерения с помощью сигнала AREF (это внешнее опорное напряжение). Подробности см. в описании функции analogReference().

Reset. Если этот сигнал перевести в лог. 0, то это сбросит микроконтроллер ATmega2560. Обычно этот сигнал используется шилдами, если нужно на время заблокировать микроконтроллер или сбросить его.

[Питание]

Плата может получать питание через интерфейс USB или от внешнего источника питания постоянного тока 7..12V. Источник питания выбирается автоматически, т. е. для его выбора не предусмотрено никакой специальной перемычки.

Внешнее питание (которое приходит не от USB) может быть подано от внешнего блока питания или от батареи. Адаптер питания можно подключить через обычный джек диаметром 2.1 мм. Батарею можно подключить также через контакты GND и Vin коннектора POWER.

Внешнее напряжение источника питания, которое может быть подано на плату, может находиться в пределах от 6V до 20V. Однако имейте в виду, что если входное постоянное напряжение меньше 7V, то в зависимости от потребляемого тока напряжение микроконтроллера может упасть ниже уровня 5V, и плата может работать в при этом нестабильно. Если Вы используете источник питания с напряжением больше 12V, то при большом токе потребления линейный регулятор напряжения платы может перегреться и повредить плату. Таким образом, рекомендуемые пределы напряжения источника питания составляют 7..12V.

У платы имеются следующие контакты, связанные с питанием:

VIN. Это входное напряжение питания для платы Adruino, когда она получает питание от внешнего источника (в отличие от 5V, поступающего от USB или другого внешнего стабилизатора напряжения). Напряжение VIN поступает на вход встроенного линейного регулятора напряжения, и его рекомендуемое значение должно находиться в пределах 7..12V. Вы можете подать это напряжение как на контакт VIN относительно GND, так и через джек 2.1 мм.

5V. Это напряжение, поступающее с выхода встроенного линейного регулятора напряжения платы (когда регулятор работает, то это выход). Этот провод подает питание 5V на большинство потребителей платы, в том числе и на микроконтроллер. Как уже упоминалось, плату следует питать либо от USB (5V), либо от постоянного напряжения 7..12V, подключенное либо к VIN, либо через 2.1 мм джек. Подача внешнего питания через контакт 5V или 3.3V может повредить плату, поэтому это делать не рекомендуется.

3.3V. Это напряжение вырабатывается встроенным регулятором напряжения платы (выход). Его максимально допустимый выходной ток составляет 50 мА.

GND. Это общий провод.

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

[Обмен данными с внешним миром]

У платы Arduino Mega 2560 есть несколько возможностей для обмена данными с компьютером, другой платой Arduino или каким-то микроконтроллером. Имеется 4 аппаратных UART-а с TTL (5V) уровнями. Самый первый из них подключен к мосту USB-UART на микроконтроллере ATmega16U2 (в ревизиях плат 1 и 2 использовался ATmega8U2), и используется для закачки программы в память микроконтроллера через Arduino-загрузчик. Для подключения к компьютеру на Windows требуется установка драйвера (в виде *.inf-файла), а на операционных системах OSX и Linux драйвер не нужен, они распознают виртуальный COM-порт автоматически. В состав системы программирования Arduino входит программа Serial Monitor (мерзкая, кстати, не позволяет выводить сообщения на русском языке), которая позволяет обмениваться текстовыми сообщениями с программой микроконтроллера. Эту функцию удобно использовать для отладки и управления. Имеются светодиоды RX и TX, которые миганием индицируют прием и передачу данных.

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

Также ATmega2560 поддерживает обмен данными по шинам TWI (I2C) и SPI. Программное обеспечение Arduino включает библиотеку Wire, которая упрощает использование шины TWI. Для обмена через SPI используется библиотека SPI.

[Программирование]

На чем можно программировать еще, неужели только Arduino IDE? К счастью, это не так. Про Arduino можно много говорить и хорошего, и плохого (это зависит в основном только от предпочтений пользователя), но одного у Arduino не отнять - чрезвычайная простота для быстрого старта, и чрезвычайно убогие результаты для профессиональной деятельности [10]. Однако у Вас есть возможность писать программы и в других средах программирования - AVR Studio, Atmel Studio, CodeVision AVR, BASCOM AVR, IAR, Eclipse и даже Microsoft Visual Studio. Конечно, это немного труднее, чем с Arduino, однако эффективность кода возрастает в несколько раз. Интересно, что все системы программирования под AVR (разве что это не относится напрямую к BASCOM и совсем не относится к IAR), даже Arduino IDE, генерируют код на основе одного и того же тулчейна avr-gcc.

Платы Arduino Mega (как, впрочем, и все остальные платы Arduino) могут быть запрограммированы с помощью специального программного обеспечения (это UART-загрузчик и утилита AVRDUDE, которые используются Arduino IDE для заливки программы пользователя в память микроконтроллера). Как это делается можно узнать из руководства пользователя и/или видеороликов на YouTube. Микроконтроллер ATmega2560, установленный на плате, поставляется с прошитым загрузчиком, который позволяет загрузить программу пользователя без какого-либо внешнего программатора. Для обмена с загрузчиком используется оригинальный протокол STK500 [6]. Благодаря консольным утилитам avrdude и stk500 перешивать платы через USB с помощью загрузчика можно не только в среде Arduino, но и в любой среде программирования.

Если у Вас есть программатор, то Вы можете не использовать загрузчик, и прошивать программу напрямую через коннектор ICSP (аббревиатура расшифровывается как In-Circuit Serial Programming, внутрисхемное программирование по последовательному каналу данных).

Исходный код для мостов USB-UART на микроконтроллерах ATmega16U2 (или 8U2 в ревизиях плат 1 и 2) доступен в репозитории Arduino [7]. Скомпилированный код можно прошить с помощью DFU - другого USB-загрузчика [3].

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

На платах ревизии 1: замкните капелькой олова перемычку на обратной стороне платы (недалеко от рисунка карты Италии), после чего сбросьте ATmega8U2.

На платах ревизии 2 и более поздних: есть резистор, который притягивает ножку HWB микроконтроллеров 8U2/16U2 к земле, что упрощает их перевод в режим DFU.

После того, как чип моста переведен в режим DFU, Вы можете воспользоваться программным обеспечением Flip компании Atmel (на Windows) или DFU Programmer (на Mac OS X или Linux) для загрузки нового программного обеспечения моста.

Другой вариант - вместо DFU-загрузчика можно использовать обычный ISP-программатор. Внимание, эта процедура сотрет DFU-загрузчик, однако с помощью того же ISP программатора загрузчик всегда можно при желании восстановить.

[Автосброс]

Вместо того, чтобы вручную нажимать кнопку сброса каждый раз, когда Вам надо загрузить Вашу Arduino-программу в память ATmega2560, в плате Arduino Mega 2560 разработана специальная схема, которая позволяет сбросить микроконтроллер (и тем самым запустить UART-загрузчик) программно, по команде подключенного через USB компьютера. Для этого один из сигналов управления потоком (а именно DTR) микроконтроллера моста USB-UART подключен через конденсатор 100 нанофарад к сигналу сброса ATmega2560. Когда сигнал DTR по команде с компьютера переключается в лог. 0, то получается короткий импульс лог. 0 на сигнале RESET, длительность которого достаточна, чтобы сбросить микроконтроллер ATmega2560. Система программирования Arduino IDE использует эту возможность, что позволяет удобно загружать код программы, просто кликом курсором мыши на на кнопке Upload (или выбором соответствующего пункта в меню). Это означает, что у загрузчика может быть меньше время ожидания загрузки кода (таймаут, через который он запускает программу пользователя), что повышает удобство не только загрузки кода, но и ускоряет запуск запрограммированной системы.

Использование этого метода имеет некий побочный эффект, который нужно упомянуть. Когда плата Arduino Mega 2560 подключена к компьютеру с операционной системой Mac OS X или Linux, то сброс будет происходить всякий раз, когда будет сделано программное подключение (через USB). После окончания загрузки кода пользователя загрузчик ждет еще полсекунды кода пользователя, и потом запускает загруженный код. Хотя загрузчик запрограммирован игнорировать ошибочные данные (т. е. что-либо помимо нового кода), он примет несколько первых переданных байт после того, как было открыто соединение через USB. Если скетч рассчитан на то, чтобы принять какие-то данные от компьютера после своего старта (например, какие-то настроечные данные или другую информацию), то убедитесь, что программное обеспечение не начнет обмен данными хотя бы в течение 1 секунды - пока не запустится программа пользователя в микроконтроллере.

Плата Mega2560 имеет перемычку, которую можно перерезать, чтобы запретить функцию автосброса. Чтобы снова её восстановить, достаточно посадить каплю олова в этом месте. Перемычка помечена как RESET-EN. Также можно запретить автосброс, если подключить резистор номиналом примерно 110 Ом между шиной +5V и сигналом RESET.

[Защита от перегрузки по току USB]

Плата Arduino Mega 2560 оборудована самовосстанавливающимся предохранителем (так называемый polyfuse), который защитит USB-порты Вашего компьютера от коротких замыканий и перегрузок по току. Хотя большинство современных компьютеров уже имеют такую собственную защиту, защита на плате Arduino предоставляет дополнительную гарантию безопасности. Если потребляемый от порта USB ток по какой-то причине превысит 500 мА, то предохранитель автоматически разорвет соединение, пока не будет устранено короткое замыкание.

[FAQ]

Когда начинаешь работать с микроконтроллерной системой в первый раз, то обязательно нужно запустить стандартный Hello World: мигание светодиодом. Светодиод подключен на плате Arduino Mega 2560 к цифровому порту 13 (как на всех платах Arduino). Если посмотреть на схему, то это порт PB7, ножка 26 корпуса TQFP100. Чтобы можно было управлять светодиодом, эта ножка порта должна быть настроена как выход, и на неё поочередно, через задержку 1 секунду надо выводить то лог. 1 (тогда светодиод загорится), то 0 (тогда светодиод погаснет). В результате получится мигание с частотой 0.5 Гц - именно то что нам нужно. Давайте рассмотрим по шагам, как это можно сделать для платы Arduino Mega 2560 в разных системах программирования под операционной системой Windows.

1. Установите себе эту систему, если она еще не установлена (можно скачать бесплатно с сайта arduino.cc).

2. Подключите плату к компьютеру. Установите драйвер USB, если он у Вас не установлен (см. вопрос "Где взять драйвер USB?"). Диспетчере Устройств посмотрите, какой получился номер COM-порта. Предположим, что это COM155.

Arduino Mega 2560 driver installed ok

3. Запустите среду программирования Arduino. В меню Сервис -> Плата выберите пункт Arduino Mega 2560 or Mega ADK.

Arduino IDE select board Mega 2560

Затем в меню Сервис -> Последовательный порт выберите COM155.

Arduino IDE select COM port

4. В меню Файл -> Примеры -> 01.Basics выберите пример Blink.

Arduino IDE select Blink example

Откроется новое окно редактора кода, где Вы увидите текст скетча Blink.

5. Выберите в меню пункт Файл -> Загрузить, или нажмите горячие клавиши Ctrl+U. Несколько секунд понадобится на компиляцию, секунд на загрузку, и в результате на плате замигает с частотой 0.5 Гц светодиод L.

Arduino IDE select Blink example compile Arduino IDE select Blink example upload

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

Давайте рассмотрим, из чего состоит код скетча Blink.

void setup() {
  // Эта функция инициализирует цифровой порт 13 как выход:
  pinMode(13, OUTPUT);
}
 
void loop() {
  digitalWrite(13, HIGH);   // Выдать в порт лог. 1, светодиод загорится.
  delay(1000);              // Задержка в 1 секунду.
  digitalWrite(13, LOW);    // Выдать в порт лог. 0, светодиод погаснет.
  delay(1000);              // Задержка в 1 секунду.
}

Все довольно просто. Функции setup и loop стандартные, они обязательно присутствуют в любом скетче Arduino. Функция setup отвечает за первоначальные настройки после сброса или включения питания, здесь настройка заключается только в вызове функции pinMode, которая настраивает нужный нам порт 13. Функция loop выполняет бесконечный цикл (между фигурными скобками функции loop заключено тело этого цикла). В данном примере функция digitalWrite устанавливает на выходе то лог. 1, то лог. 0, а функция delay осуществляет задержку между переключениями.

Эта система разработки получила заслуженную популярность как у профессионалов, так и у опытных радиолюбителей по многим причинам. Она бесплатная, довольно простая, примеров кода и готовых проектов для неё много. Здесь я не буду разбирать, чем AVR Studio лучше или хуже Arduino IDE. Это вопрос чисто личный, каждый волен выбирать то, что для него удобнее и понятнее. Также не будут рассматривать процесс установки AVR Studio - дистрибутив можно свободно скачать с сайта Atmel или других источников, и вся процедура установки состоит в запуске инсталлятора, после чего также нужно скачать и установить тулчейн WinAVR. Рассмотрим, как программировать плату Arduino Mega 2560 в среде AVR Studio на том же самом примере - мигание светодиодом. Предполагаю, что AVR Studio и тулчейн WinAVR у Вас уже установлены.

1. Запустите AVR Studio, выберите в меню Project -> New Project. Откроется окно мастера создания проекта. Выберите тип проекта (Project type:) AVR GCC, вбейте любое имя проекта (английскими буквами, например HelloWorld), выберите место (папку) Location, где будет создан проект. Должно получиться примерно так, как показано на скриншоте:

AVR Studio create new project for Arduino Mega 2560 step1

После этого нажмите на кнопку Next.

2. На следующем шаге Вам предложат выбрать платформу отладки (Debug platform:) и тип микроконтроллера (Device:). Выберите платформу отладки AVR Simulator 2, и микроконтроллер ATmega2560, после чего нажмите на кнопку Finish.

AVR Studio create new project for Arduino Mega 2560 step2

На этом создание проекта завершено, теперь нужно ввести код программы, и настроить параметры проекта.

3. В окне редактора кода модуля HelloWorld.c введите следующий код:

//Подключение заголовков, в которых определены порты микроконтроллера,
// и имя подпрограммы задержки:
#include < avr/io.h >
#include < util/delay.h >
 
//Объявление имени LED для ножки порта, куда подключен светодиод:
#define LED PB7
 
// Основная функция, где находится главный цикл программы.
void main (void)
{
   //До начала главного цикла всегда делаются предварительные настройки.
   DDRB = (1 << LED);  // настройка порта LED как выхода
   
   //Главный бесконечный цикл программы.
   while(1)
   {
      PORTB |=  (1 << LED);     // зажечь светодиод
      _delay_ms (100);          // задержка на 100 мс
      PORTB &= ~(1 << LED);     // погасить светодиод
      _delay_ms (100);          // задержка на 100 мс
   }
}

AVR Studio put code 

4. Выберите в меню пункт Project -> Configuration Options. Здесь уже установлен правильно тип микроконтроллера, нужно только ввести тактовую частоту в поле Frequency. Введите в это поле 16000000 (наш микроконтроллер работает на частоте 16 МГц) и нажмите OK. 

AVR Studio Project Options

После этого попробуйте его скомпилировать проект выбором в меню Build -> Rebuild All. Проект успешно скомпилируется, в консоли выведется сообщение об успешной компиляции. 

AVR Studio compile ok 

В результате компиляции в папке проекта появится файл HelloWorld.hex (он расположен в подкаталоге default проекта). Это и есть двоичный код программы в формате Intel Hex, который нужно как-то передать загрузчику, чтобы он записал этот код в память микроконтроллера.  

Для загрузки кода используется утилита AVRDUDE - это программа, запускаемая из командной строки с нужными опциями. В системе Arduino IDE все уже настроено заранее, незаметно для пользователя, но для AVR Studio нам предстоит организовать процесс загрузки самостоятельно. 

5. Выберите пункт меню Tools -> Customize..., перейдите на закладку Tools. Нажмите вверху на кнопочку с папкой для создания нового пункта меню, введите название пункта наподобие AVRDUDE-Mega2560. В поле ввода Command: введите "C:\Program Files\Arduino1.0.6\hardware\tools\avr\bin\avrdude", в поле Arguments: введите -C"C:\Program Files\Arduino1.0.6\hardware\tools\avr\etc\avrdude.conf" -patmega2560 -cwiring -P\\.\COM155 -b115200 -D -Uflash:w:default\HelloWorld.hex, в поле Initial directory: введите просто точку (это означает текущий каталог проекта).

AVR Studio Tools Customize

После этого нажмите кнопку Close. Готово! Новый пункт меню Tools создан, он позволяет запустить программирование платы Arduino Mega 2560 кодом прошивки HelloWorld.hex, который мы получили в результате компиляции.

AVR Studio new Tools menu item

1. File -> New -> Project... -> выберите раздел C/C++ -> GCC C Executable Project. В нижней части введите в поле Name: имя проекта HelloWorld, выберите папку для размещения корневого каталога проекта Location:, снимите галочку Create directory for solutuon, кликните OK.

Atmel Studio create new project for Arduino Mega256 step1

2. Откроется окно выбора типа микроконтроллера Device Selection. Выберите микроконтроллер ATmega2560, кликните OK.

Atmel Studio create new project for Arduino Mega256 step2

3. Будет создан новый проект, и в текстовом редакторе уже будет открыт готовый шаблон функции main. Нужно в свойствах проекта установить тактовую частоту, задав макроопределение F_CPU. Для этого откройте свойства проекта (меню Project -> HelloWorld Properties...), перейдите в раздел Toolchain -> AVR/GNU C Compiler -> Symbols, добавьте в поле Defined symbold символ F_CPU=16000000, нажмите Ctrl+S (сохранение проекта).

Atmel Studio create new project for Arduino Mega256 step3

4. Перейдите в модуль кода HelloWorld.c, добавьте в тело функции main код, который настраивает ножку порта светодиода PB7, и управляет его состоянием через задержку. Получится примерно следующее:

/*
 * HelloWorld.c
 *
 * Created: 24.04.2015 17:27:31
 *  Author: microsin
 */ 
#include < avr/io.h >
#include < util/delay.h >
 
int main(void)
{
   DDRB |= (1 << PB7);
   while(1)
   {
      //TODO:: Please write your application code 
      PORTB |= (1 << PB7);
      _delay_ms(1000);
      PORTB &= ~(1 << PB7);
      _delay_ms(1000);
   }
}

Скомпилируйте код, выбрав в меню Build -> Rebuild Hello World. Проект успешно скомпилируется, в подкаталоге Debug появится скомпилированная прошивка HelloWorld.hex. 

5. Теперь осталось настроить выгрузку кода в плату Arduino. Можно сделать, настроив вызов внешнего инструментария в меню Tools -> External Tools..., точно так же, как это было сделано в случае AVR Studio.

Примечание: следует загрузить последнюю версию Atmel Studio, потому что многие предыдущие версии имели баги с передачей во внешние инструменты макропеременных проекта наподобие $(TargetName). На момент написания статьи это была Atmel Studio 6.2 sp2 (build 1563) http://www.atmel.com/images/AStudio6_2sp2_1563.exe.

В поле Title: введите имя нового пункта меню AVRDUDE-Mega2560, в поле Command: введите C:\Program Files\Arduino1.0.6\hardware\tools\avr\bin\avrdude.exe (напомню, что это полный путь до модифицированной версии avrdude из каталога установки Arduino IDE, которая поддерживает автосброс), в поле Arguments введите -C"C:\Program Files\Arduino1.0.6\hardware\tools\avr\etc\avrdude.conf" -patmega2560 -cwiring -P\\.\COM155 -b115200 -D -Uflash:w:$(TargetDir)$(TargetName).hex:a, в поле Initial directory: введите точку. Поставьте галочку Use Output window. 

Atmel Studio Tools Customize

Кликните OK.

Здесь описана процедура настройки выгрузки кода в среде CodeVisionAVR версии 3.12 Advanced. В сравнении с другими системами программирования это самый простой и удобный вариант быстрого старта после Arduino IDE.

1. Запустите CodeVisionAVR. Выберите в меню File -> New -> Project. Появится окно с запросом - нужно ли для создания проекта использовать мастера (CodeWizardAVR), ответьте утвердительно (Yes). Тип микроконтроллера выберите AT90, ATtiny, ATmega.

CVAVR create new project1 CVAVR create new project2

2. Откроется большое окно настроек CodeWizardAVR. Выберите тип микроконтроллера (Chip:) ATmega2560, тактовую частоту (Clock:) 16,000000 MHz.

CVAVR wizard1

3. В разделе Project Information укажите имя проекта HelloWorld.

CVAVR wizard2

4. В разделе Ports перейдите на закладку Port B и переключите Bit 7 в состояние Out.

CVAVR wizard3

5. Снимите галочку в меню Program -> Generate Code for Disabled Peripherals. Выберите в меню Program -> Generate, Save and Exit. Появится окно для сохранения генерируемого файла модуля. Выберите папку, куда хотите сохранить модуль (файл с расширением *.c), дайте ему имя main, кликните Сохранить. Введите имя файла проекта HelloWorld (файл с расширением *.prj), кликните Сохранить. Введите имя файла для настроек проекта HelloWorld (файл с расширением *.cwp), кликните Сохранить. В основном окне программы откроется новый проект.

CVAVR main window

6. Перейдите в редактор кода модуля main.c, после строки #include < mega2560.h > добавьте строчку #include < delay.h >. Прокрутите вниз текст модуля main.c, вставьте в тело цикла while (1) код переключения светодиода:

..
#include < mega2560.h >
#include < delay.h >
..
 
while (1)
{
    // Place your code here
    PORTB |= (1 << PORTB7);
    delay_ms(500);                          
    PORTB &= ~(1 << PORTB7);
    delay_ms(500);                          
}

7. Выберите в меню Project -> Build (Shift+F9). Откроется окно с результатами компиляции.

CVAVR compile info

Кликните OK. В папке Debug\Exe\ появится двоичный код прошивки HelloWorld.hex.

8. Выберите в меню Tools -> Upload to Arduino (Shift+F5). Выберите тип платы Arduino Mega ATmega2560, COM Port выберите тот, который соответствует виртуальному COM-порту подключенной через USB платы Arduino.

CVAVR Upload to Arduino

Кликните OK. Программа загрузится в плату и запустится.

CVAVR Upload to Arduino done

Здесь рассматривается работа с Eclipse Luna, с установленным AVR Plugin.

[Создание нового проекта]

Выберите в меню Eclipse пункт File -> New -> Project..., откроется окно визарда нового проекта. Выберите в дереве C/C++ -> C Project, кликните Next.

Eclipse AVR create new project1

В поле ввода Project name: введите имя проекта, например HelloWorld, в дереве Project type: выберите AVR Cross Target Application -> Empty Project, в списке Toolchains выберите нужный тулчейн (тулчейнов может быть несколько, но в данном примере он у нас один - AVR-GCC Toolchain). Кликните Next.

Eclipse AVR create new project2

На следующем экране настраиваются конфигурации для компиляции проекта. Уже настроены 2 конфигурации Debug (предназначена для отладки) и Release (для конечной рабочей версии программы). Кликните Next.

Eclipse AVR create new project3

Выберите тип микроконтроллера (MCU Type) и тактовую частоту (MCU Frequency), кликните Finish.

Eclipse AVR create new project4

Примечание: тип микроконтроллера следует выбрать согласно Вашему электронному устройству, которое разрабатываете. Например, Вы пишете программу для платы Arduino Mega 2560. Тогда надо выбрать ATmega2560 и тактовую частоту 16 МГц.

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

Раскройте дерево проекта в Project Explorer. Кликните правой кнопкой на имя проекта HelloWorld и выберите в контекстном меню New -> File. Откроется диалог New File. В поле File name: введите main.c и кликните Finish.

Eclipse AVR create new project5

В окне редактора кода введите следующий код:

#include < avr/io.h >
#include < util/delay.h >
 
int main (void)
{
   DDRB |= (1 << PB7);
   while(1)
   {
      PORTB |= (1 << PB7);
      _delay_ms (1000);
      PORTB &= ~(1 << PB7);
      _delay_ms (1000);
   }
}

Выберите в меню Project -> Build all (Ctrl+B). Проект скомпилируется. 

Eclipse AVR create new project6

[Настройка конфигурации программатора]

Рассмотрим, как настроить перепрошивку памяти программ микроконтроллера на примере использования UART-загрузчика Arduino Mega 2560 R3. Для поддержки функции автосброса понадобится исправленная версия AVRDUDE, которая находится в каталоге Arduino IDE (путь наподобие C:\Program Files (x86)\Arduino\hardware\tools\avr\bin) и дополненная конфигурация AVRDUDE (которая находится в файле наподобие C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf). 

1. В Eclipse зайдите в меню Windows -> Preferences -> AVRDude, поставьте галочку Use custom configuration file for AVRDude, кликните Browse... и выберите конфигурационный файл (например C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf). 

Eclipse AVR custom AVRDude config1

Примечание: если Вы хотели бы также видеть в консоли Eclipse вывод утилиты avrdude, то поставьте галочку Log internal AVRDude output to console. 

2. Paths -> AVRDude -> кнопка Edit -> Path source: Custom, Custom value: введите полный путь каталога, где находится avrdude.exe (например C:\Program Files (x86)\Arduino\hardware\tools\avr\bin) -> OK.

Eclipse AVR custom AVRDude config2

Кликните OK. 

3. Откройте свойства проекта, выберите секцию AVR -> AVRDude, создайте новую конфигурацию для программатора (Programmer configuration), для этого кликните кнопку New..., откроется окно для редактирования конфигурации программатора. Установите здесь следующие опции: 

Configuration name. Введите произвольное имя, например Arduino-MEGA2560-autoreset.

Programmer Hardware (-c). Выберите Arduino.

Override default port (-P). Введите системный путь до порта, например //./COM19 (COM19 это имя виртуального COM-порта, который появляется при подключении платы Arduino через USB, имя порта можно подсмотреть в Диспетчере Устройств).

Override default baudrate (-b). Выберите из выпадающего списка скорость 115200.

Other options. Добавьте в поле ввода строку -patmega2560 -cwiring. Здесь выбирается секция конфигурации avrdude.conf, где используется автосброс платы перед загрузкой кода.

Eclipse AVR custom AVRDude config3

Кликните OK. 

4. Перейдите на закладку Advanced, поставьте галочку Disable device signature check. 

Eclipse AVR custom AVRDude config4

Кликните OK. 

5. Для проверки, как работает выгрузка программы в плату, выберите в меню AVR -> Upload Project to Target Device (Ctrl+Alt+U). В результате в консоль будет выведен примерно следующий лог: 

Launching C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude -pm2560 -carduino -P//./COM19 -b115200 -patmega2560
 -cwiring -F -Uflash:w:HelloWorld.hex:a "-CC:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" 
Output:
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude: Device signature = 0x1e9801
avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "HelloWorld.hex"
avrdude: input file HelloWorld.hex auto detected as Intel Hex
avrdude: writing flash (326 bytes):
Writing | ################################################## | 100% 0.07s
avrdude: 326 bytes of flash written
avrdude: verifying flash memory against HelloWorld.hex:
avrdude: load data flash data from input file HelloWorld.hex:
avrdude: input file HelloWorld.hex auto detected as Intel Hex
avrdude: input file HelloWorld.hex contains 326 bytes
avrdude: reading on-chip flash data:
Reading | ################################################## | 100% 0.04s
avrdude: verifying ...
avrdude: 326 bytes of flash verified
avrdude done.  Thank you.
avrdude finished 

Кто сказал, что Visual Studio придумали для написания только компьютерных программ на C#, C++, Java и Basic? А вот и нет! Эта среда теперь настолько крута, что сгодится даже для программирования микроконтроллеров на C и ассемблемблере.

[Шаг 1. Создание Makefile-проекта

Запустите Visual Studio, зайдите в меню Файл -> Создать -> Проект..., выберите раздел Установленные шаблоны -> Visual C++ -> Проект, использующий makefile: 

AVR-Visual-Studio-create-makefile-project-1

Введите имя проекта (Имя:), выберите папку, где будет расположен каталог проекта (Расположение:), уберите галочку "Создать каталог для решения", кликните OK. 

Запустится мастер настройки проекта. 

AVR-Visual-Studio-create-makefile-project-2

Настройте в окне "Параметры конфигурации отладки" следующие опции: 

1. Командная строка построения: make 

2. Команды очистки: make clean 

3. Командная строка перестроения: make all (эта команда будет впоследствии исправлена)

4. Вывод (для отладки): имя для выходного файла прошивки. Обязательно укажите расширение файла *.hex (HelloWorld.hex, к примеру). 

5. Путь поиска включений: %AVR32_HOME%\avr\include 

Примечание: здесь %AVR32_HOME% это переменная окружения, в которой задан каталог установки WinAVR (например, C:\WinAVR-20100110) или тулчейна из Atmel Studio (например, c:\Program Files\Atmel\AVR Tools\AVR Toolchain). Вместо переменной окружения можно указать просто реальный путь до тулчейна.

AVR-Visual-Studio-create-makefile-project-3

Кликните Далее. В окне "Параметры конфигурации выпуска" поставьте галочку "Как в конфигурации отладки". Кликните Готово. 

AVR-Visual-Studio-create-makefile-project-4

[Шаг 2. Сконфигурируйте проект

Среда Visual Studio автоматически создала для Вас пустой makefile-проект. Теперь его нужно немного настроить, чтобы можно было начать писать программу для AVR. 

Сделайте правый клик на названии проекта (myAVRproj) в дереве Обозревателя решений, и выберите в контекстном меню Свойства. Откроется окно редактирования свойств проекта с активной конфигурацией Debug. 

Перейдите в раздел Свойства конфигурации -> NMake. Измените список команд для перестроения всех файлов, для чего кликните на уже введенную строку make all, справа появится черный треугольничек выпадающего списка вариантов, кликните на него, выберите Изменить..., введите список команд make clean и make all.

AVR-Visual-Studio-edit-project-options-3

Перейдите в раздел Свойства конфигурации -> Каталоги VC++, очистите поля ввода Каталоги включения, Каталоги ссылок, Каталоги библиотек, Каталоги исходного кода, Исключаемые каталоги. Кликните OK. 

[Шаг 3. Создание и добавление makefile]

В корневом каталоге проекта создайте файл с именем makefile следующего содержания:

TARGET = HelloWorld
DEVICE       = atmega2560
F_CPU        = 16000000
 
SRC          = $(wildcard *.c)
CC = avr-gccCFLAGS = -Wall -Os -gstabs -DF_CPU=$(F_CPU) -mmcu=$(DEVICE)
INCLIDEDIR = -I$(AVR32_HOME)\avr\include
 
.PHONY: clean all default
 
default: $(TARGET)
all: default
 
OBJECTS  = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS  = $(wildcard *.h)
OBJFILES = $(wildcard *.o)
 
%.o: %.c $(HEADERS)
        $(CC) $(INCLUDEDIR) $(CFLAGS) -c $< -o $@
 
.PRECIOUS: $(TARGET) $(OBJECTS)
 
$(TARGET): $(OBJECTS)
	rm -f $(TARGET).hex$(CC) -g -mmcu=$(DEVICE) -o $(TARGET).elf $(OBJFILES)
	avr-objcopy -j .text -j .data -O ihex $(TARGET).elf $(TARGET).hex
	avr-size $(TARGET).hex
 
clean:
	-rm -f *.o $(TARGET).elf $(TARGET).hex

Внимание: используйте в этом файле для пустых отступов слева табуляцию (не пробелы!), иначе утилита make.exe будет работать неправильно.

[Шаг 4. Написание модуля исходного кода]

Сделайте правый клик в дереве Обозревателя решений на папке "Файлы исходного кода", выберите Добавить -> Создать элемент... -> Visual C++ -> Файл C++ (.cpp) -> Имя: введите HelloWorld.c -> кликните Добавить. В текстовом редакторе кода откроется пустой файл HelloWorld.c, вставьте так следующий код (он точно такой же, как был в примере быстрого старта для AVR Studio):

//Подключение заголовков, в которых определены порты микроконтроллера
// и имя подпрограммы задержки:
#include < avr/io.h >
#include < util/delay.h >
 //Объявление имени LED для ножки порта, куда подключен светодиод:
#define LED PB7
 
// Основная функция, где находится главный цикл программы.
void main (void)
{
   //До начала главного цикла всегда делаются предварительные настройки.
   DDRB = (1 << LED);  // настройка порта LED как выхода
   
   //Главный бесконечный цикл программы.
   while(1)
   {
      PORTB |=  (1 << LED);     // зажечь светодиод
      _delay_ms (100);          // задержка на 100 мс
      PORTB &= ~(1 << LED);     // погасить светодиод
      _delay_ms (100);          // задержка на 100 мс
   }
}

Попробуйте скомпилировать проект через меню Построение -> Перестроить HelloWorld. Компиляция должна завершиться успешно: 

1>------ Перестроение всех файлов начато: проект: HelloWorld, Конфигурация: Debug Win32 ------
1>Сборка начата 21.04.2015 12:15:46.
1>CoreClean:
1>  rm -f *.o HelloWorld.elf HelloWorld.hex
1>Rebuild:
1>  rm -f *.o HelloWorld.elf HelloWorld.hex
1>  avr-gcc  -Wall -Os -gstabs -DF_CPU=16000000 -mmcu=atmega2560 -c HelloWorld.c -o HelloWorld.o
1>  rm -f HelloWorld.hex
1>  avr-gcc -g -mmcu=atmega2560 -o HelloWorld.elf HelloWorld.o
1>  avr-objcopy -j .text -j .data -O ihex HelloWorld.elf HelloWorld.hex
1>  avr-size HelloWorld.hex
1>     text	   data	    bss	    dec	    hex	filename
1>        0	    328	      0	    328	    148	HelloWorld.hex
1>
1>Построение успешно завершено.
1>
1>Затраченное время: 00:00:00.77
========== Перестроение всех: успешно: 1, с ошибками: 0, пропущено: 0 ==========

[Шаг 5. Настройка перепрошивки платы через загрузчик Arduino]

Зайдите в меню Сервис -> Внешние инструменты..., нажмите кнопку Добавить. В поле Название: введите название для нового пункта меню AVRDUDE-arduino-mega2560. В поле Команда: введите C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe (полный путь до исправленной версии avrdude из установленной среды Arduino IDE). В поле Аргументы: введите -C"C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" -patmega2560 -cwiring -P\\.\COM19 -b115200 -D -Uflash:w:$(TargetName).hex (обратите внимание, что здесь указан полный путь до конфигурационного файла avrdude.conf из установленной среды Arduino IDE, и указано имя COM-порта для подключения). В поле Исходный каталог: введите $(ProjectDir). Поставьте галочку Использовать окно вывода, остальные галочки уберите. Получится примерно так:

AVRDUDE Arduino Visual Studio Upload menu create

Нажмите OK. В меню Сервис появится новый пункт меню AVRDUDE-arduino-mega2560.

AVRDUDE Arduino Visual Studio Upload menu

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

avrdude.exe: AVR device initialized and ready to accept instructions
 
Reading | ################################################## | 100% 0.01s
 
avrdude.exe: Device signature = 0x1e9801
avrdude.exe: reading input file "HelloWorld.hex"
avrdude.exe: input file HelloWorld.hex auto detected as Intel Hex
avrdude.exe: writing flash (328 bytes):
 
Writing | ################################################## | 100% 0.07s
 
avrdude.exe: 328 bytes of flash written
avrdude.exe: verifying flash memory against HelloWorld.hex:
avrdude.exe: load data flash data from input file HelloWorld.hex:
avrdude.exe: input file HelloWorld.hex auto detected as Intel Hex
avrdude.exe: input file HelloWorld.hex contains 328 bytes
avrdude.exe: reading on-chip flash data:
 
Reading | ################################################## | 100% 0.05s
 
avrdude.exe: verifying ...
avrdude.exe: 328 bytes of flash verified
 
avrdude.exe: safemode: Fuses OK
 
avrdude.exe done.  Thank you.

Подключил платку к компьютеру, определилось новое устройство "USB Device" с VID 0x2341 и PID 0x0042, система Windows запросила драйвер. Где этот драйвер можно найти?

Драйвер находится в папке наподобие c:\Program Files\Arduino1.0.6\drivers\ (если Вы установили среду разработки Arduino IDE). Укажите мастеру установки драйвера этот каталог, и драйвер установится. В процессе установки драйвера может появиться предупреждение:

Arduino Mega 2560 driver install

В этом случае нажмите "Все равно продолжить", и драйвер установится. В Диспетчере Устройств можно увидеть новый виртуальный COM-порт:

Arduino Mega 2560 driver installed ok

Запомните номер COM-порта (в данном примере COM155), он понадобится в системе разработки Arduino IDE (или Fritzing) для подключения через Serial-монитор и для загрузки кода программы через USB.

Драйвер можно также скачать по ссылке [9], см. в архиве папку ArduinoMega2560\drivers\.

[Windows 7 64 бита]

Эта операционная система драйвер не потребовала, виртуальный COM-порт установился в системе автоматически.

Если Вам нужны технические подробности, то пожалуйста ознакомьтесь со ссылкой [4]. Здесь будет только краткое описание принципа работы UART-загрузчика Arduino.

Во-первых, почему собственно UART-загрузчик, ведь плата Arduino подключается через USB? Все просто - про USB микроконтроллер ничего не знает, потому что он общается с компьютером через свой аппаратный порт UART (Serial). Данные из USB в UART и обратно преобразуются с помощью специального узла, расположенного на плате Arduino - моста USB-UART. Иногда это микросхема FTDI, здесь у нас мост собран на микроконтроллере ATmega16U2 (в ревизиях 1 и 2 плат Arduino Mega это может быть ATmega8U2).

Во-вторых, было бы хорошо разобраться, на чем основана работа загрузчика. Получается, что микроконтроллер может перезаписывать собственную программную память? Да, это именно так. Память программ микроконтроллера (FLASH) поделена на 2 секции - код программы пользователя, который начинается с адреса 0, и код загрузчика, который размещается в старших адресах памяти. В нашем случае загрузчик находится в байтовых адресах 0x3E000..0x3FFFF, программа пользователя может занимать область памяти 0x00000..0x3DFFF. На картинке ниже показана карта памяти микроконтроллера ATmega328, который тоже применяется в платах Arduino. Тот же самый принцип размещения загрузчика и у микроконтроллера ATmega2560, отличие только в начальном адресе загрузчика и в значении фьюзов.

Примечание: отличие также может быть и в использовании протокола обмена. В старых платах Arduino использовалась устаревшая версия протокола STK500. В Arduino Mega 2560 используется обновленный протокол STK500 [6].

Arduino ATmega328 Bootloader Memory Map

Микроконтроллер ATmega2560 настроен фьюзами так, что после сброса он принудительно начнет выполнять код загрузчика, т. е. произойдет безусловное выполнение кода с адреса 0x3E000. Далее загрузчик некоторое время ждет (это время называют таймаутом загрузчика, обычно обычно оно около 1 секунды, но это время может быть и больше, в зависимости от версии загрузчика) поступления данных программы пользователя, т. е. прошивки, которую загрузчик должен записать начиная с адреса 0x00000. Если такие данные поступят, то и начнется процедура самопрограммирования, т. е. компьютер передает по определенному протоколу через USB программу, мост её преобразовывает в данные UART, код загрузчика эти данные обрабатывает, выделяет оттуда байты кода и записывает их в память FLASH микроконтроллера. По окончании процесса записи загрузчик завершает свою работу и передает управление коду пользователя, т. е. по адресу 0. Если же после сброса в течение таймаута загрузчика код через UART не поступил, то загрузчик просто передает управление по адресу 0.

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

Примечание: в Интернет-магазинах можно купить дешевые китайские платы Arduino. Часто бывает так, что китайцы для удешевления производства "забывают" прошить загрузчик и сконфигурировать фьюзы. Если Вы купили плату Arduino, и загрузка кода не работает, то Вы либо не установили драйвер и неправильно сконфигурировали среду разработки Arduino, либо в память микроконтроллера просто не прошит загрузчик (подробнее обсуждение проблем с загрузчиком см. [4]). Загрузчик можно восстановить / прошить (а также сконфигурировать фьюзы) с помощью любого ISP-программатора AVR. Программатор подключается через к плате Arduino коннектор ICSP.

Чтобы запустить загрузчик и начать записывать код скетча в память микроконтроллера, нужно нажать на кнопку сброса RESET и в среде Arduino IDE кликнуть на кнопку Upload. Если разрешена работа функции автосброса, то кнопку RESET нажимать не надо, сброс произойдет автоматически с помощью перепада 1 -> 0 сигнала DTR (за автосброс отвечают элементы схемы микроконтроллер IC4, резистор RN3D, конденсатор C7, перемычка RESET-EN).

Как происходит передача кода загрузчику? За это отвечает утилита AVRDIDE, среда Arduino IDE просто запускает её с нужными опциями (утилита AVRDUDE входит в пакет установки системы программирования Arduino). Вот пример командной строки операционной системы Linux, которую нужно выполнить для перепрошивки памяти микроконтроллера платы Arduino Mega 2560 файлом программы image.hex:

avrdude -p m2560 -c stk500v2 -P /path/to/serial -b 115200 -F -U flash:w:/path/to/image.hex

Здесь опция -p задает тип микроконтроллера, -c протокол обмена, -P задает имя для последовательного порта (в среде Windows вместо /path/to/serial нужно указать имя виртуального COM-порта, например COM7), -b скорость передачи данных, -F отключает проверку сигнатуры, -U задает тип программирования и путь до файла (его полное имя, т. е. месторасположения на диске), который будет передаваться загрузчику.

Для Windows командная строка может выглядеть примерно так:

avrdude -p m2560 -c stk500v2 -P COM155 -b 115200 -F -U flash:w:c:\temp\HelloWorld.hex

Таким образом, Вы можете пользоваться загрузчиком в любой среде программирования - IAR, AVR Studio, Keil, BASCOM IDE, CodeVision AVR, Eclipse (и даже Visual Studio [8]!) и не ограничены программированием в среде разработки Arduino IDE.

[Как заставить работать функцию автосброса]

Все хорошо, командная строка avrdude, которую я привел в предыдущих примерах, работает, но... Приходится перед загрузкой каждый раз нажимать кнопку RESET! Согласитесь, это довольно неудобно. Хочется, чтобы плата сбрасывалась автоматически всякий раз, когда нужно сделать загрузку - именно так, как это организовано в среде Arduino IDE.

Для того, чтобы автосброс работал, придется воспользоваться исправленной версией AVRDIDE, которая находится в каталоге установки Arduino IDE, и готовым конфигурационным файлом avrdude.conf. Для автосброса введите такую командную строку:

"C:\Program Files\Arduino1.0.6\hardware\tools\avr\bin\avrdude" 
-C"C:\Program Files\Arduino1.0.6\hardware\tools\avr\etc\avrdude.conf" 
-patmega2560 -cwiring -P\\.\COM155 -b115200 -D -Uflash:w:HelloWorld.hex

Примечание: не спрашивайте меня, что в командной строке означают все эти опции. Я их не сам придумал, а подсмотрел в логе вывода загрузки Arduino IDE (подробный лог загрузки включается через меню Файл -> Настройки -> поставьте галочку "Показывать подробный вывод при: загрузке").

После этого автосброс заработает без нареканий, больше не нужно нажимать перед запуском загрузки кнопку RESET.

Все это можно скачать из репозитория Arduino [7], либо в архиве [9]. См. папку firmwares\bootloader-mega2560\stk500v2\ архива - там находится исходный код загрузчика. Готовая скомпилированная прошивка находится в файле Mega2560-prod-firmware-2011-06-29.hex.

Все это можно скачать из репозитория Arduino [7], либо в архиве [9]. См. папку firmwares\atmegaxxu2\ архива - там находятся исходный код DFU загрузчика (каталог arduino-usbdfu) и исходный код моста USB-UART (каталог arduino-usbserial). Готовая скомпилированная прошивка, в которой объединены сразу и DFU-загрузчик, и код моста USB-UART, находится в файле Arduino-COMBINED-dfu-usbserial-atmega16u2-Mega2560-Rev3.hex.

Драйвер установлен, при загрузке светодиоды RX и RX мигают как положено, но скетч не грузится, в консоли видим следующие сообщения:

Размер скетча в двоичном коде: 1 628 байт (из 258 048 байт максимум)
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_ReceiveMessage(): timeout
avrdude: stk500v2_getsync(): timeout communicating with programmer

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

Что делать, если нужно выводить в порт Serial сообщения на русском языке, но программа Serial Monitor системы программирования Arduino IDE выдает вместо русских букв нечитаемые символы?

russian-output-Serial-Monitor

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

russian-output-putty

Проблема в недоработке среды Arduino IDE - программа Serial Monitor не умеет отображать текст в кодировке UTF-8. К сожалению, пока разработчики этот баг не исправят, пользоваться Serial Monitor для отображения русскоязычных сообщений нельзя, придется довольствоваться только английским шрифтом. Или используйте putty! При настройке сессии putty не забудьте правильно выставить настройки последовательного порта (9600, 8 бит данных, 1 стоп-бит, без бита четности, т. е. те же параметры, что используются в скетче), и не забудьте выставить кодировку окна UTF-8.

Еще один недостаток в том, что редактор кода Arduino и Serial Monitor влияют на работу друг друга и не лучшим образом - когда основное окно Arduino подвисает (например, при попытке открыть меню Сервис), то работа программы Serial Monitor подвисает тоже.

Примеры настройки сессии программирования использованием загрузчика для AVR Studio, Visual DSP, Eclipse см. в соответствующих врезках. Однако иногда при первом запуске бывают различные проблемы - неправильно заданы опции для AVRDUDE, не отвечает загрузчик и т. п. Поэтому есть 2 основных инструмента для получения подсказки по правильным опциям командной строки:

1. Подсмотрите командную строку для запуска загрузчика в Adruino IDE. Это безотказный способ решения проблемы, когда Вы не знаете, как настроить загрузчик. Запустите Adruino IDE, выберите порт подключения для платы (меню Сервис -> Последовательный порт), выберите плату (меню Сервис -> Плата), загрузите любой скетч примера кода (меню Файл -> Примеры -> Basics -> Blink или другой простейший), включите подробный вывод сообщений при программировании через загрузчик (меню Файл -> Настройки -> поставьте галочку Показывать подробный вывод при: загрузке). После этого запустите программирование платы (Меню файл -> Загрузить). В нижней части окна Arduino IDE будут выведены командная строка и сообщения загрузчика. Пример для платы Arduino Nano v3.0:

C:\Program Files (x86)\Arduino\hardware/tools/avr/bin/avrdude -CC:\Program Files (x86)\Arduino\
hardware/tools/avr/etc/avrdude.conf -v -v -v -v -patmega328p -carduino -P\\.\COM26 -b57600 -D 
-Uflash:w:C:\Users\Andrei\AppData\Local\Temp\build7080307910662311707.tmp\AD7691-tester.cpp.hex:i 

avrdude: Version 5.11, compiled on Sep 2 2011 at 19:38:36 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Joerg Wunsch System wide configuration file is "C:\Program Files (x86)\Arduino\hardware/tools/avr/etc/avrdude.conf" Using Port : \\.\COM26 Using Programmer : arduino Overriding Baud Rate : 57600 avrdude: Send: 0 [30] [20] avrdude: Send: 0 [30] [20] ... avrdude done. Thank you.

Из этого лога можно сразу понять, как настроить командную строку для AVRDUDE.

2. Проверьте правильность командной строки AVRDUDE с помощью BAT-файла. Составьте простейший командный файл, который позволит просмотреть сообщения, выводимые AVRDUDE. Это поможет найти ошибку в командной строке. Пример:

"C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe" -C"C:\Program Files 
(x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" -patmega328p -carduino -P\\.\COM26 
-b57600 -D -Uflash:w:default\AD7691-tester.hex

pause

Команда pause в конце BAT-файла нужна для его остановки, чтобы можно было просмотреть сообщения AVRDUDE. Если нужно посмотреть подробный вывод диагностических сообщений, добавьте в командную строку одну или несколько опций -v (можно добавить до 4 опций -v; чем больше их добавлено, тем подробнее будут сообщения от AVRDUDE).

[Ссылки]

1. Arduino Mega 2560 site:arduino.cc.
2. ATmega2560 site:atmel.com.
3. AVR4023: протокол FLIP USB DFU.
4. Arduino: что там внутри? (FAQ).
5. Интерфейс SPI.
6AVR068: протокол обмена STK500 ver. 2.0.
7. Arduino open-source site:github.com.
8. Использование MS Visual Studio IDE для программирования AVR/Arduino.
9150419ArduinoMega2560.zip - документация, прошивки и исходные коды для загрузчика ATmega2560 и ATmega16U2, драйвер USB.
10. Почему я не люблю Arduino.
11. Arduino development with Eclipse – A step by step tutorial to the basic setup site:horrorcoding.altervista.org.

 

Комментарии  

 
+4 #1 Роман 22.07.2015 14:57
Отличная статья. Заработало все и сразу. И в Arduino IDE и в CodeVisionAVR. Автору большое спасибо. 8)
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page