Система команд микроконтроллеров AVR

Транслятор ассемблера позволяет использовать в тексте программы мнемоники (обозначения команд микроконтроллера), полностью совпадающие с их названием в системе команд микроконтроллера.

Множество команд микроконтроллеров AVR семейства Classic можно представить несколькими группами:

· Команды пересылки данных;

· Команды арифметических операций и команды сдвига;

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

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

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

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

Рассмотрим каждую группу подробнее.

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

Эти команды позволяют выполнять стандартные логические операции над байтами, такие как «логическое умножение» (И), «логическое сложение» (ИЛИ), операцию «исключающее ИЛИ», а также вычисление обратного и дополнительного кодов числа. К этой группе можно отнести также команды очистки/установки регистров и команд перестановки тетрад. Все операции производятся над регистрами общего назначения, результат сохраняется в одном из РОН. Все логические операции выполняются за один машинный цикл.

Рассмотрим наиболее часто используемые команды логических операций с примерами ( все команды логических операций представлены в таблице 2.1):

1. «Логическое И» двух РОН- ANDRd, Rr

Операция: Rd=RdANDRr

Описание:Выполняет операцию «Логическое И» между содержимым регистров Rd и Rr

Пример: ldiR16,1 ;загрузить 1 в R16

andR2,R16 ;произвести операцию «Логическое И»

2. «Логическое И» РОН и константы- ANDIRd, K

Операция:Rd=RdANDK

Описание:Выполняет операцию «Логическое И» между содержимым регистра Rd и 8- разрядным числом. Результат помещается в регистр Rd. Команда применима только к 16 старшим РОН (R16…R31)

Пример: andiR17,$0F ; обнулить старший полубайт регистра R17

andiR18,$10 ;выделить 4-ый разряд в регистре R18

3. «Логическое ИЛИ» двух РОН- ORRd ,Rr

Операция:Rd=RdÚRr

Описание: Выполняет операцию «Логическое ИЛИ» между регистрами Rd и Rr. Результат помещается в регистр Rd

Пример: orR15,R16 ;поразрядное ИЛИ R15 и R16

bstR15,6 ;записать 6-ой разряд регистра R15 в флаг Т

brtsok ;перейти если флаг Т равен «1»

ok:

4. «Логическое ИЛИ» РОН и константы-ORIRd, К

Операция:Rd=RdÚK

Описание: Выполняет операцию «Логическое ИЛИ» между регистром Rd и константой К. Результат помещается в регистр Rd. Команда применима только к 16 старшим РОН (R16…R31)

Пример:oriR17,$0F ;установить старший полубайт регистра R17

oriR18,1 ;установить 0-й разряд регистра R18

5. «Исключающее ИЛИ» двух РОН- EORRd, Rr

Операция:Rd=RdÅRr

Описание:Выполняет операцию «Исключающее ИЛИ» между регистрами Rd и Rr. Результат помещается в регистр Rd

Пример:eorR2,R2 ;очистка регистра R2

eorR0,R22 ; побитовое «Исключающее ИЛИ» между R0 и R22

6. Очистка РОН- CLR Rd

Операция:Rd= RdÅRd

Описание:Сбрасывает все разряды регистра общего назначения путем выполнения операции «Исключающее ИЛИ» регистра с самим собой

Пример:Организация цикла с заданным числом повторений

clrR18 ;очистить регистр R18

loop:

inkR18 ;R18=R18+1

cpiR18,$50 ;завершить цикл?

brneloop

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

Мнемоника Описание Операции Циклы Флаги
AND Rd,Rr «Логическое И» двух РОН Rd=Rd*Rr Z,N,V
ANDI Rd,K «Логическое И» РОН и константы Rd=Rd*K Z,N,V
EOR Rd,Rr «Исключающее ИЛИ» двух РОН Rd=RdÅRr Z,N,V
OR Rd,Rr «Логическое ИЛИ» двух РОН Rd=RdÚRr Z,N,V
ORI Rd,K «Логическое ИЛИ» РОН и константы Rd=RdÚK Z,N,V
COM Rd Перевод в обратный код Rd=$FF-Rd Z,C,N,V
NEG Rd Перевод в дополнительный код Rd=$00-Rd Z,C,N,V,H
CLR Rd Сброс всех разрядов РОН Rd= RdÅRd Z,N,V
SER Rd Установка всех разрядов РОН Rd=$FF -
TST Rd Проверка РОН на отрицательное или нулевое значение Rd*Rd     Z,N,V
SWAP Rd Обмен местами тетрад в РОН Rd(3…0)=Rd(7…4) Rd(7…4)=Rd(3…0)   -

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

