Ассемблер для avr скачать программу. Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера. (3-е издание). Инструкции работы с битами

Название: Практическое программирование микроконтроллеров 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. Немного сгруппировав уже готовый материал, я решил оформить его в виде одной цельной книги. В самом начале я не знал, что у меня получится, но теперь, последний раз просматривая материал, решил, что ее формат - это учебник/справочник по программированию на языке ассемблера в соотношении примерно 40/60 %. В книге освещено множество различных аспектов программирования и, так или иначе, затронуты все без исключения внутренние модули AVR. Но самое главное это то, что подавляющее большинство программ позаимствованы из реально работающих и проверенных временем программ.

Работа над книгой не вызвала у меня ни каких затруднений и прошла очень легко. Странно, но только теперь, когда пришло время написать предисловие, я не знаю что сказать… В доступной литературе про AVR написано очень много и мне не хотелось бы повторятся. Вопрос прямого сравнения микроконтроллеров различных типов я (не без усилий воли) также хочу обойти стороной. Тогда что же остается? Думаю объяснить, а почему же именно ассемблер?

Ведь всем понятно, что основным инструментом современного разработчика является, конечно, “Си”. Тем более, когда имеется в виду большой объем памяти и, тем более, если речь идет об AVR, где поддержка компиляторов языков высокого уровня была положена в основу архитектуры. При сравнении ассемблера и “Си”, лично у меня всегда возникают образы лопаты и экскаватора. Экскаватор выполняет огромные объемы однотипной работы, он быстро выроет любой котлован. Но есть места, куда экскаватор элементарно не может заехать, не говоря уже о небольших траншеях сложной формы. Вот здесь то и нужна лопата. Не стоит забывать также, что экскаватор не всегда имеется в наличии, а вот лопата всегда под рукой и она ничего не стоит.

Сейчас я хочу обратиться в первую очередь к тем, кто только начинает делать первые шаги и на кого, в целом, и рассчитана данная книга. Существует мнение, что к изучению микроконтроллеров можно подходить с позиций рассмотрения “черного ящика”. Я категорически против такой модели! Можно успешно заниматься программированием компьютерной техники и не знать ни одной команды процессора, но нельзя вести разработку на основе 8-разрядных микроконтроллеров досконально не зная их внутреннюю структуру. Именно поэтому в самом начале необходимо создать как минимум пару-тройку проектов на ассемблере и только потом уже переходить на “Си”. Обещаю, что в этом случае успеха вам не избежать.

И буквально несколько слов, о соглашениях принятых в этой книге. Все примеры, если это отдельно не оговорено в тексте, для единообразия привязаны к модели AVR ATmega8-16PU. Числовая система, принятая по умолчанию, – десятичная. Заголовки всех подпрограмм имеют однотипное оформление, где находится описание используемых регистров и других параметров. Подпрограммы имеют подробные комментарии, начинающиеся с символа “;”. Метки, пользовательские имена регистров и ячеек памяти, а также мнемоники команд, директивы ассемблера и встроенные функции состоят из прописных букв. Числовые константы, имена регистров общего назначения, регистров ввода-вывода и их битов написаны заглавными буквами. Например:

; Имена из прописных букв: ; initial - метка; temp – пользовательское имя регистра; ldi, out, cbi, sbi – мнемоники команд; .equ, .def, .cseg, .org – директивы ассемблера; low(), high() – встроенные функции; ; Имена из заглавных букв: ; LED, RAMEND – числовые константа; R16 – имя регистра общего назначения; SPH, SPL, PORTB, DDRB – регистры ввода-вывода; PB2 – бит регистра ввода-вывода.equ LED = PB2 .def temp = R16 .cseg .org 0 rjmp initial ....... .org 0x20 initial: ldi temp,low(RAMEND) out SPL, ldi temp,high(RAMEND) out SPH, cbi PORTB,LED sbi DDRB,LED .......

Все программы на ассемблере могут быть оттранслированы в среде IDE AVR Studio любых версии, вплоть до самых ранних. Для разработки программного обеспечения высокого уровня был использован компилятор Delphi 2007 for Win32, но исходные тексты должны быть распознаны и более ранними версиями начиная с Delphi 6.

Тексты всех ассемблерных программ были тщательно проверены, но исключать наличие опечаток все-таки нельзя. Поэтому любые сообщения о найденных неточностях, а также общих замечаниях связанных с книгой вы можете присылать на мой электронный адрес [email protected]

Перед изучением системы команд микроконтроллера надо бы разобраться в инструментарии. Плох тот плотник который не знает свой топор. Основным инструментом у нас будет компилятор. У компилятора есть свой язык — макроассемблер, с помощью которого жизнь программиста упрощается в разы. Ведь гораздо проще писать и оперировать в голове командами типа MOV Counter,Default_Count вместо MOV R17,R16 и помнить что у нас R17 значит Counter, а R16 это Default_Count. Все подстановки с человеческого языка на машинный, а также многое другое делается средствами препроцессора компилятора. Его мы сейчас и рассмотрим.

