Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laba15.doc
Скачиваний:
2
Добавлен:
16.11.2018
Размер:
124.93 Кб
Скачать

Порядок виконання лабораторної роботи

1. Ознайомитися з системою команд мікроконтролера ATmega8515 та прикладами реалізації базових програмних завдань за даними підрозділів 15.1 і 15.2.

2. Запустити програму AVR Studio і створити новий проект під назвою Lab15_n, де n –номер бригади.

3. Набрати текст програми 1, в якій програмується перетворення двобайтового двійкового числа num1 у 5-розрядне двійково-десяткове число в ASCII-коді. За основу взяти відпо- відний приклад, розміщений на рис.15.2 і дані з Табл.15.1 в залежності від № підгрупи і № бригади. Врахувати, що: а) число num1 – вхідне число, яке повинне бути перетворено в ASCII-код; б) rBin1H:rBin1L – регістрова пара, призначена для збереження числа num1; в) rBin2H:rBin2L – регістрова пара, призначена для збереження проміжних результатів; г) r ASCII - r ASCII - молодший регістр ASCII-буферу приймача вихідного коду. Наприклад, для бригади №10 такий буфер розташований в регістрах r22, r23, …, r26.

4. Виконати компіляцію програми. Виправити всі виявлені синтаксичні помилки.

5. Перейти в режим відлагодження програми, вибравши пункт меню Debug, Start Debugging. Через пункт меню View активізувати вікна Register, Workspace.

6. Зробити покрокове виконання програми. Прослідкувати за вмістом задіяних у програмі ре- гістрів. Перевірити відповідність отриманих результатів очікуваним прогнозам. Після ви- конання програми зберегти копію екрана комп’ютера з індикацією стану регістрів мікро- контролера.

7. Набрати текст програми 2, в якій програмується перетворення двійково-десяткового числа в ASCII-коді у двобайтове двійкове число. За основу взяти відповідний приклад, розміщений на рис.15.3 і дані з Табл.15.2 в залежності від № підгрупи і № бригади.

8. Повторити кроки 4…6 для другої програми.

9. Зберегти початковий текст програми і її лістинг та робочі записи для оформлення звіту по лабораторній програмі.

Табл. 15.1

Табл. 15.2

Код програми 1

;***************************************************************************** Програма до лаб. роботи №15. ;* Семестр 7, модуль 2, бригада №1 ; мікроконтролер ATmega8515.

Виконали студенти гр. СУ-81 Бережний Ю. В. Самбур М. О. ;*****************************************************************************

.equ RAMEND = $25F

.equ SPL = $3e

.equ SPH = $3d

.DEF rBin1H = r3

.DEF rBin1L = r2

.DEF rBin2H = r4

.DEF rBin2L = r5

.DEF rmp = r16

.DEF ZL = r30

.DEF ZH = r31

Fragment1:

LDI r18, 0x77 ;Вхідне двійкове число

mov r2, r18

LDI r18, 0x9a ;num1=9a77h

mov r3, r18

LDI r19, 'a' ;регістри r19...r23 -

LDI r20, 'b' ; -буфер-приймач

LDI r21, 'c' ; вихідного ASCII-числа

LDI r22, 'd' ; символи 'a'...'e' -

LDI r23, 'e' ; фонові "заповнювачі" буфера

LDI r26, low(RAMEND ) ;ініціалізація стека

out SPL, r26 ;

LDI r25, high(RAMEND );

out SPH, r26 ;

LDI r30, 19 ;налаштування Z-регістра на

LDI r31, 0 ;регістри вихідного ASCII-числа

rcall Bin2ToAsc

L2: rjmp L2

;=================================================================

; підпрограма Bin2ToAsc перетворення двобайтового двійкового числа

; у 5-розрядне двійково-десяткове число в ASCII-коді

; Вхід: 16-бітове двійкове число в р-рах rBin1H(ст.байт):rBin1L(мол.байт)

; Z вказує на регістр старшої цифри результату (не менше 5 регістрів!)

; Вихід: результат перетворення в ASCII-коді в регістрах, на які вказує Z,

; регістр rBin2L містить розрядність вихідного числа (1...5)

; Використані регістри: rBin1H: rBin1L (не змінюються), rBin2H(змінюється)

; rBin2L (результат, розмір числа), rmp

; Використовує підпрограму: Bin2ToBcd5, Bin2ToAsc5

;=================================================================

Bin2ToAsc:

rcall Bin2ToAsc5 ; перетворення числа в ASCII-код

ldi rmp,6 ; ініціалізація лічильника 6 32 mov rBin2L,rmp

Bin2ToAsca:

dec rBin2L ; декремент лічильника

ld rmp,z+ ; читання чергової цифри і інкремент вказівника

cpi rmp,' ' ; це пробіл?

breq Bin2ToAsca ;якщо так - перехід

sbiw ZL,1 ; на один символ назад

ret ;

; ================================================================

; підпрограма Bin2ToAsc5 перетворення двобайтового двійкового числа

; у 5-розрядне двійково-десяткове число в ASCII-коді

;Вхід:16-бітове двійкове число в регістрах r2Bin1H(ст. байт):r2Bin1L(молодш. байт)

; Z вказує на регістр старшої цифри результату (не менше 5 регістрів!)

