Микроконтроллеры - это же просто!

Программирование микроконтроллеров

Микроконтроллеры - это же просто!

alex83 » 06 май 2020, 22:15

Да, микроконтроллеры - это просто. Это было просто уже тогда, более 10 лет назад, когда в конце 90-х - начале 00-х я начал интересоваться и заниматься этим делом. Сначала были 51-е, работающие в паре с ПЗУ, потом Атмеловские 51-совместимые "флешки", а первой литературой была подшивка сканов журнала "Радио" с серией статей про 51-е семейство.
Высокоуровневые среды разработки и компиляторы тогда ещё только начинали появляться, поэтому программы писались исключительно на ассемблере в досовских редакторах типа ASEM-51 и прошивались через программаторы, которые не спаяешь на коленке. А какие это были программы, а как они работали, ведь каждый байт был на счету! Длинные портянки кода для отладки распечатывались на древнем матричном принтере, в который был заправлен рулон телеграфной бумаги, потом все это расстилалось на столе и с помощью ручки или карандаша осуществлялась "отладка". А ведь перед написанием кода для каждого устройства нужно было ещё и разработать схему и изготовить отладочную плату.
И вот спустя 10 лет, как я скомпилировал последний код для 51-го, меня снова торкнуло :mrgreen: и захотелось вернуться к, казалось бы, уже забытому увлечению. Возвращение к такой теме после 10 лет высокоуровневого программирования можно сравнить с отходняком от наркоза или тяжелого бодуна, но, как оказалось, за это время мир шагнул далеко вперед, поэтому всё не так уж и сложно.
Что же мы имеем на сегодняшний день?
А то, что появились мощные и даже бесплатные(кто бы мог подумать :) ) среды программирования, в которых можно писать на языке "Си", и в которых есть отличные отладчики и компиляторы. Дошло до того, что теперь даже ненужно собирать отладочные платы. Достаточно набросать схему с контроллером в программе-эмуляторе, загрузить в неё скомпилированный код и наблюдать работу устройства на экране компьютера, или купить недорогой готовый отладочный модуль с необходимой периферией. Прошивать контроллер можно через USB посредством простых, дешевых или даже самодельных программаторов.
А какие появились контроллеры! Вопрос с памятью стоит уже не так остро, а в стандартных корпусах может быть по несколько ЦАП-АЦП и прочих ништяков, причем всё это на фоне мизерного потребления и низких минимальных порогов питающего напряжения!
Хватит старперских рассуждений, к чему это я всё?
А к тому, что если уже тогда 10-15 лет это было просто, то теперь это как двапальцаобасфальт. :yess:


Ну что же, приступим к освоению новых технологий и наверстаем пропущенное. Сделаем это в пять этапов.

Оглавление:

l0Этап 0. Выбор микроконтроллера
Для начала нужно определиться с чем, как и где будем работать.
Первое, что нужно сделать - это выбрать архитектуру и семейство микроконтроллеров, а также определиться с языком программирования, исходя из чего далее можно будет подобрать соответствующее ПО или среду разработки.
Всевозможных микроконтроллеров превеликое множество, поэтому к выбору нужно подойти основательно, исходя из того, каких целей нужно достичь и какие задачи решить. Также не маловажным моментом будут и возможные перспективы познания того или иного "кристалла".
Если определенного ТЗ не ставится, то не стоит выбирать устаревшие МК и тем более снятые с производства. В этом случае лучше выбирать актуальное, современное и популярное, т.к. чем популярнее микроконтроллер, тем проще его изучать. Если достаточно хорошо изучить какой-то один контроллер, то и с другими потом проблем не возникнет, будут щелкаться как орехи :mrgreen:
Под архитектурой микроконтроллера подразумевается не гарвардская архитектура как таковая, общая для большинства микроконтроллеров, а "фирменная", т.е. отличия и особенности ядра и системы команд микроконтроллера, производимого той или иной фирмой.
Самыми популярными и распространенными контроллерами являются 8051(производят все, кому не лень), PIC(Microchip) и AVR(Atmel).
Первые уже устарели, хотя очень распространены в разной аппаратуре, т.к. дешевы, а вот остальные два уже более интересны и актуальны.
Как наиболее интересные, развитЫе и подходящие под мои задачи я выбрал AVR-микроконтроллеры фирмы ATMEL, а именно их семейство ATmega.
phpBB [media]

Устройство микроконтроллера AVR ATmega16


l1Этап 1. Выбор языка программирования
Писать программы для микроконтроллеров можно на разных языках, т.к. суть не в языке, а в компиляторе, который транслирует листинг программы в машинные коды. Самыми распространенными являются языки ассемблер и С(Си).
Ассемблер - это самый старый, самый низкоуровневый и основополагающий язык, ниже него только машинные коды. Многие говорят, что он сложен в изучении и труден в применении, но на самом деле это не так. В своё время я изучил его буквально за пару недель, после чего очень долго писал на нем и не испытывал какого либо дискомфорта. Дело в том, что применение этого языка требует более глубокого знания архитектуры контроллера и процессов, происходящих в нем, т.е. более вдумчивого и грамотного применения и, как следствие, в результате компиляции получается более компактный и быстрый машинный код. Можно сказать, что ассемблер - это очень мощный инструмент в руках профессионала.
Языки высокого уровня - Дельфи, С, С++(объектно-ориентированный С) и прочие позволяют работать с контроллером уже почти как с черным ящиком и не вдаваться во многие подробности.
Ко всему прочему в последнее время стали появляться библиотеки для языка С++, которые позволяют упростить доступ к находящейся на борту контроллера периферии и поднять "уровень" программирования ещё выше. Например, с помощью библиотеки Arduino вот так можно начать работу с последовательным портом на скорости 9600 бит в секунду, сделав вызов одной строчкой:
Код: Выделить всё
Serial.begin(9600);

