файлы от 0.wav -Z.wav проверял с флешками 128, 512 2Г Звук файлы на 8 MГЦ 22 кгц 16 бит моно или 8 бит стерео Звук файлы на 16 MГЦ 44 кгц 16 бит моно или 8 бит стерео
Последний раз редактировалось phanis Пт мар 11, 2011 19:41:07, всего редактировалось 3 раз(а).
а я использовал самую последнюю прошивку,и карту памети 1 гиг тошыба*.От лопатки из под карты памяти соединял проводками от иде шлейфа размером примерно 1,5 см к микрухе attiny2313,что-то не пашет,слышно щелкание,кто может примерно сказать в чём ошибка?) и есть те у кого заработало ?)
[quote="phanis"][/quote] а вы на словах или блок схемой можете описать алгоритм работы сваей программы что она на 16 МГц такую производительность даёт.
_________________ Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Да, хитрость заключается в том что файлы нужно закидывать после форматирования флешки или производить дефрагментацию после удаление файлов замены. Для того что бы кластеры файла расположились по порядку, это позволяет избежать работы связанные с поиском по таблице(FAT 16) следующего кластера. Достаточно знать длину файла и начальный кластер файла, производить по секторное чтение файла пока не прочитали всю длину.
это я знаю я делал именно также. сначала вычислял первый физический сектор файла затем его размер измеряемый в секторах и и считывал эти данные, мне больше интересен сам алгоритм считывание данных с флешки и последующие его воспроизведение.
_________________ Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
Создаю не большой кольцевой буфер у меня 64 байта(ОЗУ Atiny 2313 всего 128 байт) Далее заполняю буфер. Запускаю таймер с прерыванием на частоте 44100 Гц для 16 МГц С каждым прерыванием записываю в 2 регистра ШИМ из буфера
phanis здравствуйте я хотел спросит так-как я в этом деле новичок Сначала надо отформатировать флешку под FAT16 загрузить в нее мелодии WAV прошить контроллер или в флешку нечего не нужно загружать? И еще в какой вы среде работаете над исходником
phanis здравствуйте я хотел спросит так-как я в этом деле новичок Сначала надо отформатировать флешку под FAT16 загрузить в нее мелодии WAV прошить контроллер или в флешку нечего не нужно загружать? И еще в какой вы среде работаете над исходником
Здравствуйте alex1991!
прошить контроллер отформатировать флешку (не память контроллера FLASH, а карту памяти SD MMC ) под FAT16 загрузить в нее мелодии с названием файлов от 0.wav 1.wav ит д можно до z.wav
Еще по вопросуБАТАРЕЙКУС на счет скорости если у вас используется аппаратный 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; А если еще на ассемблере ..
спасибо за ответ. а если можно на аsm. то скинти пожайлусто этот <<кольцевой буфер>> на аsm. и если можно в 2 словах расскажите как им пользоваться. попробую усовершенствовать своё изобритение поставив туда колцевой буфер.
_________________ Мечтатель - не тот, кто сидит на диване и думает о несбыточном, а тот, кто всеми силами стремится воплотить несбыточное в реальность.
К сожалению в asm только начинаю изучать. Если в двух словах. Нужно считывать с флеш в буфер пока номер считываемого байта не равен воспроизводимому Например закинули один байт в регистр ШИМ из буфера, прибавили 1 в одном счетчике (воспроизведено) - это все в прерывании Теперь вышли из прерывания вернулись в программу чтения с флеш, сравниваем счетчик (воспроизведено) с счетчиком(прочитано), если не равно читаем байт с флеш прибавляем 1 счетчик(прочитано) И опять сравниваем.Если равно. сидим ждем (можно рассчитать адрес следующего сектора, на перёд приготовить). Происходит прерывание и опять по новому. Счетчик(воспроизведено) обнуляем в прерывании при достижении нашего размера буфера. Счетчик(прочитано) обнуляем в в программе чтения с флеш при достижении нашего размера буфера. Получается что то вроде 2х потоков. Т.е нужно максимально задействовать контроллер. А не так прочитали 512 байт в буфер и пока не воспроизвели все 512 байт ждем. Пока мы будем отправлять CMD17 с адресом следующего сектора ждать от флеш 0xFE потом читать 512 байт Откуда проигрывать, буфер прочитали.
Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Вс мар 13, 2011 14:25:34
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4468 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
Я понял так, по поводу буфера: Значит у нас воспроизведение идёт медленнее, чем загрузка данных с флешки. Так? При первом запуске мы заполняем сначала буфер данными с флешки. Как заполним, начинаем воспроизведение из буфера. Так? Прочитали первый байт и перешли ко второму. Так? Следом же грузим следующий байт из флешки и заполняем им первую освободившуюся ячейку в буфере, пока воспроизводится второй байт. Так? Прочитали второй байт и переходим к третьему. Так? второй заменяем новым байтом с флешки. Так? Далее так-же поступаем с остальными байтами. Так? Как прочитали последний байт в буфере, переходим в начало буфера, а там уже новые байты. То есть как прочитали байт из буфера, то сразу же заменяем прочитанный новым. Так? Причём алгоритм надо организовать так, чтобы загрузка данных с флешки продолжалась до тех пор, пока счётчик загрузки не сравняется с текущим содержимым счётчика воспроизведения, чтобы, если мы задержимся на инициализации нового блока данных на флешке, мы не опоздали с заменой устаревших байтов. На этом-же принципе и ориентироваться при замене проигранных байтов. Так?
_________________ I am DX168B and this is my favourite forum on internet!
Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Вс мар 13, 2011 14:50:47
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4468 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
Ясно, а считывание нового байта можно организовать по прерыванию таймера, который настроен на режим PWM для воспроизведения. Понял. Хочу собрать устройство голосового оповещения для кое-каких систем автоматизации. Имею на вооружении МК tiny26 и старую флешку MMC на 30 MB. Аудио планирую использовать в wav формате. Плохо, что у меня выходы USI и ШИМа находятся на одних и тех же ногах, но один инвертированный выход ШИМ выходит рядом. А таймер, как оказалось, можно настроить на вывод ШИМа только через него. Так как ШИМ инвертированный, то мне придётся его проинвертировать инвертором на быстродействующей логике. Или можно не инвертировать выход?
_________________ I am DX168B and this is my favourite forum on internet!
Ясно, а считывание нового байта можно организовать по прерыванию таймера, который настроен на режим PWM для воспроизведения.
Можно, но думаю будут потери в скорости воспроизведения.А чем while не устраивает.
Цитата:
Плохо, что у меня выходы USI и ШИМа находятся на одних и тех же ногах, но один инвертированный выход ШИМ выходит рядом. А таймер, как оказалось, можно настроить на вывод ШИМа только через него.
Да, весьма проблематичное место. Может ЦАП отдельно поставить.
Цитата:
Так как ШИМ инвертированный, то мне придётся его проинвертировать инвертором на быстродействующей логике. Или можно не инвертировать выход?
На счет этого даже не беспокойся. Можно не инвертировать выход.По даташиту PB3 (OC1B) PB3.Не инверсный.
Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Вс мар 13, 2011 16:18:14
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4468 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
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!
Если PORTA свободен, может собрать матрицу R-2R в качестве параллельного ЦАП.
Цитата:
Можно попробовать организовать прерывание по сравнению с регистром OCR1A, а выводить всё равно придётся через OCR1B. В OCR1A кинуть число, чуть меньшее, чем в регистре OCR1C, который отвечает за частоту ШИМ. Так можно добиться более раннего прерывания, для того, чтобы успеть загрузить новый байт и проделать все необходимые операции.
Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Вс мар 13, 2011 17:42:43
Друг Кота
Карма: 25
Рейтинг сообщений: 99
Зарегистрирован: Вс янв 24, 2010 19:19:52 Сообщений: 4468 Откуда: Главный Улей России (Moscow)
Рейтинг сообщения:0
Значит так: У нас есть таймер с двухканальным ШИМ. Там есть три регистра для сравнения с регистром 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!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения