roboforum.ru

Технический форум по робототехнике.

 

Простая схема аудиоплейера на одном контроллере

Резисторы, транзисторы, конденсаторы, микросборки, чип компоненты ...
Вопросы согласования управляющих модулей с периферией.

Простая схема аудиоплейера на одном контроллере

Сообщение Radist » 13 фев 2010, 09:50

Нашел на днях ссылку интересную, сразу подумал что на роботе этот девайс будет интересен. Столкнулся с препятствием - выругался (или вежливо попросил отойти). Применение одно - робот станет говорить человеческим голосом (или любым другим), а вот ситуаций для применения миллион. В общем смотрите на чудо китайского гения.
http://elm-chan.org/works/sd8p/report.html
Аватара пользователя
Radist
 
Сообщения: 2233
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Простая схема аудиоплейера на одном контроллере

Сообщение =DeaD= » 13 фев 2010, 10:05

Это японец.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24053
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: Pascal / C++ / PHP / 1C
ФИО: Антон Ботов

Re: Простая схема аудиоплейера на одном контроллере

Сообщение Ворон » 13 фев 2010, 13:49

все равно клевый там ролик ))
Ворон
 
Сообщения: 1051
Зарегистрирован: 24 ноя 2008, 19:43
Откуда: Казань

Re: Простая схема аудиоплейера на одном контроллере

Сообщение Michael_K » 13 фев 2010, 14:05

Я делал такую, только вместо карточки пользовал флэшку мегабайтную - дешево и сердито.
Помню, над земфирой издевался :)
Аватара пользователя
Michael_K
 
Сообщения: 6034
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Простая схема аудиоплейера на одном контроллере

Сообщение Doktor » 13 фев 2010, 22:18

Очень заинтересовало! Можно схему? :roll:
Аватара пользователя
Doktor
 
Сообщения: 293
Зарегистрирован: 15 июн 2009, 17:24
Откуда: Омск
Skype: bashnia_a.k.a_doktor
ФИО: Александр

Re: Простая схема аудиоплейера на одном контроллере

Сообщение Radist » 13 фев 2010, 22:58

По той ссылке не одна, а три схемы. Смотрите внимательней. Ссылки для схем находятся под фото макетки.
Аватара пользователя
Radist
 
Сообщения: 2233
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Простая схема аудиоплейера на одном контроллере

Сообщение TrashVigor » 22 фев 2010, 22:03

А как там шим регулируется?
Код: Выделить всёРазвернуть
/*---------------------------------------------------------------*/
/* 8-pin SD audio player R0.03                     (C)ChaN, 2010 */
/*---------------------------------------------------------------*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <string.h>
#include "diskio.h"
#include "pff.h"

#ifndef MODE
#error Wrong make file.
#endif
#define FCC(c1,c2,c3,c4)   (((DWORD)c4<<24)+((DWORD)c3<<16)+((WORD)c2<<8)+(BYTE)c1)   /* FourCC */


/*---------------------------------------------------------*/
/* Work Area                                               */
/*---------------------------------------------------------*/

volatile BYTE FifoRi, FifoWi, FifoCt;   /* FIFO controls */

BYTE Buff[256];      /* Wave output FIFO */

FATFS fs;         /* File system object */
DIR dir;         /* Directory object */
FILINFO fno;      /* File information */

WORD rb;         /* Return value. Put this here to avoid bugs of avr-gcc */



EMPTY_INTERRUPT(WDT_vect);


/*---------------------------------------------------------*/

static
DWORD load_header (void)   /* 0:Invalid format, 1:I/O error, >1:Number of samples */
{
   DWORD fcc, sz;
   UINT i;
   FRESULT res;


   res = pf_read(Buff, 256, &rb);      /* Load file header (256 bytes) */
   if (res) return 1;

   if (rb != 256 || LD_DWORD(Buff+8) != FCC('W','A','V','E')) return 0;

   i = 12;
   while (i < 200) {
      fcc = LD_DWORD(&Buff[i]);   /* FCC */
      sz = LD_DWORD(&Buff[i+4]);   /* Chunk size */
      i += 8;
      switch (fcc) {

      case FCC('f','m','t',' ') :      /* 'fmt ' chunk */
         if (sz > 100 || sz < 16)            /* Check chunk size */
            return 0;
         if (Buff[i+0] != 1)                  /* Check coding type (1) */
            return 0;
         if (Buff[i+2] != 1 && Buff[i+2] != 2)   /* Check channels (1/2) */
            return 0;
         GPIOR0 = Buff[i+2];      /* Channel flag */
         if (Buff[i+14] != 8 && Buff[i+14] != 16)   /* Check resolution (8/16) */
            return 0;
         GPIOR0 |= Buff[i+14];   /* Resolution flag */
         OCR0A = (BYTE)(F_CPU / 8 / LD_WORD(&Buff[i+4])) - 1;   /* Sampling freq */
         break;

      case FCC('f','a','c','t') :      /* 'fact' chunk (skip) */
         break;

      case FCC('d','a','t','a') :      /* 'data' chunk (start to play) */
         fs.fptr = i;
         return sz;

      default :                  /* Unknown chunk (error) */
         return 0;
      }
      i += sz;
   }

   return 0;
}



