Цель работы: изучение команд загрузки регистров, пересылки между регистрами и команд работы с памятью.
1.Используемые команды:
mov Rd,Rr перенос данных между РОН
ldi Rd,K загрузка константы в РОН
ld Rd,A чтение значения в РОН из памяти данных(SRAM) по адресу, содержащемуся в A
ld Rd,A+ чтение значения в РОН из памяти данных(SRAM) по адресу, содержащемуся в A, с постинкрементом адреса
ld Rd,-A чтение значения в РОН из памяти данных(SRAM) по адресу, содержащемуся в A, с преддекрементом адреса
st A,Rr запись значения в память данных(SRAM) из РОН по адресу, содержащемуся в А
st A+,Rr запись значения в память данных(SRAM) из РОН по адресу, содержащемуся в А, с постинкрементом адреса
st –A,Rr запись значения в память данных(SRAM) из РОН по адресу, содержащемуся в А, с преддекрементом адреса
lrm – загрузка данных из памяти программ в регистр R0 по байтовому адресу, находящемуся в двухбайтовом регистре Z(R30:R31)
in Rr,P загрузка значения РВВ в РОН
out P,Rr вывод значения РОН в РВВ
pop Rd извлечение значения верхушки стека в РОН
Лабораторное задание
На основе пункта 2.3 в лабораторной работе №1, в соответствии с вариантом произвести последовательность действий с помощью AVRstudio:
1)Записать константу K в регистр Rd1
2)Переслать константу K из регистра Rd1 в регистр Rd2
3)Вывести константу K на порт pt1
4)Записать константу K в ячейку памяти данных R с использованием адресации через X,Y или Z
5)Считать из памяти и вывести на порт pt2.
…
Вариант | Адресация | Rd1 | Rd2 | R | K | Pt1 | Pt2 |
X | R16 | R24 | 0xFF | A | C | ||
Y | R17 | R23 | 0xEE | B | C | ||
Z | R18 | R22 | 0xDD | C | B | ||
X | R19 | R21 | 0xCC | D | A | ||
Y | R20 | R20 | 0xBB | A | B | ||
Z | R21 | R19 | 0xAA | B | C | ||
X | R22 | R18 | 0x99 | C | D | ||
Y | R23 | R17 | 0x88 | D | C | ||
Z | R24 | R16 | 0x77 | A | D | ||
X | R16 | R19 | 0x66 | B | A | ||
Y | R17 | R20 | 006A | 0x55 | C | B | |
Z | R18 | R21 | 006B | 0x44 | D | C | |
X | R19 | R22 | 006C | 0x33 | A | B | |
Y | R16 | R19 | 006D | 0x22 | D | A | |
X | R17 | R22 | 006E | 0x11 | A | C |
Обозначения:
Регистр общего назначения(РОН), обозначается Rd (приёмник) или Rr (источник) где d и r номер регистра.
Регистр ввода-вывода(РВВ), обозначается P.
Константа обозначается K.
A – имеется в виду то, что можно использовать любой из двухбайтовых регистров X,Y или Z
X,Y,Z Парные(2-байтовые) регистры используемые для адресации в адресном пространстве микроконтроллера, причём старшим байтом допустим X-регистра, является регистр R31,т.е. если в регистре R31 находится число 0xFF, а в регистре R30 число 0x00, то адрес будет выглядеть как 0xFF00
X-пара регистров R27:R26.
Y-пара регистров R29:R28.
Z-пара регистров R31:R30.
Для того чтобы посмотреть содержимое памяти микроконтроллера, необходимо в верхнем меню нажать на вкладку View и выбрать Memory, послечего в появившемся окне выбрать тип необходимой нам памяти(Program, Eeprom, I/O, Data, или Register)
Где Data и есть память SRAM, и находиться она по адресам от 0x0060 до 0x045F
Лабораторная работа №3
Изучение Арифметических и логических команд микроконтроллеров AVR
Цель работы: изучение команд сложения, вычитания, операций «и, или, не» с регистрами и константами
Краткий обзор
Используемые команды:
add Rd,Rr сложение двух РОН без учёта переноса
adc Rd,Rr сложение двух РОН с учётом переноса
adiw Rd,k сложение регистровой пары с константой
sub Rd,Rr вычитание двух РОН без учёта переноса
sbc Rd,Rr вычитание двух РОН с учётом переноса
sbiw Rd,k вычитание константы из регистровой пары
subi Rd,k вычитание константы из регистра
sbci Rd,k вычитание константы из регистра с учётом переноса
inc Rd увеличение содержимого регистра на единицу
dec Rd уменьшение содержимого регистра на единицу
clr Rd очистка регистра (операция «исключающее или» регистра с самим собой)
ser Rd установка регистра
and Rd,Rr логическое «и»
andi Rd,k логическое «и» с константой
or Rd,Rr логическое «или»
ori Rd,k логическое «или» с константой
eor Rd,Rr логическое исключающее «или»
com Rd побитная инверсия
neg Rd дополнительный код(инверсия знака)
Запустим AVRstudio в режиме эмуляции и попробуем использовать несколько команд из списка, при этом наблюдая за состоянием регистров
Программа:
.include "m16def.inc";подключение библиотеки
.list;включение листинга
.def temp0=r16;определение рабочих регистров
.def temp1=r17
.def temp2=r18
.def temp3=r19
.def temp4=r20
.def temp5=r21
.def temp6=r22
;--------------------------------------------
metka:
ldi temp0,0x00;записываем ноль в регистр temp0
ldi temp0,0xFF;записываем 0xff в регистр temp0
ldi temp1,0x00;записываем ноль в регистр temp1
ldi temp1,0xAA;записываем 0xAA в регистр temp1
ldi temp2,0x00;записываем ноль в регистр temp2
ldi temp2,0xCC;записываем 0xCC в регистр temp2
ldi temp3,0x00;записываем ноль в регистр temp3
mov temp3,temp2;пересылка данных из temp2 d temp3
add temp1,temp2;складываем temp1 и temp2 без учёта переноса
sbc temp0,temp1; вычитаем temp1 из temp0 с учётом переноса
subi temp4,0x11;вычитание константы из регистра temp4
inc temp5; увеличение содержимого регистра на единицу
inc temp5; увеличение содержимого регистра на единицу
inc temp5; увеличение содержимого регистра на единицу
dec temp5; уменьшение содержимого регистра на единицу
dec temp5; уменьшение содержимого регистра на единицу
dec temp5; уменьшение содержимого регистра на единицу
clr temp5;очистка регистра (операция "исключающее или" регистра с самим собой)
or temp0,temp1; логическое "или"
com temp6; побитная инверсия
neg temp6; дополнительный код(инверсия знака)
rjmp metka;переход к метке
Данный проект находится в папке с лабораторной\003lab\003.aps
Лабораторное задание
1)Напишите программы сложения и вычитания двух 8-ми разрядных чисел с записью результата в ячейку памяти
2) Напишите программы сложения двух 16-ти разрядных чисел
3)В соответствии с вариантом сложить содержимое Rd1 и Rd2, вычесть из результата константу K и проверить состояние бита отрицательности, после чего записать результат в ячейку памяти R.
Вариант | R | K | Rd1 | Rd2 |
0xFF | 0x01 | 0x10 | ||
0xEE | 0x02 | 0x20 | ||
0xDD | 0x03 | 0x30 | ||
0xCC | 0x04 | 0x40 | ||
0xBB | 0x05 | 0x50 | ||
0xAA | 0x06 | 0x60 | ||
0x99 | 0x07 | 0x70 | ||
0x88 | 0x08 | 0x80 | ||
0x77 | 0x09 | 0x90 | ||
0x66 | 0x0A | 0xA0 | ||
006A | 0x55 | 0x0B | 0xB0 | |
006B | 0x44 | 0x0C | 0xC0 | |
006C | 0x33 | 0x0D | 0xD0 | |
006D | 0x22 | 0x0E | 0xE0 | |
006E | 0x11 | 0x0F | 0xF0 |
Лабораторная работа №4