Перейти к содержанию

Wav На Atmega32


Menseu

Рекомендуемые сообщения

Всем доброго времени суток. Нуждаюсь в помощи. Делаю дипломный проект, с изготовлением устройства. Решил делать на AVR, в этом деле я\ новичек, так что заранее прошу прощение за глупые вопросы. Само устройство представляет из себя часы c боем. С реализацией функции часов у меня проблем не возникло, благо в сети все разжевано.

А вот с боем возникли проблемы, прочитав у Белова про воспроизведение по нотам - тут все понятно и просто, но так не получится реализовать именно бой (удар по колоколу), да и нот я не знаю.

Погуглив немного, узнал что можно воспроизводить wav, тоже ничего сложного, убираем заголовочный файл в hex wav'ки и остальное выводим с частотой дискретизации файла на динамик.

Поскольку wav довольно увесисты, в интернете везде используется внешняя память, либо епромки, либо сд\ммс карты. В моем случае, она весит

около 12 кб, программа около 3 кб, т.е остается еще достаточно места.

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

как это реализовать?

Делаю проект в CodeVisionAVR

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Делаете массив

flash unsigned char data[12288]= {}; // данные из wave файла

и выдергиваете из него данные на воспроизведение.

Изменено пользователем солар

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

в Студии так

#include <avr/pgmspace.h> //заголовок для работы с внутренней памятью
...
PROGMEM char wavdata[]={...}; //чтобы данные были именно во флеш-памяти. К тому же удобно вынести сами данные в отдельный файл, чтобы не мешали
...
char temp=pgm_read_byte(addr); //считывание байта по указанному адресу

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

http://radiokot.ru/c...igital/game/25/

Здесь на кнопки звук и при включении, ну и просто с флешки воспроизводит wav,

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

Изменено пользователем Panda_y2k

Купи два беляша и собери из них кошку

Labor est etiam ipse voluptas Труд уже сам по себе есть наслаждение (*Формула любви)

Ave novie-nostra ales Если один человек построил - другой завсегда разобрать может....(*Формула Любви).

Ссылка на комментарий
Поделиться на другие сайты

Делаете массив

flash unsigned char data[12288]= {}; // данные из wave файла

и выдергиваете из него данные на воспроизведение.

А как собственно считывать по байту и определить когда заканчивается мелодия? Мне нужно создавать какую-то переменную, в которую будет записываться значение из массива, и в прерывании по таймеру (с частотой дискретизации файла) выводится на OCR1A, как это организовать: считать байт по адресу (из массива?), записать его в переменную и вывести на ШИМ? Вам не сложно какой-нибудь пример кода показать?

interrupt [TIM2_COMP] void timer2_comp_isr(void) // прерывание, в котором подставляются значения
{
OCR1A = ???; // можно ли здесь как-то вывести весь массив?
}

Изменено пользователем Menseu
Ссылка на комментарий
Поделиться на другие сайты

flash unsigned char data[12288]= {}; // данные из wave файла

А в прерывании таймера

//Если надо проиграть мелодию, выставляете в программе флаг /flag=1;/

if(flag) { // если флаг равен 1 играем мелодию

OCR1A=data;

i++;}

if(i==12288) {flag=0;OCR1A=0;} // если проиграли всю мелодию, сбросить флаг в 0

Изменено пользователем andryxa
Ссылка на комментарий
Поделиться на другие сайты

В wav-файле записаны амплитуды, а не ШИМ. Нужно выводить на ЦАП, внешний, хотя бы резистивный. Ну а суть чтения из массива andryxa прописал верно. Единственное, я бы прописал:

if(i>=12288)

Я не раздаю удочки. Я продаю рыбу.

Ссылка на комментарий
Поделиться на другие сайты

Как я понял, в массиве мне нужно указывать hex в форме 0х00 и разделять запятой, есть какой-нибудь hex редактор, который байты в таком виде сразу отображает и, по возможности, как-то разделить их запятой?

flash unsigned char data[4]={0x1,0x9,0x1a,0x1b};

В wav-файле записаны амплитуды, а не ШИМ. Нужно выводить на ЦАП, внешний, хотя бы резистивный.

Я смотрел примеры в интернете, там выводят через ШИМ, хоть и будет низкое быстродействие, мне ведь качественный звук ненужен, я собираюсь секундную wav 8 бит и частотой 8 кГц выводить, или все же лучше на ЦАП делать, R2R?

Ссылка на комментарий
Поделиться на другие сайты

В wav-файле записаны амплитуды, а не ШИМ.

А в регистр аппаратного шим вы пишете не значение амплитуды?

я бы прописал:
if(i>=12288)

Я тоже, просто не хотел получить лишних вопросов...

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...