static
UINT play (
   const char *fn
)
{
   DWORD sz;
   FRESULT res;
   BYTE sw;
   WORD btr;


   if ((res = pf_open(fn)) == FR_OK) {
      sz = load_header();         /* Load file header */
      if (sz < 256) return (UINT)sz;

      if (!TCCR1) {            /* Enable audio out if not enabled */
         PLLCSR = 0b00000110;   /* Select PLL clock for TC1.ck */
         GTCCR =  0b01100000;   /* Enable TC1.OCB as PWM out (L-ch) */
         OCR1B = 128; OCR1A = 128;
         TCCR1 = MODE ? 0b01100001 : 0b00000001;   /* Start TC1 with TC1.OCA is enabled as PWM out (R-ch) */
         TCCR0A = 0b00000010;   /* Enable TC0.ck = 2MHz as interval timer */
         TCCR0B = 0b00000010;
         TIMSK = _BV(OCIE0A);
      }

      FifoCt = 0; FifoRi = 0; FifoWi = 0;      /* Reset FIFO */
      pf_read(0, 512 - fs.fptr, &rb);         /* Snip sector unaligned part */
      sz -= rb;

      sw = 1;      /* Button status flag */
      do {
         /* Forward audio data */
         btr = (sz > 1024) ? 1024 : (WORD)sz;
         res = pf_read(0, btr, &rb);
         if (res != FR_OK || btr != rb) break;
         sz -= rb;
         /* Check button down and break on button down */
         sw <<= 1;
         if (bit_is_clear(PINB, 0) && ++sw == 1) break;
         wdt_reset();
      } while (rb == 1024);   /* Repeat until all data read */
   }

   while (FifoCt) ;         /* Wait for FIFO empty */
   OCR1A = 128; OCR1B = 128;

   return res;
}



static
void delay500 (void)
{
   TCCR1 = 0; GTCCR = 0;   /* Stop TC1 */
   TCCR0B = 0; TCCR0A = 0;   /* Stop TC0 */

   wdt_reset();
   WDTCR = _BV(WDE) | _BV(WDIE) | 0b101;   /* Enable WDT interrupt in timeout of 0.5s */
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);   /* Enter power down mode */
   sleep_mode();

   WDTCR = _BV(WDE) | 0b110;            /* Enable WDT reset in timeout of 1s */
}



/*-----------------------------------------------------------------------*/
/* Main                                                                  */


int main (void)
{
   MCUSR = 0;
   WDTCR = _BV(WDE) | 0b110;   /* Enable WDT reset in timeout of 1s */

   PORTB = 0b111011;      /* Initialize port: - - H H H L H P */
   DDRB  = 0b111110;

   sei();

   for (;;) {
      delay500();                  /* Delay 500ms in low power sleep mode */
      if (pf_mount(&fs)) continue;   /* Initialize FS */
      for (;;) {
         if (pf_opendir(&dir, "")) break;   /* Open sound file directory (root dir) */
         while (!pf_readdir(&dir, &fno) && fno.fname[0]) {   /* Play all wav files in the dir */
            if (!(fno.fattrib & (AM_DIR|AM_HID))
               && strstr(fno.fname, ".WAV")) {
               if (play(fno.fname)) break;
            }
         }
      }
   }
}



TCCR1 = MODE ? 0b01100001 : 0b00000001; Наверное гдето здесь
GIRUGAMESH!
Аватара пользователя
TrashVigor
 
Сообщения: 134
Зарегистрирован: 11 июл 2008, 22:43
Откуда: Воронежск
прог. языки: С, Delphi, Asm

Re: Простая схема аудиоплейера на одном контроллере

Сообщение avr123.nm.ru » 23 фев 2010, 00:15

Жаль эти тини надиву дорогие.

TrashVigor писал(а):А как там шим регулируется?
Наверно вот:
Код: Выделить всёРазвернуть
OCR0A = (BYTE)(F_CPU / 8 / LD_WORD(&Buff[i+4])) - 1;   /* Sampling freq */


:D если исходить из текста страничкм по генерации ШИМ в AVR - http://proavr.narod.ru/z8.htm

-
Вложения
pwm.png
ШИМ в AVR http://proavr.narod.ru/z8.htm
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Простая схема аудиоплейера на одном контроллере

Сообщение TrashVigor » 23 фев 2010, 01:20

Да, точно. Хочу переделать под мегу, значит че понял, работают 2 функции load_header и Play
Код: Выделить всёРазвернуть
static
DWORD load_header (void)   /* 0:Invalid format, 1:I/O error, >1:Number of samples */
Фунуция проверки и загрузки трека, и че она возвращяет 0- формат не тот, 1- не читается, больше 1 номера треков
Код: Выделить всёРазвернуть
res = pf_read(Buff, 256, &rb);      /* Load file header (256 bytes) */
   if (res) return 1;
читаем 256 байт
Код: Выделить всёРазвернуть
 if (rb != 256 || LD_DWORD(Buff+8) != FCC('W','A','V','E')) return 0;
Тут либо не 256 байт, либо wawe не wawe
Код: Выделить всёРазвернуть
  case FCC('f','m','t',' ') :      /* 'fmt ' chunk */
         if (sz > 100 || sz < 16)            /* Размер масива в пределах...   */
            return 0;
         if (Buff[i+0] != 1)                  /* Check coding type (1) */
            return 0;
         if (Buff[i+2] != 1 && Buff[i+2] != 2)   /*проверка  моно или стерео */
            return 0;
         GPIOR0 = Buff[i+2];      /* Тут не понятно */
         if (Buff[i+14] != 8 && Buff[i+14] != 16)   /* 8 или 16 бит */
            return 0;
         GPIOR0 |= Buff[i+14];   /* опять не понятно */
         OCR0A = (BYTE)(F_CPU / 8 / LD_WORD(&Buff[i+4])) - 1;   /* Sampling freq */
         break;

Код: Выделить всёРазвернуть
  case FCC('f','a','c','t') :      /* 'fact' chunk (skip) */
         break;

      case FCC('d','a','t','a') :      /* 'data'стартуем проигрывать */
         fs.fptr = i;
         return sz;
Вот не понятно , для чего WD включен в функции delay500, переключаться на следующий трек?
Код: Выделить всёРазвернуть
static
void delay500 (void)
{
   TCCR1 = 0; GTCCR = 0;   /* Stop TC1 */
   TCCR0B = 0; TCCR0A = 0;   /* Stop TC0 */

   wdt_reset();
   WDTCR = _BV(WDE) | _BV(WDIE) | 0b101;   /* Enable WDT interrupt in timeout of 0.5s */
   set_sleep_mode(SLEEP_MODE_PWR_DOWN);   /* Enter power down mode */
   sleep_mode();

   WDTCR = _BV(WDE) | 0b110;            /* Enable WDT reset in timeout of 1s */
}
GIRUGAMESH!
Аватара пользователя
TrashVigor
 
Сообщения: 134
Зарегистрирован: 11 июл 2008, 22:43
Откуда: Воронежск
прог. языки: С, Delphi, Asm

Re: Простая схема аудиоплейера на одном контроллере

Сообщение avr123.nm.ru » 23 фев 2010, 10:06

Он обосновал свой выбор тем что у этих Тинь ШИМ 250 Кгц при нормальной битности-разрядности.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Простая схема аудиоплейера на одном контроллере

Сообщение TrashVigor » 23 фев 2010, 10:43

Он обосновал свой выбор тем что у этих Тинь ШИМ 250 Кгц при нормальной битности-разрядности.
а в чем суть 250кгц? А если больше или меньше качество звука будет другое? Структура WAV-файла
Смещение от начала файла-- Длина-- Описание
0h-- 4h-- Идентификатор формата ('RIFF')
4h-- 4h-- Длина блока данных (длина файла - 8h)
8h-- 4h-- Идентификатор блока звуковых данных ('WAVE')
0ch-- 4h-- Идентификатор подблока заголовка ('fmt" - с пробелом в конце)
10h-- 4h-- 000ch/0010h - длина подблока заголовка
14h-- 2h-- 01h - тип формата представления данных
16h-- 2h-- Число каналов (1 - моно, 2 - стерео)
18h-- 2h/4h-- Частота дискретизации, Гц
1ah/1ch-- 2h/4h-- Скорость передачи данных, байт/с (произведение числа каналов, частоты дискретизации и разрядности в байтах)
1ch/20h-- 2h-- Числов байт для представления одного отсчета (1 - 8 бит моно, 1 - 16 бит стерео)
1eh/22h-- 2h-- Разрядность, бит (8, 16)
20h/24h-- 4h-- Идентификатор подблока данных ('data')
24h/28h-- 4h-- Длина звуковых данных
28h/2ch-- Звуковые данные
GIRUGAMESH!
Аватара пользователя
TrashVigor
 
Сообщения: 134
Зарегистрирован: 11 июл 2008, 22:43
Откуда: Воронежск
прог. языки: С, Delphi, Asm


Вернуться в Электроника, электротехника

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 2

Mail.ru counter