![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Множество инструкций микроконтроллера образует систему команд. Система команд, как правило, не меняется для всех микроконтроллеров одного семейства. В полном списке инструкций при описании системы обычно выделяются отдельные группы, родственных по применению инструкций, например, арифметические и логические команды, команды пересылки и др. Это деление довольно условно и полностью определяется политикой разработчика.
При описании системы команд приводится полная информация о каждой инструкции: способах адресации, использовании флагов регистра состояния, времени исполнения.
В качестве примера рассмотрим систему команд микроконтроллера ATmega 163. Система команд микроконтроллера содержит 130 команд, условно разделенных на четыре группы:
0 команды пересылки данных (data transfer instructions),
0 арифметические и логические команды (arithmetic and logic instructions),
0 команды работы с битами (bit and bit-test instructions),
0 команды ветвления (branch instructions).
При описании системы команд использованы следующие обозначения:
0 Rd - регистр-приемник результата (0 ≤ d ≤ 31),
0 Rd* - регистр-приемник результата с номером более 16 (16 ≤ d ≤ 31),
0 Rr - регистр-источник (0 ≤ r ≤ 31),
0 Rdl: регистры R24, R26, R28, R30 (для инструкций ADIW и SBIW),
0 P- адрес регистра ввода/вывода,
0 P*- адрес побитно адресуемого регистра ввода/вывода ($00-$1F)
0 K - символьная или численная константа (8 бит)
0 k - адресная константа
0 b - номер бита в регистре (3 бита)
0 s - номер бита в регистре статуса (3 бита)
0 X, Y, Z - регистры косвенной адресации (X=R27:R26, Y=R29:R28; Z=R31:R30
Команды пересылки
Команды пересылки осуществляют перемещение данных между ячейками памяти и регистрами процессорного ядра. Один из операндов, участвующих в инструкции, является источником данных, второй - приемником. При пересылке из источника в приемник копия данных всегда остается в источнике. Таким образом, все команды пересылки практически осуществляют копирование данных.
Одним из операндов в любой команде пересылки обычно является регистр общего назначения процессорного ядра. Вторым может быть любой регистр или ячейка памяти.
Инструкции, как правило, не влияют на флаги в регистре состояния процессорного ядра.
В системе команд микроконтроллеров AVR предусмотрено 34 инструкции, осуществляющие пересылку данных. В инструкциях используются все, за исключением битовых, способы адресации данных; одним из операндов в любой инструкции является регистр общего назначения. Инструкция ldi (load immediate), использующая непосредственную адресацию, может быть использована только в старшей половине файла регистров общего назначения (R16....R31), остальные команды работают с любым из регистров файла. Инструкцию spm (store program memory), осуществляющую запись кода в память программ, можно использовать только в Boot Program Section памяти программ.
Время выполнения инструкций, работающих с регистрами, равно 1 такту. Инструкции, обращающиеся к ячейкам памяти данных, выполняются за 2 такта, а обращающиеся к ячейкам памяти программ - за 3 такта.
Таблица. 3.1. Команды пересылки AVR-микроконтроллеров
Мнемоника | Операнды | Описание инструкции | Выполняемая операция | Флаги | Такты | ||
mov | Rd, Rr | Move Between Registers | Rd<- Rr | None | |||
movw | Rd, Rr | Copy Register Word | Rd+1:Rd<- Rr+1:Rr | None | |||
ldi | Rd*, K | Load Immediate | Rd<- K | None | |||
ld | Rd, X | Load Indirect | Rd<- (X) | None | |||
ld | Rd, X+ | Load Indirect and Post-Inc. | Rd <- (X), X <- X + 1 | None | |||
ld | Rd,-X | Load Indirect and Pre-Dec. | X<-X-1,Rd<- (X) | None | |||
ld | Rd, Y | Load Indirect | Rd <- (Y) | None | |||
ld | Rd, Y+ | Load Indirect and Post-Inc. | Rd <- (Y), Y <- Y + 1 | None | |||
ld | Rd,-Y | Load Indirect and Pre-Dec. | Y<-Y-1,Rd<- (Y) | None | |||
ldd | Rd, Y+q | Load Indirect with Displacement | Rd<- (Y + q) | None | |||
ld | Rd, Z | Load Indirect | Rd<- (Z) | None | |||
ld | Rd, Z+ | Load Indirect and Post-Inc. | Rd <- (Z), Z <- Z+1 | None | |||
ld | Rd,-Z | Load Indirect and Pre-Dec | Z<- Z-1,Rd<- (Z) | None | |||
ldd | Rd, Z+q | Load Indirect with Displacement | Rd<- (Z + q) | None | |||
lds | Rd, k | Load Direct from SRAM | Rd<- (k) | None | |||
ST | X, Rr | Store Indirect | (X)<- Rr | None | |||
st | X+, Rr | Store Indirect and Post-Inc. | (X) <- Rr, X <- X + 1 | None | |||
st | -X, Rr | Store Indirect and Pre-Dec. | X<- X-1,(X)<- Rr | None | |||
st | Y, Rr | Store Indirect | (Y) <- Rr | None | |||
st | Y+, Rr | Store Indirect and Post-Inc. | (Y) <- Rr, Y <- Y + 1 | None | |||
st | -Y, Rr | Store Indirect and Pre-Dec. | Y<- Y-1,(Y)<- Rr | None | |||
std | Y+q,Rr | Store Indirect with Displacement | (Y + q)<- Rr | None | |||
st | Z, Rr | Store Indirect | (Z) <- Rr | None | |||
st | Z+, Rr | Store Indirect and Post-Inc. | (Z) <- Rr, Z <- Z + 1 | None | |||
st | -Z, Rr | Store Indirect and Pre-Dec | Z<- Z-1,(Z)<- Rr | None | |||
std | Z+q,Rr | Store Indirect with Displacement | (Z + q)<- Rr | None | |||
sts | k, Rr | Store Direct to SRAM | (k)<- Rr | None | |||
lpm | Load Program Memory | R0<- (Z) | None | ||||
lpm | Rd, Z | Load Program Memory | Rd<-Z) | None | |||
lpm | Rd, Z+ | Load Program Memory and Post-Inc. | Rd <- (Z), Z=Z+1 | None | |||
spm | Store Program Memory | (Z)<- R1:R0 | None | - | |||
in | Rd, P | In Port | Rd<- P | None | |||
out | P, Rr | Out Port | P<- Rr | None | |||
push | Rr | Push Register on Stack | STACK <- Rr; SP<- SP-1 | None | |||
pop | Rd | Pop Register from Stack | SP<- SP+1, Rd<- STACK | None | |||
Арифметические и логические команды
В группу арифметических команд входят команды выполняющие сложение, вычитание, декремент и инкремент данных, логическое умножение, логическое сложение, операцию ИСКЛЮЧАЮЩЕЕ ИЛИ, инверсию переменной. Обычно к этой группе относят также инструкции сравнения данных. В микроконтроллере АТтеда163 реализованы также функции арифметического умножения целых чисел и дробных чисел, без знака и со знаком.
Все инструкции этой группы, как правило, приводят к изменению состояния флагов регистра состояния в соответствии с результатами, выполняемой операции.
В микроконтроллерах с архитектурой AVR предусмотрено довольно много (31) инструкций, выполняющих арифметические и логические преобразования данных. Инструкции используют исключительно прямую регистровую или непосредственную адресацию данных. Операнды хранятся в регистрах общего назначения, в один из них (регистр-приемник) всегда направляется и результат вычислений.
В результате выполнения инструкций изменяются флаги регистра SREG (Status Register), а флаг переноса С (Carry), кроме того, непосредственно участвует в выполнении ряда операций.
Арифметические команды сложения и вычитания выполняют сложение и вычитание одно- и двухбайтных операндов. Команды adc (add with carry two registers) и sbc (subtract with carry two registers) используют при вычислениях флаг переноса С.
Инструкции логического умножения (and) и логического сложения (or), ИСКЛЮЧАЮЩЕЕ ИЛИ (eor) преобразуют только однобайтные данные.
Инструкция дополнения до единицы com (one's complement), фактически выполняет операцию инверсии, а инструкция дополнения до двух neg (two's complement) - меняет знак числа.
Инструкции установки (set) позволяют установить как отдельные, так и все биты выбранного регистра в единичное состояние, а команды очистки (clear) - в нулевое.
Инструкции инкремента регистра inc (increment) и декремента регистра dec (decrement) используют прямую адресацию одного выбранного регистра.
Тест на нуль или минус tst (test for гею or minus) фактически не меняет содержимого регистра, но устанавливает соответствующие флаги при равенстве операнда нулю или при его отрицательном значении.
Команды сравнения (compare) также не меняют содержимого регистров, а оценивают разность операндов и устанавливают соответствующие флаги в регистре состояния.
Шесть инструкций умножения (multiply) выполняют умножение целых и дробных операндов с учетом и без учета знака. 16-битный результат умножения всегда записывается в регистры общего назначения R0:R1.
Большинство арифметических и логических команд выполняются за один такт. Исключение составляют только команды с непосредственной адресацией, работающие с двухбайтными словами: adiw (add immediate to word) и sbiw (subtract immediate from word), и команды умножения, выполняющиеся за два такта.
Таблица 3.2. Арифметические и логические команды микроконтроллера Atmega163
Мнемо- ника | Операнды | Описание | Операция | Флаги | Такm | |
add | Rd, Rr | Add without Carry two Registers | Rd <- Rd + Rr | Z,C,N,V,H | ||
adc | Rd, Rr | Add with Carry two Registers | Rd <- Rd + Rr + C | Z,C,N,V,H | ||
adiw | Rdl, K | ADD Immediate from Word | Rdh:Rdl <- Rdh:Rdl+K | Z,C,N,V,S | ||
sub | Rd, Rr | Subtract without Carry two Registers | Rd<- Rd-Rr | Z,C,N,V,H | ||
subi | Rd*, K | Subtract Constant from Register | Rd<- Rd-K | Z,C,N,V,H | ||
sbc | Rd, Rr | Subtract with Carry two Registers | Rd<- Rd-Rr-C | Z,C,N,V,H | ||
sbci | Rd*, K | Subtract with Carry Constant from Register | Rd<- Rd-K-C | Z,C,N,V,H | ||
sbiw | Rdl, K | Subtract Immediate from Word | Rdh:Rd <- Rdh:Rdl- K | Z,C,N,V,S | ||
and | Rd, Rr | Logical AND Registers | Rd <- Rd Rr | Z,N,V | ||
andi | Rd*, K | Logical AND Register and Constant | Rd <- Rd K | Z,N,V | ||
or | Rd, Rr | Logical OR Registers | Rd <- Rd v Rr | Z,N,V | ||
ori | Rd*, K | Logical OR Register and Constant | Rd<- RdvK | Z,N,V | ||
eor | Rd, Rr | Exclusive OR Registers | Rd <- Rd Rr | Z,N,V | ||
com | Rd | One's Complement | Rd <- $FF - Rd | Z,C,N,V | ||
neg | Rd | Two's Complement | Rd<- $00-Rd | Z,C,N,V,H | ||
sbr | Rd*, K | Set Bit(s) in Register | Rd<- RdvK | Z,N,V | ||
ser | Rd | Set Register | Rd <- $FF | None | ||
cbr | Rd*, K | Clear Bit(s) in Register | Rd <- Rd ($FF - K) | Z,N,V | ||
clr | Rd | Clear Register | Rd <- $00 | Z,N,V | ||
inc | Rd | Increment | Rd <- Rd + 1 | Z,N,V | ||
dec | Rd | Decrement | Rd<- Rd-1 | Z,N,V | ||
tst | Rd | Test for Zero or Minus | Rd <- Rd Rd | Z,N,V | ||
ср | Rd, Rr | Compare | Rd-Rr | Z, N,V,C,H | ||
срс | Rd, Rr | Compare with Carry | Rd-Rr-C | Z, N,V,C,H | ||
cpi | Rd*, K | Compare Register with Immediate | Rd-K | Z, N,V,C,H | ||
mul | Rd, Rr | Multiply Unsigned | R1:R0<-RdxRr | Z,C | ||
muls | Rd, Rr | Multiply Signed | R1:R0<-RdxRr | Z,C | ||
mulsu | Rd, Rr | Multiply Signed with Unsigned | R1:R0<-RdxRr | Z,C | ||
fmul | Rd, Rr | Fractional Multiply Unsigned | R1:R0<-(RdxRr)«1 | Z,C | ||
fmuls | Rd, Rr | Fractional Multiply Signed | R1:R0<-(RdxRr)«1 | Z,C | ||
fmulsu | Rd, Rr | Fractional Multiply Signed with Unsigned | R1:RCX-(RdxRr)«1 | Z,C | ||
Битовые команды
Битовые команды (Bit And Bit-Test Instructions) позволяют обращаться непосредственно к отдельным битам регистров процессорного ядра и выполнять с выбранными битами простейшие операции: пересылки, установки и сброса. Операндами команд могут быть как биты регистров общего назначения, так и биты регистров ввода/вывода. Битовые команды могут влиять на отдельные флаги регистра признаков.
Битовые команды микроконтроллеров семейства AVR работают с отдельными битами регистров общего назначения и регистров ввода/вывода. Биты регистров ввода/вывода могут быть установлены или сброшены. Биты регистров общего назначения могут быть сдвинуты в соседние ячейки, как влево (в сторону старших разрядов), так и вправо (в сторону младших разрядов). В операциях сдвига, кроме разрядов регистров, может участвовать и бит переноса. Специальные команды предусмотрены для установки и сброса отдельных флагов регистра состояния. Команда swap меняет местами тетрады (полубайты) регистров общего назначения.
Таблица 3.3. Битовые команды микроконтроллера АТтеда163
Мнемо- ника | Операнды | Описание | Операция | Флаги | Так m |
sbi | P*,b | Set Bit in I/O Register | I/O(P,b) <-1 | None | |
cbi | P*,b | Clear Bit in I/O Register | I/O(P,b) <- 0 | None | |
lsl | Rd | Logical Shift Left | Rd(n+1) <- Rd(n), Rd(0) <- 0 | Z,C,N,V | |
lsr | Rd | Logical Shift Right | Rd(n)<-Rd(n+1), Rd(7)<-0 | Z,C,N,V | |
rol | Rd | Rotate Left Through Carry | Rd(0)<-C, Rd(n+1)<- Rd(n), C <- Rd(7) | Z,C,N,V | |
гог | Rd | Rotate Right Through Carry | Rd(7) <- C,Rd(n)<- Rd(n+1),C<-Rd(0) | Z,C,N,V | |
asr | Rd | Arithmetic Shift Right | Rd(n)<-Rd(n+1), n=0..6 | Z,C,N,V | |
swap | Rd | Swap Nibbles | Rd(3..0)<-Rd(7..4), Rd(7..4) <-Rd(3..0) | None | |
bset | s | Flag Set | SREG(s) <-1 SREG(s) | ||
bclr | s | Flag Clear | SREG(s) <- 0 SREG(s) | ||
bld | Rd, b | Bit load from T to Register | Rd(b) <- T | None | |
bst | Rr, b | Bit Store from Register to T | T <- Rr(b) | T | |
sec | Set Carry | C<-1 | С | ||
clc | Clear Carry | C<-0 | с | ||
sen | Set Negative Flag | N<-1 | N | ||
cln | Clear Negative Flag | N<-0 | N | ||
sez | zSet Zero Flag Z <-1 | z | |||
clz | Clear Zero Flag | Z<-0 | z | ||
sei | Global Interrupt Enable | K-1 | I | ||
cli | Global Interrupt Disable | <-0 | I | ||
ses | Set Signed Test Flag | S<-1 | s | ||
cls | Clear Signed Test Flag | S<-0 | s | ||
sev | Set Twos Complement Overflow | V<-1 | V | ||
clv | Clear Twos Complement Overflow | V<-0 | V | ||
set | SetTinSREG | T<-1 | T | ||
clt | Clear T in SREG | T<-0 | T | ||
she | Set Half Carry Flag in SREG | H<-1 | H | ||
clh | Clear Half Carry Flag in SREG | H<-0 | H |
Инструкции ветвления
Инструкции ветвления изменяют содержимое программного счетчика. Они используются при организации переходов и подпрограмм. Инструкции условных переходов и условных вызовов подпрограмм в процессе исполнения проверяют выполнение различных условий. Если условие не выполняется, программный счетчик просто инкрементируется. Такими условиями может быть равенство содержимого двух регистров, единичное или нулевое состояние заданных битов в регистрах общего назначения, регистрах ввода/вывода или в регистре состояния, Например, команда cpse (compare, skip if equal) проверяет равенство содержимого регистров, команда sbrc Rr, b (skip if bit in register cleared) осуществляет переход при условии равенства нулю содержимого бита b в регистре Rr, а инструкция brmi k (branch if minus) проверяет флаг отрицательного результата (N) в ретстре состояния SREG.
Время выполнения команд ветвления зависит от результата проверки. Оно, для различных инструкций, может меняться, в пределах от одного до четырех тактов.
Таблица 3.4. Команды переходов микроконтроллера АТтеда163
Мнемоника | Операн ды | Описание | Операция | Флаги | Такт |
rjmp | k | Relative Jump | PC <- PC + k + 1 | None | |
ijmp | Indirect Jump to (Z) | PC<-Z | None | ||
jmp | k | Jump | PC<-k | None | |
rcall | k | Relative Subroutine Call | PC <- PC + k + 1 | None | |
call | k | Call Subroutine | PC<-k | None | |
icall | Indirect Call to (Z) | PC<-Z | None | ||
ret | Subroutine Return | PC <- STACK | None | ||
reti | Interrupt Return | PC <- STACK | I | ||
cpse | Rd,Rr | Compare, Skip if Equal | if (Rd = Rr) PC <- PC + 2 or3 | None | 1/2/ 3 |
sbrc | Rr, b | Skip if Bit in Register Cleared | if(Rr(b)=0) PC<-PC + 2 or3 | None | 1/2 |
sbrs | Rr, b | Skip if Bit in Register is Set | if (Rr(b)=1)PC<-PC + 2 or3 | None | 1/2 |
sbic | P*, b | Skip if Bit in I/O Register Cleared | if (P(b)=0) PC <- PC + 2 or 3 | None | 1/2 |
sbis | P*, b | Skip if Bit in I/O Register is Set | if(P(b)=1)PC<-PC + 2or 3 | None | 1/2 |
brbs | s, k | Branch if Status Flag Set | if(SREG(s)=1)thenPC <- PC+k + 1 | None | 1/2 |
brbc | s, k | Branch if Status Flag Cleared | if(SREG(s) = 0) then PC <- PC+k + 1 | None | 1/2 |
breq | k | Branch if Equal | if(Z=1)thenPC<-PC + k+1 | None | 1/2 |
brcs | k | Branch if Carry Set | if(C=1)thenPC<-PC + k+ 1 | None | 1/2 |
brne | k | Branch if Not Equal | if (Z = 0) then PC <- PC + k+1 | None | 1/2 |
brcc | k | Branch if Carry Cleared | if (C = 0) then PC <- PC + k+ 1 | None | 1/2 |
brsh | k | Branch if Same or Higher | if (C = 0) then PC <- PC + k+ 1 | None | 1/2 |
brlo | k | Branch if Lower | if(C=1)thenPC<-PC + k+1 | None | 1/2 |
brmi | k | Branch if Minus | if (N = 1)thenPC<-PC + k+ 1 | None | 1/2 |
brpl | k | Branch if Plus | if (N = 0) then PC <- PC + k+1 | None | 1/2 |
brge | k | Branch if Greater or Equal, Signed | if (N © V= 0) then PC <- PC + k + 1 | None | 1/2 |
brlt | k | Branch if Less Than Zero, Signed | if (N®V= 1)thenPC<- PC + k + 1 | None | 1/2 |
brhs | k | Branch if Half Carry Flag Set | if(H = 1)thenPC<-PC + k+1 | None | 1/2 |
brhc | k | Branch if Half Carry Flag Cleared | if (H = 0) then PC <- PC + k+ 1 | None | |
brts | k | Branch if T Flag Set | if (T = 1)thenPC<-PC + k+1 | None | 1/2 |
brtc | k | Branch if T Flag Cleared | if (T = 0) then PC <- PC + k+ 1 | None | 1/2 |
brvs | k | Branch if Overflow Flag is Set | if (V = 1)thenPC<-PC + k+1 | None | 1/2 |
brvc | k | Branch if Overflow Flag is Cleared | if (V = 0) then PC <- PC + k+1 | None | 1/2 |
brie | k | Branch if Interrupt Enabled | if (I = 1)thenPC<-PC + k+ 1 | None | 1/2 |
brid | k | Branch if Interrupt Disabled | if (I = 0) then PC <- PC + k+1 | None | 1/2 |
Инструкции управления
Инструкции управления используются для управления вычислениями и режимами работы процессорного ядра. Пустая операция nop заполняет пробелы между инструкциями в программной памяти или используется в качестве выдержки. Команда sleep переводит процессорное ядро в режим пониженного энергопотребления. Инструкция wdr сбрасывает сторожевой таймер.
Таблица 3.5. Инструкции управления микроконтроллера АТтеда163.
Дата публикования: 2014-11-03; Прочитано: 970 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!