.INCLUDE "2313def.inc"
.DEF Step=r20
.DEF Freqlndex=r21
.DEF FreqDelay=r22
.DEF SSREG=r23
.CSEG
.ORG 0
rjmp Reset
.ORG OVFOaddr
in SSREG,SREG
dec FreqDelay
out SREG,SSREG
reti
Reset:
ldi r30,$DF
out SPL,r30
; Настройка направления работы линий порта В
ldi r30,$08
out DDRB,r30
; Режим работы таймера 0 с максимальным предварительным делением
; Здесь же разрешаем прерывания
ldi г30,$05
out TCCR0,r30
ldi r30,$02
out TIMSK,r30
sei
; Режим работы таймера 1 на переключение внешнего вывода,
; выбор коэффициента предварительного деления тактовой частоты 1:1
; и автоматический сброс таймера при совпадении
ldi r30,$40
out TCCR1A,r30
ldi r30,$09
out TCCR1B,r30
; Установка номера шага на начало
clr Step
ReadNote:; Чтение длительности и номера одной ноты
ldi r31,High(2*ProgramTab); Freqlndex = Lo ProgramTab[Step]
ldi r30,Low(2*ProgramTab); FreqDelay = Hi ProgramTab[Step]
mov r0,Step; Step++
lsl r0
add r30,r0
inc Step
lpm
mov Freqlndex,r0
inc r30
lpm
sbrc r0,7
rjmp SleepReset; Если старший бит установлен, то
mov FreqDelay,r0; это означает, что мелодия закончилась
SetFreq:; Настройка таймера 1 на вывод частоты текущей ноты
ldi r31,High(2*SoundTab); OCR1A = SoundTab[FreqIndex]
ldi r30,Low(2*SoundTab)
lsl Freqlndex
add r30,FreqIndex
lpm
out OCR1AL,r0
inc r30
lpm
out OCR1AH,r0
Wait: tst FreqDelay ; Ожидаем заданное время, пока проигрывается
brne Walt; текущая нота
rjmp ReadNote
SleepReset:
ldi r30,$3F ; Подготовка к переходу в режим Power Down
out MCUCR,r30
sleep; Отключение микроконтроллера
rjmp Reset; Эта команда в данной версии программы не должна исполняться никогда
.ORG $100
SoundTab:
; Таблица констант соответствующим нотам
; Желательно выровнять таблицу по границе 256 байтов, чтобы упростить программу, отказавшись от операций с 16-битовыми словами.
.DW 11364,10292,9322,8443,7647,6926,6273; 440 Гц — нота "ля"
.DW 5682,5146,4661,4222,3824,3463,3137: вторая октава
.DW 2841,2573,2330,2111,1912,1732,1568; третья октава
; При необходимости таблицу можно продолжить
ProgramTab:
; Таблица последовательности нот,
; формат таблицы: байт длительности/кода операции, байт номера частоты
; В этом примере записано проигрывание гаммы
.DW $1001, $1002, $1003, $1004, $1005, $1006, $1007
.DW $1008, $1009, $100А, $100В, $10 °C, $100D, $100Е
.DW S200D, $2006, $2009, $2007, $2005, $2003, $2001
.DW $8000
EXIT
Автор:
6.13. Универсальный расширитель последовательного порта
Назначение