Звук WAV в AVR, at45
-
vasily-hertz
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Пн окт 03, 2011 23:22:45
Звук WAV в AVR, at45
Всем привет, весь инет обрыл ). Есть такая идея, воспроизводить звук wave в атмеге16/32, залитый во флеш AT45. Заливать планируется либо вместе с прошивкой, либо уже в работающее устройство, через, например, rx/tx с компа.
При чем, для того, чтобы не грузить МК лишними командами, - что мы читаем вав, такой то файл..., планируется через hex-редактор удалять заголовочные строки из wav-файла, а при работе МК читать нужный звук, указав его адрес.
Вопрос в том, как конвертировать полученный из wav файл с удаленными заголовками, в чистый 8-битный hex-файл данных (на сколько я понял, в авр 16-битная адресация 8-битных данных)? И как его потом залить в AT45? =) Спасибо за внимание, надеюсь на подсказки более компетентных людей, чем я =)
А как воспроизводить 8-битный звук через шим понятно, в инете полно инфы на этот счет
При чем, для того, чтобы не грузить МК лишними командами, - что мы читаем вав, такой то файл..., планируется через hex-редактор удалять заголовочные строки из wav-файла, а при работе МК читать нужный звук, указав его адрес.
Вопрос в том, как конвертировать полученный из wav файл с удаленными заголовками, в чистый 8-битный hex-файл данных (на сколько я понял, в авр 16-битная адресация 8-битных данных)? И как его потом залить в AT45? =) Спасибо за внимание, надеюсь на подсказки более компетентных людей, чем я =)
А как воспроизводить 8-битный звук через шим понятно, в инете полно инфы на этот счет
- Реклама
-
vasily-hertz
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Пн окт 03, 2011 23:22:45
Re: Звук WAV в AVR, at45
В полученный массив данных вместо строк заголовка добавить например байт в начале и в конце, чтобы когда АВРка читала из флеш, знала где остановиться.
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Звук WAV в AVR, at45
В массиве данных для воспроизведения могут быть любые байты. Так что затея с добавлением байта в начале и в конце не пройдет. У вас должна быть указана длина файла. На вопрос: когда удалите заголовок файла, там и останутся данные для воспроизведения. Если, конечно, вы записывали в формате 8 бит. Выдергиваете по одному и выпуливаете. Ну да это вам уже известно.
Docendo discimus
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Звук WAV в AVR, at45
Файл без заголовков, из wav файла, делал стареньким Cooledit2 - записать как raw файл.
AT45, потом использовал AT26/AT25, заливал в начале самописным програматором на LPT с буфером 3,3В, позже куплен был програматор Тритон. Таблица адресов и длительностей файлов хранилась в самой AT45 в конце.
AT45, потом использовал AT26/AT25, заливал в начале самописным програматором на LPT с буфером 3,3В, позже куплен был програматор Тритон. Таблица адресов и длительностей файлов хранилась в самой AT45 в конце.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Звук WAV в AVR, at45
Можно и без внешних редакторов, открыв файл как 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;
}
- Реклама
- Dmitry Dubrovenko
- Поставщик валерьянки для Кота
- Сообщения: 2360
- Зарегистрирован: Вс янв 09, 2011 16:51:39
- Откуда: Санкт-Ленинград
- Контактная информация:
Re: Звук WAV в AVR, at45
Надо не в хекс конвертировать, а в бин. А вавка без заголовка, это - и есть обычный бинарник.vasily-hertz писал(а):как конвертировать полученный из wav файл с удаленными заголовками, в чистый 8-битный hex-файл данных
Естественно, он изначально должен быть 8-битным, и с нужной частотой дискретизации.
Поэтому, удобнее сразу всё делать, как тут упоминали, в Куледите, или СоундФорже.
Здесь уже подобное обсуждали.
ICQ нет, и, в ближайшее время, не будет.
-
vasily-hertz
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Пн окт 03, 2011 23:22:45
Re: Звук WAV в AVR, at45
Урри спасибо за код, но я мало пока что в нем понимаю ) Т.к. пишу в АБ, и без комментов алгоритм как ежик в тумане )
-
vasily-hertz
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Пн окт 03, 2011 23:22:45
Re: Звук WAV в AVR, at45
Так одну проблему решил! ) Сохранил в аудио редакоторе как *.bin проверил - открыл hex редактором - файл чист, т.е. без заголовка! )
Теперь буду разбираться каким способом его залить/прочитать во флеше )
Теперь буду разбираться каким способом его залить/прочитать во флеше )
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Звук WAV в AVR, at45
LPT программатор http://dybkowski.net/content/en/node/15
и тут есть http://bascomavr.3bb.ru/viewtopic.php?id=155
и тут есть http://bascomavr.3bb.ru/viewtopic.php?id=155
-
vasily-hertz
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Пн окт 03, 2011 23:22:45
Re: Звук WAV в AVR, at45
Так оказалось есть проблема закачивания файла в АТ45161дб через мегу. Идея проста - через прогу terminal заливать файл *.bin (мелодию) который передается по USART в Atmega и через SPI в АТ45. Программа написана в АБ (в архиве) и пока демо -вариант. Я только освоил UART и SPI, так же нашел перевод на даташит АТ45 (http://piclist.ru/D-AT-AT45DB081B-RUS/D ... B-RUS.html). Пока работает некорректно (не записывает). Может у кого то уже получалось, посоветуйте!!
- Вложения
-
- Новая папка.rar
- (6.31 КБ) 213 скачиваний
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Звук WAV в AVR, at45
Програмный SPI на АВ. В r10 r11 r12 заносится нужный адрес.
-
vasily-hertz
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Пн окт 03, 2011 23:22:45
Re: Звук WAV в AVR, at45
А каким образом переносится бит C в Data и бит из Data в C?oleg110592 писал(а):Програмный SPI на АВ. В r10 r11 r12 заносится нужный адрес.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Звук WAV в AVR, at45
через команду сдвиг с переносомvasily-hertz писал(а):А каким образом переносится бит C в Data и бит из Data в C?
в документации АБ:
1 -> C Запись 1 в бит C SEC
<<R< Логический сдвиг влево рабочего регистра с переносом <<r20< ROL R
-
vasily-hertz
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Пн окт 03, 2011 23:22:45
Re: Звук WAV в AVR, at45
Ааа, понял это команда асма AVR. "sec" - флаг переноса. Как я понял этот бит записывается в ячейку бита, кот-ый появляется в байте после лог. сдвига?
-
vasily-hertz
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Пн окт 03, 2011 23:22:45
Re: Звук WAV в AVR, at45
А как общаться с АТ45 аппаратным SPI? В Вашем коде все понятно, байт если не запишется/прочитается по SPI то следующая команда не будет выполняться, но в аппаратном SPI за факт прочтения/передачи байта вроде отвечает бит SPIF, какие то еще есть нюансы на практике использования аппаратного SPI?
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Звук WAV в AVR, at45
Команда SEC http://www.gaw.ru/html.cgi/txt/doc/micr ... sm/sec.htm
Команда ROL http://www.gaw.ru/html.cgi/txt/doc/micr ... sm/rol.htm
Апаратный SPI MEGA48
Команда ROL http://www.gaw.ru/html.cgi/txt/doc/micr ... sm/rol.htm
Апаратный SPI MEGA48
-
vasily-hertz
- Первый раз сказал Мяу!
- Сообщения: 21
- Зарегистрирован: Пн окт 03, 2011 23:22:45
Re: Звук WAV в AVR, at45
Мож глупый вопрос, но зачем в операции чтения нужно записывать $ff в SPDR? Это чтобы очистить этот буфер?oleg110592 писал(а):Команда SEC http://www.gaw.ru/html.cgi/txt/doc/micr ... sm/sec.htm
Команда ROL http://www.gaw.ru/html.cgi/txt/doc/micr ... sm/rol.htm
Апаратный SPI MEGA48
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Звук WAV в AVR, at45
Когда прочитал свое сообщение тоже подумал, что это лишнее. Давненько делал - это кусочек реально работающей программы для считывания тех же звуковых файлов, правда с SD карточки. Не помню, может ошибаюсь, но в SPI после команды чтения нужно подать 8 CLK импульсов, чтобы прочитать байт, а как это сделать - нужно записать чегонибудь (наверно лучше FF) в SPDR - получим 8 CLK и на вход SPI придет байт. Ну может кто-то поправит - разбираться во второй раз лень.vasily-hertz писал(а):Мож глупый вопрос, но зачем в операции чтения нужно записывать $ff в SPDR? Это чтобы очистить этот буфер?


