Например TDA7294

Форум РадиоКот • Просмотр темы - mp3 плеер на attiny2313 на ммс/сд картах
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс дек 21, 2025 18:14:13

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 465 ]     ... , , , 7, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Пт май 20, 2011 10:04:02 
Вымогатель припоя

Зарегистрирован: Сб фев 19, 2011 18:04:08
Сообщений: 513
Откуда: Татарстан, пос. Актюбинский
Рейтинг сообщения: 0
Я например проверял с микро сд 128, мини сд 512, микро сд 2г, обнаружил отличие по времени инициализации кто то быстрее кто то медленнее. Да и по скорости чтения отличаются. А вот просто СД или ММС проверить не смог, не оказалось под рукой.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Пт май 20, 2011 13:45:41 
Открыл глаза

Зарегистрирован: Ср апр 14, 2010 20:42:24
Сообщений: 40
Откуда: Молдова г,Кишинев
Рейтинг сообщения: 0
phanis здравствуйте !
У меня вот только такая проблема не хочет читать файлы которые идут от 10.wav и далее
После воспроизведении 9.wav он начинает воспроизводить первый файл с карты
Не пойму что я сделал не так


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Сб май 21, 2011 18:10:06 
Вымогатель припоя

Зарегистрирован: Сб фев 19, 2011 18:04:08
Сообщений: 513
Откуда: Татарстан, пос. Актюбинский
Рейтинг сообщения: 0
Здравствуйте alex1991 .

Все правильно я же писал файлы 0.wav 1.wav .... 9.wav a.wav b.wav c.wav... z.wav все и опять по новой. имя файла 1 символ + расширение .wav
10.wav это уже 2 символа в имени файла


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Сб май 21, 2011 21:28:20 
Открыл глаза

Зарегистрирован: Ср апр 14, 2010 20:42:24
Сообщений: 40
Откуда: Молдова г,Кишинев
Рейтинг сообщения: 0
phanis спасибо теперь понятно :)


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Вс май 22, 2011 03:13:23 
Открыл глаза

Зарегистрирован: Ср апр 14, 2010 20:42:24
Сообщений: 40
Откуда: Молдова г,Кишинев
Рейтинг сообщения: 0
phanis еще раз здравствуйте !
У меня такой вопрос в исходнике который вы выложили (за что огромное вам спасибо :) ) чтобы он работал на Atmega8 нужно только регистры ШИМ-а поменять или что-то еще?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Вс май 22, 2011 09:08:42 
Вымогатель припоя

Зарегистрирован: Сб фев 19, 2011 18:04:08
Сообщений: 513
Откуда: Татарстан, пос. Актюбинский
Рейтинг сообщения: 0
Основное отличие я думаю такое. ATtiny2313 работает с картой через интерфейс USI(в режиме полу аппаратный SPI ),а Мега8 имеет аппаратный SPI, его и нужно будет задействовать для работы с картой памяти. Ну и входа выхода по мелочи.
Для Atmega8 можно найти в интернете готовые решения т.к ОЗУ у нее достаточно.

Например
http://vrtp.ru/index.php?showtopic=11377&st=0
http://my-avr.at.ua/publ/izvlekaem_zvuk_iz_mk_dlja_istinykh_izvrashhencev_d/1-1-0-42


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Вс май 22, 2011 18:15:10 
Открыл глаза

Зарегистрирован: Ср апр 14, 2010 20:42:24
Сообщений: 40
Откуда: Молдова г,Кишинев
Рейтинг сообщения: 0
phanis здравствуйте !
Спасибо за ссылки жалко исходники на кодевижн а я предпочитаю авр студио си
И еще хотел спросить я решил заняться переносом вашего исходника в авр студио и он не хотел компилироваться из за этих строк asm("jmp 0"); я поменял ее на asm("rjmp 0"); и все пошло только нечего в железе не работает
Ну заменил прерывание на ISR (TIMER0_OVF_vect) ну все равно выдает 5 предупреждений
Код:
d:/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete.  Use <avr/interrupt.h>."
../main.c:444: warning: array subscript has type 'char'
../main.c: In function 'main':
../main.c:114: warning: 'BPB_SecPerClus' may be used uninitialized in this function
../main.c:108: warning: 'c' may be used uninitialized in this function
../main.c:108: warning: 'n1' may be used uninitialized in this function

У меня просто опыта не хватает если можете помогите
И вот весь код

Код:
#define ENABLE_BIT_DEFINITIONS
#include <avr/io.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define F_CPU 16000000UL
/* Definitions for MMC/SDC command */
#define CMD0   (0x40+0)   /* GO_IDLE_STATE */
#define CMD1   (0x40+1)   /* SEND_OP_COND (MMC) */
#define   ACMD41   (0xC0+41)   /* SEND_OP_COND (SDC) */
#define CMD17   (0x40+17)   /* READ_SINGLE_BLOCK */
#define CMD55   (0x40+55)   /* APP_CMD */



