|
Микроконтроллер LGT8F328P: китайская ATmega328P по-русски
Список инструкций (команд)
Ниже перечислены все команды, поддерживаемые ядром микроконтроллера LGT8F328P, в том числе и те, которые обеспечивают доступ к 16-разрядной шине (выделены зеленым цветом). Общее количество инструкций (если не считать «зеленые») – 130шт., размер подавляющего большинства из них - 2 байта (1 слово). Исключение составляют четыре команды, использующие прямую адресацию – LDS, STS, CALL и JMP. Данные инструкции содержат в себе 16- или 22-разрядный адрес, поэтому в памяти они занимают две ячейки (4 байта). Время выполнения подавляющего большинства команд (119шт.) составляет всего один машинный такт, остальные инструкции двухтактные. Отметим, что китайские камни не имеют команд, которые выполняются более двух тактов, в отличие от AVR-ок, где длительность инструкций может достигать трех и даже четырех циклов. Формально, конечно, к этому утверждению можно придраться - см. инструкции CPSE, SBRC/SBRS и SBIC/SBIS. Однако, на мой взгляд, здесь к самим командам вопросов нет, ибо в «чистом» виде (т.е. когда условие в них ложно) они длятся всего один такт. Увеличение длительности до трех циклов происходит лишь в том случае, когда размер следующей инструкции составляет четыре байта вместо двух, т.е. это обусловлено структурой программы, а не «плохими» командами.
Обозначения, принятые в таблице:
uDSC - 16-разрядный регистр ускорителя вычислений;
Rd - регистр-операнд, а также регистр-приемник (регистр общего назначения, РОН);
Rr - регистр-операнд (регистр общего назначения, РОН);
P - регистр ввода-вывода (РВВ);
K - константа;
b - номер бита в РОН или РВВ;
s - номер бита/флага в регистре состояния SREG;
Rd[b] - требуемый бит «b» в регистре общего назначения;
P[b] - требуемый бит «b» в регистре ввода-вывода;
SREG[s] - требуемый бит/флаг «s» в регистре состояния SREG;
k - адрес перехода;
q - смещение;
{} - указатель на ячейку памяти;
& - логическое «И»;
| - логическое «ИЛИ»;
[+] - исключающее «ИЛИ»;
PC - счетчик команд;
SP - указатель стека (пара регистров ввода-вывода SPH:SPL);
STACK - текущая ячейка в стеке (т.е. ячейка, на которую указывает пара SPH:SPL).
Инструкция |
Операнды |
Описание |
Счетчик команд |
Флаги |
Размер (слов) |
Такты |
Инструкции, выполняющие арифметические и логические операции |
ADD Rd, Rr |
d: 0...31
r: 0...31 |
Сложение двух регистров без учета переноса:
Rd ← Rd + Rr |
PC=PC+1 |
Z,C,N,V, S,H |
1 |
1 |
ADC Rd, Rr |
d: 0...31
r: 0...31 |
Сложение двух регистров с учетом переноса:
Rd ← Rd + Rr + C |
PC=PC+1 |
Z,C,N,V, S,H |
1 |
1 |
ADIW Rd+1:Rd, K |
d: 24,26,28,30
K:0...63 |
Прибавление константы к регистровой паре:
Rd+1:Rd ← Rd+1:Rd + K |
PC=PC+1 |
Z,C,N,V, S |
1 |
1 |
SUB Rd, Rr |
d: 0...31
r: 0...31 |
Вычитание одного регистра из другого без учета
переноса: Rd ← Rd – Rr |
PC=PC+1 |
Z,C,N,V, S,H |
1 |
1 |
SBC Rd, Rr |
d: 0...31
r: 0...31 |
Вычитание одного регистра из другого с учетом
переноса: Rd ← Rd - Rr - C |
PC=PC+1 |
Z,C,N,V, S,H |
1 |
1 |
SUBI Rd, K |
d: 16...31
K: 0...255 |
Вычитание константы из регистра без учета
переноса: Rd ← Rd - K |
PC=PC+1 |
Z,C,N,V, S,H |
1 |
1 |
SBCI Rd, K |
d: 16...31
K: 0...255 |
Вычитание константы из регистра с учетом
переноса: Rd ← Rd - K - C |
PC=PC+1 |
Z,C,N,V, S,H |
1 |
1 |
SBIW Rd+1:Rd, K |
d: 24,26,28,30
K:0...63 |
Вычитание константы из регистровой пары:
Rd+1:Rd ← Rd+1:Rd - K |
PC=PC+1 |
Z,C,N,V, S |
1 |
1 |
|
AND Rd, Rr |
d: 0...31
r: 0...31 |
Логическое «И» между двумя регистрами:
Rd ← Rd & Rr |
PC=PC+1 |
Z,N,S V=0 |
1 |
1 |
ANDI Rd, K |
d: 16...31
r: 0...255 |
Логическое «И» между регистром и константой:
Rd ← Rd & K |
PC=PC+1 |
Z,N,S V=0 |
1 |
1 |
OR Rd, Rr |
d: 0...31
r: 0...31 |
Логическое «ИЛИ» между двумя регистрами:
Rd ← Rd | Rr |
PC=PC+1 |
Z,N,S V=0 |
1 |
1 |
ORI Rd, K |
d: 16...31
r: 0...255 |
Логическое «ИЛИ» между регистром
и константой: Rd ← Rd | K |
PC=PC+1 |
Z,N,S V=0 |
1 |
1 |
EOR Rd, Rr |
d: 0...31
r: 0...31 |
Исключающее «ИЛИ» между двумя регистрами:
Rd ← Rd [+] Rr |
PC=PC+1 |
Z,N,S V=0 |
1 |
1 |
COM Rd |
d: 0...31 |
Дополнение до единицы, т.е. инверсия всех
битов регистра: Rd ← 0xFF – Rd |
PC=PC+1 |
Z,N,S V=0, C=1 |
1 |
1 |
NEG Rd |
d: 0...31 |
Дополнение до двух, т.е. перевод числа в
дополнительный код: Rd ← 0x00 – Rd |
PC=PC+1 |
Z,C,N,V, S,H |
1 |
1 |
SBR Rd, K |
d: 16...31
K: 0...255 |
Установка отдельных разрядов регистра:
Rd ← Rd | K; аналог логического «ИЛИ» |
PC=PC+1 |
Z,N,S V=0 |
1 |
1 |
CBR Rd, K |
d: 16...31
K: 0...255 |
Сброс отдельных разрядов в регистре:
Rd ← Rd & (0xFF – K); аналог логического «И» |
PC=PC+1 |
Z,N,S V=0 |
1 |
1 |
INC Rd |
d: 0...31 |
Инкремент (увеличение на 1) значения
регистра: Rd ← Rd + 1 |
PC=PC+1 |
Z,N,V,S |
1 |
1 |
DEC Rd |
d: 0...31 |
Декремент (уменьшение на 1) значения
регистра: Rd ← Rd – 1 |
PC=PC+1 |
Z,N,V,S |
1 |
1 |
TST Rd |
d: 0...31 |
Проверка регистра на нулевое или отриц. значе-
ние: Rd & Rd (cодержимое Rd не меняется) |
PC=PC+1 |
Z,N,S V=0 |
1 |
1 |
CLR Rd |
d: 0...31 |
Сброс всех битов в регистре:
Rd ← Rd [+] Rd |
PC=PC+1 |
Z=1,N= S=V=0 |
1 |
1 |
SER Rd |
d: 16...31 |
Установка всех битов в регистре:
Rd ← 0xFF |
PC=PC+1 |
--- |
1 |
1 |
|
MUL Rd, Rr |
d: 0...31
r: 0...31 |
Умножение двух беззнаковых значений; результат - в паре R1:R0 (R1:R0 ← Rd x Rr) |
PC=PC+1 |
Z,C |
1 |
1 |
MULS Rd, Rr |
d: 16...31
r: 16...31 |
Умножение двух значений со знаком; результат - в паре R1:R0 (R1:R0 ← Rd x Rr) |
PC=PC+1 |
Z,C |
1 |
1 |
MULSU Rd, Rr |
d: 16...23
r: 16...23 |
Умножение значения со знаком Rd и значения без знака Rr (R1:R0 ← Rd x Rr) |
PC=PC+1 |
Z,C |
1 |
1 |
FMUL Rd, Rr |
d: 16...23
r: 16...23 |
Умножение двух значений без знака со сдвигом влево (R1:R0 ← (Rd x Rr) << 1) |
PC=PC+1 |
Z,C |
1 |
1 |
FMULS Rd, Rr |
d: 16...23
r: 16...23 |
Умножение двух значений со знаком со сдвигом влево (R1:R0 ← (Rd x Rr) << 1) |
PC=PC+1 |
Z,C |
1 |
1 |
FMULSU Rd, Rr |
d: 16...23
r: 16...23 |
Умножение значения со знаком Rd и значения без знака Rr со сдвигом (R1:R0 ← (Rd x Rr) << 1) |
PC=PC+1 |
Z,C |
1 |
1 |
Инструкция |
Операнды |
Описание |
Счетчик команд |
Флаги |
Размер (слов) |
Такты |
Инструкции, выполняющие передачу управления |
RJMP k |
k: -2K...+2K(1) |
Относительный безусловный переход. Состояние стека не меняется. |
PC=PC+k+1 |
--- |
1 |
1 |
IJMP |
--- |
Косвенный безусловный переход; адрес перехо- да берется из регистра «Z» (из пары ZH:ZL).
Состояние стека не меняется. |
PC=Z |
--- |
1 |
2 |
JMP k |
k: 0...4M(2) |
Прямой безусловный переход. Состояние стека не меняется. |
PC=k |
--- |
2 |
2 |
RCALL k |
k: -2K...+2K(1) |
Относительный вызов подпрограммы. STACK ← PC + 1; SP = SP – 2. |
PC=PC+k+1
|
--- |
1 |
1 |
ICALL |
--- |
Косвенный вызов подпрограммы; адрес перехо- да берется из регистра «Z» (из пары ZH:ZL).
STACK ← PC + 1; SP = SP – 2. |
PC=Z |
--- |
1 |
2 |
CALL |
k: 0...64K(3) |
Прямой вызов подпрограммы. STACK ← PC + 2; SP = SP – 2. |
PC=k |
--- |
2 |
2 |
RET |
--- |
Возврат из подпрограммы. PC ← STACK; SP = SP + 2. |
PC=STACK |
--- |
1 |
2 |
RETI |
--- |
Возврат из обработчика прерывания c автомати- ческой установкой флага «I».
PC ← STACK; SP = SP + 2. |
PC=STACK |
I = 1 |
1 |
2 |
|
CP Rd, Rr |
d: 0...31
r: 0...31 |
Сравнить два регистра без учета переноса; содержимое Rd и Rr не меняется
(Rd - Rr) |
PC=PC+1 |
Z,C,N, V,S,H |
1 |
1 |
CPC Rd, Rr |
d: 0...31
r: 0...31 |
Сравнить два регистра с учетом переноса; содержимое Rd и Rr не меняется
(Rd - Rr - C) |
PC=PC+1 |
Z,C,N, V,S,H |
1 |
1 |
CPI Rd, K |
d: 16...31
K: 0...255 |
Сравнить значение в регистре с константой; содержимое Rd не меняется
(Rd - K) |
PC=PC+1 |
Z,C,N, V,S,H |
1 |
1 |
|
CPSE Rd, Rr |
d: 0...31
r: 0...31 |
Пропуск следующей команды при равенстве ре- гистров Rd и Rr. Если регистры не равны, счет-
чик команд увеличивается на 1, иначе – на раз- мер следующей команды (в словах) плюс 1. |
PC=PC+1(4)
PC=PC+2(6)
PC=PC+3(8) |
--- |
1 |
1(5)
2(7)
3(9) |
SBRC Rr, b |
r: 0...31
b: 0...7 |
Пропуск следующей команды, если бит «b» в РОН сброшен. Если бит «b» установлен, счет-
чик команд увеличивается на 1, иначе – на раз- мер следующей команды (в словах) плюс 1. |
PC=PC+1(4)
PC=PC+2(6)
PC=PC+3(8) |
--- |
1 |
1(5)
2(7)
3(9) |
SBRS Rr, b |
r: 0...31
b: 0...7 |
Пропуск следующей команды, если бит «b» в РОН установлен. Если бит «b» сброшен, счет-
чик команд увеличивается на 1, иначе – на раз- мер следующей команды (в словах) плюс 1. |
PC=PC+1(4)
PC=PC+2(6)
PC=PC+3(8) |
--- |
1 |
1(5)
2(7)
3(9) |
SBIC P, b |
P: 0...31
b: 0...7 |
Пропуск следующей команды, если бит «b» в РВВ сброшен. Если бит «b» установлен, счет-
чик команд увеличивается на 1, иначе – на раз- мер следующей команды (в словах) плюс 1. |
PC=PC+1(4)
PC=PC+2(6)
PC=PC+3(8) |
--- |
1 |
1(5)
2(7)
3(9) |
SBIS P, b |
P: 0...31
b: 0...7 |
Пропуск следующей команды, если бит «b» в РВВ установлен. Если бит «b» сброшен, счет-
чик команд увеличивается на 1, иначе – на раз- мер следующей команды (в словах) плюс 1. |
PC=PC+1(4)
PC=PC+2(6)
PC=PC+3(8) |
--- |
1 |
1(5)
2(7)
3(9) |
|
BRBS s, k |
s: 0...7
k: -64...+63 |
Относительный переход, если флаг «s» регист- ра SREG установлен. При «s»=1 в счетчик ко-
манд запишется значение PC+k+1, иначе - PC+1 |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(10)
2(10) |
BRBC s, k |
s: 0...7
k: -64...+63 |
Относительный переход, если флаг «s» регист- ра SREG сброшен. При «s»=0 в счетчик команд
запишется значение PC+k+1, иначе - PC+1. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(11)
2(11) |
BREQ k
(«Z» = 1) |
k: -64...+63 |
Эквивалент BRBS 1,k. Переход выполняется, если в результате последней операции, в том
числе, сравнения, получен нуль (без учета «C»). |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(10)
2(10) |
BRNE k
(«Z» = 0) |
k: -64...+63 |
Эквивалент BRBC 1,k. Переход выполняется, ес- ли в результате последней операции, в том
чис- ле, сравнения, получен не нуль (без учета «C»). |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(11)
2(11) |
BRLO k
(«C» = 1) |
k: -64...+63 |
Эквивалент BRBS 0,k. Переход выполняется, если в результате операции сравнения
чисел без знака левый операнд меньше правого. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(10)
2(10) |
BRSH k
(«C» = 0) |
k: -64...+63 |
Эквивалент BRBC 0,k. Переход выполняется, если при сравнении
чисел без знака левый операнд больше или равен правому. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(11)
2(11) |
BRLT k
(«S» = 1) |
k: -64...+63 |
Эквивалент BRBS 4,k. Переход выполняется, если в результате операции сравнения
чисел со знаком левый операнд меньше правого. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(10)
2(10) |
BRGE k
(«S» = 0) |
k: -64...+63 |
Эквивалент BRBC 4,k. Переход выполняется, если при сравнении
чисел со знаком левый операнд больше или равен правому. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(11)
2(11) |
BRMI k
(«N» = 1) |
k: -64...+63 |
Эквивалент BRBS 2,k. Переход выполняется, если в результате последней операции получено
отрицательное значение. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(10)
2(10) |
BRPL k
(«N» = 0) |
k: -64...+63 |
Эквивалент BRBC 2,k. Переход выполняется, если в результате последней операции получено
неотрицательное значение. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(11)
2(11) |
BRIE k
(«I» = 1) |
k: -64...+63 |
Эквивалент BRBS 7,k. Переход выполняется, если прерывания в программе разрешены. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(10)
2(10) |
BRID k
(«I» = 0) |
k: -64...+63 |
Эквивалент BRBC 7,k. Переход выполняется, если прерывания в программе запрещены. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(11)
2(11) |
BRCS k
(«C» = 1) |
k: -64...+63 |
Эквивалент BRBS 0,k. Переход выполняется, ес- ли в последней операции осуществлен перенос
из старшего бита результата (либо заем в Rd). |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(10)
2(10) |
BRCC k
(«C» = 0) |
k: -64...+63 |
Эквивалент BRBC 0,k. Переход выполняется, ес- ли в последней операции не было переноса
из старшего бита результата (либо заема в Rd). |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(11)
2(11) |
BRHS k
(«H» = 1) |
k: -64...+63 |
Эквивалент BRBS 5,k. Переход выполняется, ес- ли в последней операции осуществлен перенос
или заем между тетрадами байта. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(10)
2(10) |
BRHC k
(«H» = 0) |
k: -64...+63 |
Эквивалент BRBC 5,k. Переход выполняется, ес- ли в последней операции не было переноса
или заема между тетрадами байта. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(11)
2(11) |
BRVS k
(«V» = 1) |
k: -64...+63 |
Эквивалент BRBS 3,k. Переход выполняется, ес- ли в последней операции произошло
переполне- ние дополнительного кода. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(10)
2(10) |
BRVC k
(«V» = 0) |
k: -64...+63 |
Эквивалент BRBC 3,k. Переход выполняется, ес- ли в последней операции не было
переполнения дополнительного кода. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(11)
2(11) |
BRTS k
(«T» = 1) |
k: -64...+63 |
Эквивалент BRBS 6,k. Переход выполняется, ес- ли бит «T» в регистре статуса SREG
установлен. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(10)
2(10) |
BRTC k
(«T» = 0) |
k: -64...+63 |
Эквивалент BRBC 6,k. Переход выполняется, ес- ли бит «T» в регистре статуса SREG
сброшен. |
PC=PC+1
PC=PC+k+1 |
--- |
1 |
1(11)
2(11) |
1 – значение «2K», равное 2047, является результатом вычисления выражения «211–1».
2 – значение «4M», равное 4 194 303, является результатом вычисления выражения «222–1».
3 – значение «64K», равное 65 535, является результатом вычисления выражения «216–1».
4 – счетчик команд увеличивается на 1, если условие не выполняется (регистры не равны, либо тестируемый бит находится не в том состоянии).
5 – время выполнения инструкции составляет 1 машинный такт, если условие не выполняется (регистры не равны, либо тестируемый бит находится не в том состоянии).
6 – счетчик команд увеличивается на 2, если условие выполняется (регистры равны, либо тестируемый бит находится в указанном состоянии), а размер следующей команды составляет 1 слово (2 байта).
7 – время выполнения инструкции составляет 2 машинных такта, если условие выполняется (регистры равны, либо тестируемый бит находится в указанном состоянии), а следующая команда занимает в памяти 1 слово (2 байта).
8 – счетчик команд увеличивается на 3, если условие выполняется (регистры равны, либо тестируемый бит находится в указанном состоянии), а размер следующей команды составляет 2 слова (4 байта).
9 – время выполнения инструкции составляет 3 машинных такта, если условие выполняется (регистры равны, либо тестируемый бит находится в указанном состоянии), а следующая команда занимает в памяти 2 слова (4 байта).
10 – время выполнения инструкции составляет 1 машинный такт, если условие ложно, т.е. если требуемый бит в регистре SREG сброшен. Если условие истинно (т.е. бит установлен), время выполнения равно 2 такта.
11 – время выполнения инструкции составляет 1 машинный такт, если условие ложно, т.е. требуемый бит в регистре SREG установлен. Если условие истинно (т.е. бит сброшен), время выполнения равно 2 такта.
Инструкция |
Операнды |
Описание |
Счетчик команд |
Флаги |
Размер (слов) |
Такты |
Инструкции, выполняющие операции с битами |
SBI P, b |
P: 0...31
b: 0...7 |
Установка бита «b» в регистре ввода-вывода «P»: P[b] ← 1 |
PC=PC+1 |
--- |
1 |
1 |
CBI P, b |
P: 0...31
b: 0...7 |
Сброс бита «b» в регистре ввода-вывода «P»: P[b] ← 0 |
PC=PC+1 |
--- |
1 |
1 |
BST Rr, b |
r: 0...31
b: 0...7 |
Копирование одного бита из РОН во флаг «T»:
SREG[T] ← Rr[b] |
PC=PC+1 |
--- |
1 |
1 |
BLD Rd, b |
d: 0...31
b: 0...7 |
Копирование флага «T» в один из битов РОН:
Rd[b] ← SREG[T] |
PC=PC+1 |
--- |
1 |
1 |
|
LSL Rd |
d: 0...31 |
Логический сдвиг содержимого регистра влево: C←Rd[7], Rd[7]←Rd[6] ...
Rd[1]←Rd[0], Rd[0]←0 |
PC=PC+1 |
Z,C,N, V,S,H |
1 |
1 |
LSR Rd |
d: 0...31 |
Логический сдвиг содержимого регистра вправо: 0→Rd[7], Rd[7]→Rd[6] ...
Rd[1]→Rd[0], Rd[0]→C |
PC=PC+1 |
Z,C, V,S N=0 |
1 |
1 |
ROL Rd |
d: 0...31 |
Побитовый сдвиг регистра влево через перенос: C←Rd[7], Rd[7]←Rd[6] ...
Rd[1]←Rd[0], Rd[0]←C |
PC=PC+1 |
Z,C,N, V,S,H |
1 |
1 |
ROR Rd |
d: 0...31 |
Побитовый сдвиг регистра вправо через перенос: C→Rd[7], Rd[7]→Rd[6] ...
Rd[1]→Rd[0], Rd[0]→C |
PC=PC+1 |
Z,C,N, V,S |
1 |
1 |
ASR Rd |
d: 0...31 |
Арифметический сдвиг регистра вправо: Rd[7], Rd[7]→Rd[6] ...
Rd[1]→Rd[0], Rd[0]→C |
PC=PC+1 |
Z,C,N, V,S |
1 |
1 |
SWAP Rd |
d: 0...31 |
Перестановка тетрад в регистре:
Rd[7...4]←Rd[3...0], Rd[3...0]←Rd[7...4] |
PC=PC+1 |
--- |
1 |
1 |
|
BSET s |
s: 0...7 |
Установка одного бита/флага в регистре SREG:
SREG[s] ← 1 |
PC=PC+1 |
«s»=1 |
1 |
1 |
BCLR s |
s: 0...7 |
Сброс одного бита/флага в регистре SREG:
SREG[s] ← 0 |
PC=PC+1 |
«s»=0 |
1 |
1 |
SEI |
--- |
Общее разрешение прерываний:
SREG[I] ← 1. Эквивалент команды BSET 7. |
PC=PC+1 |
I=1 |
1 |
1 |
CLI |
--- |
Общий запрет прерываний:
SREG[I] ← 0. Эквивалент команды BCLR 7. |
PC=PC+1 |
I=0 |
1 |
1 |
SEC |
--- |
Установка флага переноса в регистре SREG:
SREG[C] ← 1. Эквивалент команды BSET 0. |
PC=PC+1 |
C=1 |
1 |
1 |
CLC |
--- |
Сброс флага переноса в регистре SREG:
SREG[C] ← 0. Эквивалент команды BCLR 0. |
PC=PC+1 |
C=0 |
1 |
1 |
SEZ |
--- |
Установка флага нуля в регистре SREG:
SREG[Z] ← 1. Эквивалент команды BSET 1. |
PC=PC+1 |
Z=1 |
1 |
1 |
CLZ |
--- |
Сброс флага нуля в регистре SREG:
SREG[Z] ← 0. Эквивалент команды BCLR 1. |
PC=PC+1 |
Z=0 |
1 |
1 |
SEN |
--- |
Установка флага отрицательного значения:
SREG[N] ← 1. Эквивалент команды BSET 2. |
PC=PC+1 |
N=1 |
1 |
1 |
CLN |
--- |
Сброс флага отрицательного значения:
SREG[N] ← 0. Эквивалент команды BCLR 2. |
PC=PC+1 |
N=0 |
1 |
1 |
SEV |
--- |
Установка флага переполнения доп. кода:
SREG[V] ← 1. Эквивалент команды BSET 3. |
PC=PC+1 |
V=1 |
1 |
1 |
CLV |
--- |
Сброс флага переполнения доп. кода:
SREG[V] ← 0. Эквивалент команды BCLR 3. |
PC=PC+1 |
V=0 |
1 |
1 |
SES |
--- |
Установка флага знака в регистре SREG:
SREG[S] ← 1. Эквивалент команды BSET 4. |
PC=PC+1 |
S=1 |
1 |
1 |
CLS |
--- |
Сброс флага знака в регистре SREG:
SREG[S] ← 0. Эквивалент команды BCLR 4. |
PC=PC+1 |
S=0 |
1 |
1 |
SEH |
--- |
Установка флага половинного переноса:
SREG[H] ← 1. Эквивалент команды BSET 5. |
PC=PC+1 |
H=1 |
1 |
1 |
CLH |
--- |
Сброс флага половинного переноса:
SREG[H] ← 0. Эквивалент команды BCLR 5. |
PC=PC+1 |
H=0 |
1 |
1 |
SET |
--- |
Установка флага пользователя в SREG:
SREG[T] ← 1. Эквивалент команды BSET 6. |
PC=PC+1 |
T=1 |
1 |
1 |
CLT |
--- |
Сброс флага пользователя в SREG:
SREG[T] ← 0. Эквивалент команды BCLR 6. |
PC=PC+1 |
T=0 |
1 |
1 |
Инструкция |
Операнды |
Описание |
Счетчик команд |
Флаги |
Размер (слов) |
Такты |
Инструкции, выполняющие перенос и загрузку данных |
MOV Rd, Rr |
d: 0...31
r: 0...31 |
Перенос данных из одного регистра в другой:
Rd ← Rr (работает только с РОН) |
PC=PC+1 |
--- |
1 |
1 |
MOVW Rd+1:Rd, Rr+1Rr |
d: четные
r: четные |
Перенос данных из одной пары регистров в дру- гую:
Rd+1:Rd ← Rr+1:Rr (работает только с РОН) |
PC=PC+1 |
--- |
1 |
1 |
LDI Rd, K |
d: 16...31
K: 0...255 |
Загрузка константы в регистр общего назначения:
Rd ← K |
PC=PC+1 |
--- |
1 |
1 |
|
LDS Rd, k(1) |
d: 0...31
k: 0...64K(2) |
Загрузка байта с прямой адресацией (адрес байта
указывается в «k»): Rd ← {k} |
PC=PC+2 |
--- |
2 |
2 |
STS k, Rr(3) |
r: 0...31
k: 0...64K(2) |
Сохранение байта с прямой адресацией (адрес
байта указывается в «k»): {k} ← Rr |
PC=PC+2 |
--- |
2 |
2 |
|
LD Rd, X(1) |
d: 0...31 |
Загрузка байта с косвенной адресацией (адрес
байта берется из пары XH:XL): Rd ← {X} |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, X+(1) |
d: 0...31 |
Загрузка байта с косвенной адресацией и постин-
крементом адреса: Rd ← {X}, X ← X + 1 |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, –X(1) |
d: 0...31 |
Загрузка байта с косвенной адресацией и предде-
крементом адреса: X ← X – 1, Rd ← {X} |
PC=PC+1 |
--- |
1 |
1 |
ST X, Rr(3) |
r: 0...31 |
Сохранение байта с косвенной адресацией
(адрес байта берется из пары XH:XL): {X} ← Rr |
PC=PC+1 |
--- |
1 |
1 |
ST X+, Rr(3) |
r: 0...31 |
Сохранение байта с косвенной адресацией и
постинкрементом адреса: {X} ← Rr, X ← X + 1 |
PC=PC+1 |
--- |
1 |
1 |
ST –X, Rr(3) |
r: 0...31 |
Сохранение байта с косвенной адресацией и
преддекрементом адреса: X ← X – 1, {X} ← Rr |
PC=PC+1 |
--- |
1 |
1 |
|
LD Rd, Y(1) |
d: 0...31 |
Загрузка байта с косвенной адресацией (адрес
байта берется из пары YH:YL): Rd ← {Y} |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, Y+(1) |
d: 0...31 |
Загрузка байта с косвенной адресацией и постин-
крементом адреса: Rd ← {Y}, Y ← Y + 1 |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, –Y(1) |
d: 0...31 |
Загрузка байта с косвенной адресацией и предде-
крементом адреса: Y ← Y – 1, Rd ← {Y} |
PC=PC+1 |
--- |
1 |
1 |
LDD Rd, Y+q(1) |
d: 0...31
q: 0...63 |
Загрузка байта с косвенной адресацией и смеще-
нием адреса: Rd ← {Y + q}, Y не изменяется |
PC=PC+1 |
--- |
1 |
1 |
ST Y, Rr(3) |
r: 0...31 |
Сохранение байта с косвенной адресацией
(адрес байта берется из пары YH:YL): {Y} ← Rr |
PC=PC+1 |
--- |
1 |
1 |
ST Y+, Rr(3) |
r: 0...31 |
Сохранение байта с косвенной адресацией и
постинкрементом адреса: {Y} ← Rr, Y ← Y + 1 |
PC=PC+1 |
--- |
1 |
1 |
ST –Y, Rr(3) |
r: 0...31 |
Сохранение байта с косвенной адресацией и
преддекрементом адреса: Y ← Y – 1, {Y} ← Rr |
PC=PC+1 |
--- |
1 |
1 |
STD Y+q, Rr(3) |
r: 0...31
q: 0...63 |
Сохранение байта с косвенной адресацией и сме-
щением адреса: {Y + q} ← Rr, Y не изменяется |
PC=PC+1 |
--- |
1 |
1 |
|
LD Rd, Z(1) |
d: 0...31 |
Загрузка байта с косвенной адресацией (адрес
байта берется из пары ZH:ZL): Rd ← {Z} |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, Z+(1) |
d: 0...31 |
Загрузка байта с косвенной адресацией и постин-
крементом адреса: Rd ← {Z}, Z ← Z + 1 |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, –Z(1) |
d: 0...31 |
Загрузка байта с косвенной адресацией и предде-
крементом адреса: Z ← Z – 1, Rd ← {Z} |
PC=PC+1 |
--- |
1 |
1 |
LDD Rd, Z+q(1) |
d: 0...31
q: 0...63 |
Загрузка байта с косвенной адресацией и смеще-
нием адреса: Rd ← {Z + q}, Z не изменяется |
PC=PC+1 |
--- |
1 |
1 |
ST Z, Rr(3) |
r: 0...31 |
Сохранение байта с косвенной адресацией
(адрес байта берется из пары ZH:ZL): {Z} ← Rr |
PC=PC+1 |
--- |
1 |
1 |
ST Z+, Rr(3) |
r: 0...31 |
Сохранение байта с косвенной адресацией и
постинкрементом адреса: {Z} ← Rr, Z ← Z + 1 |
PC=PC+1 |
--- |
1 |
1 |
ST –Z, Rr(3) |
r: 0...31 |
Сохранение байта с косвенной адресацией и
преддекрементом адреса: Z ← Z – 1, {Z} ← Rr |
PC=PC+1 |
--- |
1 |
1 |
STD Z+q, Rr(3) |
r: 0...31
q: 0...63 |
Сохранение байта с косвенной адресацией и сме-
щением адреса: {Z + q} ← Rr, Z не изменяется |
PC=PC+1 |
--- |
1 |
1 |
|
LPM (4) |
--- |
Загрузка в R0 байта данных из памяти EFLASH
(адрес байта берется из пары ZH:ZL): R0 ← {Z} |
PC=PC+1 |
--- |
1 |
2 |
LPM Rd, Z(4) |
d: 0...31 |
Загрузка байта данных из памяти EFLASH
(адрес байта берется из пары ZH:ZL): Rd ← {Z} |
PC=PC+1 |
--- |
1 |
2 |
LPM Rd, Z+(4) |
d: 0...31 |
Загрузка байта данных из памяти EFLASH
с постинкрементом адреса: Rd ← {Z}, Z ← Z + 1 |
PC=PC+1 |
--- |
1 |
2 |
|
IN Rd, P |
d: 0...31
P: 0...63(5) |
Загрузка содержимого регистра ввода-вывода
в регистр общего назначения: Rd ← P |
PC=PC+1 |
--- |
1 |
1 |
OUT P, Rr |
r: 0...31
P: 0...63(5) |
Сохранение содержимого регистра общего назна-
чения в регистре ввода-вывода: P ← Rr |
PC=PC+1 |
--- |
1 |
1 |
|
PUSH Rr |
r: 0...31 |
Сохранение регистра общего назначения в стеке:
STACK ← Rr; SP ← SP - 1 |
PC=PC+1 |
--- |
1 |
1 |
POP Rd |
d: 0...31 |
Извлечение регистра общего назначения из
стека: Rd ← STACK; SP ← SP + 1 |
PC=PC+1 |
--- |
1 |
1 |
1 – при помощи данной инструкции можно получить доступ к любой ячейке памяти МК, включая память программ («FLASH») и память данных пользователя («EEPROM»). Обратите внимание на то, что адреса с 0x2100 по 0x28FF зарезервированы для работы с 16-разрядной шиной данных.
2 – значение «64K», равное 65 535, является результатом вычисления выражения «216–1».
3 – при помощи этой инструкции можно сохранить данные только во внутреннем ОЗУ, в регистрах ввода-вывода и в регистрах общего назначения. Память программ («FLASH») и память данных пользователя («EEPROM») при использовании рассматриваемой команды будет недоступна. Обратите внимание на то, что адреса с 0x2100 по 0x28FF зарезервированы для работы с 16-разрядной шиной данных.
4 – при помощи данной инструкции можно получить доступ как к памяти программ («FLASH»), так и к памяти данных пользователя («EEPROM»). Обратите внимание на то, что при работе контроллера E2PCTL фактический адрес требуемой ячейки в «EEPROM» будет меняться в зависимости от того, какая из выделенных страниц памяти является активной.
5 – адреса $02, $10, $11, $38, $39, соответствующие регистрам ускорителя вычислений DSSD, DSDX, DSDY, DSAL, DSAH, зарезервированы для работы с 16-разрядной шиной данных.
Инструкции, выполняющие обмен данными по 16-битной шине, применяются только при работе с ускорителем вычислений uDSC, причем, для возможности их использования ускоритель должен быть включен (необходимо установить бит «DSUEN» в регистре DSCR). Следует иметь ввиду, что при работе с инструкциями ST, STD и LD -X/Y/Z требуется учитывать особенности доступа ускорителя вычислений к памяти ОЗУ, описанные в соответствующей заметке (на данный момент она находится в стадии разработки). Остальные команды, описанные в таблице ниже (IN, OUT, STS, LDD и LD), будут работать без дополнительных плясок с бубном. Обратите внимание на то, что в перечне «16-битных» инструкций отсутствуют LDS и ST-X/Y/Z - это не опечатка или ошибка, просто первая команда тупо не работает (хотя, в официальной документации утверждается иное), а вторая дает настолько кривой результат, что я решил ее не упоминать.
Инструкция |
Операнды |
Описание |
Счетчик команд |
Флаги |
Размер (слов) |
Такты |
Инструкции, выполняющие обмен данными по 16-битной шине |
IN Rd, P |
d: четные
P: uDSC(1) |
Загрузка содержимого регистра ускорителя вы-
числений в регистровую пару:     Rd+1:Rd ← P |
PC=PC+1 |
--- |
1 |
1 |
OUT P, Rr |
r: четные
P: uDSC(1) |
Сохранение содержимого регистровой пары в ре-
гистре ускорителя вычислений:     P ← Rr+1:Rr |
PC=PC+1 |
--- |
1 |
1 |
|
LD Rd, X(2) |
d: 0...3(3) |
Загрузка в регистр ускорителя вычислений двух
байт из ОЗУ (адрес в XH:XL): uDSC ← {X}:{X+1}(4) |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, X+(2) |
d: 0...3(3) |
Загрузка с последующим увеличением адреса на 2:
    uDSC ← {X}:{X+1}(4);
