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

Программирование микроконтроллеров. Урок 3
(Установка CV_AVR и написание первой программы)


Урок 3 (Установка CV_AVR и написание первой программы)

На предыдущем уроке мы с вами подключили МК к компьютеру и научились загружать в него программу, а также читать и стирать память контроллера. Может случится так, что этого будет вполне достаточно т.к. в интернете полно реализованных проектов, для сборки которых только и надо смонтировать устройство и прошить прилагаемую к нему программу. Но я-то знаю, что мало кто хочет быть «обезьяной», таскающей билетики счастья, каждый видит себя «шарманщиком».


И поэтому продолжим. Для этого урока нам понадобится скачать дистрибутив CodeVisionAVR V3.32 и установить его на компьютер. Никаких подводных камней при инсталляции быть не должно, но если вдруг что-то стало не понятно, то процесс установки хорошо описал М.Б. Лебедев в книге «CodeVisionAVR пособие для начинающих» на страницах с 10 по 17. Также в этой книге на страницах с 18 по 82 описана вся среда разработки. Перед началом работы я бы рекомендовал в вкратце пробежаться по этим главам что бы не тыкаться в первую попавшуюся кнопку.

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

Что бы не перепутать плюс (анод) с минусом (катод) на светодиоде, надо помнить два простых правила. Для выводных круглых светодиодов анод всегда длиннее катода, а если выводы уже обкушены, то на корпусе светодиода должна быть небольшая лыска со стороны катода.

Я надеюсь, что вы не седели сложа руки и прочитали всё, что я просил. Если так, то о портах ввода/вывода вы уже знаете почти всё. Но не лишним будет повторить о том, что разные модели AVR микроконтроллеров имеют от одного до семи портов. В Mege 8 таких портов три (B, C, D) при этом, в зависимости от количества выводов, МК порты могут быть полные (восьми разрядные) и не полные. Каждый вывод порта может быть сконфигурирован как на передачу данных, так и на прием. При этом выводы порта могут находится в трех состояниях: первое состояние, когда на выходе микроконтроллера низкий потенциал (замкнут на общий); второе состояние, когда на выходе высокий потенциал (напряжение питания); третье состояние, когда вывод сконфигурирован как вход. За конфигурацию портов отвечают регистры DDRx (где х буква обозначающая порт – например DDRB) если порт не полный, то старшие разряды этого порта доступны только для чтения и при обращении к ним возвращают (0). Повторюсь. Регистры DDRx определяют в каком режиме будет работать тот или иной вывод МК. Если разряд вывода установлен в (1), то вывод будет работать как выходной, а если в (0), то вывод будет работать на прием данных. При запуске МК все выводы портов сконфигурированы на прием данных, то есть находятся в третьем состоянии.

Принимаемые контроллером данные могут быть как аналоговые, так и цифровые. Аналоговые данные обычно обрабатываются либо АЦП (аналогово цифровым преобразователем), либо компаратором, а вот снимать цифровые данные поступающие на выводы МК можно как многочисленной периферией, с которой мы познакомимся позднее, так и непосредственно с регистра PINx. В CV_AVR читать входящие данные можно как со всего регистра целиком, так и с конкретного вывода обращаясь непосредственно к его разряду. Достаточно указать номер разряда, к которому мы обращаемся. Например, PINB.2 говорит о том, что мы хотим посмотреть какой потенциал (низкий – 0 или высокий – 1) установлен на выводе контроллера, которому соответствует этот разряд (16 вывод Mega_8 в DIP корпусе). Надо отметить тот факт, что регистр PINx предназначен только для чтения. Бесполезно пытаться записать в него какие-либо данные.

А вот чтобы зажечь светодиод нам необходимо будет сконфигурировать вывод МК как выходной записав в необходимый разряд регистра DDRx единицу (1) (например, DDRB.0 = 1;). И как только мы это сделаем то на выводе контроллера появится либо низкий, либо высокий потенциал. Это будет зависеть от данных находящихся в регистре PORTx. Регистры PORTx отвечают за выходные состояния выводов контроллера. Эти порты содержат данные о текущим состоянии выводов МК. Если в разряд порта записана единица (1), то на выводе порта будет высокий потенциал, а если ноль (0) – низкий. Для всех выводов, которые будут сконфигурированы на прием данных в PORTx необходимо записать нули, а вот для выводов, которые сконфигурированы на выход, записывают данные в зависимости от их проектного первоначального состояния. В дальнейшем по ходу программы эти состояния могут неоднократно меняться.

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

В общем это пока всё, что надо знать о том, что и как работает в микроконтроллере на ближайшие занятия.