Комментарии в тексте программы начинаются либо знаком «; «, либо двойными слешами «// «, а еще AVR Studio поддерживает Cишную нотацию комментариев, где коменты ограничены «колючей проволокой» /* коммент */ .

Оператор.include позволяет подключать в тело твоей программы кусок кода из другого текстового файла. Что позволяет разбить большую исходник на кучу мелких, чтобы не загромождать и не мотать туда сюда огромную портянку кода. Считай куда ты воткнул .include туда и вставился кусок кода из другого файла. Если надо подключать не весь файл, а только его часть, то тебе поможет директива .exit дойдя до которой компилятор выйдет из файла.

Оператор.def позволяет привязать к любому слову любое значение из ресурсов контроллера — порт или регистр. Например сделал я счетчик, а считаемое значение находится в регистре R0 , а в качестве регистра-помойки для промежуточных данных я заюзал R16 . Чтобы не запутаться и помнить, что в каком регистре у меня задумано я присваиваю им через .def символические имена.

Оператор.equ это присвоение выражения или константы какой либо символической метке.
Например, у меня есть константа которая часто используется. Можно, конечно, каждый раз писать ее в коде, но вдруг окажется, что константа выбрана неверно, а значит придется весь код шерстить и везде править, а если где-нибудь забудешь, то получишь такую махровую багу, что задолбаешься потом ее вылавливать. Так что нафиг, все константы писать надо через
.equ ! Кроме того, можно же присвоить не константу, а целое выражение. Которое при компиляции посчитается препроцессором, а в код пойдет уже исходное значение. Надо только учитывать, что деление тут исключительно целочисленное. С отбрасыванием дробной части, без какого-либо округления, а значит 1/2 = 0, а 5/2 = 2

1 2 3 .equ Time = 5 .equ Acсelerate = 4 .equ Half_Speed = (Accelerate*Time)/2

Equ Time = 5 .equ Acсelerate = 4 .equ Half_Speed = (Accelerate*Time)/2

Директивы сегментации. Как я уже рассказывал память контроллера разбита на независимые сегменты — данные (ОЗУ ), код (FLASH ), EEPROM

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

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

В сегменте кода уместны директивы:
Адресная метка. Любое слово, не содержащее пробелов и не начинающееся с цифры, главное, чтобы после него стояло двоеточие .

1 2 3 .CSEG label: LDI R16,"A" RJMP label

CSEG label: LDI R16,"A" RJMP label

В итоге, после компиляции вместо label в код подставится адрес команды перед которой стоит эта самая метка, в данном случае адрес команды LDI R16,’A’
Адресными метками можно адресовать не только код, но и данные, записанные в любом сегменте памяти. Об этом чуть ниже.

.ORG address означет примерно следующее «копать отсюда и до обеда», т.е. до конца памяти. Данный оператор указывает с какого адреса пойдет собственно программа . Обычно используется для создания таблицы прерываний.

CSEG .ORG 0x0000 RJMP Start ;перепрыгиваем таблицу векторов. .ORG INT0addr ; External Interrupt0 Vector Address RJMP INT0_expection .ORG INT1addr ; External Interrupt1 Vector Address RETI .ORG OC2addr ; Output Compare2 Interrupt Vector Address RJMP PWM_1 .ORG OVF2addr ; Overflow2 Interrupt Vector Address RETI .ORG ICP1addr ;Input Capture1 Interrupt Vector Address RETI .ORG 0х0032 ; Начало основной программы Start: LDI R16,0x54 ; и понеслась

Статичные данные пихаются в флеш посредством операторов

.db массив байтов.
.dw массив слов — два байта.
.dd массив двойных слов — четыре байта
.dq массив четверных слов — восем байт.

Constant: .db 10 ; или 0хAh в шестнадцатеричном коде Message: .db "Привет лунатикам" Words: .dw 10, 11, 12

В итоге, во флеше вначале будет лежать число 0А, затем побайтно будут хекскоды символов фразы «привет лунатикам», а дальше 000A, 000B, 000С .
Последнии числа, хоть сами и невелики, но занимают по два байта каждое, так как обьявлены как .dw .

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

Тут действует оператор .BYTE позволяющий указать на расположение данных в памяти.

1 2 var1: .BYTE 1 table: .BYTE 10

var1: .BYTE 1 table: .BYTE 10

В первом случае мы указали переменную var1 состоящую из одного байта.
Во втором случае у нас есть цепочка из 10 байт и переменная table указывающая на первый байт из цепочки . Адрес остальных вычисляется смещением.
Указывать размеры перменных нужно для того, чтобы компилятор их правильно адресовал и они не налезали друг на друга.

.EESEG сегмент EEPROM , энергонезависимая память. Можно писать, можно считывать, а при пропаже питания данные не повреждаются.
Тут действуют те же директивы что и в flash — db, dw, dd, dq .

MACRO — оператор макроподстановки. Вот уж реально чумовая вещь. Позволяет присваивать имена целым кускам кода , мало того, еще параметры задавать можно.

SUBI16 0x1234,r16,r17

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

Макроассемблер это мощнейшая штука. По ходу пьесы я буду вводить разные макросы и показывать примеры работы макроопределений.

Компилятор транслирует исходные коды с языка ассемблера в объектный код. Полученный объектный код можно использовать в симуляторе 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

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

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

Нет операции

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

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

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

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

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

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

ВВЕДЕНИЕ. Микроконтроллеры, их возникновение и применение
Предыстория микроконтроллеров
Электроника в греческом стиле
Почему AVR?
Что дальше?

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

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

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

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

Память программ
Память данных (ОЗУ, SRAM)
Энергонезависимая память данных (EEPROM)
Способы тактирования
Сброс
Особенности подключения дополнительной внешней памяти данных

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

Порты ввода-вывода
Таймеры-счетчики
Аналого-цифровой преобразователь
Последовательные порты
U ART
Интерфейс SPI
Интерфейс TWI (12С)
Универсальный последовательный интерфейс USI

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

Прерывания
Разновидности прерываний
Режимы энергосбережения
Потребление МК AVR
Потребление МК AYR и режимы энергосбережения

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

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

Ассемблер или С?
Способы и средства программирования AVR
Редактор кода
Об AVR Studio
Обустройство ассемблера
Программаторы
О hex-файлах
Команды, инструкции и нотация AVR-ассемблера
Числа и выражения
Директивы и функции
Общая структура AVR-программы
Обработка прерываний
RESET
Простейшая программа
Задержка
Программа счетчика
Использование прерываний
Задержка по таймеру
Программа счетчика с использованием прерываний
О конфигурационных битах

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

Команды передачи управления и регистр SREG
Команды проверки-пропуска
Команды логических операций
Команды сдвига и операции с битами
Команды арифметических операций
Команды пересылки данных
Команды управления системой
Выполнение типовых процедур на ассемблере
О стеке, локальных и глобальных переменных

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

Стандартные арифметические операции
Умножение многоразрядных чисел
Деление многоразрядных чисел
Операции с дробными числами
Генератор случайных чисел
Операции с числами в формате BCD
Отрицательные числа в МК

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

8- и 16-разрядные таймеры
Формирование заданного значения частоты
Отсчет времени
Точная коррекция времени
Частотомер и периодомер
Частотомер
Периодомер
Управление динамической индикацией
LED-индикаторы и их подключение
Программирование динамической индикации
Таймеры в режиме PWM

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

Еще раз о сохранности данных в EEPROM
Запись и чтение EEPROM
Хранение констант в EEPROM

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

Аналого-цифровые операции и их погрешности
Работа с аналоговым компаратором
Интегрирующий АЦП на компараторе
Принцип работы и расчетные формулы
Программа интегрирующего АЦП
Встроенный АЦП
Пример использования АЦП
Программа

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

Основные операции через SPI
Аппаратный вариант
Программный вариант
О разновидностях энергонезависимой памяти
Запись и чтение flash-памяти через SPI
Программа обмена с памятью 45DB011В по SPI
Запись и чтение flash-карт
Подключение карт ММС
Подача команд и инициализация ММС
Запись и чтение ММС

Глава 12. Интерфейс TWI (12С) и его практическое использование

Базовый протокол 12С
Программная эмуляция протокола 12С
Запись данных во внешнюю энергонезависимую память
Режимы обмена с памятью АТ24
Программа
Часы с интерфейсом 12С
Запись данных
Чтение данных

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

Инициализация UART
Передача и прием данных
Пример установки часов DS1307 с помощью UART
Приемы защиты от сбоев при коммуникации
Проверка на четность
Как организовать корректный обмен
Дополнительные возможности USART
Реализация интерфейсов RS-232 и RS-485
Преобразователи уровня для RS-232
RS-485

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

Программирование режима энергосбережения
Пример прибора с батарейным питанием
Доработка программы
Использование сторожевого таймера

ПРИЛОЖЕНИЯ

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

Приложение 2. Команды Atmel AVR
Арифметические и логические команды
Команды операций с битами
Команды сравнения
Команды передачи управления
Команды безусловного перехода и вызова подпрограмм
Команды проверки-пропуска и команды условного перехода
Команды переноса данных
Команды управления системой

Приложение 3. Тексты программ
Демонстрационная программа обмена данными с flash-памятью 45DB011В по интерфейсу SPI
Процедуры обмена по интерфейсу 12С

Приложение 4. Обмен данными с персональным компьютером и отладка программ через UART
Работа с COM-портом в Delphi
COM-порт и Windows API
Работа с СОМ через готовые компоненты
Установка линии RTS в DOS и Windows
Программа СОМ2000
Отладка программ с помощью терминальной программы

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

Литература
Предметный указатель

Loading...Loading...