Прошу прощения, что долго не заходил в тему.
На данный момент изобразил две функции воспроизведения wav-файла. Первая была более простой - там просто между отправками отсчетов на цап запускается таймер и отмеряет задержку - прерывание там не используется.
Код
memcpy(&size, &buffer[4],4);
while (size>128)
{
fread(buffer, sizeof(char), 128, f);
size=size-128;
for (t=0;t<128;t++)
{
DACR=buffer[t]<<8;
T1_delay(86);
}
result=os_evt_wait_or(0x003E, 0);
if (result==OS_R_EVT)
{
fclose(f);
return;
}
}
fread(buffer, sizeof(char), size, f);
for (t=0;t<size;t++)
{
DACR=buffer[t]<<8;
T1_delay(86);
}
result=os_evt_wait_or(0x003E, 0);
if (result==OS_R_EVT)
{
fclose(f);
return;
}
fclose(f);
result=os_evt_wait_or(0x003E, timeout);
}
Второй вариант использует прерывания от таймера и два буфера
Код
memcpy(&size, &buffer[4],4);
fread(buffer, sizeof(char), 256, f);
size=size-256;
T1TCR=0x01;
while (size>128)
{
switch (empty)
{
case 0: break;
case 1: fread(buffer, sizeof(char), 128, f); empty=0; size=size-128; break;
case 2: fread(&buffer[128], sizeof(char), 128, f); empty=0; size=size-128; break;
}
result=os_evt_wait_or(0x003E, 5);
if (result==OS_R_EVT)
{
T1TCR=0;
fclose(f);
return;
}
}
switch (empty)
{
case 0: break;
case 1: fread(buffer, sizeof(char), 128, f); empty=0; size=size-128; break;
case 2: fread(&buffer[128], sizeof(char), 128, f); empty=0; size=size-128; break;
}
result=os_evt_wait_or(0x003E, 5);
if (result==OS_R_EVT)
{
T1TCR=0;
fclose(f);
return;
}
Обработчик прерывания
Код
void T1_Handler (void) __irq
{
T1IR=0x01;
switch (t)
{
case 128: empty=1; break;
case 0: empty=2; break;
}
DACR=buffer[t++]<<8;
VICVectAddr = 0; // Acknowledge Interrupt
}
Решил вместо двух массивов использовать один, но поочередно записывать в первую и вторую половины массива.
Насчет "поумневших" модемов в моем случае оказалось достаточным включить встроенный декодер DTMF модема и он по нажатию каждой кнопки выплевывал сообщение.
P.S. прилагаю файл wav.c - в нем функция play_wav() реализует проигрывание файла без использования прерывания от таймера, функция play_wav_int() соответственно с использованием