К данной группе относятся команды, выполняющие такие базовые операции, как сложение, вычитание, сдвиг (вправо и влево), инкремент и декремент. Все операции производятся только над РОН. При этом микроконтроллер позволяет легко оперировать как знаковыми, так и беззнаковыми числами, а также работать с числами, представленными в дополнительном коде.

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

Рассмотрим наиболее часто используемые команды арифметических операций и команды сдвига с примерами ( все команды арифметических операций и команды сдвига представлены в таблице 2.2):

:

1. Сложение двух РОН- ADDRd, Rr

Операция:Rd=Rd+Rr

Описание:Выполняет операцию сложения между содержимым регистров Rd и Rr

Пример:addR16,R18 ;сложить два регистра

2. Сложение регистровой пары с константой- ADIWRd, К

Операция:Rd+1:Rd=Rd+1:Rd+K

Описание:Складывает содержимое регистровой пары Rd+1:Rd с 6-разрядным числом. Результат помещается обратно в регистровую пару.

Пример:adiwR24,1 ;прибавить 1 к R25:R24

adiwR30,63 ;прибавить 63 к указателю Z(R31:R30)

3. Вычитание двух РОН- SUBRd, Rr

Операция:Rd=Rd-Rr

Описание:Вычитает из регистра Rd содержимое регистра Rr. Результат помещается в регистр Rd

Пример:subR13,R12 ;вычесть R12 из R13 (R13=R13-R12)

brnenoteq ;перейти, если R12 не равно R13

noteq:

4. Вычитание константы из регистра- SUBIRd, K

Операция:Rd=Rd-K

Описание:Вычитает из регистраRd значение константы К.Результат помещается обратно в регистр. Данная команда применима только к старшей половине регистров общего назначения

Пример:subiR22,$11 ;вычесть $11 из R22

brnenoteq ;перейти, если R22 не равно $11

noteq:

5. Декремент РОН- DEC Rd

Операция:Rd=Rd-1

тОписание:Уменьшает содержимое регистра Rd на единицу. Так как эта команда не влияет на флаг переноса С, она идеально подходит для организации счетчика числа интераций цикла при выполнении вычислений над многоразрядными числами. При работе с беззнаковыми числами для выполнения перехода в соответствии с результатом выполнения команды могут использоваться только команды условного перехода BREQ и BRNE. При работе с числами в дополнительном коде могут использоваться все команды условного перехода для знаковых проверок. Флаг V устанавливается в «1» только в том случае, если до выполнения операции в регистре находилось значение $80

Пример:ldiR17,$10 ;записать число16 в регистр R17

loop:

add R1,R2 ;R1=R1+R2

decR17 ;декрементировать R17

brneloop ;перейти, если R17 не равно 0

6. Инкремент РОН- INC Rd

Операция:Rd=Rd+1

Описание:Увеличивает содержимое регистра Rd на единицу. Так как эта команда не влияет на флаг переноса С, она идеально подходит для организации счетчика числа интераций цикла при выполнении вычислений над многоразрядными числами. При работе с беззнаковыми числами для выполнения перехода в соответствии с результатом выполнения команды могут использоваться только команды условного перехода BREQ и BRNE. При работе с числами в дополнительном коде могут использоваться все команды условного перехода для знаковых проверок. Флаг V устанавливается в «1» только в том случае, если до выполнения операции в регистре находилось значение $7F

Пример:clrR22 ;очистить регистр R22

loop:

inc R22 ;R22=R22+1

cpiR22,$4F ;