А при использовании «голого» C/C++ пришлось бы почитать документацию на микроконтроллер, и вызывать нечто подобное:
Код: Выделить всё
UBRR0H = ((F_CPU / 16 + 9600 / 2) / 9600 - 1) >> 8;
UBRR0L = ((F_CPU / 16 + 9600 / 2) / 9600 - 1);
sbi(UCSR0B, RXEN0);
sbi(UCSR0B, TXEN0);
sbi(UCSR0B, RXCIE0);

Для начинающего познавать микроконтроллеры и уже знакомого с высокоуровневым программированием(неважно на чем, хоть на PHP) самым оптимальным вариантом будет выбор золотой середины - языка "С", т.к. Arduino не даст необходимого на начальном этапе, понимания работы микроконтроллера и работы с микроконтроллером.
Ассемблер же наиболее актуален только в условиях повышенных требований к размеру программного кода и скорости выполнения. Программы для промышленного применения и аэрокосмической отрасли мы пока писать не будем, однако, нужно сказать, что по настоящему понять как работает и чем "дышит" микроконтроллер, можно только освоив ассемблер, хотя бы на самом базовом уровне, и написать на нем хоть пару несложных программ. Много времени это не займет, а вот понимание станет гораздо глубже.
Выбор Ассемблера также может быть актуален и для новичка в программировании как таковом, т.к. никакого опыта всё равно ещё нет, поэтому с какого языка начинать обучение особого значения не имеет.
Помимо языка программирования ещё нужно будет познакомиться с двоичной и шестнадцатеричной системами счисления.

Системы счисления
phpBB [media]


Системы счисления. Преобразования.
phpBB [media]


Для тренировки работы с числами в разных системах счисления отлично подойдет стандартный Windows-калькулятор, переключенный в режим "Программист", в нем есть всё, что нужно:



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

Быстрые переходы:
lesson0Урок 1
В этом уроке:
  • Обзор среды разработки устройств Proteus
  • Обзор сред разработки программного кода
  • Выбор языка программирования
phpBB [media]

С автором курса сложно не согласиться. Конечно же в качестве среды разработки нужно выбрать самую свежую, мощную, развивающуюся, да к тому же ещё нативную и бесплатную Atmel Studio 6.

Atmel Studio 6 можно скачать с официального сайта по ссылке:
http://www.atmel.com/images/AStudio6_2sp1_1502.exe
Программа полнофункциональна и бесплатна.
Но я рекомендую пройти сюда:
https://secure.atmel.com/forms/secure/u ... ation.aspx
и создать нормальный аккаунт, чтобы без проблем скачивать бесплатные обновления и дополнения.
Скачать последнюю версию можно здесь:
http://www.atmel.com/tools/atmelstudio.aspx
Для знающих английский, документация по программе здесь:
http://www.atmel.com/webdoc/atmelstudio/

Proteus можно качнуть здесь:
http://www.labcenter.com/download/prode ... ofessional
Демо-версии вполне достаточно для тренировки и обучения.
Но если хочется полноценную версию для ознакомления на подольше, а платить врагам-англичанам ну ниахота :mrgreen: , то можно попробовать качнуть её тут, но лекарство взять не из раздачи, а по ссылкам из этого поста.
Помните, всякого рода кряки и ломанные программы могут нести в себе вирусы и прочие зловредные программы. Я предупредил :dont: :mrgreen: .

Что касается Proteus, то эта среда разработки интересна больше тем, что имеет в своем составе хороший эмулятор микроконтроллеров и других активных и пассивных элементов. В ней, например, можно подключить к микроконтроллеру ЖК дисплей(его программную модель), который будет выглядеть как настоящий, и выводить на него информацию, или заставить мигать разноцветные светодиоды. Однако, есть в этом ПО и минусы в плане его применения для разработки устройства от А до Я. Не знаю, насколько хорош там трассировщик плат, но рисовалка схем мне показалась совсем унылой и вызвала много матерных слов. Гораздо более пригодным ПО для разработки проекта будет OrCAD, в котором рисовать схемы гораздо более приятно, а Proteus лучше использовать для эмуляции контроллера и отладки программного кода без необходимости изготовления схемы в "железе".


lesson1Урок 2
В этом уроке:
  • Что такое порт микроконтроллера
    • Регистры порта
    • Система счисления
    • Настройка Atmel Studio 6 для удобной работы
    • Работа с портом и его регистрами, отладка
phpBB [media]


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


lesson2Урок 3
В этом уроке:
  • Практическая работа к уроку 2. Эмуляция работы микроконтроллера в Proteus
    • Рисуем схему
    • Пишем программу мигания светодиодом
    • Компилируем код и эмулируем его работу в Proteus
phpBB [media]



lesson3Урок 4
В этом уроке:
  • Регистровый сдвиг
  • Логические операторы
  • Регистр PIN порта и опрос кнопки
phpBB [media]



lesson4Урок 5
В этом уроке:
  • Практическая работа к уроку 3. Отладка и эмуляция бегущей строки в Proteus
    • Цикл FOR
    • Отладка ошибок
phpBB [media]



lesson5Урок 6
В этом уроке:
  • Создание нового проекта в Atmel Studio 6
  • Подключение библиотек и работа с ними
  • Контроль используемых ресурсов
  • Подключение LCD-дисплея и работа с ним
phpBB [media]
LCD_5110.zip
(83.68 Кб) Скачиваний: 229
mc274_Pamyatka.pdf
(28.7 Кб) Скачиваний: 246


