TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado por: fram_22 en 20 de Enero de 2012, 15:54:06
-
Hola a todos:
Nuevamente acudo a ustedes con una duda. Estoy trabajando con un dsPIC33EP512MC810 en C30, planeo utilizar la libreria dsp.h . Esta ya la he utilizado anteriormente con las familias 30 y 33 sin mayores problemas. Sin embargo en cuanto intento utilizar la misma libreria con este dsPIC obtengo problemas por el linkeado. EL error que me da MPLAB C30 esel siguiente:
E:\Archivos Fernando\DSPICS\DSPIC33\ADC_dspic33e\codigo.c:55: undefined reference to `MatrixMultiply'
Link step failed.
He agregado los archivos de libreria libdsp-coff.a, libdsp-elf.a, libq-coff.a, libq-elf.a, libq-dsp-coff.a y libq-dsp-elf.a que son los cuales genearlente hago que funciones las librerias dsp.h y libq.h sin embargo ahora no puedo. Alguien tiene una idea al respecto?
saludos!
-
alguien alguna idea :shock:? Ya puse una solicitud de servicio en microchip pero aun nada.
saludos!
-
Hola fram!
Imagino que para que alguien te pueda ayudar tienes que dar mas detalles de tu código. (Por ejemplo, en el archivo "codigo.c" es imposible imaginar que tienes ahi, y probablemente el error venga de ese archivo)
Saludos y explicate mejor para tener una respuesta.
-
el problema que tienes es que en la linea 55 de codigo.c la funcion que has puesto no existe, lo unico que no se es si esa funcion la trae alguna libreria o algo...
has puesto el #include <p33Exxxx.h> ?
-
Hola fram!
Imagino que para que alguien te pueda ayudar tienes que dar mas detalles de tu código. (Por ejemplo, en el archivo "codigo.c" es imposible imaginar que tienes ahi, y probablemente el error venga de ese archivo)
Saludos y explicate mejor para tener una respuesta.
Tienes razón olvide poner el código. La aplicación que pienso realizar es un Control de Voltaje Orientado con Flujo Virtual (VF-VOC). De hecho este código (con algunos cambios para adecuarlo) ya lo probe en un dspic33fj128mc802 y funciona a la perfección, por ello se que el error es más que nada del linker. Pero me gustaria implementarlo en un dspic33e a 60 MIPS, porque posteriomente planeo realizar calculo intensivo. De cualquier forma lo pongo a continuación:
#include <p33EP512MU810.h>
#include <dsp.h>
#include "libq.h"
////////////////////////////////////////////////////////Fusibles de operacion/////////////////////////////////////////////////////////////
_FOSCSEL(FNOSC_FRC);
_FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT);
_FWDT(FWDTEN_OFF);
// Number of locations for ADC buffer = (AN0 to AN5) x 1 = 6 words
__eds__ int BufferA[14][8] __attribute__((eds,space(dma),aligned(256)));
///////////////////////////////////////////////////////Funciones///////////////////////////////////////////////////////////////////////
void initAdc1(void);
void initTmr3(void);
//
fractional A[250],B[250],C[250],alfa[250],beta[250],dummy;
_Q15 clarke[3][3],alfa_beta[3],abc[3],dos_tercios;
int muestras=0,bandera=0,i=1;
///////////////////////////////////////////////////////////MAIN///////////////////////////////////////////////////////////////////////
int main(void){
//Cambio de oscilador RC a xtal con PLL para operacion a 40 MIPS
// Configure PLL prescaler, PLL postscaler, PLL divisor
PLLFBD=58;// M = 32
CLKDIVbits.PLLPOST=0;// N2 = 2
CLKDIVbits.PLLPRE=0;// N1 = 2
// Disable Watch Dog Timer
RCONbits.SWDTEN=0;
// Initiate Clock Switch to Primary Oscillator with PLL (NOSC = 0b011)
__builtin_write_OSCCONH(0x03);
__builtin_write_OSCCONL(0x01);
// Wait for Clock switch to occur
while (OSCCONbits.COSC != 0b011);
// Wait for PLL to lock
while(OSCCONbits.LOCK!=1) {};
/////////////////////////////////////////////// Aqui termina la conficuracion del dsPIC a 40 MIPS//////////////////////////////////////////
////////////////////////////////////////////////Entrada perifericos/////////////////////////////////////////////////////////////
initAdc1();
initTmr3();
/////////////////////////////////////////////////inicializacion
/*dos_tercios=_Q15ftoi(0.66666666666);
clarke[0][0]=_Q15cosPI(0);
clarke[0][1]=_Q15cosPI(_Q15sub(0,dos_tercios));
clarke[0][2]=_Q15cosPI(_Q15add(0,dos_tercios));
clarke[1][0]=_Q15sinPI(0);
clarke[1][1]=_Q15sinPI(_Q15sub(0,dos_tercios));
clarke[1][2]=_Q15sinPI(_Q15add(0,dos_tercios));
clarke[2][0]=_Q15ftoi(0.5);
clarke[2][1]=_Q15ftoi(0.5);
clarke[2][2]=_Q15ftoi(0.5);*/
////////////////////////////////////////////////////////Ciclo infinito//////////////////////////////////////////////////////////
while(1){
if(bandera==1){
for(i=0;i<150;i++){
abc[0]=A[i];
abc[1]=B[i];
abc[2]=C[i];
MatrixMultiply(3,3,1,alfa_beta,clarke,abc);
alfa[i]=alfa_beta[0];
alfa[i]=alfa_beta[0];
}
bandera=0;
}
}
}
//
/////////////////////////////////////////////////////////Subrutinas de interrupcion y configuracion//////////////////////////////////////
void initAdc1(void)
{
AD1CON1bits.FORM = 3; // Data Output Format: Signed Fraction (Q15 format)
AD1CON1bits.SSRC = 2; // Sample Clock Source: GP Timer starts conversion
AD1CON1bits.ASAM = 1; // ADC Sample Control: Sampling begins immediately after conversion
AD1CON1bits.AD12B = 0; // 10-bit ADC operation
AD1CON1bits.SIMSAM=1;
AD1CON2bits.CSCNA = 0; // Scan Input Selections for CH0+ during Sample A bit
AD1CON2bits.CHPS = 2; // Converts CH0, Ch1 and Ch2
AD1CON3bits.ADRC = 0; // ADC Clock is derived from Systems Clock
AD1CON3bits.ADCS = 63; // ADC Conversion Clock Tad=Tcy*(ADCS+1)= (1/40M)*64 = 1.6us (625Khz)
// ADC Conversion Time for 10-bit Tc=12*Tab = 19.2us
AD1CON1bits.ADDMABM = 0; // DMA buffers are built in scatter/gather mode
AD1CON2bits.SMPI = 3; // interrupt every 4 convertions
// AD1CON4bits.DMABL = 3; // Each buffer contains 8 words
AD1CON4bits.ADDMAEN = 0; // Conversion results stored in ADCxBUF0 to ADCxBUFF registers
AD1CHS0bits.CH0SA=2; //Channel 0 positive input is AN2
AD1CHS123bits.CH123SA=1; //
//AD1CSSH/AD1CSSL: A/D Input Scan Selection Register
AD1CSSH = 0x000F;
ANSELB = 0x003C;
TRISBbits.TRISB2 = 1;
TRISBbits.TRISB3 = 1;
TRISBbits.TRISB4 = 1;
TRISBbits.TRISB5 = 1;
IPC3bits.AD1IP=7; //CH1 positive input is AN3, CH2 positive input is AN4, CH3 positive input is AN5
IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit
IEC0bits.AD1IE = 1; // Do Not Enable A/D interrupt
AD1CON1bits.ADON = 1; // Turn on the A/D converter
}
//
void initTmr3(void)
{
TMR3 = 0x0000;
PR3 = 1000; // Trigger ADC1 every 125usec
IFS0bits.T3IF = 0; // Clear Timer 3 interrupt
IEC0bits.T3IE = 0; // Disable Timer 3 interrupt
T3CONbits.TON = 1; //Start Timer 3
}
//
void __attribute__((interrupt, no_auto_psv)) _AD1Interrupt(void)
{
A[muestras]=ADC1BUF0;
B[muestras]=ADC1BUF1;
C[muestras]=ADC1BUF2;
dummy=ADC1BUF3;
muestras++;
if(muestras>=250){
muestras=0;
bandera=1;
}
IFS0bits.AD1IF = 0; // Clear the ADC1 Interrupt Flag
}
La linea que meda problema es como dice merlinz la siguiente:
MatrixMultiply(3,3,1,alfa_beta,clarke,abc);
Este operacion matricial viene definida en el archivo dsp.h. Ya la he utilizado previamente en otros dsPICs sin mayores problemas (30f3011 y 33fj128mc802). Por ello se que la función esta siendo utilizada correctamente.
Para utilizar generalmente las funciones de dsp.h y de libq.h hay que agregar los archivos libdsp-coff.a, libdsp-elf.a, libq-coff.a, libq-elf.a, libq-dsp-coff.a y libq-dsp-elf.a. |Estos ya los agregue pero aun asi me carca el error de linker.
Por lo anterior parece ser que es un error propio por utilizar un dspic33e. Por ello acudo a uds. Para ver si alguien tiene alguna idea sobre loque pueda estar pasando.
-
parece como si te faltase la libreria objeto ya que te da error al linkear
-
Hola de nuevo!
Te comento que me parece te falto colocar la linea:
extern fractional* MatrixMultiply (
int numRows1,
int numCols1Rows2,
int numCols2,
fractional* dstM,
fractional* srcM1,
fractional* srcM2
);
Espero que te sea útil.
Saludos
-
HOla muchas gracias por sus respuestas. originalment yo tambien he pensado en la libreria faltante, pero no he logrado dar cual es. Mientras voy a intentar al idea de ema. Esperemos funcione.
saludos!
-
Hola:
He intentado declarar la funciona como external, tal y como sugirio ema. Pero no ha cambiado nada :shock:. Apararentemente debe ser algun archivo faltante. Lo extraño es que no logro encontrar nada al respecto. Los de microchip siguen sin contestar el ticket que solicite. Mientras seguire haciendo la lucha. Cualquier idea es biencenida y se las agradecere profundamente.
saludos!
-
Como dice MerLiNz, puede ser que para ese microcontrolador la biblioteca no esté completa y no esté esa función. Si no tienes la ultima versión de C30 prueba actualizándolo.
Saludos!
-
no hace falta que lo pongas como external, te esta dando error el linkeador no el compilador, es decir tu lo tienes declarado pero la funcion no existe a la hora de enlazar las funciones.
-
Otra que te queda es reunir en el proyecto los archivos fuente de dsp.h, para así crear los archivos object que te están faltando (seguramente) en la librería.
Saludos!
-
Gracias por sus respuesta.
Yo tambien estaba temiendo que se trata de soporte incompleto. (Lo cual parece logico si consideramos que estos dispositivos tienen meses).
La idea de suki suena interesante pero no estoy muy seguro de como hacerlo. Podrias explicar con un poco0 de mas detalle?
saludos!
-
Gracias por sus respuesta.
Yo tambien estaba temiendo que se trata de soporte incompleto. (Lo cual parece logico si consideramos que estos dispositivos tienen meses).
La idea de suki suena interesante pero no estoy muy seguro de como hacerlo. Podrias explicar con un poco0 de mas detalle?
saludos!
Buscar los archivos .c o .s de las funciones que necesitas implementar y agregarlas al proyecto (tal como haces con el *.h)
Saludos!
-
Finalmente el problema resulto ser una tonteria.
Baje la version mas nueva de c30 y el archivo compilo perfectamente.
saludos!
-
Por el MCU utilizado, era de esperar ;-)
-
si en realidad como es bastante nuevo tiene una serie de detalles importantes. Pero pues bueno a seguir trabajando