Порядок виконання лабораторної роботи
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