Введение
Любые устройства, в том числе и устройства связи, радиоавтоматики или аудиовизуальной аппаратуры требуют присутствия в своем составе устройства управления (контроллера). Контроллеры требуются практически во всех предметах и устройствах, которые окружают нас
Одним распространёнными в настоящее время являются микроконтроллеры фирмы Atmel семейства AVR. Несмотря на то, что они появились на рынке в 1996 году, их популярность до сих пор очень высока. С каждым годом они захватывают все новые и новые ниши на рынке. Не последнюю роль в этом играет соотношение показателей цена/быстродействие/энергопотребление, до сих пор являющееся едва ли не лучшим на рынке 8-битных микроконтроллеров.
Как и все микроконтроллеры AVR фирмы «Atmel», микроконтроллеры семейства Mega, а в частности ATmega 8535 являются 8-разрядными микроконтроллерами, предназначенными для встраиваемых приложений. Они изготавливаются по малопотребляющей КМОП-технологии, которая в сочетании с усовершенствованной RISC - архитектурой[1] позволяет достичь наилучшего соотношения быстродействие/энергопотребление. Контроллеры описываемого семейства являются наиболее развитыми представителями микроконтроллеров AVR.
К некоторым особенностям микроконтроллера ATmega8535 относятся:
- FLASH-память программ объемом 8 Кбайт с возможностью внутрисистемного перепрограммирования и загрузки через последовательный канал SPI (число циклов стирания/записи не менее 1000);
- оперативная память (статическое ОЗУ) объемом 512 байт;
- энергонезависимая память данных (EEPROM) объем 512 байт с возможностью внутрисистемного перепрограммирования и загрузки через последовательный канал SPI (число циклов стирания/записи не мене 100000);
- возможность защиты от чтения и модификации памяти программ и данных;
- возможность программирования непосредственно в системе через последовательные интерфейсы SPI и JTAG;
- возможность программного снижения частоты тактового генератора;
- 130 команд, большинство из которых выполняются за один машинный цикл;
- 17 внутренних+3 внешних источников прерываний;
- наличие программного стека;
- наличие аппаратного умножителя;
- 32 8-битных регистра общего назначения (далее РОН);
- 32 программируемые линии ввода/вывода;
- диапазон напряжений питания от 4,5 В до 5,5 В;
- производительность до 8 MIPS при частоте 8 МГц и т.д.
Система команд микроконтроллера
Система команд микроконтроллера A Tmega 8535 весьма развита и насчитывает 130 различных инструкций. Большинство команд занимает только 1 ячейку памяти (16 бит) и выполняется за 1 такт [4].
Всё множество команд микроконтроллера можно разбить на несколько групп:
- команды логических операций;
- команды арифметических операций и команды сдвига;
- команды операций с битами;
- команды пересылки данных;
- команды передачи управления;
- команды управления системой.
Управление периферийными устройствами осуществляется через адресное пространство данных. Для удобства существуют «сокращённые команды» IN/OUT.
В системе команд микроконтроллера A Tmega 8535 используется обозначения, приведенные в таблице 1
Таблица 1. Обозначения
Обозначение | Описание |
Регистры и операнды
Стек
Регистр статуса (SREG)
I/O регистры
Полный список и описание всех арифметических, логических команд, команд пересылки данных и команды переходов приведены в приложении 1. Подробно рассмотрим некоторые команды.
Команды пересылки данных
Команда MOV
Синтаксис: MOV Rd,Rr
0 < d < 31, 0 < r < 31.
Команда копирует содержимое регистра Rr в регистр Rd. Исходный регистр Rr остается неизменным, в регистр назначения Rd загружается копия содержимого регистра Rr.
Пример
MOV r1,r2 ; скопировать содержимое r2 в r1
Команда LDI
Синтаксис: LDI Rd, K
16 < d < 31, 0 < K < 255
Команда LDI загружает 8-разрядную константу в регистр Rd.
Пример:
LDI r30,$12 ; загрузить константу $12 в r30
Команда LD
Синтаксис: LD Rd,X
LD Rd ,X+
LDD Rd,-X
0 < d < 31
Загружает косвенно один байт из СОЗУ в регистр. Положение байта в СОЗУ указывается 16-разрядным регистром-указателем X в регистровом файле. Обращение к памяти ограничено текущей страницей объемом 64 Кбайта. Регистр-указатель X может остаться неизменным после выполнения команды, но может быть инкрементирован или декрементирован. Использование регистра-указателя X обеспечивает удобную возможность обращения к матрицам, таблицам, указателю стека.
Пример:
CLR r27 ;Очистить старший байт X
LDI r26, $20 ;Установить $20 в младший байт X
LD r0, X+ ;Загрузить в r0 содержимое SRAM по адресу ;$20 (X постинкрементируется)
LD r1, X ;Загрузить в r1 содержимое SRAM по адресу ;$21
LDI r26, $23 ;Установить $23 в младший байт X
LD r2, X ;Загрузить в r2 содержимое SRAM по адресу ;$23
LD r3, -X ;Загрузить в r3 содержимое SRAM по адресу ;$22 (X преддекрементируется)
Команда LDS
Синтаксис:LDS Rd,k
0 < d < 31,0 < k < 65535
Выполняется загрузка одного байта из СОЗУ в регистр. Можно использовать 16-разрядный адрес. Обращение к памяти ограничено текущей страницей СОЗУ объемом 64 Кбайта. Команда LDS использует для обращения к памяти выше 64 Кбайт регистр RAMPZ.
Пример:
LDS r2, $FF00 ; Загрузить r2 содержимым
;SRAM по адресу $FF00
Команда STS
Синтаксис:STS k,Rr
0 < r < 31, 0 < k < 65535
Команда осуществляет запись одного байта из регистра в СОЗУ. Можно использовать 16- разрядный адрес. Обращение к памяти ограничено текущей страницей СОЗУ объемом 64 Кбайта. Команда STS использует для обращения к памяти выше 64 Кбайт регистр RAMPZ.
Пример:
LDS r2, $1203 ; Загрузить в r2 содержимое
; SRAM по адресу $1203
ADD r2, r1 ; Сложить r1 с r2
STS $1203, r2 ; Записать обратно
Команда ST
Синтаксис : ST X,Rr
ST X+,Rr
ST -X,Rr
0 < d < 31
Команда осуществляет косвенную запись одного байт из регистра в СОЗУ. Положение байта в СОЗУ указывается 16-разрядным регистром-указателем X в регистровом файле. Обращение к памяти ограничено текущей страницей объемом 64 Кбайта. Для обращения к другой странице СОЗУ необходимо изменить регистр RAMPX в I/O области. Регистр-указатель X может остаться неизменным после выполнения команды, но может быть инкрементирован или декрементирован. Эта особенность удобна при использовании регистра-указателя X в качестве указателя стека.
Пример:
CLR r27 ; Очистить старший байт X
LDI r26, $34 ; Установить $34 в младший байт X
ST X+,r0 ; Сохранить в r0 содержимое SRAM
;по адресу $34 (X ;постинкрементируется)
ST X, r1 ; Сохранить в r1 содержимое
;SRAM по адресу $35
LDI r26, $34 ; Установить $34 в младший байт X
ST r2, X ; Сохранить в r2 содержимое SRAM
;по адресу $34
SR r3, -X ; Сохранить в r3 содержимое SRAM
;по адресу $33 (X ;преддекрементируется)
Команда PUSH
Синтаксис: PUSH Rr
0 < r <31
Команда заносит содержимое регистра Rd в стек.
Команда POP
Синтаксис: P OP Rr
0 < r <31
Команда загружает из стека байт в регистр Rd.
Пример:
push r16 ; Сохранить r16 в стеке
push r17 ; Сохранить r17 в стеке
pop r17 ; Восстановить r17
pop r16 ; Восстановить r16
Арифметические команды
Сложение без переноса ADD ( ADD - Add without Carry )
Синтаксис: ADD Rd , Rr
0 < d < 31, 0 < r < 31.
Данная команда реализует сложение двух регистров без добавления содержимого флага переноса (С) и размещает результат в регистре назначения Rd. Устанавливает флаги Z , C , N , V .
Пример
ADD r1,r2 ; Сложить r2 с r1 (r1=r1+r2)
ADD r28,r28 ; Сложить r28 с самим собой
Сложение с переносом ( ADC )
Синтаксис: ADC Rd , Rr
0 < d < 31, 0 < r < 31
Данная команда осуществляет сложение двух регистров и содержимого флага переноса (С), размещает результат в регистре назначения Rd: Rd <- Rd + Rr + C. Устанавливает флаги Z , C , N , V , H.
Пример:
; Сложить R1 : R0 с R3 : R2
ADC r2, r0 ; Сложить младший байт
ADC r3, r1 ; Сложить старший байт с переносом
Команда ADIW (Add Immediate to Word)
Синтаксис: ADIW Rdl,K
dl = {24,26,28,30}, 0 < K<64
Данная команда осуществляет сложение непосредственного значения (0-63) с парой регистров и размещение результата в паре регистров:
Rdh:Rdl <- Rdh:Rdl +К.
Команда работает только с четырьмя верхними парами регистров, удобна для работы с регистрами указателями. Устанавливает флаги Z , C , N , V.
Пример:
adiw r24, $1 ; Сложить $1 с r25:r24
adiw r30, $63 ; Сложить $63 с Z указателем (r31 : r30)
Команда SUB
Синтаксис: SUB Rd,Rr
16 < d < 31, 0 < r < 31
Команда осуществляет вычитание содержимого регистра-источника Rr из содержимого регистра-приемника Rd, результат помещает в регистре назначения: Rd = Rd – Rr. Устанавливает флаги H,V,N,Z,C.
Пример:
sub r13, r12 ; Вычесть r12 из r13
Команда SUBI
Синтаксис: SUB Rd, K
16 < d < 31, 0 < K < 255
Команда SUB производит вычитание константы из содержимого регистра, размещает результата в регистре назначения. Устанавливает флаги H,V,N,Z,C.
Пример:
subi r22, $11 ; Вычесть $11 из r22
Команда SBC
Синтаксис: SBC Rd ,Rr
0 < d < 31, 0 < r < 31
Команда SBC осуществляет вычитание содержимого регистра-источника и содержимого флага переноса (С) из регистра Rd, результат помещает в регистре назначения Rd. Устанавливает флаги H,V,N,Z,C.
Пример:
; Вычесть r1 : r0 из r3 : r2
sub r2, r0 ; Вычесть младший байт
sbc r3, r1 ; Вычесть старший байт с переносом
Команда SBCI
Синтаксис: SBCI Rd,K
0 < d < 31, 0 < K < 255
Команда осуществляет вычитание константы и содержимого флага переноса (С) из содержимого регистра, размещение результата в регистре назначения Rd. Устанавливает флаги H,V,N,Z,C регистра флагов.
Пример
; Вычесть $2567 из r14 : r15
subi r14, $67 ; Вычесть младший байт
sbci r15, $25 ; Вычесть старший байт с переносом
Команда SBIW
Синтаксис: SBIW Rdl,K
dl={24,26,28,30}, 0 < K<63
Команда осуществляет вычитание непосредственного значения (0-63) из пары регистров и размещает результата в паре регистров. Команда работает с четырьмя верхними парами регистров, удобна для работы с регистрами указателями. Устанавливает флаги H,V,N,Z,C регистра флагов.
Пример:
sbiw r24, $3 ; Вычесть $3 из r25:r24
sbiw r28, $A2 ; Вычесть $A2 из Y указателя (r29 : r28)
Команда DEC
Синтаксис: DEC Rd
0 < d < 31
Команда осуществляет вычитание единицы - 1 - из содержимого регистра Rd и размещает результат в регистре назначения Rd. Флаг переноса регистра статуса данной командой не активируется, что позволяет использовать команду DEC использовать при реализации счетчика циклов для вычислений с повышенной точностью. Устанавливает флаги V,N,Z регистра флагов.
Пример:
ldi r16, $09 ; Загрузить константу в r16metka1: add r3, r4 ; Сложить r4 с r3 dec r16 ; Уменьшить на 1 r16 brne metka1 ; Перейти если r16 <> 0 nop ; Продолжать (пустая операция)Команда INC
Синтаксис: INC Rd
0 < d < 31
Команда увеличения на единицу содержимого регистра Rd и размещения результата в регистре назначения Rd. Устанавливает флаги V,N,Z регистра флагов.
Пример:
clr r23 ; Очистить r23
metka2: inc r23 ; Увеличить на 1 r23
. . .
cpi r23, $45 ; Сравнить r23 с $45
brne metka2; Перейти если не равно
nop ; Продолжать (пустая операция)
Команды умножения
Команда MUL
Синтаксис: MUL Rd,Rr
0 < d < 31,0 < r < 31
Команда перемножает две 8-разрядные величины без знаков с получением 16- разрядного результата без знака. Множимое и множитель - два регистра - Rr и Rd, соответственно. Произведение размещается в регистрах R1 (старший байт ) и R0 (младший байт). Следует учесть, что если в качестве множимого и множителя выбрать R0 или R1, то результат заместит прежние значения сразу после выполнения операции. Если в результате команды MUL установлен в единицу бит 15 результата, то флаг C регистра флагов устанавливается в 1.
Пример:
mul r3, r4 ; Перемножить r3 и r4
mov r3, r1 ; Вернуть результат обратно в r3:r4
mov r4, r0 ; Вернуть результат обратно в r3:r4
Команда FMUL
Синтаксис FMUL Rd,Rr
16 ≤d ≤23, 16 ≤ r ≤23
Эта команда выполняет знаковое умножение 2х 8ми битных величин и сдвиг результата на 1 бит влево. 16ти разрядный результат помещается в пару регистров: R01 и R00. Причем старший бит результата находится в регистре R01, а младший – в регистре R00.
Если в результате команды FMUL бит 15 результата до сдвига установлен, то флаг С установлен в 1, иначе флаг С =0. Флаг Z установлен в том случает. если результат равен $0000, иначе флаг Z очищен.
Пример: перемножить 2 величины 15d и 33d:
ldi r16,15
ldi r17,33
fmul r16,r17
Результат: R00=DE h
R01=03 h
Команды сравнения
Команда TST
Синтаксис: TSR Rd
где 0 < d < 31
Команда осуществляет проверку на ноль или минус. При её выполнении производится логическое умножение («И») регистра источника самого на себя и выставляются соответствующие флаги, но сам результат логического умножения никуда не записывается. Устанавливает флаги V,N,Z регистра флагов.
Пример:
tst r2 ; Выставить флаги нулевого или отрицательного значения по содержимому регистра r2
Команда CP
Синтаксис CP Rd,Rr
0 < d < 31,0 < r < 31.
Данная команда выполняет сравнение содержимого двух регистров Rd и Rr путем вычитания Rd-Rr. Содержимое регистров не изменяется. После выполнения данной команды устанавливаются флаги:H,Z,C,V,N,S. Команда CP применяется вместе с командами перехода.
Пример:
cp r4, r19 ; Сравнить r4 с r19 brne noteq ; Перейти если r4 <> r19
Команда CPC
Синтаксис CPC Rd,Rr
0 < d < 31, 0 < r < 31
Команда выполняет сравнение содержимого двух регистров Rd и Rr и учитывает также перенос предшествующей команды. Сравнение выполняется путем вычитания: Rd-Rr-C. Содержимое регистров не изменяется, а после выполнения устанавливаются флаги: H,Z,C,V,N,S. После этой команды можно выполнять любые условные переходы.
Пример: ; Сравнить r3 : r2 с r1 : r0
cp r2, r0 ; Сравнить старший байт
cpc r3, r1 ; Сравнить младший байт
brne noteq ; Перейти, если не равно
Команда CPI
Синтаксис CPI Rd, K
16 ≤ d ≤31, 0 < K <255
Команда выполняет сравнение содержимого регистра Rd с константой путем вычитания содержимого Rd-K. Содержимое регистра не изменяется, устанавливаются флаги: H,Z,C,V,N,S. После этой команды можно выполнять любые условные переходы.
Пример:
cpi r12, 15 ; Сравнить r12 с 15 brne error ; Перейти если r12 <> 15Логические команда
Команда AND
Синтаксис: AND Rd, Rr
где 0 < d < 31, 0 < r < 31
Команда межрегистрового логического «И». Иначе: команда межрегистрового логического умножения, где логическое «да» наступает только в случае единогласного «да», а логическое «нет», соответственно, во всех остальных случаях (см. таблицу 1).
Таблица 1.
Пример:
and r2, r0 ; Логически перемножить содержимое ;регистров r2 и r0
and r20, r30 ; Логически перемножить содержимое ;регистров r20 и r30
Команда ANDI
Синтаксис: ANDI Rd, K
где 0 < d < 31, 0 < K < 255
Команда осуществляет операцию логического «И» (см. таблицу 1) для содержимого регистра и непосредственного значения (константы).
Пример:
andi r30, $50 ; Логически умножить содержимое ;регистра r30 на 80
andi r23, $B5 ; Логически умножить содержимое ;регистра r23 на 181
Команда OR
Синтаксис: OR Rd, Rr
где 0 < d < 31, 0 < r < 31
Команда межрегистрового логического «ИЛИ». Иначе: команда логического сложения, где логическое «нет» наступает только в случае единогласного «нет», в остальных случаях – логическое «да» (см. таблицу 2).
Таблица 2
Пример:
or r4, r8 ; Логически сложить содержимое регистра ;r4 с содержимым регистра r8
or r3, r5 ; Логически сложить содержимое регистра ; ;r3 с содержимым регистра r5
Команда ORI
Синтаксис: ORI Rd, K
где 0 < d < 31, 0 < K < 255
Команда логического «ИЛИ» (см. таблицу 2) для содержимого регистра и непосредственного значения (константы).
Пример:
ori r28, $A0 ; Логически сложить содержимое ;регистра r28 с константой, равной 160
ori r4, $04 ; Логически сложить содержимое ;регистра r4 с константой, равной 4
Команда EOR
Синтаксис: EOR Rd, Rr
где 0 < d < 31, 0 < r < 31
Команда осуществляет операцию исключающего «ИЛИ» над содержимым двух регистров (см. таблицу 3).
Таблица 3
Пример:
eor r6, r9 ; Выполнить логическую операцию ;исключающего ИЛИ над содержимым
; регистра r6 и содержимым регистра r9
eor r17, r21 ; Выполнить логическую операцию ;ислючающего ИЛИ над содержимым
;регистра r17 и содержимым регистра ;r21
Команды условного перехода
Команда CPSE
Синтаксис: CPSE Rd, Rr
где 0 < d < 31, 0 < r < 31
Команда межрегистрового сравнения и перехода через последующую команду, в случае равенства содержимого регистра источнике и регистра приёмнике.
Пример:
cpse r28, r30 ; Перешагнуть следующую команду, ;если содержимое r28 = r30
Команда SBRC
Синтаксис: SBRC Rd, n
где 0 < d < 31, 0 < n < 7
Команда перехода через последующую команду, в случае, когда указанный бит в регистре приёмнике сброшен (равен нулю).
Пример:
sbrc r0, 2 ;Перешагнуть следующую команду в ;случае, когда содержимое r0 вида xxxxx0xx
Команда SBRS
Синтаксис: SBRS Rd, n
где 0 < d < 31, 0 < n < 7
Команда перехода через последующую команду, в случае, когда указанный бит в регистре приёмнике установлен (равен единице).
Пример:
sbrs r30, 5 ;Перешагнуть следующую команду в случае,
;когда в регистре r30 установлен 5й бит.
Команда SBIC
Синтаксис: SBIC Rd, n
где 0 < d < 31, 0 < n < 7
Команда перехода через последующую команду, в случае, когда указанный бит в регистре I/O сброшен (равен нулю).
Пример:
sbic pina, 5 ; Перешагнуть следующую команду в случае, когда порт А содержит последовательность вида xx0xxxxx
Команда SBIS
Синтаксис: SBIS Rd, n
где 0 < d < 31, 0 < n < 7
Команда перехода через последующую команду, в случае, когда указанный бит в регистре I/O установлен (равен единице).
Пример:
sbis pinb, 3 ; Перешагнуть следующую команду в случае, когда порт B содержит последовательность вида xxxx1xxx
Команда BRBS
Синтаксис: BRBS s, k
где 0 < s < 7, -64 < k < 63
Команда относительного перехода через k+1 команду, в случае, если указанный флаг статусного регистра установлен (равен единице). Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Пример:
brbs 3, Exit ; Переход на метку Exit, находящуюся в пределах 64 команд в случае, когда установлен флаг переполнения
Команда BRBC
Синтаксис: BRBC s , k
где 0 < s < 7, -64 < k < 63
Команда относительного перехода через k+1 команду, в случае, если указанный флаг статусного регистра сброшен (равен нулю). Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Пример:
brbc 1, Exit ; Переход на метку Exit, находящуюся в пределах 64 команд в случае, когда сброшен флаг нулевого значения
Команда BREQ
Синтаксис: BREQ n
где -64 < n < 63
Команда относительного перехода через n+1 команду, если в результате выполнения предыдущей команды флаг нулевого значения установлен в единицу. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRNE
Синтаксис: BRNE n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если после выполнения предыдущей команды флаг нулевого значения сброшен, т.е. равен нулю. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRCS
Синтаксис: BRCS n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) флаг переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRCC
Синтаксис: BRCC n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) флаг переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRSH
Синтаксис: BRSH n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если после выполнения предыдущей команды сброшен флаг переноса (равный нулю). Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRLO
Синтаксис: BRLO n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если после выполнения предыдущей команды установлен (равен единице) флаг переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRMI
Синтаксис: BRMI n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) флаг отрицательного значения. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRPL
Синтаксис: BRPL n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) флаг переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRGE
Синтаксис: BRGE n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если после выполнения предыдущей команды по предыдущей команде. Определяющую роль играет равенство нулю суммы по модулю 2 флагов отрицательного значения и переполнения. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRLT
Синтаксис: BRLT n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если после выполнения предыдущей команды установлен флаг знака (S) регистра статуса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRHS
Синтаксис: BRHS n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) флаг половинного переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRHC
Синтаксис: BRHC n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) флаг половинного переноса. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRTS
Синтаксис: BRTS n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) пользовательский флаг. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRTC
Синтаксис: BRTC n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) пользовательский флаг. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRVS
Синтаксис: BRVS n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) флаг переполнения. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRVC
Синтаксис: BRVC n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) флаг переполнения. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRIE
Синтаксис: BRIE n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если установлен (равен единице) флаг глобального прерывания, то есть прерывание разрешено. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Команда BRID
Синтаксис: BRID n
где -64 < n < 63
Команда относительного перехода через n+1 команду, в случае, если сброшен (равен нулю) флаг глобального прерывания, то есть прерывание запрещено. Переходить можно не более чем на 63 команды вперёд или на 64 команды назад, относительно текущей позиции курсора.
Синтаксис:
.ORG адрес
Пример:
.DSEG ; Начало сегмента данных
.ORG 0x37 ; Установить адрес СОЗУ на 37h
variable: .BYTE 1 ;Зарезервировать байт СОЗУ по адресу 37h
.CSEG
.ORG 0x10 ;Установить счетчик команд на адрес 10h
mov r0,r1 ; Чего-нибудь делать
5. Директива DB резервирует ресурсы памяти в программной памяти или в EEPROM. Директиве должна предшествовать метка. DB задает список выражений, и должна содержать по крайней мере одно выражение. Размещать директиву следует в сегменте кодов или в EEPROM сегменте.
Список выражений представляет собой последовательность выражений, разделенных запятыми. Каждое выражение должно быть величиной между –128 и 255.
Если директива указывается в сегменте кодов и список выражений содержит более двух величин, то выражения будут записаны так, что 2 байта будут размещаться в каждом слове Flash-памяти.
Синтаксис:
LABEL: .DB список выражений
Пример:
.CSEG
consts: .DB 0, 255, 0b01010101, -128, 0xaa
.ESEG
const2: .DB 1,2,3
6. Директива DW резервирует ресурсы памяти в программной памяти или в EEPROM. Директиве должна предшествовать метка. DW задает список выражений, и должна содержать по крайней мере одно выражение. Размещать директиву следует в сегменте кодов или в EEPROM сегменте.
Список выражений представляет собой последовательность выражений, разделенных запятыми. Каждое выражение должно быть величиной между –32768 и 65535.
Синтаксис:
LABEL: .DW список выражений
Пример:
.CSEG
varlist: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535
.ESEG
eevarlst: .DW 0,0xffff,10
7. Директива DEF позволяет присвоить символическое имя регистру. Регистр может иметь несколько символических имен.
Синтаксис:
.DEF Имя=Регистр
Пример:
.DEF temp=R16
.DEF ior=R0
.CSEG
ldi temp,0xf0 ; Загрузить 0xf0 в регистр temp
in ior,0x3f ; Прочитать SREG в регистр ior
eor temp,
8. Директива EQU присваивает значение метке. Эта метка может быть использована в других выражениях. Значение этой метки нельзя изменить или переопределить.
Синтаксис:
.EQU метка=выражение
Пример:
.EQU io_offset = 0x23
.EQU porta = io_offset + 2
.CSEG ; Начало сегмента кодов
clr r2 ; Очистить регистр r2
out porta,r2 ; Записать в порт А
9. Директива INCLUDE говорит Ассемблеру начать читать из другого файла. Ассемблер будет ассемблировать этот файл до конца файла или до директивы EXIT. Включаемый файл может сам включать директивы INCLUDE.
Синтаксис:
.INCLUDE "имя файла"
Пример:
.EQU sreg = 0x3f ; Регистр статуса
.EQU sphigh = 0x3e ; Старший байт указателя стека.
.EQU splow = 0x3d ; Младший байт указателя стека.
.INCLUDE iodefs.asm ; Включить файл «iodefs.asm»
in r0,sreg ; Прочитать регистр статуса
10. Директива EXIT позволяет ассемблеру остановить ассемблирование текущего файла. Обычно ассемблер работает до конца файла. Если он встретит директиву EXIT, то продолжит ассемблировать со строки, следующей за директивой INCLUDE.
Синтаксис:
.EXIT
Пример:
.EXIT ; выйти из этого файла
11. Директива DEVICE позволяет пользователю сообщить ассемблеру, для какого типа устройства пишется программа. Если ассемблер встретит команду, которая не поддерживается указанным типом микроконтроллера, то будет выдано сообщение. Также сообщение появится в случае, если размер программы превысит объем имеющейся в этом устройстве памяти.
Синтаксис:
.DEVICE AT90S1200 | AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103 | Atmega8535
Пример:
.DEVICE ATmega8535 ;использовать ATmega8535
.CSEG
.ORG 0000
jmp label1 ;При ассемблировании появиться сообщение, что
;ATmega8535 не поддерживает команду jmp
Окно регистров ввода/вывода
Окно регистров содержит дерево всех устройств. Напротив каждого устройства стоит знак «+». Для того что бы увидеть все его регистры, необходимо раскрыть устройство, нажимая на напротив устройства. Так, например, регистр ввода/вывода порта А содержит три регистра: регистр данных PORTA, регистр направления DDRA и выводы порта PINA (рисунок 11). Справа от обозначения порта выведено его текущее состояние в виде шестнадцатеричного числа и битовое изображение. Мышкой можно задавать значения битов "0" или "1". Этим эмулируется воздействие внешних сигналов.
Рисунок 11 Окно регистров ввода/вывода
Запуск эмулятора
Программа "AVR Studio" позволяет запустить программу в реальном времени и в пошаговом режиме. В меню отладки «Debug» находятся все варианты запуска программы, например:
– Run, запуск программы в реальном времени, результат будет виден только после остановки программы;
– Break, останов программы, после просмотра исполнение программы можно продолжить;
– Reset, сброс программы установка счетчика команд на начало программы;
– Step Over, пошаговое исполнение, при этом программа останавливается после каждой команды, стрелка указывает на текущую команду;
– AutoStep, запуск программы на непрерывное исполнение с возможностью просмотра текущих шагов исполнения.
При пошаговом режиме можно наблюдать за состоянием регистров после исполнения каждой команды, проверяя при этом правильность операций. Запустив программу кнопкой "AutoStep", получим ее непрерывное исполнение и индикацию регистров во времени. Желтая стрелка в окне дизассемблера показывает текущую исполняемую команду. Приостановив исполнение программы кнопкой "Break", можно изменить значения регистров ввода/вывода, т.е. задать разные значения входных сигналов. И далее снова запустив программу кнопкой "AutoStep", просмотреть реакцию микроконтроллера на эти воздействия (рисунок 14).
Рисунок 14 Запуск эмулятора на исполнение
После того как программа запущена на пошаговое выполнение, для следующего шага необходимо нажать клавишу F11.
Программа, написанная на ассемблере, должна иметь определенную структуру. Для ATmega8535 структура программы имеет вид:
; название программы, необходимые пояснения ;
.include “m 8535 def . inc” ; файл описания ATmega 8535
.include «имя_файла1.расширение ; включение дополнительных файлов
; объявление глобальных констант
.equ имя1 = xxxx ;
.equ имя2 = nnnn
; объявление глобальных регистровых переменных
.def имя1= регистр
.def имя2= регистр
; указание сегмент данных
.dseg
.org xxxx ; адрес первого зарезервированного байта
label 1: .BYTE 1 ; резервировать 1 байт под переменную label 1
label 2: .BYTE m ; резервировать m байт под переменную label 2
; сегмент EEPROM (ЭСППЗУ)
.eseg
.org xxxx ; адрес первого зарезервированного байта
.db выражение1,выражение2,… ; записать список байтов в EEPROM.
.dw выражение1,выражение2,… ; записать список слов в EEPROM.
; сегмент кодов
.cseg
.org $0000 ; адрес начала программы в программной памяти
; вектора прерываний (если они используются)
rjmp reset ;прерывание по сбросу
.org $0002
rjmp INT 0 ;обработчик прерывания INT 0
.org $0004
rjmp INT 1 ;обработчик прерывания INT 1
.org adrINTx ;адрес следующего обработчика прерываний
rjm p INTx ;обработчик прерывания x
……. ;далее располагаются обработчики остальных ;прерываний
; начало основной программы
main: <команда> xxxx
… …
; подпрограмма 1
subr 1: <команда> xxxx
…… ………. ……
ret
; программы обработчиков прерываний
INT 0: <команда> xxxx
…… ………. ……
reti
………………………
; конец программы не обозначается
Лабораторная работа №1
Цель работы
Изучение регистров общего назначения (РОН) и команд пересылки данных.
Постановка задачи
1. Занести число из столбца «Число 1» таблицы 7 и строки, соответствующей заданному варианту, в регистр R 24;
2. Занести число из столбца «Число 2» таблицы 7 и строки, соответствующей заданному варианту, в в регистр R 25;
3. Занести число из столбца «Число 3» таблицы 7 и строки, соответствующей заданному варианту, в регистровую пару X(R 26:27);
4. Занести число из столбца «Число 4» таблицы 7 и строки, соответствующей заданному варианту, в в регистр в регистровую пару Y(R 28:29);
5. Занести содержимое регистровой пары X в оперативную память, младшую часть регистровой памяти занести по адресу $0070, старшую – по адресу $0071.
6. Занести содержимое регистровой пары Y в оперативную память, младшую часть регистровой памяти занести по адресу $0080, старшую – по адресу $0081.
7. Обменять числа, хранящиеся в регистрах R 24 и R 25 после выполнения пунктов 1 и 2, между собой, 3-мя разными способами;
8. Обменять числа, хранящиеся в регистровых парах X и Y после выполнения пунктов 3 и 4, между собой, 3-мя разными способами;
9. Обменять между собой содержимое четырех ячеек оперативной памяти: содержимое ячейки памяти с адресом $0070 поменять с содержимым ячейки $0080, а содержимое ячейки памяти с адресом $0071 поменять с содержимым ячейки памяти с адресом $0081.
Таблица 7
Номер варианта | Число 1 | Число 2 | Число 3 | Число 4 |
1 | 38 | 45 | 4F5A | 8765 |
2 | 56 | 48 | 6BCF | 7654 |
3 | 54 | 42 | 0123 | 6543 |
4 | 48 | 54 | 1234 | 5432 |
5 | 89 | 52 | 2345 | 4321 |
6 | 58 | 59 | 3456 | 3210 |
7 | 55 | 12 | 4567 | 210F |
8 | 98 | 25 | 5678 | 10FE |
9 | 48 | 34 | 6789 | 0FED |
10 | 54 | 48 | 789A | 2468 |
11 | 75 | 56 | 89AB | 468A |
12 | 25 | 67 | 9ABC | 68AC |
13 | 26 | 62 | ABCD | 8ACE |
14 | 53 | 78 | BCDE | ACE8 |
15 | 24 | 83 | CDEF | CE86 |
16 | 15 | 94 | DEF0 | E864 |
17 | 81 | 71 | EF01 | 8642 |
18 | 11 | 54 | F012 | 1357 |
19 | 15 | 82 | FEDC | 3579 |
20 | 45 | 8 | EDCB | 579B |
21 | 52 | 3 | DCBA | 79BD |
22 | 57 | 54 | CBA9 | 9BDE |
23 | 64 | 58 | BA98 | BDE1 |
24 | 54 | 64 | A987 | DE13 |
25 | 68 | 67 | 9876 | E135 |
Содержание отчета
Отчет по лабораторной работе должен содержать номер, название, цель лабораторной работы, задание на лабораторную работу, текст программы на языке ассемблера.
Цель работы
Изучение арифметических команд и получение навыка работы с ними.
Постановка задачи
Занести числа в память:
a = ;
b = ;
c = N;
d = N - 1;
e = ;
Для вариантов 1 – 10:
f = ;
Для вариантов после 10:
f = .
N – номер варианта по списку группы или выданный преподавателем.
Произвести операции над числами a,b,c,d,e,f по вариантам, заданным в таблице 8.
Таблица 8
Номер варианта | Выражение | Номер варианта | Выражение |
1 | 15 | ||
2 | 16 | ||
3 | 17 | ||
4 | 18 | ||
5 | 19 | ||
6 | 20 | ||
7 | 21 | ||
8 | 22 | ||
9 | 23 | ||
10 | 24 | ||
11 | 25 | ||
12 | 26 | ||
13 | 27 | ||
14 | 28 |
Содержание отчета
Отчет по лабораторной работе должен содержать номер, название, цель лабораторной работы, задание на лабораторную работу, текст программы на языке ассемблера.
Цель работы
Изучение логических команд и команд манипулирования битами и получение навыка работы с ними.
Постановка задачи
Занести числа в память:
a = N +100;
b = ;
c = N+60;
d = N+125.
N – номер варианта по списку группы или выданный преподавателем.
Произвести операции над числами a,b,c,d следующие задания:
Содержание отчета
Отчет по лабораторной работе должен содержать номер, название, цель лабораторной работы, задание на лабораторную работу, текст программы на языке ассемблера.
Литература
1. Балакина Е.П., Воробьёва Л.Н., Гречишников В.А. Интегрирование программных модулей ассемблера в среде DELPHI. Методические указания к лабораторным работам по дисциплине «Машино-Ориентированные Языки». – М.: МИИТ, 2009. –56 с.
2. Хусаинов Р.З., Садов В.Б. Программирование микроконтроллеров ATmega8535: методические указания к выполнению лабораторных работ.– Челябинск, 2009.– 123с.
3. http://www.gaw.ru/html.cgi/txt/doc/micros/avr/asm/start.htm
Приложение 1
Таблица 9. Арифметические и логические команды
Мнемоника | Операнды | Описание | Операция | Флаги | Кол-во циклов |
ADD | Rd , Rr 0≤ d≤31, 0≤r≤31 | Сложить без переноса | Rd Rd + Rr | Z, C, N, V, H | 1 |
ADC | Rd.Rr 0≤d≤31 , 0≤ r ≤31 | Сложить с переносом | Rd Rd + Rr+ С | Z, C, N, V, H | 1 |
ADIW | Rd,K dE{24,26,28,30} 0≤ K ≤63 | Сложить непосредственное значение со словом | Rdh:Rdl Rdh:Rdl+ К | Z, C, N, V | 2 |
SUB | Rd,Rr 0≤d≤31 , 0≤ r ≤31 | Вычесть без заема | Rd Rd – Rr | Z, C, N, V, H | 1 |
SUBI | Rd, К 16≤d≤31 0≤K≤255 | Вычесть непосредственное значение | Rd Rd – К | Z, C, N, V, H | 1 |
SBC | Rd, Rr 0≤d≤31 , 0≤ r ≤31 | Вычесть с заемом | Rd ß Rd-Rr-C | Z, C, N, V, H | 1 |
SBCI | Rd, К 16≤d≤32 , 0≤ K ≤255 | Вычесть непосредственное значение с заемом | Rd ß Rd-K-C | Z, C, N, V, H | 1 |
SBIW | Rd, К dE{24,26,28,30} О ≤ К ≤ бЗ | Вычесть непосредственное значение из слова | Rdh:Rdl ß Rdh:Rdl-K | Z, C, N, V | 2 |
AND | Rd, Rr 0≤d≤31 , 0≤r≤31 | Выполнить логическое AND | Rd ß Rd • Rr | Z, N, V | 1 |
ANDI | Rd, К 16<d<31 0<k≤255 | Выполнить логическое AND | Rd ß Rd • К | Z, N, V | 1 |
OR | Rd, Rr 0≤d≥31 , 0≤ r ≤31 | Выполнить логическое OR | Rd ß Rd v Rr | Z, N, V | 1 |
ORI | Rd , К 16≤d≤31, 0≤ K ≤255 | Выполнить логическое OR с непосредственным значением | Rd ß Rd v К | Z, N, V | 1 |
EOR | Rd, Rr 0≤d≤31 , 0≤г≤31 | Выполнить исключающее OR | Rd ß Rd Rr | Z, N, V | 1 |
СОМ | Rd 0≤d≤31 | Выполнить дополнение до единицы | Rd ß SFF-Rd | Z, C, N, V | 1 |
NEG | Rd 0≤d≤31 | Выполнить дополнение до двух | Rd ß S00 - Rd | Z, C, N, V, H | 1 |
SBR | Rd , К 16≤d≤31, 0≤K≤255 | Установить биты в регистре | Rd ß Rd v К | Z, N,V | 1 |
CBR | Rd , К 16≤ d ≤31 O ≤ K ≤255 | Очистить биты в регистре | Rd ß Rd • (SFF - К ) | Z, N, V | 1 |
INC | Rd 0≤d≤31 | Инкрементировать | Rd ß Rd + 1 | Z, N,V | 1 |
DEC | Rd 0≤d≤31 | Декрементировать | Rd ß Rd - 1 | Z, N,V | 1 |
TST | Rd 0≤r≤31 | Проверить на ноль или минус | Rd ß Rd.Rd | Z, N, V | 1 |
CLR | Rd 0≤d≤31 | Очистить регистр | Rd ß Rd Å Rd | Z, N, V | 1 |
SER | Rd 16≤d≤31 | Установить все биты регистра | Rd ß S FF | нет | 1 |
MUL | Rd,Rr 0≤d≤31 , 0≤ r ≤31 | Беззнаковое умножение целых чисел | R1:R0 ß Rd*Rr | Z,C | 2 |
MULS | Rd,Rr 16≤d≤31 , 16≤r≤31 | Умножение целых чисел с учётом знака | R1:R0 ß Rd*Rr | Z,C | 2 |
MULSU | Rd,Rr 16≤ d ≤23, 16≤ r ≤23 | Целочисленное умножение числа со знаком на число без знака | R1:R0 ß Rd*Rr | Z,C | 2 |
FMUL | Rd,Rr 16≤d≤23 , 16≤ r ≤23 | Беззнаковое умножение дробных чисел | R1:R0 ß (Rd*Rr)<<1 | Z,C | 2 |
FMULS | Rd,Rr 16≤d≤23 , 16≤ r ≤23 | Умножение дробных чисел с учётом знака | R1:R0 ß (Rd*Rr)<<1 | Z,C | 2 |
FMULSU | Rd,Rr 16≤d≤23 , 16≤ r ≤23 | Умножение дробного числа со знаком на дробное число без знака | R1:R0 ß (Rd*Rr)<<1 | Z,C | 2 |
CP | Rd, Rr 0≤d≤31 , 0≤ r ≤31 | Сравнить | Rd - Rr | Z, C, N, V, H | 1 |
CPC | Rd, Rr 0≤d≤31 , 0≤r≤31 | Сравнить с учетом переноса | Rd-Rr-C | Z, C, N, V, H | 1 |
CPI | Rd, К 16≤d≤31 , 0≤K≤255 | Сравнить с константой | Rd-K | Z, C, N, V, H | 1 |
Таблица 10. Команды сдвигов и операций с битами
Мнемоника | Операнды | Описание | Операция | Флаги | Кол-во циклов |
LSL | Rd 0≤d≤31 | Логически сдвинуть влево | Rd(n+1) ß Rd(n), Rd(0) ß 0, Cß Rd(7) | Z,C,N,V,H | 1 |
LSR | Rd 0≤d≤31 | Логически сдвинуть вправо | Rd(n) ß Rd(n+1), Rd(7) ß 0, C ß Rd(0) | Z,C,N,V | 1 |
ROL | Rd 0≤d≤31 | Сдвинуть влево через перенос | Rd(0) ß C, Rd(n+1) ß Rd(n), C ß Rd (7) | Z,C,N,V,H | 1 |
ROR | Rd 0≤d≤31 | Сдвинуть вправо через перенос | Rd(7) ß C, Rd(n) ß Rd(n+1), C ß Rd (0) | Z,C,N,V | 1 |
ASR | Rd 0≤d≤31 | Арифметически сдвинуть вправо | Rd(n) ß Rd(n+1), n=0...6, Rd(0) ß C | Z,C,N,V | 1 |
SWAP | Rd 0≤d≤31 | Поменять нибблы местами | Rd (3...0) <–> Rd (7...4) | Нет | 1 |
BSET | s 0≤s≤7 | Установить флаг | SREG ( s ) ß 1 | SREG(s) | 1 |
BCLR | s 0≤ s ≤7 | Очистить флаг | SREG(s) ß 0 | SREG(s) | 1 |
SBI | P,b O≤P≤31, 0≤b≤7 | Установить бит в регистр I/O | l/0(P,b) ß 1 | Нет | 2 |
CBI | P , b 0≤ P ≤31, 0≤ b ≤7 | Очистить бит в регистре I/O | l/0(P,b) ß 0 | Нет | 2 |
BST | Rd,b 0≤d≤31, 0≤b≤7 | Переписать бит из регистра во флаг Т | Т ß Rd(b) | Т | 1 |
BLD | Rd,b 0≤ d ≤31, 0≤b≤7 | Загрузить Т флаг в бит регистра | Rd(b) ß Т | Нет | 1 |
SEC | Установить флаг переноса | С ß 1 | С | 1 | |
CLC | Очистить флаг переноса | С ß 0 | С | 1 | |
SEN | Установить флаг отрицательного значения | N ß 1 | N | 1 | |
CLN | Очистить флаг отрицательного значения | N ß 0 | N | 1 | |
SEZ | Установить флаг нулевого значения | Z ß 1 | Z | 1 | |
CLZ | Очистить флаг нулевого значения | Z ß 0 | Z | 1 | |
SEI | Установить флаг глобального прерывания | I ß 1 | I | 1 | |
CLI | Очистить флаг глобального прерывания | I ß 0 | I | 1 | |
SES | Установить флаг знака | S ß 1 | S | 1 | |
CLS | Очистить флаг знака | S ß 0 | S | 1 | |
SEV | Установить флаг переполнения | V ß 1 | V | 1 | |
CLV | Очистить флаг переполнения | V ß 0 | V | 1 | |
SET | Установить флаг Т | T ß 1 | T | 1 | |
CLT | Очистить флаг Т | Т ß 0 | T | 1 | |
SEH | Установить флаг полу переноса | Н ß 1 | Н | 1 | |
CLH | Очистить флаг полу переноса | Н ß 0 | Н | 1 | |
NOP | Выполнить холостую команду | Нет | 1 | ||
SLEEP | Установить режим SLEEP | Нет | 1 | ||
WDR | Сбросить сторожевой таймер | Нет | 1 |
Таблица 11. Команды пересылки данных
Мнемоника | Операнды | Описание | Операция | Флаги | Кол-во циклов |
ELPM | Расширенная загрузка из памяти программ в регистр RO | R0 ß (Z+RAMPZ) | Нет | 3 | |
MOV | Rd,Rr 0≤d≤31, 0≤ r ≤31 | Копировать регистр | Rd ß Rr | Нет | 1 |
LDI | Rd , k 16≤ d ≤31,0≤ k ≤255 | Загрузить непосредственное значение | Rd ß K | Нет | 1 |
LDS | Rd , k 0≤d≤31 0≤k≤65535 | Загрузить из ОЗУ | Rd ß ( k ) | Нет | 3 |
LD | Rd,X 0≤d≤31 | Загрузить косвенно | Rd ß (X) | Нет | 2 |
LD | Rd , X + 0≤d≤31 | Загрузить косвенно с постинкрементом | Rd ß (X), X ß X+1 | Нет | 2 |
LD | Rd , X - 0≤d≤31 | Загрузить косвенно с преддекрементом | X ß X-1, Rd ß (X) | Нет | 2 |
LD | Rd , Y 0≤ d ≤31 | Загрузить косвенно | Rd ß ( Y ), | Нет | 2 |
LD | Rd,Y+ 0≤ d ≤31 | Загрузить косвенно с постинкрементом | Rd ß (Y), Y ß Y+1 | Нет | 2 |
LD | Rd , Y 0≤ d ≤31 | Загрузить косвенно с преддекрементом | Y ß Y-1, Rd ß (Y) | Нет | 2 |
LDD | Rd,Y+q 0≤d≤31 , 0≤ q ≤63 | Загрузить косвенно со смещением | Rd ß (Y+q) | Нет | 2 |
LD | Rd , Z 0≤d≤31 | Загрузить косвенно | Rd ß ( Z ) | Нет | 2 |
LD | Rd,Z+ 0≤ d ≤31 | Загрузить косвенно с постинкрементом | Rd ß (Z), Z ß Z+1 | Нет | 2 |
LD | Rd ,- Z 0≤ d ≤31 | Загрузить косвенно с преддекрементом | Z ß Z-1, Rd ß (Z) | Нет | 2 |
LDD | Rd,Z+q 0≤ d ≤31, 0≤ q ≤31 | Загрузить косвенно со смещением | Rd ß (Z+q) | Нет | 2 |
STS | k,Rr 0≤d≤31 , 0≤k≤65535 | Загрузить непосредственно в ОЗУ | ( k ) ß Rr | Нет | 3 |
ST | X,Rr 0≤r≤31 | Записать косвенно | (X) ß Rr | Нет | 2 |
ST | X+,Rr 0≤ r ≤31 | Записать косвенно с постинкрементом | (X) ß Rr, X ß X+ 1 | Нет | 2 |
ST | -X,Rr 0≤r≤31 | Записать косвенно с преддекрементом | X ß X-1, (X) ß Rr | Нет | 2 |
ST | Y,Rr 0≤r≤31 | Записать косвенно | ( Y ) ß Rr | Нет | 2 |
ST | Y+,Rr 0≤r≤31 | Записать косвенно с постинкрементом | (Y) ß Rr, Y ß Y+ 1 | Нет | 2 |
STD | Y+q,Rr 0≤r≤31 , 0≤ q ≤63 | Записать косвенно со смещением | (Y+q) ß Rr | Нет | 2 |
ST | Z,Rr 0≤ r ≤31 | Записать косвенно | ( Z ) ß Rr | Нет | 2 |
ST | Z+,Rr 0≤r≤31 | Записать косвенно с постинкрементом | (Z) ß Rr, Z ß Z+ 1 | Нет | 2 |
ST | -Z,Rr 0≤ r ≤31 | Записать косвенно с преддекрементом | Z ß Z-1, (Z) ß Rr | Нет | 2 |
STD | Z+q,Rr 0≤r≤31 , 0≤ q ≤63 | Записать косвенно со смещением | (Z+q) ß Rr | Нет | 2 |
LPM | Загрузить байт из памяти программ | R 0 ß ( Z ) | Нет | 3 | |
IN | Rd,P 0≤d≤31 , 0≤ P ≤63 | Загрузить данные из порта I/O в регистр | Rd ß P | Нет | 1 |
OUT | P,Rr 0≤r≤31 , 0≤ P ≤63 | Записать данные из регистра в порт I/O | P ß Rr | Нет | 1 |
PUSH | Rr 0≤r≤31 | Сохранить регистр в стеке | STACK ß Rr | Нет | 2 |
POP | Rr 0≤r≤31 | Загрузить в регистр из стека | Rr ß STACK | Нет | 2 |
Таблица 12. Команды переходов
Мнемоника | Операнды | Описание | Операция | Флаги | Кол-во циклов |
RJMP | k -2K<k<2K | Перейти относительно | PC ß PC + k + 1 | Нет | 2 |
LJMP | Перейти косвенно | PC ß Z | Нет | 2 | |
JMP | k 0<k<4M | Перейти | PC ß k | Нет | 3 |
RCALL | k -2K≤k≤2K | Вызвать подпрограмму относительно | PC ß PC + k + 1 | Нет | 3 |
ICALL | Вызвать подпрограмму косвенно | PC ß Z | Нет | 3 | |
CALL | k 0≤k≤64K | Выполнить длинный вызов подпрограммы | PC ß k | Нет | 4 |
RET | Вернуться из подпрограммы | PC ß STACK | Нет | 4 | |
RETI | Вернуться из прерывания | PC ß STACK | I | 4 | |
CPSE | Rd,Rr 0≤d≤31, 0≤ r ≤31 | Сравнить и пропустить, если равно | If Rd=Rr then PC ß PC + 2 (or 3) | Нет | ½/3 |
SBRC | Rr,b 0≤r≤31 , 0≤ b ≤7 | Пропустить, если бит в регистре очищен | if Rr(b)=0 then PC ß PC + 2 (or 3) | Нет | ½/3 |
SBRS | Rr,b 0≤r≤31 , 0≤ b ≤7 | Пропустить, если бит в регистре установлен | If Rr(b)=1 then PC ß PC + 2 (or 3) | Нет | ½/3 |
SBIC | P,b 0≤P≤31 , 0≤ b ≤7 | Пропустить, если бит в регистре I/O очищен | if l/O P(b)=0 then PC ß PC + 2 (or 3) | Нет | ½/3 |
SBIS | P,b 0≤r≤31 , 0≤ b ≤7 | Пропустить, если бит в регистре I/O установлен | If l/O P(b)=1 then PC ß PC + 2 (or 3) | Нет | ½/3 |
BRBS | s,k 0≤ s ≤7, -64≤k≤+63 | Перейти, если бит в регистре статуса установлен | if SREG(s)=1 then PC ß PC + k + 1 | Нет | ½ |
BRBC | s,k 0≤ s ≤7, -64≤ k ≤+63 | Перейти, если бит в регистре статуса очищен | if SREG(s)=0 then PC ß PC + k + 1 | Нет | ½ |
BREQ | k -64≤k≤+63 | Перейти, если равно | if Rd=Rr (Z=1) then PC ß PC + k + 1 | Нет | ½ |
BRNE | k -64≤k≤+63 | Перейти, если не равно | if Rd ¹ Rr(Z=0) then PC< ß PC+ k+ 1 | Нет | ½ |
BRCS | k -64 £ k £ +63 | Перейти, если флаг переноса установлен | if C=1 then PC ß PC + k + 1 | Нет | 1/2 |
BRCC | k -64≤k≤+63 | Перейти, если флаг переноса очищен | if C=0 then PC ß PC + k + 1 | Нет | 1/2 |
BRSH | K -64≤k≤+63 | Перейти, если равно или больше (без знака) | if Rd<Rr(C=0) then PC ß PC+ k+ 1 | Нет | 1/2 |
BRLO | k -64≤k≤+63 | Перейти, если меньше (без знака) | if Rd<Rr (C=1) then PC ß PC + k + 1 | Нет | 1/2 |
BRMI | k -64≤k≤+63 | Перейти, если минус | if N=1 then PC ß PC + k + 1 | Нет | 1/2 |
BRPL | k -64≤k≤+63 | Перейти, если плюс | if N=0 then PC ß PC + k + 1 | Нет | 1/2 |
BRGE | k -64≤k≤+63 | Перейти, если больше или равно (с учетом знака) | if Rd>Rr (N Å V=0) then PC ß PC + k + 1 | Нет | 1/2 |
BRLT | k -64≤k≤+63 | Перейти, если меньше чем (со знаком) | if Rd<Rr (N Å V=1)then PC ß PC + k+ 1 | Нет | 1/2 |
BRHS | K -64≤k≤+63 | Перейти, если флаг полупереноса установлен | if H=1 then PC ß PC + k + 1 | Нет | 1/2 |
BRHC | k -64≤k≤+63 | Перейти, если флаг полупереноса очищен | if H=0 then PC ß PC + k + 1 | Нет | 1/2 |
BRTS | k -64≤k≤+63 | Перейти, если флаг Т установлен | if T=1 then PC ß PC + k + 1 | Нет | 1/2 |
BRTC | k -64≤k≤+63 | Перейти, если флаг Т очищен | if T=0 then PC ß pc + k + 1 | Нет | 1/2 |
BRVS | k -64≤k≤+63 | Перейти, если флаг переполнения установлен | if V=1 then PC ß PC + k + 1 | Нет | 1/2 |
BRVC | k -64≤k≤+63 | Перейти, если флаг переполнения очищен | if V=0 then PC ß PC + k + 1 | Нет | 1/2 |
BRIE | k -64≤k≤+63 | Перейти, если глобальное прерывание разрешено | if I=1 then PC ß PC + k + 1 | Нет | 1/2 |
BRID | k -64k £ k £ +63 | Перейти, если глобальное прерывание запрещено | if I=0 then PC ß PC + k + 1 | Нет | 1/2 |
https://otvet.mail.ru/question/184778171
[1] См приложение
Введение
Любые устройства, в том числе и устройства связи, радиоавтоматики или аудиовизуальной аппаратуры требуют присутствия в своем составе устройства управления (контроллера). Контроллеры требуются практически во всех предметах и устройствах, которые окружают нас
Одним распространёнными в настоящее время являются микроконтроллеры фирмы Atmel семейства AVR. Несмотря на то, что они появились на рынке в 1996 году, их популярность до сих пор очень высока. С каждым годом они захватывают все новые и новые ниши на рынке. Не последнюю роль в этом играет соотношение показателей цена/быстродействие/энергопотребление, до сих пор являющееся едва ли не лучшим на рынке 8-битных микроконтроллеров.
Как и все микроконтроллеры AVR фирмы «Atmel», микроконтроллеры семейства Mega, а в частности ATmega 8535 являются 8-разрядными микроконтроллерами, предназначенными для встраиваемых приложений. Они изготавливаются по малопотребляющей КМОП-технологии, которая в сочетании с усовершенствованной RISC - архитектурой[1] позволяет достичь наилучшего соотношения быстродействие/энергопотребление. Контроллеры описываемого семейства являются наиболее развитыми представителями микроконтроллеров AVR.
К некоторым особенностям микроконтроллера ATmega8535 относятся:
- FLASH-память программ объемом 8 Кбайт с возможностью внутрисистемного перепрограммирования и загрузки через последовательный канал SPI (число циклов стирания/записи не менее 1000);
- оперативная память (статическое ОЗУ) объемом 512 байт;
- энергонезависимая память данных (EEPROM) объем 512 байт с возможностью внутрисистемного перепрограммирования и загрузки через последовательный канал SPI (число циклов стирания/записи не мене 100000);
- возможность защиты от чтения и модификации памяти программ и данных;
- возможность программирования непосредственно в системе через последовательные интерфейсы SPI и JTAG;
- возможность программного снижения частоты тактового генератора;
- 130 команд, большинство из которых выполняются за один машинный цикл;
- 17 внутренних+3 внешних источников прерываний;
- наличие программного стека;
- наличие аппаратного умножителя;
- 32 8-битных регистра общего назначения (далее РОН);
- 32 программируемые линии ввода/вывода;
- диапазон напряжений питания от 4,5 В до 5,5 В;
- производительность до 8 MIPS при частоте 8 МГц и т.д.
Устройства ввода/вывода ATmega8535
Микроконтроллеры семейства Mega имеют наиболее богатый набор периферийных устройств (ПУ). При этом в большинстве моделей имеются все ПУ, которые вообще встречаются в составе микроконтроллеров AVR. У микроконтроллера ATmega 8535 имеются в наличии [3]:
1) многофункциональные, двунаправленные GPIO порты ввода-вывода с встроенными нагрузочными резисторами. Конфигурация портов ввода/вывода задаётся программно;
2) два 8-разрядных таймера/счетчика (таймеры ТО и Т2);
3) 16-разрядный таймер/счетчик (таймер Т1);
4) 4 канала ШИМ-модулятора разрядностью 8 бит (один из режимов работы 8-разрядных таймеров/счетчиков ТО и Т2);
5) аналоговый компаратор;
6) восьмиканальный 10-разрядный АЦП с дифференциальными входами:
- программируемый коэффициент усиления перед АЦП 1, 10 и 200;
- опорное напряжение 2,56 В.
7) полнодуплексный универсальный асинхронный приемопередатчик UART;
8) последовательный синхронный интерфейс SPI;
9) последовательный двухпроводный интерфейс TWI (аналог интерфейса I 2 С).
1.2 Архитектура микроконтроллера ATmega 8535
Микроконтроллер ATmega8535 имеет гарвардскую архитектуру (программа и данные находятся в разных адресных пространствах) и систему команд, близкую к идеологии RISC. Процессор имеет 32 8-битных регистра общего назначения, объединённых в регистровый файл. В отличие от «идеального» RISC, регистры не абсолютно ортогональны:
- три «сдвоенных» 16-битных регистра-указателя X (r26:r27), Y (r28:r29) и Z (r30:r31);
- некоторые команды работают только с регистрами r16…r31;
- результат умножения (в тех моделях, в которых есть модуль умножения) всегда помещается в r0:r1.
Структура процессора также представляется как «высокопроизводительная RISC-архитектура с пониженным энергопотреблением» Гарвардского типа. Одним из основных достоинств этого контроллера является быстрое выполнение команд - он выполняет команду за один такт. AVR имеет, вероятно, наиболее разносторонний по своим возможностям процессор из всех микроконтроллеров. Это означает, что при разработке приложений надо потратить немного больше времени на планирование размещения данных в памяти и регистрах, чем для других микроконтроллеров. Но благодаря своей разносторонности AVR очень прост в программировании как для разработчиков прикладных программ на языке ассемблера так и для тех, кто пишет компиляторы языков высокого уровня.
Как и в любом процессоре, особенности являются следствием общих принципов, использованных при разработке этих процессоров. Организация набора регистров микропроцессоров AVR, которого представлена в графическом виде на рисунок 1. Такая организация обеспечивает высокую эффективность процессора при обработке данных.
Рисунок 1 – Приоритеты регистров в архитектуре процессоров AVR
Дата: 2018-12-28, просмотров: 345.