Цитата(ogk @ Jan 12 2008, 12:09)

Уважаемый ttron, я ссылку дал. Помогите разобраться с алгоритмом воспроизведения мелодии.
При генерации мелодии на TMR0 подается тактовая частота 15625Гц (тактовая частота 1Мгц и предварительный делитель на 64), сам таймер используется для задания длительностей звучания нот и пауз. Минимальный дискрет времени определяется предустановкой TMR0 (это темп мелодии, сохраняемый в регистре SPEED). Например, при загрузке в него константы 140, время до установки флага T0IF составляет примерно 7.4мс
генерация ноты производится с помощью программного счетчика, тактируемого частотой 250кГц (цикл обновления = 4 программных такта, при том что длительность программного такта 1мкс) Таких счетчиков два: это программные циклы с метками S_label1 и S_label2. В этот счетчик загружается константа полученная при дешифрации кода ноты п/п Dc_tone. Например, для генерации ноты си 1-й октавы (494Гц) используется константа 252, которая при загрузке в вышеупомянутый программный счетчик обеспечивает длительность полупериода частоты тона ноты равный 252/250=1,008мс, что дает период равный 2.016мс или частоту 496Гц (погрешность воспроизведения частоты ноты). Таким образом расчет констант для нот должен был бы производиться по формуле: C=1/(2*F*0.000004)
Длительность ноты задается регистром DURATION, куда загружается код, полученный из дешифрации условной длительности задаваемой тремя младшими битами ноты. Например для "целой" ноты (условный код 100) в DURATION заносится 64, что при вышеуказанном темпе соответствует длительности ноты 473мс. Этот регистр уменьшается на 1 при каждом переполнении TMR0.
Собственно это все... Может я где-то ошибся, но думаю, дальше разберетесь самостоятельно, это просто сделать в симуляторе MPLAB. Успехов.
"Регистрируй, наблюдай, экономь микросекунду, зря вопрос не задавай, не запоминай ерунду" (с) не помню, чье