#define OUT1   3  // 
#define OUT2   4  // 

#define SD_CS 0
#define SDI   5  // Pin B5 como MOSI.
#define SDO   6  // Pin B6 como MISO.
#define SCK   7  // Pin B7 como SCK.


#define AUDIO_BUFFER 64

#define MAX_ERROR  10

#define SD_CS_OFF()      PORTB |= 1<<SD_CS
#define SD_CS_ON()      PORTB &= 0xFF-(1<<SD_CS)


#define TRUE  1
#define FALSE 0

   
   #define uchar   unsigned char
   #define uint   unsigned int   
   #define ulong   unsigned long
   #define schar   char
   #define sint   int   
   #define slong   long
 


#define START_TIMER_0  TCCR0B = 0x02 //start timer
#define STOP_TIMER_0   TCCR0B = 0x00

#define PWM_EN         TCCR1B = 0x09;    
#define PWM_DIS         TCCR1B = 0x00;    


   typedef struct {
      uchar LO;
      uchar ML;
      uchar MH;
      uchar HI;
   } sHILO32c;
   typedef struct {
      uchar LO;
      uchar HI;
   } sHILO16c;
   typedef struct {
      uint LO;
      uint HI;
   } sHILO32i;
 

   typedef union {
      ulong lval;
      sHILO32c cval;
      sHILO32i ival;
   } uHILO32;

   typedef union {
      uint ival;
      sHILO16c cval;
   } uHILO16;
 
 
void delay_ms(uint millisec);
uchar _SD_send_cmd(ulong argument);
uchar _FF_spi(uchar mydata);
uchar S_SD_send_cmd(uchar command);

void BEEP(void);


volatile  unsigned char   ERROR_COUNT;
volatile  unsigned char   audio_data_count;
uchar   _FF_buff[AUDIO_BUFFER];











int main(void)
{
   
   uchar c, n1, resp, n,l,i2,SOUND_N;
   uchar i;
        uHILO16 clust;
   uHILO32 ltemp;
        ulong length ;
        ulong TEMP_POSITION;
uchar   BPB_SecPerClus;
uHILO16 BPB_RsvdSecCnt;
uHILO16 BPB_RootEntCnt;
uHILO16 BPB_FATSz16, PT_SecStart;
ulong   _FF_ROOT_ADDR;
uint    FirstDataSector;
uint ent_cntr;     
  asm("cli");

STOP_TIMER_0;
SD_CS_OFF();
  OCR1AL=0x80;
OCR1BL=0x80;
TCCR1A = 0xA1;
PWM_EN;
        PORTB |= (1<<SDI)|(1<<SDO)|(1<<SD_CS);  //     
        DDRB = (1<<SCK)|(1<<SDO)|(1<<SD_CS);
        USICR = (1<<USIWM0)|(1<<USICS1)|(1<<USICLK);
        delay_ms(500); 
    TIMSK  = 0x02; //timer interrupt sources

 MCUCR = 0x02;
 GIMSK = 0x40;
 

 
          SD_CS_OFF();
     for (n=0; n<100; n++)  _FF_spi(0xFF);
         SD_CS_ON();

         
    PT_SecStart.ival=0;
  if (S_SD_send_cmd(CMD0)!=0x01) asm(" rjmp 0");


      for (n=0; n<200; n++)
       {       

         if  (S_SD_send_cmd(CMD1)==0)  break ;

 
         delay_ms(100);             
       }
   
 
if (_SD_send_cmd(0) !=0xFE) asm("rjmp 0");

n=0;
ent_cntr=0;
       while( ent_cntr<0x1F8)
       {
       resp=_FF_spi(0xFF);
         
      switch(ent_cntr)
      {
                 
                      
               
             case 0x00: if(resp==0xEB) n=1,ent_cntr=0x1F8;break;
      
               
                case 0x1BF: if(resp) n=1;break;
      case 0x1C6: if(n) PT_SecStart.cval.LO = resp;break;
                case 0x1C7: if(n) PT_SecStart.cval.HI = resp,ent_cntr=0x1F8;break;
      
                case 0x1CF: if(resp) n=1;break;
      case 0x1D6: if(n) PT_SecStart.cval.LO = resp;break;
                case 0x1D7: if(n) PT_SecStart.cval.HI = resp,ent_cntr=0x1F8;break;

                case 0x1DF: if(resp) n=1;break;
      case 0x1E6: if(n) PT_SecStart.cval.LO = resp;break;
                case 0x1E7: if(n) PT_SecStart.cval.HI = resp,ent_cntr=0x1F8;break;

                case 0x1EF: if(resp) n=1;break;
      case 0x1F6: if(n) PT_SecStart.cval.LO = resp;break;
                case 0x1F7: if(n) PT_SecStart.cval.HI = resp,ent_cntr=0x1F8;break;

                }
     
           ent_cntr++ ;
       }
       SD_CS_OFF();
   
if (n==0) asm("rjmp 0");


 for (ent_cntr=0; ent_cntr<512; ent_cntr++)  _FF_spi(0xFF);

_SD_send_cmd(PT_SecStart.ival);
for (n=0; n<0x3B; n++)
      {
      resp=_FF_spi(0xFF);
         
      switch(n)
      {                 
                    
                // Количество секторов на кластер 
             case 0x0D: BPB_SecPerClus = resp;break;
      
      // Зарезервированные сектора
      case 0x0E: BPB_RsvdSecCnt.cval.LO = resp;break;
                case 0x0F: BPB_RsvdSecCnt.cval.HI = resp;break;
      
                case 0x10: c = resp;break;
               
                case 0x11: BPB_RootEntCnt.cval.LO    = resp;break;
                case 0x12: BPB_RootEntCnt.cval.HI    = resp;break;
   
                // Get the FATSz16 value
           case 0x16: BPB_FATSz16.cval.LO    = resp;break;
                case 0x17: BPB_FATSz16.cval.HI    = resp;break;
                       
                case 0x36: if (resp != 'F') asm("rjmp 0"); ;break;
      case 0x37: if (resp != 'A') asm("rjmp 0"); ;break;
                case 0x38: if (resp != 'T') asm("rjmp 0"); ;break;
      case 0x39: if (resp != '1') asm("rjmp 0"); ;break;
                case 0x3A: if (resp != '6') asm("rjmp 0"); ;break;             
         
                }
   
      
      }
      
       SD_CS_OFF();
      
   
           
   // Calculate the Address of the Root Directory
       
     
          TEMP_POSITION =  c;//2
          TEMP_POSITION *= BPB_FATSz16.ival;//00f5
         TEMP_POSITION+= BPB_RsvdSecCnt.ival;//06
          _FF_ROOT_ADDR=TEMP_POSITION+PT_SecStart.ival;
   
       
        TEMP_POSITION = (((ulong) BPB_RootEntCnt.ival << 5) + 511) >> 9;
       
        FirstDataSector = (c * BPB_FATSz16.ival) + BPB_RsvdSecCnt.ival + TEMP_POSITION+PT_SecStart.ival;

             
 
SOUND_N=0x00;
asm("sei");
while(1)
{
 
delay_ms(100);
   SOUND_N++;
         if ((SOUND_N > 'Z') || (SOUND_N < '0'))SOUND_N='0';
   _FF_buff[0 ]=SOUND_N;
        _FF_buff[1 ]=0x20;
        _FF_buff[2 ]=0x20;
        _FF_buff[3 ]=0x20;
        _FF_buff[4 ]=0x20;
        _FF_buff[5 ]=0x20;
        _FF_buff[6 ]=0x20;
        _FF_buff[7 ]=0x20;
        _FF_buff[8 ]='W';
        _FF_buff[9 ]='A';
        _FF_buff[10]='V';



         
         
         ent_cntr=0;

         c=0;

         while (ent_cntr < BPB_RootEntCnt.ival)
   {
      
          SD_CS_OFF();
 
          for (BPB_FATSz16.ival=0; BPB_FATSz16.ival<512; BPB_FATSz16.ival++)  _FF_spi(0xFF);
         
          _SD_send_cmd((_FF_ROOT_ADDR + c));
     
                 
      for (n=0; n<16; n++)
      {
                             
      
      n1=0;
               
                for (l=0;l<32;l++)
                {
                resp=_FF_spi(0xFF);
               
                if ((l<11) && (_FF_buff[l ]== resp)) n1++;
               
                if (n1>=11)
                  {
                   
      
                    switch (l)
      
                    {
      
          // первый кластер
                    case 0x1A: clust.cval.LO = resp;break;
      
                    case 0x1B: clust.cval.HI = resp;break;
      
                    // Save file length
               
                    case 0x1C: ltemp.cval.LO = resp;break;
               
                    case 0x1D: ltemp.cval.ML = resp;break;
               
                    case 0x1E: ltemp.cval.MH = resp;break;
               
                    case 0x1F: ltemp.cval.HI = resp;break;
               
      
                    }
                 
                 
                  }
               
               
                }
         
          if (n1>=11) break;
                 ent_cntr++;    
                  if (ent_cntr>= BPB_RootEntCnt.ival) break;

               }
      
                 if (ent_cntr>= BPB_RootEntCnt.ival) break;
      
      if (n1>=11) break;
                 
             c++;
     
   
        }


        SD_CS_OFF();
       
        if (n1>=11)
        {
   


TEMP_POSITION = ((clust.ival - 2) * (ulong) BPB_SecPerClus) + (ulong) FirstDataSector;

                           
                            length= ltemp.lval>>9; 
                       
                           i2=0;
                           
                           audio_data_count=i2;
                                                           
                           i=0;
                         
                           delay_ms(1000);
                                                     
                            DDRB |= (1<<OUT1)|(1<<OUT2);
                               
                           
                            START_TIMER_0;
                           
                            while (length )
                     
                           {
                                     
                             if  (audio_data_count != i2)   
                                     
                             {
                                       
                                     
                               if (!i)
   
 
                                  {   

                                   _SD_send_cmd( TEMP_POSITION  );
                                   
                                   TEMP_POSITION++;
     
                                   length--;
                                       
                                  }

                     
                               _FF_buff[i2]=_FF_spi(0xFF);
 
                     
                               _FF_buff[i2+1]=_FF_spi(0xFF);
 
                               i ++;
                               
                               i2+=2;
                               
                               if (i2>=AUDIO_BUFFER) i2=0;   
                           
                                     
                             }
      
                           }
                  
                   
 }
DDRB &=~ (1<<OUT1)|(1<<OUT2);
STOP_TIMER_0;            
SD_CS_OFF();



}


}