lesson5pПрактическая работа к уроку 6:
  • Работа с библиотекой LCD-дисплея
  • Работа с типами данных и строками в языке "Си"
  • Вывод информации и графики на дисплей
phpBB [media]



lesson6Урок 7
В этом уроке:
  • АЦП (ADC) - аналого-цифровой преобразователь (Analog-to-digital converter), теория, принцип работы
  • Конфигурирование порта и регистров МК для работы с АЦП
  • Считывание результатов работы АЦП и вывод на дисплей
phpBB [media]



lesson6pПрактическая работа к уроку 7:
  • Пишем программу вольтметра
  • Оператор языка "Си" switch
  • Вывод значения в вольтах на дисплей
  • Делитель напряжения и калибровка вольтметра
  • Эмуляция работы АЦП в Proteus
phpBB [media]


lesson7Урок 8
В этом уроке:
  • Вольтметр, амперметр и термометр
  • Операционный усилитель и измерение тока
  • Датчик температуры
  • Написание кода для устройства и отладка
phpBB [media]


Также для ознакомления рекомендуется этот курс по работе в Proteus:
Работа в Proteus



l3Этап 3. Изучаем архитектуру МК и язык программирования
Компилировать простые программки по видеоурокам и играться с виртуальным контроллером конечно весело, однако крутым программистом таким образом стать не получится, поэтому следующим важным этапом должно стать более глубокое изучение как архитектуры выбранного микроконтроллера, так и языка программирования, для чего придется подобрать соответствующую литературу.
Литературы море, поэтому искать долго не придется, главное, чтобы она была с подходящим для начинающих и качественно изложенным материалом, т.к. очень много авторов тупо переводят оригинальную тех. документацию чтобы в лёгкую срубить бабла.
Идем сюда и вбиваем в дырку поиска запросы вроде "микроконтроллеры", "avr" и ищем в результатах литературу, после чего переходим на раздачу и изучаем комментарии к той или иной книжке, среди которых иной раз встречаются полезные рекомендации и отзывы.
Скачивать электронные "издания" книжек нужно только для ознакомления, а после ознакомления их нужно обязательно удалить и купить бумажную версию понравившейся книжки. Только при таком подходе вы будете чисты перед своей совестью и законом :dont: :hitrost: .

Подбираем литературу соответствующую выбранному МК и языку, и читать, читать! Пытаться понять и разобраться, иначе толку не будет.
Могу порекомендовать серию книг "Микроконтроллеры? это же просто!" автора А.В.Фрунзе, тома 1,2 и 3. Книги эти посвящены ассемблеру и 51-м микроконтроллерам, но подача материала для начинающих в них просто замечательная. Так или иначе, для изучения основополагающих моментов архитектура микроконтроллера и язык не имеет особого значения.


Познакомиться поближе с архитектурой микроконтроллера AVR и Ассемблером можно, например, в этой книжке.
Познакомится с некоторыми основами программирования и отладки на языке "С" в Atmel Studio 6 можно в замечательном видеокурсе, который как и предыдущий был найден на ютубе. Также для знакомства с программированием AVR на С могу порекомендовать прочесть в обратном порядке 10 страниц этого блога.

Ко всему прочему, на ютубе есть несколько интересных плейлистов с лекциями по C и C++:
Уроки программирования на языке Си
https://www.youtube.com/playlist?list=P ... _9RcZgIM9U
http://www.youtube.com/playlist?list=PL ... oC7J6fqiY1
https://www.youtube.com/watch?v=yg9nXNf ... B58gFJA9S9
https://www.youtube.com/watch?v=-5hjglY ... rs-suZzRk5
https://www.youtube.com/watch?v=tvdccSz ... IklFm6fR7Y
Основы C++
https://www.youtube.com/watch?v=h0d9Lsc ... G0ghilVrYA
https://www.youtube.com/watch?v=bVoUuhc ... Km01V_ZV6h
ООП в C++
http://www.youtube.com/playlist?list=PLCCF143E98B27F01C
Лекции эти хоть и заточены под ПК, но основы программирования на C и C++ там раскрыты достаточно хорошо. Отличное дополнение к литературе.
Чтобы не дрючить лишний раз микроконтроллер, начинать освоение языка Си я рекомендую в одной из этих программ:
viewtopic.php?f=66&t=469
http://www.codeblocks.org/



l4Этап 4. Щупаем живой микроконтроллер
Ну вот, подковавшись в теории, программировании и вдоволь насимулировавшись в Протеусе, можно, наконец, пощупать "железный" микроконтроллер.
Я сознательно пока опущу моменты связанные с подключением контроллера, схемотехникой, пайкой, изготовлением отладочной платы и программатора, потому как далеко не все, кто "пришел" к микроконтроллерам хорошо в этом разбираются, поэтому попытки научить "пОять" могут привести к приконченным контроллерам и попорченным нервам. :worker: :turnred:
Конечно, чтобы построить законченное качественно работающее изделие без хороших познаний в электронике не обойтись, но на данном этапе мы учимся в первую очередь программировать микроконтроллеры AVR и упор делаем именно на программирование, поэтому всё остальное пока опустим, тем более, что в наши дни даже и паять практически ничего не нужно. :beach:

l4-1Отладочный модуль Freeduino 2009
Итак, для работы с живым контроллером применим готовый отладочный модуль Freeduino 2009 с контроллером ATmega328.

