Petit FatFs & воспроизведение wav файла

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

здравствуйте
не получается открыть файл
код
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#include "lcd_lib.h"
//--------------------
#include <stdio.h>   //  для ф-ции sprintf();
//-------------------
//-------------------
#include "diskio.h"
#include "integer.h"
#include "pff.h"
#include "pffconf.h"


FATFS fs;
const char f[] = "casablanca.wav";


#define LED_ON  (PORTC|=(1<<0))
#define LED_OFF (PORTC&=~(1<<0))


int main (void){

	DDRC=0b00000001;
//--------------------------------------------
	LCD_init();     // инициализация LCD
//--------------------------------------------
	ACSR = 0x80;    // Analog Comparator Disable
//-------------------------------------------
	sei();          // Global enable interrupts
//-------------------------------------------


	if(disk_initialize(0)==RES_OK) LCD_SendString("INIT mSD OK");
	else                           LCD_SendString("INIT mSD ERR");

	_delay_ms(3000);
	LCD_Clear();

	if( pf_mount(&fs) == RES_OK )  LCD_SendString("Mount OK");
	else                           LCD_SendString("Mount ERR");

	_delay_ms(3000);
	LCD_Clear();

	if(pf_open(f) == RES_OK) LCD_SendString("File is OPENED");
	else                     LCD_SendString("File not OPENED");

	while(1){



	}


}
инициализация и монтирование происходят успешно
подскажите где может быть ошибка
Tell Me The Truth
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 52
Зарегистрирован: Вс фев 20, 2011 21:05:17

Сообщение sporeon »

Если монтирование успешно, то, возможно, виновато имя файла. Оно слишком длинное для FAT (если не включен LFN). Можно попробовать что-то вроде CASABL~1.WAV.

Да и вообще, FRESULT неплохо бы получать при открытии файла, тогда бы понятно было в чём проблема.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

переименовал файл 1.wav
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#include "lcd_lib.h"
//--------------------
#include <stdio.h>   //  для ф-ции sprintf();
//-------------------
//-------------------
#include "diskio.h"
#include "integer.h"
#include "pff.h"
#include "pffconf.h"


FATFS fs;
const char file_name[] = "1.wav";
BYTE buff[16];


#define LED_ON  (PORTC|=(1<<0))
#define LED_OFF (PORTC&=~(1<<0))


int main (void){

	DDRC=0b00000001;
//--------------------------------------------
	LCD_init();     // инициализация LCD
//--------------------------------------------
	ACSR = 0x80;    // Analog Comparator Disable
//-------------------------------------------
	sei();          // Global enable interrupts
//-------------------------------------------


	if( disk_initialize(0) == RES_OK ) LCD_SendString("INIT mSD OK");
	else                               LCD_SendString("INIT mSD ERR");

	_delay_ms(3000);
	LCD_Clear();

	if( pf_mount(&fs) == RES_OK )  LCD_SendString("Mount OK");
	else                           LCD_SendString("Mount ERR");

	_delay_ms(3000);
	LCD_Clear();

	if      ( pf_open(file_name) == RES_OK )         LCD_SendString("File is OPENED");
	else if ( pf_open(file_name) == FR_NO_FILE )     LCD_SendString("FR_NO_FILE");
	else if ( pf_open(file_name) == FR_DISK_ERR )    LCD_SendString("FR_DISK_ERR");
	else if ( pf_open(file_name) == FR_NOT_ENABLED ) LCD_SendString("FR_NOT_ENABLED");

	while(1){



	}


}
ф-ция возвращает FR_NO_FILE
этот же файл открывал в другом проэкте где используется либа FatFs
опытным путем выяснил что файл в ней открывается успешно при длине имени не более 8 символов
куда копать дальше ?
неужто баг в библиотеке ?
Tell Me The Truth
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

FreshMan писал(а):открывается успешно при длине имени не более 8 символов
куда копать дальше ?
А "1.wav" разве содержит более 8 символов ?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

нет
но тем не мение файл не открывается
Tell Me The Truth
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 52
Зарегистрирован: Вс фев 20, 2011 21:05:17

Сообщение sporeon »