brneloop ;продолжать цикл, если R22 не равно $4F

7.Арифметический сдвиг вправо- ASR Rd

Операция:Rd(n)=Rd(n+1),n=0…6

Описание:Сдвигает содержимое регистра Rd на 1 разряд вправо. Состояние 7-го разряда не изменяется. Значение 0-го разряда помещается в флаг С регистра SPEG. Часто используется для деления чисел со знаком на два

Пример:ldiR16,$10 ;записать число 16 в регистр R16

asrR16 ; R16=R16/2

ldiR17,$FC ;записать число -4 в регистр R17

asr R17 ; R17=R17/2

8. Логический сдвиг влево- LSL Rd

Операция:Rd(n+1)=Rd(n),Rd(0)=0

Описание:Сдвигает все разряды регистра Rd влево. Разряд b0 сбрасывается в «0», а разряд b7 загружается в флаг С регистра SPEG. Эквивалентна команде ADDRd,Rd

Пример:addR0,R4 ; R0=R0+R4

lsl R0 ;R0=R0*2

9. Логический сдвиг вправо- LSR Rd

Операция:Rd(n)=Rd(n+1) Rd(7)=0

Описание:Сдвигает все разряды регистра Rd вправо. Разряд b7 сбрасывается в «0», а разряд b0 загружается в флаг С регистра SPEG.

Пример:addR0,R4 ; R0=R0+R4

lsrR0 ;R0=R0/2

Таблица 2.2. Команды арифметических операций и команд сдвига

Мнемоника Описание Операция Циклы Флаги
ADD Rd,Rr Сложение двух РОН Rd=Rd+Rr Z,C,N,V,H
ADC Rd,Rr Сложение двух РОН с переносом Rd=Rd+Rd+C Z,C,N,V,H
ADIW Rd,K Сложение регистровой пары с константой Rdh:Rdl=Rdh:Rdl+K Z,C,N,V,S
SUB Rd,Rr Вычитание двух РОН Rd=Rd-Rr Z,C,N,V,H
SUBI Rd,K Вычитание константы из РОН Rd=Rd-K Z,C,N,V,H
SBC Rd,Rr Вычитание двух РОН с заемом Rd=Rd-Rr-C Z,C,N,V,H
SBCI Rd,K Вычитание константы из РОН с заемом Rd=Rd-K-C Z,C,N,V,H
SBIW Rd,K Вычитание константы из регистровой пары Rdh:Rdl=Rdh:Rdl-K Z,C,N,V,S
DEC Rd Декремнт РОН Rd=Rd-1 Z,N,V,
INC Rd Инкремент РОН Rd=Rd+1 Z,N,V
ASR Rd Арифметический сдвиг вправо Rd(n)=Rd(n+1), n=0…6 Z,C,N,V
LSL Rd Логический сдвиг влево Rd(n+1)=Rd(n),Rd(0)=0 Z,C,N,V
LSR Rd Логический сдвиг вправо Rd(n)=Rd(n+1) Rd(7)=0 Z,C,N,V
ROL Rd Сдвиг влево через перенос Rd(0)=C,Rd(n+1)=Rd(n),C=Rd(7) Z,C,N,V
ROR Rd Сдвиг вправо через перенос Rd(7)=C,Rd(n)=Rd(n+1), C=Rd(0) Z,C,N,V

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

К данной группе относятся команды, выполняющие установку или сброс заданного разряда РОН или РВВ. Причем для изменения состояния разрядов регистра состояния SREG имеются также дополнительные команды (точнее, эквивалентные мнемонические обозначения общих команд), т.к. проверка состояния разрядов именно этого регистра производится чаще всего. Условно к этой группе можно отнести также две команды передачи управления типа «проверка/пропуск», которые пропускают следующую команду в зависимости от состояния разрядов РОН или РВВ.

Всем командам данной группы (Таблица 2.3) требуется один машинный цикл для выполнения, за исключением случаев, когда в результате проверки происходит пропуск команды. В этом случае команда выполняется за два или три машинных цикла в зависимости от пропускаемой команды.