Основные технические характеристики (в скобках указаны для ATmega168):
Код: Выделить всё
Питание: 7...12В или 5В от USB
Максимальный ток портов: 20мА
Максимальное напряжение на портах: -0,5...+5.5В
Предохранитель USB: 500мА
Микроконтроллер: ATmega328(ATmega168)
Цифровые порты ввода/вывода: 14, в т.ч. 6 с ШИМ
Аналоговые порты ввода: 6
ППЗУ(Flash): 32Кб (16Кб), из них 2Кб заняты загрузчиком
ОЗУ(SRAM): 2Кб (1Кб)
ПЗУ(EEPROM): 1Кб (512 байт)
Тактовая частота: 16МГц
Размеры: 75х33мм
Температурный диапазон: -20...+50С



Что же такое Freeduino? Freeduino - это не имеющий аналогов в мире :mrgreen: российский аналог, готовых отладочных модулей Arduino. Всё тоже самое, работает с той же самой средой Arduino IDE, только делается и продается в России, клоны в общем.
Что такое Arduino?
Если попросту, то Arduino - это среда разработки, которая позволяет писать и компилировать программы на очень простом выдуманном языке программирования под названием Processing/Wiring и упрощающает начало работы с микроконтроллерами ценой размера и быстродействия программ. Такая программа может быть загружена только в готовый отладочный модуль, в котором установлен контроллер с особой программой-загрузчиком(бутлоадером). На самом же деле Processing/Wiring это не язык, а просто набор макросов и библиотек. Перед компиляцией он просматривает свои заголовочные файлы и преобразует свой код в код на языке С, а за тем уже компилирует его стандартным компилятором AVR GCC.
Freeduino_описание языка.pdf
Описание Processing/Wiring
(175.27 Кб) Скачиваний: 262

Выше упоминалось, что библиотека Arduino не желательна для изучения микроконтроллеров, т.к. предполагает работу с контроллером, как с черным ящиком. Так почему же все таки Arduino(Freeduino)?
А дело всё в том, что отладочный модуль Freeduino 2009, являющийся аналогом Arduino Duemilanove, универсален и обладает весьма интересными преимуществами:
  • очень дешев
  • поддерживает довольно мощный микроконтроллер ATmega328(ATmega168), установленный в панельке, и все порты которого выведены на внешние разъемы
  • имеет USB-интерфейс для прошивки контроллера на замечательной микросхеме FT232RL, которая с одной стороны реализует интерфейс виртуального COM-порта, а с другой интерфейс UART для сопряжения с микроконтроллером
  • может быть запитан, как от внешнего питания (7 - 12В), так и непосредственно от USB, причем источник питания коммутируется(выбирается) автоматически и приоритет имеет внешний источник
  • установив специальный Arduino аддон для Atmel Studio 6, можно прошивать модуль непосредственно из Atmel Studio и писать программы как на Processing/Wiring, так и на голом С или ассемблере
  • при применении специального ПО может быть превращен в универсальный USB-программатор, т.е. программирование можно осуществлять не только из среды Arduino IDE, но и залить любой HEX-файл
  • имеет разъем интерфейса микросхемы FT232RL и разъем интерфейса ICSP для подключения внешнего программатора, позволяющие с помощью специального ПО прошивать другой контроллер (без загрузчика Arduino) напрямую по USB
  • благодаря всё той же FT232RL, подключенной к портам UART контроллера, можно разрабатывать приложения, которые смогут взаимодействовать с ПК по USB
Таким образом, цель приобретения данного модуля - заиметь в своей лаборатории не только отладочный модуль, но и простенький универсальный USB-программатор на его основе. Никаких лишних затрат и заморочек, то, что нужно на данном этапе, ну и тем, кто всё же захочет поиграться с Arduino, этот модуль будет весьма кстати. :good:


l4-2Установка драйвера FT232RL и подключение модуля
Для сопряжения модуля с ПК нужно установить драйвер микросхемы USB-конвертера FT232RL.
Идем сюда, скачиваем и устанавливаем свежий USB-драйвер для вашей системы.
После установки драйвера подключите устройство к ПК. При подключении модуля должен загореться зеленый светодиод "PWR", говорящий о том, что питание подано. Также в моем случае через каждую секунду замигал красный тестовый светодиод "L", подключенный к 13 выходу модуля(не путать с выводом контроллера), говорящий о том, что контроллер работает и в него уже записана простейшая программа - мигалка светодиодом.
Опять же в моем случае ОС Windows 7 x64 обнаружила устройство и начала установку ПО драйвера для него. Это заняло некоторое время, но когда процесс завершился успешно, начал мигать желтый светодиод "TX", свидетельствуя об установке связи.
Подробнее об установке драйвера, настройке среды Arduino IDE и проверке работоспособности модуля можно почитать в этом руководстве:
http://freeduino.ru/arduino/quickstart.html

l4-3Проверка работоспособности
  1. Для проверки работоспособности скачиваем свежую Arduino IDE:
    http://www.arduino.cc/en/Main/Software
    Лучше выбрать вариант без инсталляции - простой zip-архив, и распаковать его в корне диска "C".
  2. Далее идем в "Диспетчер устройств" и смотрим номер виртуального COM-порта, на котором будет работать устройство.
  3. Запускаем Arduino IDE и осуществляем настройку программы (устанавливаем порт, выбираем тип модуля и контроллер в меню Tools(Инструменты)).
  4. Пробуем залить простейшую программку-мигалку. Если в поставке модуля она уже записана по дефолту(светодиод "L" мигает), то можно изменить длительность задержки на 2000ms вместо 1000, чтобы заметить отличие. В ходе загрузки программы в контроллер светодиоды TX и RX должны быстро замигать, свидетельствуя об обмене данными, а по окончании загрузки контроллер будет подвергнут сбросу и светодиод замигает вдвое медленнее, что будет говорить о том, что программа успешно загрузилась и модуль полностью работоспособен.
    Код: Выделить всё
    void setup()                    //функция начальных установок – вызывается
    //при включении микроконтроллера
    {                               //фигурная скобка открывает тело функции
       pinMode(13, OUTPUT);          //устанавливаем 13 контакт в режим вывода
    }                               //конец функции начальных установок

    void loop()                     //основная функция – вызывается по кругу
    //в процессе работы микроконтроллера
    {
       digitalWrite(13, HIGH);       //включение светодиода на 13 выходе
       delay(1000);                  //задержка 1000 миллисекунд (1 сек)
       digitalWrite(13, LOW);        //выключение светодиода на 13 выходе
       delay(1000);                  //задержка 1000 миллисекунд (1 сек)
    }                               //конец функции. По завершении она снова
    //будет вызвана
На этом непосредственное применение среды Arduino IDE закончим и продолжим работу в Atmel Studio 6, однако удалять её пока ненужно.
Как уже было сказано выше, помимо прошивки через Arduino IDE существует по меньшей мере ещё три способа прошивки контроллера в модуле Freeduino 2009. Рассмотрим их более подробно.


l4-4Способ 1. Прошивка контроллера из Atmel Studio 6

Как осуществлять прошивку из Atmel Studio 7 описано здесь.

Благодаря тому, что Atmel добавила поддержку загрузчика Arduino, писать программы и прошивать отладочный модуль можно непосредственно из Atmel Studio 6, причем писать можно как на Processing/Wiring, так и на С со вставками ассемблера.

  1. Для использования этой возможности нужно установить расширение(addon) Arduino для Atmel Studio.
    Запускаем Atmel Studio 6 и идем в меню Tools -> Extension Manager. В открывшемся окне нужно выбрать "Arduino IDE for Atmel Studio" и нажать [Download], после чего будет предложено ввести логин/пароль от аккаунта на atmel.com, который выше рекомендовалось заблаговременно завести. Чтобы не вводить данные каждый раз, можно установить две галочки [Remeber me], одна вверху, а другая под формой ввода. После этого через дефолтный интернет-браузер начнется загрузка файла расширения ArduinoForAtmelStudio.msi. После загрузки файла нужно закрыть Atmel Studio и установить расширение.

  2. Подключаем модуль к ПК и запускаем Atmel Studio.
  3. После перезапуска появится окно первоначальной настройки расширения. В этом окне необходимо указать директорию в которой установлена среда Arduino IDE(распакован архив).

  4. В интерфейсе Atmel Studio появится новая панель инструментов, в которой нужно выбрать соответствующий модуль и COM-порт, к которому он подключен. Остальные настройки расширения доступны в меню Tools -> Visual Micro.

  5. Далее запускаем менеджер проектов и выбираем сценарий Arduino Sketch:

  6. Открываем файл проекта с расширением .ino. В нем уже будет стандартный формат Arduino-скетча, который нужно удалить, а вместо него вставить уже знакомый код на Processing/Wiring:
    Код: Выделить всё
    void setup()                    //функция начальных установок – вызывается
    //при включении микроконтроллера
    {                               //фигурная скобка открывает тело функции
       pinMode(13, OUTPUT);          //устанавливаем 13 контакт в режим вывода
    }                               //конец функции начальных установок

    void loop()                     //основная функция – вызывается по кругу
    //в процессе работы микроконтроллера
    {
       digitalWrite(13, HIGH);       //включение светодиода на 13 выходе
       delay(1000);                  //задержка 1000 миллисекунд (1 сек)
       digitalWrite(13, LOW);        //выключение светодиода на 13 выходе
       delay(1000);                  //задержка 1000 миллисекунд (1 сек)
    }                               //конец функции. По завершении она снова
    //будет вызвана

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

  7. А теперь попробуем протестировать аналогичный код на языке С:
    Код: Выделить всё
    #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);
       }
    }

    Компилируем и загружаем код тем же способом. Светодиод должен замигать с частотой 5Гц.
    Результат достигнут, теперь можно писать нормальные программы в Atmel Studio и использовать отладочный модуль как программатор. Код "мигалки" на языке С занимает 148 байт в памяти контроллера, а та же самая программа на Processing/Wiring занимает 920 байт, т.е. более чем в 6 раз!
При всей своей простоте данный метод имеет много недостатков и не годится для серьёзных применений, т.к. по прежнему завязан на Arduino и им можно прошивать только контроллер с загрузчиком Arduino. Надо понимать что этот аддон в первую очередь служит для написания программ на Processing/Wiring для модулей Arduino(Freeduino) в Atmel Studio 6 и по сути его работа мало чем отличается от Arduino IDE, всё тоже самое можно делать и в ней.
Ко всему прочему, Arduino всегда будет включать периферию, например, запустит таймеры. При работе с ними на языке С можно обнаружить, что работают они совсем не так, как ожидалось.


