3. Система команд микроконтроллеров семейства AvR
Таблица 3.1. Арифметические и логические команды
Мнемо-ника |
Операнды |
Описание |
Операция |
Флаги |
Кол-во циклов |
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 <--SFF |
нет |
1 |
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 |
Таблица 3.2. Команды сдвигов и операций с битами
Мнемоника |
Операнды |
Описание |
Операция |
Флаги |
Кол-во циклов |
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 |
|
Установить флаг отрицательного значения |
М<--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 |
Таблица 3.3. Команды пересылки данных
Мнемоника |
Операнды |
Описание |
Операция |
Флаги |
Кол-во циклов |
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 |
ST |
-Y,Rr
0<=r<=31 |
Записать косвенно с преддекрементом |
Y<--Y-1, (Y) <-- Rr |
Нет |
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 |
|
Загрузить байт из памяти программ |
R0 <-- (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 |
Таблица 3.4. Команды переходов
Мнемоника |
Операнды |
Описание |
Операция |
Флаги |
Кол-во циклов |
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) |
Нет |
(1/2)/3 |
SBRC |
Rr,b
0<=r<=31
0<=b<=7 |
Пропустить, если бит в регистре очищен |
if Rr(b)=0 then
PC <-- PC + 2 (or 3) |
Нет |
(1/2)/3 |
SBRS |
Rr,b
0<=r<=31
0<=b<=7 |
Пропустить, если бит в регистре установлен |
If Rr(b)=1 then
PC <--PC + 2 (or 3) |
Нет |
(1/2)/3 |
SBIC |
P,b
0<=P<=31
0<=b<=7 |
Пропустить, если бит в регистре I/O очищен |
if l/O P(b)=0 then
PC <-- PC + 2 (or 3) |
Нет |
(1/2)/3 |
SBIS |
P,b
0<=r<=31
0<=b<=7 |
Пропустить, если бит в регистре I/O установлен |
If l/O P(b)=1 then
PC <--PC + 2 (or 3) |
Нет |
(1/2)/3 |
BRBS |
s,k
0<=s<=7
-64<=k<=+63 |
Перейти, если бит в регистре статуса установлен |
if SREG(s)=1 then
PC <-- PC + k + 1 |
Нет |
(1/2) |
BRBC |
s,k
0<=s<=7
-64<=k<=+63 |
Перейти, если бит в регистре статуса очищен |
if SREG(s)=0 then
PC <-- PC + k + 1 |
Нет |
(1/2) |
BREQ |
k
-64<=k<=+63 |
Перейти, если равно |
if Rd=Rr (Z=1) then
PC <-- PC + k + 1 |
Нет |
(1/2) |
BRNE |
k
-64<=k<=+63 |
Перейти, если не равно |
if Rd != Rr(Z=0) then PC<<--PC+ k+ 1 |
Нет |
(1/2) |
Мнемоника |
Операнды |
Описание |
Операция |
Флаги |
Кол-во циклов |
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 |
|
Дата добавления: 2011-05-28 |
Просмотров: 18482 |
|