Рассмотрим наиболее часто используемые команды операций с битами с примерами ( все команды операций с битами представлены в таблице 2.3):

1. Сбросить разряд- CBI A, b

Операция: A.b = 0

Описание:Сбрасывает разряд b регистра ввода/вывода, расположенного по адресу А пространства ввода/вывода. Эта команда применима только к младшим 32 регистрам (адреса 0…31)

Пример:cbi $12,7 ;cбросить 7-ой разряд порта D

2. Установить разряд РВВ- SBIA, b

Операция:A.b = 1

Описание:Устанавливает разряд b регистра ввода/вывода, расположенного по адресу А пространства ввода/вывода. Эта команда применима только к младшим 32 регистрам (адреса 0…31)

Пример:out $1E,R0 ;задать адрес ячейки EEPROM

sbi $1C,0 ;установить запрос на чтение

inR1,$1D ;считать данные из EEPROM

3. Пересылка флага Т в разряд РОН- BLDRd,b

Операция:Rd.b = T

Описание:Копирует флаг Т регистраSPEG в разряд b регистра Rd

Пример:bstR1,2 ;сохранить 2-ой разряд регистра R1 в T

BldR0,4 ;записать флаг Т в 4-й разряд регистра R0

4. Запись разряда РОН в флаг Т- BSTRd,b

Операция:T=Rd.b

Описание:Копирует разряд b регистра Rd в флаг Т регистра SPEG

Пример:bstR1,2 ;сохранить 2-й разряд регистра R1 вТ

bldR0,4 ;записать флаг Т в 4-й разряд регистра R0

5. Общее запрещение прерываний- CLI

Операция:I=0

Описание:Сбрасывает в «0» флаг общего разрешения прерываний I регистра SPEG. Эквивалентна команде BCLR 7

Пример:cli ;запретить прерывания

inR11,$16 ;прочитать состояние порта В

sei ;разрешить прерывания

6. Общее разрешение прерываний- SEI

Операция: I=1

Описание:Устанавливает в «1» флаг общего разрешения прерываний I регистра SPEG. Эквивалентна команде BSET 7

Пример:cli ;запретить прерывания

inR13,$16 ;прочитать состояние порта В

sei ;разрешить прерывания

7. Cброс флага Т- CLT

Операция: T=0

Описание:Сбрасывает в «0» флаг Т регистра SPEG. Эквивалентна команде BCLR 6

Пример:clt ;сбросить флаг Т

8. Установка флага Т- SET

Операция:T=1

Описание:Устанавливает в «1» флаг Т регистра SPEG.Эквивалентна команде BSET 6

Пример:set ;установить флаг Т

Таблица 2.3.Команды операций с разрядами

Мнемоника Описание Операция Циклы Флаги
CBR Rd,K Сброс разряда(ов) РОН Rd=Rd*($FF-K) Z,N,V
SBR Rd,K Установка разряда(ов) РОН Rd=RdÚK Z,N,V
CBI A,b Сброс разряда РВВ A.b = 0 -
SBI A,b Установка разряда РВВ A.b = 1 -
BCLR s Сброс флага SREG.s = 0 SREG.s
BSET s Установка флага SREG.s = 1 SREG.s
BLD Rd,b Загрузка разряда РОН из флага Т (SREG) Rd.b = T -
BST Rr,b Запись разряда РОН в флаг Т (SREG) T=Rd.b T
CLC Сброс флага переноса C=0 C
SEC Установка флага переноса C=1 C
CLN Сброс флага отр. числа N=0 N
SEN Установка флага отр. числа N=1 N
CLZ Сброс флага нуля Z=0 Z
SEZ Установка флага отр. числа Z=1 Z
CLI Общее запрещение прерываний I=0 I
SEI Общее разрешение прерываний I=1 I
CLS Сброс флага знака S=0 S
SES Установка флага знака S=1 S
CLV Сброс флага переполнения доп. Кода V=0 V
SEV Установка флага переполнения доп. Кода V=1 V
CLT Сброс флага Т T=0 T
SET Установка флага Т T=1 T
CLH Сброс флага половинного переноса H=0 H
SEH Установка флага половинного переноса H=1 H

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