l4-5Способ 2. Загрузка HEX-файла
Данный способ подразумевает загрузку произвольного HEX-файла скомпилированной программы в микроконтроллер модуля посредством записанной в нем программы Arduino-загрузчика.
В памяти контроллера модуля Freeduino по дефолту есть программа-загрузчик (bootloader). При запуске микроконтроллера она проверяет, не передается ли по необходимому протоколу основная программа. Если да, то загрузчик считывает данные и записывает их в память, после чего микроконтроллер перезагружается. Загрузка прошивки при помощи загрузчика возможна по любому интерфейсу. В данном случае это виртуальный COM-порт на микросхеме FT232R, подключенной к интерфейсу UART микроконтроллера.
Для загрузки файла прошивки потребуется специальная утилита ArduinoUploader:
ArduinoUploader.zip
(572.46 Кб) Скачиваний: 223

  1. Создаем новый проект в Atmel Studio 6 и выбираем соответствующий микроконтроллер.
    Тип проекта - GCC C Executable Project, галочку "Create directory for solution" можно снять.

  2. В открывшееся окно редактора вместо дефолтного кода вставляем уже знакомую программу-мигалку, только желательно изменить частоту мигания на отличную от той, которая, возможно, уже была ранее записана в память контроллера.
    Код: Выделить всё
    #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(2000);
          PORTB &= ~1<<5;
          _delay_ms(2000);
       }
    }

  3. Далее в главном меню выбираем Build->Build Solution. В результате, если не было ошибок, в папке проекта будет создан набор выходных файлов, в том числе файл с расширением .hex. Это и есть скомпилированная программа в виде 16-ричных кодов.

  4. Распаковываем архив с ArduinoUploader и запускаем файл ArduinoUploader.exe.
    В открывшемся окне программы делаем следующие установки:
    1. выбираем hex-файл программы
    2. выставляем соответствующий COM-порт
    3. выбираем необходимый контроллер (m328p для ATmega328P или m168 для тех, у кого ATmega168)
    4. в команде меняем скорость передачи данных с 19200 на 57600, пробела между буквой b и числом быть не должно

  5. Нажимаем кнопку Upload. Если все сделано правильно, то программа будет загружена в память контроллера и светодиод замигает с заданной частотой. Если же возникнут ошибки, то их будет видно в открывшемся окне процесса загрузки. При появлении ошибки "not in sync" нужно попробовать разные скорости передачи.
Утилит для загрузки hex-файлов в платы Arduino(Freeduino) много и все они по сути представляют из себя user-friendly интерфейс к программе avrdude. Тем не менее, в качестве альтернативы я бы хотел порекомендовать более простую и нативную XLoader.
XLoader.zip
(678.31 Кб) Скачиваний: 244
Последнюю версию можно скачать здесь.

Данный способ загрузки программы в микроконтроллер модуля уже более продвинутый и универсальный, но он также не лишен недостатков. Проблемы могут возникнуть из-за программы загрузчика в памяти микроконтроллера. Например, после завершения работы загрузчика остается включен UART. Когда загрузка осуществляется через Arduino IDE, то в код будет добавлено отключение UART, но если загружается hex-файл, то придется менять код программы и добавлять(при необходимости) его отключение вручную. Подробнее об этом можно почитать здесь. Ко всему прочему данный способ не предполагает загрузку файлов EEPROM (.eep).


l4-6Способ 3. Bit-Bang
Выбор отладочного модуля Freeduino 2009 был неслучаен. Благодаря наличию в его составе замечательной микросхемы USB-конвертера FT232R, её интерфейсного разъема(X3 на схеме) и разъема внутрисхемного программирования микроконтроллера ICSP, данный модуль можно превратить в универсальный скоростной USB-программатор, позволяющий полноценно программировать микроконтроллеры AVR и пригодный для профессионального применения.

Что же такое Bit-bang?
Bit-bang - это непосредственное управление выводами какого либо порта с целью имитации какого-либо протокола. В данном случае всё это возможно благодаря тому, что FT232R поддерживает бит-банг режим напрямую через драйвер FTDI, из которого в результате получается первоклассный скоростной программатор, прошивающий 16кб прошивки за 10-12 секунд вместе с верификацией! Таким образом, всю работу по загрузке прошивки в контроллер делает микросхема FT232R, что позволяет программировать не только "голый" контроллер в панельке отладочного модуля, но и любой другой AVR по интерфейсу ICSP. Подробнее о Bit-bang можно почитать здесь.

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

Разъем "X3" - это интерфейс FT232R, "ICSP" - разъем внутрисхемного программирования микроконтроллера. Питание с разъема "POWER" нужно только в том случае, если прошивается какой-то внешний контроллер.
Длина кабеля должна быть не более 50см, также не плохо, если кабель будет экранированным.
Для изготовления потребуется три разъема распространенных типов PBS/PBD(мама) и PLS(папа): PBS-4(для X3), PBD-6(для ICSP) и PLS-2(POWER). Также удобно использовать разъемы и провода типа BLS/BLD(мама), которые, например, раньше применялись в аудио интерфейсах старых CD-ROM, и с которыми можно обойтись практически без пайки.

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

Для работы с программатором также потребуется консольная программа Avrdude. Поскольку свежая версия этой программы имеет глюк, который не позволяет работать с FT232R, то я предлагаю скачать старую версию программы:
avrdude.zip
(194.27 Кб) Скачиваний: 488
Установки программа не требует, достаточно распаковать архив в корень диска С или в любое другое удобное место.

Для чистоты эксперимента прошивать будем самый обыкновенный "голый" контроллер без какого-либо загрузчика Arduino внутри. Для этой цели специально был приобретен ATmega168.

