ГЛАВНАЯ Визы Виза в Грецию Виза в Грецию для россиян в 2016 году: нужна ли, как сделать

Программирование avr на ассемблере. Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера

Название: Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера 2 издание

Издательство: «БХВ-Петербург»

Год издания: 2011

Страниц: 354

Язык: Русский

Формат: DjVu

Размер: 12,2 Мб

Наложены принципы функционирования, особенности архитектуры и приемы программирования микроконтроллеров Atmel AVR.

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

7. Микроконтроллеры, их возникновение и применение
8. Предыстория микроконтроллеров
10. Электроника в греческом стиле
12. Почему AVR?
14. Что дальше?
17.ЧАСТЬ L ОБЩИЕ ПРИНЦИПЫ УСТРОЙСТВА И ФУНКЦИОНИРОВАНИЯ ATMEL AVR
19. Глава 1. Обзор микроконтроллеров Atmel AVR
21. Семейства AVR
23. Особенности практического использования МК AVR
23. О потреблении
25. Некоторые особенности применения AVR в схемах
27. Глава 2. Общее устройство, организация памяти, тактирование, сброс
27. Память программ
29. Память данных (ОЗУ, SRAM)
31. Энергонезависимая память данных (EEPROM)
32. Способы тактирования
34. Сброс
37. Глава 3. Знакомство с периферийными устройствами
38. Порты ввода-вывода
39. Таймеры-счетчики
41. Аналогово-цифровой преобразователь
42. Последовательные порты
43. UART
46. Интерфейс SPI
50. Интерфейс TWI (I2С)
50. Универсальный последовательный интерфейс USI
53. Глава 4. Прерывания и режимы энергосбережения
53. Прерывания
57. Разновидности прерываний
58. Режимы энергосбережения
61. ЧАСТЬ II. ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ ATMELAVR
63. Глава 5. Общие принципы программирования МК семейства AVR
63. Ассемблер или С?
67. Способы и средства программирования AVR
67. Редактор кода
68. Об AVR Studio
70. Обустройство ассемблера
71. Программаторы
75. О hex-файлах
78. Команды, инструкции и нотация AVR-ассемблера
79. Числа и выражения
80. Директивы и функции
84. Общая структура АVR-программы
85. Обработка прерываний
89. RESET
90. Простейшая программа
92. Задержка
94. Программа счетчика
96. Использование прерываний
97. Задержка по таймеру
98. Программа счетчика с использованием прерываний
101. О конфигурационных битах
105. Глава 6, Система команд AVR
105. Команды передачи управления и регистр SREG
111. Команды проверки-пропуска
113. Команды логических операций
114. Команды сдвига и операции с битами
116. Команды арифметических операций
118. Команды пересылки данных
122. Команды управления системой
123. Выполнение типовых процедур на ассемблере
125. О стеке, локальных и глобальных переменных
127. Глава 7. Арифметические операции
128. Стандартные арифметические операции
129. Умножение многоразрядных чисел
131. Деление многоразрядных чисел
134. Операции с дробными числами
136. Генератор случайных чисел
138. Операции с числами в формате BCD
143. Отрицательные числа в МК
147. Глава 8. Программирование таймеров
147. 8- и 16-разрядные таймеры
149. Формирование заданного значения частоты
153. Отсчет времени
158. Точная коррекция времени
160. Частотомер и периодомер
160. Частотомер
164. Периодомер
167. Управление динамической индикацией
168. LED-индикаторы и их подключение
171. Программирование динамической индикации
174. Таймеры в режиме PWM
179. Глава 9. Использование EEPROM
179. Еще раз о сохранности данных в EEPROM
181. Запись и чтение EEPROM
183. Хранение констант в EEPROM
187. Глава 10. Аналоговый компаратор и АЦП
187. Аналого-цифровые операции и их погрешности
190. Работа с аналоговым компаратором
193. Интегрирующий АЦП на компараторе
194. Принцип работы и расчетные формулы
198. Программа интегрирующего АЦП
201. Встроенный АЦП
204. Пример использования АЦП
206. Программа
215. Глава 11. Программирование SPI
215. Основные операции через SPI
216. Аппаратный вариант
218. Программный вариант
219. О разновидностях энергонезависимой памяти
221. Запись и чтение flash-памяти через SP!
224. Программа обмена с памятью 45DB011В по SPI
225. Запись и чтение flash-карт
225. Подключение карт ММС
228. Подача команд и инициализация ММС
232. Запись и чтение ММС
237. Глава 12. Интерфейс TW1 (I2С) и его практическое использование
237. Базовый протокол 1 2 С
240. Программная эмуляция протокола I 2 С
241. Запись данных во внешнюю энергонезависимую память
241. Режимы обмена с памятью АТ24
243. Программа
247. Часы с интерфейсом I 2 С
255. Запись данных
259. Чтение данных
261. Глава 13. Программирование UART/USART
262. Инициализация UART
263. Передача и прием данных
266. Пример установки часов DS1307 с помощью UART
271. Приемы защиты от сбоев при коммуникации
271. Проверка на четность
273. Как организовать корректный обмен
274. Дополнительные возможности USART
276. Реализация интерфейсов RS-232 и RS-485
280. Преобразователи уровня для RS-232
283. RS-485
285. Глава 14. Режимы энергосбережения и сторожевой таймер
286. Программирование режима энергосбережения
287. Пример прибора с батарейным питанием
289. Доработка программы
293. Использование сторожевого таймера
299. ПРИЛОЖЕНИЯ
301. Приложение 1. Основные параметры микроконтроллеров Atmel AVR
309. Приложение 2. Команды Atmel AVR
310. Арифметические и логические команды
311. Команды операций с битами
312. Команды сравнения
313. Команды передачи управления
313. Команды безусловного перехода и вызова подпрограмм
314. Команды проверки-пропуска и команды условного перехода
315. Команды переноса данных
316. Команды управления системой
317. Приложение 3. Тексты программ
317. Демонстрационная программа обмена данными с flash-памятью 45DB011В по интерфейсу SPI
321. Процедуры обмена по интерфейсу I2С
329. Приложение 4. Обмен данными с персональным компьютером и отладка программ через UART
329. Работа с СОМ-портом в Delphi
335. Установка линии RTS в DOS и Windows
337. Программа СОМ2000
339. Отладка программ с помощью эмулятора терминала
341. Приложение 5. Словарь часто встречающихся аббревиатур и терминов
347. Литература
349. Предметный указатель


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

Сейчас, написав первую статью из цикла, я понимаю, что несколько погорячился и сделал ту же ошибку, что и мои предшественники, поставив словосочетание "для начинающих". Вернее было бы сформулировать тему "Для начинающих программировать на ассемблере", то есть я предполагаю, что читатель уже имеет хотя бы поверхностное представление о том, что такое микроконтроллер, иначе только на знакомство с этой темой у нас уйдет уйма времени. Для тех же, кто совсем не знаком с ними, могу порекомендовать совершенно замечательный на мой взгляд цикл статей С. Рюмика "Микроконтроллеры AVR", опубликованный в журнале Радиоаматор (№№ 1-11 за 2005 год). В этом цикле в качестве базового контроллера выбран ATmega8, однако общие функциональные узлы у вышеназванного контроллера и ATtiny13 практически не отличаются.

Для знакомства же непосредственно с микроконтроллером ATtiny13 я рекомендую книгу А.В. Евстифеева "Микроконтроллеры AVR семейства tiny. Руководство пользователя" (М.: Издательский дом "Додэка-XXI", 2007. - 432 с.). Она содержит переведенные и систематизированные даташиты на весь номенклатурный ряд контроллеров семейства tiny, и, на мой взгляд, должна являться настольной для тех, кто занимается программированием микроконтроллеров.

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

Но все это лирическое отступление. Вернемся непосредственно к повествованию.

Контроллер ATtiny13 несмотря на свой малый размер, имеет весьма неплохие функциональные характеристики. А небольшое количество выводов с лихвой компенсируется количеством функций, которые каждый из них выполняет. Цоколевка и описание выводов представлено ниже:

Таблица взята из вышеназванной книги А.В. Евстифеева.

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

Как видно из рисунка и таблицы, все выводы, за исключением выводов питания, имеет название РВ с последующим порядковым номером. Что же это означает? Все выводы контроллера объединены по 8 штук для удобства работы с ними, а на каждую группу из 8 выводов выделено по три специальных регистра ввода-вывода. Вообще понятие регистров является ключевым при работе в контроллерами, особенно на ассемблере. Рассмотрим более подробно каждый из трех вышеупомянутых регистров. Все они являются однобайтовыми ячейкам в памяти контроллера. Каждый бит их отвечает один из выводов контроллера, причем номер бита в регистре совпадает с номером вывода (например, 0-й бит отвечает за вывод РВ0, 1-й - за РВ1 и т.д.). Все регистры имеют свое имя, по которому к ним обращаются при написании программ. Что же это за имена?

