ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ
(ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
А.А. Егоров, В.Г. Осипов, С.Ю. Соловьёв
ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ
СЕМЕЙСТВА AVR
Учебное пособие к лабораторным работам
по дисциплине
«Цифровые вычислительные устройства
и микропроцессоры приборных комплексов»
Утверждено
на заседании редсовета
2 сентября 2004 г.
Москва
Издательство МАИ
Егоров А.А., Осипов В.Г., Соловьёв С.Ю. Программирование микроконтроллеров семейства AVR: Учебное пособие. – М.: Изд-во МАИ, 2005. – 77 с.: ил.
Рассматриваются вопросы программирования однокристальных микроконтроллеров на примере языка ассемблера микроконтроллеров семейства AVR. Изучаются этапы разработки программного обеспечения, средства отладки программ, способы адресации операндов, реализация основных алгоритмических структур (ветвлений и циклов), принципы организации подпрограмм и способы обмена данными между вызывающей программой и подпрограммой, использование системы прерываний.
Предназначено для студентов специальности «Авиационные приборы и измерительно-вычислительные комплексы».
Рецензенты: кафедр0а «Приборы и информационно-измерительные системы» Казанского государственного технического университета им. А.Н. Туполева (зав. кафедрой, д-р техн. наук, профессор В.М. Солдаткин); канд. техн. наук А.П. Рогалёв
© Московский авиационный институт
(государственный технический университет), 2005
ВВЕДЕНИЕ
Технической базой «интеллектуализации» приборных комплексов является интеграция в них микропроцессоров (МП), программируемых логических интегральных схем (ПЛИС), приборов типа «система на кристалле» (System-On-Chip – SOC) и других современных цифровых устройств. Подобная интеграция позволяет автоматизировать процессы измерения, управления, контроля, регулирования и обработки информации, а также обеспечить такие свойства приборных комплексов, как многофункциональность, модифицируемость, адаптивность, обучаемость и ряд других.
В силу большой гибкости и широких функциональных возможностей для решения указанных задач наиболее часто применяются различные микропроцессоры. В отличие от персональных компьютеров, вычислительным ядром которых служат универсальные высокопроизводительные микропроцессоры, для интеграци и в приборные комплексы используются специализированные встраиваемые микропроцессоры.
Среди специализированных микропроцессоров выделяются два важнейших класса – цифровые процессоры обработки сигналов (ЦПОС) и управляющие микропроцессоры – микроконтроллеры (МК). Цифровые процессоры обработки сигналов представляют собой устройства, предназначенные для реализации методов цифровой обработки сигналов. Основное назначение микроконтроллеров состоит в построении управляющих устройств (контроллеров). Благодаря эффективному сочетанию технических характеристик и низкой стоимости микроконтроллеры получили широкое распространение в различных сферах – от бытовой техники до бортового оборудования летательных аппаратов.
Как известно, наиболее трудоёмким и ответственным этапом проектирования микропроцессорной системы является разработка программного обеспечения (ПО). Процесс разработки ПО для встраиваемых микропроцессоров в значительной степени отличается от процесса разработки программного обеспечения для персональных компьютеров. Настоящий лабораторный практикум направлен на изучение процесса программирования встраиваемых микроконтроллеров. Однако большинство приведённых в данном пособии сведений и положений (этапы разработки и средства отладки программного обеспечения, принципы организации подпрограмм, использование механизма прерываний и др.) носят универсальный характер и могут быть применены также к другим типам встраиваемых микропроцессоров.
Пособие предназначено для использования в процессе лабораторных и практических занятий и состоит из восьми тематических работ. В описании каждой работы лабораторного практикума приведены краткие теоретические сведения, практическое задание, требования к содержанию отчёта и контрольные вопросы для самопроверки.
Лабораторный практикум преследует три взаимосвязанные цели:
- изучение архитектуры, принципов функционирования и основных характеристик современных микропроцессоров на примере относительно «простых» устройств – однокристальных микроконтроллеров;
- изучение возможностей языка ассемблера как одного из наиболее эффективных способов программирования встраиваемых микроконтроллеров*;
- приобретение навыков самостоятельной работы с современными средствами разработки программного обеспечения для МК и овладение используемой при этом терминологией.
Вопросы схемотехнического проектирования систем на основе микроконтроллеров изучаются в рамках курсовой работы.
Лабораторный практикум имеет следующую структуру. Лабораторная работа № 1 является введением в вопросы разработки программного обеспечения для однокристальных микроконтроллеров. Лабораторные работы № 2–5 посвящены изучению общих вопросов программирования микроконтроллерных систем на языке ассемблера. Лабораторная работа № 6 охватывает некоторые практические аспекты применения микроконтроллеров в измерительно-управляющих устройствах.
Лабораторные работы выполняются на персональных компьютерах в интегрированной среде разработки AVR Studio *. Дистрибутив данного программного обеспечения можно бесплатно получить на сайте www.atmel.com или www.atmel.ru.
В связи с широким распространением в современной инженерной практике англоязычной технической литературы и программного обеспечения в пособии приведены английские эквиваленты основных терминов.
Пособие написано на основе опыта разработки устройств на базе однокристальных микроконтроллеров, накопленного в Отделе автоматизации экспериментов Московского авиационного института. В методическом построении настоящего пособия сохранена преемственность по отношению к лабораторному практикуму, поставленному канд. техн. наук, доц. Р. С. Диановой [3, 4].
Работа № 1. ОСНОВЫ ПРОГРАММИРОВАНИЯ МИКРОКОНТРОЛЛЕРОВ
Цель работы: изучение назначения и особенностей архитектуры однокристальных микроконтроллеров; ознакомление с архитектурой и программной моделью AVR -микроконтроллеров; изучение этапов разработки ПО для встраиваемых микропроцессоров; приобретение навыков работы в среде AVR Studio.
ОСНОВНЫЕ СВЕДЕНИЯ
Микроконтроллеры составляют наиболее широкий класс микропроцессоров, используемых в приборах, устройствах и системах различного назначения. Микроконтроллер – это специализированный микропроцессор, предназначенный для построения устройств управления техническими объектами и технологическими процессами [15]. Конструктивно микроконтроллер представляет собой большую интегральную схему (БИС), на кристалле которой размещены все составные части типовой вычислительной системы: микропроцессор, память, а также периферийные устройства для реализации дополнительных функций.
Так как все элементы микроконтроллера размещены на одном кристалле, их также называют однокристальными (однокорпусными) микроЭВМ или однокристальными микроконтроллерами. Цель применения микроконтроллеров – сокращение числа компонентов, уменьшение размеров и снижение стоимости приборов (систем).
Как правило, микроконтроллеры имеют RISC-архитектуру (RISC – Reduced Instruction Set Computer – вычислитель с сокращённым набором команд), незначительную ёмкость памяти, физическое и логическое разделение памяти программ и памяти данных, ориентированную на задачи управления систему команд. Таким образом, микроконтроллеры предназначены для решения задач управления, контроля, регулирования и первичной обработки информации и менее эффективны при реализации сложных алгоритмов обработки данных.
В состав типовой микроконтроллерной системы управления входит микроконтроллер и аппаратура его сопряжения с объектом управления (рис. 1) [13].
Рис. 1. Типовая структура системы управления на основе микроконтроллера:
ФСУ – формирователи сигналов управления; ИУ – исполнительные
устройства; Д – датчики; ФСС – формирователи сигналов состояния
Микроконтроллер производит периодический опрос сигналов состояния объекта и в соответствии с заложенным алгоритмом генерирует последовательности сигналов управления. Сигналы состояния характеризуют текущие параметры объекта управления. Они формируются путём преобразования выходных сигналов датчиков (Д) с помощью аналого-цифровых преобразователей (АЦП) или формирователей сигналов состояния (ФСС); последние чаще всего выполняют функции гальванической развязки и формирования уровней. Сигналы управления, выработанные микроконтроллером, подвергаются преобразованию с помощью цифро-аналоговых преобразователей (ЦАП) или формирователей сигналов управления (ФСУ), в качестве которых применяются усилители мощности, оптроны, транзисторные и тиристорные ключи и др. Выходные сигналы ЦАП и ФСУ представляют собой соответственно аналоговые и дискретные управляющие воздействия, которые поступают на исполнительные устройства (ИУ). В системе могут быть также предусмотрены панель управления, устройство индикации и интерфейс для обмена информацией с внешними устройствами. В зависимости от назначения и характеристик конкретной системы некоторые из указанных элементов могут отсутствовать.
Разрядность выпускаемых микроконтроллеров варьируется от 4 до 64 бит. Наибольшее распространение получили 8-разрядные микроконтроллеры как пригодные для использования в различных приложениях и имеющие низкую стоимость [11]. Характерными представителями таких устройств являются микроконтроллеры семейства AVR фирмы Atmel.
AVR -микроконтроллеры – это 8-разрядные RISC-микроконтроллеры, отличительными особенностями которых являются наличие FLASH-памяти программ, широкий спектр периферийных устройств, высокая вычислительная производительность, а также доступность средств разработки программного обеспечения [20, 21].
В состав семейства AVR в настоящее время входят более 50 различных устройств, которые подразделяются на несколько групп [18, 19].
Универсальные AVR -микроконтроллеры входят в группы Tiny AVR и Mega AVR. Tiny AVR (ATtiny XХX) – дешёвые устройства с небольшим количеством выводов. Mega AVR (ATmega XХX) – мощные AVR -микро-контроллеры, имеющие наибольшие объёмы памяти и количество выводов, а также максимально полный набор периферийных устройств.
Специализированные AVR -микроконтроллеры представлены группами LCD AVR (ATmega169, ATmega329) – микроконтроллеры для работы с жидкокристаллическими индикаторами; USB AVR (AT43USB XХX, AT76C711) микроконтроллеры с интерфейсом USB; DVD AVR (AT78C XХX) – контроллеры CD/DVD-приводов; RF AVR (AT86RF ХХХ) – микроконтроллеры для построения систем беспроводной связи; Secure AVR (AT90SC XХХX, AT97SC XХХX) – микроконтроллеры для смарт-карт; FPGA AVR (AT94K XХ AL) – AVR-микро-контроллеры, выполненные на одном кристалле с ПЛИС. Кроме того, ранее выпускалась группа Classic AVR (AT90S XXХX) – устройства, занимающие промежуточное положение между микроконтроллерами групп Mega и Tiny (заменены совместимыми усовершенствованными аналогами группы Mega) [9].
Основные характеристики микроконтроллеров групп Tiny AVR, Mega AVR и LCD AVR приведены в приложении 1.
Архитектура AVR-микроконтроллеров. AVR -микроконтроллеры содержат на кристалле следующие аппаратные средства: 8-разрядное процессорное ядро, память программ, оперативную память данных, энергонезависимую память данных, регистры ввода-вывода, схему прерываний, схему программирования, а также периферийные устройства (рис. 2) [17].
Рис. 2. Архитектура микроконтроллеров семейства AVR
Процессорное ядро (Central Processing Unit – CPU) AVR -микроконтролле-ров содержит арифметико-логическое устройство (АЛУ), регистры общего назначения (РОН), программный счётчик, указатель стека, регистр состояния, регистр команд, дешифратор команд, схему управления выполнением команд.
В АЛУ выполняются все вычислительные операции. Операции производятся только над содержимым РОН. На выборку содержимого регистров, выполнение операции и запись результата обратно в РОН затрачивается один машинный такт (один период тактовой частоты).
Регистры общего назначения представляют собой 8-разрядные ячейки памяти с быстрым доступом, непосредственно доступные АЛУ. В AVR -микро-контроллерах имеется 32 РОН.
Программный счётчик (Program Counter – PC) содержит адрес следующей выполняемой команды.
Указатель стека (Stack Pointer – SP) служит для хранения адреса вершины стека (см. лабораторную работу № 5).
Регистр состояния (Status Register – SREG) содержит слово состояния процессора (см. лабораторную работу № 4).
Регистр команд, дешифратор команд и схема управления выполнением команд обеспечивают выборку из памяти программ команды, адрес которой содержится в программном счётчике, её декодирование, определение способа доступа к указанным в команде аргументам и собственно выполнение команды. Для ускорения выполнения команд используется механизм конвейеризации, который заключается в том, что во время исполнения текущей команды программный код следующей выбирается из памяти и декодируется.
Память AVR -микроконтроллеров организована по схеме гарвардского типа – адресные пространства памяти программ и памяти данных разделены.
Память программ представляет собой перепрограммируемое ПЗУ типа FLASH и выполнена в виде последовательности 16-разрядных ячеек, так как большинство команд AVR -микроконтроллера являются 16-разрядными словами. Гарантируется не менее 10 000 циклов перезаписи. Память программ имеет размер от 2 до 256 Kбайт (от 1 до 128 Kслов).
Оперативная память данных представляет собой статическое ОЗУ
(SRAM – Static Random-Access Memory) и организована как последовательность 8-разрядных ячеек. Оперативная память данных может быть внутренней (до 16 Kбайт) и внешней (до 64 Кбайт).
Энергонезависимая (nonvolatile) память данных организована как последовательность 8-разрядных ячеек и представляет собой перепрограммируемое ПЗУ с электрическим стиранием (РПЗУ-ЭС, или EEPROM – Electrically Erasable Programmable Read-only Memory). Энергонезависимая память данных имеет размер до 64 Кбайт.
Регистры ввода-вывода предназначены для управления процессорным ядром и периферийными устройствами AVR -микроконтроллера.
Схема прерываний обеспечивает возможность асинхронного прерывания процесса выполнения программы при определённых условиях.
К периферийным устройствам AVR -микроконтроллера относятся порты ввода-вывода, таймеры, счётчики, сторожевой таймер, аналоговый компаратор, аналого-цифровой преобразователь, универсальный асинхронный (синхронно-асинхроный) приёмопередатчик – УАПП (УСАПП), последовательный периферийный интерфейс SPI, интерфейс JTAG и др. Набором периферийных устройств определяются функциональные возможности микроконтроллера.
Обмен информацией между устройствами AVR -микроконтроллера осуществляется посредством внутренней 8-разрядной шины данных.
Программная модель AVR-микроконтроллеров. Программная модель микропроцессора представляет собой совокупность программно доступных ресурсов. В программную модель микроконтроллеров семейства AVR входят РОН, регистры ввода-вывода, память программ, оперативная память данных и энергонезависимая память данных (рис. 3).
РОН (R0 … R31) могут использоваться в программе для хранения данных, адресов, констант и другой информации. Шесть старших регистров объединены попарно и составляют три 16-разрядных регистра Х [ R27:R26 ], Y [ R29:R28 ] и Z [ R31:R30 ] (рис. 4).
Рис. 3. Программная модель AVR -микроконтроллеров
РОН, регистры ввода-вывода и оперативная память данных образуют единое адресное пространство. Адресное пространство – это множество доступных ячеек памяти, различимых по адресам; адресом называется число, однозначно идентифицирующее ячейку памяти (регистр). Адреса ячеек памяти традиционно записываются в шестнадцатеричной системе счисления, на что указывает знак $ в обозначении адреса.
Существует две конфигурации единого адресного пространства памяти AVR -микроконтроллеров. В конфигурации А младшие 32 адреса ($0000…
$001F) соответствуют РОН, следующие 64 адреса ($0020…$005F) занимают регистры ввода-вывода, внутренняя оперативная память данных начинается с адреса $0060. В конфигурации В начиная с адреса $0060 размещаются 160 дополнительных регистров ввода-вывода; внутренняя оперативная память данных начинается с адреса $0100. Конфигурация А используется в младших моделях микроконтроллеров и в некоторых старших моделях в режиме совместимости с моделями, снятыми с производства; конфигурация В – в старших моделях.
В память программ, кроме собственно программы, могут быть записаны постоянные данные, которые не изменяются в процессе работы микропроцессорной системы (константы, таблицы линеаризации датчиков и т. п.). Выполнение программы при включении питания или после сброса микроконтроллера начинается с команды, находящейся по адресу $0000 (т. е. в первой ячейке) памяти программ.
Энергонезависимая память данных предназначена для хранения информации, которая может изменяться непосредственно в процессе работы микропроцессорной системы (калибровочные коэффициенты, конфигурационные параметры и т. п.). Энергонезависимая память данных имеет отдельное адресное пространство и может быть считана и записана программным путём.
Система команд AVR-микроконтроллеров. Система команд (instruction set) микропроцессора представляет собой совокупность выполняемых микропроцессором операций и правил их кодирования в программе. Система команд AVR -микроконтроллеров включает команды (инструкции) арифметических и логических операций, команды ветвления, управляющие последовательностью выполнения программы, команды передачи данных и команды операций с битами. Всего в систему команд входит более 130 инструкций [22]. Младшие модели микроконтроллеров не поддерживают некоторых из них.
Система команд AVR -микроконтроллеров приведена в приложении 2.
Программирование микроконтроллеров. Процесс разработки прикладного ПО устройств на основе однокристальных микроконтроллеров включает следующие этапы (рис. 5) [12]:
- разработки алгоритма и структуры программы;
- написания исходного текста программы;
- получения выполняемой программы;
- тестирования и отладки программы;
- получения загрузочной программы.
На этапе разработки алгоритма и структуры программы выбирается метод решения задачи и разрабатывается алгоритм его реализации. Алгоритм – это набор правил или описание последовательности операций для решения определённой задачи или достижения некоторой цели. Графическим изображением алгоритма является схема алгоритма (flowchart), выполняемая в соответствии с ГОСТ 19.701–90 «Единая система программной документации. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения» [14].
На этапе написания исходного текста программы разработанный алгоритм записывается в виде программы на исходном языке (ассемблере или языке высокого уровня).
Языком ассемблера называется язык программирования, в котором каждой команде процессора или совокупности команд процессора соответствует сокращённая символическая запись (мнемоника). Использование символического обозначения команд, а также адресов регистров и ячеек памяти, переменных, констант и других элементов программы существенно облегчает процесс составления программ по сравнению с программированием на уровне машинных кодов. Символические обозначения элементов обычно отражают их содержательный смысл. Язык ассемблера обеспечивает возможность доступа ко всем ресурсам программируемого микропроцессора (микроконтроллера) и позволяет создавать программы, эффективные как по быстродействию, так и по объёму занимаемой памяти. В этой связи программирование на языке ассемблера предполагает знание архитектуры и свойств микропроцессора, т. е. всего того, что входит в понятие «программная модель». Языки ассемблера различаются для разных типов микропроцессоров, т. е. являются машинно-ориентированными. В ряде ассемблеров допускается оформление повторяющейся последовательности команд как одной макрокоманды (макроса), такие ассемблеры называют макроассемблерами.
Языки высокого уровня (С, Паскаль, Бейсик и др.), как и ассемблер, обеспечивают доступ ко всем ресурсам микроконтроллера, но вместе с тем дают возможность создавать хорошо структурированные программы, снимают с программиста заботу о распределении памяти и содержат большой набор библиотечных функций для выполнения стандартных операций.
На этапе получения выполняемой программы исходный текст программы с помощью специальных средств (трансляторов, компиляторов, компоновщиков и др.) преобразуется в исполняемый код. Транслятором (translator) называют программу, служащую для перевода (трансляции) программ на языке ассемблера в машинный код, «понимаемый» процессором. Компилятор (compiler) представляет собой программу, преобразующую в эквивалентный машинный код текст программы на языке высокого уровня. Результатом работы транслятора или компилятора может быть как выполняемый загрузочный модуль, так и объектный модуль (программа, команды, переменные и константы которой не «привязаны» к конкретным адресам ячеек памяти). Для построения выполняемой программы из объектных модулей применяется компоновщик (редактор связей, linker). В процессе получения выполняемой программы из исходного текста программы устраняются синтаксические ошибки, состоящие в нарушении правил синтаксиса используемого языка программирования.
На этапе тестирования и отладки программы производится поиск, локализация и устранение в ней логических ошибок. Тестирование служит для обнаружения в программе ошибок и выполняется с использованием некоторого набора тестовых данных. Тестовые данные должны обеспечивать проверку всех ветвей алгоритма. При тестировании программы могут подвергаться проверке также некоторые показатели системы, связанные с программой (например, объём кодов и данных). После тестирования программа должна быть подвергнута отладке (debug), задачей которой является локализация ошибки, т. е. нахождение места в программе, вызывающего ошибку.
Тестирование и отладка программы могут привести (и, как правило, приводят) к необходимости возврата к ранним этапам процесса разработки программы для устранения ошибок в постановке задачи, разработке алгоритма, написании исходного текста и т. д. Таким образом, процесс разработки программы, как и весь процесс проектирования, является итерационным.
На этапе получения загрузочной программы производится «освобождение» программы от лишних фрагментов, использовавшихся для тестирования и отладки. Эти фрагменты увеличивают объём программы и не нужны при нормальном функционировании микропроцессорной системы. Далее полученная загрузочная программа заносится в память микроконтроллера.
По завершении процесса разработки производится документирование, т. е. составление комплекта документов, необходимых для эксплуатации и сопровождения программы. Сопровождение программы (program maintenance) – это процесс внесения изменений, исправления оставшихся ошибок и проведения консультаций по программе, находящейся в эксплуатации. Виды программных документов регламентированы ГОСТ 19.101–77 «Единая система программной документации. Виды программ и программных документов» [2].
Разработка ПО для встраиваемых микропроцессоров производится на персональном компьютере с использованием специальных программных и аппаратных средств. Такой способ создания ПО носит название кросс-разработки. Совокупность аппаратных и программных средств, применяемых для разработки и отладки ПО, объединяют общим наименованием средства поддержки разработки. В настоящем лабораторном практикуме процесс разработки ПО изучается на примере языка ассемблера AVR -микроконтроллеров. Создание исходного текста программы, трансляция и отладка выполняются в интегрированной среде разработки (Integrated Development Environment – IDE) AVR Studio.
Работа в среде AVR Studio. В состав среды AVR Studio входит редактор исходных текстов, транслятор с языка ассемблера, отладчик и симулятор.
Транслятор работает с исходными программами на языке ассемблера, содержащими метки, директивы, команды и комментарии. Метка представляет собой символическое обозначение адреса (последовательность символов, заканчивающаяся двоеточием). Метки используются для указания места в программе, в которое передается управление при переходах, а также для задания имён переменных. Директивы являются инструкциями для транслятора и не заносятся в исполняемый код программы (список директив приведён в приложении 3). Директивы могут иметь один или несколько параметров. Команды записываются в программе в виде мнемонического обозначения выполняемой операции и могут иметь один или несколько операндов, т. е. аргументов, с которыми они вызываются. Транслятор позволяет указывать операнды в различных системах счисления: десятичной (по умолчанию, например, 15, 154), шестнадцатеричной (префикс 0х или $, например, 0x0f, $0f, 0x9a, $9a), восьмеричной (префикс – нуль, например, 017, 0232) и двоичной (префикс 0b, например, 0b00001111, 0b10011010). Строка программы должна быть не длиннее 120 символов и может иметь одну из четырёх форм:
[метка:].директива [параметры] [;Комментарий]
[метка:] команда [операнды] [;Комментарий]
[;Комментарий]
[Пустая строка]
Позиции в квадратных скобках необязательны. Текст после точки с запятой и до конца строки является комментарием и транслятором игнорируется. Включение в текст программы комментариев является признаком хорошего стиля программирования и облегчает её сопровождение. Кроме того, улучшению читаемости также способствует форматирование текста программы. При программировании на ассемблере выполнение этих правил особенно важно, так как программы на языке ассемблера неудобочитаемы.
Указать тип микроконтроллера, для которого транслируется программа, позволяет директива .device, например: