Исследование вариантов озвучивания с помощью МК
Исследование вариантов озвучивания с помощью МК
Сообщений 1 страница 8 из 8
Поделиться22015-03-30 11:14:24
Готовый модуль, из серии "WTV020" для воспризведения аудио файлов в формате wav и ad4, конвертер и всё остальное, можно скачать с яндекс диска ниже.
Исходник + фото + видео + сопутствующие материалы - скачать
Поделиться32015-03-30 13:54:02
Чип, одноразово программируется производителем модулей, изменить ничего нельзя!
Есть модули, которые работают, только в кнопочном режиме, уточняйте у продавца!
Формат воспроизводимых файлов:
"wav" или "ad4" - частота дискетизации, не более 36 кГц
SD карта - FAT16, не более 2 Гбайт, проверено неоднократно.
Поделиться42015-03-31 17:41:45
Воспроизведение звука с SD карты силами Atbanned284 и TDA7052
Используется библиотека AVR-DOS
Для хорошего качества воспроизведения, нужна двойная буфферизация. Используются 2 буфера по 1500 байт. Пока один играет, другой заполняется.
Аудио файлы необходимо предварительно подготовить, а именно: переконвертировать (я использую AIMP2 (простой в использовании и нет ограничений на MP3, как в AIMP3)) в формат WAV; моно; частота дискретизации та, которая будет использоваться.
В нижепреведённом архиве есть образ флешки где записаны все воспроизводимые файлы + в качестве бонуса, записи боя настенных часов (1...12 перезвонов), писал со своих часов "Янтарь - 1957"
В исходнике реализованы 3 варианта дискретизации - 11025 Гц; 22050 Гц; 44100 Гц + регулировка громкости и скорости воспроизведения.
Симуляция (Протеус 7.10) + исходник (Bascom 2.0.7.1) + видео - скачать ВНИМАНИЕ ~ 120 Mb (образ флешки + видео)
Воспроизводится тестовый файл, записан с генератора Г3-118, частота 1 кГц
Поделиться52015-04-01 05:46:28
Вариант с байтовым массивом - 2 х 200 байт, качество воспризведения похуже, но приемлемо.
Симуляция та-же, обработчик прерывания на ASM AVR, т.к., используются байтовые переменные, скорость работы значительно выше. У МК остаётся больше времени для других задач.
$map
$regfile = "m1284pdef.dat"
$crystal = 18432000
$framesize = 512
$hwstack = 512
$swstack = 512
$baud = 115200 ' !!! ВНИМАНИЕ !!! Залит Bootloader'-------- Настройка ножки МК для осциллографа (для измерений) ----------------
' Осциллограф Alias Portf.0 : Config Portf.0 = Output : Reset Осциллограф'===============================================================================
' П О Д К Л Ю Ч Е Н И Е К О Н Ф И Г У Р А Ц И О Н Н Ы Х М О Д У Л Е Й
'===============================================================================$include "Готовые модули\Настройка SD карты rus.bas"
'===============================================================================
' Настройка таймера для загрузки данных в аппаратный ШИМ
'===============================================================================
' И С П О Л Ь З У Е М Ы Е К О Н С Т А Н Т Ы
'===============================================================================
Const Prescale_timer2 = 8 ' Величина постоянная, иначе пересчёт формулы
Const Constanta_wav = 262 ' Может изменяться на ± 1, в зависимости от частоты МК
Const Const_bufer_wav = 200 ' Двойной буфер (400 байт) для воспоизведения WAV файла
Const Frequency_sampling = 22050 ' 11025; 22050; 44100;Const Const_доп_делитель_timer2 = Constanta_wav -((_xtal / Prescale_timer2) / Frequency_sampling ) ' 18.432 МГц
Dim Speed_play As Byte : Speed_play = Const_доп_делитель_timer2
Config Timer2 = Timer , Prescale = Prescale_timer2 , Clear Timer = 0 ' PRESCALE= 1|8|64|256|1024
On Timer2 Обработка_прерывания_timer2 Nosave ' Подпрограмма для обработки прерывания
Stop Timer2
Timer2 = Const_доп_делитель_timer2 ' Закидываем значение дополнительного делителя в TIMER2'===============================================================================
' Настройка таймера для генерации ШИМа на аппаратном уровне
'===============================================================================
Config Timer1 = Pwm , Prescale = 1 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up ' COMPARE A PWM = CLEAR UP| CLEAR DOWN | DISCONNECT
Ocr1b = 0'===============================================================================
' И С П О Л Ь З У Е М Ы Е П Е Р Е М Е Н Н Ы Е
'===============================================================================
Dim Volume As Byte
Dim Play_buffer_wav As Byte
Dim Count_byte_wav_pwm As Byte
Dim Flag_buffer_reproduced As Byte
Dim 1_buffer_wav(const_bufer_wav) As Byte
Dim 2_buffer_wav(const_bufer_wav) As Byte'===============================================================================
' И С П О Л Ь З У Е М Ы Е П О Д П Р О Г Р А М М Ы
'===============================================================================
Declare Sub Play_wav(byval Name_wav_file_str As String * 15 , Byval Copy_byte As Byte)'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
' З А П У С К И П Р Е Д В А Р И Т Е Л Ь Н Ы Е Н А С Т Р О Й К И
'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\'\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
'-------------- Разрешаем работу необходимых прерываний ----------------------
'------------ Разрешаем работу всех включенных прерываний --------------------
Enable Interrupts
'###############################################################################' Г Л А В Н Ы Й Ц И К Л
Главный_цикл:
'###############################################################################'================= 11025 Гц ==================================================
#if Frequency_sampling = 11025
Chdir "\"
Chdir "Test_wav"
Chdir "11_kHz"
Play_wav "1khz_11.wav" , 50 : Wait 1Chdir "\"
Chdir "Clockwav"
Chdir "11_kHz"
Chdir "Hour"
Play_wav "Hour_1.wav" , 50 : Wait 1
Play_wav "Hour_2.wav" , 50 : Wait 1
Play_wav "Hour_3.wav" , 50 : Wait 1
Play_wav "Hour_4.wav" , 50 : Wait 1
Play_wav "Hour_5.wav" , 50 : Wait 1
Play_wav "Hour_6.wav" , 50 : Wait 1
Play_wav "Hour_7.wav" , 50 : Wait 1
Play_wav "Hour_8.wav" , 50 : Wait 1
Play_wav "Hour_9.wav" , 50 : Wait 1
Play_wav "Hour_10.wav" , 50 : Wait 1
Play_wav "Hour_11.wav" , 50 : Wait 1
Play_wav "Hour_12.wav" , 50 : Wait 1Chdir "\"
Chdir "Musik"
Chdir "11_kHz"
Play_wav "Prud_11.wav" , 50 : Wait 1
Play_wav "Ameno_11.wav" , 50 : Wait 1
Play_wav "Tango_11.wav" , 50 : Wait 1
Play_wav "Viv_11.wav" , 50 : Wait 1
Play_wav "Shtor_11.wav" , 50 : Wait 1
Play_wav "Fuga_11.wav" , 50 : Wait 1
#endif'================= 22050 Гц ==================================================
#if Frequency_sampling = 22050
Chdir "\"
Chdir "Test_wav"
Chdir "22_kHz"
Play_wav "1khz_22.wav" , 50 : Wait 1Chdir "\"
Chdir "Clockwav"
Chdir "22_kHz"
Play_wav "Hour_1.wav" , 50 : Wait 1
Play_wav "Hour_2.wav" , 50 : Wait 1
Play_wav "Hour_3.wav" , 50 : Wait 1
Play_wav "Hour_4.wav" , 50 : Wait 1
Play_wav "Hour_5.wav" , 50 : Wait 1
Play_wav "Hour_6.wav" , 50 : Wait 1
Play_wav "Hour_7.wav" , 50 : Wait 1
Play_wav "Hour_8.wav" , 50 : Wait 1
Play_wav "Hour_9.wav" , 50 : Wait 1
Play_wav "Hour_10.wav" , 50 : Wait 1
Play_wav "Hour_11.wav" , 50 : Wait 1
Play_wav "Hour_12.wav" , 50 : Wait 1Chdir "\"
Chdir "Musik"
Chdir "22_kHz"
Play_wav "Prud_22.wav" , 50 : Wait 1
Play_wav "Ameno_22.wav" , 50 : Wait 1
Play_wav "Tango_22.wav" , 50 : Wait 1
Play_wav "Fuga_22.wav" , 50 : Wait 1#endif
'================= 44100 Гц ==================================================
#if Frequency_sampling = 44100
Chdir "\"
Chdir "Test_wav"
Chdir "44_kHz"
Play_wav "1khz_44.wav" , 50 : Wait 1Chdir "\"
Chdir "Clockwav"
Chdir "44_kHz"
Chdir "Hour"
Play_wav "Hour_1.wav" , 50 : Wait 1
Play_wav "Hour_2.wav" , 50 : Wait 1
Play_wav "Hour_3.wav" , 50 : Wait 1
Play_wav "Hour_4.wav" , 50 : Wait 1
Play_wav "Hour_5.wav" , 50 : Wait 1
Play_wav "Hour_6.wav" , 50 : Wait 1
Play_wav "Hour_7.wav" , 50 : Wait 1
Play_wav "Hour_8.wav" , 50 : Wait 1
Play_wav "Hour_9.wav" , 50 : Wait 1
Play_wav "Hour_10.wav" , 50 : Wait 1
Play_wav "Hour_11.wav" , 50 : Wait 1
Play_wav "Hour_12.wav" , 50 : Wait 1Chdir "\"
Chdir "Musik"
Chdir "44_kHz"
Play_wav "Sting_44.wav" , 50 : Wait 1
Play_wav "Tango_44.wav" , 50 : Wait 1
Play_wav "Fuga_44.wav" , 50 : Wait 1#endif
' Idle
'###############################################################################
!jmp Главный_цикл
End
'###############################################################################'===============================================================================
' П О Д К Л Ю Ч Е Н И Е Р А Б О Ч И Х М О Д У Л Е Й
'==============================================================================='===============================================================================
Sub Play_wav(byval Name_wav_file_str As String * 15 , Byval Copy_byte As Byte)
'-------------------------------------------------------------------------------
Имя_файла_str = Name_wav_file_str ' Забираем имя файла
Volume = Copy_byte ' Забираем громкость воспроизведения
Номер_порта = Freefile() ' Получаем свободный порт
Open Имя_файла_str For Binary As #номер_порта 'Открываем файл
Адрес_чтения_sdcard_long = 44 ' Начинаем читать с 44 байта, тем самым пропуская заголовок WAV файла и тем самым убираем щелчки.'Заполняем 1 буфер, чтобы не теряя времени начать воспроизведение
Get #номер_порта , 1_buffer_wav(1) , Адрес_чтения_sdcard_long , Const_bufer_wavАдрес_чтения_sdcard_long = Адрес_чтения_sdcard_long + Const_bufer_wav
Count_byte_wav_pwm = 0
Play_buffer_wav = 255
Flag_buffer_reproduced = 1
Timer2 = Const_доп_делитель_timer2
Start Timer2
Enable Timer2'Заполняем поочерёдно буфера
Do
If Play_buffer_wav = 0 Then
Get #номер_порта , 1_buffer_wav(1) , Адрес_чтения_sdcard_long , Const_bufer_wav
Чтение_wave_1:
If Flag_buffer_reproduced <> 1 Then
Goto Чтение_wave_1
End If
Else
Get #номер_порта , 2_buffer_wav(1) , Адрес_чтения_sdcard_long , Const_bufer_wav
Чтение_wave_2:
If Flag_buffer_reproduced <> 2 Then
Goto Чтение_wave_2
End If
End If
Адрес_чтения_sdcard_long = Адрес_чтения_sdcard_long + Const_bufer_wav
Toggle Play_buffer_wav
Loop Until Eof(#номер_порта) <> 0Play_buffer_wav = 0
Disable Timer2
Stop Timer2
Timer2 = Const_доп_делитель_timer2Close #номер_порта
'-------------------------------------------------------------------------------
End Sub 'Return
'==============================================================================='===============================================================================
Обработка_прерывания_timer2: ' Время обработки прерывания 55 тактов + 8 тактов вход + 5 тактов выход
'-------------------------------------------------------------------------------
'Т.к. будем использовать логические операции, !!! ОБЯЗАТЕЛЬНО сохраняем SREG !!!
!push R16
!in R16 , sreg
!push R16
'Т.к. используются подпрограммы !!! ОБЯЗАТЕЛЬНО сохраняем региcтровую пару R28:R29 (Y), иначе работать не будет !!!
!push R28
!push R29!lds R16 , {Count_byte_wav_pwm} ' Читаем из переменной "Count_byte_wav_pwm"
!inc R16 ' Увеличиваем на 1!ldi R29 , Const_bufer_wav ' Читаем константу
!inc R29 ' Увеличиваем на 1
!cp R16 , R29 ' если Count_byte_wav_pwm > 200 тогда
!BRLO Обработка_прерывания_timer2_1 ' Перейти если меньше
!ldi R16 , 1 ' Загружаем 1Обработка_прерывания_timer2_1:
!sts {Count_byte_wav_pwm} , R16 ' Сохраняемся в переменную "Count_byte_wav_pwm"
!lds R28 , {Play_buffer_wav} ' Сохраняемся в переменную "Play_buffer_wav"
!cpi R28 , 0 ' Сравнение с "0"
!BREQ Обработка_прерывания_timer2_2 ' Перейти если равноLoadadr 1_buffer_wav(count_byte_wav_pwm) , Y ' Узнаём адрес массива
!cpi R16 , 1 ' Сравнение с "1"
!brne Обработка_прерывания_timer2_3 ' Перейти если не равно
!ldi R16 , 2 ' Загружаем 2
!rjmp Обработка_прерывания_timer2_3 ' ПерейтиОбработка_прерывания_timer2_2:
Loadadr 2_buffer_wav(count_byte_wav_pwm) , Y ' Узнаём адрес массива
!cpi R16 , 1 ' Сравнение с "1"
!brne Обработка_прерывания_timer2_3 ' Перейти если равно
!ldi R16 , 1 ' Загружаем 1Обработка_прерывания_timer2_3:
!sts {Flag_buffer_reproduced} , R16 ' Сохраняемся в переменную "Flag_buffer_reproduced"
!ld R16 , Y ' Забираем текущее значение ШИМа из текущего выводимого массива
'Закидываем занчение ШИМа в регистры таймера
!out OCR1Al , R16 ' Первым пишем младший байт регистра
!clr R16 ' Обнуляем регистр
!out OCR1AH , R16 ' Вторым пишем старший байт регистраВыход_прерывания_timer2:
!lds R16 , {Volume}
!out OCR1bl , R16 ' Первым пишем младший байт регистра
!clr R16 ' Обнуляем регистр
!out OCR1bH , R16 ' Вторым пишем старший байт регистра!lds R16 , {Speed_play} ' Читаем переменную
!out tcnt2 , R16 ' Загружаем константу в регистр TIMER0'Восстанавливаем ранее сохранённые регистры и SREG
!pop R29
!pop R28!pop R16
!out sreg , R16
!pop R16
!reti
'-------------------------------------------------------------------------------
Return
'===============================================================================
Поделиться62015-04-01 06:08:25
Вариант с частотой МК 8 МГц, 2 х 200 байт, качество воспризведения похуже, но приемлемо, частота дискретизации только 11025 Гц.
Симуляция + исходник + образ SD карты - скачать
Поделиться82022-01-30 04:04:38
Обновлено 30.01.2022
Исходник (Bascom 2.0.7.1) + документация + аудио (3 варианта боя курантов) - скачать с google_disk
Похожие темы
| Работа со звуком | Путеводитель по Форуму | 2022-02-18 |


