Попробуйте получить список файлов (http://elm-chan.org/fsw/ff/pf/readdir.html), может что-то вырисуется.
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

FreshMan писал(а):но тем не мение файл не открывается
Что-то Вы запутались. И нас тоже путаете.
Сначала Вы пишите, что файл открывается если имя меньше 8 символов, потом сразу же пишите, что он совсем не открывается.
Дак открывается он или нет ?
8 символов - это максимальная длина файла при отключенной поддержки LNF. Плюс 3 символа на расширение.

ЗЫ: Попробуйте, как и писали выше, пройтись поиском и вывести все имена на дисплей.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

у вас неверно сделана обработка ошибки: функцию надо вызывать один раз и запоминать код возврата, который затем анализировать.

Код: Выделить всё

switch(pf_open(file_name)){
case RES_OK: LCD_SendString("File is OPENED"); break;
case FR_NO_FILE: LCD_SendString("FR_NO_FILE"); break;
// и т.д.
}
ну и есть небольшое подозрение, что надо задать рабочий каталог, ибо указание имени файла без указания пути, возможно, и дает указанную вами проблему. сделайте аналог DOS-овской команды "cd \" перед тем, как открывать файл в корне флешки...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

sporeon писал(а):Сначала Вы пишите, что файл открывается если имя меньше 8 символов, потом сразу же пишите, что он совсем не открывается.
Дак открывается он или нет ?
есть два проэкта
в первом используется либа FatFs
в этом проэкте файл 1.wav открывается без проблем
лежит он в корне, не в папке, а в коне диска
во втором используется либа Petit FatFs
файл здесь 1.wav не открывается
лежит он тоже в корне диска
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

предполагаю что ошибка сокрыта где-то в либе
на просторах инете нашол допиленную чановскую Petit FatFs
с ней пока трабл нет
Вложения
Petit FatFs.rar
(17.35 КБ) 200 скачиваний
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

возник вопрос по настройке таймеров
Т0(8-ми разрядный) настраиваю на частоту дискретизации 32кГц
тоесть это та частота с которой будут обновляться значения ШИМ
Т1(16-ти разрядный) использую под сам ШИМ
на какую частоту надо настраивать Т1 ?
Tell Me The Truth
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

FreshMan писал(а):на какую частоту надо настраивать Т1 ?
чем выше, тем лучше, будет проще отфильтровать. но при любом раскладе не ниже частоты Т0.

мне ваш подход представляется бессмысленно-избыточным: 32 кГц дискретизация явно ни к чему, если ШИМ будет 8-битный. качество ШИМ-модулированного сигнала определяется не только частотой дискретизации, но и разрядностью ШИМ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

ARV писал(а):мне ваш подход представляется бессмысленно-избыточным:
почему ?
частоту дискретизации выбираю оглядываясь на теорему Котельникова
мы слышим в диапазоне 20 - 20000Гц
как я понимаю, в таком случае частота дискретизации должна быть 40кГц
но мне ее из AVR не выжать
ШИМ будет 16 разрядный, потому как при 8 разрядном слышны заментые шумы в паузах
поправте если где-то заблуждаюсь :)
Tell Me The Truth
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

FreshMan писал(а):поправте если где-то заблуждаюсь
ок.
16-битный ШИМ - это значит, частота будет в 65536 раз меньше тактовой частоты МК. AVR работают на 16МГц максимум, следовательно, частота ШИМ у вас будет не более 244 Гц. по теореме Котельникова вы сможете получить сигнал не более 122 Гц...

всё верно?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

ARV писал(а):16-битный ШИМ
да, но он будет не на дискретизации а на разрядности
тоесть, Т0 - 8 разрядный - используется под дискретизацию, выборку сигнала
Т1 - 16 разрядный - под разрядность, тоесть он будет определять количество уровней сигнала
вы меня понимаете ?
Tell Me The Truth
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

FreshMan писал(а):вы меня понимаете ?
я-то понимаю, а вот вы, похоже, не понимаете принцип ШИМ-генерации звука...

частота дискретизации у вас определяется частотой ШИМ, т.к. именно импульс ШИМ является аналогом "отсчета" сигнала. пока один период ШИМ не отработает, вы не сможете выдать новый отсчет, поэтому задавать частоту дискретизации БОЛЬШЕ частоты ШИМа - бессмысленно. меньше - можно, выше - нет.

отсюда и плясать
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

тогда я не пойму как правельно настроить таймера ?
выходит при 16 разрядном шиме это сделать не возможно ?
Tell Me The Truth
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Зачем вам 16-ти битный звук ? Вы что, собрались Бетховена слушать на Hi-End аппаратуре ? :facepalm:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

когда конвертором делаеш 8 бит, 32кГц - в паузах слышен заметный шум
при 16 бит, 32кГц шума нет
Tell Me The Truth
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

FreshMan писал(а):тогда я не пойму как правельно настроить таймера ?
выходит при 16 разрядном шиме это сделать не возможно ?
в реализации на AVR - да, 16-битный звук в "привычном" понимании невозможно реализовать. не считать же трансформатороное гудение звуком?

метод расчетов параметров ШИМа в общих чертах выглядит примерно следующим образом.
1. изначально принимаем (смиряемся с фактом), что звук будет 8-битный.
2. разбираемся с частотой дискретизации. звук телефонного качества - это от 6 до 9 килосемплов в секунду, разумеется, чем больше, тем качественнее звук. по слухам при частоте 15-16 килосемплов звук имеет очень приличное качество, а при 32 - уже вполне адекватное FM-уровню. разумеется, рассуждения о качестве справедливы при "средних" уровнях громкости, т.к. тихие и громкие звуки при 8-битах - это скорее фантастика, чем реальность.
3. Если частота дискретизации совпадает с легкодостижимым значением частоты ШИМ (т.е. кратна деленной на 256 тактовой частоте МК, кратность совпадает с предделителями таймера), то выборки семплов можно делать по прерыванию переполнения таймера, генерирующего ШИМ. в противном случае надо использовать другой таймер для выбора семплов.

общие рассуждения.
частоту ШИМ следует выбирать максимально возможной, не обращая внимание на частоту дискретизации, т.к. потом эту частоту надо срезать фильтром. чем выше частота, тем проще фильтр.
существуют методы маскирования низкой разрядности такого звука, но это, как говорится, уже вопрос больше к ушам слушающего, чем к реальному качеству.

Добавлено after 38 seconds:
FreshMan писал(а):когда конвертором делаеш 8 бит, 32кГц - в паузах слышен заметный шум
при 16 бит, 32кГц шума нет
это вы на своей аудиокарте компьютера слушали, или реально из AVR выжимали? ;)

Добавлено after 11 minutes 52 seconds:
вот, нашел у себя синтезированный на AVR 8-битный звук, можете послушать реальное качество (звук синтезирован протеусом с простейшим RC-фильтром). т.к. wav-запрещено - файл просто переименован - удалите расширение zip и слушайте.
Вложения
snd.WAV.zip
(301.51 КБ) 461 скачивание
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «AVR»