mp3 плеер на attiny2313 на ммс/сд картах

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

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение phanis »

Я например проверял с микро сд 128, мини сд 512, микро сд 2г, обнаружил отличие по времени инициализации кто то быстрее кто то медленнее. Да и по скорости чтения отличаются. А вот просто СД или ММС проверить не смог, не оказалось под рукой.
Реклама
alex1991
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср апр 14, 2010 20:42:24
Откуда: Молдова г,Кишинев

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение alex1991 »

phanis здравствуйте !
У меня вот только такая проблема не хочет читать файлы которые идут от 10.wav и далее
После воспроизведении 9.wav он начинает воспроизводить первый файл с карты
Не пойму что я сделал не так
Реклама
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение phanis »

Здравствуйте alex1991 .

Все правильно я же писал файлы 0.wav 1.wav .... 9.wav a.wav b.wav c.wav... z.wav все и опять по новой. имя файла 1 символ + расширение .wav
10.wav это уже 2 символа в имени файла
alex1991
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср апр 14, 2010 20:42:24
Откуда: Молдова г,Кишинев

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение alex1991 »

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

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение alex1991 »

phanis еще раз здравствуйте !
У меня такой вопрос в исходнике который вы выложили (за что огромное вам спасибо :) ) чтобы он работал на Atmega8 нужно только регистры ШИМ-а поменять или что-то еще?
Реклама
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение phanis »

Основное отличие я думаю такое. ATtiny2313 работает с картой через интерфейс USI(в режиме полу аппаратный SPI ),а Мега8 имеет аппаратный SPI, его и нужно будет задействовать для работы с картой памяти. Ну и входа выхода по мелочи.
Для Atmega8 можно найти в интернете готовые решения т.к ОЗУ у нее достаточно.

Например
http://vrtp.ru/index.php?showtopic=11377&st=0
http://my-avr.at.ua/publ/izvlekaem_zvuk ... d/1-1-0-42
Реклама
alex1991
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср апр 14, 2010 20:42:24
Откуда: Молдова г,Кишинев

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение alex1991 »

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");




}



}
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение phanis »

Побывал переносить на CAVR ICCAVR не чего хорошего не вышло. На AVR Studio ни когда не работал . Даже не знаю чем помочь.
Может здесь что полезное можно нарыть.. http://en.pudn.com/search_db.asp?keyword=mmc

И вот еще библиотека для трех компиляторов 103244835avr_sd.rar
alex1991
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср апр 14, 2010 20:42:24
Откуда: Молдова г,Кишинев

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение alex1991 »

phanis спасибо за ссылки
и еще хотел спросить asm ("rjmp 0"); и asm ("jmp 0"); я так понял отличаю только тем что у asm ("jmp 0"); адресное пространство переноса 2 Кбайт а у asm ("rjmp 0"); 4 Кбайт так?
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение phanis »

JMP - абсолютный переход
RJMP - относительный переход На этом мои знания по ассемблеру заканчиваются
alex1991
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср апр 14, 2010 20:42:24
Откуда: Молдова г,Кишинев

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение alex1991 »

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

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение alex1991 »

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");

}



}



phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение phanis »

Я думая нужно добавить ваш код вот
сюда.

START_TIMER_0;

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

{

if (audio_data_count != i2)

{
Большой код лучше в виде файла прикреплять к сообщению.
alex1991
Открыл глаза
Сообщения: 40
Зарегистрирован: Ср апр 14, 2010 20:42:24
Откуда: Молдова г,Кишинев

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение alex1991 »

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

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение alex1991 »

Все разобрался
Ступил не убрал вот эту строку
while (length ) и все заработало как я хотел
спасибо
Вот такой еще вопрос как можно улучшить качество звука ставил RC-фильтр но что есть что нет звук все равно ужасно искажен
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение phanis »

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

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение phanis »

Добавил кнопки вперед назад кварц
Изображение
Поддерживаемые форматы wav
Дискретиз 8000 - 48000 Гц
8 бит моно, стерео
16 бит моно

Прошивка читает по секторно
WAV_PLAYER.rar
(2.34 КБ) 367 скачиваний
Прошивка работает с таблицей FAT16 (тормозит )
WAV_PLAYER_FAT16.rar
(2.45 КБ) 357 скачиваний
phanis
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение phanis »

Исходные файлы
IAR_WAV+2.rar
(123.58 КБ) 397 скачиваний
если по секторное чтение за комментировать или удалить вот так

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

 // #define FAT_ON // работает на некоторых флешках 
neznajjka
Родился
Сообщения: 1
Зарегистрирован: Чт июн 23, 2011 19:22:16

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение neznajjka »

phanis большое спасибо
Аватара пользователя
Кислый
Поставщик валерьянки для Кота
Сообщения: 2095
Зарегистрирован: Чт апр 08, 2010 18:50:01
Откуда: Краснодар
Контактная информация:

Re: mp3 плеер на attiny2313 на ммс картах

Сообщение Кислый »

господа. wav это у нас контейнер для чистого pcm? так или не так ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
Ответить

Вернуться в «Периферия»