2.2 «Күй сандық» бағдарламасын құру
Әр түрлі әуендерді автоматты орындай алатын күй сандық жұмысын
ұйымдастыру. Микроконтроллерде қарапайым дыбыстар шығаруға болады,
ал біз осы дыбыстар арқылы көпке таныс әуендер жасау және бұл әуендер
микроконтроллер жадысында сақталуы қажет болады [7].
Сурет 2.10– Күй сандық
46
Суретте күй сандық бейнеленген. Жалпы алғанда бағдарлама мақсаты
бойынша қалаған әуенді кодтау арқылы күй сандық жұмысын ұйымдастыру.
Тапсырманы толығырақ тоқталатын болсақ, біз жеті түрлі әуен
жазғандықтан, әр әуенді қосып/өшіретін батырма жасау қажет, ал
батырмаларды өшіргенде барлық әуендердің орындалуы тоқталады.
Жоспарланған күй сандық жасау үшін, ең алдымен, жұмыс жасау
принципін және алгоритімін түсіну қажет. Бұл бағдарламада батырмалар
басқару қызметін атқарады. Әуеннің орындалуы бағдарламаның дыбыс
бөлігінде қарастырылады (Rl, VT1, VF1).
Сурет 2.11– Күй сандық бағдарламасының сұлбасы
Бағдарламада орындалатын әуендердің жадыда қалай сақтайтыны
қарастыру қажет. Жадыға ақпаратты сақтау үшін ең алдымен кодтау қажет.
Әуен нотадан тұрады, ал ноталар тоннан (жиілік) және ұзақтықтан тұрады.
Тон (жиілік) кодтау үшін әр нотаны кезегімен қою қажет. Номер қою үшін
төменгі тоннан бастау қажет. Клавиатурада ол солдан оңға қарай
орындалады.
Әр музыкалық қатар октаваларға бөлінеді. Бір октава 12 нотаға
бөлінеді, яғни 7 негізгі және 5 қосымша ноталар. Қазіргі таңда 12 нотаның
дыбысталуы әр түрлі болады. Екі қатар орналасқан кез келген ноталардың
жиіліктері өзгеше болады, ал екі қатар орналасқан октавалардағы ұқсас
ноталар екі есе айырмашылық болады.
Ноталарға жиілікті тағайындау өсу ретімен тағайындалады. Ең
алдымен бірінші октаваның До нотасын қарастырған жөн. Күй сандық үшін
төменгі ноталар аса көп қажет етпейді. Төмендегі суретте бірінші октава
коды көрсетілген, ал келесі октава алдыңғы октаваны коды және жиілігі
бойынша қайталайды. Екінші октаваның До нотасының коды 13 және жиілігі
f
12
=f
0
x2 болса, ал Ре нотасының коды 14 және жиілігі f
13
=f
1
x2.
47
Кесте 2.1– Бірінші октава ноталарын кодтау
Код Нота Жиілік
Код Нота
Жиілік
1
До
fo
7
Фа#
fe-fs/K
2
До#
fi=fo/K
8
Соль
f7=f6/K
3
Ре
f2=fi/K
9
Соль#
f8=f7/K
4
Ре#
f3=VK
10
Ля
fg-fg/K
5
Ми
f4-f3/K
11
Ля#
fio=f9/K
6
Фа
f5=f4/K
12
Си
fn-fio/K
Анықтама ретінде: К=
Музыкалық ұзақтық та бағдарланады. Ұзақтық еркін түрде пайдалана
алу үшін кестеден бейнеленген. Темпке байланысты нотанық нақты
ұзақтығы өзгереді. Әуеннің орындалуын сақтау үшін ұзақтықтар арасындағы
байланысты сақтау керек, сондықтан жеті түлі ұзақтықтарды қарастыру
қажет. 0 ден 6 арасындағы кодтарды ұзақтықтарда пайдаланылады.
Кесте 2.2– Ұзақтықты кодтау
Код
Длительность
Коэффициент деления
0
1(бүтін)
64
1
1/2(жарты)
128
2
1 /4 (төрттен бір)
256
3
1/8 (сегізден бір)
512
4
1 /16 (он алтыдан бір)
1024
5
1/32 (отыз екіден бір
2048
6
1/64 (алпыс төрттен бір) 4096
Сурет 2.12 – Нота кодтарының орналасуы
48
2.1.1 «Күй сандық» құрылғысын бағдарламалау
Бағдарламалау алдында қажетті командалар және операциялар мен
толық таныс болу қажет.
andi
«Және» логикалық белгісін білдіреді.
Мысалы, andi Rd, К,
Мұндағы, Rd — жалпы қызмет регистрі аты, ал К — берілген тұрақты
сан. Бұл команда регистр мен тұрақты сан арасында «Және» логикалық
операциясын орындайды және нәтиже Rd регистріне жазылады. Команда
жазылған тұрақты сан өлшеміне шектеу қояды және өлшемі 0-ден 63-ке
дейін. Екі параметр арқылы ерекшеленеді:
Регистлік жұптағы бірінші регистр аты;
Қосылатын тұрақты.
ср
Екі регистрді салыстыру. Командада екі параметр бар — салыстыруды
қажет ететін регистрлер аты. Регистрде жазылған ақпаратты өзгертпейді
және салыстыру аяқталғаннан кейін SREG регистрдінде ту орнатылады.
rol
Регистрдегі ақпаратты тасымал арқылы солға жылжыту командасы.
Жылжыту операторларының бірі.
.db
Ақпаратқа анықтама беретін деректива. Бұл деректива dw ұқсас және
берілген мәліметке анықтаманы жадыға немесе EEPROM-ға жазады.
Айырмашылығы әр мәліметті жеке байт ретінде анықтама береді. Әр
жазылған айнымалы 255, яғни бір бат арқылы жазуға болатын мах сан.
cli
Үзіліске шектеу қою командасы, яғни sei командасына кері
орындалады.Команда парметрі жоқ және SREG регстрінде I туына сброс
жасайды.
si
Жадыға жанама жазу. Командада үш модификация бар:
st W,Rd st W+,Rd st -W,Rd,
Мұндағы, W – регистр жұптарының бірі (X, Y немесе Z). Rd – жалпы
регистрдің аты. Модификациядан бөлек команда Rd регсистрдегі жазбаны
ОЗУ-дға жазады.
Id
Жадыдан жанама оқу. Жоғарыда айтылған қомандағы кері болып
келеді. Бұл командада үш модификация бар.
Id Rd,W
id Rd,W+ Id Rd,-W
ОЗУ-да орналасқан жазбаны оқиды және бұл жазба регстлік жұп W-да
жазылған.
Brsh
49
Улкен немесе тең шарты бойынша өту. Тасымал ретінде С тудағы
ақпарат алынады.Тасфмал туы 0-ге тең болса, тасымал орын алады.
Sbic
Тексеру-жіберу типтегі оператор. Жалпы жазба түрі: sbic А,п,
Мұндағы,А –енгізі регистрінің номерң; п– разряд номері.
Күй сандық құрылғысын жасау бағдарламасына терең тоқтала кету
үшін бағдарламаның толық листингіне назар аудару қажет.
Листинг 2.2
.include "m128def.inc" ; Басқару командалары
.list
; Листингті қосу
.def temp = R16
; Көмекші регистр
.def temp1 = R17
; Екінші көмекші регистр
.def count = R18
; Есептеу регистрлерді анықтау
.def fnota = R19
; Нотаның жиілігі
.def dnota = R20
; Қазіргі нотаның ұзақтығы
.def loop = R21
; Кідіріс ұяшығы
; Програмалық кодтың басы
.cseg
; Бағдарламалық код сегменті
.org 0
; Адрес 0 қою
start: rjmp init
; Бағдарлама басына өту
reti
; 1 байынша сыртқы үзіліс
reti
; 0 бойынша сыртқы үзіліс
init:
; Стек инициализациясы
ldi
temp, Low(RAMEND) ; Стекте адрес таңдау
out
SPL, temp
; Стек регистріне жазу
; В/В портын инициализациялау
ldi
temp, 0x20 ; РВ портын инициализациялау
out
PORTB, temp
out
DDRB, temp
ldi
temp, 0x7F
; РD портын инициализациялау
out
PORTD, temp
; Компаратор инициялизациясы
ldi
temp, 0x00
out
DDRD, temp
ldi
temp, 0x80
out
ACSR, temp
; Таймер инициализациясы
ldi temp, 0x09
; стс режимін қосу
out
TCCR1B, temp
m1: ldi temp, 0x00
; Дауыс қосу
out
TCCR1A, temp
; Негізгі бағдарлманың басы
50
main:
; Басылған батырманың номерін анықтау
clr
count
; Батырма сұрау батырма 0 жазу
in
temp, PIND ; D портын оқу
m2:
lsr
temp
; Кіріс байтты жылжыту
brcc m3
; Егер байт 0 болса
inc
count
; Счетчик көрсеткішін үлкейту
cpi
count, 7
; Салыстыру (7 салыстыру саны)
brne m2
; Соңы болмаса жалғастыру
rjmp m1
; Батырма басылған
; Әуенді таңдау
m3: mov
YL, count
; Әуеннің басы орналасқан адрес
ldi
ZL, low(tabm*2)
ldi
ZH, high(tabm*2)
rcall addw
lpm XL, Z+
; Кестеден адрестерді алу
lpm XH, Z
; Х-ке орнату
; Әуенді қосу
m4: mov ZH, XH
; Әуен басына Z-ке жазу
mov ZL, XL
m5: in
temp, PIND
; D портын оқу
cpi
temp, 0x7F
; Теңдігін салыстыру
breq m1
; 0-ге тең болса басына өту
lpm temp, Z
; Нота кодтарын тексеру
cpi
temp, 0xFF
; Әуен соңына тексеру
breq m4
; Соңы болса, қайтадан бастау
andi temp, 0x1F
; Кідірістен шығу
mov fnota, temp
; Жиілік регитріне нота жазу
lpm temp, Z+
rol
temp
rol
temp
rol
temp
rol
temp
andi temp, 0x07
; Ұзақтық кодын алу
mov dnota, temp
; Ұяшыққа орнату
rcall nota
rjmp m5
;Қосымша бағдарламалау бөлігі
addw: push YH
lsl YL
ldi YH, 0
add ZL, YL
adc ZH, YH
51
pop
YH
ret
nota: push ZH
push ZL
push YL
push temp
cpi
fnota, 0x00
breq nt1
mov YL, fnota
ldi
ZL, low(tabkd*2)
ldi
ZH, high(tabkd*2)
rcall addw
lpm temp, Z+
lpm temp1, Z
out
OCR1AH, temp1
out
OCR1AL, temp
ldi
temp, 0x40
out
TCCR1A, temp
nt1:
rcall wait
ldi
temp, 0x00
out
TCCR1A, temp
ldi
dnota,0
rcall wait
pop temp
pop YL
pop ZL
pop ZH
ret
wait:
push ZH
push ZL
push YH
push YL
mov YL, dnota
ldi
ZL, low(tabz*2)
ldi
ZH, high(tabz*2)
rcall addw
lpm YL, Z+
lpm YH, Z
clr
ZL
clr
ZH
w1:
ldi
loop,255
w2:
dec loop
brne w2
52
adiw R30, 1
cp
YL, ZL
brne w1
cp
YH, ZH
brne w1
pop YL
pop YH
pop ZL
pop ZH
ret
; Кідіріс кестесі
tabz: .dw 128,256,512,1024,2048,4096,8192
; Бөлу коэф. кестесі
tabkd: .dw 0
.dw 4748,4480,4228,3992,3768,3556,3356,3168,2990,2822,2664,2514
.dw 2374,2240,2114,1996,1884,1778,1678,1584,1495,1411,1332,1257
.dw 1187,1120,1057, 998, 942, 889, 839, 792
; Әуеннің басталуын анықтайды
tabm: .dw mel1*2,mel2*2,mel3*2,mel4*2
.dw
mel5*2,mel6*2,mel7*2
; Әуендер кестесі
; В траве сидел кузнечик
mel1: .db
109,104,109,104,109,108,108, 96,108,104
.db
108,104,108,109,109, 96,109,104,109,104
.db
109,108,108, 96,108,104,108,104,108,141
.db
96,109,111, 79, 79,111,111,112, 80, 80
.db
112,112,112,111,109,108,109,109, 96,109
.db
111, 79, 79,111,111,112, 80, 80,112,112
.db
112,111,109,108,141,128, 96,255
; Песенка крокодила Гены
mel2: .db
109,110,141,102,104,105,102,109,110,141
.db
104,105,107,104,109,110,141,104,105,139
.db
109,110,173, 96,114,115,146,109,110,112
.db
109,114,115,146,107,109,110,114,112,110
.db
146,109,105,136,107,105,134,128,128,102
.db
105,137,136,128,104,107,139,137,128,105
.db
109,141,139,128,110,109,176,128,128,109
.db
112,144,142,128,107,110,142,141,128,105
.db
109,139,128,173,134,128,128,109,112,144
.db
142,128,107,110,142,141,128,105,109,139
.db
128,173,146,128, 96,255
53
; В лесу родилась елочка
mel3: .db
132,141,141,139,141,137,132,132,132,141
.db
141,142,139,176,128,144,134,134,142,142
.db
141,139,137,132,141,141,139,141,169,128
.db
96,255
; Менің Қазақстаным
mel4: .db
140,108,177,140,106,168,106,104,106,172
.db
136,103,165,136,104,168,135,104,170,140
.db
111,173,108,106,109,204, 96,172,140,177
.db
113,111,113,179,145,111,177,141,108,170
.db
136,106,172,108,106,108,111,109,108,106
.db
168,103,104,103,165, 96,128,168,135,104
.db
202,136,103,136,106,204,173,141,108,205
.db
140,106,140,109,207,177,145,111,209,148
.db
116,148,147,177,172,143,111,143,141,172
.db
168,135,101,131,135,165,128,255
; The Godfather Theme
mel5: .db
136,141,144,143,141,144,141,143,141,137
.db
139,200,136,141,144,143,141,144,141,143
.db
141,136,135,198,134,137,140,207,134,137
.db
140,205,129,132,139,137,136,139,137,137
.db
136,136,129,193,141,141,140,203,175,141
.db
137,200,136,139,136,198,134,137,135,200
.db
136,141,144,143,141,144,141,143,141,137
.db
139,200,136,141,144,143,141,144,141,143
.db
141,136,135,198,134,137,140,207,134,137
.db
140,205,129,132,139,137,136,139,137,137
.db
136,136,129,193, 96,255
; Сагындым Алматымды
mel6: .db
133,133,133,138,138,140,205,133,133,133
.db
143,143,141,204,133,133,133,137,137,138
.db
204,133,133,133,141,141,140,202,138,138
.db
138,142,142,143,209,138,138,138,146,146
.db
145,207,146,146,145,143,141,143,204,133
.db
133,133,141,141,140,202,145,111,113,111
.db
141,143,141,204,133,133,133,141,141,140
.db
202,145,111,113,111,141,143,141,204,133
.db
133,133,141,141,140,202, 96,255
; День Победы
54
mel7: .db
133,101,133,133,128,133,133,138,101,138
.db
101,170,133,131,129,129,129,133,138,141
.db
140,138,204,160,133,101,133,133,128,133
.db
133,140,101,140,101,172,133,134,133,101
.db
133,137,140,143,141,140,205,140,109,140
.db
108,172,202,140,106,137,138,204,172,170
.db
170,201,137,138,140,143,141,140,202,170
.db
168,200,198,134,136,138,106,136,134,170
.db
165,135,103,135,167,128,137,105,137,169
.db
128,138,106,204,202,255
Бағдарламаның 3-10 жолдарында – айнымалылар бейнеленген, яғни
жұмыс регистрлері көрсетілген.
13-31 жолда – үзіліс модульдері анықталған.
32-44 жолда– командалар және олардың нициализациясы.
45-52 жолда– басқару батыралары.
53-72 жолда– бағдарламаның негізгі циклі.
60-72 жолда– әуеннің орындалу циклі.
78-84 жолда– addw подпрограммасының орындалуы.
Жалпы әуеннің бағдарламалануы:
137-140 жолда– барлық ноталарды бөлу кестесі және tabkd меткасы
арқылы белгіленген. Кестенің әр элементі 2 байт ақпараттан тұрады және
бірінші элементі 0-ге тең.
143-200 жолда– әуендердің кестесі көрсетілген,нақтырақ айтқанда, жеті
есте және әр кесте mell, me 12 -me 17 меткалары арқылы белгіленген.
Кестенің әр мәні бір байт ақпарат ретінде жазылады.
Бағдарламаның AVR Studio бағдарламалау ортасында көрсетілуі:
Сурет 2.13 – Бағдарламаның AVR Studio бағдарламалау ортасында көрсетілуі
55
2.1.2 Құрылғының Proteus ортасында орындалуы
Бағдарламалау бөлімінде баяндалған сұлба мен алгоритмді
пайдалана отырып, жасау қажет құрылғыны іс жүзінде бақылау үшін
Proteus бағдарламалау ортасында орындаймыз. Ол үшін ең алдымен
микроконтроллер таңдалынып алынады және тиісіті баптаулар жасау
арқылы және сұлбада көрсетілген өзге элементтерді жалғау арқылы әр
түрлі әуен дыбысын шығара алатын құрылғы жасалады. Төмендегі 2.11
суретте көріп отырғандай, жеті түрлі батырма бар,оған сабеп жеті музыка
орындалады, сәйкесінше әр батырманы басу арқылы таңдалынып алынған
музыканы өшіріп/қосу мүмкіндігі болады.
Сурет 2.14 – Бағдарламаның Proteus-та сұлбасы
Сурет 2.15 – Микроконтроллер баптамалары
56
Орындайтын тапсырмаға байланыста, жұмыс бастамас бұрын,
таңдалынып алынған микроконтролледің баптамаларына өзімізге қажетті
өзгерістер енгізу қажет. Қажетті параметрлерді таңдағаннан кейін жұмысқа
кірісуге болады және сұлба жинаған кезде әрбір элемент астапқы
баптамалырымен тұрғандықтан,өзгертулер енгізуді ұмытпаған дұрыс.
2.13 Суретте пъезодинамик құрылғысының сұлбасы көрсетілген.
Бағдарлама әуен, яғни дыбысқа байланысты болғандықтан негізгі
элементтердің бірі.
Сурет 2.16 – Пъезодинамик құрылғысы
Сурет 2.17 – Пъезодинамик баптамалары
57
2.3 «Әуенді қоңыраулы кодты құлып» құрылғысы
Бұл қойылған тапсырманы шешу үшін 2.2 бөлімде тоқталып өткен күй
сандық бағдарламасына жеке бағдарлама ретінде кодты құлып
бағдарламасын қосу қажет, яғни екі күрделі бағдарламалар қосындысы
арқылы жүзеге асады. Сондықтан кодты құлып бағдарламасына тоқталып өту
қажет. Жұмыс істеу пинципі: жазу режимінде кодты батырмаларды кез
келген ретте тереді және микроконтроллерде болған барлық өзгерістер
ескеріп әрі бақылап, ОЗУ-ға жазады. ОЗУ-да код ұзындығына бөлінетін жады
шектелген. Код жазу аяғы микронтроллерде болған өзгерісердің тоқтауымен
анықталады. Белгілі анықталған уақыт аралығанда өзгерістер орын алуы
қажет. Енгізу процесі аяқталғаннан кейін алынған ақпарат EEPROM
жадысына жазады. Код жазылғаннан кейін құлыпты жұмыс режиміне
ауыстыру керек және режимді таңдау батырасын басу қажет [7].
Сурет 2.18 – Кодты құлып сұлбасы
Бұл бағдарлама екі бөліктен тұрғандықтан, әр құрылғыны жеке
қарастыру қажеттілігі туады.
Сурет 2.19 – Күй сандық сұлбасы
58
Құрылғының жұмыс жасау алгоритмін құрастыру барысында
батырмалардың күй коды түсінігімен жұмыс жасау керек. Батырмалардың
барлығы микроконтроллерға кіріс/шығыс порттары арқылы іске асады. Он
батырманы қосу үшін бір порт жеткіліксіз болады,сондықтан бірнеше
батырманы басқа портқа қосуға керек.
Микроконтроллер осы порттардың мәндерін оқиды және олардың
күйіне сай кодты таңдап алады. Кез келген батырмаға бұл кодта өзінің биті
сәйкес келеді. Батырма басылған кезде бит нольге тең болса, басылмаған
жағдайда бит бірге тең болады. Сондықтан, батырмалардың әртүрлі
жағдайында батырмалардың күй коды әртүрлі мәнге ие.
Ток көзінің қосылған кезінде барлық батырмалар жіберілген болу
қажет, себебі олай болмаса құлыптың жұмысы ойдағыдай орындалмайды.
Сондықтан жұмыс алгоритмі барлық батырмалардың жіберілгенін күту
процедурасынан басталу қажет. Барлық батырмалар бастапқы күйіне келген
сәттен бастап басқа күту бағдарламасы орын алады. Бұл кезде бағдарлама
батырманың басылуын күтеді және кез келген батырманың басылған сәтінде
кілттік сөздің енгізілу циклі орындалады.
Сурет 2.20 – «Әуенді қоңыраулы кодты құлып» құрылғысы
Суретте жалпы құрылғы сұлбасы бейнеленген. Бұл сұлба көмегімен
бағдарлама жазу және виртуалды сұлбасын жинау үшін пайдаланылады.
59
2.3.1 Ассемблер тілінде бағдарламалау
Бағдарламаға толық түсіну үшін бағдарлама листингіне назар аудару
қажет.
Листинг 2.3
.include "tn2313def.inc" ; Негізгі файлға қосылу
.list
; Листингті қосу
.def drebL = R1
; Кіші байт
.def drebH = R2
; Үлкен байт
.def temp1 = R3
.def temp = R16
; Көмекші регистр
.def data = R17
; Ақпарат жіберу регистрі
.def flz = R18
; Құлып жұмыс фазасы
.def count = R19
; Ақпарат жіберу регистрі
.def addre = R20
; EEPROM адресі
.def codL = R21
; Кіші байт кодының уақытша буфері
.def codH = R22
; Үлкен байт кодының уақытша буфері
.def loop = R23
; Есептеу регистрі
.def fnota = R24
; Нотаның жиілігі
.def dnota = R25
; Нотаның ұзақтығы
; Тұрақтыларды анықтау
.equ bsize = 60
; Код сақтау буферінің өлшемі
.equ zad = 100
; Салыстыру
.equ kandr = 20
; Антидребезг тұрақтысы
; SRAM жадысында ұяшықтарды резервтеу
.dseg
; ОЗУ сегментін таңдау
.org 0x60 ; Сегменттің бастапқы адресін орнату
bufr: .byte bsize ; Код қабылдау буфері
melod: .byte 1
; Бастапқы әуен номері
; EEPROM жадысында ұяшықтарды резервтеу
.eseg
; ОЗУ сегментін таңдау
.org 0x08 ; Сегменттің бастапқы адресін орнату
klen: .byte
1
; Код ұзақтығын резервтеу
bufe: .byte
bsize
; Код қабылдау буфері
; Бағдарламаның бастапқы коды
.cseg
; Сегменттің бастапқы кодын орнату
.org 0
; Бастапқы адресті 0-ге қою
60
start: rjmp init
; Программа басына оралу
reti
; 0 бойынша сыртқы үзіліс
reti
; 1 бойынша сыртқы үзіліс
reti
; T1 таймер бойынша үзіліс
rjmp propr ; T1 таймер сәйкестік бойынша үзіліс
rjmp propr ; T1 таймер толуы бойынша үзіліс
reti
; T0 таймер толуы бойынша үзіліс
reti
; UART бойынша үзіліс
reti
reti
; Компаратор бойынша үзіліс
reti
; Кезкелген контакт өзгерісі үзіліс
reti
; Таймер/счетчик 1. Сәйкестік B
reti
; Таймер/счетчик 0. Сәйкестік B
reti
; Таймер/счетчик 0. Сәйкестік А
reti
; USI Стартты дайындық
reti
; USI толуы
reti
; EEPROM дайындық
reti
; Күзет таймер толуы
; Инициализация модулі
init:
; Стека инициализациясы
ldi
temp, RAMEND ; Стек адресін таңдау
out
SPL, temp
; Стек регистр жазу
; В/В портын инициализациясы
ldi
temp,0x18 ; PB портын инициализациясы
out
DDRB,temp
ldi
temp,0xE7
out
PORTB,temp
ldi
temp, 0x7F ; PD портын инициализациясы
out
PORTD, temp
ldi
temp, 0
out
DDRD, temp
; Компаратора қосу инициализациясы
ldi
temp, 0x80
out
ACSR, temp
; Әуен саны
ldi
temp,0
sts
melod,temp
61
main:
; Таймера инициализациясы
ldi
temp,high(zad)
; Кідіру коэф. жазу
out
OCR1AH,temp
ldi
temp,low(zad)
out
OCR1AL,temp
ldi
temp,0x03
; Таймера жұмыс режимі
out
TCCR1B,temp
ldi
codL,0x7F
ldi
codH,0x07
m0: rcall incod
; Клавиша тексеру
brne m0
; Егер басылмаса жалғастыру
m1: in
temp,PINB
; Звонок батырмасын тексеру
sbrs temp,6
rjmp kk1
; Егер басылса,әуенге өту
rcall incod
; Код енгізу
breq m1
; Егер басылмаса жалғастыру
m2: ldi
ZH,high(bufr)
; Көрсеткіш орнату
ldi
ZL,low(bufr)
; буфер басы
clr
count
; Байт счетчик өшіру
; Код енгізі циклі
m3: cli
; Үзіліске шектеу
ldi
data,1
; 1 типті үзісті шақыру
rcall wait
; К шақыру
m5: rcall incod
; Енгізу/тексеру кодты
st
Z+,XL ; Буферге жазу
st
Z+,XH
inc
count
; Счетчик байт кеңейту
inc
count
cpi
count,bsize ;Буфер соңын тексеру
brsh m7
; Соңы болса, аяқтау
mov codL,XL
; Ескі код ретінде жазу
mov codH,XH
ldi
data,2
; 3 типті кідіру шақыру
rcall wait
62
m6: rcall incod
; Енгізу/тексеру кодты
brne m3
; Буфер жазба өзгерісін тексеру
cpi
flz,1
brne m6
m7: sbic PINB,7
; Тумблер қалпын тексеру
rjmp m9
; К тексеру профедурасы
; Код жазу редимі
mov data,count
; Код ұзындығын data
ldiaddre,klen
; Код ұзындығын сақтау адресі
rcall eewr
; EEPROM-ға жазу
ldi
addre,bufe
ldi
ZH,high(bufr)
; Регистрлік жұпқа жазу
ldi
ZL,low(bufr)
m8: ld
data, Z+
; Кезекті жазбаны оқу
rcall eewr
; EEPROM-ға байт жазу
dec count
; Счетчик байт декрименті
brne m8
rjmp m11
; Код тексеру процедурасы
m9:
ldi
addre,klen ; Код сақтау адресі
rcall eerd
; EEPROM-нан оқу
cp
count,data ; Жаңа мәнмен салыстыру
brne m13
; Егер тең болмаса басына оралу
ldi
addre,bufe ; В Y L начало буфера в EEPROM
ldi
ZH,high(bufr)
ldi
ZL,low(bufr)
m10: rcall eerd
; EEPROM-нан 2 байтты оқу
ld
temp,Z+
; ОЗУ-дан 2 байтты оқу
cp
data,temp ; Салыстыру
brne m13
; Тең болмаса басына оралу
dec count
brne m10
; Құлыпты ашу
m11:
sbi
PORTB,4
; Құлыпты ашу командасы
ldi
data,3
; 3 типті кідіруді шақру
63
rcall wait
cbi
PORTB,4
; Құлыпты жабу командасы
m13: rjmp main
Қосымша процедуралар:
; Клавиатурадан 2 байтты тексеру
incod: push count
ic1: ldi
count,kandr
ic2: in
XL,PIND
andi XL,0x7F
in
XH,PINB
andi XH,0x07
cpi
count,kandr
brne ic3
mov drebL,XL
mov drebH,XH
rjmp ic4
ic3: cp
XL,drebL
brne ic1
cp
XH,drebH
brne ic1
ic4: dec count
brne ic2
cp
XL,codL
brne ic5
cp
XH,codH
ic5: pop count
ret
; Кідіру бағдарламасы
wait:
cpi
data,1
brne w1
ldi
temp,0x40
rjmp w2
w1: ldi
temp,0x80
w2: out
TIMSK,temp
clr
temp
out
out
ldi
flz,0
sei
64
cpi
data,2
breq w4
w3:
cpi
flz,1
brne w3
w4:
ret
; EEPROM-ға байт жазу
eewr:
sbic EECR,EEWE
rjmp eewr
out
EEAR,addre
out
EEDR,data
sbi
EECR,EEMWE
sbi
EECR,EEWE
inc
addre
ret
; EEPROM-ға байт оқу
eerd:
sbic EECR,EEWE
rjmp eerd
out
EEAR,addre
sbi
EECR,EERE
in
data, EEDR
inc
addre
ret
propr: ldi
flz,1
reti
kk1:
ldi
temp, 0x09
out
TCCR1B, temp
km1: ldi
temp, 0x00
out
TCCR1A, temp
lds
count,melod
inc
count
cpi
count,8
brne km2
clr
count
km2: sts
melod,count
; Әуен таңдау
km3:
mov YL, count
65
ldi
ZL, low(tabm*2)
ldi
ZH, high(tabm*2)
rcall addw
lpm
XL, Z+
lpm
XH, Z
; Музыка орындалу
km4: mov ZH, XH
mov ZL, XL
km5: in
temp, PINB
sbrc temp, 6
rjmp km6
lpm temp, Z
cpi
temp, 0xFF
breq km4
andi temp, 0x1F
mov fnota, temp
lpm temp, Z+
rol
temp
rol
temp
rol
temp
rol
temp
andi temp, 0x07
mov dnota, temp
rcall nota
rjmp km5
km6: ldi
temp, 0x00
out
TCCR1A, temp
rjmp main
; Көмекші бағдарламалар
addw: push YH
lsl
YL
ldi
YH, 0
add ZL, YL
adc ZH, YH
pop YH
ret
nota: push ZH
push ZL
66
push YL
push temp
cpi
fnota, 0x00
breq nt1
mov YL, fnota
ldi
ZL, low(tabkd*2)
ldi
ZH, high(tabkd*2)
rcall addw
lpm temp, Z+
lpm temp1, Z
out
OCR1AH, temp1
out
OCR1AL, temp
ldi
temp, 0x40
out
TCCR1A, temp
nt1: rcall wait1
ldi
temp, 0x00
out
TCCR1A, temp
ldi
dnota,0
rcall wait1
pop temp
pop YL
pop ZL
pop ZH
ret
wait1: push ZH
push ZL
push YH
push YL
mov YL, dnota
ldi
ZL, low(tabz*2)
ldi
ZH, high(tabz*2)
rcall addw
lpm YL, Z+
lpm YH, Z
clr
ZL
clr
ZH
ww1: ldi
loop,80
ww2: dec
loop
brne ww2
67
adiw R30, 1
cp
YL, ZL
brne ww1
cp
YH, ZH
brne ww1
pop YL
pop YH
pop ZL
pop ZH
ret
tabz: .dw 128,256,512,1024,2048,4096,8192
tabkd: .dw 0
.dw 4748,4480,4228,3992,3768,3556,3356,3168,2990,2822,2664,2514
.dw 2374,2240,2114,1996,1884,1778,1678,1584,1495,1411,1332,1257
.dw 1187,1120,1057, 998, 942, 889, 839, 792
tabm: .dw
mel1*2,mel2*2,mel3*2,mel4*2
.dw
mel5*2,mel6*2,mel7*2
Сурет 2.21 – Клавиатура кодының қалпын форматтау
68
2.3.2 Бағдарламаны іс жүзінде бақылау
Сұлба құру алдында жоғарыда қарастырылған «Кодты құлып»
бөлігін бөлек жинап, жұмыс жасау дұрыстығын тексеру керек.
Сурет 2.22– Сұлбаның «Кодты құлып» бөлігі
Сурет 2.23– «Әуенді қоңыраулы кодты құлып» құрылғысының сұлбасы
Proteus бағдарламасында жоғырада келтірілген алгоритм мен сұлбаны
пайдалану арқылы, жұмыс жасау принципіне сай келеді және қажет
элементтерді шығару және сәйкесінше жалғау арқылы орындалады.
69
Сурет 2.24– Регистрлер және жады көріністері
Жиналған сұлба мен жұмыс жасай отырып, әрбір элементтің жұмысын
жеке көре аламыз. Ол бізге қате болған жағдайда, жұмысты тез арада
тексеруге қажет.
70
Поделитесь с Вашими друзьями: |