Keil Logo Arm Logo

Discussion Forum

Problem transfering samples from ADC to DAC

Next Thread | Thread List | Previous Thread Start a Thread | Settings

Details Message
Read-Only
Author
mohammed hameed
Posted
19-Feb-2005 14:57 GMT
Toolset
None
New! Problem transfering samples from ADC to DAC
Hi Everbody

I am facing problem while transfering data from ADC to DAC in between i have used some buffer logic after execusion it is not working or suddenly stop copying from ADC but What i have tried is copying directly from ADC to DAC is working. Plz give me some suggestion which are most valuable.



#include <ADuC7026.h>

#define HALFBLOCKLENGTH 128

volatile short buffer_full_flag;
short adc_dac_cursor_index;
short adc_dac_buf_index;
int adc_buf[HALFBLOCKLENGTH*3];
int dac_buf[HALFBLOCKLENGTH*3];
int adc_buf_cursor0;
int adc_buf_cursor1;
int dac_buf_cursor0;
int dac_buf_cursor1;
//void speech1(int *out_buf,int *in_buf,int *noise,int *temp_buf,int p);
int in_buf[HALFBLOCKLENGTH*2];
int out_buf[HALFBLOCKLENGTH*2];
int temp_buf[HALFBLOCKLENGTH];
int noise[HALFBLOCKLENGTH*2];

const int whanning[] = {
0x0000, 0x0009, 0x0027, 0x0058, 0x009d, 0x00f6, 0x0162, 0x01e2, 0x0275, 0x031c, 0x03d6, 0x04a2, 0x0582, 0x0675, 0x077b, 0x0893,
0x09be, 0x0afb, 0x0c4a, 0x0daa, 0x0f1d, 0x10a0, 0x1235, 0x13db, 0x1592, 0x1759, 0x1930, 0x1b17, 0x1d0d, 0x1f13, 0x2128, 0x234b,
0x257d, 0x27bd, 0x2a0a, 0x2c64, 0x2ecc, 0x3140, 0x33c0, 0x364b, 0x38e3, 0x3b85, 0x3e31, 0x40e8, 0x43a9, 0x4673, 0x4945, 0x4c21,
0x4f04, 0x51ee, 0x54e0, 0x57d9, 0x5ad7, 0x5ddc, 0x60e6, 0x63f4, 0x6707, 0x6a1d, 0x6d37, 0x7054, 0x7374, 0x7695, 0x79b8, 0x7cdb,
0x7fff, 0x8324, 0x8647, 0x896a, 0x8c8b, 0x8fab, 0x92c8, 0x95e2, 0x98f8, 0x9c0b, 0x9f19, 0xa223, 0xa528, 0xa826, 0xab1f, 0xae11,
0xb0fb, 0xb3de, 0xb6ba, 0xb98c, 0xbc56, 0xbf17, 0xc1ce, 0xc47a, 0xc71c, 0xc9b4, 0xcc3f, 0xcebf, 0xd133, 0xd39b, 0xd5f5, 0xd842,
0xda82, 0xdcb4, 0xded7, 0xe0ec, 0xe2f2, 0xe4e8, 0xe6cf, 0xe8a6, 0xea6d, 0xec24, 0xedca, 0xef5f, 0xf0e2, 0xf255, 0xf3b5, 0xf504,
0xf641, 0xf76c, 0xf884, 0xf98a, 0xfa7d, 0xfb5d, 0xfc29, 0xfce3, 0xfd8a, 0xfe1d, 0xfe9d, 0xff09, 0xff62, 0xffa7, 0xffd8, 0xfff6,
0xffff, 0xfff6, 0xffd8, 0xffa7, 0xff62, 0xff09, 0xfe9d, 0xfe1d, 0xfd8a, 0xfce3, 0xfc29, 0xfb5d, 0xfa7d, 0xf98a, 0xf884, 0xf76c,
0xf641, 0xf504, 0xf3b5, 0xf255, 0xf0e2, 0xef5f, 0xedca, 0xec24, 0xea6d, 0xe8a6, 0xe6cf, 0xe4e8, 0xe2f2, 0xe0ec, 0xded7, 0xdcb4,
0xda82, 0xd842, 0xd5f5, 0xd39b, 0xd133, 0xcebf, 0xcc3f, 0xc9b4, 0xc71c, 0xc47a, 0xc1ce, 0xbf17, 0xbc56, 0xb98c, 0xb6ba, 0xb3de,
0xb0fb, 0xae11, 0xab1f, 0xa826, 0xa528, 0xa223, 0x9f19, 0x9c0b, 0x98f8, 0x95e2, 0x92c8, 0x8fab, 0x8c8b, 0x896a, 0x8647, 0x8324,
0x7fff, 0x7cdb, 0x79b8, 0x7695, 0x7374, 0x7054, 0x6d37, 0x6a1d, 0x6707, 0x63f4, 0x60e6, 0x5ddc, 0x5ad7, 0x57d9, 0x54e0, 0x51ee,
0x4f04, 0x4c21, 0x4945, 0x4673, 0x43a9, 0x40e8, 0x3e31, 0x3b85, 0x38e3, 0x364b, 0x33c0, 0x3140, 0x2ecc, 0x2c64, 0x2a0a, 0x27bd,
0x257d, 0x234b, 0x2128, 0x1f13, 0x1d0d, 0x1b17, 0x1930, 0x1759, 0x1592, 0x13db, 0x1235, 0x10a0, 0x0f1d, 0x0daa, 0x0c4a, 0x0afb,
0x09be, 0x0893, 0x077b, 0x0675, 0x0582, 0x04a2, 0x03d6, 0x031c, 0x0275, 0x01e2, 0x0162, 0x00f6, 0x009d, 0x0058, 0x0027, 0x0009
};

