TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: pinkfloyd en 02 de Septiembre de 2008, 17:50:04

Título: introduccion de datos en memoria
Publicado por: pinkfloyd en 02 de Septiembre de 2008, 17:50:04
Hola a todos

Estoy trabajando con un dsPIC30F4011. Mi objetivo es un crear un PWM senoidal y para ello introduzco los valores de la funcion seno (de todo un periodo) en la memoria de datos X, y luego en cada interrupcion PWM voy leyendo los datos de esa tabla y opero con ellos para obtener el ciclo de trabajo. La cosa es que estoy trabajando con 64 valores de la funcion seno y me funciona bien, pero ahora me gustaria trabajar con 128 para tener mas precision. Al hacer esto me da problemas en la compilacion.

El codigo de introduccion de datos es el siguiente:

int sinetable[128] __attribute__ ((space(xmemory)))={...};

El error que me da es:

inverter2ccprueba.o: Link Error: Could not allocate section .nbss, size = 10 bytes, attributes = bss near
Link Error: Could not allocate data memory

No lo entiendo muy bien. ¿Alguien me podria dar una solucion? Con 64 valores me funciona bien.

Muchas gracias

Título: Re: introduccion de datos en memoria
Publicado por: Nocturno en 03 de Septiembre de 2008, 02:05:59
Imagino que usas MPLAB.
Si es así, vete al menú Project->Build options->Project.
Ahora abre la pestaña MPLAB C30 y elige en el desplegable "Categories" la opción Memory Model.
En la sección Data Model elige "Large data model".

En teoría con eso se resuelve.

Por cierto, supongo que lo sabes, pero por si acaso. Si metes en la tabla los valores de sólo un cuadrante (de 0º a 90º) puedes obtener los de todo el recorrido (90º a 360º) con una sencilla operación.
Título: Re: introduccion de datos en memoria
Publicado por: pinkfloyd en 03 de Septiembre de 2008, 03:57:02
Hola

Muchas gracias, pero he probado eso y me sigue saliendo el mismo error.

En cuanto a lo de trabajar con valores del primer cuadrante solo, no es tan facil, porque estoy haciendo un PWM trifasico, y en la misma interrupcion, debo añadir al puntero un offset de 120º y otro de 240º. Ademas se debe recorrer toda la tabla de valores y volver a empezar una y otra vez, y poniendo una tabla completa es mucho mas comodo.

Pero muchas gracias por tu atencion!


Título: Re: introduccion de datos en memoria
Publicado por: blackcat en 04 de Septiembre de 2008, 22:43:59
¿¿Porque escribes datos en el área de memoria X ... ??

Porque no simplemente:

int sinetable[128];

Y el compilador buscará la mejor forma de ubicar esa tabla en RAM; eso y con el consejo del señor NOCTURNO debería de funcionar ... yo he hecho tablas de 1024 datos y funciona perfecto.

Saludos!
Título: Re: introduccion de datos en memoria
Publicado por: pinkfloyd en 05 de Septiembre de 2008, 13:35:50
Hola,

he metido

int sinetable[128]={dato1,dato2,...,...};

y me sigue dando el mismo error, no tengo ni idea.

Gracias


Título: Re: introduccion de datos en memoria
Publicado por: Sispic en 05 de Septiembre de 2008, 14:55:44
No sea que no tengas 128 valores , quizas asi

int sinetable[]={dato1,dato2,...,...};
Título: Re: introduccion de datos en memoria
Publicado por: pinkfloyd en 06 de Septiembre de 2008, 11:18:50
Hola de nuevo y gracias por vuestra colaboracion

Lo he intentado tambien asi

 int sinetable[]={dato1,dato2,...,...}

y me sigue saliendo el mismo error.
Al final lo dejare con 64 valores, pero no se que puede estar pasando
Título: Re: introduccion de datos en memoria
Publicado por: Nocturno en 06 de Septiembre de 2008, 11:57:01
¿Puedes poner aquí tu programa y tu proyecto de MPLAB para intentar compilarlo?
Título: Re: introduccion de datos en memoria
Publicado por: blackcat en 06 de Septiembre de 2008, 20:33:22
Ya que la tabla es estatica, es decir, no será modificada durante la ejecución del programa porque no la creas como una tabla de constantes, de esta manera el compilador la ubicará en la memoria de programa y no en la de datos;

const int sinetable[]={dato1,dato2,...,...}

Saludos!!
Título: Re: introduccion de datos en memoria
Publicado por: pinkfloyd en 07 de Septiembre de 2008, 08:16:55
Muchas gracias!!

Nocturno, no habia puesto mi programa, porque he utilizado el Visual Initializer, que genera el codigo en ensamblador y el resto del programa en C y resultaba un poco follon, pero con el consejo de blackcat ya lo he arreglado y me compila bien. Mañana en el laboratorio lo probare a ver si consigo obtener una onda senoidal mejor o en cambio tampoco se nota mucho.

Gracias de nuevo a todos!!