X ← X + 2(5) |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, –X(2) |
d: 0...3(3) |
Загрузка с предварительным уменьшением адре- са на 2:
    X ← X – 2(5);
uDSC ← {X}:{X+1}(4) |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, Y(2) |
d: 0...3(3) |
Загрузка в регистр ускорителя вычислений двух
байт из ОЗУ (адрес в YH:YL): uDSC ← {Y}:{Y+1}(4) |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, Y+(2) |
d: 0...3(3) |
Загрузка с последующим увеличением адреса на 2:
    uDSC ← {Y}:{Y+1}(4);
Y ← Y + 2(5) |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, –Y(2) |
d: 0...3(3) |
Загрузка с предварительным уменьшением адре- са на 2:
    Y ← Y – 2(5);
uDSC ← {Y}:{Y+1}(4) |
PC=PC+1 |
--- |
1 |
1 |
LDD Rd, Y+q(2) |
d: 0...3(3)
q: 0...63 |
Загрузка с последующим увеличением адреса на q:
    uDSC ← {Y}:{Y+1}(4);
Y ← Y + q(6) |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, Z(2) |
d: 0...3(3) |
Загрузка в регистр ускорителя вычислений двух
байт из ОЗУ (адрес в ZH:ZL): uDSC ← {Z}:{Z+1}(4) |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, Z+(2) |
d: 0...3(3) |
Загрузка с последующим увеличением адреса на 2:
    uDSC ← {Z}:{Z+1}(4);
