- •Додаток 1. Приклади ррозв’язання задач мовою avr Assembler
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
- •Блок-схема
Блок-схема
Підпрограма затримки Delay подібна підпрограмі затримки в 15-му прикладі.
17). Контролер працює в циклічному режимі, видаючи на кожен з 8-ми світлодіодів одиничний імпульс тривалістю 2 секунди. При перериванні він повинний перейти на обслуговування підпрограми, що записана в задачі 1. Після її виконання перейти до основної задачі.
.device at90s1200
.include "1200def.inc"
ser r16 ;усі біти регістра R16 встановлюються в одиницю
out ddrb,r16 ;настроювання порту В на вивід
home:
clr r25 ;очищення регитра R25
out portb,r25 ;вивід значення регістра R25 на порт В
rcall delay ;виклик підпрограми Delay
rcall pp ;виклик підпрограми pp
ldi r25,1 ;присвоїти регістру R25 константу 1
out portb,r25 ;вивід значення регістра R25 на порт У
rcall delay ;виклик підпрограми Delay
rcall pp ;виклик підпрограми pp
mm:
lsl r25 ;логічний зсув вліво всіх бітів регістра R25
out portb,r25 ;вивід значення регістра R25 на порт В
rcall delay ;виклик підпрограми Delay
rcall pp ;виклик підпрограми pp
sbrs r25,7 ;якщо сьомий біт регістра R25 дорівнює 1, то програма
;пропускає наступну команду
rjmp mm ;перехід на мітку mm
rjmp home ;перехід на мітку home (початок програми)
pp:
sbis pind,6 ;якщо шостий біт порту D дорівнює 1, то програма
;пропускає наступну команду
ret ;вихід із підпрограми
in r17,pind ;зчитуємо значення порту D
ldi r18,7 ;записати в регістр R18 число 7
add r17,r18 ;підсумовуємо значення регістрів R17 і R18
out portb,r17 ;результат виводимо на порт D
Delay: ;підпрограма затримки
clr r19 ;очищення регістра R19
clr r21 ;очищення регістра R21
clr r20 ;очищення регістра R20
n1:
inc r19 ;інкремент регістра R19
cpi r19,255 ;порівняння регістра R19 з 255
brne n1 ;якщо R19¹255, то програма переходить на мітку n1
inc r20 ;інкремент регістра R20
cpi r20,255 ;порівняння регістра R20 з 255
brne n1 ;якщо R20¹255, то програма переходить на мітку n1
inc r21 ;інкремент регістра R21
cpi r21,3 ;порівняння регістра R21 з 3
brne n1 ;якщо R21¹3, то програма переходить на мітку n1
ret ;повернення із підпрограми затримки
Блок-схема
Підпрограма pp
П ідпрограма затримки Delay подібна підпрограмі затримки в 15-му прикладі.
18). Реалізувати програми JK-, D-, T-тригерів.
В основній програмі контролер буде реалізовувати роботу Т-тригера. D- і JK-тригери будуть вибиратися сьомим і шостим бітами порту B. Для всіх тригерів прямий вихід – 3-й біт порту D, інверсний вихід – 4-й біт порту D. Для Т-тригера нульовий біт порту D буде Т входом. Для D-тригера нульовий біт порту D – синхровхід, перший біт – вхід D. Для JK-тригера: синхровхід – нульовий біт порту D, вхід J – перший біт і вхід K – другий біт порту D.
.device at90s1200
.include "1200def.inc"
ser r16 ;усі біти регістра R16 встановлюються в одиницю
out ddrb,r16 ;настроювання порту B на вивід
loop:
set ;установка в одиницю біта-акумулятора Т
sbic pind,7 ;якщо сьомий біт порту D дорівнює 0, то програма
;пропускає наступну команду
rjmp home ;перехід на мітку home
sbic pind,6 ;якщо шостий біт порту D дорівнює 0, то програма
;пропускає наступну команду
rjmp main ;перехід на мітку main
;T-Trigger
ldi r18,0b00010000 ;присвоїти регістру R18 константу 000100002
out portb,r18 ;вивід значення регістра R18 на порт B
glav:
sbis pind,0 ;якщо нульовий біт порту D дорівнює 1, то програма
;пропускає наступну команду
rjmp loop ;перехід на мітку loop
ldi r18,0b00001001 ;присвоїти регістру R18 константу 000010012
out portb,r18 ;вивід значення регістра R18 на порт B
rjmp glav ;перехід на мітку glav
;D-Trigger
home:
clr r17 ;очищення регістра R17
sbic pind,0 ;якщо нульовий біт порту D дорівнює 0, то програма
;пропускає наступну команду
bld r17,0 ;завантаження в нульовий біт R17 значення
;біта-акумулятора
sbic pind,1 ;якщо перший біт порту D дорівнює 0, то програма
;пропускає наступну команду
bld r17,1 ;завантаження в перший біт R17 значення
;біта-акумулятора
cpi r17,1 ;порівняння регістра R17 з 1
breq d1 ;якщо R17=1, програма переходить мітку d1
cpi r17,2 ;порівняння регістра R17 з 2
breq d2 ;якщо R17=2, програма переходить мітку d2
cpi r17,3 ;порівняння регістра R17 з 3
breq d3 ; якщо R17=3, програма переходить мітку d3
andi r18,0b00011000 ;побітове виконання операції логічне «І» над
;регістром R18 і ;числом 000110002
out portb,r18 ;вивід значення регістра R18 на порт B
rjmp loop ;перехід на мітку loop
d1:
ldi r18,0b00010001 ;присвоїти регістру R18 константу 000100012
out portb,r18 ;вивід значення регістра R18 на порт B
rjmp loop ;перехід на мітку loop
d2:
bld r18,1 ;завантаження в перший біт R18 значення
;біта-акумулятора
andi r18,0b00011010 ;побітове виконання операції логічне «І» над
;регістром R18 і ;числом 000110102
out portb,r18 ;вивід значення регістра R18 на порт B
rjmp loop ;перехід на мітку loop
d3:
ldi r18,0b00001011 ;присвоїти регістру R18 константу 000010112
out portb,r18 ;вивід значення регістра R18 на порт B
rjmp loop ;перехід на мітку loop
;JK-Trigger
main:
clr r17 ;очищення регістра R17
sbic pind,1 ;якщо перший біт порту D дорівнює 0, то програма
;пропускає наступну команду
bld r17,0 ;завантаження в нульовий біт R17 значення
;біта-акумулятора
sbic pind,2 ;якщо другий біт порту D дорівнює 0, то програма
;пропускає наступну команду
bld r17,1 ;завантаження в перший біт R17 значення
;біта-акумулятора
cpi r17,1 ;порівняння регістра R17 з 1
breq m1 ;якщо R17=1, програма переходить мітку m1
cpi r17,2 ;порівняння регістра R17 з 2
breq m2 ;якщо R17=2, програма переходить мітку m2
cpi r17,3 ;порівняння регістра R17 з 3
breq m3 ;якщо R17=3, програма переходить мітку m3
andi r18,0b00011000 ;побітове виконання операції логічне «І» над
;регістром R18 і ;числом 000110002
sbic pind,0 ;якщо нульовий біт порту D дорівнює 0, то програма
;пропускає наступну команду
bld r18,0 ;завантаження в нульовий біт R18 значення
;біта-акумулятора
out portb,r18 ;вивід значення регістра R18 на порт B
rjmp loop ;перехід на мітку loop
m1:
andi r18,0b00011000 ;побітове виконання операції логічне «І» над
;регістром R18 і числом 000110002
bld r18,1 ;завантаження в перший біт R18 значення
;біта-акумулятора
sbic pind,0 ;якщо нульовий біт порту D дорівнює 0, то програма
;пропускає наступну команду
ldi r18,0b00001011 ;присвоїти регістру R18 константу 000010112
out portb,r18 ;вивід значення регістра R18 на порт B
rjmp loop ;перехід на мітку loop
m2:
andi r18,0b00011000 ;побітове виконання операції логічне «І» над
;регістром R18 і числом 000110002
bld r18,2 ;завантаження в другий біт R18 значення
;біта-акумулятора
sbic pind,0 ;якщо нульовий біт порту D дорівнює 0, то програма
;пропускає наступну команду
ldi r18,0b00010101 ;присвоїти регістру R18 константу 000101012
out portb,r18 ;вивід значення регістра R18 на порт B
rjmp loop ;перехід на мітку loop
m3:
andi r18,0b00011000 ;побітове виконання операції логічне «І» над
;регістром R18 і числом 000110002
bld r18,1 ;завантаження в перший біт R18 значення
;біта-акумулятора
bld r18,2 ;завантаження в другий біт R18 значення
;біта-акумулятора
sbic pind,0 ;якщо нульовий біт порту D дорівнює 0, то програма
;пропускає наступну команду
rcall pp ;виклик підпрограми pp
out portb,r18 ;вивід значення регістра R18 на порт B
rjmp loop ;перехід на мітку loop
pp: ;підпрограма pp
sbrs r18,3 ;якщо третій біт регістра R18 дорівнює 1,то програма
;пропускає наступну команду
rjmp nn ;перехід на мітку nn
ldi r18,0b00010111 ;присвоїти регістру R18 константу 000101112
ret ;вихід із підпрограми рр
nn:
ldi r18,0b00001111 ;присвоїти регістру R18 константу 000011112
ret ;вихід із підпрограми nn
Блок-схема
19). Написати програму, що реалізує роботу кільцевого лічильника з однобітним записаним словом.
.device at90s1200
.include "1200def.inc"
ser r16 ;усі біти регістра R16 встановлюються в одиницю
out ddrb,r16 ;настроювання порту В на вивід
clr r17 ;очищення регістра R17
out portb,r17 ;вивід значення регістра R17 на порт В
rcall delay ;виклик підпрограми затримки Delay
loop:
ldi r17,1 ;присвоїти регістру R17 константу 1
out portb,r17 ;вивід значення регістра R17 на порт В
rcall delay ;виклик підпрограми затримки Delay
main:
lsl r17 ;логічний зсув всіх бітів регістра R17 вліво
out portb,r17 ;вивід значення регістра R17 на порт В
rcall delay ;виклик підпрограми затримки Delay
sbrs r17,7 ;якщо сьомий біт регістра R17 дорівнює 1,то програма
;пропускає наступну команду
rjmp main ;перехід на мітку main
rjmp loop ;перехід на мітку loop (початок програми)
delay: ;підпрограма затримки
clr r19 ;очищення регістра R19
clr r21 ;очищення регістра R21
clr r20 ;очищення регістра R20
n1:
inc r19 ;інкремент регістра R19
cpi r19,255 ;порівняння регістра R19 з 255
brne n1 ;якщо R19¹255, то програма переходить на мітку n1
inc r20 ;інкремент регістра R20
cpi r20,255 ;порівняння регістра R20 з 255
brne n1 ;якщо R20¹255, то програма переходить на мітку n1
inc r21 ;інкремент регістра R21
cpi r21,5 ;порівняння регістра R21 з 5
brne n1 ;якщо R21¹5, то програма переходить на мітку n1
ret ;вихід із підпрограми затримки