Вы находитесь на странице: 1из 23

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

“МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПРИБОРОСТРОЕНИЯ И ИНФОРМАТИКИ”

Факультет (филиал)_ПР________специальность(направление)_200101___________

Кафедра ПР1 «Приборы и информационно – измерительные системы»___ _____

Дисциплина «Микропроцессорная измерительная техника»___________________

Отчет по домашним работам на тему:


«Написание подпрограмм на языке Assembler для микроконтроллера
ATMega 8515 фирмы Atmel»

Студент: __

М.И.Завьялов подпись, дата


инициалы и фамилия
Группа: ПР1-07-01д шифр: 07023 P

Обозначение домашней работы: ДР-2068752-200101-ПР1-19-10 с

Руководитель проекта: Москаленко О.В.


подпись, дата инициалы и фамилия
МОСКВА 2010 г

2
СОДЕРЖАНИЕ

Введение………………………………………...………………………….……….……..3
Техническое задание…………..………………………………..……..………..….……..4
1 Домашняя работа 1……..…………………………………..……..………..……….…..5
1.1 Перевод чисел…………………………………………………………..….....……….5
1.2 Описание программы ……….……………………………………………....………..6
1.3 Алгоритм программы …..……...…………………...………………………..……….9
2 Домашняя работа 2………..………………………………………………..…..…...…10
2.1 Перевод чисел……………….……………………………………………..…...……10
2.2 Описание программы ……….………………………………………….…..……….11
2.3 Алгоритм программы …..……...…………………...…………………...….……….14
3 Домашняя работа 3………..…………………..……………………………..…..….…15
3.1 Перевод чисел……………….……………………………………………..…...……15
3.2 Описание программы ……….………………………………………….…..……….16
3.3 Алгоритм программы …..……...…………………...…………………...….……….19
Заключение………………………………………………………………………….........20
Список литературы………………………………………………………….…………...21

3
ВВЕДЕНИЕ

Целью данной работы является написание подпрограмм на языке ассемблер


для микроконтроллера ATmega 8515 фирмы Atmel и их отладка с помощью пакета
программ AVR Studio 4.13. Также будут рассмотрены правила перевода чисел из
десятичной (10) системы счисления (СС) в шестнадцатеричную (16) [1].
Микроконтроллер (МК) – это микросхема, состоящая из процессора,
устройства ввода/вывода, оперативного и постоянного запоминающих устройств
(ОЗУ и ПЗУ), а также различных дополнительных устройств. МК ATmega 8515
фирмы Atmel относится к семейству восьмиразрядных RISC МК, построенных на
гарвардской архитектуре. МК построен на базе ядра (центрального процессорного
устройства) AVR [2].

ДР-2068752-200101-ПР1-19-10
Написание подпрограмм на языке Assembler для микроконтроллера
ATmega8515 фирмы Atmel

Изм Лист № докум. Подп. Дата


Студент Завьялов М.И. Лит Лист Листов
Москаленко
Руковод. О.В.
3 21
Консульт. 4
МГУПИ
Н. контр.
Зав. каф. Слепцов В.В.
ПР1-07-01Д
ТЕХНИЧЕСКОЕ ЗАДАНИЕ

Задание на домашнюю работу 1:


а) перевести числа, используемые в подпрограмме, в шестнадцатеричный или
двоичный код;
б) посчитать количество нечетных чисел 12110 ≤ x в массиве из 3210 элементов;
первый элемент массива находится в ячейке памяти с адресом 50410 (адрес
следующего элемента массива меньше на 1); результат вычислений поместить в
ячейку памяти с адресом 45010;

в) составить алгоритм работы программы.


Задание на домашнюю работу 2:
а) перевести числа, используемые в подпрограмме, в шестнадцатеричный или
двоичный код;
б) в массиве из 1910 элементов, первый элемент массива находится в ЯП с
адресом 58410 (адрес следующего на 1 меньше), найти элемент массива, содержащий
min четные данные попадающие в интервал 6210 < x ≤ 15610; результат поместить в
ЯП с адресом 58810;
в) составить алгоритм работы программы.
Задание на домашнюю работу 3:
а) перевести числа, используемые в подпрограмме, в шестнадцатеричный или
двоичный код;
б) в массиве из 29 элементов, первый элемент массива находится в ЯП с
адресом 58010 (адрес следующего - на 1 меньше), найти количество бит, равных лог.
0 в младшей тетраде элементе массива, содержащего min четные данные,
попадающие в интервал 5410 ≤ x < 17210; результат поместить, начиная с ЯП с
адресом 58510;
в) составить алгоритм работы программы.

