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.