Z ← Z + 2(5) |
PC=PC+1 |
--- |
1 |
1 |
LD Rd, –Z(2) |
d: 0...3(3) |
Загрузка с предварительным уменьшением адре- са на 2:
    Z ← Z – 2(5);
uDSC ← {Z}:{Z+1}(4) |
PC=PC+1 |
--- |
1 |
1 |
LDD Rd, Z+q(2) |
d: 0...3(3)
q: 0...63 |
Загрузка с последующим увеличением адреса на q:
    uDSC ← {Z}:{Z+1}(4);
Z ← Z + q(6) |
PC=PC+1 |
--- |
1 |
1 |
|
STS k, Rr |
k: 0x2100...
...0x28FF(7)
r: 0...4(8) |
Сохранение в двух ячейках ОЗУ содержимого ре-
гистра ускорителя вычислений:
{k – 0x2000} : {k+1 – 0x2000}(4) ← uDSCs |
PC=PC+2 |
--- |
2 |
2 |
|
ST X, Rr(2) |
r: 0...4(8) |
Сохранение регистра ускорителя в двух ячейках
ОЗУ (адрес в XH:XL):     {X}:{X+1} ← uDSC(4) |
PC=PC+1 |
--- |
1 |
1 |
ST X+, Rr(2) |
r: 0...4(8) |
Сохранение с предварительным увеличением адреса на 2:
    X ← X + 2(5);
{X}:{X+1} ← uDSC(4) |
PC=PC+1 |
--- |
1 |
1 |
ST Y, Rr(2) |
r: 0...4(8) |
Сохранение регистра ускорителя в двух ячейках
ОЗУ (адрес в YH:YL):     {Y}:{Y+1} ← uDSC(4) |
PC=PC+1 |
--- |
1 |
1 |
ST Y+, Rr(2) |
r: 0...4(8) |
Сохранение с предварительным увеличением адреса на 2:
    Y ← Y + 2(5);
{Y}:{Y+1} ← uDSC(4) |
PC=PC+1 |
--- |
1 |
1 |
STD Y+q, Rr(2) |
r: 0...4(8) |
Сохранение с предварительным увеличением адреса на q:
    Y ← Y + q(6);
{Y}:{Y+q} ← uDSC(4) |
PC=PC+1 |
--- |
1 |
1 |
ST Z, Rr(2) |
r: 0...4(8) |
Сохранение регистра ускорителя в двух ячейках
ОЗУ (адрес в ZH:ZL):     {Z}:{Z+1} ← uDSC(4) |
PC=PC+1 |
--- |
1 |
1 |
ST Z+, Rr(2) |
r: 0...4(8) |
Сохранение с предварительным увеличением адреса на 2:
    Z ← Z + 2(5);
{Z}:{Z+1} ← uDSC(4) |
PC=PC+1 |
--- |
1 |
1 |
STD Z+q, Rr(2) |
r: 0...4(8) |
Сохранение с предварительным увеличением адреса на q:
    Z ← Z + q(6);
{Z}:{Z+q} ← uDSC(4) |
PC=PC+1 |
--- |
1 |
1 |
1 – для работы с 16-разрядной шиной в командах IN/OUT в качестве источника или приемника данных необходимо указать один из 16-битных регистров ускорителя вычислений uDSC: DSDX (адрес $10), DSDY (адрес $11), DSAH (адрес $39), DSAL (адрес $38) и DSSD (адрес $02). Обратите внимание на то, что приведенные адреса́ относятся к пространству ввода-вывода, как того требуют инструкции IN/OUT. Для получения абсолютных адресов данные значения необходимо увеличить на 0x0020.
2 – для работы с 16-разрядной шиной при помощи команд LD/LDD и ST/STD в указатель X/Y/Z необходимо записать фактический адрес требуемой ячейки/переменной в ОЗУ, увеличенный на 0x2000 (тот же эффект дает установка бита #5 в старшем байте указателя). Например, для доступа к ячейкам с адресами 0x0120 и 0x0121 в указатель нужно загрузить число 0x2120.
3 – для загрузки данных в регистр DSDX ускорителя вычислений в команде LD/LDD необходимо указать регистр R0. Для загрузки в DSDY – регистр R1, для загрузки в DSAL – регистр R2, для загрузки в DSAH – регистр R3. Обратите внимание на то, что для работы по такой схеме бит «MM» в регистре DSCR должен быть сброшен.
4 – ячейка, расположенная по адресу, указанному в команде, будет соответствовать младшему байту регистра ускорителя вычислений, ячейка по адресу +1 – старшему байту.
5 – обратите внимание на то, что изменение адреса требуемой ячейки на 2 крайне удобно при работе с массивами 16-битных чисел.
6 – для работы с массивами 16-битных чисел удобно использовать q = 2 (хотя в общем случае допускается q = 0...63). При q = 0 содержимое регистра-указателя (Y или Z) не будет изменено.
7 – для работы с 16-разрядной шиной при помощи команды STS, в ней необходимо указать фактический адрес требуемой ячейки ОЗУ, увеличенный на 0x2000 (тот же эффект дает установка бита #5 в старшем байте указываемого адреса). Например, для доступа к ячейкам с адресами 0x0115 и 0x0116 в команде нужно указать число 0x2115.
8 – для сохранения в ОЗУ содержимого регистра DSDX ускорителя вычислений в команде ST/STD/STS необходимо указать регистр R0. Для сохранения DSDY – регистр R1, для сохранения DSAL – регистр R2, для сохранения DSAH – регистр R3, для сохранения DSSD – регистр R4. Обратите внимание на то, что для работы по такой схеме бит «MM» в регистре DSCR должен быть сброшен.
Инструкция |
Операнды |
Описание |
Счетчик команд |
Флаги |
Размер (слов) |
Такты |
Инструкции, осуществляющие управление микроконтроллером |
NOP |
--- |
«Пустая» команда (пропуск одного такта МК без
выполнения каких-либо действий). |
PC=PC+1 |
--- |
1 |
1 |
SLEEP |
--- |
Перевод микроконтроллера в режим пониженного энергопотребления. |
PC=PC+1 |
--- |
1 |
1 |
WDR |
--- |
Сброс сторожевого таймера микроконтроллера. |
PC=PC+1 |
--- |
1 |
1 |
BREAK |
--- |
Остановка хода выполнения программы. |
PC=PC+1 |
--- |
1 |
--- |
Обсудить эту заметку можно в
Телеге или в
ВК
|
Место для разного (сдается)
|