Схемотехника / Схемотехника(1) / cx lab2
.docМИНИСТЕРСТВО ВЫСШЕГО ОБРАЗОВАНИЯ И НАУКИ РФ
ПЕРМСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСТИТЕТ
Кафедра АТ
Лабораторная работа №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 ; зацикливание программы для исключения зависаний