ISR (TIMER0_OVF_vect)
{


char temp1,temp2,temp3;
TCNT0 = 0xd5; //reload counter value

temp1= audio_data_count;

temp2=_FF_buff[temp1+1];
temp3=_FF_buff[temp1] ;
temp2+=0x80;
OCR1AL=temp2;
OCR1BL  =temp3;

 temp1+=2;

 if (temp1>=AUDIO_BUFFER) temp1=0;
 audio_data_count=temp1;

}






uchar _FF_spi(uchar mydata)
{
 

         
asm("OUT    0x0F,R16");         
asm("LDI    R16,0x11");
asm("LDI    R17,0x13");

asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");


return (USIDR);
}


uchar S_SD_send_cmd(uchar command)
{
   
        uchar resp,temp;
             
     
          SD_CS_OFF();
          temp=10;
    _FF_spi(0xFF);
     SD_CS_ON();
         
 
 
          _FF_spi(command);
         _FF_spi(0x00);
   _FF_spi(0x00);
   _FF_spi(0x00);
        _FF_spi(0x00);
        _FF_spi(0x95);
         resp = 0xFF;
       
   
         while(temp--)
         {
           resp = _FF_spi(0xFF);
     if (resp != 0xFF) break;
         }
      SD_CS_OFF();   
       
return (resp);
}
uchar _SD_send_cmd(ulong argument)
{
   uHILO32 arg_temp;
        uchar resp,temp;
     uint n;
        SD_CS_OFF();
     n= 1500;
       temp=0xFF;
        arg_temp.lval = argument;
        arg_temp.lval<<=1;
       _FF_spi(temp);
         SD_CS_ON();
          _FF_spi(temp);
        _FF_spi(CMD17);
         _FF_spi(arg_temp.cval.MH);
   _FF_spi(arg_temp.cval.ML);
   _FF_spi(arg_temp.cval.LO);
        _FF_spi(0x00);
        _FF_spi(temp);
         resp = temp;
       
     
         while(n--)
         {
           resp = _FF_spi(0xFF);
    
           if (resp == 0xFE)
           {
             ERROR_COUNT=0;
             return (resp);
           }
           }
       
     ERROR_COUNT++;
     if (ERROR_COUNT >= MAX_ERROR) asm("rjmp 0");
     return (resp);

}

void BEEP(void)
{uint ticks=1000;
PWM_EN;
DDRB |= (1<<OUT1)|(1<<OUT2);
while(ticks--)
{
OCR1AL= ticks;
OCR1BL= ticks;
asm("nop");
asm("nop");

}


}



void delay_ms(uint millisec)
{
uint temp;
while(millisec--)
{
temp=2000 ;
while(temp--) asm("nop");




}



}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Вс май 22, 2011 19:45:40 
Вымогатель припоя

Зарегистрирован: Сб фев 19, 2011 18:04:08
Сообщений: 513
Откуда: Татарстан, пос. Актюбинский
Рейтинг сообщения: 0
Побывал переносить на CAVR ICCAVR не чего хорошего не вышло. На AVR Studio ни когда не работал . Даже не знаю чем помочь.
Может здесь что полезное можно нарыть.. http://en.pudn.com/search_db.asp?keyword=mmc

И вот еще библиотека для трех компиляторов 103244835avr_sd.rar


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Вс май 22, 2011 20:03:05 
Открыл глаза

Зарегистрирован: Ср апр 14, 2010 20:42:24
Сообщений: 40
Откуда: Молдова г,Кишинев
Рейтинг сообщения: 0
phanis спасибо за ссылки
и еще хотел спросить asm ("rjmp 0"); и asm ("jmp 0"); я так понял отличаю только тем что у asm ("jmp 0"); адресное пространство переноса 2 Кбайт а у asm ("rjmp 0"); 4 Кбайт так?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Вс май 22, 2011 20:08:01 
Вымогатель припоя

Зарегистрирован: Сб фев 19, 2011 18:04:08
Сообщений: 513
Откуда: Татарстан, пос. Актюбинский
Рейтинг сообщения: 0
JMP - абсолютный переход
RJMP - относительный переход На этом мои знания по ассемблеру заканчиваются


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Вс май 22, 2011 20:15:30 
Открыл глаза

Зарегистрирован: Ср апр 14, 2010 20:42:24
Сообщений: 40
Откуда: Молдова г,Кишинев
Рейтинг сообщения: 0
phanis спасибо
Буду дальше разбираться


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Пн май 23, 2011 05:39:17 
Открыл глаза

Зарегистрирован: Ср апр 14, 2010 20:42:24
Сообщений: 40
Откуда: Молдова г,Кишинев
Рейтинг сообщения: 0
phanis здравствуйте !
Я хотел спросить
хотел в вашем исходнике добавить функцию переключения мелодии при нажатию на кнопку
я так понял за переход на следующую мелодию отвечает SOUND_N;
Но что-то он не переключает когда делаю так
if (!(PIND & (1<<Knopka)) || (SOUND_N > '0'))SOUND_N='0';// проверить "0" на линии 4 порта D
Может и неправильно я так вписал в программировании я начинающий
Помогите ели можете пожалуйста с примером кода как можно заставить переключать следующую мелодию
Если надо вот код на данный момент
Код:
/IAR 5.50
#define ENABLE_BIT_DEFINITIONS
#include <ioavr.h>

/* Definitions for MMC/SDC command */
#define CMD0   (0x40+0)   /* GO_IDLE_STATE */
#define CMD1   (0x40+1)   /* SEND_OP_COND (MMC) */
#define   ACMD41   (0xC0+41)   /* SEND_OP_COND (SDC) */
#define CMD17   (0x40+17)   /* READ_SINGLE_BLOCK */
#define CMD55   (0x40+55)   /* APP_CMD */



#define OUT1   3  // 
#define OUT2   4  // 

#define SD_CS 0
#define SDI   5  // Pin B5 como MOSI.
#define SDO   6  // Pin B6 como MISO.
#define SCK   7  // Pin B7 como SCK.

//порт, к которому подключены кнопки
#define PORT_BUTTON    PORTD
#define PIN_BUTTON    PIND
#define DDRX_BUTTON    DDRD

#define KN       4


//DDRB &= ~(1<<2); //  порт B 2 сконфигурировать как вход
//PORTB |= (1<<2); /* PB2 установить "1", включаем подтягивающий резистор */
//KN |= (1<<2); /* PA1 установить "1", включаем подтягивающий резистор */

#define AUDIO_BUFFER 64

#define MAX_ERROR  10

#define SD_CS_OFF()      PORTB |= 1<<SD_CS
#define SD_CS_ON()      PORTB &= 0xFF-(1<<SD_CS)


#define TRUE  1
#define FALSE 0

   
   #define uchar   unsigned char
   #define uint   unsigned int   
   #define ulong   unsigned long
   #define schar   char
   #define sint   int   
   #define slong   long
 


#define START_TIMER_0  TCCR0B = 0x02 //start timer
#define STOP_TIMER_0   TCCR0B = 0x00

#define PWM_EN         TCCR1B = 0x09;    
#define PWM_DIS         TCCR1B = 0x00;    


   typedef struct {
      uchar LO;
      uchar ML;
      uchar MH;
      uchar HI;
   } sHILO32c;
   typedef struct {
      uchar LO;
      uchar HI;
   } sHILO16c;
   typedef struct {
      uint LO;
      uint HI;
   } sHILO32i;
 

   typedef union {
      ulong lval;
      sHILO32c cval;
      sHILO32i ival;
   } uHILO32;

   typedef union {
      uint ival;
      sHILO16c cval;
   } uHILO16;
 
 
void delay_ms(uint millisec);
uchar _SD_send_cmd(ulong argument);
uchar _FF_spi(uchar mydata);
uchar S_SD_send_cmd(uchar command);

void BEEP(void);


volatile  unsigned char   ERROR_COUNT;
volatile  unsigned char   audio_data_count;
uchar   _FF_buff[AUDIO_BUFFER];










