Код: Выделить всё
F_CPU=8000000UL
//питание 3.3 В
//ТАЙМЕРЫ---------------------------------------------
void init_timers(void){
//Fast PWM таймер0 8 бит
// отчистить OCR0A при совпадении, установить OCR0A в BOTTOM,не инвертирующий режим. FAST PWM
TCCR0A|=(1<<COM0A1)|(0<<COM0A0)|(0<<COM0B1)|(0<<COM0B0)|(1<<WGM01)|(1<<WGM00);// 0b10000011
// прескалер 1
TCCR0B|=(0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00);// 0b00000001
// прерываний нет
TIMSK0|=(0<<OCIE0B)|(0<<OCIE0A)|(0<<TOIE0); //0b00000000
TCNT0=0x00;
OCR0A=0x80;
//FAST PWM top OCR2A
//делитель 32
// прерывание OCIE2A
// таймер2 8 бит
//Режим CTC , отчистить таймер при совпадении.
TCCR2A|=(1<<COM2A1)|(0<<COM2A0)|(0<<COM2B1)|(0<<COM2B0)|(1<<WGM21)|(0<< WGM20); //0b10000010
// прескалер F_CPU/32
TCCR2B|=(0<<FOC2A)|(0<<FOC2B)(0<<WGM22)|(0<<CS22)|(1<<CS21)|(1<<CS20); //0b00000011
//прерывание по совпадению с OCR2A
TIMSK2|=(0<<OCIE2B)(1<<OCIE2A)(0<<TOIE2); //0b00000010
ASSR=0x00; //Asynchronous Status Register
/*
8000000/22050/32-1=~10
*/
OCR2A=10;
}
ПРЕРЫВАНИЕ-------------------------------------
ISR(TIMER2_COMPA_vect)
{
OCR0A=sound_buf[sound_bit++];
}
ЧТЕНИЕ С КАРТЫ----------------------------------
void play (char *wav_name)
{
res=pf_mount(&fs);
if (res==OK) {
res=pf_open(wav_name);
if (res==OK)
res=pf_lseek (0);
if (res==OK)
init_timers();
while (1)
{
if(sound_bit==1)
{
pf_read(&sound_buf[128], 128, &s1);
if(s1<128)
{
end_play();
break;
}
}
if(sound_bit==128)
{
pf_read(sound_buf, 128, &s1);
if(s1<128)
{
end_play();
break;
}
}
}
}
}