Команды этой группы (Таблица 2.4) предназначены для пересылки содержимого ячеек, находящихся в адресном пространстве памяти данных. Разделение адресного пространства на три части (РОН, РВВ, ОЗУ) предопределило разнообразие команд данной группы. Пересылка данных, выполняемая командами группы, может производиться в следующих направлениях:

· РОНÛРОН;

· РОНÛРВВ;

· РОНÛ память данных.

Также к данной группе можно отнести стековые команды PUSH и POP (отсутствуют вAT90S1200), позволяющие сохранять в стеке и восстанавливать из стека содержимое РОН.

На выполнение команд данной группы требуется от одного до трех машинных циклов в зависимости от команды.

Рассмотрим наиболее часто используемые команды пересылки данных с примерами:

1. Пересылка между РОН- MOVRd, Rr

Операция:Rd=Rr

Описание:Копирует содержимое регистра Rr в регистр Rd. Регистр-источник (Rr) не изменяется

Пример:movR16, R0 ;переслать содержимое R0 в R16

callchec ;вызвать подпрограмму

chec:

cpiR16, $11 ;сравнить R16 с $11

ret ;вернуться из подпрограммы

2. Загрузка константы в РОН- LDIRd, K

Операция:Rd=K

Описание:Загружает 8-разрядное число в регистр общего назначения Rd. Данная команда применима только к старшей половине РОН (адреса 16…31)

Пример: сlrR31 ;очистить ст. байт индексного регистра Z

ldiR30, $F0 ;загрузить адрес в регистр Z

lpm ;загрузить константу из памяти программ

;по адресу $00F0

3. Косвенное чтение памяти данных- LDRd, Y

Операция:Rd=[Y]

Описание:Загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Y

Пример:clrR29 ;очистить ст. байт индексного регистра

ldiR28, $60 ;загрузить мл. байт адреса

ld R1, Y ;R1=[$0060]

4. Непосредственная загрузка из памяти данных- LDSRd, K

Операция:Rd=[k]

Описание:Загружает один байт из адресного пространства памяти данных в регистр общего назначения Rd. Адрес ячейки памяти, к которой производится обращение, задается константой К.

Пример:ldsR2, $FF00 ;R2=[$FF00]

addR2, R1 ;R2=R2+R1

sts $FF000, R2 ;записать результат по тому же адресу

5. Косвенная запись в память данных- STX, Rd

Операция:[X]=Rr

Описание:Сохраняет содержимое регистра общего назначения Rr в памяти данных. Адрес ячейки памяти, к которой производится обращение, содержится в индексном регистре Х

Пример: clrR27 ;очистить ст. байт индексного регистра

ldiR26, $60 ;загрузить мл. байт адреса

stX, R1 ;загрузить R1 по адресу $0060

6. Непосредственная запись в память данных- STSK, Rd

Операция:[k]=Rd

Описание:Сохраняет содержимое регистра общего назначения Rd в памяти данных. Адрес ячейки памяти, к которой производится обращение, задается константой К

Пример:ldsR2, $FF00 ;R2=[$FF00]

addR2, R1 ;R2=R2+R1

sts $FF000,R2 ;записать результат по тому же адресу

Таблица 2.4. Команды пересылки данных

