Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
Шаг 5. Переходим непосредственно к разработке устройств и программ 341 236 breq nt 1 237 mov YL, fnota 238 ldi ZL, low(tabkd*2) 239 ldi ZH, high(tabkd*2) 240 rcall addw 241 1pm temp, Z+ 242 1pm tempi, Z 243 out 0CR1AH, tempi 244 out OCR1AL, temp 245 ldi temp, 0x40 246 out TCCR1A, temp 247 nt1: rcall waitl 248 ldi temp, 0x00 249 out TCCR1A, temp 250 ldi dnota, 0 251 rcall waitl 252 pop temp 253 pop YL 254 pop ZL 255 pop ZH 256 ret ------------------------------------------- Подпрограмма формирования задержки 257 waitl . push ZH 258 push ZL 259 push YH 260 push YL 261 mov YL, dnota 262 ldi ZL, low(tabz*2) 263 ldi ZH, high(tabz*2) 264 rcall addw 265 1pm YL, z+ 266 1pm YH, z 267 clr ZL 268 clr ZH ; Цикл задержки 269 ww1 : ldi loop, 255 270 ww2 : dec loop 271 brne ww2 272 adiw R30, 1 273 cp YL, ZL 274 brne ww1 275 cp YH, ZH 276 brne ww1 277 pop YL 278 pop YH 279 pop ZL 280 pop ZH 281 ret ; Если пауза, переходим сразу к задержке ; Вычисляем адрес, где хранится ; коэффициент деления для текущей ноты ; К подпрограмме 16-разрядного сложения ; Извлекаем мл. разряд КД для текущей ноты ; Извлекаем ст. разряд КД для текущей ноты ; Записать в старш. часть регистра совпадения , Записать в младш. часть регистра совпадения ; Включить звук К подпрограмме задержки Выключить звук Сбрасываем задержку для паузы между нотами Пауза между нотами Завершение подпрограммы ; Вычисляем адрес, где хранится , нужный коэффициент задержки ; К подпрограмме 16-разрядного сложения ; Читаем первый байт коэффициента задержки ; Читаем второй байт коэффициента задержки ; Обнуляем регистровую пару Z ; Пустой внутренний цикл ; Увеличение регистровой пары Z на единицу ; Проверка младшего разряда ; Проверка старшего разряда ; Завершение подпрограммы Таблица длительности задержек 282 tabz: ,dw 128,256,512,1024,2048,4096, 8192 Таблица коэффициентов деления
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==