Страница 7 из 24
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Пт май 20, 2011 10:04:02
phanis
Я например проверял с микро сд 128, мини сд 512, микро сд 2г, обнаружил отличие по времени инициализации кто то быстрее кто то медленнее. Да и по скорости чтения отличаются. А вот просто СД или ММС проверить не смог, не оказалось под рукой.
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Пт май 20, 2011 13:45:41
alex1991
phanis здравствуйте !
У меня вот только такая проблема не хочет читать файлы которые идут от 10.wav и далее
После воспроизведении 9.wav он начинает воспроизводить первый файл с карты
Не пойму что я сделал не так
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Сб май 21, 2011 18:10:06
phanis
Здравствуйте 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
alex1991
phanis спасибо теперь понятно

Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Вс май 22, 2011 03:13:23
alex1991
phanis еще раз здравствуйте !
У меня такой вопрос в исходнике который вы выложили (за что огромное вам спасибо

) чтобы он работал на Atmega8 нужно только регистры ШИМ-а поменять или что-то еще?
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Вс май 22, 2011 09:08:42
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
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Вс май 22, 2011 18:15:10
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");
}
}
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Вс май 22, 2011 19:45:40
phanis
Побывал переносить на CAVR ICCAVR не чего хорошего не вышло. На AVR Studio ни когда не работал . Даже не знаю чем помочь.
Может здесь что полезное можно нарыть..
http://en.pudn.com/search_db.asp?keyword=mmc
И вот еще библиотека для трех компиляторов
103244835avr_sd.rar
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Вс май 22, 2011 20:03:05
alex1991
phanis спасибо за ссылки
и еще хотел спросить asm ("rjmp 0"); и asm ("jmp 0"); я так понял отличаю только тем что у asm ("jmp 0"); адресное пространство переноса 2 Кбайт а у asm ("rjmp 0"); 4 Кбайт так?
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Вс май 22, 2011 20:08:01
phanis
JMP - абсолютный переход
RJMP - относительный переход На этом мои знания по ассемблеру заканчиваются
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Вс май 22, 2011 20:15:30
alex1991
phanis спасибо
Буду дальше разбираться
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Пн май 23, 2011 05:39:17
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");
}
}
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Пн май 23, 2011 10:53:48
phanis
Я думая нужно добавить ваш код вот
сюда.
START_TIMER_0;
while ( (length ) && (PIND & (1<<Knopka)) )
{
if (audio_data_count != i2)
{
Большой код лучше в виде файла прикреплять к сообщению.
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Пн май 23, 2011 14:42:13
alex1991
phanis спасибо
Уже как то реагирует пещанием при нажатие на кнопку но все равно не переключает мелодию

Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Пн май 23, 2011 15:28:07
alex1991
Все разобрался
Ступил не убрал вот эту строку
while (length ) и все заработало как я хотел
спасибо
Вот такой еще вопрос как можно улучшить качество звука ставил RC-фильтр но что есть что нет звук все равно ужасно искажен
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Пн май 23, 2011 16:51:32
phanis
Ответ в личных сообщениях.
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Ср июн 08, 2011 17:32:44
phanis
Добавил кнопки вперед назад кварц

Поддерживаемые форматы wav
Дискретиз 8000 - 48000 Гц
8 бит моно, стерео
16 бит моно
Прошивка читает по секторно
Прошивка работает с таблицей FAT16 (тормозит )
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Пт июн 24, 2011 10:21:32
phanis
Исходные файлы
если по секторное чтение за комментировать или удалить вот так
Код: Выделить всё
// #define FAT_ON // работает на некоторых флешках
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Пт июн 24, 2011 11:47:22
neznajjka
phanis большое спасибо
Re: mp3 плеер на attiny2313 на ммс картах
Добавлено: Пт июн 24, 2011 14:26:00
Кислый
господа. wav это у нас контейнер для чистого pcm? так или не так ?