5
1 ДОМАШНЯЯ РАБОТА 1

Написание подпрограммы с организацией цикла и проверкой данных на


четность/нечетность на языке Assembler микроконтроллера ATMega 8515 фирмы
Atmel.
Посчитать количество нечетных чисел 12110 ≤ x в массиве из 3210 элементов;
первый элемент массива находится в ячейке памяти с адресом 50410 (адрес
следующего элемента массива меньше на 1); результат вычислений поместить в
ячейку памяти с адресом 45010.

1.1 ПЕРЕВОД ЧИСЕЛ

Для того чтобы приступить к написанию подпрограммы необходимо


перевести все числа задания из десятичной СС в шестнадцатеричную. Для перевода
десятичного числа нужно разделить ее на основание СС, остаток деления заменить
на соответствующую букву, если он больше 9. Далее необходимо записать все
остатки, начиная с частного – это и будет переведенное число.

_ 504 16
496 _ 31 16
8 16 1
15
В результате получим: 50410=01F816.

_450 16
448 _ 28 16
2 16 1
12

6
В результате получим: 45010=01C216.

_121 16
112 7
9
В результате получим: 12110=7916.

3210=2016.

1.2 ОПИСАНИЕ ПОДПРОГРАММЫ

По условию задачи нужно посчитать количество элементов массива, которые


больше или равно 12110 и являются нечетными. Это значит, что необходимо
проверить каждый элемент массива на четность/нечетность и сравнить с 12110. Если
он меньше 12110 или является четным, то «отбросить» его. Это можно осуществить с
помощью специального набора команд (сравнение с константой и проверка флага C
и Z). Неподходящие элементы массива при этом будут либо «пропущены» к
последующим командам, либо перемещены в конец программы, либо перемещены в
конец программы. Тогда данные после выполнения соответствующего набора
команд точно подходить под требования. И теперь с ними можно проводить
необходимые преобразования – производить подсчет подходящих элементов.
Чтобы данные (x) были проверены все (с первого до последнего элемента
массива), необходимо организовать цикл. Для этого нужно загрузить адрес первой
ЯП в регистровую пару (РП), задать «счетчик цикла» и уменьшать его на 1 после
прохождения каждого элемента массива. После уменьшения следует проверить, все
ли элементы массива были опрошены [1].

Текст подпрограммы.

7
start: ldi r31,0x01 ;загружаем адрес ЯП в РП Z
ldi r30,0xF8 ;
ldi r25,0x20 ;создаем счетчик цикла, равный количеству
;элементов массива
clr r1 ;обнуляем регистр r1 для подсчета элементов
;массива подходящих по условию
nach: ld r16,Z; ;копируем данные из ЯП, адрес которой
;находится в РП Z в РОН r17
mov r17,r16 ;копируем данные из РОН r16 в РОН r17
andi r17,0b00000001 ;проводом операцию лог. И с константой для
;проверки на четность/нечетность
breq finish ;если флаг z=1 (то есть число в регистре было
;четное), то перейти в конец программы на метку
;finish
cpi r16,0x79 ;сравниваем число в регистре r16 с числом
; 12110
brcs finish ;если флаг c=1 (данные в r16 меньше 12110),
;перейти в конец программы на метку finish,
;так как данные не удовлетворяют заданному
;условию
inc r1 ;"считаем" подходящий элемент массива
;увеличивая r1 на 1
finish: ld r16,z- ;копирование данных в r16, уменьшая РП Z на
;1, в результате чего в РП Z окажется адрес
;предыдущей ЯП
dec r25 ;уменьшаем счетчик на 1
brne nach ; если счетчик не равен 0 (z=0), то вернуться
;в начало цикла
ldi r27,0x01 ;помещаем результат в ЯП с адресом 45010 в РП X
ldi r26,0xC2 ;
8
st X,r1 ;помещаем данные из r1 в ЯП, адрес которой
;находится в РП X
nop ;конец программы
rjmp start ;безусловный переход к метке start

9
1.3 АЛГОРИТМ ПОДПРОГРАММЫ