void main(void)
{
   
   uchar c, n1, resp, n,l,i2,SOUND_N;
   uchar i;
        uHILO16 clust;
   uHILO32 ltemp;
        ulong length ;
        ulong TEMP_POSITION;
uchar   BPB_SecPerClus;
uHILO16 BPB_RsvdSecCnt;
uHILO16 BPB_RootEntCnt;
uHILO16 BPB_FATSz16, PT_SecStart;
ulong   _FF_ROOT_ADDR;
uint    FirstDataSector;
uint ent_cntr;     
  asm("cli");

STOP_TIMER_0;
SD_CS_OFF();
  OCR1AL=0x80;
OCR1BL=0x80;
TCCR1A = 0xA1;
PWM_EN;
        PORTB |= (1<<SDI)|(1<<SDO)|(1<<SD_CS);  //     
        DDRB = (1<<SCK)|(1<<SDO)|(1<<SD_CS);
        USICR = (1<<USIWM0)|(1<<USICS1)|(1<<USICLK);
        delay_ms(500); 
    TIMSK  = 0x02; //timer interrupt sources

 MCUCR = 0x02;
 GIMSK = 0x40;
 

 
          SD_CS_OFF();
     for (n=0; n<100; n++)  _FF_spi(0xFF);
         SD_CS_ON();

         
    PT_SecStart.ival=0;
  if (S_SD_send_cmd(CMD0)!=0x01) asm(" jmp 0");


      for (n=0; n<200; n++)
       {       

         if  (S_SD_send_cmd(CMD1)==0)  break ;

 
         delay_ms(100);             
       }
   
 
if (_SD_send_cmd(0) !=0xFE) asm("rjmp 0");

n=0;
ent_cntr=0;
       while( ent_cntr<0x1F8)
       {
       resp=_FF_spi(0xFF);
         
      switch(ent_cntr)
      {
                 
                      
               
             case 0x00: if(resp==0xEB) n=1,ent_cntr=0x1F8;break;
      
               
                case 0x1BF: if(resp) n=1;break;
      case 0x1C6: if(n) PT_SecStart.cval.LO = resp;break;
                case 0x1C7: if(n) PT_SecStart.cval.HI = resp,ent_cntr=0x1F8;break;
      
                case 0x1CF: if(resp) n=1;break;
      case 0x1D6: if(n) PT_SecStart.cval.LO = resp;break;
                case 0x1D7: if(n) PT_SecStart.cval.HI = resp,ent_cntr=0x1F8;break;

                case 0x1DF: if(resp) n=1;break;
      case 0x1E6: if(n) PT_SecStart.cval.LO = resp;break;
                case 0x1E7: if(n) PT_SecStart.cval.HI = resp,ent_cntr=0x1F8;break;

                case 0x1EF: if(resp) n=1;break;
      case 0x1F6: if(n) PT_SecStart.cval.LO = resp;break;
                case 0x1F7: if(n) PT_SecStart.cval.HI = resp,ent_cntr=0x1F8;break;

                }
     
           ent_cntr++ ;
       }
       SD_CS_OFF();
   
if (n==0) asm("rjmp 0");


 for (ent_cntr=0; ent_cntr<512; ent_cntr++)  _FF_spi(0xFF);

_SD_send_cmd(PT_SecStart.ival);
for (n=0; n<0x3B; n++)
      {
      resp=_FF_spi(0xFF);
         
      switch(n)
      {                 
                    
                // Количество секторов на кластер 
             case 0x0D: BPB_SecPerClus = resp;break;
      
      // Зарезервированные сектора
      case 0x0E: BPB_RsvdSecCnt.cval.LO = resp;break;
                case 0x0F: BPB_RsvdSecCnt.cval.HI = resp;break;
      
                case 0x10: c = resp;break;
               
                case 0x11: BPB_RootEntCnt.cval.LO    = resp;break;
                case 0x12: BPB_RootEntCnt.cval.HI    = resp;break;
   
                // Get the FATSz16 value
           case 0x16: BPB_FATSz16.cval.LO    = resp;break;
                case 0x17: BPB_FATSz16.cval.HI    = resp;break;
                       
                case 0x36: if (resp != 'F') asm("rjmp 0"); ;break;
      case 0x37: if (resp != 'A') asm("rjmp 0"); ;break;
                case 0x38: if (resp != 'T') asm("rjmp 0"); ;break;
      case 0x39: if (resp != '1') asm("rjmp 0"); ;break;
                case 0x3A: if (resp != '6') asm("rjmp 0"); ;break;             
         
                }
   
      
      }
      
       SD_CS_OFF();
      
   
           
   // Calculate the Address of the Root Directory
       
     
          TEMP_POSITION =  c;//2
          TEMP_POSITION *= BPB_FATSz16.ival;//00f5
         TEMP_POSITION+= BPB_RsvdSecCnt.ival;//06
          _FF_ROOT_ADDR=TEMP_POSITION+PT_SecStart.ival;
   
       
        TEMP_POSITION = (((ulong) BPB_RootEntCnt.ival << 5) + 511) >> 9;
       
        FirstDataSector = (c * BPB_FATSz16.ival) + BPB_RsvdSecCnt.ival + TEMP_POSITION+PT_SecStart.ival;

             
 
SOUND_N=0x00;

asm("sei");
while(1)
{
 
delay_ms(100);
       
   SOUND_N++;
        if (!(PIND & (1<<KN)) || (SOUND_N > '0'))SOUND_N='0';// проверить "0" на линии 2 порта B
         //{SOUND_N > '0';} // Следующий трек
         if ((SOUND_N > 'Z') || (SOUND_N < '0'))SOUND_N='0';
   _FF_buff[0 ]=SOUND_N;
        _FF_buff[1 ]=0x20;
        _FF_buff[2 ]=0x20;
        _FF_buff[3 ]=0x20;
        _FF_buff[4 ]=0x20;
        _FF_buff[5 ]=0x20;
        _FF_buff[6 ]=0x20;
        _FF_buff[7 ]=0x20;
        _FF_buff[8 ]='W';
        _FF_buff[9 ]='A';
        _FF_buff[10]='V';



         
         
         ent_cntr=0;

         c=0;

         while (ent_cntr < BPB_RootEntCnt.ival)
   {
      
          SD_CS_OFF();
 
          for (BPB_FATSz16.ival=0; BPB_FATSz16.ival<512; BPB_FATSz16.ival++)  _FF_spi(0xFF);
         
          _SD_send_cmd((_FF_ROOT_ADDR + c));
     
                 
      for (n=0; n<16; n++)
      {
                             
      
      n1=0;
               
                for (l=0;l<32;l++)
                {
                resp=_FF_spi(0xFF);
               
                if ((l<11) && (_FF_buff[l ]== resp)) n1++;
               
                if (n1>=11)
                  {
                   
      
                    switch (l)
      
                    {
      
          // первый кластер
                    case 0x1A: clust.cval.LO = resp;break;
      
                    case 0x1B: clust.cval.HI = resp;break;
      
                    // Save file length
               
                    case 0x1C: ltemp.cval.LO = resp;break;
               
                    case 0x1D: ltemp.cval.ML = resp;break;
               
                    case 0x1E: ltemp.cval.MH = resp;break;
               
                    case 0x1F: ltemp.cval.HI = resp;break;
               
      
                    }
                 
                 
                  }
               
               
                }
         
          if (n1>=11) break;
                 ent_cntr++;    
                  if (ent_cntr>= BPB_RootEntCnt.ival) break;

               }
      
                 if (ent_cntr>= BPB_RootEntCnt.ival) break;
      
      if (n1>=11) break;
                 
             c++;
     
   
        }


        SD_CS_OFF();
       
        if (n1>=11)
        {
   


TEMP_POSITION = ((clust.ival - 2) * (ulong) BPB_SecPerClus) + (ulong) FirstDataSector;

                           
                            length= ltemp.lval>>9; 
                       
                           i2=0;
                           
                           audio_data_count=i2;
                                                           
                           i=0;
                         
                           delay_ms(1000);
                                                     
                            DDRB |= (1<<OUT1)|(1<<OUT2);
                               
                           
                            START_TIMER_0;
                           
                            while (length )
                     
                           {
                                     
                             if  (audio_data_count != i2)   
                                     
                             {
                                       
                                     
                               if (!i)
   
 
                                  {   

                                   _SD_send_cmd( TEMP_POSITION  );
                                   
                                   TEMP_POSITION++;
     
                                   length--;
                                       
                                  }

                     
                               _FF_buff[i2]=_FF_spi(0xFF);
 
                     
                               _FF_buff[i2+1]=_FF_spi(0xFF);
 
                               i ++;
                               
                               i2+=2;
                               
                               if (i2>=AUDIO_BUFFER) i2=0;   
                           
                                     
                             }
      
                           }
                  
                   
 }
DDRB &=~ (1<<OUT1)|(1<<OUT2);
STOP_TIMER_0;            
SD_CS_OFF();



}


}




