Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Исследование вариантов озвучивания с помощью МК


Исследование вариантов озвучивания с помощью МК

Сообщений 1 страница 8 из 8

1

Исследование вариантов озвучивания с помощью МК

+1

2

Готовый модуль, из серии "WTV020" для воспризведения аудио файлов в формате wav и ad4, конвертер и всё остальное, можно скачать с яндекс диска ниже.

Где купить 

Исходник + фото + видео + сопутствующие материалы  -  скачать

http://s8.uploads.ru/t/M7taT.png http://s8.uploads.ru/t/wqKfg.jpg
http://s8.uploads.ru/t/FQIeE.jpg http://s8.uploads.ru/t/j1ktH.jpg
http://s8.uploads.ru/t/3zuZ5.jpg http://s8.uploads.ru/t/IcoYV.jpg

+1

3

Чип, одноразово программируется производителем модулей, изменить ничего нельзя!

Есть модули, которые работают, только в кнопочном режиме, уточняйте у продавца!

Формат воспроизводимых файлов:

"wav"  или  "ad4"   -  частота дискетизации, не более 36 кГц

SD карта  -  FAT16, не более 2 Гбайт, проверено неоднократно.

+1

4

Воспроизведение звука с 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 (образ флешки + видео)

Симуляция
http://s8.uploads.ru/t/ZhDyl.jpg

Воспроизводится тестовый файл, записан с генератора Г3-118, частота 1 кГц
http://s8.uploads.ru/t/P7CQO.jpg

Воспроизводится музыка
http://s8.uploads.ru/t/wAt0D.jpg

+1

5

Вариант с байтовым массивом  -  2 х 200 байт, качество воспризведения похуже, но приемлемо.

Симуляция та-же, обработчик прерывания на ASM AVR, т.к., используются байтовые переменные, скорость работы значительно выше. У МК остаётся больше времени для других задач.

Исходник  расчитан на 18.432 МГц

$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 1

      Chdir "\"
        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 1

      Chdir "\"
        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 1

      Chdir "\"
        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 1

      Chdir "\"
        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 1

      Chdir "\"
        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 1

      Chdir "\"
        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(#номер_порта) <> 0

    Play_buffer_wav = 0
    Disable Timer2
    Stop Timer2
    Timer2 = Const_доп_делитель_timer2

    Close #номер_порта
'-------------------------------------------------------------------------------
  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
'===============================================================================

http://s8.uploads.ru/t/qCH2J.jpg

0

6

Вариант с частотой МК 8 МГц, 2 х 200 байт, качество воспризведения похуже, но приемлемо, частота дискретизации только 11025 Гц.

Симуляция + исходник + образ SD карты  -  скачать

http://s8.uploads.ru/t/zsJfR.jpg

+1

7

Atmega328P + имя файла.WAV с SD карты

Симуляция + HEX  -  скачать

http://s1.uploads.ru/t/JMG1I.jpg

+2

8

Обновлено 30.01.2022

Исходник (Bascom 2.0.7.1) + документация + аудио (3 варианта боя курантов)  -  скачать с google_disk

Картинки

http://s0.uploads.ru/t/lwuGp.jpg http://s4.uploads.ru/t/QwihE.jpg
http://sh.uploads.ru/t/N1nYD.jpg http://s5.uploads.ru/t/phY13.jpg
http://s9.uploads.ru/t/wXURF.png http://sa.uploads.ru/t/ALsYk.png
http://sh.uploads.ru/t/xyBvR.jpg http://s7.uploads.ru/t/biuPY.png

0


Вы здесь » Программирование ATMEL в BASCOM. » Примеры применения в среде Баском » Исследование вариантов озвучивания с помощью МК