mp3 плеер на attiny2313 на ммс/сд картах
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Первая сырая но рабочая версия файлы от 0.wav -Z.wav проверял с флешками 128, 512 2Г
Звук файлы на 8 MГЦ 22 кгц 16 бит моно или 8 бит стерео
Звук файлы на 16 MГЦ 44 кгц 16 бит моно или 8 бит стерео
Звук файлы на 8 MГЦ 22 кгц 16 бит моно или 8 бит стерео
Звук файлы на 16 MГЦ 44 кгц 16 бит моно или 8 бит стерео
Последний раз редактировалось phanis Пт мар 11, 2011 19:41:07, всего редактировалось 3 раза.
- war139
- Первый раз сказал Мяу!
- Сообщения: 23
- Зарегистрирован: Вс янв 30, 2011 22:31:18
- Откуда: Украина Харьков
Re: mp3 плеер на attiny2313 на ммс картах
а я использовал самую последнюю прошивку,и карту памети 1 гиг тошыба*.От лопатки из под карты памяти соединял проводками от иде шлейфа размером примерно 1,5 см к микрухе attiny2313,что-то не пашет,слышно щелкание,кто может примерно сказать в чём ошибка?) и есть те у кого заработало ?)
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Прошу прощения я не тот файл залил
Вот CRC 56B7 h в PonyProg 8 бит стерео 22 кгц для 8 МГц 44 для 16 МГц
CRC 8DAE h в PonyProg 16 бит моно через 5 -10 кОм между каналами 22 кгц для 8 МГц 44 для 16 МГц
Вот CRC 56B7 h в PonyProg 8 бит стерео 22 кгц для 8 МГц 44 для 16 МГц
CRC 8DAE h в PonyProg 16 бит моно через 5 -10 кОм между каналами 22 кгц для 8 МГц 44 для 16 МГц
- БАТАРЕЙКУС
- Потрогал лапой паяльник
- Сообщения: 346
- Зарегистрирован: Сб фев 07, 2009 19:21:25
Re: mp3 плеер на attiny2313 на ммс картах
[quote="phanis"][/quote]
а вы на словах или блок схемой можете описать алгоритм работы сваей программы что она на 16 МГц такую производительность даёт.
а вы на словах или блок схемой можете описать алгоритм работы сваей программы что она на 16 МГц такую производительность даёт.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Да, хитрость заключается в том что файлы нужно закидывать после форматирования флешки или производить дефрагментацию после удаление файлов замены. Для того что бы кластеры файла расположились
по порядку, это позволяет избежать работы связанные с поиском по таблице(FAT 16) следующего кластера. Достаточно знать длину файла и начальный кластер файла, производить по секторное чтение файла пока не прочитали всю длину.
по порядку, это позволяет избежать работы связанные с поиском по таблице(FAT 16) следующего кластера. Достаточно знать длину файла и начальный кластер файла, производить по секторное чтение файла пока не прочитали всю длину.
- БАТАРЕЙКУС
- Потрогал лапой паяльник
- Сообщения: 346
- Зарегистрирован: Сб фев 07, 2009 19:21:25
Re: mp3 плеер на attiny2313 на ммс картах
это я знаю я делал именно также. сначала вычислял первый физический сектор файла затем его размер измеряемый в секторах и и считывал эти данные, мне больше интересен сам алгоритм считывание данных с флешки и последующие его воспроизведение.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Создаю не большой кольцевой буфер у меня 64 байта(ОЗУ Atiny 2313 всего 128 байт)
Далее заполняю буфер.
Запускаю таймер с прерыванием на частоте 44100 Гц для 16 МГц
С каждым прерыванием записываю в 2 регистра ШИМ из буфера
Далее заполняю буфер.
Запускаю таймер с прерыванием на частоте 44100 Гц для 16 МГц
С каждым прерыванием записываю в 2 регистра ШИМ из буфера
Код: Выделить всё
#define AUDIO_BUFFER 64
#define MAX_ERROR 10
volatile unsigned char ERROR_COUNT;
volatile unsigned char audio_data_count;
uchar _FF_buff[AUDIO_BUFFER];
#pragma vector = TIMER0_OVF0_vect
__interrupt void Timer0_Ovf (void)
{
char temp1,temp2,temp3;
TCNT0 = 0xd5; //reload counter value
temp1= audio_data_count;
temp2=_FF_buff[temp1+1];
temp3=_FF_buff[temp1] ;
temp2+=0x80;
OCR1AL=temp2;//регистры шим
OCR1BL =temp3;//регистры шим
temp1+=2;
if (temp1>=AUDIO_BUFFER) temp1=0;
audio_data_count=temp1;
}
START_TIMER_0;
while (length )
{
if (audio_data_count != i2)
{
if (!i)
{
_SD_send_cmd( TEMP_POSITION );
TEMP_POSITION++;
length--;
}
_FF_buff[i2]=_FF_spi(0xFF);
_FF_buff[i2+1]=_FF_spi(0xFF);
i ++;
i2+=2;
if (i2>=AUDIO_BUFFER) i2=0;
}
}
-
alex1991
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср апр 14, 2010 20:42:24
- Откуда: Молдова г,Кишинев
Re: mp3 плеер на attiny2313 на ммс картах
phanis здравствуйте я хотел спросит так-как я в этом деле новичок
Сначала надо отформатировать флешку под FAT16 загрузить в нее мелодии WAV
прошить контроллер или в флешку нечего не нужно загружать?
И еще в какой вы среде работаете над исходником
Сначала надо отформатировать флешку под FAT16 загрузить в нее мелодии WAV
прошить контроллер или в флешку нечего не нужно загружать?
И еще в какой вы среде работаете над исходником
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
alex1991 писал(а):phanis здравствуйте я хотел спросит так-как я в этом деле новичок
Сначала надо отформатировать флешку под FAT16 загрузить в нее мелодии WAV
прошить контроллер или в флешку нечего не нужно загружать?
И еще в какой вы среде работаете над исходником
Здравствуйте alex1991!
прошить контроллер
отформатировать флешку (не память контроллера FLASH, а карту памяти SD MMC ) под FAT16 загрузить в нее мелодии с названием файлов от 0.wav 1.wav ит д можно до z.wav
Код: Выделить всё
_FF_buff[0 ]=SOUND_N;//название пример 1.wav
_FF_buff[1 ]=0x20;
_FF_buff[2 ]=0x20;
_FF_buff[3 ]=0x20;
_FF_buff[4 ]=0x20;
_FF_buff[5 ]=0x20;
_FF_buff[6 ]=0x20;
_FF_buff[7 ]=0x20;
_FF_buff[8 ]='W';
_FF_buff[9 ]='A';
_FF_buff[10]='V';
Среда IAR AVR 5.50
Еще по вопросуБАТАРЕЙКУС на счет скорости
если у вас используется аппаратный SPI, (в attiny2313 к сожалению полу аппаратный USI, SPI только для программирования ) то можно не много увеличить скорость
за счет выполнения операций, во время ожидания отправки приема байта в меге примерно 20 циклов
меговский пример
unsigned char _FF_spi(unsigned char byte)
{
SPDR = byte;
while (!(SPSR & 0x80));// вот главный тормоз ожидание
byte = SPDR;
}
_FF_buff[i2]=_FF_spi(0xFF);
i ++;
можно примерно так
SPDR = 0xFF;
i ++;
while (!(SPSR & 0x80));
_FF_buff[i2]=SPDR;
во первых мы не перешли в подпрограмму unsigned char _FF_spi(unsigned char byte)
во вторых мы прибавили к i 1;
А если еще на ассемблере ..
- БАТАРЕЙКУС
- Потрогал лапой паяльник
- Сообщения: 346
- Зарегистрирован: Сб фев 07, 2009 19:21:25
Re: mp3 плеер на attiny2313 на ммс картах
phanis писал(а):
спасибо за ответ. а если можно на аsm. то скинти пожайлусто этот <<кольцевой буфер>> на аsm. и если можно в 2 словах расскажите как им пользоваться. попробую усовершенствовать своё изобритение поставив туда колцевой буфер.
Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
К сожалению в asm только начинаю изучать.
Если в двух словах.
Нужно считывать с флеш в буфер пока номер считываемого байта не равен воспроизводимому
Например закинули один байт в регистр ШИМ из буфера, прибавили 1 в одном счетчике (воспроизведено) - это все в прерывании
Теперь вышли из прерывания вернулись в программу чтения с флеш, сравниваем счетчик (воспроизведено) с счетчиком(прочитано), если не равно читаем байт с флеш прибавляем 1 счетчик(прочитано)
И опять сравниваем.Если равно. сидим ждем (можно рассчитать адрес следующего сектора, на перёд приготовить). Происходит прерывание и опять по новому.
Счетчик(воспроизведено) обнуляем в прерывании при достижении нашего размера буфера.
Счетчик(прочитано) обнуляем в в программе чтения с флеш при достижении нашего размера буфера.
Получается что то вроде 2х потоков.
Т.е нужно максимально задействовать контроллер.
А не так прочитали 512 байт в буфер и пока не воспроизвели все 512 байт ждем.
Пока мы будем отправлять CMD17 с адресом следующего сектора ждать от флеш 0xFE потом читать 512 байт
Откуда проигрывать, буфер прочитали.
Если в двух словах.
Нужно считывать с флеш в буфер пока номер считываемого байта не равен воспроизводимому
Например закинули один байт в регистр ШИМ из буфера, прибавили 1 в одном счетчике (воспроизведено) - это все в прерывании
Теперь вышли из прерывания вернулись в программу чтения с флеш, сравниваем счетчик (воспроизведено) с счетчиком(прочитано), если не равно читаем байт с флеш прибавляем 1 счетчик(прочитано)
И опять сравниваем.Если равно. сидим ждем (можно рассчитать адрес следующего сектора, на перёд приготовить). Происходит прерывание и опять по новому.
Счетчик(воспроизведено) обнуляем в прерывании при достижении нашего размера буфера.
Счетчик(прочитано) обнуляем в в программе чтения с флеш при достижении нашего размера буфера.
Получается что то вроде 2х потоков.
Т.е нужно максимально задействовать контроллер.
А не так прочитали 512 байт в буфер и пока не воспроизвели все 512 байт ждем.
Пока мы будем отправлять CMD17 с адресом следующего сектора ждать от флеш 0xFE потом читать 512 байт
Откуда проигрывать, буфер прочитали.
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
У кого нибудь заработало с новыми прошивками?
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Я понял так, по поводу буфера:
Значит у нас воспроизведение идёт медленнее, чем загрузка данных с флешки. Так?
При первом запуске мы заполняем сначала буфер данными с флешки. Как заполним, начинаем воспроизведение из буфера. Так? Прочитали первый байт и перешли ко второму. Так? Следом же грузим следующий байт из флешки и заполняем им первую освободившуюся ячейку в буфере, пока воспроизводится второй байт. Так? Прочитали второй байт и переходим к третьему. Так? второй заменяем новым байтом с флешки. Так? Далее так-же поступаем с остальными байтами. Так? Как прочитали последний байт в буфере, переходим в начало буфера, а там уже новые байты. То есть как прочитали байт из буфера, то сразу же заменяем прочитанный новым. Так? Причём алгоритм надо организовать так, чтобы загрузка данных с флешки продолжалась до тех пор, пока счётчик загрузки не сравняется с текущим содержимым счётчика воспроизведения, чтобы, если мы задержимся на инициализации нового блока данных на флешке, мы не опоздали с заменой устаревших байтов. На этом-же принципе и ориентироваться при замене проигранных байтов. Так?
Значит у нас воспроизведение идёт медленнее, чем загрузка данных с флешки. Так?
При первом запуске мы заполняем сначала буфер данными с флешки. Как заполним, начинаем воспроизведение из буфера. Так? Прочитали первый байт и перешли ко второму. Так? Следом же грузим следующий байт из флешки и заполняем им первую освободившуюся ячейку в буфере, пока воспроизводится второй байт. Так? Прочитали второй байт и переходим к третьему. Так? второй заменяем новым байтом с флешки. Так? Далее так-же поступаем с остальными байтами. Так? Как прочитали последний байт в буфере, переходим в начало буфера, а там уже новые байты. То есть как прочитали байт из буфера, то сразу же заменяем прочитанный новым. Так? Причём алгоритм надо организовать так, чтобы загрузка данных с флешки продолжалась до тех пор, пока счётчик загрузки не сравняется с текущим содержимым счётчика воспроизведения, чтобы, если мы задержимся на инициализации нового блока данных на флешке, мы не опоздали с заменой устаревших байтов. На этом-же принципе и ориентироваться при замене проигранных байтов. Так?
I am DX168B and this is my favourite forum on internet!
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Да именно так.
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Ясно, а считывание нового байта можно организовать по прерыванию таймера, который настроен на режим PWM для воспроизведения. Понял. Хочу собрать устройство голосового оповещения для кое-каких систем автоматизации. Имею на вооружении МК tiny26 и старую флешку MMC на 30 MB.
Аудио планирую использовать в wav формате. Плохо, что у меня выходы USI и ШИМа находятся на одних и тех же ногах, но один инвертированный выход ШИМ выходит рядом. А таймер, как оказалось, можно настроить на вывод ШИМа только через него.
Так как ШИМ инвертированный, то мне придётся его проинвертировать инвертором на быстродействующей логике.
Или можно не инвертировать выход?
Аудио планирую использовать в wav формате. Плохо, что у меня выходы USI и ШИМа находятся на одних и тех же ногах, но один инвертированный выход ШИМ выходит рядом. А таймер, как оказалось, можно настроить на вывод ШИМа только через него.
Или можно не инвертировать выход?
I am DX168B and this is my favourite forum on internet!
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
DX168B писал(а):Ясно, а считывание нового байта можно организовать по прерыванию таймера, который настроен на режим PWM для воспроизведения.
Можно, но думаю будут потери в скорости воспроизведения.А чем while не устраивает.
Плохо, что у меня выходы USI и ШИМа находятся на одних и тех же ногах, но один инвертированный выход ШИМ выходит рядом. А таймер, как оказалось, можно настроить на вывод ШИМа только через него.
Да, весьма проблематичное место. Может ЦАП отдельно поставить.
Так как ШИМ инвертированный, то мне придётся его проинвертировать инвертором на быстродействующей логике.
Или можно не инвертировать выход?
На счет этого даже не беспокойся. Можно не инвертировать выход.По даташиту PB3 (OC1B) PB3.Не инверсный.
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
phanis писал(а):1.
Можно, но думаю будут потери в скорости воспроизведения.А чем while не устраивает.
2.
Да, весьма проблематичное место. Может ЦАП отдельно поставить.
3.
На счет этого даже не беспокойся. Можно не инвертировать выход.По даташиту PB3 (OC1B) PB3.Не инверсный.
1. Цикл while не устраивает, по тому, что я на ассемблере пишу.
На Си пишу только для ПК. Можно попробовать организовать прерывание по сравнению с регистром OCR1A, а выводить всё равно придётся через OCR1B. В OCR1A кинуть число, чуть меньшее, чем в регистре OCR1C, который отвечает за частоту ШИМ. Так можно добиться более раннего прерывания, для того, чтобы успеть загрузить новый байт и проделать все необходимые операции.
2. Есть парочка 16-битных ЦАПов, но они рассчитаны для воспроизведения CD потока через SPI интерфейс. Незнаю, пойдут или нет.
3. Спасибо.
Писать пока не начал. Пока продумываю алгоритмы и варианты.
I am DX168B and this is my favourite forum on internet!
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Если PORTA свободен, может собрать матрицу R-2R в качестве параллельного ЦАП.
Не совсем понял.
Можно попробовать организовать прерывание по сравнению с регистром OCR1A, а выводить всё равно придётся через OCR1B. В OCR1A кинуть число, чуть меньшее, чем в регистре OCR1C, который отвечает за частоту ШИМ. Так можно добиться более раннего прерывания, для того, чтобы успеть загрузить новый байт и проделать все необходимые операции.
Не совсем понял.
- DX168B
- Друг Кота
- Сообщения: 4468
- Зарегистрирован: Вс янв 24, 2010 19:19:52
- Откуда: Главный Улей России (Moscow)
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Значит так:
У нас есть таймер с двухканальным ШИМ.
Там есть три регистра для сравнения с регистром TCNT. Эти регистры: OCR1A - для вывода в первый канал ШИМ, OCR1B - для вывода во второй канал ШИМ и OCR1C - задаёт частоту и разрешение (resolution) ШИМ. То есть мы кидаем например в OCR1C число 0х0F и таймер всегда будет считать до этого числа и сбрасываться в нуль. Если мы кинем в регистр OCR1B число меньшее (обязательно), чем число в регистре OCR1C, то таймер дёрнет флагом прерывания и изменит аппаратно состояние на выходе OC1B. То же самое происходит и с OCR1A и выходом OC1A.
Так вот, что я думаю сделать:
Отрубаю полностью вывод с OCR1A и вырубаю инверсный выход ^OC1B.
В OCR1C кидаю значение 0xFF, в OCR1B буду грузить данные из буфера, а в OCR1A кину число, чуть меньшее, чем в регистре OCR1C, например 0xFB и разрешу прерывание по сравнению с регистром OCR1A. Как таймер досчитает до значения 0xFB, тут-же сработает прерывание по сравнению с OCR1A. В этом прерывании я загружу новый байт из буфера. (А заполнять буфер можно в основной программе. Это для моей задачи подойдёт.) Таймер продолжит считать до 0xFF и сбросится. Но там уже к тому времени будет новое значение в регистре OCR1B. Надо только посчитать такты и максимально подогнать эти моменты впритык. То есть, чтобы сброс таймера и выброс байта в OCR1B происходили одновременно, желательно в один и тот же такт.
У нас есть таймер с двухканальным ШИМ.
Там есть три регистра для сравнения с регистром TCNT. Эти регистры: OCR1A - для вывода в первый канал ШИМ, OCR1B - для вывода во второй канал ШИМ и OCR1C - задаёт частоту и разрешение (resolution) ШИМ. То есть мы кидаем например в OCR1C число 0х0F и таймер всегда будет считать до этого числа и сбрасываться в нуль. Если мы кинем в регистр OCR1B число меньшее (обязательно), чем число в регистре OCR1C, то таймер дёрнет флагом прерывания и изменит аппаратно состояние на выходе OC1B. То же самое происходит и с OCR1A и выходом OC1A.
Так вот, что я думаю сделать:
Отрубаю полностью вывод с OCR1A и вырубаю инверсный выход ^OC1B.
В OCR1C кидаю значение 0xFF, в OCR1B буду грузить данные из буфера, а в OCR1A кину число, чуть меньшее, чем в регистре OCR1C, например 0xFB и разрешу прерывание по сравнению с регистром OCR1A. Как таймер досчитает до значения 0xFB, тут-же сработает прерывание по сравнению с OCR1A. В этом прерывании я загружу новый байт из буфера. (А заполнять буфер можно в основной программе. Это для моей задачи подойдёт.) Таймер продолжит считать до 0xFF и сбросится. Но там уже к тому времени будет новое значение в регистре OCR1B. Надо только посчитать такты и максимально подогнать эти моменты впритык. То есть, чтобы сброс таймера и выброс байта в OCR1B происходили одновременно, желательно в один и тот же такт.
I am DX168B and this is my favourite forum on internet!
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Да, действительно интересно получается, одним таймером и ШИМ и запись байта в регистр OCR1B.
Спасибо, за разъяснения.
А как можно выключить инверсный OCR1B? Во время работы ШИМ и одновременной работы USI.
Спасибо, за разъяснения.
А как можно выключить инверсный OCR1B? Во время работы ШИМ и одновременной работы USI.