Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
23
Добавлен:
10.12.2013
Размер:
55.81 Кб
Скачать

МИНИСТЕРСТВО ВЫСШЕГО ОБРАЗОВАНИЯ И НАУКИ РФ

ПЕРМСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСТИТЕТ

Кафедра АТ

Лабораторная работа №2

Выполнили: ст. гр. ЭВТ-04

Проверил: Кузнецов И.И.

Пермь

2007

Методы адресации, команды пересылки данных и команды передачи управления в AVR-микроконтроллерах.

Цель работы: знакомство с интегрированной средой программирования; изучение методов адресации, команд пересылки данных и команд передачи управления.

Задание 1

;**** Инициализация указателя стека ****

ldi R20,$80 ;загрузка промежуточного регистра R20 адресом начала

;стека = $80

out SPL,R20 ;загрузка младшего байта указателя стека

ldi R20,$00 ;загрузка старшего байта указателя стека в R20

out SPH,R20 ;загрузка старшего байта указателя стека

;***** Вып-е команд пересылок *****

ldi R20,$57 ;загрузка регистра R20 константой

ldi R30,$35 ;загрузка рег.Z значением указателя на память данных

ldi R31,$00

st Z, R20 ;загрузка косвено адресуемой ячейки ОЗУ $35 из R20

lds R19,$35 ;загрузка регистра R19 из ячейки $35

sts $18,R19 ;загрузка ячейки $18 из регистра R19

call Rout

loop: rjmp loop ;зацикливание программы

;**** Проц. коп. текста из памяти программ ****

Rout:

push R30 ;сохранение указателя Z в стеке

push R31

ldi R20,$00 ;загрузка регистра R20 новой константой

ldi R30,$40 ;загрузка рег.Z значением указателя на память прог

ldi R31,$00

lpm

cpse R0,R20

sts $18,R0 ;загрузка ячейки $18 из регистра R0

pop R31

pop R30 ;извлечение указателя X их стека

ret

;*************************

Задание 2.

Выбрать числа с максимальным и минимальным значением из массива с начальным адресом $xx. Минимальное и максимальное число записать соответственно в R20, R21, а порядковые номера в R22, R23.

.org 0

rjmp $30

.equ arrlen = 5 ; константа равная длине массива

array: db 12, 43, 0, 23, 15;формируем массив из 5 чисел

endarray:

.org $30

ldi r30, low(array) ;загрузка рег.Z значением указателя на массив

ldi r31, high(array)

ldi r26, $40

ldi r27, 00

ldi r25, low(array)+arrlen+1

copy:

lpm ; копирование массива из памяти программ в память данных

st x+, r0

adiw r30, 1

cpse r25, r30;копируем до тех пор пока не дошли до последнего элемента

rjmp copy

init:

ldi r26, $41

ldi r27, 00

ld r20, X; выгружаем числа в нужные регистры

ld r21, X

mov r22, r26;сохраняем номер элемента массива в нужных регистрах

mov r23, r26

ldi r25, $41+arrlen

compare:

ld r24, X; загружаем следующее число

op20:

cp r24, r20; сравнение двух чисел

brsh op21;перейти если больше или равно

mov r20, r24;переписать числа

mov r22, r26

op21:

cp r24, r21; проверка на минимальное число

brlo comploop

mov r21, r24

mov r23, r26

comploop:

adiw r26, 1; переход на следующее число

cpse r25, r26

rjmp compare

ret

Команды обработки данных в AVR-микроконтроллерах.

Цель работы: изучение команд АЛУ, сдвигов и битов операций, практическое присвоение приемов программирования на ассемблере, изучение директив.

Задание 1

********Определение констант***********

.EQU lniX = $60

.EQU lniY = $70

.EQU lniZ = $80

.EQU NCircle = 16

.ORG 0

rjmp $30

****Инициализация указателей, счетчика циклов и флага управления переносом***

.ORG $30

ldi R26, low(lniX) ;загрузка рег.X значением указателя на память данных

ldi R27, high(lniX)

ldi R28, low(lniY) ;загрузка рег.Y значением указателя на память данных

ldi R29, high(lniY)

