TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: LuNaTk en 02 de Junio de 2012, 12:58:02

Título: Asignacion de Rom a Array
Publicado por: LuNaTk en 02 de Junio de 2012, 12:58:02
Hola,

Estoy teniendo problemas con dos arreglos, tengo las siguientes estructuras de datos

Código: [Seleccionar]
#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?
Título: Re: Asignacion de Rom a Array
Publicado por: Nocturno en 02 de Junio de 2012, 13:04:16
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?
Título: Re: Asignacion de Rom a Array
Publicado por: LuNaTk en 02 de Junio de 2012, 13:17:32
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

Código: [Seleccionar]
#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
Título: Re: Asignacion de Rom a Array
Publicado por: LuNaTk en 02 de Junio de 2012, 13:27:14
lo que no me queda claro es si la direccion que se asigna a #locate comprende direcciones de RAM ó ROM?
Título: Re: Asignacion de Rom a Array
Publicado por: Nocturno en 02 de Junio de 2012, 14:07:06
#locate es para RAM

#org es para ROM
Título: Re: Asignacion de Rom a Array
Publicado por: Suky en 02 de Junio de 2012, 15:44:54
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?
Título: Re: Asignacion de Rom a Array
Publicado por: LuNaTk en 02 de Junio de 2012, 17:38:08
Hola Suky,

pues mira el unico lado donde uso los punteros para escribir es en estas dos funciones de manejo del LCD

Código: [Seleccionar]
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 :)
Título: Re: Asignacion de Rom a Array
Publicado por: MerLiNz en 02 de Junio de 2012, 18:01:58
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;
Título: Re: Asignacion de Rom a Array
Publicado por: Suky en 02 de Junio de 2012, 19:30:30
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.

Citar
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!
Título: Re: Asignacion de Rom a Array
Publicado por: Nocturno en 03 de Junio de 2012, 03:07:35
¿Has actualizado la versión de CCS?, ¿cuál usas?