Итак, вернемся к нашей среде разработки. Открытие нового проекта в CV_AVR на мой взгляд немного мутное занятие. Начнем с того что в меню File/New/ нажимаем меню Project и в выпавшем меню нажмем «Yes». Затем в меню выбора типа чипа оставляем точку в строке с надписью «ATmega». Про автоматический генератор программ в CV_AVR написано в М.Б. Лебедев «CodeVisionAVR пособие для начинающих» 2008г. Страницы 372…353. На данном этапе вдумчиво читать это не требуется, но знать, где посмотреть информацию в случае необходимости, надо обязательно.

Затем выбираем наш контроллер в меню «Chip». Потом во вкладке «Program» выбираем пункт «Generate, Save and Exit» (генерировать, записать и выйти). Здесь необходимо упомянуть о том, что частота работы Mega_8 по умолчанию 1МГц. О том, как ее изменить мы поговорим позже.

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

Ну вот проект создан и можно приступать к программированию. И первым делом смело сносим почти всё что было сгенерировано помошником. После чистки у нас должно остаться вот такая программа.

Перед вами минимальный программный код, который можно скомпилировать и записать в контроллер. Никаких внешних действий эта программа производить не будет, но внутри микроконтроллера «забьется» электронное сердце. И чтобы узнать о том, что оно «бьётся» всего то и надо дописать одну строчку к этой программе.

Теперь необходимо скомпилировать нашу программу и прошить ее в контроллер. Для этого необходимо нажать на кнопку «собрать всё». Если компиляця прошла успешно, то на экране появится справка, в которой указаны параметры компиляции.

Теперь запускаем PoniProg, открываем наш скомпилированный файл, который по умолчанию находиться по адресу – папка проекта/Debug/Exe/имя файла.hex и программируем МК. Наслаждаемся горящим светодиодом.

Для проверки работы программы вы можете нажать на кнопку RESET. Светодиод должен моргнуть и снова загореться. Это укажет на то, что все работает как и до′лжно.

Насладившись практической частью можно переходить к теории.

Начнем с того, что рассмотрим блок схему нашей программы. Не думайте, что блок схемами пользовались только в компьютерной «древности». Существует действующий ГОСТ 19.701-90 Единой Системе Программной Документации. Так вот наша программа, изображенная с помощью блок-схемы будет выглядеть вот так.

блок-схема

На этой блок-схеме нумерация блоков соответствует нумерации строк программы. Блок (Начало) является первой строкой программы, в которой обычно находится описательная часть, из которой можно понять назначение данной программы, ее версию, имя разработчика и т.д. В строке 7 присваиваем регистрам собственные псевдонимы, а также указываем псевдонимы для других элементов внутренней организации МК. Описание присваивания можно посмотреть, открыв файлы «mega8.h» и «mega8_bits.h» в колонке проекта. В строке 12 производим конфигурацию вывода порта «B», а так как при запуске МК данные всех портов равны «0», то стоило нам сконфигурировать вывод порта (В) на выход, цепь резистор диод замкнулась на общий контакт, и пошедший по ней ток заставил светиться наш светодиод. В строке 14 - 19 программа входит в бесконечный цикл «while (1)» (W) выхода из которого нет. Но не кто не запрещает нам нажать кнопку RESET и перезагрузить контроллер начав программу сначала.


Для следующего занятия нам понадобится помимо уже собранной нами схемы еще и:
Резистор 10 кОм – 1шт.;
Кнопка, нормально разомкнутая без фиксации – 1 шт.


К следующему уроку необходимо почитать::
М.Б. Лебедев «CodeVisionAVR пособие для начинающих» 2008г. Страницы 83…155 . О работе в среде можно прочитать бегло просто чтобы знать где искать нужную информацию если вдруг возникнет вопрос по CV_AVR.
М.Б. Лебедев «CodeVisionAVR пособие для начинающих» 2008г. Страницы 156…175 .
Ю.А. Шпак «Программирование на языке С для AVR и PIC микроконтроллеров» 2006. Страницы 107…110.
Майк МакГрат «Программирование на С для начинающих» 2016. Страницы 10, 14…15, 18…19.


Ах да… чуть не забыл. При запуске CV_AVR будет автоматически загружаться последний рабочий проект. Для того, чтобы загрузить другой проект необходимо запустить файл, находящийся в папке проекта с расширением (*.prj).


А на сегодня всё. Удачи.

16.05.18


Если вдруг найдете в статье неточности или заблуждения. Напишите мне об этом. Я подправлю.

Приложение:
Схема подключения, проект CV_AVR