1. Регистр DDRB отвечает за направление передачи информации каждого вывода контроллера. Если какой-либо бит этого регистра равен "0", то соответствующий ему вывод будет входом, а если "1" - то выходом. Причем каждый вывод конфигурируется индивидуально и в любом месте программы. Это значит, что при разных условиях или в разное время один и тот же вывод может быть сконфигурирован как вход либо как выход, причем независимо от остальных выводов.

2. Регистр PINB содержит в себе текущее состояние всех выводов: если на вывод подано напряжение, то в соответствующий бит записывается логическая "1", если напряжение отсутствует - логический "0". В основном этот регистр используется для считывания состояния вывода, находящегося в режиме входа.

3. Регистр PORTB выполняет двоякую функцию в зависимости направления передачи информации. Если вывод работает как цифровой выход, то запись "1" в какой-либо бит регистра PORTB приводит к появлению напряжения на соответствующем выводе, а запись "0" - к исчезновению напряжения. Таким образом, в режиме выхода именно этот регистр определяет состояние каждого вывода. В режиме цифрового входа запись логической "1" в какой-либо бит приводит к подключению встроенного подтягивающего резистора на соответствующем выводе, а запись "0" - к его отключению. Что же это за такая штука - "подтягивающий резистор", и для чего она предназначена? Если вывод работает как цифровой вход, то сопротивление входного буфера достаточно велико, а входной ток - весьма мал. Поэтому любые электрические наводки могут привести к самопроизвольному переключению вывода в произвольное состояние. Чтобы этого не происходило, между входом и источником питания включается резистор сопротивлением несколько десятков килоом, "подтягивающий" потенциал входа к напряжению питания (отсюда и название). Ток, протекающий через этот резистор достаточно мал, чтобы не мешать работе остальной схемы, но достаточно велик, чтобы воспрепятствовать случайным переключениям вывода. Мы часто будем использовать подтягивающие резисторы при работе с кнопками, поскольку когда они не нажаты, выводы, к которым они подключены, фактически "висят" в воздухе и подвержены наводкам.

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

Теперь, когда мы имеем хоть какое-то представление, ЧТО нужно для работы с вводами контроллера, пришла пора узнать, КАК с ними работать.

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

1. Заходим в папку asm, создаем в ней новую папку. Переименовываем в удобное для нас имя. Для определенности я буду называть их по номеру нашего шага. В данном случае "step2".

2. Правой кнопкой щелкаем на файле build.bat и изменяем путь к исходному файлу, указывая вновь созданную папку (step2). У меня после этого содержимое выглядит так:

"F:\Prog\AVR\asm\avrasm32 -fI %F:\Prog\AVR\asm\step2\main.asm
pause"

У вас оно может отличаться в зависимости от того, куда вы распаковали архив.

3. Заходим в папку Asmedit и запускаем программу ASM_Ed.exe

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

Что же собой представляет текст ассемблерной программы? Он может включать в себя несколько элементов, записываемых по определенным правилам:

Команды ассемблера с операндами или без них в зависимости от синтаксиса команды. Между именем команды и первым операндом должен быть либо пробел, либо знак табуляции, либо и то и другое в любом количестве. Операнды разделяются между собой запятой, до и после которой может стоять также произвольное количество пробелов либо знаков табуляции;

Директивы, каждая из которых начинается с символа ".";

Метки, представляющие собой произвольно названные пользователем места программы, к которым может потребоваться переход. Каждая метка оканчивается символом ":";

Комментарии, начинающиеся с символа ";". Весь текст от начала комментария до конца строки игнорируется при создании hex-файла и может быть совершенно произвольным;

Пустые строки для лучшей структурированности и читабельности программы.

В каждой строке может быть не более одной команды. Однако одновременное присутствие в строке метки с последующей командой и комментарием допускается.

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

.include "F:\Prog\AVR\asm\Appnotes\tn13def.inc"
sbi DDRB, 4 ;РВ4 - выход (светодиод LED2)
sbi PORTB, 2 ;Включение подтягивающего резистора на РВ2 (кнопка SB1)
sbic PINB, 2 ;Если РВ2=0 (кнопка нажата), пропустить след. строку
sbi PORTB, 4 ;Установка РВ4 в 1 (выключение светодиода)
sbis PINB, 2 ;Если РВ2=1 (кнопка отпущена), пропустить след. строку
cbi PORTB, 4 ;Установка РВ4 в 0 (включение светодиода)

Разберем его поподробнее. Первая строка содержит директиву "include", написанную по указанным выше правилам с точкой в начале. Назначение ее - включать в текст программы указанный за ней файл. Как я говорил еще в первом шаге, нам потребуется файл "tn13def.inc". В этой строке вам необходимо будет изменить путь, указав расположение папки Appnotes в своем компьютере. Зачем же нам нужно подключать этот файл? Любопытный читатель может заглянуть в него и почитать его содержимое, но, скорее всего, поначалу он мало что поймет там. Пока же скажу, что в нем содержится соответствие имен регистров, которые по умолчанию ассемблер не знает, с их физическими адресами в контроллере.

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

Команда sbi имеет два операнда: первый - имя регистра, второй - номер бита. В результате ее выполнения указанный бит в указанном регистре устанавливается в "1".

Команда cbi по синтаксису аналогична вышеприведенной и выполняет прямо противоположную функцию - сбрасывает указанный бит в указанном регистре в "0".

Команда sbis также аналогична по синтаксису вышеприведенным. Однако в отличие от них она не выполняет никаких операций с регистрами, а лишь проверяет состояние указанного бита в указанном регистре, и если тот равен "1", пропускает следующую за командой строку. В противном же случае следующая за ней строка выполняется, равно как и все остальные за ней.

Команда sbiс является противоположностью команды sbis. Она пропускает следующую строку, если указанный бит регистра равен "0".

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

1 строка. Директивой include подключается файл tn13def.inc, содержащий определения регистров.

2 строка. Командой sbi устанавливается "1" в бит 4 регистра DDRB, тем самым вывод РВ4 переключается на выход. Если посмотреть схему платы (рис. 1 предыдущего шага), можно видеть, что к этому выводу подключен светодиод LED2. После команды и знака ";" написан комментарий, кратко поясняющий смысл выполняемых в строке действий.

3 строка. Той же командой sbi устанавливается "1" в бит 2 регистра PORTB, подключая внутренний подтягивающий резистор к выводу РВ2, к которому подключена кнопка SB1. Поскольку мы не изменяли состояние бита 2 регистра DDRB, этот вывод так и останется входом, что нам, собственно, и нужно.

4 строка. Командой sbic проверяется наличие логического "0" на входе PB2, используя регистр PINB. Если внимательно посмотреть на схему, можно увидеть, что кнопки при нажатии, замыкают соответствующий вывод с общим проводом. Это стандартный прием, поскольку при отпущенной кнопке на выводе присутствует логическая "1" за счет подтягивающего резистора, а при нажатой появляется логический "0" благодаря подключению вывода к общему проводу. Итак, если на выводе РВ2 присутствует логический "0", то есть кнопка нажата, мы пропускаем следующую строку, а если кнопка отпущена, то выполняем ее.

5 строка. В ней командой sbi устанавливается логическая "1" в бит 4 регистра PORTB, тем самым выключая светодиод LED2. Въедливый читатель может поинтересоваться, почему же светодиод выключается, если мы подаем напряжение на выход. Ответ кроется в схеме. Светодиод анодом подключен к проводу питания, а катодом к выводу контроллера. Поэтому если подать на вывод напряжение, то потенциалы анода и катода сравняются, и светодиод погаснет. Если же на вывод выдать логический "0", то к светодиоду будет приложено напряжение, и он зажжется. Таким образом пара строк 4 и 5 выключает светодиод LED2 при отпущенной кнопке.

6 строка. Противоположна по смыслу 4-й. Командой sbis проверяется наличие логической "1" на входе РВ2, то есть проверяется, отпущена ли кнопка. Если кнопка отпущена, то следующая строка пропускается, и происходит переход к следующей за ней. Но поскольку 7-я строка последняя, то происходит переход ко 2-й строке. Если же кнопка нажата, то выполняется строка 7.

7 строка. Противоположна 5-й. Командой cbi бит 4 регистра PORTB сбрасывается в "0", тем самым включая светодиод LED2. Таким образом, пара строк 6 и 7 включает светодиод LED2 при нажатой кнопке SB1.

Как видите, ничего особо сложного мы не совершили. Используя знание всего 3-х регистров и 4-х команд, мы написали нашу первую программу. Что же делать с ней дальше. Если вы еще не забыли, мы продолжаем писать алгоритм создания программы.

5. Написав текст программы в окне редактора, выбираем пункт меню "File", и в открывшемся списке нажимаем "Save As...". В окне сохранения файла выбираем созданную нами папку step2 и указываем имя файла "main", поскольку именно это имя было задано нами в файле "build.bat"

После сохранения окно программы должно иметь следующий вид:

6. Создаем hex-файл. Для этого нажимаем кнопку "II" на панели инструментов. Должно появится окно следующего вида:

Оно извещает нас о том, что ассемблирование прошло без ошибок и создан файл прошивки "main.hex" объемом 6 слов, то есть 12 байт. Замечу, что аналогичная программа на языке Си имела бы как минимум в 5 раз больший объем.

7. Зайдя в папку step2, обнаруживаем в ней пополнение в виде вновь созданного файла main.hex, который теперь может быть зашит в контроллер любым программатором, что и необходимо выполнить, дабы увидеть результаты работы написанной нами программы. После прошивки контроллера, если схема собрана правильно, все должно работать по разработанному нами алгоритму: при отпущенных кнопках светодиод LED2 должен быть погашен, а во время удержания нажатой кнопки SB1 - зажжен.

До следующего шага предлагаю сделать такие задания:

1. Добавить к программе обработку нажатия кнопки SB2 с противоположным алгоритмом: при отпущенной кнопке SB2 светодиод LED1 должен быть зажжен, а при нажатой - погашен.

2. Написать программу управления светодиодом LED2 при помощи обеих кнопок. При нажатии на кнопку SB1 светодиод должен зажигаться и оставаться включенным до тех пор, пока не будет нажата кнопка SB2, которая выключает его до следующего нажатия SB1.

Компилятор транслирует исходные коды с языка ассемблера в объектный код. Полученный объектный код можно использовать в симуляторе ATMEL AVR Studio, либо в эмуляторе ATMEL AVR In-Circuit Emulator. Компилятор также генерирует код, который может быть непосредственно запрограммирован в микроконтроллеры AVR.

Компилятор генерирует код, который не требует линковки.

Компилятор работает под Microsoft Windows 3.11, Microsoft Windows95 и Microsoft Windows NT. Кроме этого есть консольная версия для MS-DOS.

Набор инструкций семейства микроконтроллеров AVR описан в данном документе кратко, для более полной информации по инструкциям обращайтесь к полному описанию инструкций и документации по конкретному микроконтроллеру.

Исходные коды

Компилятор работает с исходными файлами, содержащими инструкции, метки и директивы. Инструкции и директивы, как правило, имеют один или несколько операндов.

Строка кода не должна быть длиннее 120 символов.

Любая строка может начинаться с метки, которая является набором символов заканчивающимся двоеточием. Метки используются для указания места, в которое передаётся управление при переходах, а также для задания имён переменных.

Входная строка может иметь одну из четырёх форм:

[метка:] директива [операнды] [Комментарий] [метка:] инструкция [операнды] [Комментарий] Комментарий Пустая строка

Комментарий имеет следующую форму:

; [Текст]

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

Примеры:

label: .EQU var1=100 ; Устанавливает var1 равным 100 (Это директива) .EQU var2=200 ; Устанавливает var2 равным 200

test: rjmp test ; Бесконечный цикл (Это инструкция) ; Строка с одним только комментарием

; Ещё одна строка с комментарием

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

Инструкции процессоров avr

Ниже приведен набор команд процессоров AVR, более детальное описание их можно найти в AVR Data Book.

Арифметические и логические инструкции

Мнемоника

Операнды

Описание

Операция

Флаги

Циклы

Rd ,Rr

Суммирование без переноса

Rd ,Rr

Суммирование с переносом

Rd = Rd + Rr + C

Rd ,Rr

Вычитание без переноса

Rd ,K8

Вычитание константы

Rd ,Rr

Вычитание с переносом

Rd = Rd - Rr - C

Rd ,K8

Вычитание константы с переносом

Rd = Rd - K8 - C

Rd ,Rr

Логическое И

Rd ,K8

Логическое И с константой

Rd ,Rr

Логическое ИЛИ

Rd ,K8

Логическое ИЛИ с константой

Rd ,Rr

Логическое исключающее ИЛИ

Побитная Инверсия

Изменение знака (Доп. код)

Rd ,K8

Установить бит (биты) в регистре

Rd ,K8

Сбросить бит (биты) в регистре

Rd = Rd · ($FF - K8)

Инкрементировать значение регистра

Декрементировать значение регистра

Проверка на ноль либо отрицательность

Очистить регистр

Установить регистр

Rdl ,K6

Сложить константу и слово

Rdh:Rdl = Rdh:Rdl + K6

Rdl ,K6

Вычесть константу из слова

Rdh:Rdl = Rdh:Rdl - K 6

Rd ,Rr

Умножение чисел без знака

R1:R0 = Rd * Rr

Rd ,Rr

Умножение чисел со знаком

R1:R0 = Rd * Rr

Rd ,Rr

Умножение числа со знаком с числом без знака

R1:R0 = Rd * Rr

Rd ,Rr

Умножение дробных чисел без знака

R1:R0 = (Rd * Rr) << 1

Rd ,Rr

Умножение дробных чисел со знаком

R1:R0 = (Rd *Rr) << 1

Rd ,Rr

Умножение дробного числа со знаком с числом без знака

R1:R0 = (Rd * Rr) << 1

Инструкции ветвления

Мнемоника

Операнды

Описание

Операция

Флаги

Циклы

Относительный переход

Косвенный переход на (Z )

Расширенный косвенный переход на (Z )

STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND

Относительный вызов подпрограммы

STACK = PC+1, PC = PC + k + 1

Косвенный вызов (Z )

STACK = PC+1, PC = Z

Расширенный косвенный вызов (Z )

STACK = PC+1, PC(15:0) = Z, PC(21:16) =EIND

Вызов подпрограммы

STACK = PC+2, PC = k

Возврат из подпрограммы

Возврат из прерывания

Rd ,Rr

Сравнить, пропустить если равны

if (Rd ==Rr) PC = PC 2 or 3

Rd ,Rr

Сравнить

Rd ,Rr

Сравнить с переносом

Rd ,K8

Сравнить с константой

Rr ,b

Пропустить если бит в регистре очищен

if(Rr(b)==0) PC = PC + 2 or 3

Rr ,b

Пропустить если бит в регистре установлен

if(Rr(b)==1) PC = PC + 2 or 3

P ,b

Пропустить если бит в порту очищен

if(I/O(P,b)==0) PC = PC + 2 or 3

P ,b

Пропустить если бит в порту установлен

if(I/O(P,b)==1) PC = PC + 2 or 3

s ,k

Перейти если флаг в SREG очищен

if(SREG(s)==0) PC = PC + k + 1

s ,k

Перейти если флаг в SREG установлен

if(SREG(s)==1) PC = PC + k + 1

Перейти если равно

if(Z==1) PC = PC + k + 1

Перейти если не равно

if(Z==0) PC = PC + k + 1

Перейти если перенос установлен

if(C==1) PC = PC + k + 1

Перейти если перенос очищен

if(C==0) PC = PC + k + 1

Перейти если равно или больше

if(C==0) PC = PC + k + 1

Перейти если меньше

if(C==1) PC = PC + k + 1

Перейти если минус

if(N==1) PC = PC + k + 1

Перейти если плюс

if(N==0) PC = PC + k + 1

Перейти если больше или равно (со знаком)

if(S==0) PC = PC + k + 1

Перейти если меньше (со знаком)

if(S==1) PC = PC + k + 1

Перейти если флаг внутреннего переноса установлен

if(H==1) PC = PC + k + 1

Перейти если флаг внутреннего переноса очищен

if(H==0) PC = PC + k + 1

Перейти если флаг T установлен

if(T==1) PC = PC + k + 1

Перейти если флаг T очищен

if(T==0) PC = PC + k + 1

Перейти если флаг переполнения установлен

if(V==1) PC = PC + k + 1

Перейти если флаг переполнения очищен

if(V==0) PC = PC + k + 1

Перейти если прерывания разрешены

if(I==1) PC = PC + k + 1

Перейти если прерывания запрещены

if(I==0) PC = PC + k + 1

* Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций CALL, ICALL, EICALL, RCALL, RET и RETI, необходимо добавить три цикла плюс по два цикла для каждого ожидания в контроллерах с PC меньшим 16 бит (128KB памяти программ). Для устройств с памятью программ свыше 128KB , добавьте пять циклов плюс по три цикла на каждое ожидание.

Инструкции передачи данных

Мнемоника

Операнды

Описание

Операция

Флаги

Циклы

Rd ,Rr

Скопировать регистр

Rd ,Rr

Скопировать пару регистров

Rd+1:Rd = Rr+1:Rr, r,d even

Rd ,K8

Загрузить константу

Rd ,k

Rd ,X

Rd ,X+

Rd = (X), X=X+1

Rd ,-X

X=X-1, Rd = (X)

Rd ,Y

Rd ,Y+

Rd = (Y), Y=Y+1

Rd ,-Y

Y=Y-1, Rd = (Y)

Rd ,Y +q

Rd ,Z

Rd ,Z+

Rd = (Z), Z=Z+1

Rd ,-Z

Z=Z-1, Rd = (Z)

Rd ,Z +q

Прямое сохранение

X ,Rr

Косвенное сохранение

X+ ,Rr

(X) = Rr, X=X+1

-X ,Rr

Y ,Rr

Косвенное сохранение

Y+ ,Rr

Косвенное сохранение с пост-инкрементом

(Y) = Rr, Y=Y+1

-Y ,Rr

Косвенное сохранение с пре-декрементом

Y=Y-1, (Y) = Rr

Y +q ,Rr

Z ,Rr

Косвенное сохранение

Z+ ,Rr

Косвенное сохранение с пост-инкрементом

(Z) = Rr, Z=Z+1

-Z ,Rr

Косвенное сохранение с пре-декрементом

Z=Z-1, (Z) = Rr

Z +q ,Rr

Косвенное сохранение с замещением

R0 = (Z )

Rd ,Z

Rd = (Z )

Rd ,Z+

Rd = (Z ), Z=Z+1

R0 = (RAMPZ:Z )

Rd ,Z

Rd = (RAMPZ:Z )

Rd ,Z+

Rd = (RAMPZ:Z ), Z = Z+1

Сохранение в программной памяти

(Z ) = R1:R0

Расширенное сохранение в программной памяти

(RAMPZ:Z ) = R1:R0

Rd ,P

Чтение порта

P ,Rr

Запись в порт

Занесение регистра в стек

Извлечение регистра из стека

* Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций LD, ST, LDD, STD, LDS, STS, PUSH и POP, необходимо добавить один цикл плюс по одному циклу для каждого ожидания.

Инструкции работы с битами

Мнемоника

Операнды

Описание

Операция

Флаги

Циклы

Логический сдвиг влево

Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7)

Логический сдвиг вправо

Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0)

Циклический сдвиг влево через C

Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7)

Циклический сдвиг вправо через C

Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0)

Арифметический сдвиг вправо

Rd(n)=Rd(n+1), n=0,...,6

Перестановка тетрад

Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0)

Установка флага

Очистка флага

P ,b

Установить бит в порту

P ,b

Очистить бит в порту

Rr ,b

Rd ,b

Загрузить бит из T в регистр

Установить флаг переноса

Очистить флаг переноса

Установить флаг отрицательного числа

Очистить флаг отрицательного числа

Установить флаг нуля

Очистить флаг нуля

Установить флаг прерываний

Очистить флаг прерываний

Установить флаг числа со знаком

Очистить флаг числа со знаком

Установить флаг переполнения

Очистить флаг переполнения

Установить флаг T

Очистить флаг T

Установить флаг внутреннего переноса

Очистить флаг внутреннего переноса

Нет операции

Спать (уменьшить энергопотребление)

Смотрите описание инструкции

Сброс сторожевого таймера

Смотрите описание инструкции

Ассемблер не различает регистр символов.

Операнды могут быть таких видов.

Ревич Ю. В.

Практическое программирование микроконтроллеров Atmel AVR на языке
ассемблера. - 2-е изд., испр. -

Изложены принципы функционирования, особенности архитектуры и приемы

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

Для учащихся, инженерно-технических работников и радиолюбителей

Группа подготовки издания:

Главный редактор

Екатерина Кондукова

Зам. главного редактора

Игорь Шишигин

Зав. редакцией

Григорий Добин

Редактор

Юрий Рожко

Компьютерная верстка

Ольги Сергиенко

Корректор

Зинаида Дмитриева

Оформление обложки

Елены Беляевой

Зав. производством

Николай Тверских

Микроконтроллеры, их возникновение и применение........................................... 7

Предыстория микроконтроллеров................................................................................................. 8

Электроника в греческом стиле................................................................................................... 10

Почему AVR? ................................................................................................................................ 12

ЧАСТЬ I. ОБЩИЕ ПРИНЦИПЫ УСТРОЙСТВА
И ФУНКЦИОНИРОВАНИЯ ATMEL AVR ............................................................. 17

Глава 1. Обзор микроконтроллеров Atmel AVR .................................................... 19

Семейства AVR ............................................................................................................................. 21

Особенности практического использования МК AVR .............................................................. 23

О потреблении....................................................................................................................... 23

Некоторые особенности применения AVR в схемах......................................................... 25

Глава 2. Общее устройство, организация памяти, тактирование, сброс........... 27

Память программ.......................................................................................................................... 27

Память данных (ОЗУ, SRAM) ...................................................................................................... 29

Энергонезависимая память данных (EEPROM) ......................................................................... 31

Способы тактирования................................................................................................................. 32

Сброс.............................................................................................................................................. 34

Глава 3. Знакомство с периферийными устройствами......................................... 37

Порты ввода-вывода..................................................................................................................... 38

Таймеры-счетчики........................................................................................................................ 39

Аналогово-цифровой преобразователь....................................................................................... 41

Последовательные порты............................................................................................................. 42

UART...................................................................................................................................... 43

Интерфейс SPI ....................................................................................................................... 46

Интерфейс TWI (I

C) ............................................................................................................ 50

Универсальный последовательный интерфейс USI ........................................................... 50

Глава 4. Прерывания и режимы энергосбережения.............................................. 53

Прерывания................................................................................................................................... 53

Разновидности прерываний.................................................................................................. 57

Режимы энергосбережения.......................................................................................................... 58

ЧАСТЬ II. ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ
ATMEL AVR .................................................................................................................. 61

Глава 5. Общие принципы программирования МК семейства AVR ................. 63

Ассемблер или С? ......................................................................................................................... 63

Способы и средства программирования AVR ............................................................................ 67

Редактор кода........................................................................................................................ 67

Об AVR Studio ....................................................................................................................... 68

Обустройство ассемблера..................................................................................................... 70

Программаторы..................................................................................................................... 71

О hex-файлах......................................................................................................................... 75

Команды, инструкции и нотация AVR-ассемблера................................................................... 78

Числа и выражения............................................................................................................... 79

Директивы и функции........................................................................................................... 80

Общая структура AVR-программы............................................................................................. 84

Обработка прерываний......................................................................................................... 85

RESET .................................................................................................................................... 89

Простейшая программа................................................................................................................ 90

Задержка................................................................................................................................ 92

Программа счетчика............................................................................................................. 94

Использование прерываний......................................................................................................... 96

Задержка по таймеру............................................................................................................. 97

Программа счетчика с использованием прерываний......................................................... 98

О конфигурационных битах....................................................................................................... 101

Глава 6. Система команд AVR ................................................................................. 105

Команды передачи управления и регистр SREG ...................................................................... 105

Команды проверки-пропуска..................................................................................................... 111

Команды логических операций................................................................................................. 113

Команды сдвига и операции с битами...................................................................................... 114

Команды арифметических операций......................................................................................... 116

Команды пересылки данных...................................................................................................... 118

Команды управления системой................................................................................................. 122

Выполнение типовых процедур на ассемблере........................................................................ 123

О стеке, локальных и глобальных переменных........................................................................ 125

Глава 7. Арифметические операции....................................................................... 127

Стандартные арифметические операции.................................................................................. 128

Умножение многоразрядных чисел................................................................................... 129

Деление многоразрядных чисел........................................................................................ 131

Операции с дробными числами......................................................................................... 134

Генератор случайных чисел....................................................................................................... 136

Операции с числами в формате BCD ........................................................................................ 138

Отрицательные числа в МК....................................................................................................... 143

Глава 8. Программирование таймеров.................................................................. 147

8- и 16-разрядные таймеры........................................................................................................ 147

Формирование заданного значения частоты............................................................................ 149

Отсчет времени........................................................................................................................... 153

Точная коррекция времени................................................................................................ 158

Частотомер и периодомер.......................................................................................................... 160

Частотомер.......................................................................................................................... 160

Периодомер......................................................................................................................... 164

Управление динамической индикацией.................................................................................... 167

LED-индикаторы и их подключение................................................................................. 168

Программирование динамической индикации................................................................. 171

Таймеры в режиме PWM ............................................................................................................ 174

Глава 9. Использование EEPROM .......................................................................... 179

Еще раз о сохранности данных в EEPROM .............................................................................. 179

Запись и чтение EEPROM .......................................................................................................... 181

Хранение констант в EEPROM .................................................................................................. 183

Глава 10. Аналоговый компаратор и АЦП............................................................ 187

Аналого-цифровые операции и их погрешности..................................................................... 187

Работа с аналоговым компаратором......................................................................................... 190

Интегрирующий АЦП на компараторе..................................................................................... 193

Принцип работы и расчетные формулы............................................................................ 194

Программа интегрирующего АЦП.................................................................................... 198

Встроенный АЦП........................................................................................................................ 201

Пример использования АЦП..................................................................................................... 204

Программа........................................................................................................................... 206

Глава 11. Программирование SPI ........................................................................... 215

Основные операции через SPI ................................................................................................... 215

Аппаратный вариант........................................................................................................... 216

Программный вариант........................................................................................................ 218

О разновидностях энергонезависимой памяти......................................................................... 219

Запись и чтение flash-памяти через SPI .................................................................................... 221

Программа обмена с памятью 45DB011B по SPI ............................................................. 224

Запись и чтение flash-карт.......................................................................................................... 225

Подключение карт ММС.................................................................................................... 225

Подача команд и инициализация ММС............................................................................ 228

Запись и чтение ММС......................................................................................................... 232

Глава 12. Интерфейс TWI (I

C) и его практическое использование................ 237

Базовый протокол I

C ................................................................................................................. 237

Программная эмуляция протокола I

C ...................................................................................... 240

Запись данных во внешнюю энергонезависимую память....................................................... 241

Режимы обмена с памятью AT24 ...................................................................................... 241

Программа........................................................................................................................... 243

Часы с интерфейсом I

C ............................................................................................................. 247

Запись данных..................................................................................................................... 255

Чтение данных..................................................................................................................... 259

Глава 13. Программирование UART/USART ........................................................ 261

Инициализация UART ................................................................................................................ 262

Передача и прием данных.......................................................................................................... 263

Пример установки часов DS1307 с помощью UART .............................................................. 266

Приемы защиты от сбоев при коммуникации.......................................................................... 271

Проверка на четность......................................................................................................... 271

Как организовать корректный обмен................................................................................ 273

Дополнительные возможности USART .................................................................................... 274

Реализация интерфейсов RS-232 и RS-485 ............................................................................... 276

Преобразователи уровня для RS-232 ................................................................................. 280

RS-485 .................................................................................................................................. 283

Глава 14. Режимы энергосбережения и сторожевой таймер.............................. 285

Программирование режима энергосбережения....................................................................... 286

Пример прибора с батарейным питанием................................................................................. 287

Доработка программы........................................................................................................ 289

Использование сторожевого таймера....................................................................................... 293

ПРИЛОЖЕНИЯ.......................................................................................................... 299

Приложение 1. Основные параметры микроконтроллеров Atmel AVR .......... 301

Приложение 2. Команды Atmel AVR ...................................................................... 309

Арифметические и логические команды.................................................................................. 310

Команды операций с битами...................................................................................................... 311

Команды сравнения.................................................................................................................... 312

Команды передачи управления.................................................................................................. 313

Команды безусловного перехода и вызова подпрограмм............................................... 313

Команды проверки-пропуска и команды условного перехода........................................ 314

Команды переноса данных......................................................................................................... 315

Команды управления системой................................................................................................. 316

Приложение 3. Тексты программ............................................................................ 317

Демонстрационная программа обмена данными с flash-памятью 45DB011B
по интерфейсу SPI....................................................................................................................... 317

Процедуры обмена по интерфейсу I

C ...................................................................................... 321

Приложение 4. Обмен данными с персональным компьютером
и отладка программ через UART ............................................................................. 329

Работа с СОМ-портом в Delphi .................................................................................................. 329

Установка линии RTS в DOS и Windows .................................................................................. 335

Программа COM2000 ................................................................................................................. 337

Отладка программ с помощью эмулятора терминала............................................................. 339

Приложение 5. Словарь часто встречающихся аббревиатур и терминов....... 341

Литература................................................................................................................... 347

Предметный указатель.............................................................................................. 349

В В Е Д Е Н И Е

Микроконтроллеры,
их возникновение и применение

Говорят, что в 1960-е годы, наблюдая за участниками студенческих демонстраций
протеста, Гордон Мур заметил: "Истинные революционеры - это мы". Ученик и
сотрудник одного из изобретателей транзистора У. Шокли, в числе прочего счи-
тающегося основателем знаменитой Кремниевой долины, в свою очередь основа-
тель и лидер компаний, которым суждено было сыграть ведущую роль в развитии
микроэлектроники, Мур знал, что говорил. Парадоксальным образом именно
изобретениям Мура и его сотрудников было суждено стать основой того мира,
в котором впоследствии сконцентрировалась деятельность "бунтующей молодежи"
1960-х. Современные хакеры (не компьютерные хулиганы из газет, а настоящие
увлеченные своим делом компьютерщики) - прямые идеологические наследники
сорбоннских студентов и американских демонстрантов, сменившие девиз "Make
love not war"

на "Не пишите лозунги - пишите код". Неслучайно многие извест-

ные деятели электронно-компьютерной индустрии, авторы изобретений, сформи-
ровавших лицо современного мира, - выходцы из среды, близкой той самой "бун-
тующей молодежи".
Наша история о микроконтроллерах началась с того, что в 1957 г. Гордон Мур со-
вместно с Робертом Нойсом, ставшим впоследствии одним из изобретателей мик-
росхемы, и еще шестью сотрудниками Shockley Semiconductor Labs (Шокли назвал
их "предательской восьмеркой"), основал компанию Fairchild Semiconductor. Ей мы
обязаны не только развитием полупроводникового рынка и внедрением микросхем
в инженерную практику, но и тем, что она стала своеобразной кузницей кадров и
генератором идей для молодой отрасли.
Вот только некоторые из исторических фактов. Сам Мур с Нойсом в конце 1960-х
создали фирму Integrated Electronics, которая под сокращенным названием Intel
сейчас знакома каждому школьнику. Джереми Сандерс, основатель другой извест-
нейшей компании - AMD, также вышел из Fairchild, где отличился открытием со-
временной экономической модели производства и продаж полупроводниковых
компонентов, в которой себестоимость изделия стремится к нулю по мере повыше-

"Занимайтесь любовью, а не войной" - лозунг хиппи 1960-х, протестующих против войны во Вьет-

Введение

ния объема партии. Чарли Спорк, один из ключевых менеджеров Fairchild, в 1967 г.
стал директором National Semiconductor, которой впоследствии руководил четверть
века. Половина "предательской восьмерки" - Джин Хоерни, Евгений Клайнер,
Джей Ласт и Шелдон Робертс - в 1961 г. основала компанию Amelco, из которой
впоследствии выросли всем известные теперь Intersil, Maxim и Ixys. Сотруднику
Fairchild Роберту Видлару мы обязаны изобретением операционных усилителей -
разновидности микросхем, и по сей день уступающей по популярности разве что
микропроцессорам. Мало того, с историей Fairchild связано возникновение извест-
ной венчурной (т. е. "рисковой") модели финансирования, сыгравшей определяю-
щую роль в развитии всех отраслей, связанных с электроникой, компьютерами и
телекоммуникациями. Недаром Fairchild нередко называют "праматерью всей элек-
троники".

Предыстория микроконтроллеров

Из всего этого урагана событий для нашего повествования важно то, что в числе
прочих инноваций сотрудники Fairchild первыми стали продвигать полупроводни-
ковую память. Сейчас, в век СD и DVD, жестких дисков и flash-карточек, нам
трудно представить себе, что в начале 1960-х годов программы для компьютеров
хранились в основном на картонных листочках (перфокартах), конструкторы лома-
ли голову над дорогущими модулями ОЗУ на ртутных линиях задержки, осцилло-
графических трубках и ферритовых колечках, где каждый бит "прошивался" вруч-
ную. Самое компактное в те годы электронное устройство для хранения данных на
магнитных дисках под названием RAMAC 305 емкостью 5 Мбайт было размером
с промышленный холодильник и сдавалось в аренду за 5 тыс. долларов в месяц.
Единственным "лучом света" в темном царстве этих монстров стало изобретение
сотрудника корпорации American Bosch Arma Йен Чоу, который в 1956 г. получил
патент на устройство, известное теперь как "однократно программируемое ROM"
(OTP ROM

). В этом патенте, между прочим, впервые был употреблен термин

"прожиг" (burn) - микромодуль состоял из матрицы с плавкими перемычками, ко-
торые при программировании пережигались подачей на них большого напряжения.
OTP ROM долгое время оставались единственными устройствами для компактного
хранения данных, и не потеряли своего значения до самого последнего времени -
не меньше четверти микроконтроллеров в мире, особенно из тех, что попроще, до
сих пор выпускается именно с такой однократно программируемой встроенной па-
мятью, ввиду крайней ее дешевизны. И лишь в последние годы "прожигаемая" па-
мять стала постепенно вытесняться более удобной flash-памятью, когда последняя
подешевела настолько, что смысл в использовании OTP ROM почти пропал.
Но вернемся в 1960-е. Компактная полупроводниковая память была нужна абсо-
лютно всем - от военных и NASA до изготовителей бытовых приборов. Сначала
Fairchild предложила то, что сегодня называется DRAM, в частности, на таких мик-
росхемах (32 768 чипов емкостью 256 бит каждый) была построена память знаме-

Расшифровку некоторых аббревиатур см. в приложении 5 .

нитого суперкомпьютера ILLIAC-IV, конкурента отечественной БЭСМ-6. Почуяв,
откуда дует ветер, в 1968 г. Мур с Нойсом оставили Fairchild и основали Intel, как
специализированную компанию по разработке и производству памяти. Они еще не
ведали, что самым популярным детищем Intel станет вовсе не память, а небольшой
приборчик (рис. В1), названный микропроцессором, разработка которого первона-
чально затевалась как вспомогательный этап в проектировании обычного калькуля-
тора.

Рис. В1. Микропроцессор

И

ЗОБРЕТЕНИЕ МИКРОПРОЦЕССОРА

В 1969 г. в Intel появились несколько человек из Busicom - молодой японской компа-
нии, занимающейся производством калькуляторов. Им требовался набор из 12 инте-
гральных схем в качестве основного элемента нового дешевого настольного калькуля-
тора. Проект был разработан Масатоши Шима, который и представлял японскую сто-
рону. Тед Хофф (Marcian E. Ted Hoff, р. 1937 г.), руководитель отдела, занимавшегося
разработкой применений для продукции Intel, ознакомившись с проектом, понял, что
вместо того, чтобы создавать калькулятор с некоторыми возможностями программи-
рования, можно сделать наоборот, компьютер, программируемый для работы в каче-
стве калькулятора. Развивая идею, в течение осени 1969 г. Хофф определился с ар-
хитектурой будущего микропроцессора. Весной в отдел Хоффа пришел (все из той же
уже известной нам Fairchild) новый сотрудник Фредерик Фэггин (Federico Faggin), кото-
рый и придумал название для всей системы: "семейство 4000". Семейство состояло
из четырех 16-выводных микросхем: 4001 содержал ROM на 2 Кбайта; 4002 - RAM с
4-

битовым выходным портом для загрузки программ; 4003 представлял собой 10-бито-

вый расширитель ввода-вывода с последовательным вводом и параллельным выво-
дом для связи с клавиатурой, индикатором и другими внешними устройствами; нако-
нец 4004 был 4-битовым ЦПУ (центральным процессорным устройством). Это ЦПУ
содержало 2300 транзисторов и работало на тактовой частоте 108 кГц. 15 ноября
1971

г. было объявлено о создании первого микропроцессора. Busicom приобрела

разработку, заплатив Intel $60 000. Но в Intel решили возвратить Busicom эти деньги,
чтобы вернуть себе права на микропроцессор.
i4004 обладал вычислительной мощностью, сравнимой с первым электронным компь-
ютером ENIAC (1946). Свое первое практическое применение 4004-й нашел в систе-
мах управления дорожными светофорами и анализаторах крови. Этот микропроцес-
сор был использован в бортовой аппаратуре межпланетного зонда Pioneer-10, кото-
рый поставил рекорд долгожительства среди подобных аппаратов: он был запущен в
1972

г., а к сентябрю 2001 г. Pioneer-10 удалился от Земли на 11,78 млрд км и все еще

работал и, вполне вероятно, работает по сей день, хотя в феврале 2003 г. NASA офи-
циально с ним попрощалось.

Введение

Так началось победное шествие микропроцессоров, которые позднее разделились
на несколько разновидностей, в основном относящихся к двум главным группам:
собственно микропроцессорам (МП) и микроконтроллерам (МК). Первые предна-
значены для использования в составе вычислительных систем, самые распростра-
ненные из которых - персональные компьютеры (ПК), поэтому их еще часто на-
зывают "процессорами для ПК" (хотя к этой группе обычно относят также и произ-
водительные МП для серверов и некоторые другие). МК отличаются от МП тем,
что они в первую очередь предназначены для управления различными системами,
поэтому при относительно более слабом вычислительном ядре они включают в се-
бя много дополнительных узлов. То, что для обычного МП предполагается разме-
щать во внешних чипсетах или дополнительных модулях (память, порты ввода-
вывода, таймеры, контроллеры прерываний, узлы для обработки аналоговых сигна-
лов и пр.), в МК располагается прямо на кристалле, отчего их когда-то было модно
называть "микро-ЭВМ".
И действительно, в простейшем случае для построения полностью функциони-
рующего компьютера достаточно единственной микросхемы МК с подсоединен-
ными к ней устройствами ввода-вывода. Современные модели рядовых однокри-
стальных МК превышают вычислительные возможности IBM PC AT на 286-м про-
цессоре образца второй половины 1980-х. Есть области, где границу между МП и
МК провести трудно: таковы, например, процессоры для мобильных устройств, от
телефонов и карманных компьютеров до цифровых камер, в которых процессорный
узел должен обладать развитыми вычислительными функциями и управлять мно-
гочисленными внешними компонентами.

Электроника в греческом стиле

В 1962 г. в Калифорнии появилась семья Перлегос, греческих эмигрантов, урожен-
цев города Триполис. Родители занялись, как и на родине, виноградарством, а сы-
новья, Джордж и Гюст Перлегос, выбрали модную специальность инженера-
электронщика: оба окончили вначале университет Сан-Хозе, а затем Стэнфордский
университет. В 1974 г. в возрасте 24 лет младший из братьев Джордж Перлегос на-
чал работать в компании Intel, где попал на одно из самых передовых направлений:
разработку электрически стираемой памяти для замены "прожигаемой" OTP ROM.
Еще до Перлегоса, почти одновременно с изобретением микропроцессора в 1971 г.,
сотрудник Intel Дон Фрохман изобрел "плавающий" затвор и создал первую УФ-
стираемую EPROM объемом 2К (256 8).

З

АМЕТКИ НА ПОЛЯХ

В "обычной" жизни употреблять сокращение для единиц информации из одной буквы
"К" (так же, как и "М") не рекомендуется: очень трудно иногда понять, идет ли речь
о килобитах, килобайтах, "килословах" или вообще килобитах в секунду. Тем не менее
такие сокращения часто встречаются, в том числе и в техдокументации, и нам придет-
ся иногда следовать этому примеру. Для определенности примем следующие прави-
ла: одиночная прописная буква "К" означает двоичные килобиты (1024 бита), "М" -
двоичные мегабиты (1024 кбита). Хотя в литературе часто еще принято килобайты со-
кращать, как "КБ", а килобиты, как "Кб", мы постараемся избежать этой путаницы, и во

Микроконтроллеры, их возникновение и применение

всех остальных случаях писать полностью: кбайт и Мбайт, кбит/c, Мбайт/c. Исключе-
ние составит обозначение объема памяти программ микроконтроллеров, если он из-
меряется в двухбайтовых словах: например, 4К слов будет обозначать 4096 ячеек-
слов (8 кбайт).

Джордж Перлегос активно включился в этот процесс и сначала при его участии, а
затем и под его непосредственным руководством были созданы две технологии,
ставшие точкой роста для всей отрасли по производству flash-памяти - одного из
главных столпов современной "цифровой революции". Это было сначала изобрете-
ние чипа 2716 - 16К (2048 8) EPROM с одним напряжением питания +5 В, а затем
2816 - первой EEPROM, электрически стираемого ПЗУ, ставшего прообразом
flash-памяти.
В 1981 г. Перлегос покидает Intel и с несколькими сотрудниками (в числе которых
был Гордон Кэмпбелл, будущий создатель другой известной фирмы Chips &
Technologies) создает компанию Seeq. Это было время спада в электронной про-
мышленности и через три года компанию пришлось покинуть в связи с претензия-
ми инвесторов. Не доверяя им больше, Джордж с братом Гюстом и еще нескольки-
ми сотрудниками Seeq в 1984 г. создает в складчину на личные средства компанию,
полное название которой звучит как Advanced Technology MEmory and Logic или
сокращенно - Atmel.
Сначала продукцией Atmel были микросхемы энергонезависимой памяти всех раз-
новидностей - как OTP EPROM и EEPROM с последовательным и параллельным
доступом, так и Flash. В 1985 г. Atmel выпустила первую в мире EEPROM по доми-
нирующей ныне КМОП-технологии, а в 1989 г. - первую flash-память с питанием
от одного напряжения +5 В. В конце 1980-х Intel вознамерилась наказать ряд ком-
паний-производителей EPROM, в том числе и Atmel, якобы за нарушение патентов,
но, в конце концов, удалось договориться об обмене лицензиями. Причем в конеч-
ном итоге Atmel перепала лицензия на производство классического микроконтрол-
лера 8051, от поддержки которого Intel уже в то время постепенно отходила, сосре-
доточившись на процессорах для ПК.

П

ОДРОБНОСТИ

Напомним, что EEPROM отличается от flash-памяти тем, что первая допускает раз-
дельный доступ к любой произвольной ячейке, а вторая - лишь к целым блокам. По-
этому EEPROM меньше по объему (характерный объем специализированных микро-
схем EEPROM - от единиц килобит до единиц мегабит) и дороже, в настоящее время
ее используют в основном для хранения данных, в том числе в составе микроконтрол-
леров. Flash-память проще и дешевле, и к тому же дает значительный выигрыш в ско-
рости при больших объемах информации, особенно при потоковом чтении/записи, ха-
рактерном для медиаустройств (вроде цифровых камер или MP3-плееров). В составе
микроконтроллеров flash-память служит для хранения программ. Некоторые подроб-
ности о различных типах памяти и их функционировании см. в главе 11 .

Так Atmel оказалась "втянута" в число производителей микроконтроллеров, в кото-
ром очень быстро оказалась на первых позициях: в 1993 г. началось производство
первых в отрасли МК AT89C51 со встроенной flash-памятью программ. Это озна-
чало начало переворота во всей инженерной практике, потому что существовавшие
ранее МК обладали либо однократно программируемой OTP-памятью, либо

Введение

УФ-стираемой, которая значительно дороже в производстве и работа с ней приво-
дит к большим потерям времени разработчиков. Число циклов перезаписи для УФ
ППЗУ не превышает нескольких десятков, а прямой дневной свет, попавший на
такой кристалл, может привести к стиранию информации. Поэтому даже мелкосе-
рийные устройства приходилось изготавливать преимущественно с использовани-
ем OTP ROM, что значительно рискованнее: изменить в случае даже малейшей
ошибки записанную программу уже было невозможно. Появление flash-памяти из-
менило весь "ландшафт" в этой области: именно в результате ее внедрения стали
возможными такие вещи, как программное обновление BIOS компьютера или "пе-
решивка" управляющих программ для бытовых электронных устройств.
В 1995 г. два студента Норвежского университета науки и технологий в г. Трон-
хейме, Альф Боген и Вегард Воллен, выдвинули идею 8-разрядного RISC-ядра, ко-
торую предложили руководству Atmel. Имена разработчиков вошли в название ар-
хитектуры AVR: Alf + Vergard + RISC. Идея настолько понравилась, что в 1996 г.
был основан исследовательский центр Atmel в Тронхейме и уже в конце того же
года выпущен первый опытный микроконтроллер новой серии AVR под названием
AT90S1200. Во второй половине 1997 г. корпорация Atmel приступила к серийному
производству семейства AVR.

Почему AVR?

У AVR-контроллеров "с рождения" есть две особенности, которые отличают это
семейство от остальных МК. Во-первых, система команд и архитектура ядра AVR
разрабатывались совместно с фирмой-разработчиком компиляторов с языков про-
граммирования высокого уровня IAR Systems. В результате появилась возможность
писать AVR-программы на языке С без большой потери в производительности по
сравнению с программами, написанными на языке ассемблера. Подробнее этот во-
прос мы обсудим в главе 5 .
Во-вторых, одним из существенных преимуществ AVR стало применение конвейе-
ра. В результате для AVR не существует понятия машинного цикла: большинство
команд выполняется за один такт. Для сравнения отметим, что пользующиеся
большой популярностью МК семейства PIC выполняют команду за 4 такта, а клас-
сические 8051 - вообще за 12 тактов (хотя есть и современные модели х 51 с ма-
шинным циклом в один такт).
Правда, при этом пришлось немного пожертвовать простотой системы команд,
особенно заметной в сравнении с x 51, где, например, любые операции пересылки
данных внутри контроллера, независимо от способа адресации, выполняются един-
ственной командой

в различных вариантах, в то время как в AVR почти для

каждого способа своя команда, к тому же иногда с ограниченной областью дейст-
вия. Есть некоторые сложности и в области операций с битами. Тем не менее это не
приводит к заметным трудностям при изучении AVR-ассемблера: наоборот, тексты
программ получаются короче и больше напоминают программу на языке высокого
уровня. Следует также учесть, что из общего числа команд от 90 до 130, в зависи-
мости от модели, только 50–60 уникальных, остальные взаимозаменяемые.

Микроконтроллеры, их возникновение и применение

И, наконец, этот недостаток полностью нивелируется при использовании языка С,
фактически уравнивающего разные архитектуры с точки зрения особенностей про-
граммирования.
Огромное преимущество AVR-архитектуры - наличие 32 оперативных регистров,
не совсем равноправных, но позволяющих в ряде случаев вообще не обращаться к
оперативной памяти и не использовать стек (что в принципе невозможно в том же
семействе х 51), более того, в младших моделях AVR стек вообще недоступен для
программиста. Потому структура ассемблерных программ для AVR стала подозри-
тельно напоминать программы на языке высокого уровня, где операторы работают
не с ячейками памяти и регистрами, а с абстрактными переменными и константами.
Еще одна особенность AVR со схемотехнической точки зрения - все выводы в
них могут пребывать в трех состояниях (вход - отключено - выход) и электриче-
ски представляют собой КМОП-структуры (т. е. имеет место симметрия выходных
сигналов и высокое сопротивление для входных). В общем случае это значительно
удобнее портов х 51 (двустабильных и TTL-совместимых) и предполагает лучшую
помехозащищенность (по крайней мере, от помех по шине "земли").
Суммировав мнения из различных источников и опираясь на собственный опыт,
автор пришел примерно к такому подразделению областей применения трех самых
распространенных семейств контроллеров.

Контроллеры классической архитектуры х 51 (первые микросхемы семейства
8051 были выпущены еще в начале 1980-х) лучше всего подходят для общего
изучения предмета. Отметим, что кроме Atmel, х 51-совместимые изделия вы-
пускают еще порядка десятка фирм, включая такие гиганты, как Philips и
Siemens, есть и отечественные аналоги (серии 1816, 1830 и др.), что делает эту
архитектуру наиболее универсальной.

Семейство AVR рекомендуется для начинающих электронщиков-практиков,
в силу простоты и универсальности устройства, преемственности структуры для
различных типов контроллеров, простоты схемотехники и программирования
(в данном случае под "программированием" понимается процесс записи про-
грамм в микросхему).

PIC фирмы Microchip идеально подходят для проектирования несложных уст-
ройств, особенно предназначенных для тиражирования.

Эта классификация во многом субъективна, и автор не будет оспаривать другие
точки зрения: различные семейства МК постепенно сближаются по параметрам,
становятся полностью взаимозаменяемыми и, как и во всей современной электро-
нике, выбор того или иного семейства часто носит характер "религиозного".
К тому же три упомянутых семейства МК - лишь наиболее распространенные
среди универсальных контроллеров, но далеко не самые массовые вообще. Общее
количество существующих семейств микроконтроллеров оценивается приблизи-
тельно в 100 с лишним, причем ежегодно появляются все новые и новые. Каждое из
этих семейств может включать десятки разных моделей. При этом первое место
среди производителей 8-разрядных МК традиционно принадлежит фирме Motorola,
в основном за счет контроллеров для мобильных устройств. Компания Microchip со

Введение

своим семейством PIC занимает третье место, а Atmel - лишь шестое. При этом,
кроме 8-разрядных МК AVR, Atmel выпускает еще несколько разновидностей МК,
к которым относятся не только упомянутые наследники 8051, но и ARM-
процессоры и специализированные МК для различных применений. Тем не менее
эта формальная статистика еще ни о чем не говорит - так, среди МК со встроен-
ной flash-памятью Atmel принадлежит уже треть мирового рынка.
Еще в 2002–2003 годах в мире выпускалось ежегодно 3,2 млрд штук микрокон-
троллеров. Отметим, что объем выпуска процессоров для ПК можно оценить в
200 млн единиц в год, т. е. он составляет всего-навсего около 6% рынка (в финан-
совом исчислении, правда, соотношение иное, ведь типичная цена рядового МК
составляет 2–5 долларов, а процессора для ПК - как минимум на порядок выше, а
иногда достигает и сотен долларов). Потому не будет преувеличением утверждать,
что специальность электронщика-программиста, специализирующегося на микро-
контроллерах, не менее важна и дефицитна, чем компьютерного программиста-
системщика или создателя пользовательских приложений.

Эта книга адресована читателю, который хочет изучить структуру и схемотехниче-
ские особенности МК AVR и научиться грамотно использовать их основные воз-
можности. Поэтому автор ограничивается языком ассемблера (подробнее вопрос
выбора среды программирования мы рассмотрим в главе 5 ). Упор в книге делается
на то, чтобы дать читателю практические советы, описать готовые алгоритмы для
типовых задач, возникающих перед разработчиками при реализации тех или иных
функций МК. Автор вместе с читателями подробно разбирает ряд вопросов, кото-
рые обычно выходят за рамки пособий по программированию МК: работу с после-
довательными интерфейсами, арифметические операции, сопряжение с ПК, прак-
тическую реализацию режимов энергосбережения.
Вместе с тем автор не ставил задачу разобрать подробно абсолютно все возможно-
сти МК AVR: для этого не хватило бы и нескольких томов. Мы вынуждены обойти
такие вопросы, как отладка и программирование по интерфейсу JTAG, перспекти-
вы, которые открывает самопрограммирование контроллеров, лишь вскользь кос-
немся интереснейшей задачи синтеза звука и других применений PWM-режимов
таймеров.
В этой книге большинство примеров ориентировано на применение младших
(с объемом памяти 8 Мбайт) моделей подсемейства Mega, т. к. именно они наибо-
лее универсальны и пригодны для широкого круга задач без излишнего усложнения
схемы. В более простых случаях автор ориентировался на наиболее универсальную
из младших моделей ATtiny2313 (о ее совместимости с "классической" версией
AT90S2313 см. разд. "Программа счетчика с использованием прерываний" гла-
вы 5
). Большинство приведенных примеров могут быть практически без переделок
адаптированы к другим моделям AVR, обладающим соответствующей конфигура-
цией.

ЧАСТЬ

Общие принципы устройства

и функционирования Atmel AVR

Глава 1. Обзор микроконтроллеров Atmel AVR

Глава 2. Общее устройство, организация памяти,

тактирование, сброс

Глава 3. Знакомство с периферийными устройствами

Глава 4. Прерывания и режимы энергосбережения

Г Л АВ А

Обзор микроконтроллеров
Atmel AVR

Atmel AVR представляет собой семейство универсальных 8-разрядных микрокон-
троллеров на основе общего ядра с различными встроенными периферийными уст-
ройствами. Возможности МК AVR позволяют решить множество типовых задач,
возникающих перед разработчиками радиоэлектронной аппаратуры.
Особенности микроконтроллеров Atmel AVR.

Производительность порядка 1 MIPS/МГц. MIPS (Millions of Instructions Per
Second, миллион команд в секунду) - одна из самых старых и во многом фор-
мальная характеристика производительности процессоров, т. к. наборы команд
для различных процессоров различаются, и, соответственно, одно и то же число
инструкций на различных системах даст разную полезную работу. Тем не менее
для простых 8-разрядных вычислительных систем, не содержащих команд, опе-
рирующих с большими числами, числами с плавающей точкой и массивами
данных, это неплохой показатель для сравнения их производительности. Вычис-
лительное ядро AVR на ряде задач по производительности превосходит 16-раз-
рядный процессор 80286.

Усовершенствованная RISC-архитектура. Концепция RISC (Reduced
Instruction Set Computing, вычисления с сокращенным набором команд) предпо-
лагает наличие набора команд, состоящего из минимума компактных и быстро
выполняющихся инструкций; при этом такие более громоздкие операции, как
вычисления с плавающей точкой или арифметические действия с многоразряд-
ными числами, предполагается реализовать на уровне подпрограмм. Концепция
RISC упрощает устройство ядра (в типовом ядре AVR содержится лишь 32 тыс.
транзисторов, в отличие от десятков миллионов в процессорах для ПК) и уско-
ряет его работу: типовая инструкция выполняется за один такт (кроме команд
ветвления программы, обращения к памяти и некоторых других, оперирующих с
данными большой длины). В AVR имеется простейший двухступенчатый кон-
вейер, когда команда выполняется в одном такте с выборкой следующей.
В отличие от Intel-архитектур, в "классическом" AVR нет аппаратного умноже-
ния/деления, однако в подсемействе Mega присутствуют операции умножения.

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

Что нужно для того, чтобы стать профессиональным разработчиком программ для микроконтроллеров и выйти на такой уровень мастерства, который позволит с лёгкостью найти и устроиться на работу с высокой зарплатой (средняя зарплата программиста микроконтроллеров по России на начало 2015 года составляет
80 000 рублей).

ADD

Синтаксис: ADD reg1, reg2 Эта команда складывает содержимое регистров reg1 и reg2, сохраняя результат в регистре reg1. Изменяет состояние флагов H, S, V, N, Z, C.

AND

Синтаксис: AND reg1, reg2 Эта команда выполняет операцию «Логическое И» между регистрами reg1 и reg2, сохраняя результат в регистре reg1. Изменяет состояние флагов S, V, N, Z.

ANDI

Синтаксис: ANDI hreg, number Эта команда выполняет операцию «Логическое И» между содержимым старшего регистра hreg и константой number (0…255), сохраняя результат в регистре. Изменяет состояние флагов S, V, N, Z.

BRBC

Синтаксис: BRBC bit, label Эта команда проверяет состояние бита регистра SREG ($3F) и переходит к метке label, если бит сброшен. Метка должна находиться в пределах 63 команд от команды brbc.

BRBS

Синтаксис: BRBS bit, label Эта команда проверяет состояние бита регистра SREG ($3F) и переходит к метке label, если бит установлен. Метка должна находиться в пределах 63 команд от команды brbs.

BRCC

Синтаксис: BRCC bit, label Эта команда проверяет флаг переноса (С) и переходит к метке label, если он сброшен.

BRCS

Синтаксис: BRCS bit, label Эта команда проверяет флаг переноса (С) и переходит к метке label, если он установлен.

BREQ

Синтаксис: BREQ bit, label Эта команда проверяет флаг нуля (Z) и переходит к метке label, если он установлен.

BRNE

Синтаксис: BRNE bit, label Эта команда проверяет флаг нуля (Z) и переходит к метке label, если он сброшен.

CBI

Синтаксис: CBI ioreg, bit Эта команда сбрасывает в 0 бит регистра ввода-вывода ioreg ($00…$1F). Номер бита определяет операнд bit.

CLR

Синтаксис: CLR reg Эта команда сбрасывает все биты регистра reg в 0. Изменяет состояние флагов S, V, N, Z.

CP

Синтаксис: CP reg1, reg2 Эта команда сравнивает содержимое регистров reg1 и reg2 путем вычитания reg2 из reg1. Содержимое регистров не изменяется. Изменяет состояние флагов H, S, V, N, Z, C.

CPI

Синтаксис: CPI hreg, number Эта команда сравнивает содержимое регистра hreg с константой number путем вычитания константы из регистра. Содержимое регистров не изменяется. Изменяет состояние флагов H, S, V, N, Z, C. Команда работает только с регистрами R16…R31.

DEC

Синтаксис: DEC reg Эта команда уменьшает на единицу содержимое регистра reg, записывая результат обратно в регистр. Изменяет состояние флагов S, V, N, Z.

IN

Синтаксис: IN reg, ioreg Эта команда пересылает содержимое регистра ввода-вывода ioreg в РОН reg.

INC

Синтаксис: INC reg Эта команда увеличивает на единицу содержимое регистра reg, записывая результат обратно в регистр. Изменяет состояние флагов S, V, N, Z.

LD

Синтаксис: LD reg, longreg Эта команда загружает один байт из памяти данных (адрес ячейки памяти содержится в регистре longer) в регистр reg (для модели 1200).

LDI

Синтаксис: LDI hreg, number Эта команда загружает непосредственное значение number в старший регистр hreg (команда может работать только с регистрами R16…R31). Число number должно находиться в пределах 0…255.

LSR

Синтаксис: LSR reg Эта команда выполняет логический сдвиг вправо содержимого регистра reg. При этом 0-й бит копируется в флаг C, 7-й бит сбрасывается в 0. Изменяет состояние флагов S, V, N, Z, C.

ORI

Синтаксис: ORI hreg, number Эта команда выполняет операцию «Логическое ИЛИ» между содержимым старшего регистра hreg и константой number (0…255), сохраняя результат в регистре. Изменяет состояние флагов S, V, N, Z.

OUT

Синтаксис: OUT ioreg, reg Эта команда пересылает содержимое регистра общего назначения reg в регистр ввода-вывода ioreg.

RCALL

Синтаксис: RCALL label Эта команда вызывает подпрограмму, обозначенную меткой label, которая должна находиться в пределах 2048 команд от команды rcall (относительный вызов).

RET

Синтаксис: RET Эта команда выполняет возврат из подпрограммы, переходя на команду, которая следует за исходной командой call.

RETI

Синтаксис: RETI Эта команда выполняет возврат из подпрограммы и устанавливает флаг общего разрешения прерываний.

RJMP

Синтаксис: RJMP label Относительный переход. Выполняет переход к участку программы, обозначенному меткой label, которая должна находиться в пределах 2048 от команды RJMP.

SBI

Синтаксис: SBI ioreg, bit Эта команда устанавливает в 1 бит регистра ввода-вывода ioreg ($00…$1F). Номер бита определяет операнд bit.

SBIC

Синтаксис: SBIC ioreg, bit Эта команда проверяет бит регистра ввода-вывода ioreg ($00…$1F) и пропускает следующую команду, если этот бит сброшен. Номер бита определяет операнд bit.

SBIS

Синтаксис: SBIS ioreg, bit Эта команда проверяет бит регистра ввода-вывода ioreg ($00…$1F) и пропускает следующую команду, если этот бит установлен. Номер бита определяет операнд bit.

SEI

Синтаксис: SEI Эта команда устанавливает флаг общего разрешения прерываний.

SER

Синтаксис: SER reg Эта команда устанавливает все биты регистра reg в 1. Изменяет состояние флагов S, V, N, Z. Команда может работать только с регистрами R16…R31.

ST

Синтаксис: ST reg, longreg Для модели 1200 эта команда сохраняет содержимое регистра reg в памяти данных (адрес ячейки памяти содержится в регистре longer), т.е. косвенно пересылает содержимое РОН reg по адресу, хранящемуся в регистре longer.

SUBI

Синтаксис: SUBI hreg, number Вычитает из старшего регистра hreg константу number. Результат сохраняется в этом же регистре. Изменяет состояние флагов H, S, V, N, Z, C. Команда может работать только с регистрами R16…R31.