void My_IRQ_Function(void); // IRQ Funtion Prototype
void Setup(void);
void delay(int);

void speech(int * out, int * in, int * temp, const short halfblocklength)
{
int k;
for (k=0; k<halfblocklength; k++)
{

out[k] = in[k]+ temp[k];
temp[k] = in[k+halfblocklength];
}
}

int main (void)
{
int n;

for (n=0; n<HALFBLOCKLENGTH*3; n++)
{
adc_buf[n] = n;
dac_buf[n] = 0;
}
for (n=0; n<HALFBLOCKLENGTH*2; n++)
{
in_buf[n] = 0;
out_buf[n] = 0;
noise[n] = 0;
}
for (n=0; n<HALFBLOCKLENGTH; n++)
{
temp_buf[n] = 0;
}
buffer_full_flag = 0;
adc_dac_buf_index = 0;
adc_dac_cursor_index = 0;
adc_buf_cursor0 = HALFBLOCKLENGTH;
adc_buf_cursor1 = 2*HALFBLOCKLENGTH;
dac_buf_cursor0 = HALFBLOCKLENGTH;
dac_buf_cursor1 = 2*HALFBLOCKLENGTH;

Setup();

while(1)
{
if (buffer_full_flag == 1)
{
GP4DAT ^= 0x00040000; // Complement P4.2
buffer_full_flag = 0;

for (n=0; n<HALFBLOCKLENGTH; n++)
{
in_buf[n] = (adc_buf[adc_buf_cursor1 + HALFBLOCKLENGTH-1-n] * whanning[n]) >> 16; // APPLY HANNING WINDOW

in_buf[n+HALFBLOCKLENGTH] = (adc_buf[adc_buf_cursor0 + HALFBLOCKLENGTH-1-n] * whanning[n+HALFBLOCKLENGTH]) >> 16; // APPLY HANNING WINDOW
}

speech(out_buf, in_buf, temp_buf, HALFBLOCKLENGTH);

for (n=0; n<HALFBLOCKLENGTH; n++)
{
dac_buf[dac_buf_cursor1 + HALFBLOCKLENGTH-1-n] = (out_buf[n])<<16;
dac_buf[dac_buf_cursor0 + HALFBLOCKLENGTH-1-n] = (out_buf[n+HALFBLOCKLENGTH])<<16;

}

}
}
return 0 ;
}

void Setup(void)
{
//ADC configuration
REFCON = 0x01;
ADCCON = 0xE2;
int time;
time = 20000;
while (time >=0)
{
time--;
}
ADCCP = 0x03;

DAC0CON = 0x13;

DAC0DAT = 0x08000000;

// for test purposes only
GP0CON = 0x10103000;
GP4DAT = 0x04000000;
IQ = My_IRQ_Function;

FIQEN = ADC_BIT;
T0LD = 282;
T0CON = 0xC4;

return ;
}


// Interrupt Service Rountine

void My_IRQ_Function()
{
if ( (FIQSTA & ADC_BIT) != 0 )
{
adc_buf[adc_dac_buf_index] =ADCDAT;
DAC0DAT = dac_buf[adc_dac_buf_index];

adc_dac_cursor_index++;
if (adc_dac_cursor_index>=HALFBLOCKLENGTH)
{
adc_dac_cursor_index = 0;

adc_buf_cursor0 += HALFBLOCKLENGTH;
if (adc_buf_cursor0 >= 3*HALFBLOCKLENGTH)
{
adc_buf_cursor0 = 0;
}
adc_buf_cursor1 += HALFBLOCKLENGTH;
if (adc_buf_cursor1 >= 3*HALFBLOCKLENGTH)
{
adc_buf_cursor1 = 0;
}

dac_buf_cursor0 += HALFBLOCKLENGTH;
if (dac_buf_cursor0 >= 3*HALFBLOCKLENGTH)
{
dac_buf_cursor0 = 0;
}
dac_buf_cursor1 += HALFBLOCKLENGTH;
if (dac_buf_cursor1 >= 3*HALFBLOCKLENGTH)
{
dac_buf_cursor1 = 0;
}

buffer_full_flag = 1;
}

adc_dac_buf_index++;
if (adc_dac_buf_index >= 3*HALFBLOCKLENGTH)
{
adc_dac_buf_index = 0;
}
}
return ;
}


Thanks

Hameed
Read-Only
Author
Keil Reinhard
Posted
21-Feb-2005 17:01 GMT
Toolset
None
New! RE: Problem transfering samples from ADC to DAC
You should try to run this program in the simulator. The simulator allows better analysis of the program behaviour.

The ARM ADuC7024 is fully simulated and therefore it should be easy to find the problem.

Reinhard

Next Thread | Thread List | Previous Thread Start a Thread | Settings

Keil logo

Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.