#pragma vector = TIMER0_OVF0_vect
__interrupt void Timer0_Ovf (void)

{
char temp1,temp2,temp3;
TCNT0 = 0xd5; //reload counter value

temp1= audio_data_count;

temp2=_FF_buff[temp1+1];
temp3=_FF_buff[temp1] ;
temp2+=0x80;
OCR1AL=temp2;
OCR1BL  =temp3;

 temp1+=2;

 if (temp1>=AUDIO_BUFFER) temp1=0;
 audio_data_count=temp1;

}





uchar _FF_spi(uchar mydata)
{
 

         
asm("OUT    0x0F,R16");         
asm("LDI    R16,0x11");
asm("LDI    R17,0x13");

asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");
asm("OUT    0x0D,R16");
asm("OUT    0x0D,R17");


return (USIDR);
}


uchar S_SD_send_cmd(uchar command)
{
   
        uchar resp,temp;
             
     
          SD_CS_OFF();
          temp=10;
    _FF_spi(0xFF);
     SD_CS_ON();
         
 
 
          _FF_spi(command);
         _FF_spi(0x00);
   _FF_spi(0x00);
   _FF_spi(0x00);
        _FF_spi(0x00);
        _FF_spi(0x95);
         resp = 0xFF;
       
   
         while(temp--)
         {
           resp = _FF_spi(0xFF);
     if (resp != 0xFF) break;
         }
      SD_CS_OFF();   
       
return (resp);
}
uchar _SD_send_cmd(ulong argument)
{
   uHILO32 arg_temp;
        uchar resp,temp;
     uint n;
        SD_CS_OFF();
     n= 1500;
       temp=0xFF;
        arg_temp.lval = argument;
        arg_temp.lval<<=1;
       _FF_spi(temp);
         SD_CS_ON();
          _FF_spi(temp);
        _FF_spi(CMD17);
         _FF_spi(arg_temp.cval.MH);
   _FF_spi(arg_temp.cval.ML);
   _FF_spi(arg_temp.cval.LO);
        _FF_spi(0x00);
        _FF_spi(temp);
         resp = temp;
       
     
         while(n--)
         {
           resp = _FF_spi(0xFF);
    
           if (resp == 0xFE)
           {
             ERROR_COUNT=0;
             return (resp);
           }
           }
       
     ERROR_COUNT++;
     if (ERROR_COUNT >= MAX_ERROR) asm("jmp 0");
     return (resp);

}

