Міністерство освіти і науки, молоді та спорту України
Національний університет «Львівська політехніка»
ЗВІТ
про виконання лабораторної роботи №2:
з курсу «Програмування мікроконтролерів СА»
Тема: «Реалізація програмних затримок за допомогою таймерів»
Варіант № 1
Мета роботи:
Зібрати у пакеті симуляції Proteus схему на основі МК ATmega32A та написати програму мовою асемблер для реалізації вказаного алгоритму.
Завдання:
Таблиця 1.
№
п/п
Завдання
Часові інтервали вимірюються за допомогою таймерів, при цьому паралельно виконується робота в основній програмі.
При використанні таймера 2 в асинхронному режимі передбачається, що він тактується від годинникового кварца 32768 Гц.
При переключенні світлодіодів звукова піщалка має видавати звук тривалістю 0,1 сек.(для непарних варіантів) та 0,2 сек. (для парних варіантів).
Таймер
Кноп-ка
Сиг-нал
Світло-діоди
Затримка
Алго-ритм
1
0
PC5
PD2
PORTA
1,15 сек.
8
Таблиця 2. Варіанти алгоритмів роботи для світлодіодів
№
п/п
Опис алгоритму
8
Лінійка з 8-ми одноколірних світлодіодів. При натисканні кнопки світлодіоди починають почергово блимати по одному з обох боків рухаючись назустріч.
P7→P0→P6→P1→ P5→P2→P4→P3
/
Рис.1. Схема підключення в пакеті Proteus
Остаточна версія програми:
.include "m32Adef.inc"
.def _flag = r0 ; 0біт - пауза =0 (пораховано), =1(ще рахує)
; 2біт - тривалість паузи =0(1сек), =1(0.5сек)
.def _count = r21
.def _count2= r22
.def _countA= r23
.def _countBuz = r24
.CSEG
.org $000
jmp RESET ; Reset Handler
.org $014
jmp TIM0_COMP ; Timer0 Compare Handler
.org $028
reti ;Store Program Memory Ready Handler
;підпрограма переривання по співпадінню Таймера 0 ----------------
TIM0_COMP: sbrs _flag, 0 ; якщо відлік дозволений
rjmp Task0end
inc _count ; _count++
cpi _count, 100 ; порівнюємо з числом 20
brne Task0end ; на кінець, якщо не рівне
rjmp ready
ready: clt ; Т=0
bld _flag, 0 ; 0біт=1 (пауза порахована)
clr _count ; _count=0
Task0end:
;----------------------Task3 (звук)--------------------------
sbrs _flag, 4
rjmp Task3end
inc _countBuz
cpi _countBuz, 6
brne Task3end
clt
bld _flag, 4 ;(пораховано)
clr _countBuz ;(обнулення)
cbi PORTD, 2 ;викл. звук
Task3end:
T0end: reti
;------------------------------------------------------------------------------------------
RESET: ldi r16, Low(RAMEND)
out SPL, r16
ldi r16, High(RAMEND)
out SPH, r16
ldi r16, 0x00
ldi r17, 0xFF
out DDRC, r16 ; порт C на вхід
out PORTC, r17
out DDRD, r17 ; порт D на вихід
out PORTD, r16
out DDRA, r17
out PORTA, r16
clr _countA
clr _countBuz
; таймер_0 скид по співпадінню, 25msec, Prescaler=1024, OCR=0xC2
ldi r16, (1<<WGM01)|(1<<CS02)|(1<<CS00)
out TCCR0, r16 ; OCR=0xC2
ldi r16, 0x59
out OCR0, r16 ; OCR=0xC2
ldi r16, (1<<OCIE0)
out TIMSK, r16 ; дозвіл на перер. по співпадінню
; обнулюємо регістри
clr _count
clr _flag
sei ; заг. дозвід на переривання
;---------- Основна програма -------------------------------------------------------
main:
sbic PINC, 5
rjmp end ; а якщо ні -- робимо щось інше
ldi _count2, 0
PUSH _count2
ldi _count2, 8
PUSH _count2
ldi _count2, 16
PUSH _count2
ldi _count2, 4
PUSH _count2
ldi _count2, 32
PUSH _count2
ldi _count2, 2
PUSH _count2
ldi _count2, 64
PUSH _count2
ldi _count2, 1
PUSH _count2
ldi _count2, 128
PUSH _count2
foo:
sbrc _flag, 0 ; якщо пауза відрахована, тоді інверсія робимо роботу
rjmp PC5end ; а якщо ні -- робимо щось інше
set
bld _flag, 0
bld _flag, 4
POP _count2
CPI _count2, 0
breq end
out PORTA, _count2
sbi PORTD, 2
PC5end:
rjmp foo
end:
rjmp main
/
Рис. 2. Результати роботи програми
Висновок:
На даній лабораторній роботі ми навчилися створювати програми мовою асемблер з використанням таймерів та звукових сигналів.