Смекни!
smekni.com

Разработка музыкального звонка с двумя режимами работы: автономным и от сети (стр. 13 из 14)

24.Н. Заец. Электронные самоделки для быта, отдыха и здоровья.— М.: СОЛОН-Пресс, 2009, 423 с.


ПРИЛОЖЕНИЯ

ПРИЛОЖЕНИЕ А

Файл основной программы

Псевдокоманды управления
1 include Tn23l3def inc. :присоединение файла описание
2 . list : Включение листинга
3 .def loop1= RO . Три ячейки для процедуры задержки
4 .def loop2 = R1
5 .def loop З = R21
6 .def temp= R16 : Вспомогательный регистр
7 .def temp1 = R17 : Второй вспомогательный регистр
8 .def count = R17 :Определение регистра счетчика опросаклавиш
9 .def fnota= R19 :Частота текущей ноты
10 .def dnota = R20 :Длительность текущей ноты
-------- Начало программного кода
11 cseg :Выбор сегмента программного кода
12 org 0 : Установка текущего адреса на ноль
13 start rtmp init: Переход на начало программы
14 ret1 : Внешнее прерывание 0
15 ret1 : Внешнее прерывание 1
16 ret1 : Таймер/счётчик1 захват
17 ret1 : Таймер/счетчик 1. совпадение канал А
18 ret1 : Таймер/счетчик 1, прерывание попереполнению
19 ret l : Таймер/счетчик 0, прерывание по переполнению
20 ret1 ; Прерывание UART прием завершен
21 ret1 ; Прерывание UART регистр данных пуст
22 ret1 . Прерывание UART передана завершена
25 ret1 ; Прерывание по компаратору
24 ret1 : Прерывание ло изменений на любом контакте
25 ret1 : Таимер/счетчик 1 Совпадение, канал В
26 ret1 : Таймер/счетчик 0 Совпадение, канал В
27 ret1 :Таймер/ счетчик 0 Совпадение, канал А
28 ret1 USI готовность кстарту
29 ret1 USI Переполнение
30 ret1 EEPR0M Готовность
31 ret1 Переполнение охранного таймера
init
Инициализация стека
32 ld1 temp RAMED Инициализация стека
33 out SPL temp
Инициализация портов B/B
34 ld1 temp 0x08 Инициализация порта PB
35 out temp 0x7F Инициализацияпорта PD
36 out PORT temp
37 ld1 temp 0x00
38 out DDRD: temp
Инициализация (выключение) компаратора
39 ld1 temp 0x80
40 out ACSR. temp
Инициализациятаймера T1
41 ld1 temp 0x09 Включениережима CTC
42 out TCCR1B temp
43 m1 ld1 temp 0x00 Выключениезвука
44 out TCCR1A temp
Начало основной программы
main:
Вычисление номера нажатой кнопки
45 clr COUNT Обнуление счетчика опроса клавиш
46 ln temp. PIND Чтение порта D
47 m2 lsr temp Сдвигаем входной байт
48 brcc m3 Если текущий разряд был равен 0
49 lnc count Увеличиваем показание счетчика
50 cp1 count 7 Сравнение(7-конец сканирования)
51 brne m2 Если не конец продолжить
52 rlmp m1 Если не одна клавиша не нажата
Выбор мелодии
53 m3 mov YL count Вычисляем адрес где
54 ld1 ZL low(tamb*2) Храниться начало мелодии
55 ld1 ZH high(tamb*2)
56 lcall addw К программе 16-разрядного сложения

57 lpm XL Z+ Извлекаем адрес из таблицы
58 lpm XH Z И помещаем в x
Воспроизведение мелодии
59 m4 mov ZH. XH Записываем в Z начало мелодии
60 mov ZL.XL
61 m5 ln tempPINO Читаем содержимое порта D
62 cpl temp 0x7F Проверяем на равенство 7FH
63 dreg m1 Если равно(скобки опущены) в начало
64 lpm temp Z Извлекаем код ноты
65 cpl temp 0xFF Проверяем не конец ли мелодии
66 dreg m4 Если конец начинаем мелодию сначала
67 and1 temp 0x1f Выделяем код тона из кода ноты
68 mov tnota temp Записываем в регистр кода тона
69 lpm temp Z+ Еще раз берем код ноты
70 col temp Производим сдвиг кода ноты
71 col temp
72 col temp
73 col temp
74 and1 temp. 0х07 выделяем код длительности
75 mov dnota temp помещаем ее в регистр длительности
76 rcall nota к подпрограмме воспроизведения ноты
77 rjmp m S В начало цикла (следующая нота)
Вспомогательные подпрограммы
78 addw duch YH подпрограмма 16 разрядного сложения
79 lsl YL Умножение первого слагаемого на 2
80 ld1 YH.O второй байт первого слагаемого
81 add ZL. YL Складывается два слагаемых
82 adc ZH. YH
83 pop YH
84 ret
Подпрограмма исполнения одной ноты
85 nota. push ZH
86 push ZL
87 push YL
88 push temp
89 col fnota. 0x00 Проверка не пауза ли

