МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Лабораторна робота № 3
на тему:
«Робота з переферією LED-індикатора»
«Робота з панеллю кнопок»
Мета роботи: ознайомитися із командами мови програмування Assembler та принципами керування мікроконтролерами.
Основні теоретичні відомості
Асемблер (assembler) — система програмування, яка включає мову асемблера та транслятор з цієї мови. Є мовою програмування низького рівня. Чим нижчий рівень мови програмування, тим ближча специфіка роботи програми до самого процесора, для якого вона й була написана. Вважається, що мови низького рівня складніші й потребують більш вузької спеціалізації програміста, оскільки програма написана на асемблері для одного типу процесорів виявиться не завжди придатною для роботи з іншими процесорами. З іншого боку програми написані на асемблері компактні та швидкі.
Асемблер підтримує безліч директив. Директиви не транслюються безпосередньо в коди операції. Навпаки, вони використовуються, щоб коригувати місце розташування програми в пам'яті, визначати макрокоманди, ініцілізувати пам'ять і так далі. Тобто це вказівки самому ассемблеру, а не команди мікроконтролера.
Всі директиви асемблера наведені в табл. 1.2.
Таблиця 1.2.
Директиви асемблера
Директива
Опис
BYTE
Зарезервувати байт під змінну
CSEG
Сегмент кодів
DB
Задати постійним (и) байт (и) в пам'яті
DEF
Задати символічне ім'я регістру
DEVICE
Задати для якого типу мікроконтролера компілювати
DSEG
Сегмент даних
DW
Задати постійне (і) слово (а) в пам'яті
EQU
Встановіть символ рівний вираженню
ESEG
Сегмент EEPROM
EXIT
Вихід з файлу
INCLUDE
Включити вихідний код з іншого файлу
LIST
Включити генерацію .lst - файлу
NOLIST
Вимкнути генерацію .lst - файлу
ORG
Початкова адреса програми
SET
Встановіть символ рівний виразу
Синтаксис всіх директив наступний:
. [Директива]
Тобто перед директивою повинна стояти крапка. Інакше асемблер сприймає це як мітку.
Дамо кілька пояснень найбільш важливим директивам асемблера
Код програми:
;-----------------— test program —----------
DSEG ; створюємо сегмент даних
;зарезервуємо в SRAM початкові адреси програми 20H, 30H, 60H
ORG 20H
; ...
ORG 30h;
; ...
ORG 60H
Stack: DS 20H ; встановлюємо стек на адресі 20H
CSEG ; початок сегменту кодів
;декларація адрес
ORG 0000H
jmp start
ORG 0003H
reti
ORG 000BH
reti
ORG 0013H
reti
ORG 001BH
reti
ORG 0023H
reti
ORG 0030H
;----------------------------------------------------
Start:
mov sp, #(stack-1)
mov p0, #11111111B
mov p1, #11111111B
mov p2, #11111111B
mov p3, #11111111B
mov DPTR, #0A006h
mov A, #00000001B
;#####################################
;## Main ##
;#####################################
MAIN:
movx @DPTR, A ; вводимо в регістр DPTR адресу індикації
call knopka1 ; запуск функції для першої кнопки
rl A ; рух світла діодів в ліву сторону
call knopka2 ; запуск функції другої кнопки
jmp m4 ; стрибок до мітки 4
m4:
call Delay ; викликаємо функцію затримки
jmp MAIN ; стрибок до мітки MAIN
;-------------------------------------------------------
; Procedures
;-------------------------------------------------------
knopka1: ; функція натискання кнопки 1
jb p3.2,m1 ; перевірка натискання кнопки 1, якщо кнопка натиснута - перехід до мітки 1
m1:
rr A ; рух світла діодів вправо
knopka2: ; функція натискання кнопки 2
jb p3.3,m3 ; перевірка чи натиснута перша кнопка 2, якщо вірно - перехід на мітку 3
mov r3,#033h ; записуємо в r3 значення 33
m3:
mov r3,#066h ; записуємо в r3 значення 66
Delay: ; функція затримки
push 2 ; вставляємо в стек значення з регістру 2 (поміщається першим)
push 3 ; вставляємо в стек значення з регістру 3 (поміщається першим)
d_m2:
mov r2,#0ffh ; записуємо в r3 значення 0ff
d_m1:
djnz r2,d_m1 ; декремент і перехід, якщо значення рівне 0, містить 2 цикли
djnz r3,d_m2 ; цикл затримки іпульсу за рахунок регістра зсуву
pop 3 ; виймаємо зі стеку значення, і поміщаємо в регістр 3
pop 2 ; виймаємо зі стеку значення, і поміщаємо в регістр 2
ret ; кінець роботи програми
Висновок:На цій лабораторній роботі я досліджував Комутаційний блок типу "ЧАС-ПРСТІР" з двома різними принципами побудови: це з розбиттям вх./вих. трактів на групи та без розбиття їх на групи. Я мав змогу за допомогою програми спостерігати за кожним кроком комутації кодового слова двох різних комутаційних блоків. Порівнюючи їх в роботі та по економічності очевидно, що КБ без розбиття ГТ на групи є дешевшою. Але швидкодія такої схеми повинна бути дуже високою, тому що в ІЗП на протязі одного циклу повинні записатися і зчитатися всі канальні інтервали всіх групових трактів. Щодо КБ з розбиттям ГТ на групи, то вимога до швидкодії таких схем буде в [g] разів менша Проте к-сть АЗП та ІЗП зростає, що призводить до подорожання такого КБ. Тому використання такої схеми буде доцільніше і необхідним при великій к-сті КІ та ГТ!!
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Лабораторна робота № 4
на тему:
«Табулювання функції sin2x»
«Вивід табульованої функції на осцилограф»
Романьчук О.О.
Перевірив
Яремко О.М.
Мета роботи: ознайомитися із командами мови програмування Assembler та принципами керування мікроконтролерами.
Основні теоретичні відомості
Асемблер (assembler) — система програмування, яка включає мову асемблера та транслятор з цієї мови. Є мовою програмування низького рівня. Чим нижчий рівень мови програмування, тим ближча специфіка роботи програми до самого процесора, для якого вона й була написана. Вважається, що мови низького рівня складніші й потребують більш вузької спеціалізації програміста, оскільки програма написана на асемблері для одного типу процесорів виявиться не завжди придатною для роботи з іншими процесорами. З іншого боку програми написані на асемблері компактні та швидкі.
Асемблер підтримує безліч директив. Директиви не транслюються безпосередньо в коди операції. Навпаки, вони використовуються, щоб коригувати місце розташування програми в пам'яті, визначати макрокоманди, ініцілізувати пам'ять і так далі. Тобто це вказівки самому ассемблеру, а не команди мікроконтролера.
Всі директиви асемблера наведені в табл. 1.2.
Таблиця 1.2.
Директиви асемблера
Директива
Опис
BYTE
Зарезервувати байт під змінну
CSEG
Сегмент кодів
DB
Задати постійним (и) байт (и) в пам'яті
DEF
Задати символічне ім'я регістру
DEVICE
Задати для якого типу мікроконтролера компілювати
DSEG
Сегмент даних
DW
Задати постійне (і) слово (а) в пам'яті
EQU
Встановіть символ рівний вираженню
ESEG
Сегмент EEPROM
EXIT
Вихід з файлу
INCLUDE
Включити вихідний код з іншого файлу
LIST
Включити генерацію .lst - файлу
NOLIST
Вимкнути генерацію .lst - файлу
ORG
Початкова адреса програми
SET
Встановіть символ рівний виразу
Синтаксис всіх директив наступний:
. [Директива]
Тобто перед директивою повинна стояти крапка. Інакше асемблер сприймає це як мітку.
Дамо кілька пояснень найбільш важливим директивам асемблера
/
Блок-схема роботи програми
;------------------- test program ------------
DSEG
ORG 20H
; ...
ORG 30h
; ...
ORG 60H
Stack: DS 20H
CSEG
ORG 0000H
jmp start
ORG 0003H
reti
ORG 000BH
reti
ORG 0013H
reti
ORG 001BH
reti
ORG 0023H
reti
ORG 0030H
;----------------------------------------------------
Start:
mov sp, #(stack-1)
mov p0, #11111111B
mov p1, #11111111B
mov p2, #11111111B
mov p3, #11111111B
mov A, #00000001B
mov DPTR, #0f000h
;#####################################
;## Main ##
;#####################################
MAIN:
mov A, #0
m_loop1:
push ACC
call LoadSin
call LoadSinmod
movx @DPTR, A
pop ACC
inc A
cjne A, #128,m_loop1
jmp MAIN
;-------------------------------------------------------
; Procedures
;-------------------------------------------------------
Delay:
push 2
push 3
mov r3,#003h
d_m2:
mov r2,#0ffh
d_m1:
djnz r2,d_m1
djnz r3,d_m2
pop 3
pop 2
ret
;-------------------------------------------------------
;----------------------------------------------------
;функції виводу sin на екран осцилографа
LoadSin:
inc A
movc A,@A+PC
ret
sin:
; тут табульована функція sin2x у форматі «db x»
LoadSinmod:
inc A
movc A,@A+PC
ret
sin:
; тут табульована функція |sinx| у форматі «db x»
end
Висновок: у ході роботи я ознайомився з принципами роботи мікроконтроллера та навчився створювати прості програми його роботи