1
Начало

1
5
Запись адреса Данны Да
1-го элемента е
массива в РП Z четные

2 Нет

Создание
счетчика для 6 Данны Да
цикла е в r16
< 121

2
3 Нет
Запись 7
элемента Увеличение
массива в счетчика
регистр r16 количества
нечетных
чисел <121
4

Копирование 8
данных из r16
в r17 Уменьшить
счетчик цикла
на 1

Нет 9 Счетчи
к
2
цикла
равен 0

Да
10

Запись адреса
ЯП в РП X

11
Копирование
искомых
данных в ЯП

Конец

10
2 ДОМАШНЯЯ РАБОТА 2

Написание подпрограммы с организацией цикла и проверкой данных на


четность/нечетность, поиска max/min на языке Assembler микроконтроллера
ATMega 8515 фирмы Atmel.
В массиве из 1910 элементов, первый элемент массива находится в ЯП с
адресом 58410 (адрес следующего на 1 меньше), найти элемент массива, содержащий
min четные данные попадающие в интервал 6210 < x ≤ 15610; результат поместить в
ЯП с адресом 58810.

2.1 ПЕРЕВОД ЧИСЕЛ

Для перевода десятичного числа нужно разделить ее на основание СС, остаток


деления заменить на соответствующую букву, если он больше 9. Далее необходимо
записать все остатки, начиная с частного – это и будет переведенное число.

_ 584 16
576 _36 16
8 32 2
4
В результате получим: 58410=024816.

_ 588 16
576 _36 16
12 32 2
4
В результате получим: 58810=024C16.

11
_ 156 16
144 9
12
В результате получим: 15610=9C16.

_ 62 16
48 3
14
В результате получим: 6210=3E16.

1910=1316.

2.2 ОПИСАНИЕ ПОДПРОГРАММЫ

По условию задачи нужно поместить минимальный нечетный элемент


массива, попадающий в интервал 6210 < x ≤ 15610, в ЯП с адресом 58410. Это значит,
что необходимо проверить каждый элемент массива на четность/нечетность,
сравнить с 6210 и 15610. Если он меньше 6310 и больше 15610 или является нечетным,
то «отбросить» его. Это можно осуществить с помощью специального набора
команд (сравнение с константой и проверка флагов C и Z). Неподходящие элементы
массива при этом будут либо «пропущены» к последующим командам, либо
перемещены в конец программы. Тогда данные после выполнения
соответствующего набора команд будут точно подходить под требования. И теперь
с ними можно проводить необходимые операции – поместить их в ЯП с адресом
58810.
Чтобы данные (х) были проверены все (с первого до последнего элемента
массива), необходимо организовать цикл. Для этого нужно задать «счетчик цикла» и

12
уменьшать его на 1 после прохождения каждого элемента массива. После
уменьшения следует проверить, все ли элементы массива были опрошены.

Текст подпрограммы.

start: ldi r27,0x02 ;загружаем адрес первого элемента массива в РП X


ldi r26,0x48 ;
ldi r17,0x13 ;записываем количество элементов массива в r17,
;тем самым создавая счетчик цикла
ldi r20,0xFF ;заносим в r20 максимальную константу
nach: ld r28,-x ; копируем в r28 данные
;из ЯП, адрес которой указан в РП X, затем
;уменьшаем РП на единицу, чтобы получить адрес
;следующего элемента массива
ror r28 ;сдвигаем вправо для проверки на четность, отправляя
;интересующий нас бит во флаг «С»
brcs finish ;если флаг «С» равняется 1 (число нечетное), то
;переходим в конец программы
rol r28 ;сдвигаем влево для восстановления данных регистра
cpi r28,0x3F ;сравнить с нижней границей интервала
brcs finish ;если с=1 (т.е. данные были меньше 6310, в
;полуинтервал они не попали), поэтому переходим в
;конец цикла, к метке count
cpi r28,0x9D ;сравнить с верхней границей интервала
brcc finish ;если с=0 (т.е. данные были больше 15710, в
;полуинтервал они не попали), поэтому переходим в
;конец программы
cp r28,r20 ;сравниваем текущий элемент массива с эталоном
brcc finish ;если флаг c=0 (т.е. данные больше или равны эталону,

13
;они не могут быть минимумом), поэтому переходим
в ;конец цикла
mov r20,r28 ;т.к. текущий элемент массива оказался меньше
;эталона, помещаем его на место эталона
finish: dec r17 ;уменьшаем счетчик цикла на 1
brne nach ;если счетчик не равен 0, то нужно вернуться в начало
;цикла, а если равен - в конец программы
ldi r31,0x02 ;помещаем результат в ЯП с адресом 58810 в РП Z
ldi r30,0x4C ;
st Z,r20 ;помещаем данные из r20 в ЯП, адрес которой
;находится в РП Z
nop ;конец программы
rjmp start ;безусловный переход к метке start

