Исходные данные:
Atmega64 11.059200 МГц
Аудио выход OC0(PortB.4) через RC -> УНЧ
Вывод по средствам ШИМ (Fast PWM 8-bit Timer/Counter 0)
Работа с SD(FAT16) при использовании библиотеки Elm-Chan
Звуковой файл WAV PCM 8 бит 11.025 кГц (без RIFF заголовка, формат данных unsigned)
Компилятор WinAVR-20100110
Код(только то что касается вывода звука):
#define BUF_SIZE 512
unsigned char sound_buf[BUF_SIZE];
int count_buff;
ISR(TIMER2_COMP_vect) // Выполняется с частотой 11.025 кГц
{
cli();
OCR0=sound_buf[count_buff]; //Выводим очередной байт из звукового буфера в ШИМ
count_buff++; // Следующий....
TCNT2 = 0xC2; //init //Инициализация значения счётчика TC2
OCR2 = 0x32; //11.025
sei();
if(count_buff==BUF_SIZE+1)
{
count_buff=0;
res = pf_read(sound_buf, BUF_SIZE, &s1);//Считаем следующие 512 байт из 1.wav
}
}
Суть проблемы вот в чём. Собственно качество воспроизведения полностью перекрывает мои задачи, но есть одно НО.
Во время воспроизведения отчётливо слышны периодичесские "потрескивания". Опытным путём (смена частоты дискретизации и размера буффера)
было установлено, что они возникают в момент считывания (обновления буфера).
Вопрос:
Как можно исправить данную ситуацию. Возможно я плохо продумал алгоритм и есть у кого-то отработанные варианты
или кто-то уже наступал на подобные грабли?
Заранее благодарю за помощь!
С ув. SABRAT