void BEEP(void)
{uint ticks=1000;
PWM_EN;
DDRB |= (1<<OUT1)|(1<<OUT2);
while(ticks--)
{
OCR1AL= ticks;
OCR1BL= ticks;
asm("nop");
asm("nop");

}



}



void delay_ms(uint millisec)
{
uint temp;
while(millisec--)
{
temp=2000 ;
while(temp--) asm("nop");

}



}





Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Пн май 23, 2011 10:53:48 
Вымогатель припоя

Зарегистрирован: Сб фев 19, 2011 18:04:08
Сообщений: 513
Откуда: Татарстан, пос. Актюбинский
Рейтинг сообщения: 0
Я думая нужно добавить ваш код вот
сюда.

START_TIMER_0;

while ( (length ) && (PIND & (1<<Knopka)) )

{

if (audio_data_count != i2)

{
Большой код лучше в виде файла прикреплять к сообщению.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Пн май 23, 2011 14:42:13 
Открыл глаза

Зарегистрирован: Ср апр 14, 2010 20:42:24
Сообщений: 40
Откуда: Молдова г,Кишинев
Рейтинг сообщения: 0
phanis спасибо
Уже как то реагирует пещанием при нажатие на кнопку но все равно не переключает мелодию :(


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Пн май 23, 2011 15:28:07 
Открыл глаза

Зарегистрирован: Ср апр 14, 2010 20:42:24
Сообщений: 40
Откуда: Молдова г,Кишинев
Рейтинг сообщения: 0
Все разобрался
Ступил не убрал вот эту строку
while (length ) и все заработало как я хотел
спасибо
Вот такой еще вопрос как можно улучшить качество звука ставил RC-фильтр но что есть что нет звук все равно ужасно искажен


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Пн май 23, 2011 16:51:32 
Вымогатель припоя

Зарегистрирован: Сб фев 19, 2011 18:04:08
Сообщений: 513
Откуда: Татарстан, пос. Актюбинский
Рейтинг сообщения: 0
Ответ в личных сообщениях.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Ср июн 08, 2011 17:32:44 
Вымогатель припоя

Зарегистрирован: Сб фев 19, 2011 18:04:08
Сообщений: 513
Откуда: Татарстан, пос. Актюбинский
Рейтинг сообщения: 0
Добавил кнопки вперед назад кварц
Изображение
Поддерживаемые форматы wav
Дискретиз 8000 - 48000 Гц
8 бит моно, стерео
16 бит моно

Прошивка читает по секторно
Вложение:
WAV_PLAYER.rar [2.34 KiB]
Скачиваний: 362

Прошивка работает с таблицей FAT16 (тормозит )
Вложение:
WAV_PLAYER_FAT16.rar [2.45 KiB]
Скачиваний: 350


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Пт июн 24, 2011 10:21:32 
Вымогатель припоя

Зарегистрирован: Сб фев 19, 2011 18:04:08
Сообщений: 513
Откуда: Татарстан, пос. Актюбинский
Рейтинг сообщения: 0
Исходные файлы
Вложение:
IAR_WAV+2.rar [123.58 KiB]
Скачиваний: 391


если по секторное чтение за комментировать или удалить вот так

Код:
 // #define FAT_ON // работает на некоторых флешках


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Пт июн 24, 2011 11:47:22 
Родился

Зарегистрирован: Чт июн 23, 2011 19:22:16
Сообщений: 1
Рейтинг сообщения: 0
phanis большое спасибо


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: mp3 плеер на attiny2313 на ммс картах
СообщениеДобавлено: Пт июн 24, 2011 14:26:00 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 2
Рейтинг сообщений: 23
Зарегистрирован: Чт апр 08, 2010 18:50:01
Сообщений: 2095
Откуда: Краснодар
Рейтинг сообщения: 0
господа. wav это у нас контейнер для чистого pcm? так или не так ?

_________________
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 465 ]     ... , , , 7, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y