14
2.3 АЛГОРИТМ ПОДПРОГРАММЫ
1

Начало

Данны
1 Да 8
ев
Запись адреса 2
r28>15
1-го элемента
массива в РП 7ные
X
Нет

2 Нет Данны
Создание 9
ев
счетчика для 2
r28<r2
цикла 0

Да
3 10
Занесение в Копирование
r20 данных из r28
максимальной в r20
константы

3
4 2
Копирование 11
данных из ЯП
с адресом в РП Уменьшить
X в r28 счетчик цикла
на 1

Сдвигаем
вправо Нет 12 Счетчи
данные к
3
цикла
равен 0

Да
Данны 13
6 Да
е
2
нечетн. Запись адреса
в РП Z

Нет
14
Данны
7 Да Копирование
ев
2 искомых
r28<63
данных в ЯП

Нет

1 Конец

15
3 ДОМАШНЯЯ РАБОТА 3

Написание подпрограммы с организацией вложенного или дополнительного


цикла и проверкой данных на четность/нечетность, поиска max/min на языке
Assembler микроконтроллера ATMega 8515 фирмы Atmel.
В массиве из 29 элементов, первый элемент массива находится в ЯП с адресом
58010 (адрес следующего - на 1 меньше), найти количество бит, равных лог. 0 в
младшей тетраде элементе массива, содержащего min четные данные, попадающие в
интервал 5410 ≤ x < 17210; результат поместить, начиная с ЯП с адресом 58510.

3.1 ПЕРЕВОД ЧИСЕЛ

Для перевода десятичного числа нужно разделить ее на основание СС, остаток


деления заменить на соответствующую букву, если он больше 9. Далее необходимо
записать все остатки, начиная с частного – это и будет переведенное число.

_ 585 16
576 _36 16
9 32 2
4
В результате получим: 58510=024916.

_ 580 16
576 _36 16
4 32 2
4
В результате получим: 58010=024416.

16
_ 172 16
160 10
12
В результате получим: 17210=AC16.

_ 54 16
48 3
6
В результате получим: 5410=3616.

2910=1D16.

3.2 ОПИСАНИЕ ПОДПРОГРАММЫ

По условию задачи нужно найти количество бит, равных лог.0 в младших


тетрадах элементов массива, содержащих четные данные, попадающие в интервал
5410 ≤ x < 17210, в ЯП, начиная с ЯП с адресом 58010. Это значит, что необходимо
проверить каждый элемент массива на четность/нечетность, сравнить с 5410 и 17210.
Если он содержит данные меньше 5410 и больше 17210 или нечетные, то «отбросить»
его. Это можно осуществить с помощью специального набора команд (сравнение с
константой и проверка флага C). Неподходящие элементы массива при этом будут
перемещены в конец программы. Тогда данные после выполнения
соответствующего набора команд будут точно подходить под требования. И теперь
с ними можно проводить необходимые операции – поместить количество бит,
равных лог. 0 в младшей тетраде в ЯП, начиная с ЯП с адресом 58510.
Чтобы данные (х) были проверены все (с первого до последнего элемента
массива), необходимо организовать цикл. Для этого нужно загрузить адрес первой
ЯП в регистровую пару (РП), задать «счетчик цикла». После прохождения каждого

17
элемента массива необходимо уменьшать РП и «счетчик цикла» на 1. После
уменьшения следует проверить, все ли элементы массива были опрошены.

Текст подпрограммы.

start: ldi r27,0x02 ;загружаем адрес первого элемента массива в РП X


