#include "ADDS_21161_EzKit.h" #include #include #include #include float * DelayLine; int Index = 0; int p1,p2,p3,p4; float a1=0.8; float a2=0.6; float a3=0.4; float a4=0.2; float amplituda_aktualna; float a_sredn; #define opoznienie1 10000 #define opoznienie2 20000 #define opoznienie3 30000 #define opoznienie4 39999 #define dlugosc_bufora_kolowego 40000 unsigned int poziom; void echo(); void echo_ASM(); void init_echo_ASM(); void linijka_swietlna(); //Left_Channel_Out0/ Right_Channel_Out0 - wyjscie na sluchawki //Left_Channel_In1; - wejscie z mikrofonu monofonicznego //############################################################# //####### procedura obsługi przerwania ######################## //#### pobieranie próbek dŸwięku z mikrofonu, przetwarzanie ### //#### i podanie sygnału na wyjscie słuchawkowe ############### //############################################################# void Process_Samples( int sig_int) { Receive_Samples(); //pobranie próbek z mikrofonu // echo(); //efekt echa - napisany w języku C echo_ASM(); //efekt echa z wykorzystaniem buforów kołowych Transmit_Samples(); //przepisanie probek sygnalu na wyjscie (sluchawki) linijka_swietlna(); //efekt linijki swietlnej } //process_samples //################################################################ void echo(void) { //wpisanie nowej probki do bufora kolowego DelayLine[Index++] = Left_Channel_In1; // store left channel into delay-line if (Index == (dlugosc_bufora_kolowego)) Index = 0; p1=Index-opoznienie1; //probka opozniona if (p1<0) p1+=dlugosc_bufora_kolowego; //zawiniece bufora p2=Index-opoznienie2; //probka opozniona if (p2<0) p2+=dlugosc_bufora_kolowego; //zawiniece bufora p3=Index-opoznienie3; //probka opozniona if (p3<0) p3+=dlugosc_bufora_kolowego; //zawiniece bufora p4=Index-opoznienie4; //probka opozniona if (p4<0) p4+=dlugosc_bufora_kolowego; //zawiniece bufora Right_Channel_Out0 = DelayLine[p1] *a1 + DelayLine[p3] *a3; Left_Channel_Out0 = DelayLine[p2] *a2 + DelayLine[p4] *a4; } //################################################################ //@@@@@@@@@@@@@@@@@@@ "linijka" œwietlna @@@@@@@@@@@@@@@@@@@@@@@@@ //################################################################ void linijka_swietlna(void) { amplituda_aktualna=fabsf(Left_Channel_In1)*2; if (amplituda_aktualna>a_sredn) a_sredn=amplituda_aktualna; else if (a_sredn>0.0001) a_sredn-=0.0001; poziom=0; if (a_sredn>0.2) poziom=FLG4; if (a_sredn>0.3) poziom=FLG4+FLG5; if (a_sredn>0.4) poziom=FLG4+FLG5+FLG6; if (a_sredn>0.5) poziom=FLG4+FLG5+FLG6+FLG7; if (a_sredn>0.6) poziom=FLG4+FLG5+FLG6+FLG7+FLG8; if (a_sredn>0.7) poziom=FLG4+FLG5+FLG6+FLG7+FLG8+FLG9; *(int*) IOFLAG &=(0xffffffff-(FLG4+FLG5+FLG6+FLG7+FLG8+FLG9)); *(int*) IOFLAG |=poziom; } //#################################################################### void main() { DelayLine = (float *) 0x00200000; init_echo_ASM(); //zainicjowanie rejestrów ALTERNATE REGISTERS układu DAG1 //@@@@@@@@@ procedury inicjalizacji sprzętu @@@@@@@@@@@@@@@@ a_sredn=0; Setup_ADSP21161N();/* Setup Interrupt edges and flag I/O directions */ Setup_SDRAM(); /* Setup SDRAM Controller */ Setup_AD1836(); Init_AD1852_DACs(); Program_SPORT02_TDM_Registers(); Program_SPORT02_DMA_Channels(); interruptf( SIG_SP0I, Process_Samples); *(int *) SP02MCTL |= MCE; //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //pętla główna programu - UWAGA - NIE MODYFIKOWAĆ while (1) {}; }