Мнемоника Описание Операции Циклы Флаги
MOV Rd,Rr Пересылка между РОН Rd=Rr  
LDI Rd,K Загрузка константы в РОН Rd=K  
LD Rd,X Косвенное чтение Rd=[X]  
LD Rd,X+ Косвенное чтение с постинкрементом Rd=[X],X=X+1  
LD Rd,-X Косвенное чтение с преддекрементом X=X-1,Rd=[X]  
LD Rd,Y Косвенное чтение Rd=[Y]  
LD Rd,Y+ Косвенное чтение с постинкрементом Rd=[Y],Y=Y+1  
LD Rd,-Y Косвенное чтение с преддекрементом Y=Y-1,Rd=[Y]  
LDD Rd,Y+q Косвенное относительное чтение Rd=[Y+q]  
LD Rd,Z Косвенное чтение Rd=[Z]  
LD Rd,Z+ Косвенное чтение с постинкрементом Rd=[Z],Z=Z+1  
LD Rd,-Z Косвенное чтение с преддекрементом Z=Z-1,Rd=[Z]  
LDD Rd,Z+q Косвенное относительное чтение Rd=[Z+q]  
LDS Rd,k Непосредственное чтение из ОЗУ Rd=[k]  
ST X,Rr Косвенная запись [X]=Rr  
ST X+,Rr Косвенная запись с постинкрементом [X]=Rr,X=X+1  
ST -X,Rr Косвенная запись с постинкрементом X=X-1,[X]=Rr  
ST Y,Rr Косвенная запись [Y]=Rr  
ST Y+,Rr Косвенная запись с постинкрементом [Y]=Rr,Y=Y+1  
ST -Y,Rr Косвенная запись с преддекрементом Y=Y-1,[Y]=Rr  
STD Y+q,Rr Косвенная относительная запись [Y+q]=Rr  
ST Z,Rr Косвенная запись [Z]=Rr  
ST Z+,Rr Косвенная запись с постинкрементом [Z]=Rr,Z=Z+1  
ST -Z,Rr Косвенная запись с преддекрементом Z=Z-1,[Z]=Rr  
STD Z+q,Rr Косвенная относительная запись [Z+q]=Rr  
STS k,Rr Непосредственная запись в ОЗУ [k]=Rr  
LPM Загрузка данных из памяти программ R0={Z}  
IN Rd,A Пересылка из РВВ в РОН Rd=A  
OUT A,Rr Пересылка из РОН в РВВ A=Rr  
PUSH Rr Сохранение байта в стеке STACK=Rr  
POP Rd Извлечение байта из стека Rd=STACK  

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

В эту группу (Таблица 2.5) входят команды перехода, вызова подпрограмм и возврат из них и команд типа «проверка/пропуск», пропускающие следующую за ними команду при выполнении некоторого условия. Также к этой группе относятся команды сравнения, формирующие флаги регистра SREG и предназначенные, как правило, для работы совместно с командами условного перехода.

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

Рассмотрим наиболее часто используемые команды передачи управления с примерами:

1. Относительный безусловный переход- RJMP k

Операция: PC=PC+k+1

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

Пример: сpiR16, $42 ;сравнить R16 с числом $42

brneM1 ;перейти к M1, если R16 не равно $42

rjmpok ;безусловный переход

M1:

addR16, R17 ;прибавить R16 к R17

ink R16 ;R16=R16+1

ok:

2. Относительный вызов подпрограммы- RCALL k

Операция:PC=PC+k+1

Описание:Выполняет переход к подпрограмме, адрес которой получается сложением содержимого счетчика команд с константой k. Адрес следующей за RCALL командой (2 байта) сохраняется в стеке. На практике вместо числовых значений смещения указываются метки подпрограмм

Пример:rcallroutine ;вызвать подпрограмму

routine:

pushR14 ;сохранить содержимое R14

popR14 ;восстановить содержимое R14

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

3. Возврат из подпрограммы- RET

Операция:PC=STACK

Описание:Выполняет возврат в то место, откуда подпрограмма была вызвана

Пример:rcallroutine ;вызвать подпрограмму

routine:

pushR14 ;сохранить содержимое R14

popR14 ;восстановить содержимое R14

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

4. Пропуск команды при равенстве двух РОН- CPSERd, Rr

Операция:Если Rd=Rr, то PC=PC+2(3), иначе РС=РС+1

Описание:Сравнивает содержимое двух регистров общего назначения Rd и Rr и пропускает следующую команду, если в регистрах записаны одинаковые значения

Пример:inkR4 ;увеличить R4 (R4=R4+1)

cpseR4, R0;сравнить содержимоеR4 и R0

negR4 ;проинвертировать R4, если R4 не равно R0

5. Сравнение РОН- CP Rd, Rr

Операция: Rd-Rr