ldi r26,0x44 ;
ldi r25,0x1D ;записываем количество элементов массива в r25,
;тем самым создавая счетчик цикла
ldi r20,0xFF ;заносим в r20 максимальную константу
clr r16 ;обнуляем регистр r16 для подсчета элементов
;массива подходящих по условию
nach: ld r24,X ;копируем данные из ЯП, адрес которой
;получился в РП X в РОН r24
ldi r22,0x04 ;создаем счетчик цикла для младшей тетрады
ror r24 ;сдвигаем вправо для проверки на четность, отправляя
;интересующий нас бит во флаг "С"
brcs fin; ;если флаг "С" равняется 1 (число нечетное), то
;переходим в конец программы
rol r24 ;сдвигаем влево для восстановления данных регистра
cpi r24,0x36 ;сравнить с нижней границей интервала
brcs fin ;если с=1 (т.е. данные были меньше 54, в
;полуинтервал они не попали), поэтому переходим в
;конец цикла, к метке fin
cpi r24,0xAC ;сравнить с верхней границей интервала
brcс fin ;если с=o (т.е. данные были больше 172, в
;полуинтервал они не попали), поэтому переходим в
;конец программы
cp r20,r24 ;сравниваем текущий элемент массива с эталоном
brcs fin ;если флаг c=1 (т.е. данные больше эталона,
18
;они не могут быть минимумом), поэтому переходим в
;конец цикла
mov r20,r24 ;т.к. текущий элемент массива оказался меньше
;эталона, помещаем его на место эталона
mov r23,r24 ;копируем данные для сохранения r24
сcp: ror r23 ;сдвигаем вправо элемент массива и помещаем 1 его
; бит во флаг C
brcs fi ;если флаг C=1 (бит элемента был равен 1) то
;переходим к метке fi
inc r16 ;увеличиваем счетчик количества бит на 1
fi: dec r22 ;уменьшаем счетчик цикла на 1
brne ccp ;если счетчик не равен 0 (z=0), то вернуться
;к метке ccp
fin: ld r24,-X ;копирование данных в r24, уменьшает РП X на
;1, в результате чего в РП X окажется адрес
;следующей ЯП
dec r25 ;уменьшаем счетчик на 1
brne nach ;если счетчик не равен 0 (z=0), то вернуться
;в начало цикла
ldi r29,0x02 ;помещаем результат в ЯП с адресом 585 в РП Y
ldi r28,0x49 ;
st Y,r16 ;помещаем данные из r16 в ЯП, адрес которой
;находится в РП Y
nop ;конец программы
rjmp start ;безусловный переход к метке start

19
3.3 АЛГОРИТМ ПОДПРОГРАММЫ
3
1
Начало
16
1 Уменьшение
Запись адреса счетчика для
1-го элемента Да 90 Данные вложенного
массива в РП в цикла r22
2 r24<54
X

2 Счетчик
Нет 17
Создание Нет вл.
счетчика для 4 цикла
цикла r25 1001 Данные равен 0
Да четные
в
2 r24>171 Да
3 18
Заносим 18 Копирование
максимальную данных из X в
константу в r24 уменьшая
Нет
r20 на 1

4 Нет 11
2 Эталон 19
r24<r20
Обнуляем Уменьшить
регистр r16 счетчик цикла
r25 на 1
Да
5 12
5
Копирование
данных из ЯП
с адресом в РП Замена Нет 20 Счетчик
эталона цикла
X в r24 5 равен 0
2 4 четные
6 13
сдвигаем Да
Сдвигаем 21
вправо
данные
максимальный
вправо Запись адреса
элемент
в РП Y

14 22
Нет
7 Данные
Да Копирование
нечетн Бит = 0
2 искомых
ые
данных из r16
Да в ЯП
15
Нет
8 Увеличить
Сдвигаем 15 счетчик на 1
Конец
данные r16
влево

3
1
20
ЗАКЛЮЧЕНИЕ

Данная работа позволила получить навыки по написанию программ с


помощью пакета AVR Studio 4.13 для программирования микроконтроллера
ATmega8515 фирмы Atmel, позволила получить навыки составления алгоритмов
программ и перевод чисел из одной системы счисления в другую.

21
СПИСОК ЛИТЕРАТУРЫ

1 Завьялов М.И. Конспект лекций по дисциплине «Микропроцессорная


измерительная техника» - 2010.
2 Угрюмов Е.П. Цифровая схемотехника. – СПб.: БХВ-Петербург, 2001. – 528с.

22
Создание счетчика для вложенного цикла r22 (5-6)

23

Вам также может понравиться