и так берем схему и исходники вот отсюда
- Код: Выделить всё
/*
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Project : PCM Player
Version : 0.0.0.6
Date : 19.01.2006
Author : Pavel Sirotkin
Mail to : pol_s@list.ru
Chip type : ATmega32
Fuses Settings : CKSEL = 1110, SUT = 01, CKOPT = 0
Program type : Application
Clock frequency : 16,000000 MHz
Memory model : Small
Heap : 0x300
Data Stack : 0x100
Return Stack : 64
Compiler : IAR EWAVR 4.12A
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
#include "main.h"
// Заголовок WAV файла
typedef struct
{
unsigned char id_riff[4]; // 4 byte
unsigned long len_riff; // 4 byte
unsigned char id_chuck[4]; // 4 byte
unsigned char fmt[4]; // 4 byte
unsigned long len_chuck; // 4 byte
unsigned int type; // 2 byte
unsigned int channels; // 2 byte
unsigned long freq; // 4 byte
unsigned long bytes; // 4 byte
unsigned int align; // 2 byte
unsigned int bits; // 2 byte
unsigned char id_data[4]; // 4 byte
unsigned long len_data; // 4 byte
} TitleWave;// 44 byte
/*
---------------------------------------------------------------------------------------------
Глобальные переменные
---------------------------------------------------------------------------------------------
*/
volatile unsigned char data;
unsigned char song;
unsigned char play;
unsigned char gotoNextSong;
__flash char FileNames [10][11] =
{
"muson01.wav","muson02.wav","muson03.wav","muson04.wav","muson05.wav",
"muson06.wav","muson07.wav","muson08.wav","muson09.wav","muson10.wav"
};
/*
=============================================================================================
Проверка заголовка WAV файла на соответсвие параметрам воспроизведения.
Формат WAV файла должен быть: PCM 8 бит 16000 КГц Моно.
=============================================================================================
*/
unsigned char WaveComp (char const __flash name[])
{
//~~~~~~~~~~~~~
FILE *f;
TitleWave tw;
//~~~~~~~~~~~~~
f = fopenc(name,READ);
if ( f==0 ) return (1); // Не открыть файл
fread(&tw,sizeof(TitleWave),1,f);
fclose(f);
if ( strncmp_G(tw.id_riff,"RIFF",4) != 0 ) return (1); // Не совпал идентификатор RIFF
if ( strncmp_G(tw.id_chuck,"WAVE",4) != 0 ) return (1); // Не совпал идентификатор CHUCK
if ( strncmp_G(tw.fmt,"fmt ",4)!= 0 ) return (1); // Не совпал идентификатор FMT
if ( tw.type != 1 ) return (1); // Тип данных - не выборка
if ( tw.channels != 1 ) return (1); // Не моно
if ( tw.freq != 16000 ) return (1); // Не 16000 КГц
if ( tw.bytes != 16000 ) return (1);
if ( tw.bits != 8 ) return (1); // Не 8 бит
if ( strncmp_G(tw.id_data,"data",4)!= 0 )return (1); // Не совпал идентификатор DATA
return (0);
}
/*
=============================================================================================
MAIN.
=============================================================================================
*/
void main ()
{
//~~~~~~~~~~
FILE *fp;
//~~~~~~~~~~
while (!initialize_media()){};
PCMDDR = 0xFF;
PCMPort = 0x00;
PORTD_Bit2 = 1;
PORTD_Bit3 = 1;
// Sleep enable
MCUCR |= (1 << SE);
// External Interrupts enable
GICR |= (1 << INT1)|(1 << INT0);
SEI();
while(1)
{
if (play)
{
GICR &= ~(1 << INT0);
// Timer/Counter 0 initialization
TCCR0 |= (1 << CS01);
TCNT0 = 0x89;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK |= (1 << TOIE0);
if (!WaveComp (FileNames[song]))
{
fp = fopenc(FileNames[song], READ);
while ( ((fp -> position) < (fp -> length)) && !gotoNextSong )
{
data = fgetc(fp);
SLEEP();
};
fclose(fp);
if (!gotoNextSong) play = 0;
gotoNextSong = 0;
}
else song = 0;
// Stop Timer0
TCCR0 &= ~(1 << CS01);
TIMSK &= ~(1 << TOIE0);
GICR |= (1 << INT0);
}
else SLEEP();
};
}
/*
=============================================================================================
Timer0 interrupt.
=============================================================================================
*/
#pragma vector = TIMER0_OVF_vect
__interrupt void Timer0_Ovf (void)
{
PCMPort = data;
TCNT0 = 0x89;
}
/*
=============================================================================================
External interrupt0.
=============================================================================================
*/
#pragma vector = INT0_vect
__interrupt void Int0_Isr (void)
{
_delay_ms(1000);
while (!PIND_Bit2){};
play = 1;
}
/*
=============================================================================================
External interrupt1.
=============================================================================================
*/
#pragma vector = INT1_vect
__interrupt void Int1_Isr (void)
{
_delay_ms(1000);
while (!PIND_Bit3){};
gotoNextSong = 1;
play = 1;
song++;
}
Добавлено спустя 1 минуту 33 секунды:
добавляем возможность управления через уарт и и2ц
системный разъем естественно миниботовский
там как раз уже выведен уарт и и2ц
Добавлено спустя 5 минут 19 секунд:
добавлем взятый у уважаемого FireFly вот от сюда
его схему микрофонного усилителя (только я думаю мы их стерео сделаем, чтобы можно было на звук ехать)
и получается у нас еще и аудиовход естественно с возможностью записи