- •Отладочная платформа Arduino Mega2560 Общие сведения
- •Краткие характеристики
- •Работа со средой разработки avrStudio
- •Интерфейс avrStudio
- •Создание нового проекта
- •Построение и отладка проекта
- •Работа со средой моделированияIsisProteus
- •Загрузка программы в микроконтроллер
- •Лабораторные работы Лабораторная работа №1. Алгоритмы арифметической обработки данных
- •Краткие теоретические сведения
- •Задание на лабораторную работу
- •Примерырешения задач
- •Лабораторная работа №2. Алгоритмы логическойобработки данных
- •Краткие теоретические сведения
- •Задание на лабораторную работу
- •Примерырешения задач
- •Лабораторная работа №3.Организация ввода/вывода информации. Механизм прерываний
- •Краткие теоретические сведения
- •Задание на лабораторную работу
- •Примерырешения задач
- •Лабораторная работа №4. Алгоритмы программного управления. Временные задержки. Таймеры/счётчики
- •Краткие теоретические сведения
- •Список литературы
- •Заочное Введение
- •Задание
Задание на лабораторную работу
Задача 2.1.Написать программу, которая позволяет установить, сбросить, инвертироватьiиjбиты заданного операнда, находящегося в регистре R. Результат представить в виде таблицы. Программы проверить для операндов: FF16,F016, 0F16, 0016.
Примечание: Номера регистров R, R1, R2 и число ** назначаются преподавателем. Номера разрядов i, j, k, l участвующих в операциях, вычисляются как остаток от деления на 8 числа **. Остаток от деления ## = i, ## + 2 = j, ##+4, ##+6 соответственно.
Задача 2.2.Написать программу, обеспечивающую проверкуi-го бита заданного операнда, хранящегося в регистре R. Если он равен 0, поместить в ячейку памяти данных 0x0200, 16-ричный эквивалент своего номера варианта в подгруппе. Если “1”, то поместить шестнадцатеричный эквивалент своего номера варианта в подгруппе с инвертированными чётными битами. Программу проверить для следующих операндов: FF16,F016, 0F16, 0016.
Задача 2.3.Написать программу, обеспечивающую выполнение логической операции:
y=xi*xj+xk*NOT(xl),
где i,j,k,l– номера битов числа, содержащегося в регистре R. Результат поместить в память данных по адресу 0x02**. Программу проверить для операндов: 1F16, 2B16, 0C16, A116.
Задача 2.4. Написать программу, обеспечивающую вычисление суммы единиц в массиве чисел, расположенного в памяти программ. Результат поместить в регистры Ri,Rj. Количество элементов в массиве – 1010. Программу протестировать на случайных числах.
Задача 2.5.Написать программы умножения (деления) операнда на 4 с учётом знака числа. Адрес операнда и результата в памяти данных 0x02** и 0x03** соответственно. При делении остаток не сохранять. Программу проверить для операндов F016и 0F16.
Примерырешения задач
Задача 2.1.Написать программу, которая позволяет установить, сбросить, инвертировать 1 и 3 биты операндов FF16, F016, 0F16, 0016.
Маски для установки, сброса и инвертирования соответственно будут: 0b00001010; 0b11110101; 0b00001010.
.include"m2560def.inc"
init: ldi r16, 0xFF; в r16 помещается заданный операнд
mov r17, r16
mov r18, r16
ldi r19, 0b00001010
main: or r16, r19 ; логическое ИЛИ операнда и маски
eor r18, r19 ; Исключающее ИЛИ операнда и маски
com r19 ; инверсия маски
and r17, r19 ; логическое И операнда и маски
Операнд |
Результат | ||
Bi,j=1 |
Bi,j=0 |
Bi,j=NOT(Bi,j) | |
FF |
FF |
F5 |
F5 |
F0 |
FA |
F0 |
FA |
0F |
0F |
05 |
05 |
00 |
0A |
00 |
0A |
Задача 2.2.Написать программу, обеспечивающую проверкуi-го бита заданного операнда, хранящегося в регистре R16. Если он равен 0, записать в ячейку памяти данных 0x0200, 16-ричный эквивалент своего номера варианта в подгруппе. Если “1”, то записать шестнадцатеричный эквивалент своего номера варианта в подгруппе с инвертированными чётными битами. Программу проверим для операнда FF16.
.include"m2560def.inc"
init:ldir16, 0xFF
ldir17, 0b00001000 ; маска для 3 бита
ldir18, 0x05 ; пусть задан 5 вариант
ldir19, 0b00001000 ; для проверки на 1 третьего бита
main: and r16, r17
cp r16, r19
brne equal
ldi r20, 0b01010101
equal: eor r18, r20
sts0x0200,r18
Задача 2.3.Написать программу, обеспечивающую выполнение логической операцииy=x1*x2+x4*NOT(x6) битов числа, содержащегося в регистре R16. Программу проверить для операнда:BB16.
.include"m2560def.inc"
main: ;x1*x2+x4*not(x6)
breqmain; программа зацикливается при установленном флагеZ
ldir16, 0b10111011 ;0xBB
andir16, 0b00000110 ;проверка 1 и 2 бита
breqpart2 ;переход если флагZ=1
ldi r16, 0b10111011
andi r16, 0b00000100 ;проверка 2 бита
brnemain; переход если флагZ=0
part2:
ldi r16, 0b10111011
andi r16, 0b00010000 ;проверка 4 бита
breq main
ldi r16, 0b10111011
ldi r17, 0b01000000
eor r16, r17 ; инверсия 6 бита
andi r16, 0b01000000 ; проверка 6 бита
rjmp main
Результат работы программы отображает флаг Z. Если при возврате в начало подпрограммыmainфлагZ=1, то функцияyбудет равна 0. Если флагZсброшен –y=1.
Задача 2.4.Составим программу подсчёта числа единиц в слове, расположенном в памяти программ. Результат из регистраR0 сохраним в памяти данных 020016.
Организуем циклический алгоритм, на каждом шаге которого операнд сдвигается влево с добавлением нуля в младший бит. Затем анализируется флаг переноса C, и если он установлен в единицу, увеличиваем содержимое регистраR1. Операнд из массива чисел предварительно определим черезarray: .db.
Программа подсчёта числа единиц имеет вид:
.include "m2560def.inc"
.def temp_reg=r0
.def rezult=r1
.cseg
array: .db 0x0F
init: ldi zl, LOW(array)
ldi zh, HIGH(array)
clr rezult ; rezult = 0
lpmtemp_reg,z+ ; взять из памяти программ число
main:lsltemp_reg; сдвиг влево, добавляя справа 0
brccm1 ; еслиC= 0 переход наm1
increzult; иначеrezult=rezult+ 1
m1:brnemain; конец ?
end:sts0x0200,rezult; сохранить результат в ОЗУ
Проверка программы для операндов FF, 77, 21 приводит соответственно к результату 8, 6, 2.
Задача 2.5.Составим программы, реализующие операции арифметического сдвига влево и вправо над содержимым аккумулятора.
В системе команд AVRимеются команды циклического и арифметического сдвига, с помощью которых реализуется быстрое умножение/деление на два.
Особенность арифметического сдвига состоит в том, что содержимое старшего (знакового) разряда сохраняется неизменным. Такой сдвиг можно реализовать при помощи следующих операций: циклического сдвига влево минуя флаг переноса, и двукратного циклического сдвига вправо через флаг переноса. После второго сдвига в аккумуляторе восстанавливается исходное число, а во флаге переноса помещается его знак. Третий сдвиг формирует число, соответствующее арифметическому сдвигу вправо.
Программа арифметического сдвига вправо имеет вид:
8200 07 RLC; сдвиг влево
8201 1FRAR; сдвиг вправо через С
8202 1FRAR; сдвиг вправо через С.
8203 E7RST4
При арифметическом сдвиге влево все биты смещаются на один разряд влево, а в освободившийся младший разряд записывается 0. В рассматриваемом микропроцессоре такую операцию можно реализовать путём сброса флага переноса и циклического сдвига влево через этот флаг:
8200 07 RLC; флагC=0
8201 1FRAR; сдвиг вправо черезC.
8202 E7RST4
При проверке следующих программ следует учитывать, что арифметический сдвиг вправо осуществляет деление операнда на 2, а арифметический сдвиг влево – умножение на 2. Например, для операнда 24 сдвиг вправо даёт 12, а сдвиг влево - 48.
Написать программы, обеспечивающие умножение (деление) операнда на 4. Адреса операндов 0x0200, 0x0201; адреса результатов – 0x0300, 0x0301. Программу проверить для операндов F016 и 0F16.
.include "m2560def.inc"
/*lds r16, 0x0200
lds r17, 0x0201*/
ldi r16, 0xFF
lslr16 ;умножениеR16 на 2 с сохранением знака
adcr19,r20
lslr19
lslr16 ;умножениеR16 на 2 с сохранением знака
adcr19,r20
/*asrr17 ;делениеR17 на 2 с сохранением знака
asrr17 ;делениеR17 на 2 с сохранением знака
sts0x0300,r16
sts0x0301,r17*/