- •Отладочная платформа Arduino Mega2560 Общие сведения
- •Краткие характеристики
- •Работа со средой разработки avrStudio
- •Интерфейс avrStudio
- •Создание нового проекта
- •Построение и отладка проекта
- •Работа со средой моделированияIsisProteus
- •Загрузка программы в микроконтроллер
- •Лабораторные работы Лабораторная работа №1. Алгоритмы арифметической обработки данных
- •Краткие теоретические сведения
- •Задание на лабораторную работу
- •Примерырешения задач
- •Лабораторная работа №2. Алгоритмы логическойобработки данных
- •Краткие теоретические сведения
- •Задание на лабораторную работу
- •Примерырешения задач
- •Лабораторная работа №3.Организация ввода/вывода информации. Механизм прерываний
- •Краткие теоретические сведения
- •Задание на лабораторную работу
- •Примерырешения задач
- •Лабораторная работа №4. Алгоритмы программного управления. Временные задержки. Таймеры/счётчики
- •Краткие теоретические сведения
- •Список литературы
- •Заочное Введение
- •Задание
Задание на лабораторную работу
Задача 1.1.Написать программу сложения (вычитания) двух 8-разрядных двоичных чисел, одно из которых содержится в регистре R, а второе – в ячейке памяти данных с адресом 02**16. Результат поместить в память данных по адресу 0x03**. Программы проверить на примерах: 1) 88**; 2) 00**; 3) FF**.
Задача 1.2.Написать программу сложения (вычитания) двух 16-разрядных двоичных чисел, одно из которых содержится в регистрах R1, R2, а второе – в ячейках памяти данных с адресами 02**16, 02**16 + 1. Результат поместить в ячейки памяти данных с адресами 03**16, 03**16 + 1. Программы проверить на примерах: 1) 8888**АВ; 2) 0000АВ**; 3) FFFFА**В.
Задача 1.3.Написать программу умножения 16-разрядного операнда на 8-разрядный операнд. Адрес операнда – ячейки памяти данных, начиная с адреса 02**16, адрес результата – ячейки памяти данных с адресами, начиная с адреса 03**16. Программы проверить на примерах: 1) 8888 ∙ **; 2) 0000 ∙ **; 3) FFFF ∙ **; 4) А**В ∙ **.
Задача 1.4.Написать программу деления операнда на постоянный коэффициент К. Адрес операнда – память данных 02**16, значение коэффициента К= ** + 5. При делении сохранить остаток.
Задача 1.5.Написать программу сложения (вычитания) двухразрядных двоично-десятичных чисел, одно из которых содержится в регистре R, а второе – в ячейке памяти данных с адресом 02**16. Программы проверить на примерах: 1) 4910**10; 2) 0010**10; 3) 9910**10.
Примечание: |
Имена регистров R, R1, R2 и число ** назначаются преподавателем. |
Указание: |
Операцию деления свести к последовательности сложений и вычитаний. Исследовать возможности сокращения длины и времени выполнения программы. Программы проверить на тестовых примерах. |
Примерырешения задач
Задача 1.1.Составим программы сложения (вычитания) двух 8-разрядных двоичных чисел, одно из которых содержится в регистре R16, а второе – в ячейке памяти данных с адресом 020016. Для операции сложения программа состоит из следующих команд:
.include "m2560def.inc"
ldi r16, 0x25 ; в r16 помещается первый операнд
lds r18, 0x0200 ; в r18 помещается второй операнд
add r18, r16 ; сложение r18=r18+r16
sts 0x0300, r18 ; сохранение результата
Для операции вычитания программа имеет вид:
.include "m2560def.inc"
ldi r16, 0x25 ; в r16 помещается заданный операнд
lds r18, 0x0200 ; в r18 помещается второй операнд
sub r18, r16 ; вычитание r18=r18-r16
sts 0x0300, r18
Результаты выполнения тестовых примеров представим в виде таблицы:
1-й операнд |
2-й операнд |
Сложение |
Вычитание | ||||||||||
Сумма |
C |
N |
V |
S |
Z |
Разность |
C |
N |
V |
S |
Z | ||
88 |
25 |
AD |
0 |
1 |
0 |
1 |
0 |
63 |
0 |
0 |
1 |
1 |
0 |
00 |
25 |
25 |
0 |
0 |
0 |
0 |
0 |
DB |
1 |
1 |
0 |
1 |
0 |
FF |
25 |
24 |
1 |
0 |
0 |
0 |
0 |
DA |
0 |
1 |
0 |
1 |
0 |
Анализ полученных результатов при различных способах интерпретации показывает, что о корректности результата можно судить по значению флага переноса и по знакам операндов.
Задача 1.2.Составим программы сложения (вычитания) 16-разрядных двоичных чисел, одно из которых содержится в регистрах R20, R21, а второе – в ячейках памяти данных с адресами 020016, 020116. Операция сложения таких чисел выполняется в два этапа – сначала складываются младшие байты, а затем старшие (с учётом переноса). Соответствующая программа имеет вид:
.include "m2560def.inc"
ldi r21, 0x88
ldi r20, 0x88
lds r19, 0x0200
lds r18, 0x0201
add r19, r21
adc r18, r20
end:rjmpend; остановка программы
Аналогично выполняется и операция вычитания – сначала обрабатываются младшие байты, а затем – старшие (с учётом заёма):
.include "m2560def.inc"
ldi r21, 0x88
ldi r20, 0x88
lds r19, 0x0200
lds r18, 0x0201
sub r19, r21
sbcr18,r20
end:rjmpend; остановка программы
Результаты выполнения тестовых примеров представим в виде таблицы:
1-й операнд |
2-й операнд |
Сложение |
Вычитание | ||||||||||
Сумма |
C |
N |
V |
S |
Z |
Разность |
C |
N |
V |
S |
Z | ||
8888 |
25AB |
AE33 |
0 |
1 |
0 |
1 |
0 |
62DD |
0 |
0 |
1 |
1 |
0 |
0000 |
AB25 |
AB25 |
0 |
1 |
0 |
1 |
0 |
54DB |
1 |
0 |
0 |
0 |
0 |
FFFF |
A25B |
A25A |
1 |
1 |
0 |
1 |
0 |
5DA4 |
0 |
0 |
0 |
0 |
0 |
Анализ полученных результатов показывает, что сумма и разность вычисляются правильно, однако флаги Z и Nформируются лишь для старшего байта, а не для всего 16-разрядного числа.
Задача 1.3.Составим программу умножения двух восьмиразрядных двоичных чисел, хранящихся в памяти данных с адресами 020016и 020116. 16-разрядное произведение будем формировать в регистровой паре R1-R0. Результат сохраним по адресам 020016(младший байт) и 020116(старший байт).
.include "m2560def.inc"
lds r19, 0x0200
lds r18, 0x0201
mul r18, r19
sts 0x0300, r0
sts 0x0301, r1
end:rjmpend; остановка программы
Проверка программы на тестовых примерах приводит к результату
02 ∙ 25 = 004A; 10 ∙ 25 = 0250; 25 ∙ 25 = 0559,
который подтверждает её корректность.
Задача 1.4.Написать программу деления восьмиразрядных двоичных чисел для следующего распределения регистров:R17 – делимое в начале, остаток в конце, R16 – делитель;R18 – частное.
Алгоритм деления заключается в следующем. Из делимого вычитается делитель, пока делимое не станет меньше делителя. Количество таких вычитаний и будет частным. Для этого используется команда условного ветвления brlo метка, которая анализирует состояние флага переносаCи в зависимости от этого загружает в счётчик команд PC либо адрес метки, либо адрес следующей команды.
Остаток будет в регистре, который вначале хранил делимое. Программа, реализующая описанный алгоритм, имеет вид:
.include"m2560def.inc"
main: cp r17, r16 ; сравнить r16 и r17
brloend; перейти, если С=1
sub r17, r16 ; r16 = r17–r16
incr18; формируем частное
cpr17,r16
brshmain; перейти, если С=0
end:rjmpend; остановка программы
Проверка программы на примерах даёт:
10 : 02=08(00); 40 : 0F=04(04); FF : 0A=19(05).
Анализ полученных результатов показывает, что частное и остаток вычисляются правильно, однако время работы такого алгоритма напрямую зависит от величины делимого, что затрудняет его применение в системах управления реального времени, в которых требуется предсказуемое запаздывание реакции на управляющее воздействие. Свободным от этого недостатка можно назвать алгоритм деления, основанный на сдвиге делимого:
.include "m2560def.inc"
init:
ldi r17,0x08
ldi r18,0x40
ldi r19,0x0F
ldi r25,0x01
m0:
mov r16, r18
rol r16
mov r18, r16
mov r16, r21
rol r16
sub r16, r19
brcc m1
add r16, r19
m1:
mov r21, r16
in r26,SREG
andi r26, 0x01
eor r26,r25
out SREG,r26
mov r16, r20
rol r16
mov r20, r16
dec r17
brne m0
end: rjmp end
Задача 1.2.Составим программы сложения (вычитания) двухразрядных десятичных чисел, хранящихся в регистреR19 и ячейке памяти данных с адресом 020016. Результат поместим в ячейку памяти данных 030016.
Программа двоично-десятичного сложения отличается от ранее рассмотренной программыдвоичного сложения десятичной коррекцией результата.
.include "m2560def.inc"
.def temp =r18
.def six = r19
.def sixteen = r20
summa:
ldi r16, 0b00010010
mov r15, r16
ldi r17, 0b00110011
sts 0x210, r17
lds temp, 0x210
ldi r28, 0b01100110
ldi six, 0b00000110
ldi sixteen, 0b01100000
neg six
neg sixteen
add r15, r28
add r15, temp
brhc correcth
brcc correctc
adc r2,r3
end:rjmp end
correcth:
adc r2, r3
add r15, six
cpse r2,r3
rjmp end
clc
rjmp correctc
correctc:
adc r2,r3
add r15, sixteen
rjmp end
Операция двоично-десятичного вычитания реализуется путём суммирования с дополнительным кодом, который находится по формуле (9910–ПрКод) + 1:
Результат выполнения тестовых примеров представим в виде таблицы:
1-й операнд |
2-й операнд |
Сложение |
Вычитание | ||||||||||
Сумма |
C |
N |
V |
S |
Z |
Разность |
C |
N |
V |
S |
Z | ||
40 |
25 |
65 |
|
|
|
|
|
15 |
|
|
|
|
|
00 |
25 |
25 |
|
|
|
|
|
75 |
|
|
|
|
|
99 |
25 |
24 |
|
|
|
|
|
74 |
|
|
|
|
|
Анализ полученных результатов подтверждает корректность программ двоично-десятичного сложения и вычитания, однако признаки результата не полностью соответствуют системе двоично-десятичного кодирования.