Описание:Сравнивает содержимое двух РОН путем вычитания содержимого регистра Rr из содержимого регистра Rd. Данная команда влияет только на флаги регистра состояния SPEG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистров не изменяется. Как правило, данная команда используется совместно с одной из команд условного перехода

Пример:cpR4, R19 ;сравнить R4 с R19 (R=R4-R19)

brnenoteq ;перейти, если R4<>R19

noteq:

6. Сравнение содержимого РОН с константой- CPIRd, K

Операция:Rd-K

Описание:Сравнивает содержимое РОН Rd с константой К путем вычитания константы из содержимого регистра Rd. Данная команда влияет только на флаги регистра состояния SPEG, которые устанавливаются в соответствии с результатом вычитания. Содержимое регистра Rd не изменяется. Как правило, данная команда используется совместно с одной из команд условного перехода

Пример:cpiR19, 3 ;сравнить R19 с числом 3 (R=R19-3)

brnenoteq ;перейти, если R19<>3

noteq:

7. Переход по условию «равно»- BREQk

Операция: Если Z=1, то PC=PC+k+1, иначе РС=РС+1

Описание:Условный относительный переход. Проверяет флаг нуля (Z) и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если число (со знаком или без знака), находящееся в регистре Rd, будет равно числу (со знаком или без знака), находящемуся в регистре Rr. Эквивалентна команде BRBS 1, k

Пример:cpR1, R0 ;сравнить R1 с R0

breqequal ;перейти, если R1=R2

equal:

8. Переход по условию «не равно»- BRNEk

Операция: Если Z=0, то PC=PC+k+1, иначе РС=РС+1

Описание:Условный относительный переход. Проверяет флаг нуля (Z) и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если числа (со знаком или без знака), находящиеся в регистрах Rd и Rr, не будут равны. Эквивалентна команде BRBC 1,k

Пример:eorR27, R27 ;очистить R27

loop: incR27 ;R27=R27+1

cpiR27, 5 ;сравнить R27 с 5

brneloop ;перейти, если R27 не равно 5

9. Переход по условию «выше или равно» (для беззнаковых данных)- BRSHk

Операция:Если C=0, то PC=PC+k+1, иначе РС=РС+1

Описание:Условный относительный переход. Проверяет флаг переноса (С) и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если беззнаковое число, находящееся в регистре Rd, будет больше (или равно) беззнакового числа, находящегося в регистре Rr. Эквивалентна команде BRBC 0,k

Пример:subiR19,4 ;R19=R19-4

brshhgsm ;перейти, если R19 больше или равно 4

hgsm:

10. Переход по условию «меньше» (для беззнаковых данных)- BRLOk

Операция:Если C=1, то PC=PC+k+1, иначе РС=РС+1

Описание:Условный относительный переход. Проверяет флаг переноса (С) и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде. При выполнении данной команды сразу же после команды CP, CPI, SUB или SUBI переход произойдет только в том случае, если беззнаковое число, находящееся в регистре Rd, будет меньше беззнакового числа, находящееся в регистре Rr. Эквивалентна команде BRBS 0,k

Пример:eorR19, R19 ;очистить R19

loop: incR19 ;R19=R19+1

cpiR19, $10 ;сравнить R19 с $10

brloloop ;перейти, если R19<$10

11. Переход по условию «отрицательное значение»- BRMIk

Операция:Если N=1, то PC=PC+k+1, иначе РС=РС+1

Описание:Условный относительный переход. Проверяет флаг отрицательного значения (N) и выполняет переход, если этот разряд установлен. Величина смещения k представляется числом в дополнительном коде. Эквивалентна команде BRBS 2, k

Пример:subiR18, 4 ;R18=R18-4

brmiminus ;перейти, если результат отрицательный

minus:

12. Переход по условию «положительное значение»- BRPLk

Операция:Если N=0, то PC=PC+k+1, иначе РС=РС+1

Описание:Условный относительный переход. Проверяет флаг отрицательного значения (N) и выполняет переход, если этот разряд сброшен. Величина смещения k представляется числом в дополнительном коде. Эквивалентна команде BRBC 2, k

