Страница 1 из 1
Звук WAV в AVR, at45
Добавлено: Пн окт 03, 2011 23:42:44
vasily-hertz
Всем привет, весь инет обрыл ). Есть такая идея, воспроизводить звук wave в атмеге16/32, залитый во флеш AT45. Заливать планируется либо вместе с прошивкой, либо уже в работающее устройство, через, например, rx/tx с компа.
При чем, для того, чтобы не грузить МК лишними командами, - что мы читаем вав, такой то файл..., планируется через hex-редактор удалять заголовочные строки из wav-файла, а при работе МК читать нужный звук, указав его адрес.
Вопрос в том, как конвертировать полученный из wav файл с удаленными заголовками, в чистый 8-битный hex-файл данных (на сколько я понял, в авр 16-битная адресация 8-битных данных)? И как его потом залить в AT45? =) Спасибо за внимание, надеюсь на подсказки более компетентных людей, чем я =)
А как воспроизводить 8-битный звук через шим понятно, в инете полно инфы на этот счет
Re: Звук WAV в AVR, at45
Добавлено: Вт окт 04, 2011 00:14:33
vasily-hertz
В полученный массив данных вместо строк заголовка добавить например байт в начале и в конце, чтобы когда АВРка читала из флеш, знала где остановиться.
Re: Звук WAV в AVR, at45
Добавлено: Вт окт 04, 2011 06:09:27
pyzhman
В массиве данных для воспроизведения могут быть любые байты. Так что затея с добавлением байта в начале и в конце не пройдет. У вас должна быть указана длина файла. На вопрос: когда удалите заголовок файла, там и останутся данные для воспроизведения. Если, конечно, вы записывали в формате 8 бит. Выдергиваете по одному и выпуливаете. Ну да это вам уже известно.
Re: Звук WAV в AVR, at45
Добавлено: Вт окт 04, 2011 07:23:06
oleg110592
Файл без заголовков, из wav файла, делал стареньким Cooledit2 - записать как raw файл.
AT45, потом использовал AT26/AT25, заливал в начале самописным програматором на LPT с буфером 3,3В, позже куплен был програматор Тритон. Таблица адресов и длительностей файлов хранилась в самой AT45 в конце.
Re: Звук WAV в AVR, at45
Добавлено: Вт окт 04, 2011 08:02:43
urry
Можно и без внешних редакторов, открыв файл как CWAVEFile - задача узнать смещение и размер области данных
Код: Выделить всё
#include <Mmsystem.h>
#pragma comment(lib, "Winmm.lib")
BOOL CWaveFile::Open(LPSTR lpstrFile)
{
MMIOINFO mmioInfo;
MMCKINFO RiffChunk; // Описатель блок RIFF в файле
MMCKINFO DataChunk; // Описатель блок data в файле
MMCKINFO FmtChunk; // Описатель блок fmt в файле
memset(&mmioInfo, 0, sizeof(MMIOINFO));
//
// Открываем файл
// MMIOERR_INVALIDFILE
m_File = mmioOpen (
lpstrFile,
&mmioInfo,
MMIO_READ | MMIO_DENYWRITE
);
if (!m_File)
{
TRACE ("Невозможно открыть файл");
return FALSE;
}
m_strFileName = lpstrFile;
//
// Ищем раздел RIFF
//
memset(&RiffChunk, 0, sizeof(MMCKINFO));
memset(&DataChunk, 0, sizeof(MMCKINFO));
RiffChunk.fccType = mmioFOURCC ('W', 'A', 'V', 'E');
if (mmioDescend (m_File, &RiffChunk, NULL, MMIO_FINDRIFF))
{
TRACE ("Файл не имеет структуры RIFF/WAVE");
memset(&m_WaveFormatEx, 0, sizeof(WAVEFORMATEX));
mmioSeek(m_File, 0, SEEK_END);
memset(&mmioInfo, 0, sizeof(MMIOINFO));
if (mmioGetInfo(m_File, &mmioInfo, 0))
{
m_lDataPos = -1;
m_dwDataSize = 0;
Close();
return FALSE;
}
m_dwDataSize = mmioInfo.lDiskOffset;
m_lDataPos = 0;
return TRUE;
}
//
// Ищем раздел fmt
//
FmtChunk.ckid = mmioFOURCC ('f', 'm', 't', ' ');
if (mmioDescend (m_File, &FmtChunk, &RiffChunk, MMIO_FINDCHUNK))
{
TRACE ("В файле не найден описатель формата");
Close();
return FALSE;
}
WAVEFORMATEX SrcFmt; // Формат исходного звукового потока
memset(&SrcFmt, 0, sizeof(SrcFmt));
if (FmtChunk.cksize > sizeof (SrcFmt))
{
TRACE ("Слишком большой размер описателя формата");
Close();
return FALSE;
}
//
// Читаем описатель формата в SrcFmt
//
if ( (long)FmtChunk.cksize != mmioRead (m_File, (char *)&SrcFmt, FmtChunk.cksize) )
{
TRACE ("Ошибка чтения описателя формата");
Close();
return FALSE;
}
memcpy(&m_WaveFormatEx, &SrcFmt, sizeof(WAVEFORMATEX));
//
// Ищем раздел data
//
DataChunk.ckid = mmioFOURCC ('d', 'a', 't', 'a');
if ( mmioDescend (m_File, &DataChunk, &RiffChunk, MMIO_FINDCHUNK) )
{
TRACE ("В файле не найден раздел данных");
Close();
return FALSE;
}
m_dwDataSize = DataChunk.cksize;
memset(&mmioInfo, 0, sizeof(MMIOINFO));
if ( mmioGetInfo(m_File, &mmioInfo, 0) )
{
m_lDataPos = -1;
Close();
return FALSE;
}
m_lDataPos = mmioInfo.lDiskOffset;
return TRUE;
}
Re: Звук WAV в AVR, at45
Добавлено: Вт окт 04, 2011 08:21:48
Dmitry Dubrovenko
vasily-hertz писал(а):как конвертировать полученный из wav файл с удаленными заголовками, в чистый 8-битный hex-файл данных
Надо не в хекс конвертировать, а в бин. А вавка без заголовка, это - и есть обычный бинарник.
Естественно, он изначально должен быть 8-битным, и с нужной частотой дискретизации.
Поэтому, удобнее сразу всё делать, как тут упоминали, в Куледите, или СоундФорже.
Здесь уже подобное обсуждали.
Re: Звук WAV в AVR, at45
Добавлено: Вт окт 04, 2011 14:36:52
vasily-hertz
Урри спасибо за код, но я мало пока что в нем понимаю ) Т.к. пишу в АБ, и без комментов алгоритм как ежик в тумане )
Re: Звук WAV в AVR, at45
Добавлено: Вт окт 04, 2011 15:03:06
vasily-hertz
Так одну проблему решил! ) Сохранил в аудио редакоторе как *.bin проверил - открыл hex редактором - файл чист, т.е. без заголовка! )
Теперь буду разбираться каким способом его залить/прочитать во флеше )
Re: Звук WAV в AVR, at45
Добавлено: Вт окт 04, 2011 15:19:05
oleg110592
Re: Звук WAV в AVR, at45
Добавлено: Вт окт 18, 2011 22:56:27
vasily-hertz
Так оказалось есть проблема закачивания файла в АТ45161дб через мегу. Идея проста - через прогу terminal заливать файл *.bin (мелодию) который передается по USART в Atmega и через SPI в АТ45. Программа написана в АБ (в архиве) и пока демо -вариант. Я только освоил UART и SPI, так же нашел перевод на даташит АТ45 (
http://piclist.ru/D-AT-AT45DB081B-RUS/D ... B-RUS.html). Пока работает некорректно (не записывает). Может у кого то уже получалось, посоветуйте!!
Re: Звук WAV в AVR, at45
Добавлено: Ср окт 19, 2011 05:36:45
oleg110592
Програмный SPI на АВ. В r10 r11 r12 заносится нужный адрес.
Re: Звук WAV в AVR, at45
Добавлено: Ср окт 19, 2011 08:49:17
vasily-hertz
oleg110592 писал(а):Програмный SPI на АВ. В r10 r11 r12 заносится нужный адрес.
AB_AT45.jpg
А каким образом переносится бит C в Data и бит из Data в C?
Re: Звук WAV в AVR, at45
Добавлено: Ср окт 19, 2011 09:26:18
oleg110592
vasily-hertz писал(а):А каким образом переносится бит C в Data и бит из Data в C?
через команду сдвиг с переносом
в документации АБ:
1 -> C Запись 1 в бит C
SEC
<<R< Логический сдвиг влево рабочего регистра с переносом <<r20<
ROL R
Re: Звук WAV в AVR, at45
Добавлено: Ср окт 19, 2011 10:07:18
vasily-hertz
Ааа, понял это команда асма AVR. "sec" - флаг переноса. Как я понял этот бит записывается в ячейку бита, кот-ый появляется в байте после лог. сдвига?
Re: Звук WAV в AVR, at45
Добавлено: Ср окт 19, 2011 10:12:47
vasily-hertz
А как общаться с АТ45 аппаратным SPI? В Вашем коде все понятно, байт если не запишется/прочитается по SPI то следующая команда не будет выполняться, но в аппаратном SPI за факт прочтения/передачи байта вроде отвечает бит SPIF, какие то еще есть нюансы на практике использования аппаратного SPI?
Re: Звук WAV в AVR, at45
Добавлено: Ср окт 19, 2011 11:25:35
oleg110592
Re: Звук WAV в AVR, at45
Добавлено: Ср окт 19, 2011 15:32:02
vasily-hertz
Мож глупый вопрос, но зачем в операции чтения нужно записывать $ff в SPDR? Это чтобы очистить этот буфер?
Re: Звук WAV в AVR, at45
Добавлено: Ср окт 19, 2011 15:43:08
pyzhman
А это чтобы начать процесс передачи.
Re: Звук WAV в AVR, at45
Добавлено: Ср окт 19, 2011 18:26:05
oleg110592
vasily-hertz писал(а):Мож глупый вопрос, но зачем в операции чтения нужно записывать $ff в SPDR? Это чтобы очистить этот буфер?
Когда прочитал свое сообщение тоже подумал, что это лишнее. Давненько делал - это кусочек реально работающей программы для считывания тех же звуковых файлов, правда с SD карточки. Не помню, может ошибаюсь, но в SPI после команды чтения нужно подать 8 CLK импульсов, чтобы прочитать байт, а как это сделать - нужно записать чегонибудь (наверно лучше FF) в SPDR - получим 8 CLK и на вход SPI придет байт. Ну может кто-то поправит - разбираться во второй раз лень.