; Вихід: результат перетворення в ASCII-коді в регістрах, на які вказує Z,

; нулі, які передують числу, заміняються пробілами

; Використані регістри: rBin1H: rBin1L (вміст не змінюється),

; rBin2H:rBin2L (вміст змінюється), rmp.

; Використовує підпрограму: Bin2ToBcd5

;================================================================

Bin2ToAsc5:

rcall Bin2ToBcd5 ; перетворення двійкового числа в BCD-кодоване

ldi rmp,4 ; лічильник 4-х старших цифр

mov rBin2L, rmp

Bin2ToAsc5a:

ld rmp,z ; читати BCD-кодовану цифру

tst rmp ; це нуль, який передує числу?

brne Bin2ToAsc5b ; ні, поточна цифра >0 ?

ldi rmp,' ' ; переписати її пробілом

st z+,rmp ; зберегти цифру і встановити вказівник на наступну цифру

dec rBin2L ; декремент лічильника

brne Bin2ToAsc5a ; подальші пробіли

ld rmp,z ; читання останньої BCD-кодованої цифри

Bin2ToAsc5b:

inc rBin2L ; наступна цифра

Bin2ToAsc5c:

subi rmp,-'0' ; обчислення ASCII-коду цифри

st z+,rmp ; збереження і інкремент вказівника

ld rmp,z ; читання наступної цифри

dec rBin2L ; ще є цифри?

brne Bin2ToAsc5c ; так, продовжувати роботу

sbiw ZL,5 ; ні - завершити встановленням Z на BCD-число

ret

; ==================================================================

; підпрограма Bin2ToBcd5 перетворення двобайтового двійкового числа

; у 5-розрядне двійково-десяткове число в BCD-коді.

; Вхід: 16-бітове двійкове число в регістрах rBin1H(старш. байт):rBin1L(мол. байт)

; Z вказує на регістр старшої цифри результату.

; Вихід: результат перетворення в BCD-коді в регістрах, на які вказує Z

; Використані регістри: rBin1H: rBin1L (не змінюються), rmp

; rBin2H:rBin2L(змінюються).

; Використовує підпрограму: Bin2ToDigit

; ==================================================================

Bin2ToBcd5:

push rBin1H ; Збереження числа

push rBin1L

ldi rmp,HIGH(10000) ; Завантаження 10^4=10000 = 0x2710

mov rBin2H,rmp ; через rmp=r16: безпосередньо

ldi rmp,LOW(10000) ; в 16 мол. регістрів це заборонено !!

mov rBin2L,rmp

rcall Bin2ToDigit ; занести в буфер-приймач? цифру тисяч

ldi rmp,HIGH(1000) ; те ж саме з 10^3=1000 = 0x03Е8

mov rBin2H,rmp

ldi rmp,LOW(1000)

mov rBin2L,rmp

rcall Bin2ToDigit ; занести в буфер-приймач цифру сотень

ldi rmp,HIGH(100) ; те ж саме з 10^2=100 = 0x0064

mov rBin2H,rmp

ldi rmp,LOW(100)

mov rBin2L,rmp

rcall Bin2ToDigit ; занести в буфер-приймач цифру десятків

ldi rmp,HIGH(10) ; те ж саме з 10^1=10 = 0x000А

mov rBin2H,rmp

ldi rmp,LOW(10)

mov rBin2L,rmp

rcall Bin2ToDigit ; отримати цифру у розряді одиниць

st z,rBin1L ; залишок - це число одиниць

sbiw ZL,4 ; налаштування вказівника на першу BCD-цифру

pop rBin1L ; відновити число

pop rBin1H

ret

;

; ==================================================================

; Підпрограма Bin2ToDigit перетворення 16-бітового двійкового числа

; у однорозрядне двійково-десяткове число в ASCII-коді

; Вхід: 16-бітове двійкове десяткове число в регістрах rBin1H(старший байт)

; r1Bin1L(молодший байт); rBin2H: r1Bin2L – число 10^n

; Z вказує на регістр регістр старшої цифри результату (не менше 5 регістрів!)

; Вихід: результат перетворення в ASCII-коді в регістрах, на які вказує Z

; регістр rBin2L містить розмір вихідного числа (1...5)

; Використані регістри: rBin1H: rBin1L, rBin2H(змінюється)

;; rBin2L (результат, розмір числа), rmp

; Використовує підпрограми: ні

; ==================================================================

Bin2ToDigit:

clr rmp ; обнулення лічильника кількості віднімань

Bin2ToDigita:

cp rBin1H,rBin2H ; Число більше, ніж ступінь 10^n?

brcs Bin2ToDigitc ; СЗБ менший, ніж 10^n

brne Bin2ToDigitb ; СЗБ більший, ніж 10^n

cp rBin1L,rBin2L ; МЗБ більший, або дорівнює 10^n

brcs Bin2ToDigitc ; МЗБ менший, ніж 10^n

Bin2ToDigitb:

sub rBin1L,rBin2L ; віднімання МЗБ 10^n

sbc rBin1H,rBin2H ; віднімання СЗБ 10^n

inc rmp ; інкремент лічильника віднімань

rjmp Bin2ToDigita ; На повторний цикл

Bin2ToDigitc:

st z+,rmp ; Збереження цифри і інкремент вказівника

ret

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]