Dear all, I have set Timer1 to generate symmetric PWM waveform, and i need to configure its compare register to change the duty cycle. I set T1CON to reload condition, however as to have different compare values it came across my attention that I need to set a lookup table storing all these values. could anyone help me on how write this comapre interrupt service to reload/ access this table in order to change the duty cycle. thank you in advance This message was sent using the Comp.DSP web interface on www.DSPRelated.com
Compare interrupt service of F2812
Started by ●September 13, 2005
Reply by ●September 14, 20052005-09-14
I don't know if you have done this already but may I point you to C281x C/C++ Header Files and Peripheral Examples i.e. SPRC097 at http://focus.ti.com/docs/toolsw/folders/print/sprc097.html These contain sample code from TI that you can study and build upon. Anyway, in order to modify the duty cycle of T1, you will need to set another timer e.g. T2 or else the CPU Timer to generate an interrupt at regular intervals. Next within this T2 ISR you will need to set T1CMPR (for timer 1 which runs the PWM) to whatever value you need i.e. for the duty cycle. Hope this helps.
Reply by ●September 14, 20052005-09-14
>I don't know if you have done this already but may I point you to C281x >C/C++ Header Files and Peripheral Examples i.e. SPRC097 at >http://focus.ti.com/docs/toolsw/folders/print/sprc097.html > >These contain sample code from TI that you can study and build upon. > >Anyway, in order to modify the duty cycle of T1, you will need to set >another timer e.g. T2 or else the CPU Timer to generate an interrupt at >regular intervals. > >Next within this T2 ISR you will need to set T1CMPR (for timer 1 which >runs the PWM) to whatever value you need i.e. for the duty cycle. > >Hope this helps. > >actually, I have seen those examples, but my problem is that I don't want to set the interrupt at a regular intervals, simply because i need to change the duty cycle, and as far as i understand, i need to reload the comapre register value (pre-calculated based on the required duty cycle) once the its zero or the timer period is zero. or else stor those values into lookup table and use pointer to access it, so that the compare register reloaded once the interrupt is occured. please.... feed me back regards This message was sent using the Comp.DSP web interface on www.DSPRelated.com
Reply by ●September 14, 20052005-09-14
I can't really think of solution of how you will reload the compare without an interrupt. Well, because I haven't tried something like that. Additionally most of the code I have seen puts the process in a continuous wait for interrupt mode by setting a while(1) Are you making a lookup table? And what is the basis for this table?
Reply by ●September 14, 20052005-09-14
>I can't really think of solution of how you will reload the compare >without an interrupt. Well, because I haven't tried something like >that. > >Additionally most of the code I have seen puts the process in a >continuous wait for interrupt mode by setting a while(1) > >Are you making a lookup table? And what is the basis for this table? > >dear Ajay, in fact i need to generate a certain programmed PWM signal where the duty cycle is variable and it has been suggested to use the following: 1.) Split one period of your power signal pattern into smaller intervals (e.g. 100 or 256), the more the better. 2.) Setup a timer to run at this higher carrier frequency 3.) Use the compare interrupt service of this timer to reload the next value for the duty cycle of the carrier signal into the compare register. You can pre-calculate all necessary compare values in advance. Store them into a lookup table and use a pointer to access this table. if you need further eliboration on my waveform i may email it to you if you like. so that you will get a clear picture on my problem. thanks in advance This message was sent using the Comp.DSP web interface on www.DSPRelated.com
Reply by ●September 14, 20052005-09-14
On Tue, 13 Sep 2005 15:14:12 -0500, "Aboodi" <mohamed.dahidah@mmu.edu.my> wrote in comp.dsp:> Dear all, > I have set Timer1 to generate symmetric PWM waveform, and i need to > configure its compare register to change the duty cycle. > I set T1CON to reload condition, however as to have different compare > values it came across my attention that I need to set a lookup table > storing all these values. > > could anyone help me on how write this comapre interrupt service to > reload/ access this table in order to change the duty cycle. > > thank you in advanceYou ISR and table should probably look something like this. Warning, not compiled or tested, and I don't use the compare interrupt in my application, only the period and underflow interrupts, but the idea is very similar. #include <GPIO_Regs.h> #include <DSP28_Device.h> #include "f28xbmsk.h" const uint16_t pwm_values [] = { value_1, value_2, /* ... */ value_n_minus_1, value_n }; #define NUM_VALUES (sizeof pwm_values / sizeof *pwm_values) #pragma CODE_SECTION(PWM_Compare_ISR, "INTERNAL_CODE"); void interrupt PWM_Compare_ISR(void) { static int16_t index = 0; if (index >= NUM_VALUES) { index = 0; } EvaRegs.CMPR1 = pwm_valuse [index++]; EvaRegs.EVAIMRA.bit.T1CINT = 1; EvaRegs.EVAIFRA.all = BIT8; PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; } Somewhere in your foreground initialization code, when you are setting up the event manager, you need to store the address of the ISR in the right entry in the PIE vector table: /* prototype of the ISR function */ void interrupt PWM_Compare_ISR(void); PieVectTable.T1CINT = PWM_Compare_ISR; PieCtrlRegs.PIEIER2.all |= M_INT4; IER |= M_INT2; Be sure and check the bit fields against the data sheets for the PIE controller and event manager, I am not sure they are correct. Particularly that M_INT4. -- Jack Klein Home: http://JK-Technology.Com FAQs for comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html comp.lang.c++ http://www.parashift.com/c++-faq-lite/ alt.comp.lang.learn.c-c++ http://www.contrib.andrew.cmu.edu/~ajo/docs/FAQ-acllc.html
Reply by ●September 15, 20052005-09-15
Reply by ●September 15, 20052005-09-15
>On Tue, 13 Sep 2005 15:14:12 -0500, "Aboodi" ><mohamed.dahidah@mmu.edu.my> wrote in comp.dsp: > >> Dear all, >> I have set Timer1 to generate symmetric PWM waveform, and i need to >> configure its compare register to change the duty cycle. >> I set T1CON to reload condition, however as to have different compare >> values it came across my attention that I need to set a lookup table >> storing all these values. >> >> could anyone help me on how write this comapre interrupt service to >> reload/ access this table in order to change the duty cycle. >> >> thank you in advance > >You ISR and table should probably look something like this. Warning, >not compiled or tested, and I don't use the compare interrupt in my >application, only the period and underflow interrupts, but the idea is >very similar. > >#include <GPIO_Regs.h> >#include <DSP28_Device.h> >#include "f28xbmsk.h" > >const uint16_t pwm_values [] = >{ > value_1, > value_2, > /* ... */ > value_n_minus_1, > value_n >}; > >#define NUM_VALUES (sizeof pwm_values / sizeof *pwm_values) > >#pragma CODE_SECTION(PWM_Compare_ISR, "INTERNAL_CODE"); >void interrupt PWM_Compare_ISR(void) >{ > static int16_t index = 0; > > if (index >= NUM_VALUES) > { > index = 0; > } > > EvaRegs.CMPR1 = pwm_valuse [index++]; > > EvaRegs.EVAIMRA.bit.T1CINT = 1; > EvaRegs.EVAIFRA.all = BIT8; > PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; >} > >Somewhere in your foreground initialization code, when you are setting >up the event manager, you need to store the address of the ISR in the >right entry in the PIE vector table: > >/* prototype of the ISR function */ >void interrupt PWM_Compare_ISR(void); > > PieVectTable.T1CINT = PWM_Compare_ISR; > PieCtrlRegs.PIEIER2.all |= M_INT4; > IER |= M_INT2; > >Be sure and check the bit fields against the data sheets for the PIE >controller and event manager, I am not sure they are correct. >Particularly that M_INT4. > >-- >Jack Klein >Home: http://JK-Technology.Com >FAQs for >comp.lang.c http://www.eskimo.com/~scs/C-faq/top.html >comp.lang.c++ http://www.parashift.com/c++-faq-lite/ >alt.comp.lang.learn.c-c++ >http://www.contrib.andrew.cmu.edu/~ajo/docs/FAQ-acllc.html >Many thanks to you Jack, I will try it out and see how it goes thanks again Aboodi This message was sent using the Comp.DSP web interface on www.DSPRelated.com
Reply by ●September 16, 20052005-09-16
>On Tue, 13 Sep 2005 15:14:12 -0500, "Aboodi" ><mohamed.dahidah@mmu.edu.my> wrote in comp.dsp: > >> Dear all, >> I have set Timer1 to generate symmetric PWM waveform, and i need to >> configure its compare register to change the duty cycle. >> I set T1CON to reload condition, however as to have different compare >> values it came across my attention that I need to set a lookup table >> storing all these values. >> >> could anyone help me on how write this comapre interrupt service to >> reload/ access this table in order to change the duty cycle. >> >> thank you in advance > >You ISR and table should probably look something like this. Warning, >not compiled or tested, and I don't use the compare interrupt in my >application, only the period and underflow interrupts, but the idea is >very similar. >Dear Jack I have tried to compile your suggested code. I used C281x C/C++ Header Files and Peripheral Examples i.e. SPRC097 at http://focus.ti.com/docs/toolsw/folders/print/sprc097.html as a guide to initialize my EVA timer and compare..etc.when i bulit the program i found many error. I could figure out what's the problem, the following is my code:.... is there any wroung with this:? #include "DSP281x_Device.h" // DSP281x Headerfile Include File #include "DSP281x_Examples.h" // DSP281x Examples Include File // Prototype statements for functions found within this file. interrupt void PWM_Compare_isr(void); void init_PWM_Compare(void); void main(void) { // Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP281x_SysCtrl.c file. InitSysCtrl(); // Step 2. Initalize GPIO: // This example function is found in the DSP281x_Gpio.c file and // illustrates how to set the GPIO to it's default state. // InitGpio(); // Skipped for this example // Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT; // Initialize PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // This function is found in the DSP281x_PieCtrl.c file. InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000; // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt // is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in DSP281x_DefaultIsr.c. // This function is found in DSP281x_PieVect.c. InitPieVectTable(); // Interrupts that are used in this example are re-mapped to // ISR functions found within this file. EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.T1CINT = PWM_Compare_ISR; EDIS; // This is needed to disable write to EALLOW protected registers // Step 4. Initialize all the Device Peripherals: // This function is found in DSP281x_InitPeripherals.c // InitPeripherals(); // Not required for this example init_eva_timer1(); // Step 5. User specific code, enable interrupts: // Enable PIE group 2 interrupt 4 for T1CINT PieCtrlRegs.PIEIER2.all = M_INT5; // Enable CPU INT2 for T1CINT IER |= M_INT2; // Enable global Interrupts and higher priority real-time debug events: EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM // Step 6. IDLE loop. Just sit and loop forever: for(;;) { } { void init_PWM_Compare(void); { // this table is for testing only, it could be up to 225 values or even higher; const uint16_t pwm_values [5] ={23678, 8976, 2365, 0, 34567}; { value_1, value_2, /* ... */ value_n_minus_1, value_n } #define NUM_VALUES (sizeof pwm_values / sizeof *pwm_values) #pragma CODE_SECTION(PWM_Compare_ISR, "INTERNAL_CODE"); void interrupt PWM_Compare_ISR(void); { static int16_t index = 0; if (index >= NUM_VALUES) { index = 0; } EvaRegs.CMPR1 = pwm_valuse [index++]; EvaRegs.EVAIMRA.bit.T1CINT = 1; EvaRegs.EVAIFRA.all = BIT8; PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; } /* prototype of the ISR function */ void interrupt PWM_Compare_ISR(void); PieVectTable.T1CINT = PWM_Compare_ISR; PieCtrlRegs.PIEIER2.all |= M_INT4; IER |= M_INT2; // Initialize EVA Timer 1: // Setup Timer 1 Registers (EV A) EvaRegs.GPTCONA.all = 0x0001; // Set the Period for the GP timer 1 to 1171875 (decimal number); EvaRegs.T1PR = 1171875; // Period EvaRegs.T1CMPR = PWM_Values; // PWM values (a table for different duty cycles); // Enable compare interrupt bits for GP timer 1 EvaRegs.EVAIMRA.bit.T1CINT = 1; EvaRegs.EVAIFRA.all = BIT8; //GP timer 1 compare interrupt flag; // EvaRegs.T1CON.all = 0x1042 counting up mode; EvaRegs.T1CON.all = 0x1040; } interrupt void init_PWM_Compare(void); { // Enable more interrupts from this timer EvaRegs.EVAIMRA.bit.T1CINT = 1; // Note: To be safe, use a mask value to write to the entire // EVAIFRA register. Writing to one bit will cause a //read-modify-write // operation that may have the result of writing 1's to clear // bits other then those intended. EvaRegs.EVAIFRA.all = BIT8; // Acknowledge interrupt to receive more interrupts from PIE group 2 PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; } EDIS; } } and I copy the errors for your reference as follows: ------ Example_281xEvTimerPeriod.pjt - Debug ------------------- [Example_281xEvTimerPeriod.c] "C:\TI\C2000\CGTOOLS\BIN\cl2000" -g -q -dr -fr"C:/tidcs/c28/DSP281x/v100/DSP281x_examples/ev_timer_period/Debug" -fs"C:/tidcs/c28/DSP281x/v100/DSP281x_examples/ev_timer_period/Debug" -i"../../DSP281x_headers/include" -i"../../DSP281x_common/include" -d"_DEBUG" -d"LARGE_MODEL" -ml -mt -v28 -@"Debug.lkf" "Example_281xEvTimerPeriod.c" "Example_281xEvTimerPeriod.c", line 88: error: identifier "PWM_Compare_ISR" is undefined "Example_281xEvTimerPeriod.c", line 95: remark: function declared implicitly "Example_281xEvTimerPeriod.c", line 119: error: identifier "uint16_t" is undefined "Example_281xEvTimerPeriod.c", line 119: warning: dynamic initialization in unreachable code "Example_281xEvTimerPeriod.c", line 121: error: identifier "value_1" is undefined "Example_281xEvTimerPeriod.c", line 122: error: identifier "value_2" is undefined "Example_281xEvTimerPeriod.c", line 124: error: identifier "value_n_minus_1" is undefined "Example_281xEvTimerPeriod.c", line 125: error: identifier "value_n" is undefined "Example_281xEvTimerPeriod.c", line 126: error: expected a ";" "Example_281xEvTimerPeriod.c", line 131: error: declaration may not appear after executable statement in block "Example_281xEvTimerPeriod.c", line 133: error: identifier "int16_t" is undefined "Example_281xEvTimerPeriod.c", line 140: error: identifier "pwm_valuse" is undefined "Example_281xEvTimerPeriod.c", line 149: error: declaration may not appear after executable statement in block "Example_281xEvTimerPeriod.c", line 160: warning: integer conversion resulted in truncation "Example_281xEvTimerPeriod.c", line 161: error: identifier "PWM_Values" is undefined "Example_281xEvTimerPeriod.c", line 119: warning: variable "pwm_values" was set but never used "Example_281xEvTimerPeriod.c", line 173: error: declaration may not appear after executable statement in block "Example_281xEvTimerPeriod.c", line 130: warning: specified symbol 'PWM_Compare_ISR' undefined 13 errors detected in the compilation of "Example_281xEvTimerPeriod.c". Build Complete, 13 Errors, 4 Warnings, 1 Remarks. your comments is very much appreciated many thanks in advance aboodi This message was sent using the Comp.DSP web interface on www.DSPRelated.com
Reply by ●September 17, 20052005-09-17
>>On Tue, 13 Sep 2005 15:14:12 -0500, "Aboodi" >><mohamed.dahidah@mmu.edu.my> wrote in comp.dsp: >> >>> Dear all, >>> I have set Timer1 to generate symmetric PWM waveform, and i need to >>> configure its compare register to change the duty cycle. >>> I set T1CON to reload condition, however as to have different compare >>> values it came across my attention that I need to set a lookup table >>> storing all these values. >>> >>> could anyone help me on how write this comapre interrupt service to >>> reload/ access this table in order to change the duty cycle. >>> >>> thank you in advance >> >>You ISR and table should probably look something like this. Warning, >>not compiled or tested, and I don't use the compare interrupt in my >>application, only the period and underflow interrupts, but the idea is >>very similar. >> > >Dear Jack > >I have tried to compile your suggested code. I used C281x >C/C++ Header Files and Peripheral Examples i.e. SPRC097 at >http://focus.ti.com/docs/toolsw/folders/print/sprc097.html > as a guide to initialize my EVA timer and compare..etc.when i bulit the >program i found many error. I could figure out what's the problem, the >following is my code:.... is there any wroung with this:? > >#include "DSP281x_Device.h" // DSP281x Headerfile Include File >#include "DSP281x_Examples.h" // DSP281x Examples Include File > > >// Prototype statements for functions found within this file. >interrupt void PWM_Compare_isr(void); >void init_PWM_Compare(void); > > >void main(void) >{ >// Step 1. Initialize System Control: >// PLL, WatchDog, enable Peripheral Clocks >// This example function is found in the DSP281x_SysCtrl.c file. >InitSysCtrl(); > >// Step 2. Initalize GPIO: >// This example function is found in the DSP281x_Gpio.c file and >// illustrates how to set the GPIO to it's default state. >// InitGpio(); // Skipped for this example > > >// Step 3. Clear all interrupts and initialize PIE vector table: >// Disable CPU interrupts >DINT; > >// Initialize PIE control registers to their default state. >// The default state is all PIE interrupts disabled and flags >// are cleared. >// This function is found in the DSP281x_PieCtrl.c file. >InitPieCtrl(); > >// Disable CPU interrupts and clear all CPU interrupt flags: >IER = 0x0000; >IFR = 0x0000; > >// Initialize the PIE vector table with pointers to the shell Interrupt >// Service Routines (ISR). >// This will populate the entire table, even if the interrupt >// is not used in this example. This is useful for debug purposes. >// The shell ISR routines are found in DSP281x_DefaultIsr.c. >// This function is found in DSP281x_PieVect.c. >InitPieVectTable(); > >// Interrupts that are used in this example are re-mapped to >// ISR functions found within this file. >EALLOW; // This is needed to write to EALLOW protected registers > >PieVectTable.T1CINT = PWM_Compare_ISR; > >EDIS; // This is needed to disable write to EALLOW protected registers > >// Step 4. Initialize all the Device Peripherals: >// This function is found in DSP281x_InitPeripherals.c >// InitPeripherals(); // Not required for this example >init_eva_timer1(); > >// Step 5. User specific code, enable interrupts: > > > >// Enable PIE group 2 interrupt 4 for T1CINT >PieCtrlRegs.PIEIER2.all = M_INT5; > >// Enable CPU INT2 for T1CINT >IER |= M_INT2; > >// Enable global Interrupts and higher priority real-time debug events: >EINT; // Enable Global interrupt INTM >ERTM; // Enable Global realtime interrupt DBGM > >// Step 6. IDLE loop. Just sit and loop forever: >for(;;) >{ > >} >{ >void init_PWM_Compare(void); >{ >// this table is for testing only, it could be up to 225 values or even >higher; > >const uint16_t pwm_values [5] ={23678, 8976, 2365, 0, 34567}; >{ >value_1, >value_2, >/* ... */ >value_n_minus_1, >value_n >} > >#define NUM_VALUES (sizeof pwm_values / sizeof *pwm_values) > >#pragma CODE_SECTION(PWM_Compare_ISR, "INTERNAL_CODE"); >void interrupt PWM_Compare_ISR(void); >{ >static int16_t index = 0; > >if (index >= NUM_VALUES) >{ >index = 0; >} > >EvaRegs.CMPR1 = pwm_valuse [index++]; > >EvaRegs.EVAIMRA.bit.T1CINT = 1; >EvaRegs.EVAIFRA.all = BIT8; >PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; >} > > >/* prototype of the ISR function */ >void interrupt PWM_Compare_ISR(void); > >PieVectTable.T1CINT = PWM_Compare_ISR; >PieCtrlRegs.PIEIER2.all |= M_INT4; >IER |= M_INT2; > >// Initialize EVA Timer 1: >// Setup Timer 1 Registers (EV A) >EvaRegs.GPTCONA.all = 0x0001; > >// Set the Period for the GP timer 1 to 1171875 (decimal number); >EvaRegs.T1PR = 1171875; // Period >EvaRegs.T1CMPR = PWM_Values; // PWM values (a table for different duty >cycles); > >// Enable compare interrupt bits for GP timer 1 > >EvaRegs.EVAIMRA.bit.T1CINT = 1; >EvaRegs.EVAIFRA.all = BIT8; //GP timer 1 compare interrupt flag; > >// EvaRegs.T1CON.all = 0x1042 counting up mode; >EvaRegs.T1CON.all = 0x1040; > >} > >interrupt void init_PWM_Compare(void); >{ > > >// Enable more interrupts from this timer > EvaRegs.EVAIMRA.bit.T1CINT = 1; > >// Note: To be safe, use a mask value to write to the entire >// EVAIFRA register. Writing to one bit will cause a >//read-modify-write >// operation that may have the result of writing 1's to clear >// bits other then those intended. > EvaRegs.EVAIFRA.all = BIT8; > >// Acknowledge interrupt to receive more interrupts from PIE group 2 >PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; >} > >EDIS; >} >} > >and I copy the errors for your reference as follows: > >------ Example_281xEvTimerPeriod.pjt - Debug ------------------- >[Example_281xEvTimerPeriod.c] "C:\TI\C2000\CGTOOLS\BIN\cl2000" -g -q -dr >-fr"C:/tidcs/c28/DSP281x/v100/DSP281x_examples/ev_timer_period/Debug" >-fs"C:/tidcs/c28/DSP281x/v100/DSP281x_examples/ev_timer_period/Debug" >-i"../../DSP281x_headers/include" -i"../../DSP281x_common/include" >-d"_DEBUG" -d"LARGE_MODEL" -ml -mt -v28 -@"Debug.lkf" >"Example_281xEvTimerPeriod.c" >"Example_281xEvTimerPeriod.c", line 88: error: identifier >"PWM_Compare_ISR" is undefined >"Example_281xEvTimerPeriod.c", line 95: remark: function declared >implicitly >"Example_281xEvTimerPeriod.c", line 119: error: identifier "uint16_t" is >undefined >"Example_281xEvTimerPeriod.c", line 119: warning: dynamic initialization >in unreachable code >"Example_281xEvTimerPeriod.c", line 121: error: identifier "value_1" is >undefined >"Example_281xEvTimerPeriod.c", line 122: error: identifier "value_2" is >undefined >"Example_281xEvTimerPeriod.c", line 124: error: identifier >"value_n_minus_1" is undefined >"Example_281xEvTimerPeriod.c", line 125: error: identifier "value_n" is >undefined >"Example_281xEvTimerPeriod.c", line 126: error: expected a ";" >"Example_281xEvTimerPeriod.c", line 131: error: declaration may notappear>after executable statement in block >"Example_281xEvTimerPeriod.c", line 133: error: identifier "int16_t" is >undefined >"Example_281xEvTimerPeriod.c", line 140: error: identifier "pwm_valuse"is>undefined >"Example_281xEvTimerPeriod.c", line 149: error: declaration may notappear>after executable statement in block >"Example_281xEvTimerPeriod.c", line 160: warning: integer conversion >resulted in truncation >"Example_281xEvTimerPeriod.c", line 161: error: identifier "PWM_Values"is>undefined >"Example_281xEvTimerPeriod.c", line 119: warning: variable "pwm_values" >was set but never used >"Example_281xEvTimerPeriod.c", line 173: error: declaration may notappear>after executable statement in block >"Example_281xEvTimerPeriod.c", line 130: warning: specified symbol >'PWM_Compare_ISR' undefined >13 errors detected in the compilation of "Example_281xEvTimerPeriod.c". > >Build Complete, > 13 Errors, 4 Warnings, 1 Remarks. > > > >your comments is very much appreciated > >many thanks in advance > >aboodi > >This message was sent using the Comp.DSP web interface on >www.DSPRelated.com >This message was sent using the Comp.DSP web interface on www.DSPRelated.com






