Wav плеер

Обсуждаем контроллеры компании Atmel.
Ответить
Аватара пользователя
Andrey27
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 11, 2014 23:24:21

Wav плеер

Сообщение Andrey27 »

Доброй ночи всем. Спаял wav плеер на Atmega16 + MiroSD. Записал песню с помощю 16-ого редактора начиная с 0-ого сектора флешки. Побайтно читаю и с помощю ШИМ воспроизвожу. Все отлично играет 44100,8бит,стерео. Потом я узнал что есть библиотека Чана для работы с FAT. Разобрался с библиотекой, написал код для вопроизведения. Прошил, включил, играет но со щелчками, пиками и др. Посмотрите на код может кто увидет ошибку:

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

#include <mega16.h>
#include <delay.h>
#include <lcd.h>
#include "diskio.h"
#include "pff.h"

#define _XTAL_FREQ 16000000

#asm
 .equ __lcd_port = 0x1b
#endasm 
       
unsigned char buff[512];     // буфер аудиоданных
volatile unsigned int n = 0; // счетчик.
                         
interrupt[TIM0_OVF] void Timer0_OVF_8bit (void)
 {
   OCR1AL = buff[n];     // помещение аудиоданных в шим каналы
   OCR1BL = buff[n+1];
   n = n + 2;            // счетчик крутим по кольцу.
   if (n > 511) n = 0;
   TCNT0 = 0xd3;         // 2000000 / (256 - 211) = 44.444 почти 44.100 :)
 }
       
void main(void)                 
 {
   FATFS FS;   
   WORD bt;
   unsigned char p = 0;
   DDRD = 0xff;          // Выходы ШИМ на выход настр.
   PORTD = 0xff;
   TCCR1A = 0b10100001;  // Нормамльный режим FAST PWM 8bit
   TCCR1B = 0b00001001;  // Тактирование f/1 т.е 16 Mhz / 256 = 62,5 Khz ШИМ.
   OCR1AL = 0x80;        // 50% сигнал на ШИМ
   OCR1BL = 0x80;
   lcd_init(16);     
   delay_ms(1000);   
   lcd_gotoxy(0,0);   
   if (disk_initialize() == 0) lcd_putsf("SD_Init - OK    "); else lcd_putsf("SD_Init - Error ");
   delay_ms(1000);   
   lcd_gotoxy(0,0);
   if (pf_mount(&FS) == 0) lcd_putsf("FAT_Init - OK   "); else lcd_putsf("FAT_Init - Error ");   
   delay_ms(1000);   
   lcd_gotoxy(0,0);
   if (pf_open("1.wav") == 0) lcd_putsf("1.wav - Open    "); else lcd_putsf("File - Error   ");   
   delay_ms(1000);   
   lcd_gotoxy(0,0);
   TCCR0 = 0b00000010;   // Тактирование таймера0 f/8 16 Mhz / 8 = 2Mhz.
   TIMSK = 0x01;         // Вкл. Таймер0
   #asm("sei")           
   lcd_putsf("Play            ");   
  while(1)
   {
    if (!p && n > 255)  // Если первая половина буфера проиграна то...
     {                     
      pf_read(&buff[0], 256, &bt);   // Считать в первую половину новые данные.
      p = 1;
      if (bt < 256) break;           // Конец файла.
     } 
     if (p && n < 256)  // Если вторая половина буфера проиграна то...
     {
      pf_read(&buff[256], 256, &bt); // Считать в вторую половину новые данные.
      p = 0;
      if (bt < 256) break;          // Конец файла.
     }
   }   
 }
Аватара пользователя
Andrey27
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 11, 2014 23:24:21

Re: Wav плеер

Сообщение Andrey27 »

Ошибку нашел. Кому интересно, то ошибка была в скорости чтения: 8бит 44100 стерео = 705,6 Кбит/с а скорость чтения файла с флешки через FAT при 16Мгц ~300 Кбит/с. Буду смотреть теперь на какой частоте работает SPI может не на максимум или попытаться програмный SPI сделать поидеи он быстрее будет в 2 раза.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Wav плеер

Сообщение Engineer_Keen »

Andrey27 писал(а):Буду смотреть теперь на какой частоте работает SPI может не на максимум

Инициализации SPI в программе не видно, но она где-то должна быть, т.к. по умолчанию SPI нифига не мастер и вообще отключен. Скорость задается в регистрах SPCR (биты SPR1,SPR0) и SPSR (бит SPI2X), более подробно в даташите.
Andrey27 писал(а):или попытаться програмный SPI сделать поидеи он быстрее будет в 2 раза.

Ни коим образом программный SPI (как и любой другой интерфейс) не может быть быстрее аппаратного. Максимальная скорость аппаратного SPI: XTAL_FREQ/2, программно чтобы только дергнуть один раз SCK раз нужно уже 4 такта, установка MOSI даст еще 5-6, чтение MISO еще пару + проверка длины слова...
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
Andrey27
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 11, 2014 23:24:21

Re: Wav плеер

Сообщение Andrey27 »

Спасибо за подсказку. Проверил SPI работает на максимум F/2. Посмотрю модуль реалезации FAT может можно упростить выкинуть лишнии функции, фрагментацию файлов. Хочеться всетаки вопроизвести стерео треки нормального качества.
NicBenkly
Родился
Сообщения: 1
Зарегистрирован: Вт ноя 04, 2014 17:53:33

Re: Wav плеер

Сообщение NicBenkly »

Добрый день!
Подскажите, Вам удалось доработать wav плеер?
Не могли бы вы выложить исходники для Atmega16 с библиотеками (diskio, pff...).
Спасибо.
Аватара пользователя
Andrey27
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 11, 2014 23:24:21

Re: Wav плеер

Сообщение Andrey27 »

Да разобрался. Wav 32000кГц, 8бит, стерео воспроизводит. Будут вопросы задавайте :)
Вложения
Atmega16.rar
(85.88 КБ) 224 скачивания
Twin20
Открыл глаза
Сообщения: 79
Зарегистрирован: Вс июн 23, 2013 10:36:15
Откуда: г. Москва СВАО

Re: Wav плеер

Сообщение Twin20 »

Пожалуйста выложите схему.
Ни кто кроме нас, инженеров.
Ответить

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