Пример:subiR26, $50 ;R26=R26-$50

brplplus ;перейти, если результат положительный

plus:

Таблица 2.5. Команды передачи управления

Мнемоника Описание Операция Цикл Флаги
RJMP k Относительный безусловный переход PC=PC+k+1 -
IJMP Косвенный безусловный переход PC=Z -
RCALL Относительный вызов подпрограммы PC=PC+k+1 -
ICALL Косвенный вызов подпрограммы PC=Z -
RET Возврат из подпрограммы PC=STACK -
RETI Возврат из подпрограммы обработки прерывания PC=STACK I
CP Rd,Rr Сравнение РОН Rd-Rr Z,N,V,C,H
CPC Rd,Rr Сравнение РОН с учетом переноса Rd-Rr-C Z,N,V,C,H
CPI Rd,K Сравнение РОН с константой Rd-K Z,N,V,C,H
CPSE Rd,Rr Сравнение и пропуск след. команды при равенстве Если Rd=Rr, то PC=PC+2(3) 1/2/3 -
SBRC Rr,b Пропуск след. команды, если разряд РОН сброшен Если Rr.b=0, то PC=PC+2(3) 1/2/3 -
SBRS Rr,b Пропуск след. команды, если разряд РОН установлен Если Rr.b=1, то PC=PC+2(3) 1/2/3 -
SBIC A,b Пропуск след. команды, если разряд РВВ сброшен Если A.b=0, то PC=PC+2(3) 1/2/3 -
SBIS A,b Пропуск след. команды, если разряд РВВ установлен Если A.b=1, то PC=PC+2(3) 1/2/3 -
BRBC s,k Переход, если флаг s регистра SREG сброшен Если SREG.s =0, то PC=PC+k+1 1/2 -
BRBS s,k Переход, если флаг s регистра SREG установлен Если SREG.s =1, то PC=PC+k+1 1/2 -
BRCS k Переход по переносу Если C=1, то PC=PC+k+1 1/2 -
BRCC k Переход, если нет переноса Если C=0, то PC=PC+k+1 1/2 -
BREQ k Переход по условию «равно» Если Z=1, то PC=PC+k+1 1/2 -
BRNE k Переход по условию «не равно» Если Z=0, то PC=PC+k+1 1/2 -
BRSH k Переход по условию «выше или равно» Если C=0, то PC=PC+k+1 1/2 -
BRLO k Переход по условию «меньше» Если C=1, то PC=PC+k+1 1/2 -
BRMI Переход по условию «отрицательное значение» Если N=1, то PC=PC+k+1 1/2 -
BRPL Переход по условию «положительное значение» Если N=0, то PC=PC+k+1 1/2 -
BRGE Переход по условию «больше или равно» (числа со знаком) Если (NÅV)=0, то PC=PC+k+1 1/2 -
BRLT Переход по условию «меньше нуля» (числа со знаком) Если (NÅV)=1, то PC=PC+k+1 1/2 -
BRHS Переход по половинному переносу Если H=1, то PC=PC+k+1 1/2 -
BRHC Переход, если нет половинного переноса Если H=0, то PC=PC+k+1 1/2 -
BRTS Переход, если флаг T установлен Если T=1, то PC=PC+k+1 1/2 -
BRTC Переход, если флаг T сброшен Если T=0, то PC=PC+k+1 1/2 -
BRVS Переход по переполнению доп. кода Если V=1, то PC=PC+k+1 1/2 -
BRVC Переход, если нет переполнения доп. кода Если V=0, то PC=PC+k+1 1/2 -
BRID Переход, если прерывания запрещены Если I=0, то PC=PC+k+1 1/2 -
BRIE Переход, если прерывания разрешены Если I=1, то PC=PC+k+1 1/2 -

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

В эту группу входят всего 3 команды:

· NOP – пустая команда;

· SLEEP – перевод микроконтроллера в режим пониженного энергопотребления;

· WDR – сброс сторожевого таймера.

Команды NOP и WDR выполняются за один машинный цикл, а команда SLEEP – за четыре машинных цикла.

Наши рекомендации