ЦАП в AVR через ШИМ и вывод звука .WAV

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение USER777 » 03 июн 2009, 21:34

Привет всем!
Сделал по http://eldigi.ru/site/house/18.php(там исходник на ИАР), только вывел на ШИМ +добавил буфер 256 байт, чтобы не было паузы во время чтения с флеш (кварц 24.576 МГц (во время прошивания устанавливал 16 Мгц, иначе не шьеться)), звук
8 бит дискр 44100 Гц моно, вполне приемлемо для игрушек. флешка Микро СД 512 МБ,
питание от аккумулятора сотика + усилитель от китайского радио.
вот здесь поменял часть кода исходника
Код: Выделить всё
/*
---------------------------------------------------------------------------------------------
   Глобальные переменные
---------------------------------------------------------------------------------------------
*/

unsigned int   count=0;// счетчик байт

unsigned char data[257]; //буфер от пауз
unsigned char         song;
unsigned char         play;
unsigned char         gotoNextSong;

__flash char         FileNames [10][11] =
{
   "muson01.wav","muson02.wav","muson03.wav","muson04.wav","muson05.wav",
   "muson06.wav","muson07.wav","muson08.wav","muson09.wav","muson10.wav"
};

/*
=============================================================================================
   Проверка заголовка WAV файла на соответсвие параметрам воспроизведения.
   Формат WAV файла должен быть:   PCM 8 бит 16000 КГц Моно.
=============================================================================================
*/
unsigned char WaveComp (char const __flash name[])
{
   //~~~~~~~~~~~~~
   FILE      *f;
   TitleWave   tw;
   //~~~~~~~~~~~~~

   f = fopenc(name,READ);
   if ( f==0 ) return (1);                           // Не открыть файл
   fread(&tw,sizeof(TitleWave),1,f);
   fclose(f);
   
   if ( strncmp_G(tw.id_riff,"RIFF",4) != 0 ) return (1);   // Не совпал идентификатор RIFF
   if ( strncmp_G(tw.id_chuck,"WAVE",4) != 0 ) return (1);   // Не совпал идентификатор CHUCK
   if ( strncmp_G(tw.fmt,"fmt ",4)!= 0 ) return (1);      // Не совпал идентификатор FMT
   if ( tw.type != 1 ) return (1);                     // Тип данных - не выборка
   if ( tw.channels != 1 ) return (1);                  // Не моно
   //if (( tw.freq != 16000 )) return (1);               // Не 16000 КГц
   //if (( tw.bytes != 16000 )) return (1);
   
        if ( tw.bits != 8 ) return (1);                        // Не 8 бит
   
     
   return (0);
}

/*
=============================================================================================
   MAIN.
=============================================================================================
*/
void main ()
{
unsigned int i=0;

   //~~~~~~~~~~
   FILE   *fp;
   //~~~~~~~~~~
   
        OCR2=0x80;
         SPSR = 0x01; //setup SPI
         //start
                         
   while (!initialize_media()){};
   
   
   
   PORTD_Bit2 = 1;
   PORTD_Bit3 = 1;
       
         
       
   // Sleep enable
   MCUCR |= (1 << SE);
   
   // External Interrupts enable
   GICR |= (1 << INT1)|(1 << INT0);
   
   



   SEI();
       
       
   while(1)
   {
      if (play)
      {
         GICR &= ~(1 << INT0);
         // Timer/Counter 0 initialization
         TCCR0 |= (1 << CS01);
         
         // Timer(s)/Counter(s) Interrupt(s) initialization
         TIMSK |= (1 << TOIE0);
                       
         if (!WaveComp (FileNames[song]))
         {
            fp = fopenc(FileNames[song], READ);
                         OCR2  = 0x80;       
                         DDRD = 0x80;       
          TCCR2 = 0x69;
            while ( ((fp -> position) < (fp -> length)) && !gotoNextSong )
            {
                                 
                                  while (!count)
                                   
                                  {
                                   
                            for (i=0;i<256;i++)
                            {
                           data[i]=fgetc(fp);
                            }
                                  }
                         
                               
                                SLEEP();
            }
                             
                            DDRD = 0x00;
            fclose(fp);
            if (!gotoNextSong) play = 0;
            gotoNextSong = 0;
         }
         else song = 0;
         TCCR2 = 0x00;
         // Stop Timer0
         TCCR0 &= ~(1 << CS01);
         TIMSK &= ~(1 << TOIE0);
         GICR |= (1 << INT0);
                       
      }
      else SLEEP();
   };
}

/*
=============================================================================================
   Timer0 interrupt.
=============================================================================================
*/
#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_Ovf (void)
{
TCNT0 = 0xBD;
OCR2=data[count];
if (count<255) count++;else count=0;

}

/*
USER777
 
Сообщения: 50
Зарегистрирован: 03 июн 2009, 21:16
Откуда: пос. Актюбинский
Skype: ffaanniiss777

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение Digit » 04 июн 2009, 08:29

это Вы хвастаетесь? Или что-то спрашиваете?
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение ALHIMIK » 04 июн 2009, 09:38

по моему 1 вариант бедная мега на 24.576 МГц :crazy:
Аватара пользователя
ALHIMIK
 
Сообщения: 997
Зарегистрирован: 05 окт 2008, 14:41
Откуда: СПб
прог. языки: C,Python

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение MiBBiM » 04 июн 2009, 14:33

как 32я может на 24МГц запуститься? может несколько импульсов с кварца за период она просто проглатывает?
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение galex1981 » 04 июн 2009, 14:35

на 24 Мгц, мега32 вообще не запускается.
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4363
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение SERGEY_M » 04 июн 2009, 14:47

Я проверял штук 5 МЕГ128 и штук 10 МЕГ16
все запустились на 20 МГц, пару штук програмиться не хотели, но работали
на 25 МГц ниодна не шилась и пару МЕГ16 как-то работало (АЦП сбоил)...
так что все может быть :)
Аватара пользователя
SERGEY_M
 
Сообщения: 682
Зарегистрирован: 20 мар 2009, 12:45
Откуда: Украина, Одесса
ФИО: Сергей

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение galex1981 » 04 июн 2009, 15:33

Единичный экземпляр может и будет работать, но ИМХО нестабильно
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4363
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение USER777 » 04 июн 2009, 17:03

мега32 работала и на 25 и на 27Мгц, сегодня проверял.
Поет быстрее.
Для серьезных проектов не рискнул бы.А для игрушек пойдет.
Не шьется эт факт!
Шить нужно при стандартных частотах, а затем перепаивать кварц.
Чем спорить (может не может) попробуйте.
USER777
 
Сообщения: 50
Зарегистрирован: 03 июн 2009, 21:16
Откуда: пос. Актюбинский
Skype: ffaanniiss777

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение galex1981 » 04 июн 2009, 17:09

Пробовал, мега32 больше 20 не работала (хотя на корпусе 16 мгц), мега88 и на 25 мгц работала, больше кварца не было - не проверял
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4363
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение USER777 » 04 июн 2009, 17:14

Вообще у меня Atmega32L питал 3.7 вольта, по даташиту до 8 МГц.Как проц может работать на 27 МГц расщитанный на 8? Но ведь работает.
Если просто нужен звук то пойдет.
USER777
 
Сообщения: 50
Зарегистрирован: 03 июн 2009, 21:16
Откуда: пос. Актюбинский
Skype: ffaanniiss777

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение blindman » 04 июн 2009, 17:18

Нечего спорить. Попадаются экземпляры которые удаётся разогнать, попадаются и такие, что не разгоняются. Для единичного изделия разгонять можно, если рассчитывать на повторяемость - надо соблюдать рекомендации производителя
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение MiBBiM » 04 июн 2009, 17:19

MiBBiM писал(а):может несколько импульсов с кварца за период она просто проглатывает?

т.е. кварц-то на 24, но мега в реале работает медленнее
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение USER777 » 04 июн 2009, 17:24

Если бы она работала помедленнее с 24, какой резон ставить такой кварц. Просто 16 не хватило
для звука с дискр 44100,для 32000 16 Мгц вполне(прошивка такая).
по материалам http://eldigi.ru/site/house/18.php прошивка исходник (http://ifolder.ru/12499310) с шим, wav с дискр 44100 8 bit mono
ссылка до 06.07.09
Без огранич
code.rar
Тоже самое
(317.58 КиБ) Скачиваний: 62
USER777
 
Сообщения: 50
Зарегистрирован: 03 июн 2009, 21:16
Откуда: пос. Актюбинский
Skype: ffaanniiss777

Re: ВАВ через ШИМ

Сообщение shome » 07 дек 2010, 00:02

=DeaD= писал(а):А в чем проблема? Как выдать на ШИМ нужную скважность или что?

Добавлено спустя 1 минуту 48 секунд:
Допустим у вас дискретизация 8 бит, 44КГц, 44000 раз в секунду ставите прерывание и в нём берете очередной байт и выставляете в него скважность ШИМ. Готово.


А как при эом будет с realtime'овостью? То же использование в роботе - получится 1) одновременно крутить сервами, анализировать датчики, просчитыват путь и реакцию, и 2) чтобы звук не затыкался?
shome
 
Сообщения: 1
Зарегистрирован: 06 дек 2010, 23:59

Re: ЦАП в AVR через ШИМ и вывод звука .WAV

Сообщение USER777 » 23 фев 2011, 16:18

Вот еще wav плеер на Atiny2313 16MHz mmc fat16 mono 16bit
Изображение
Исходный код на IAR
http://narod.ru/disk/6206592001/IAR_WAV%2B2.rar.html
USER777
 
Сообщения: 50
Зарегистрирован: 03 июн 2009, 21:16
Откуда: пос. Актюбинский
Skype: ffaanniiss777

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33