Звук файлы на 8 MГЦ 22 кгц 16 бит моно или 8 бит стерео
Звук файлы на 16 MГЦ 44 кгц 16 бит моно или 8 бит стерео
Код: Выделить всё
#define AUDIO_BUFFER 64
#define MAX_ERROR 10
volatile unsigned char ERROR_COUNT;
volatile unsigned char audio_data_count;
uchar _FF_buff[AUDIO_BUFFER];
#pragma vector = TIMER0_OVF0_vect
__interrupt void Timer0_Ovf (void)
{
char temp1,temp2,temp3;
TCNT0 = 0xd5; //reload counter value
temp1= audio_data_count;
temp2=_FF_buff[temp1+1];
temp3=_FF_buff[temp1] ;
temp2+=0x80;
OCR1AL=temp2;//регистры шим
OCR1BL =temp3;//регистры шим
temp1+=2;
if (temp1>=AUDIO_BUFFER) temp1=0;
audio_data_count=temp1;
}
START_TIMER_0;
while (length )
{
if (audio_data_count != i2)
{
if (!i)
{
_SD_send_cmd( TEMP_POSITION );
TEMP_POSITION++;
length--;
}
_FF_buff[i2]=_FF_spi(0xFF);
_FF_buff[i2+1]=_FF_spi(0xFF);
i ++;
i2+=2;
if (i2>=AUDIO_BUFFER) i2=0;
}
}
Здравствуйте alex1991!alex1991 писал(а):phanis здравствуйте я хотел спросит так-как я в этом деле новичок
Сначала надо отформатировать флешку под FAT16 загрузить в нее мелодии WAV
прошить контроллер или в флешку нечего не нужно загружать?
И еще в какой вы среде работаете над исходником
Код: Выделить всё
_FF_buff[0 ]=SOUND_N;//название пример 1.wav
_FF_buff[1 ]=0x20;
_FF_buff[2 ]=0x20;
_FF_buff[3 ]=0x20;
_FF_buff[4 ]=0x20;
_FF_buff[5 ]=0x20;
_FF_buff[6 ]=0x20;
_FF_buff[7 ]=0x20;
_FF_buff[8 ]='W';
_FF_buff[9 ]='A';
_FF_buff[10]='V';
спасибо за ответ. а если можно на аsm. то скинти пожайлусто этот <<кольцевой буфер>> на аsm. и если можно в 2 словах расскажите как им пользоваться. попробую усовершенствовать своё изобритение поставив туда колцевой буфер.phanis писал(а):
Можно, но думаю будут потери в скорости воспроизведения.А чем while не устраивает.DX168B писал(а):Ясно, а считывание нового байта можно организовать по прерыванию таймера, который настроен на режим PWM для воспроизведения.
Да, весьма проблематичное место. Может ЦАП отдельно поставить.Плохо, что у меня выходы USI и ШИМа находятся на одних и тех же ногах, но один инвертированный выход ШИМ выходит рядом. А таймер, как оказалось, можно настроить на вывод ШИМа только через него.
На счет этого даже не беспокойся. Можно не инвертировать выход.По даташиту PB3 (OC1B) PB3.Не инверсный.Так как ШИМ инвертированный, то мне придётся его проинвертировать инвертором на быстродействующей логике.
Или можно не инвертировать выход?
1. Цикл while не устраивает, по тому, что я на ассемблере пишу.phanis писал(а): 1.
Можно, но думаю будут потери в скорости воспроизведения.А чем while не устраивает.
2.
Да, весьма проблематичное место. Может ЦАП отдельно поставить.
3.
На счет этого даже не беспокойся. Можно не инвертировать выход.По даташиту PB3 (OC1B) PB3.Не инверсный.
Не совсем понял.Можно попробовать организовать прерывание по сравнению с регистром OCR1A, а выводить всё равно придётся через OCR1B. В OCR1A кинуть число, чуть меньшее, чем в регистре OCR1C, который отвечает за частоту ШИМ. Так можно добиться более раннего прерывания, для того, чтобы успеть загрузить новый байт и проделать все необходимые операции.