90 breg ntl Если пауза переходим сразу к задержке
91 mov YL. fnota Вычисляемадресгдехраниться
92 idi ZL low (tabkd*2) коэффициентделениятекущейноты
93 idi ZH high (tabkd*2)
94 rcali addw К подпрограмме 16-разрядного сложения
95 lpm temp Z+ Извлекаем ид. Разряд КД для текущей ноты
96 lpm templ Z Извлекаем ст. разряд КД для текущей ноты
97 out OCRIAH temp Записать в старш. Часть регистра совпадения
98 out OCRIAL temp Записать в младш. Часть регистра совпадения
99 idi temp 0x40 Включить звук
100 out TCCRIA temp
101 ntl: rcall wait К программе задержки
102 idi temp 0x00 Выключить звук
103 out TCCRIA temp
104 idi dnota 0 Отбрасываем задержку для паузы между нотами
105 rcall wait Пауза между нотами
106 pop temp Завершение подпрограммы
107 pop YL
108 pop ZL
109 pop ZH
110 ret
Подпрограмма формирования задержки
111 wait push ZH
112 push ZL
113 push YH
114 push YL
115 mov YL dnota Вычисляем адрес где храниться
116 ld1 ZL low(tabz*2) нужный коэффициент задержки
117 ld1 ZH high(tabz*2)
118 rcall addw К программе 16-разрядного сложения
119 lpm YL Z+ Читаем первый байт коэффициента задержки
120 lpm YH Z Читаем второй байт коэффициента задержки
121 ctr ZL обнуляем регистровую пару Z
122 ctr ZH
Цикл задержки
123 w1 ldl loop 255 Пустой внутренний цикл
124 w2 dec loop
125 brne w2
126 adlw R3O 1 Увеличение регистровой пары Z на единицу
127 co YL ZL Проверка младшего раздела
128 brne w1
129 cp YH ZH Проверка старшего разряда
130 brne w1
131 pop YL Завершение подпрограммы
132 pop YH
133 pop ZL
134 pop ZH
135 ret
Таблица длительности задержек
136 tabz dw 128.256/512/1024.2048.4096.8192
Таблица коэффициента деления
137 tabkd dw 0
138 dw 4748.4480.4228.3992.3768.3556.3358.3168.2990.2822.2664.2514
139 dw 2374.2240.2114.1996.1884.1778.1678.1584.1495.1411.1332.1257
140 dw 1187.1120/1057.998.942.889.839.792
Таблица начал всех мелодий
141 tabа dw mei1*2, mei2*2, mei3*2, mei4*2,
142 dw mei5*2, mei6*2, mei7*2,
Таблица мелодий
В траве сидел кузнечек
143 mel1 db 109.104.109.104.109.108.108.96.108.104
144 db 108.104.108.109.109.96.109.104.109.104
145 db 109.108.108.96.108.104. 109.104.109.104
146 db 112.112.112.111. 108.109.109.96.109.104
147 db 111.79.79.111.111.112.80.80.112.112.80
148 db 112.112.112.111. 108.109. 104.109.104
149 db 109.108.108.96.108.141.128.96.255
Песенка крокодила Гены
150 mel2 db 109.110.141.102.104.105.102.109.110.141
151 db 111.79.79.111.111.112.80.80. 108.96.108
152 db 108.96.108.141.104.105.102.109.110.141
153 db 79.111.111.112.80. 96.108.104. 109
154 db 146.109.105.136.107.105.134.128.128.102
155 db 79.111.111.112.80. 96.110.176.112.108.109
156 db 109.105.136.107.105.134.105.142.146.144.
157 db 105.136.107.105.134. 134.128.128.102.141
158 db 111.111.112.80. 96.110.176.136.107.105.134
159 db 105.134. 134.128.128.142.141.105.109.139
160 db 126.173.146.128.96.255
В лесу родилась елочка
161 mel3 db 132.141.141.139.141.137.132.132.132.141
162 db 141.142.139.176.128.144.146.146.154.154
163 db 153.151.149.144.153.153.151.153.181.128
164 db 96.255
Happy births to you
165 mel4 db 107.107.141.139.144.143.128.107.107.141
166 db 139.146.144.128.107.107.151.148.146.112
167 db 111.149.117.117.148.144.146.144.128.255
С чего начинается родина
168 mel5 db 99.175.109.107.106.102.99.144.111.175
169 db 96.99.107.107.107.107.102.104.170.96
170 db 99.109.109.109.109.107.106.143.109.141
171 db 99.109.109.109.109.104.106.171.96.99
172 db 111.109.107.106.102.99.144.111.143.104
173 db 114.114.114.114.109.111.176.96.104.116
174 db 112.109.107.106.64.73.143.107.131.99
175 db 144.80.80.112.111.64.75.173.128.255
Песня из кинофильма «Веселые ребята»
176 mel6 db 105.109.112.149.116.64.80.148.114.64
177 db 78.146.112.96.105.105.109.144.111.64
178 db 80.145.112.64.81.178.96.117.117.117
179 db 149.116.64.82.146.112.64.79.146.144
180 db 96.105.105.107.141.108.109.112.110.102
181 db 104.137.128.96.105.105.105.137.102.64
182 db 73.142.105.107.109.64.75.137.96.105
183 db 105.105.137.102.105.142.112.64.82.180
184 db 96.116.116.116.148.114.112.142.109.64
185 db 78.146.144.96.105.105.107.141.108.109
186 db 112.110.102.104.169.96.96.255
Улыбка
187 mel7 db 107.104.141.139.102.105.104.102.164.128
188 db 104.107.109.109.109.111.114.112.111.109
189 db 144.139.128.109.111.144.96.111.109.104
190 db 107.105.173.128.111.109.112.107.111.109
191 db 109.107.102.104.134.132.128.100.103.107
192 db 107.107.107.139.112.100.103.102.102.102
193 db 134.102.103.107.105.107.108.108.108.108
194 db 107.105.107.108.144.142.128.112.107.110
195 db 140.112.105.108.107.107.107.105.140.139
196 db 139.112.103.102.103.105.108.107.105.103
197 db 128.112.107.110.108.108.108.108.140.112.105
198 db 108.107.107.107.139.112.103.102.103.105
199 db 108.107.105.103.105.1039.132.128.96.96
200 db 96.255

ПРИЛОЖЕНИЕБ