Мы поможем в написании ваших работ!
ЗНАЕТЕ ЛИ ВЫ?
|
Система команд та їх характеристика
Усі команди AVR-контролерів можна умовно розділити на чотири групи:
- арифметичні і логічні команди;
- команди розгалуження;
- команди пересилки;
- команди роботи з бітами.
В табл.2.1. приведено вся система команд 8-розрядних AVR-контролерів.
Таблиця 2.1
Мнемоніка
| Операнди
| Описання
| Дія
| Прапорці
| Цикл
| АРИФМЕТИЧНІ І ЛОГІЧНІ КОМАНДИ
| ADD
| Rd, Rr
| Скласти два регістра
| Rd ← Rd + Rr
| Z,,N,V,H
|
| ADC
| Rd, Rr
| Скласти з переносом
| Rd ← Rd + Rr + C
| Z,C,N,V,H
|
| 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
|
| AND
| Rd, Rr
| Логічне “І” двох регістрів
| Rd ← Rd AND Rr
| Z, N, V
|
| ANDI
| Rd, K
| Логічне “І” регістра з константою
| Rd ← Rd AND K
| Z, N, V
|
| OR
| Rd, Rr
| Логічне “АБО” двох регістрів
| Rd ← Rd OR Rr
| Z, N, V
|
| ORI
| Rd, K
| Логічне “АБО” регістра з константою
| Rd ← Rd OR K
| Z, N, V
|
| EOR
| Rd, Rr
| Виключаюче “АБО” двох регістрів
| Rd ← Rd XOR Rr
| Z, N, V
|
| COM
| Rd
| Доповнення до 1 (зворотній код)
| Rd ← $FF - Rd
| Z, C, N, V
|
| NEG
| Rd
| Доповнення до 2 (додатковий код)
| Rd ← $00 - Rd
| Z,C,N,V,H
|
| SBR
| Rd, K
| Установка біта(-ів) в регістрі
| Rd ← Rd OR K
| Z, N, V
|
| CBR
| Rd, K
| Скидання біта(-ів) в регістрі
| Rd ← Rd AND (FFh - K)
| Z, N, V
|
| INC
| Rd
| Збільшити на 1
| Rd ← Rd + 1
| Z, N, V
|
| DEC
| Rd
| Зменшити на 1
| Rd ← Rd – 1
| Z, N, V
|
| TST
| Rd
| Перевірити на 0 або мінус
| Rd ← Rd AND Rd
| Z, N, V
|
| CLR
| Rd
| Очистити регістр (всі біти обнуляються)
| Rd ← Rd XOR Rd
| Z, N, V
|
| SER
| Rd
| Установити регістр (всі біти установлюються в 1)
| Rd ← $FF
| Не змінює
|
| КОМАНДИ РОЗГАЛУДЖЕННЯ
| RJMP
| k
| Відносний перехід
| PC ← PC+k+1
| Не змінює
|
| RCALL
| k
| Відносний виклик підпрограми
| PC ← PC+k+1
| Не змінює
|
| RET
|
| Вихід із підпрограми
| PC ← STACK
| Не змінює
|
| RETI
|
| Вихід із переривання
| PC ← STACK
| I
|
| CPSE
| Rd, Rr
| Зрівняти, якщо рівні, пропуск наступної команди
| if(Rd=Rr) PC←PC+2 або 3
| Не змінює
| 1/2
| 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
|
| SBRC
| Rr, b
| Якщо біт в регістрі скинутий, пропуск наступної команди
| if(Rr(b)=0) PC←PC+2 або 3
| Не змінює
| 1/2
| SBRS
| Rr, b
| Якщо біт в регістрі встановлений, пропуск наступної команди
| if(Rr(b)=1) PC←PC+2 або 3
| Не змінює
| 1/2
| SBIC
| P, b
| Якщо біт в регістрі вводу-виводу скинутий, пропуск наступної команди
| if(P(b)=0) PC←PC+2 або 3
| Не змінює
| 1/2
| SBIS
| P, b
| Якщо біт в регістрі вводу-виводу встановлений, пропуск наступної команди
| if(P(b)=1) PC←PC+2 або 3
| Не змінює
| 1/2
| BRBS
| s, k
| Перехід на мітку якщо встановлений прапорець s
| if(SREG(s)=1) PC←PC+k+1
| Не змінює
| 1/2
| BRBC
| s, k
| Перехід на мітку якщо скинутий прапорець s
| if(SREG(s)=0) PC←PC+k+1
| Не змінює
| 1/2
| BREQ
| k
| Перехід на мітку якщо рівно
| if(Z=1) PC←PC+k+1
| Не змінює
| 1/2
| BRNE
| k
| Перехід на мітку якщо не рівно
| if(Z=0) PC←PC+k+1
| Не змінює
| 1/2
| BRCS
| k
| Перехід на мітку якщо встановлений перенос
| if(C=1) PC←PC+k+1
| Не змінює
| 1/2
| BRCC
| k
| Перехід на мітку якщо скинутий перенос
| if(C=0) PC←PC+k+1
| Не змінює
| 1/2
| BRSH
| k
| Перехід на мітку якщо рівно або більше
| if(C=0) PC←PC+k+1
| Не змінює
| 1/2
| BRLO
| k
| Перехід на мітку якщо менше
| if(C=1) PC←PC+k+1
| Не змінює
| 1/2
| BRMI
| k
| Перехід на мітку якщо мінус
| if(N=1) PC←PC+k+1
| Не змінює
| 1/2
| BRPL
| k
| Перехід на мітку якщо плюс
| if(N=0) PC←PC+k+1
| Не змінює
| 1/2
| BRGE
| k
| Перехід на мітку якщо рівно або більше, зі знаком
| if(N XOR V=0) PC←PC+k+1
| Не змінює
| 1/2
| BRLT
| k
| Перехід на мітку якщо менше нуля, зі знаком
| if(N XOR V=1) PC←PC+k+1
| Не змінює
| 1/2
| BRHS
| k
| Перехід на мітку якщо встановлений прапорець H
| if(H=1) PC←PC+k+1
| Не змінює
| 1/2
| BRHC
| k
| Перехід на мітку якщо скинутий прапорець H
| if(H=0) PC←PC+k+1
| Не змінює
| 1/2
| BRTS
| k
| Перехід на мітку якщо встановлений прапорець T
| if(H=1) PC←PC+k+1
| Не змінює
| 1/2
| BRTC
| k
| Перехід на мітку якщо скинутий прапорець Т
| if(H=0) PC←PC+k+1
| Не змінює
| 1/2
| BRVS
| k
| Перехід на мітку якщо встановлений прапорець V (переповнення)
| if(H=1) PC←PC+k+1
| Не змінює
| 1/2
| BRVC
| k
| Перехід на мітку якщо скинутий прапорець V
| if(H=0) PC←PC+k+1
| Не змінює
| 1/2
| BRIE
| k
| Перехід на мітку якщо дозволено переривання
| if(I=1) PC←PC+k+1
| Не змінює
| 1/2
| BRID
| k
| Перехід на мітку якщо заборонено переривання
| if(I=1) PC←PC+k+1
| Не змінює
| 1/2
| КОМАНДИ ПЕРЕСИЛКИ
| LD
| Rd, Z
| Загрузити регістр безпосередньо
| Rd ← (Z)
| Не змінює
|
| ST
| Z, Rr
| Записати регістр безпосередньо
| (Z) ← Rr
| Не змінює
|
| MOV
| Rd, Rr
| Пересилка з одного регістра в другий
| Rd ← Rr
| Не змінює
|
| LDI
| Rd, K
| Загрузити константу
| Rd ← K
| Не змінює
|
| IN
| Rd, P
| Ввід із порту
| Rd ← P
| Не змінює
|
| OUT
| P, Rr
| Вивід в порт
| P ← Rr
| Не змінює
|
| КОМАНДИ РОБОТИ З БІТАМИ
| SBI
| P, b
| Установити біт в регістрі вводу-виводу
| I/O (P, b) ← 1
| Не змінює
|
| CBI
| P,b
| Скинути біт в регістрі вводу-виводу
| I/O (P, b) ← 0
| Не змінює
|
| 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
| Зсув вліво через C
| Rd (0) ←C,
Rd (n+1)←Rd (n), C←Rd (7)
| Z, C, N, V
|
| ROR
| Rd
| Зсув вправо через C
| Rd (7) ← C,
Rd (n)←Rd (n+1), C← Rd (0)
| Z, C, N, V
|
| ASR
| Rd
| Арифметичний зсув вправо
| Rd (n) ← Rd (n+1), n = 0..6
| Z, C, N, V
|
| SWAP
| Rd
| Обмін нібблів (тетрадами)
| Rd (3-0)←Rd(7-4),
Rd 7-4) ← Rd(3-0)
| Не змінює
|
| BSET
| s
| Встановити прапорець
| SREG(s) ← 1
| SREG(s)
|
| BCLR
| s
| Скинути прапорець
| SREG(s) ← 0
| SREG(s)
|
| BST
| Rr, b
| Запам’ятати біт в T
| T ← Rr (b)
| T
|
| BLD
| Rd, b
| Прочитати біт із T
| Rd (b) ← T
| Не змінює
|
| SEC
|
| Встановити перенос
| C ← 1
| C
|
| CLC
|
| Скинути перенос
| C ← 0
| C
|
| SEN
|
| Встановити прапорець N
| N ← 1
| N
|
| CLN
|
| Скинути прапорець N
| N ← 0
| N
|
| SEZ
|
| Встановити прапорець Z
| Z ← 1
| Z
|
| CLZ
|
| Скинути прапорець Z
| Z ← 0
| Z
|
| SEI
|
| Дозволити переривання
| I ← 1
| I
|
| CLI
|
| Заборонити переривання
| I ← 0
| I
|
| SES
|
| Встановити прапорець S
| S ← 1
| S
|
| CLS
|
| Скинути прапорець S
| S ← 0
| S
|
| SEV
|
| Встановити прапорець V
| V ← 1
| V
|
| CLV
|
| Скинути прапорець V
| V ← 0
| V
|
| SET
|
| Встановити прапорець T
| T ← 1
| T
|
| CLT
|
| Скинути прапорець T
| T ← 0
| T
|
| SEH
|
| Встановити прапорець H
| H ← 1
| H
|
| CLH
|
| Скинути прапорець H
| H ← 0
| H
|
| NOP
|
| Немає операції
|
| Не змінює
|
| SLEEP
|
| Зупинка (сплячий режим)
|
| Не змінює
|
| WDR
|
| Скидання охоронного таймеру
|
| Не змінює
|
|
Регістри та їх операнди:
Rd – регістр призначення (і джерело) в регістровому файлі;
Rr – регістр джерело в регістровому файлі;
K – константа;
k – мітка;
b – біт в регістровому файлі або біт в регістрі вводу-виводу;
s – біт в регістрі статусу;
X, Y, Z – регістри непрямої адресації (X=R27:R26, Y=R29:R28, Z=R31:R30);
Р – адрес порту вводу-виводу;
Арифметичні і логічні команди
Позначення прапорців, які будуть використовуватись:
Û
| Прапорець, на який впливає команда
| 0:
| Очищений командою прапорець
| 1:
| Встановлений командою прапорець
| -:
| Прапорець, на який не впливає команда
|
Команда ADD - Скласти без переносу
Описання: Сума двох регістрів без добавлення вмісту прапорця переносу (С), розміщення результату в регістрі призначення Rd.
Операція:
(i)
| Rd < Rd + Rr
|
| Синтаксис
| Операнди:
| Лічильник програм:
| (i)
| ADD Rd, Rr
| 0 < Rd < 31, 0 <Rr < 31
| PC < PC + 1
|
Булеві вирази регістра статусу (SREG)
I
| T
| H
| S
| V
| N
| Z
| C
| -
| -
| <=>
| <=>
| <=>
| <=>
| <=>
| <=>
| Приклад:
.device AT90S1200
.include "1200def.inc"
ser r16;всі біти регістра R16 встановлюються в одиницю
out ddrb,r16;налаштування порту В на вивід
ldi r17,5; записуємо десяткове число 5 в регістр R17
ldi r18,9; записуємо десяткове число 9 в регістр R18
add r17,r18;додаємо регістри R17 і 18
out portb,r17; вивід значення регістра R17 в порт B
Команда ADC - Скласти з переносом
Описання: Сума двох регістрів і вмісту прапорця переносу (С), розміщення результату в регістрі призначення Rd.
Операція:
(i)
| Rd < Rd + Rr + C
|
| Синтаксис
| Операнди:
| Лічильник програм:
| (i)
| ADC Rd, Rr
| 0 < Rd < 31, 0 < Rr < 31
| PC < PC + 1
|
Булеві вирази регістра статусу (SREG)
I
| T
| H
| S
| V
| N
| Z
| C
| -
| -
| <=>
| <=>
| <=>
| <=>
| <=>
| <=>
| Приклад:
.device AT90S1200
.include "1200def.inc"
ser r16;всі біти регістра R16 встановлюються в одиницю
out ddrb,r16;налаштування порту В на вивід
ldi r17,58; записуємо десяткове число 58 в регістр R17
adc r17,r17;додаємо регістр R17 з самим собою
out portb,r17; вивід значення регістра R17 в порт B
Команда SUB - відняти без переносу
Описання: Віднімання вмісту регістра-джерела Rr із вмісту регістра Rd, розміщення результату в регістрі призначення Rd.
Операція:
(i)
| Rd < Rd – Rr
|
| Синтаксис
| Операнди:
| Лічильник програм:
| (i)
| SUB Rd, Rr
| 16 < Rd < 31, 0 < Rr < 31
| PC < PC + 1
|
Булеві вирази регістра статусу (SREG)
I
| T
| H
| S
| V
| N
| Z
| C
| -
| -
| Û
| Û
| Û
| Û
| Û
| Û
| Приклад:
.device AT90S1200
.include "1200def.inc"
ser r16;всі біти регістра R16 встановлюються в одиницю
out ddrb,r16;налаштування порту В на вивід
ldi r17,10; записуємо десяткове число 10 в регістр R17
ldi r18,9; записуємо десяткове число 9 в регістр R18
sub r17,r18;віднімаємо від регістра R17 регістр 18
out portb,r17; вивід значення регістра R17 в порт B
Команда SUBI - Відняти константу
Описання: Віднімання константи із вмісту регістра, розміщення результату в регістрі призначення Rd.
Операція:
(i)
| Rd < Rd – K
|
| Синтаксис
| Операнди:
| Лічильник програм:
| (i)
| SUBI Rd, K
| 16 < Rd < 31, 0 < K < 255
| PC < PC + 1
|
|