mp3 плеер на attiny2313 на ммс/сд картах
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Я например проверял с микро сд 128, мини сд 512, микро сд 2г, обнаружил отличие по времени инициализации кто то быстрее кто то медленнее. Да и по скорости чтения отличаются. А вот просто СД или ММС проверить не смог, не оказалось под рукой.
-
alex1991
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср апр 14, 2010 20:42:24
- Откуда: Молдова г,Кишинев
Re: mp3 плеер на attiny2313 на ммс картах
phanis здравствуйте !
У меня вот только такая проблема не хочет читать файлы которые идут от 10.wav и далее
После воспроизведении 9.wav он начинает воспроизводить первый файл с карты
Не пойму что я сделал не так
У меня вот только такая проблема не хочет читать файлы которые идут от 10.wav и далее
После воспроизведении 9.wav он начинает воспроизводить первый файл с карты
Не пойму что я сделал не так
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Здравствуйте alex1991 .
Все правильно я же писал файлы 0.wav 1.wav .... 9.wav a.wav b.wav c.wav... z.wav все и опять по новой. имя файла 1 символ + расширение .wav
10.wav это уже 2 символа в имени файла
Все правильно я же писал файлы 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 на ммс картах
phanis спасибо теперь понятно 
-
alex1991
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср апр 14, 2010 20:42:24
- Откуда: Молдова г,Кишинев
Re: mp3 плеер на attiny2313 на ммс картах
phanis еще раз здравствуйте !
У меня такой вопрос в исходнике который вы выложили (за что огромное вам спасибо
) чтобы он работал на Atmega8 нужно только регистры ШИМ-а поменять или что-то еще?
У меня такой вопрос в исходнике который вы выложили (за что огромное вам спасибо
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Основное отличие я думаю такое. 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
Для 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
-
alex1991
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср апр 14, 2010 20:42:24
- Откуда: Молдова г,Кишинев
Re: mp3 плеер на attiny2313 на ммс картах
phanis здравствуйте !
Спасибо за ссылки жалко исходники на кодевижн а я предпочитаю авр студио си
И еще хотел спросить я решил заняться переносом вашего исходника в авр студио и он не хотел компилироваться из за этих строк asm("jmp 0"); я поменял ее на asm("rjmp 0"); и все пошло только нечего в железе не работает
Ну заменил прерывание на ISR (TIMER0_OVF_vect) ну все равно выдает 5 предупреждений
У меня просто опыта не хватает если можете помогите
И вот весь код
Спасибо за ссылки жалко исходники на кодевижн а я предпочитаю авр студио си
И еще хотел спросить я решил заняться переносом вашего исходника в авр студио и он не хотел компилироваться из за этих строк 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 на ммс картах
Побывал переносить на CAVR ICCAVR не чего хорошего не вышло. На AVR Studio ни когда не работал . Даже не знаю чем помочь.
Может здесь что полезное можно нарыть.. http://en.pudn.com/search_db.asp?keyword=mmc
И вот еще библиотека для трех компиляторов 103244835avr_sd.rar
Может здесь что полезное можно нарыть.. http://en.pudn.com/search_db.asp?keyword=mmc
И вот еще библиотека для трех компиляторов 103244835avr_sd.rar
-
alex1991
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср апр 14, 2010 20:42:24
- Откуда: Молдова г,Кишинев
Re: mp3 плеер на attiny2313 на ммс картах
phanis спасибо за ссылки
и еще хотел спросить asm ("rjmp 0"); и asm ("jmp 0"); я так понял отличаю только тем что у asm ("jmp 0"); адресное пространство переноса 2 Кбайт а у asm ("rjmp 0"); 4 Кбайт так?
и еще хотел спросить asm ("rjmp 0"); и asm ("jmp 0"); я так понял отличаю только тем что у asm ("jmp 0"); адресное пространство переноса 2 Кбайт а у asm ("rjmp 0"); 4 Кбайт так?
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
JMP - абсолютный переход
RJMP - относительный переход На этом мои знания по ассемблеру заканчиваются
RJMP - относительный переход На этом мои знания по ассемблеру заканчиваются
-
alex1991
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср апр 14, 2010 20:42:24
- Откуда: Молдова г,Кишинев
Re: mp3 плеер на attiny2313 на ммс картах
phanis спасибо
Буду дальше разбираться
Буду дальше разбираться
-
alex1991
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср апр 14, 2010 20:42:24
- Откуда: Молдова г,Кишинев
Re: mp3 плеер на attiny2313 на ммс картах
phanis здравствуйте !
Я хотел спросить
хотел в вашем исходнике добавить функцию переключения мелодии при нажатию на кнопку
я так понял за переход на следующую мелодию отвечает SOUND_N;
Но что-то он не переключает когда делаю так
if (!(PIND & (1<<Knopka)) || (SOUND_N > '0'))SOUND_N='0';// проверить "0" на линии 4 порта D
Может и неправильно я так вписал в программировании я начинающий
Помогите ели можете пожалуйста с примером кода как можно заставить переключать следующую мелодию
Если надо вот код на данный момент
Я хотел спросить
хотел в вашем исходнике добавить функцию переключения мелодии при нажатию на кнопку
я так понял за переход на следующую мелодию отвечает 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 на ммс картах
Я думая нужно добавить ваш код вот
сюда.
START_TIMER_0;
while ( (length ) && (PIND & (1<<Knopka)) )
{
if (audio_data_count != i2)
{
Большой код лучше в виде файла прикреплять к сообщению.
сюда.
START_TIMER_0;
while ( (length ) && (PIND & (1<<Knopka)) )
{
if (audio_data_count != i2)
{
Большой код лучше в виде файла прикреплять к сообщению.
-
alex1991
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср апр 14, 2010 20:42:24
- Откуда: Молдова г,Кишинев
Re: mp3 плеер на attiny2313 на ммс картах
phanis спасибо
Уже как то реагирует пещанием при нажатие на кнопку но все равно не переключает мелодию
Уже как то реагирует пещанием при нажатие на кнопку но все равно не переключает мелодию
-
alex1991
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср апр 14, 2010 20:42:24
- Откуда: Молдова г,Кишинев
Re: mp3 плеер на attiny2313 на ммс картах
Все разобрался
Ступил не убрал вот эту строку
while (length ) и все заработало как я хотел
спасибо
Вот такой еще вопрос как можно улучшить качество звука ставил RC-фильтр но что есть что нет звук все равно ужасно искажен
Ступил не убрал вот эту строку
while (length ) и все заработало как я хотел
спасибо
Вот такой еще вопрос как можно улучшить качество звука ставил RC-фильтр но что есть что нет звук все равно ужасно искажен
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Ответ в личных сообщениях.
-
phanis
- Вымогатель припоя
- Сообщения: 513
- Зарегистрирован: Сб фев 19, 2011 18:04:08
- Откуда: Татарстан, пос. Актюбинский
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
Исходные файлы
если по секторное чтение за комментировать или удалить вот так
если по секторное чтение за комментировать или удалить вот так
Код: Выделить всё
// #define FAT_ON // работает на некоторых флешках Re: mp3 плеер на attiny2313 на ммс картах
phanis большое спасибо
- Кислый
- Поставщик валерьянки для Кота
- Сообщения: 2095
- Зарегистрирован: Чт апр 08, 2010 18:50:01
- Откуда: Краснодар
- Контактная информация:
Re: mp3 плеер на attiny2313 на ммс картах
господа. wav это у нас контейнер для чистого pcm? так или не так ?
RETI ;рети-рети интеррапт, через шины данных тракт, через память, через порт, возвращайся в главный код
@hobbyelectronics
@hobbyelectronics