Дипломдық жұмыстың мақсаты avr микроконтроллерін


  «Күй сандық» бағдарламасын құру



жүктеу 5.01 Kb.
Pdf просмотр
бет3/7
Дата30.04.2017
өлшемі5.01 Kb.
түріДиплом
1   2   3   4   5   6   7

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– Бірінші октава ноталарын кодтау 
Код  Нота  Жиілік 
Код  Нота 
Жиілік 

До 
fo 

Фа# 
fe-fs/K 

До# 
fi=fo/K 

Соль 
f7=f6/K 

Ре 
f2=fi/K 

Соль# 
f8=f7/K 

Ре# 
f3=VK 
10 
Ля 
fg-fg/K 

Ми 
f4-f3/K 
11 
Ля# 
fio=f9/K 

Фа 
f5=f4/K 
12 
Си 
fn-fio/K 
 
Анықтама ретінде:  К= 
 
Музыкалық  ұзақтық та бағдарланады. Ұзақтық еркін түрде пайдалана 
алу  үшін  кестеден  бейнеленген.  Темпке  байланысты  нотанық    нақты 
ұзақтығы өзгереді. Әуеннің орындалуын сақтау үшін ұзақтықтар арасындағы 
байланысты  сақтау  керек,  сондықтан  жеті  түлі  ұзақтықтарды  қарастыру 
қажет. 0 ден 6 арасындағы кодтарды ұзақтықтарда пайдаланылады. 
Кесте 2.2– Ұзақтықты кодтау 
Код 
Длительность 
Коэффициент деления 

1(бүтін) 
64 

1/2(жарты) 
128 

1 /4 (төрттен бір) 
256 

1/8 (сегізден бір) 
512 

1 /16 (он алтыдан бір) 
1024 

1/32 (отыз екіден бір 
2048 

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 

 
; Код ұзақтығын резервтеу 
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– Регистрлер және жады көріністері 
Жиналған сұлба мен жұмыс жасай отырып, әрбір элементтің жұмысын 
жеке  көре  аламыз.  Ол  бізге  қате  болған  жағдайда,  жұмысты  тез  арада 
тексеруге қажет.  
 
 
 
 
 
 
 
 
 
1   2   3   4   5   6   7




©emirb.org 2020
әкімшілігінің қараңыз

    Басты бет