Теперь всё готово для прошивки контроллера:
  1. В Atmel Studio создаем новый проект (в моем случае я выбрал контроллер ATmega168), вставляем код мигалки на С и получаем выходной hex-файл, который для удобства можно скопировать в папку с программой avrdude. Процесс создания проекта и получения hex-файла подробно описан выше в способе №2.
  2. Отключаем питание модуля(кабель USB).
  3. При необходимости аккуратно извлекаем контроллер модуля, поддевая его тонкой плоской отверточкой с торцов, и устанавливаем на его место другой. Выводы нового контроллера перед установкой в панель нужно отформовать, т.к. они не перпендикулярны корпусу и в панельку контроллер не влезет. Сделать это проще всего на столе: контроллер нужно облокотить одной стороной выводов о плоскую поверхность стола и, держа его за края корпуса, немного подогнуть эту сторону выводов, после чего перевернуть контроллер другой стороной и повторить формовку.
  4. Подключаем изготовленный кабель для программирования одним концом к разъему X3 модуля, а другим к разъему ICSP. При подключении нужно быть внимательным и не перепутать распиновку. Разъем питания подключать необязательно, т.к. он нужен только для прошивки внешнего контроллера, когда разъем кабеля ICSP подключается к другому контроллеру на другой плате, а к контроллеру модуля питание уже и так подведено.
  5. Подключаем модуль к USB, запускаем консоль(командную строку windows) и переходим в папку с распакованной программой avrdude.
  6. Запускаем avrdude для прошивки контроллера следующим образом(имя hex-файла прошивки blink.hex нужно заменить на имя вашего файла):
    Код: Выделить всё
    avrdude -C avrdude.conf -p m168 -c diecimila -P ft0 -e -U flash:w:blink.hex -B 4800


    В случае успешного завершения процесса на экране появится что-то вроде этого:

    Разберем подробнее ключи программы avrdude, задействованные к команде:
    • -C avrdude.conf - указывает расположение файла конфигурации, в данном случае он в той же папке, что и программа
    • -p m168 - выбор типа микроконтроллера ATmega168
    • -c diecimila - выбор типа программатора (под таким именем описан FT232R Synchronous BitBang в файле конфигурации AVRDUDE, т.к. данный модуль Ардуино, на борту которого есть данная микросхема, часто используется)
    • -P ft0 - выбор порта, выбрано первое устройство с чипом FTDI (в данном случае это микросхема FT232R)
    • -e - команда на предварительную очистку памяти программ
    • -U flash:w:blink.hex - указывает на hex-файл с прошивкой
    • -B 4800 - bitclock, скорость программирования.
      Этим ключом можно поиграться. Выбор значения зависит от тактовой частоты МК. Пробовать лучше с меньших значений. Не путать с параметром -b (скорость COM-порта).
      -B 1200
      -B 2400
      -B 4800
      -B 9600
      -B 14400
      -B 19200
      -B 38400
      -B 57600
      -B 115200
      -B 230400
      -B 460800
      -B 921600
      -B 3000000
  7. Отсоединяем кабель программирования с какой-нибудь из сторон и нажимаем кнопку RESET модуля.
Если всё прошло успешно тестовый светодиод зажжется и будет долго-долго гореть, так долго, что может показаться будто программа не работает, а потом он надолго погаснет, а потом снова надолго зажжется и т.д...... Программа работает, светодиод мигает, но частота его мигания очень низка. Вместо того, чтобы мигать через одну секунду, он мигает через 16 секунд. В чём же дело?
А дело в том, что был прошит "голый" контроллер, который сконфигурирован с завода по умолчанию и тактируется частотой 1мГц от встроенного генератора на RC-цепочке, а программа-мигалка, которая в него залита скомпилирована для работы с частотой 16мГц от внешнего кварцевого резонатора модуля, вот поэтому программная "секунда" и растянулась на долгие 16 секунд. Таким образом контроллер нужно сконфигурировать на работу от кварцевого резонатора. Как это сделать? Для этого нужно установить соответствующие биты аппаратной конфигурации контроллера - fuse-биты(попросту "фьюзы").

Fuse-биты
Внимательный читатель, изучивший описание параметров avrdude наверняка заметит, что с помощью этой программы можно прописывать fuse-биты, но уж больно сложно и непонятно выглядят эти параметры, а между тем, прописывание битов конфигурации представляет собой ответственную процедуру, ошибки в которой могут привести к проблемам, например, можно залочить контроллер так, что прошить его потом можно будет только в полноценном параллельном программаторе. Стало быть процесс этот нужно как-то упростить, а поможет в этом программа графического интерфейса для avrdude.
На самом деле всевозможных ГУЁв (GUI - Graphical User Interface) для avrdude много, для примера возьмем программу нашего соотечественника под названием Avrdude_prog. Программа не требует установки и имеет простой русскоязычный графический интерфейс, почти полностью раскрывающий возможности Avrdude.
Нужно отметить, что последняя версия программы Avrdude_prog 3.3 работает со свежей версией Avrdude, которая, как было сказано выше, не может нормально работать с чипом USB-конвертера FT232R, поэтому файлы avrdude.exe и avrdude.conf в папке с программой нужно заменить на те, что представлены для скачивания выше. Также для поддержки модуля Freeduino2009 в конфигурационный файл programm.ini Avrdude_prog нужно добавить следующие строки:
Код: Выделить всё
[Arduino Diecimila]
progisp=diecimila -B 4
portprog=ft0
portenabled=0

