TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: LuNaTk en 02 de Junio de 2012, 12:58:02
-
Hola,
Estoy teniendo problemas con dos arreglos, tengo las siguientes estructuras de datos
#define NoProductos 3
typedef struct {char Nombre[16]; // Estructura del Producto
long CentiLitros;
float Precio;
int ImageIndex;}PD;
typedef struct{PD P[NoProductos];}PDT; // Array de Productos
PDT Productos; // Variable de Productos
// Por otro lado manejo un array para un GLCD
struct{
int Left[512];
int Right[512];
}GLCDData;
Cuando mi programa inicia, cargo los datos para la variable Productos, esta parte funciona bien.
La segunda estructura es para pintar en el GLCD sin leer, es decir sin usar el pin RW, probada y funcionando bien.
El problema es que de alguna manera CCS esta borrando el contenido de la variable Productos, luego de haber trabajado con la estructura del GLCD.
Lo eh depurado y eh comprobado que el contenido de la variable Productos ha sido borrada, y en ninguna parte de mi programa se borra esta variable, sera que el compilador reutiliza es espacio reservado para la variable Productos?
He visto que se puede asignar espacio de memoria mediante linker files .lkr pero no se si se puedan usar en CCS.
Alguna idea?
-
Puedes utilizar la directiva #RESERVE para reservar un trozo de RAM, y la directiva #LOCATE para meter allí tu variable.
Pero es raro lo que te ocurre; aunque no hagas la reserva, debería hacerla el propio compilador.
¿Tu variable está declarada como global o la declaras dentro de una función?
-
Hola Nocturno, gracias por tu respuesta,
La variable esta declarada Global. Utilize la directiva #locate y al parecer con esa simple modificacion, ya no me borra el contenido de la variable, si es muy raro habia trabajado antes con arrays pero bueno nunca con una de 1024 bytes para el GLCD.
gracias, saludos
#define NoProductos 3
typedef struct {char Nombre[16]; // Estructura del Producto
long CentiLitros;
float Precio;
int ImageIndex;}PD;
typedef struct{PD P[NoProductos];}PDT; // Array de Productos
PDT Productos; // Variable de Productos
#locate Productos=0x5F0 // Asigno direccion de variable
// Por otro lado manejo un array para un GLCD
struct{
int Left[512];
int Right[512];
}GLCDData;
#locate GLCDData=0x100 // Asigno direccion de datos
-
lo que no me queda claro es si la direccion que se asigna a #locate comprende direcciones de RAM ó ROM?
-
#locate es para RAM
#org es para ROM
-
No creo que CCS te coloque una variable dentro de su sector de memoria reservada :undecided: Puede ser que de alguna forma tu código, mediante el uso de punteros, se vaya de rango y acceda a ese sector?
-
Hola Suky,
pues mira el unico lado donde uso los punteros para escribir es en estas dos funciones de manejo del LCD
void GLCDPixel(int x,int y,int1 Color){
int *Ptr;
int16 Temp;
Temp=y/8;
Temp*=64;
Temp+=x;
if(x>63){
Ptr=&GLCDData.Right[0] + Temp - 64;
}else{
Ptr=&GLCDData.Left[0] + Temp;
}
if(Color){
*Ptr|=(0x01)<<(y%8);
}else{
*Ptr&=~((0x01)<<(y%8));
}
}
void GLCD_FillScreen(int1 Color){
int Data;
int *Ptr1, *Ptr2;
int16 i;
Ptr1=&GLCDData.Left[0];
Ptr2=&GLCDData.Right[0];
Data=0xFF*Color;
for(i=0;i<512;i++){
*Ptr1++=Data;
*Ptr2++=Data;
}
}
Crees que en alfuguna de estas funciones pueda esar el problema? que se vaya a un rango donde afecte a mi variable?
Gracias Nocturno por la aclaración :)
-
como es en ccs pues no lo se bien, pero estas declarando un puntero int, en ccs esto se toma como 16 u 8bits? int *Ptr1, *Ptr2;
-
como es en ccs pues no lo se bien, pero estas declarando un puntero int, en ccs esto se toma como 16 u 8bits? int *Ptr1, *Ptr2;
Es de 8-bits.
pues mira el unico lado donde uso los punteros para escribir es en estas dos funciones de manejo del LCD
No, ahí no se ve que se fuera de rango :undecided: En caso de que algo comience a fallar lo mejor va ser realizar un debug fino :?
Saludos!
-
¿Has actualizado la versión de CCS?, ¿cuál usas?