Звук WAV в AVR, at45

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
vasily-hertz
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн окт 03, 2011 23:22:45

Звук WAV в AVR, at45

Сообщение vasily-hertz »

Всем привет, весь инет обрыл ). Есть такая идея, воспроизводить звук wave в атмеге16/32, залитый во флеш AT45. Заливать планируется либо вместе с прошивкой, либо уже в работающее устройство, через, например, rx/tx с компа.
При чем, для того, чтобы не грузить МК лишними командами, - что мы читаем вав, такой то файл..., планируется через hex-редактор удалять заголовочные строки из wav-файла, а при работе МК читать нужный звук, указав его адрес.
Вопрос в том, как конвертировать полученный из wav файл с удаленными заголовками, в чистый 8-битный hex-файл данных (на сколько я понял, в авр 16-битная адресация 8-битных данных)? И как его потом залить в AT45? =) Спасибо за внимание, надеюсь на подсказки более компетентных людей, чем я =)
А как воспроизводить 8-битный звук через шим понятно, в инете полно инфы на этот счет
Реклама
vasily-hertz
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн окт 03, 2011 23:22:45

Re: Звук WAV в AVR, at45

Сообщение vasily-hertz »

В полученный массив данных вместо строк заголовка добавить например байт в начале и в конце, чтобы когда АВРка читала из флеш, знала где остановиться.
Реклама
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Звук WAV в AVR, at45

Сообщение pyzhman »

В массиве данных для воспроизведения могут быть любые байты. Так что затея с добавлением байта в начале и в конце не пройдет. У вас должна быть указана длина файла. На вопрос: когда удалите заголовок файла, там и останутся данные для воспроизведения. Если, конечно, вы записывали в формате 8 бит. Выдергиваете по одному и выпуливаете. Ну да это вам уже известно.
Docendo discimus
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Звук WAV в AVR, at45

Сообщение oleg110592 »

Файл без заголовков, из wav файла, делал стареньким Cooledit2 - записать как raw файл.
AT45, потом использовал AT26/AT25, заливал в начале самописным програматором на LPT с буфером 3,3В, позже куплен был програматор Тритон. Таблица адресов и длительностей файлов хранилась в самой AT45 в конце.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: Звук WAV в AVR, at45

Сообщение 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;
}
Реклама
Аватара пользователя
Dmitry Dubrovenko
Поставщик валерьянки для Кота
Сообщения: 2360
Зарегистрирован: Вс янв 09, 2011 16:51:39
Откуда: Санкт-Ленинград
Контактная информация:

Re: Звук WAV в AVR, at45

Сообщение Dmitry Dubrovenko »

vasily-hertz писал(а):как конвертировать полученный из wav файл с удаленными заголовками, в чистый 8-битный hex-файл данных
Надо не в хекс конвертировать, а в бин. А вавка без заголовка, это - и есть обычный бинарник.
Естественно, он изначально должен быть 8-битным, и с нужной частотой дискретизации.
Поэтому, удобнее сразу всё делать, как тут упоминали, в Куледите, или СоундФорже.

Здесь уже подобное обсуждали.
ICQ нет, и, в ближайшее время, не будет.
Реклама
vasily-hertz
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн окт 03, 2011 23:22:45

Re: Звук WAV в AVR, at45

Сообщение vasily-hertz »

Урри спасибо за код, но я мало пока что в нем понимаю ) Т.к. пишу в АБ, и без комментов алгоритм как ежик в тумане )
vasily-hertz
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн окт 03, 2011 23:22:45

Re: Звук WAV в AVR, at45

Сообщение vasily-hertz »

Так одну проблему решил! ) Сохранил в аудио редакоторе как *.bin проверил - открыл hex редактором - файл чист, т.е. без заголовка! )
Теперь буду разбираться каким способом его залить/прочитать во флеше )
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Звук WAV в AVR, at45

Сообщение oleg110592 »

vasily-hertz
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн окт 03, 2011 23:22:45

Re: Звук WAV в AVR, at45

Сообщение vasily-hertz »

Так оказалось есть проблема закачивания файла в АТ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

Сообщение oleg110592 »

Програмный SPI на АВ. В r10 r11 r12 заносится нужный адрес.
AB_AT45.jpg
(30.46 КБ) 692 скачивания
vasily-hertz
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн окт 03, 2011 23:22:45

Re: Звук WAV в AVR, at45

Сообщение vasily-hertz »

oleg110592 писал(а):Програмный SPI на АВ. В r10 r11 r12 заносится нужный адрес.
AB_AT45.jpg
А каким образом переносится бит C в Data и бит из Data в C?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Звук WAV в AVR, at45

Сообщение oleg110592 »

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

Сообщение vasily-hertz »

Ааа, понял это команда асма AVR. "sec" - флаг переноса. Как я понял этот бит записывается в ячейку бита, кот-ый появляется в байте после лог. сдвига?
vasily-hertz
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн окт 03, 2011 23:22:45

Re: Звук WAV в AVR, at45

Сообщение vasily-hertz »

А как общаться с АТ45 аппаратным SPI? В Вашем коде все понятно, байт если не запишется/прочитается по SPI то следующая команда не будет выполняться, но в аппаратном SPI за факт прочтения/передачи байта вроде отвечает бит SPIF, какие то еще есть нюансы на практике использования аппаратного SPI?
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Звук WAV в AVR, at45

Сообщение 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
AB_SPI_M48.jpg
(8.23 КБ) 649 скачиваний
vasily-hertz
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пн окт 03, 2011 23:22:45

Re: Звук WAV в AVR, at45

Сообщение vasily-hertz »

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
AB_SPI_M48.jpg
Мож глупый вопрос, но зачем в операции чтения нужно записывать $ff в SPDR? Это чтобы очистить этот буфер?
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Звук WAV в AVR, at45

Сообщение pyzhman »

А это чтобы начать процесс передачи.
Docendo discimus
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Re: Звук WAV в AVR, at45

Сообщение oleg110592 »

vasily-hertz писал(а):Мож глупый вопрос, но зачем в операции чтения нужно записывать $ff в SPDR? Это чтобы очистить этот буфер?
Когда прочитал свое сообщение тоже подумал, что это лишнее. Давненько делал - это кусочек реально работающей программы для считывания тех же звуковых файлов, правда с SD карточки. Не помню, может ошибаюсь, но в SPI после команды чтения нужно подать 8 CLK импульсов, чтобы прочитать байт, а как это сделать - нужно записать чегонибудь (наверно лучше FF) в SPDR - получим 8 CLK и на вход SPI придет байт. Ну может кто-то поправит - разбираться во второй раз лень.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»