- •Программирование микроконтроллеров avr на языке ассемблера
- •Рецензенты:
- •Введение
- •1. Архитектура однокристальных микроконтроллеров семейства avr
- •2. Технические характеристики микроконтроллера aTmega32
- •3. Разработка программного обеспечения микроконтроллеров avr
- •3.1. Этапы разработки программного обеспечения однокристальных микроконтроллеров
- •3.2. Правила записи констант и выражений
- •3.3. Программная модель микроконтроллеров avr
- •3.4. Регистр статуса
- •3.5. Команды ассемблера
- •3.6. Директивы ассемблера
- •3.7. Настройка указателя стека
- •3.8. Работа с портами ввода-вывода
- •3.9. Работа с оперативной памятью данных
- •4. Интегрированная среда проектирования
- •4.1. Создание проекта в интегрированной среде проектирования avr studio 4.16
- •4.2. Отладка программы в avr studio 4.16
- •4.3. Загрузка программы в энергонезависимую память программ
- •Заключение
- •Библиографический список
- •Содержание
- •191028, Санкт-Петербург, ул. Моховая, 26
3.3. Программная модель микроконтроллеров avr
Рассмотрим программную модель микроконтроллера семейства AVR. Выделим основные узлы контроллера с точки зрения программиста:
АЛУ – арифметико-логическое устройство. Выполняет все арифметические и логические операции. Исходные операнды должны размещаться в регистрах общего назначения (РОН). Результат операций также помещается в РОН. Флаги состояния, предназначенные для отслеживания результата арифметических операций, размещаются в регистре статуса;
РОН – регистры общего назначения. Расположены в области оперативной памяти (RAM) и связаны напрямую с АЛУ. Предназначены для хранения промежуточных данных. В отличие от остальных ячеек RAM обращение к этим регистрам производится не по адресу ячейки памяти, а по имени регистра. Для каждого РОН существует специальная команда;
IRAM – внутреннее оперативное запоминающее устройство. Расположено на кристалле микроконтроллера. Обращение к ячейкам IRAM выполняется по адресам ячеек. Существует несколько типов адресации, которые будут рассмотрены позднее;
EEPROM – энергонезависимая память данных. Позволяет сохранять данные при отключении электропитания микроконтроллера. Может загружаться как в процессе выполнения программы, так и с помощью программатора;
FLASH – внутренняя память программ, содержит коды управляющей программы. Информация во внутреннюю память программ заносится специальным программатором и в процессе работы не может быть изменена. Может также использоваться как ROM (постоянное запоминающее устройство) для хранения неизменяемых данных.
3.4. Регистр статуса
Регистр статуса содержит специальные биты (флаги) состояния и управления. Флаги состояния предназначены для отслеживания результата арифметических операций. Использование флагов позволяет программисту оперировать логическими понятиями, а не конкретными цифровыми значениями.
Значения флагов используется командами условных переходов для ветвления программы.
Регистр статуса имеет имя «SREG». Данный регистр восьмиразрядный. Каждый флаг находится в отведенном ему разряде. Имеются следующие флаги:
SREG.7 – I: Флаг разрешения/запрещения глобального прерывания;
SREG.6 – T: Флаг пересылки, используемый командами BLD и BST;
SREG.5 – H: Флаг полупереноса;
SREG.4 – S: Для проверок операций со знаком;
SREG.3 – V: Флаг-указатель переполнения в дополнительном коде;
SREG.2 – N: Флаг отрицательного значения;
SREG.1 – Z: Флаг нулевого значения;
SREG.0 – C: Флаг переноса.
Регистр статуса «SREG» присутствует на вкладке «Processor» IDE AVR STUDIO, где имеется доступ ко всем указанным флагам. Если условие выполняется, то флаг установлен, и соответствующий разряд SREG будет закрашен черным, если условие не выполняется, то флаг сбрасывается, и соответствующий разряд SREG останется не закрашенным.
В качестве примера рассмотрим следующие флаги состояния:
SREG.1 – Флаг Z (нулевой результат операции);
SREG.0 – Флаг С (перенос, переполнение разрядной сетки).
Пример: «Флаг Z (нулевой результат операции)»:
ldi r17, $01 ; загрузка константы 01Н в R16
ldi r16, $01 ; загрузка константы 01Н в R17
sub r17, r16 ; вычитание из содержимого R17 содержимое R16
В результате операции вычитания в регистре R17 результат равен нулю. Флаг Z = 1.
Пояснение к команде «sub r17, r16»: вычитание из содержимого регистра R17 содержимого регистра R16, результат операции помещается в регистр R17:
Операция «вычитание»:
R17 = 0000 0001
R16 = 0000 0001
Результат = 0000 0000
Флаг Z = 1
Пример: «Флаг С (перенос, переполнение разрядной сетки)»:
ldi r17, $FF ; загрузка константы FFН в R16
ldi r16, $01 ; загрузка константы 01Н в R17
аdd r17, r16 ; сложение содержимого R17 и содержимого R16
Результат операции сложения помещается в регистр R17. Результат равен нулю. Z = 1; С = 1 и, следовательно, возникает перенос.
Произошло переполнение разрядной сетки: (255+1=256). Результат не помещается в одной 8-разрядной ячейке.
Пояснение к команде «аdd r17, r16» (сложение без учета переноса): складывается содержимое регистра R16 и содержимое регистра R17, результат операции помещается в регистр R16.
Операция «сложение»:
R16 = 1111 1111
R17 = 0000 0001
Результат = 1 0000 0000
Флаг Z = 1 (нулевой результат)
Флаг С = 1 (перенос в старший разряд)
Флаг разрешения/запрещения глобального прерывания «I» предназначен для разрешения или запрещения всех прерываний микроконтроллера. Для разрешения прерываний используется команда «sei». Для запрещения глобального прерывания используется команда «cli».
;Разрешение глобального прерывания:
sei ; Set interrupt flag
;Запрещение глобального прерывания:
cli ; Clear interrupt flag
Флаг «Т» является специальным битом, который может быть установлен или сброшен пользователем. Для установки флага «Т» используется команда «set». Для сброса флага «Т» используется команда «clt».
; Установка флага «Т»
set ;Set T-flag
;Сброс флага «Т»
clt ;Clear T-flag
Для обмена содержимого бита «Т» с регистрами общего назначения предназначены команды «bst» и «bld».
Команда «BST» – «Bit Store from Bit in Register to T Flag in SREG» (запомнить бит из регистра в Т-флаг SREG) используется для того, чтобы загрузить в Т-флаг значение некоторого бита регистра общего назначения. Имя регистра и номер бита указываются в команде.
Пример:
; Копирование бита из регистра R1 в Т-флаг
bst r1, 2 ; Store bit 2 of R1 in T-flag
Команда «BLD» – «Bit Load from the T Flag in SREG to a Bit in Register» (загрузить бит из Т-флага SREG в бит регистра) используется для того, чтобы загрузить значение Т-флага SREG в некоторый бит регистра общего назначения. Имя регистра и номер бита указываются в команде.
Пример:
; Копирование значения Т-флага в бит регистра R1
bld r1, 4 ; Load T-flag into bit 4 of R1