amigos... les cuento nuevamente....
pude compilar el codigo .. pero con el siguiente detalle.... se supone que al presionar la tecla 1 deberia hacer la FFT, pero sucede todo lo contrario... puedo presionar cualkier tecla y entra a la FFT y al presionar la 1 se detiene y queda a la espera de que llegue un numero para meterse a la FFT.
Les dejo el codigo para que opinen.
#include <p30F4013.h>
#include <dsp.h>
#include "fft.h"
#include <stdio.h>
#include <uart.h>
//////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////* CONFIGURACION DEL DISPOSITIVO *//////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
_FOSC(CSW_FSCM_OFF & XT_PLL16); /* Oscilador XT con 16xPLL */
_FWDT(WDT_OFF); /* Watchdog timer desactivado */
_FBORPOR(PBOR_OFF & MCLR_EN); /* Brown-out reset desactivado, MCLR reset activado */
_FGS(CODE_PROT_OFF); /* Proteccion de codigo desactivada*/
//////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////* ENTRADA A LA FFT *///////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
fractcomplex sigCmpx[FFT_BLOCK_LENGTH] __attribute__ ((section (".ydata, data, ymemory"), aligned (FFT_BLOCK_LENGTH * 2 *2)));//vector de entrada FFT
fractional inputSignal[FFT_BLOCK_LENGTH];
fractional Hn[FFT_BLOCK_LENGTH]; //aloja ventana
//////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////* DEFINICION DE VARIABLES*/////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
int doFFT;
int i;
char dato;
float REF;
int ACT;
fractional *p_real;
fractional *iPtr;
fractional *Hptr;
#define RD2 LATDbits.LATD2 //hacer parpadear
#define RD1 LATDbits.LATD1 //hacer parpadear
#define RD0 LATDbits.LATD0 //hacer parpadear
extern const fractcomplex twiddleFactors[FFT_BLOCK_LENGTH/2]__attribute__ ((space(auto_psv), aligned (FFT_BLOCK_LENGTH*2)));
//////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////* CONFIGURACION UART 2*///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
void __attribute__((interrupt, no_auto_psv)) _U2RXInterrupt(void);
void SendCom(unsigned int k, char *p);
void GetCom(unsigned int k, char *p);
void configUART2();
extern int __C30_UART;
void configUART2(void)
{
unsigned int baudvalue; // Pone el valor del registro baud
unsigned int U2MODEvalue; // Pone el valor del registro de configuración de la uart
unsigned int U2STAvalue; // Modos de interrupción de TX y RX
__C30_UART=2; // Le digo que voy a utilzar la usart2
CloseUART2(); // Apaga el modulo UART2
ConfigIntUART2(UART_RX_INT_EN & UART_RX_INT_PR6 & UART_TX_INT_DIS & UART_TX_INT_PR2); // Configura las interrupciones de la UART2, transmisión y recepción */
baudvalue = 191; // Configura el modulo UART2 para transmitir con 8 bits de datos y uno de parada
// y a 9600 baudios
U2MODEvalue = UART_EN & UART_IDLE_CON & UART_RX_TX &
UART_DIS_WAKE & UART_DIS_LOOPBACK &
UART_DIS_ABAUD & UART_NO_PAR_8BIT &
UART_1STOPBIT;
U2STAvalue = UART_INT_TX_BUF_EMPTY &
UART_TX_PIN_NORMAL &
UART_TX_ENABLE & UART_INT_RX_CHAR &
UART_ADR_DETECT_DIS &
UART_RX_OVERRUN_CLEAR;
OpenUART2(U2MODEvalue, U2STAvalue, baudvalue); // Inicializa la uart
}
//////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////* CONFIGURACION DE INTERRUPCIONES *///////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
void __attribute__((interrupt, no_auto_psv)) _U2RXInterrupt(void)
{
IEC1bits.U2RXIE=0; // Interrupcion de recepcion
GetCom(sizeof(dato),(char *)&dato); // Se guarda el dato que se recibe
IEC1bits.U2RXIE=1; // en la variable dato
IFS1bits.U2RXIF=0;
}
void SendCom(unsigned int k, char *p) // Funcion que envia datos
{
for(;k;--k)
{
while(BusyUART2()==1);
putcUART2(*p);
}
}
void GetCom(unsigned int k, char *p) // Funcion que recibe datos
{
//for(;k;--k)
//{
while(DataRdyUART2()==0);
*p=getcUART2();
//}
}
//////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////* PROGRAMA PRINCIPAL *////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
int i;
TRISDbits.TRISD2=0;
TRISDbits.TRISD1=0;
TRISDbits.TRISD0=0;
iPtr = &inputSignal[0] ; //inicializa puntero
Hptr = &Hn[0]; //inicializa puntero al primer elemento de la ventana Hn
HanningInit(FFT_BLOCK_LENGTH, Hptr); //genera la ventana (la campana)
doFFT=0;
RD0=1;
RD1=1;
RD2=1;
delay_ms(1000);
RD1=0;
RD0=0;
RD2=0;
__C30_UART=2; // Para utilizar la UART2.
configUART2(); // Configura la UART2 ;
while(1)
{
getcUART2(); // Recibo dato y lo mando a la variable dato
if(dato == '1')
{
init_adc();
}
if(doFFT)
{
adc_int(0); //desactiva interrupción ADC
iPtr=&inputSignal[0]; //inicializa puntero
RD0=1;//para comprobar
delay_ms(200);
RD0=0;
RD2=1;
VectorWindow(/*20uS*/FFT_BLOCK_LENGTH, iPtr, iPtr, Hptr);//Aplica ventana
// for(i=0;i<FFT_BLOCK_LENGTH;i++)
// {
// printf(" xn,%f\n\r",Fract2Float(inputSignal[i] ) );
// }
//
for(/*40uS*/i=0;i<FFT_BLOCK_LENGTH;i++) //Llena el vector complejo con data del CAD
{
sigCmpx[i].real=inputSignal[i];
sigCmpx[i].imag=0;
}
// printf("sigCmpx");
// for(i=0;i<FFT_BLOCK_LENGTH;i++)
// { /*imprime señal dentro del vector complejo (comprobación)*/
// printf("\n \r %f + j*%f",Fract2Float(sigCmpx[i].real ),Fract2Float(sigCmpx[i].imag ) );
// }
//
/*calcula FFT*/ //FFT queda en sigCmpx
FFTComplexIP (/*320uS*/LOG2_BLOCK_LENGTH, &sigCmpx[0], (fractcomplex *) __builtin_psvoffset(&twiddleFactors[0]), (int) __builtin_psvpage(&twiddleFactors[0]));
/* Ordena en órden correcto*/
BitReverseComplex (/*32uS*/LOG2_BLOCK_LENGTH, &sigCmpx[0]);
printf("Xw");
for(i=0;i<FFT_BLOCK_LENGTH;i++)
{ /*imprime salida de FFT*/
printf("\n \r %f+j*%f",Fract2Float(sigCmpx[i].real),Fract2Float(sigCmpx[i].imag));
}
/* calcula la suma de los cuadrados de cada elemento complejo de sigCmpx*/
SquareMagnitudeCplx(/*18uS*/FFT_BLOCK_LENGTH, &sigCmpx[0], &sigCmpx[0].real );
RD2=0;
RD1=1;
delay_ms(500);
RD1=0;
doFFT=0,
iPtr=&inputSignal[0];
adc_int(1); //activa la interrupción ADC
}
}
}
Gracias de nuevo...