ldi R30, low(lniZ) ;загрузка рег.Z значением указателя на память данных

ldi R31, high(lniZ)

ldi R16, Ncircle ;в R16 – счетчик циклов = 2*N чисел

ldi R17, $00 ;в R17 - 0

ldi R18, $01 ;в R18 – 1 мл.бит

******Сложение массивов 16-разрядных чисел*****

LP1:

sbrs R17,0

clc

LP2:

ld R3, X ; загрузка байта 1-го операнда

ld R4, Y+ ; загрузка байта 2-го операнда

add R3, R4 ; сложение байтов операндов

st Z+, R3 ;запись результата в память

eor R17, R18; чередование 0 и 1 в младшем бите R17

dec R16 ; декремент счетчика байтов

brne LP1 ; зацикливание, если счетчик байтов не равен нулю

loop:

rjmp loop ; зацикливание программы для исключения зависаний

Задание 2.

Выполнить попарное сложение 16-разрядных чисел со знаком, содержащихся в двух массивах длиной 10 с адресами $xx, $yy, результат сохранить в массиве с начальным адресом $zz.

********Определение констант***********

.EQU lniX = $60

.EQU lniY = $70

.EQU lniZ = $80

.EQU NCircle = 20

.ORG 0

rjmp $30

****Инициализация указателей, счетчика циклов и флага управления переносом***

.ORG $30

ldi R26, low(lniX) ;загрузка рег.X значением указателя на память данных

ldi R27, high(lniX)

ldi R28, low(lniY) ;загрузка рег.Y значением указателя на память данных

ldi R29, high(lniY)

ldi R30, low(lniZ) ;загрузка рег.Z значением указателя на память данных

ldi R31, high(lniZ)

ldi R16, Ncircle ;в R16 – счетчик циклов = 2*N чисел

ldi R17, $00 ;в R17 - 0

ldi R18, $01 ;в R18 – 1 мл.бит

******Сложение массивов 16-разрядных чисел с учетом знака*****

LP1:

sbrs R17,0

clc

LP2:

ld R3, X ; загрузка байта 1-го операнда

ld R4, Y+ ; загрузка байта 2-го операнда

adc R3, R4 ; сложение байтов операндов с учетом переноса

st Z+, R3 ;запись результата в память

eor R17, R18; чередование 0 и 1 в младшем бите R17

dec R16 ; декремент счетчика байтов

brne LP1 ; зацикливание, если счетчик байтов не равен нулю

loop:

rjmp loop ; зацикливание программы для исключения зависаний

Выполнить попарное вычитание 16-разрядных чисел со знаком, содержащихся в двух массивах длиной 10 с адресами $xx, $yy, результат сохранить в массиве с начальным адресом $zz.

********Определение констант***********

.EQU lniX = $60

.EQU lniY = $70

.EQU lniZ = $80

.EQU NCircle = 20

.ORG 0

rjmp $30

****Инициализация указателей, счетчика циклов и флага управления переносом***

.ORG $30

ldi R26, low(lniX) ;загрузка рег.X значением указателя на память данных

ldi R27, high(lniX)

ldi R28, low(lniY) ;загрузка рег.Y значением указателя на память данных

ldi R29, high(lniY)

ldi R30, low(lniZ) ;загрузка рег.Z значением указателя на память данных

ldi R31, high(lniZ)

ldi R16, Ncircle ;в R16 – счетчик циклов = 2*N чисел

ldi R17, $00 ;в R17 - 0

ldi R18, $01 ;в R18 – 1 мл.бит

******Сложение массивов 16-разрядных чисел с учетом знака*****

LP1:

sbrs R17,0

clc

LP2:

ld R3, X ; загрузка байта 1-го операнда

ld R4, Y+ ; загрузка байта 2-го операнда

sbc R3, R4 ; вычитание байтов операндов с заемом

st Z+, R3 ;запись результата в память

eor R17, R18; чередование 0 и 1 в младшем бите R17

dec R16 ; декремент счетчика байтов

brne LP1 ; зацикливание, если счетчик байтов не равен нулю

loop:

rjmp loop ; зацикливание программы для исключения зависаний

Соседние файлы в папке Схемотехника(1)