Ниже выложен архив с уже готовой и сконфигурированной программой Avrdude_prog:
avrdudeprog33.zip
(434.78 Кб) Скачиваний: 238
  1. Распаковываем архив с программой и подключаем кабель программирования.
  2. Заходим в папку с программой, запускаем файл AVRDUDEPROG.exe и в открывшемся окне программы делаем некоторые установки:
    • выбираем контроллер (в моем случае это ATmega168)
    • в разделе "Flash" выбираем путь к hex-файлу прошивки-мигалки, которую ранее залили посредством avrdude
    • в разделе "Настройки" выбираем программатор Arduino Diecimila
    • в разделе "Fuses" выставляем переключатель на "Инверсные", так с ними будет психологически проще работать, т.е. галочка будет означать активный fuse-вит
  3. Для проверки связи и работоспособности нажимаем кнопку "Верификация" в разделе "Flash". Программа считает прошивку из контроллера и сравнит её с hex-файлом программы. Если всё пройдет гладко, то появится окно подтверждения:

    Внизу окна будет консольный вывод программы avrdude(как в примере выше), из которого можно получить информацию о том что произошло в процессе чтения-верификации.
    Также нужно отметить, что в программе Avrdude_prog имеется глючок, когда avrdude завершается ошибкой, а графическая оболочка Avrdude_prog сообщает, что всё "ОК", поэтому консольный вывод avrdude нужно смотреть всегда.

  4. Если связь программатора с контроллером налажена, то можно перейти на вкладку "Fuses" и нажать кнопку "Чтение", чтобы считать биты конфигурации из контроллера. Поскольку ранее был выбран инверсный вариант отображения fuse-битов, то галочками будут отмечены активные(установленные, включенные) биты. Напомню, что в микроконтроллерах AVR активному fuse-биту соответствует значение ноль, а неактивному единица.

    Перед работой с Fuse-битами настоятельно рекомендую прочесть вот это.

  5. Теперь настало время поработать с документацией.
    Для начала нужно скачать даташит на соответствующий контроллер:
    http://www.atmel.com/devices/ATmega168. ... =documents
    Открываем главу с описанием способов тактирования контроллера (System clock and clock options). В данном случае это глава 9(стр. 27-28). Если есть хотя бы базовые знания английского, то лучше изучить данную главу полностью.
    В подразделе 9.2 Clock Sources представлена таблица, в которой перечислены возможные способы тактирования и соответствующая им конфигурация fuse-битов SKSEL:

    Сравниваем её со значениями считанных из контроллера фьюзов и убеждаемся, что их конфигурация соответствует значению Calibrated internal RC oscillator (0010) - внутренний тактовый генератор на 8МГц, это конфигурация по умолчанию.
    Ниже в подразделе 9.2.1 Default clock source идет подробное описание данной конфигурации, которая также включает в себя состояние битов SUT=10 и бит CKDIV8=0, который делит частоту генератора на 8, получая в результате тактовую частоту в 1МГц.
    Далее нужно промотать даташит до подраздела 9.4 Full swing crystal oscillator(стр.31), где сказано, что для работы с внешним кварцем нужно выставить биты CKSEL3..1 в значение 011(таблица 9-5). Также нужно задать состояние битам CKSEL0 и SUT, которые в данной конфигурации будут задавать скорость старта микроконтроллера после снятия сигнала RESET или подачи питания. Проматываем даташит на страницу ниже и обращаем внимание на таблицу 9-6:

    В ней нас интересуют последние три строчки, имеющие отношение к обычному нормальному кварцу(Crystal Oscillator). Для надежности выберем самое большое время 65мс, т.е. установим соответствующим битам значения CKSEL0=1 и SUT=11. Также нужно выключить бит CKDIV8, который больше не нужен. Таким образом получаем следующую конфигурацию fuse-битов, отвечающих за тактированние и старт контроллера:
  6. Нажимаем кнопку "Программирование" и прошиваем новую аппаратную конфигурацию в контроллер, после чего можно нажать кнопку "Верификация" и "Чтение", чтобы убедится, что всё правильно прописалось.

  7. Отключаем разъем программирования и убеждаемся, что светодиод начал мигать как положено с заданной частотой.
Если (вдруг!) кто захочет работать и прописывать фиюзы посредством консольной версии программы Avrdude, то для получения параметров командной строки можно воспользоваться этим fuse-калькулятором:
http://www.engbedded.com/fusecalc/

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


Вот и закончились этапы изучения контроллеров AVR. Далее, для приобретения опыта и углубления знаний могу порекомендовать читать побольше соответствующей литературы, изучать язык программирования и почаще "курить" фирменную документацию от Atmel, ну и конечно же делать разные устройства на микроконтроллерах. Удачи :)

О продолжении работы с модулем Freeduino2009 и подключении к нему графического ЖК дисплея можно почитать здесь.


Что ещё почитать
Аватара пользователя
alex83
Имя: Александр

Как прошивать Arduino/Freeduino из Atmel Studio 7

alex83 » 08 май 2020, 00:27

В AtmelStudio 7 плагин Arduino IDE стал платный, поэтому юзать его теперь впадлу. Но, тем не менее, прошивка модулей из среды всё же возможна средствами AtmelStudio в связке с программой Avrdude.exe.

1. Качаем последнюю версию Avrdude отсюда и распаковываем архив куда-нибудь, где его содержимое будет долго и спокойно лежать.

2. Создаем новый проект в Atmel Studio 7. Выбираем Arduino-скетч и задаем расположение нового проекта. В следующем окне задаем расположение существующего скетч-файла Arduino, путь к установленной Arduino IDE, тип модуля и контроллер.



3. Генерим HEX-файл.


4. Идем в меню Tools -> External Tools и задаем в окне параметры нашего программатора.
Title - любое название, отражающее смысл операции.
Command - выбираем путь к распакованной avrdude.exe
Arguments - параметры выполнения, например
-v -p atmega328p -c arduino -P COM14 -b 57600 -D -U flash:w:"$(ProjectDir)Debug\$(TargetName).hex":i
, где
-v - подробный вывод
-p - тип контроллера, используемого в модуле
-с - тип программатора
-P - порт программатора
-b - скорость обмена
Остальное не менять, оставить, как есть.
Не забываем поставить галочку Use Output window, чтобы увидеть лог работы avrdude.
Нажимаем ОК.


5. Идем в меню Tools, видим название нашего программатора и выбираем его.
Если всё сделано правильно, то будет инициирована прошивка и появится окно вывода с логом работы программатора.
В случае отсутствия проблем вывод будет примерно, как на скрине ниже.
Аватара пользователя
alex83
Имя: Александр

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1