Непонятки с о звуком
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Archy 04 июня 2004 г. 10:50

Люди добрыя. Помогите кто чем можете ;)
Есть программа (не моя) музыку играет.
В режиме симуляции первая нота короткая вторая длинная третья снова короткая 4 длинная
А в железке наоборот и последняя нота не играется вообще.
Такое ощущение что длительность каждой ноты берется из следующей
Где я дурак?

Исходник
.INCLUDE "2313def.inc"

.DEF Step=r20
.DEF FreqIndex=r21
.DEF FreqDelay=r22
.DEF SSREG=r23
.DEF Melody=r24
.DEF DELAY=r25
.CSEG

.ORG 0
rjmp Reset

.ORG OVF0addr
in SSREG,SREG
dec FreqDelay
out SREG,SSREG
reti

Reset:
in melody,pind ;Получить состояние порта "D"
ldi r30,$00 ;все биты на вход
out DDRD,r30
ldi r30,$DF
out SPL,r30
; настройка направления работы линий порта B
ldi r30,$08
out DDRB,r30
; режим работы таймера 0 с максимальным предварительным делением
; здесь же разрешаем прерывания
ldi r30,$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*ProgramTab1) ; FreqIndex = Lo ProgramTab[Step]
ldi r30,Low(2*ProgramTab1) ; FreqDelay = Hi ProgramTab[Step]

mov r0,Step ; Step++
lsl r0
add r30,r0
inc Step
lpm
mov FreqIndex,r0
inc r30
lpm
mov FreqDelay,r0
sbrc r0,7 ; если старший бит установлен, то
rjmp SleepReset ; это означает, что мелодия закончилась

SetFreq: ; настройка таймера 1 на вывод частоты текущей ноты
ldi r31,High(2*SoundTab) ; OCR1A = SoundTab[FreqIndex]
ldi r30,Low(2*SoundTab)
lsl FreqIndex
add r30,FreqIndex
lpm
out OCR1AL,r0
inc r30
lpm
out OCR1AH,r0

Wait:
tst FreqDelay ; Ожидаем заданное время, пока проигрывается
brne Wait ; текущая нота


;pause:
; dec FreqDelay
; ldi r30,250
;p2:
; dec r30
; nop
; tst r30
; brne p2
; tst FreqDelay
; brne pause

rjmp ReadNote

SleepReset:
ldi r30,$3F ; подготовка к переходу в режим Power Down
out MCUCR,r30
sleep ; отключение микроконтроллера
rjmp Reset ; эта команда в данной версии программы не
; должна исполняться никогда

.ORG $80
SoundTab:
.DW 19111,18039,17026,16070,15169,14317,13514,12755,12039,11364,10726,10124
; c1 cis1 d1 dis1 e1 f1 fis1 g1 gis1 a1 b1 h1
; 00 01 02 03 04 05 06 07 08 09 0A 0B
.DW 9556, 9019, 8514, 8035, 7584, 7159, 6757, 6378, 6020, 5682, 5363, 5062
; c2 cis2 d2 dis2 e2 f2 fis2 g2 gis2 a2 b2 h2
; 0C 0D 0E 0F 10 11 12 13 14 15 16 17
.DW 4778, 4510, 4257, 4017, 3764, 3579, 3378, 3171, 3010, 2841, 2681, 2531
; c3 cis3 d3 dis3 e3 f3 fis3 g3 gis3 a3 b3 h3
; 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23


ProgramTab1:
; Таблица последовательности нот,
; формат таблицы: байт длительности/кода операции, байт номера частоты.
.DW $1000, $2002, $1004, $2005, $1007, $1009, $100B, $100C;
.DW $8000

.EXIT

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru