ATmega168A+звук. Прошу помощи

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 25
Зарегистрирован: Пт ноя 01, 2013 05:13:49

Сообщение qwerty5999 »

Здравствуйте. Мучаю контроллеры AVR пару месяцев. Пытаюсь вывести WAV с sd карты через Atmega 168a. Когда вывожу WAV 11KHz 8bit скорость воспроизведения нормальная, но когда пытаюсь вывести звук с большей дискретизацией воспроизведение замедляется 22KHz на слух в 2 раза медленней играет. Читал и перечитывал даташит, курил сорсы других. Но не могу найти ошибку. Таймеры уже и считал и подставлял всяко-разно. Не могу понять почему регистр OCR2A совершенно не влияет на скорость воспроизведения, но влияет на высоту звука(чем меньше значение тем больше голос мультяшным становится а скорость прежняя). Люди добрые ткните носом где я дурак.

Код: Выделить всё

F_CPU=8000000UL
//питание 3.3 В

//ТАЙМЕРЫ---------------------------------------------
void init_timers(void){
//Fast PWM                таймер0 8 бит


// отчистить OCR0A при совпадении, установить OCR0A в BOTTOM,не инвертирующий режим. FAST PWM
TCCR0A|=(1<<COM0A1)|(0<<COM0A0)|(0<<COM0B1)|(0<<COM0B0)|(1<<WGM01)|(1<<WGM00);// 0b10000011
// прескалер 1
TCCR0B|=(0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00);// 0b00000001
//  прерываний нет
TIMSK0|=(0<<OCIE0B)|(0<<OCIE0A)|(0<<TOIE0); //0b00000000
TCNT0=0x00;
OCR0A=0x80;

//FAST PWM  top OCR2A
//делитель 32
// прерывание OCIE2A

//                                      таймер2    8 бит
//Режим CTC , отчистить таймер при совпадении.
TCCR2A|=(1<<COM2A1)|(0<<COM2A0)|(0<<COM2B1)|(0<<COM2B0)|(1<<WGM21)|(0<< WGM20); //0b10000010
// прескалер F_CPU/32
TCCR2B|=(0<<FOC2A)|(0<<FOC2B)(0<<WGM22)|(0<<CS22)|(1<<CS21)|(1<<CS20); //0b00000011
//прерывание по совпадению с OCR2A
TIMSK2|=(0<<OCIE2B)(1<<OCIE2A)(0<<TOIE2); //0b00000010

ASSR=0x00; //Asynchronous Status Register


/*
8000000/22050/32-1=~10
*/
OCR2A=10;
}

ПРЕРЫВАНИЕ-------------------------------------
ISR(TIMER2_COMPA_vect)
{
OCR0A=sound_buf[sound_bit++];
}

ЧТЕНИЕ С КАРТЫ----------------------------------
void play (char *wav_name)
{

   res=pf_mount(&fs);
   if (res==OK) {
      res=pf_open(wav_name); 
      if (res==OK) 
         res=pf_lseek (0); 
      if (res==OK)
         init_timers();
      while (1)
      {
         if(sound_bit==1)
         {
            pf_read(&sound_buf[128], 128, &s1);
            if(s1<128)
            {
               end_play(); 
               break;
            }
         }
         if(sound_bit==128)
         {
            pf_read(sound_buf, 128, &s1);
            if(s1<128)
            { 
               end_play(); 
               break;
            }
         }
      }
   }
}
Последний раз редактировалось qwerty5999 Пт ноя 01, 2013 22:40:23, всего редактировалось 2 раза.
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Пн авг 06, 2012 10:39:53
Откуда: Москва

Сообщение Unreal_2009 »

Доброго времени суток
Звуковые файлы отличаются только баудрэйтом? У них количество бит на отсчет 8?
Если файлы правильные их размеры должны иметь отношение около 2.

Было бы неплохо более полную версию исходников и воспроизводимые файлы - с баудрэйтом 11 и 22 кгц
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

qwerty5999, во-первых почему для дискретности выбран режим фаст ШИМ с топом в окрА, а не просто СТС с тем же топом, не понятно? во-вторых, у меня получается OCR2A не 22, а 10 , т.е. 8000000/22050/32-1=~10, откуда вы брали такие расчеты?

ps : че за бред, что еще за 256, откуда оно
/*
у нас частота контроллера 8МГц, делитель 32
значит мин.частота шим для прерывания 8000000/(32*256)=976,56Гц
Нам надо прерывание через 22050Гц значит 22050/976,56=22.5
это значит что OCR2A=22,5
*/
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 25
Зарегистрирован: Пт ноя 01, 2013 05:13:49

Сообщение qwerty5999 »

Спасибо за ответы! Файлы правильные оба 8 бит моно у 11КГц битрейт 88 у 22КГц битрейт 176 кбит\сек. В полной версии исходников более ничего нет т.е. вызывается функция play а за ней пустой безконечный цикл. никаких прерываний и т.д нет. По поводу режимов пробовал и fast pwm и ctc разницы никакой и OCR2A ставил 10 и подогнать пытался. При OCR2A=22 звук от 22КГц нормальный(без искажений) а скорость воспроизведения запаздывает раза в 2, а при 10 звук очень резкий с посторонним писком но на скорость воспроизведения это никак не влияет а ведь должно :shock: .


ps : че за бред, что еще за 256, откуда оно
из формулы в даташите
Частота ШИМ =
F OCnxPWM=Fclk_IO/N*256 где N прескаллер


Я за всё это время перебрал все режимы, пытался подогнать OCR2A. И ни разу результат даже не преблизился к желаемому. Так-что помоиму проблема не в 2-м таймере. А вот куда еще копать представить даже не могу :facepalm:
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

А вот это зачем?
// таймер2 8 бит
//Режим FAST PWM , отчистить OCR2A при совпадении, установить OCR2A в BOTTOM,не инвертирующий режим.
TCCR2A|=(1<<COM2A1)|(0<<COM2A0)|(0<<COM2B1)|(0<<COM2B0)|(1<<WGM21)|(1<< WGM20); //0b10000011
Зачем нужен сигнал на ноге? Как вообще подключен спикер, схему выложи что-ли.

pp.s. Да кстати, зачем ШИМ если нужно задать частоту дискретизации, нужен режим СТС, как я уже говорил.
из формулы в даташите
Частота ШИМ =
F OCnxPWM=Fclk_IO/N*256 где N прескаллер
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 25
Зарегистрирован: Пт ноя 01, 2013 05:13:49

Сообщение qwerty5999 »

Полностью согласен что нужен режим СТС. Подключенный вывод только для протеуса нужен был.
Изображение
Странно но в собранном железе что FAST PWM что СТС разницы нет
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 25
Зарегистрирован: Пт ноя 01, 2013 05:13:49

Сообщение qwerty5999 »

Причина найдена. Данные с карточки не успевали считываться т.к. всю работу с картой делал софт.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Пн авг 06, 2012 10:39:53
Откуда: Москва

Сообщение Unreal_2009 »

Ура
Поздравляю ;-) :beer:
Ответить

Вернуться в «AVR»