Autor Tema: problema con bancos de memoria en c18  (Leído 1800 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Diamel

  • PIC10
  • *
  • Mensajes: 13
problema con bancos de memoria en c18
« en: 23 de Agosto de 2012, 17:20:53 »
Hola a todos, el problema que tengo es sobre los bacos de memoria, estoy haciendo un programa para el pic18f4620 y de repente al declarar una variable nueva el programa deja de funcionar bien, es un string tipo char, si le pongo overlay ya me funciona bien, sin embargo al declarar despues mas variables me pasa en ocaciones lo mismo.


vi en un post que Suki puso:
Citar
El problema surge cuando modificamos los bancos creados en el linker, y unimos dos o más. Si no tenemos cuidado y una variable int, short o long queda por ejemplo:

Código
GeSHi (c):
long 0x15367580;

Y en la memoria de ram queda:

Código:
0x80  -->  0x00FF
0x75  -->  0x0100
0x36  -->  0x0101
0x15  -->  0x0102

Ocupa dos bancos consecutivos. Al trabajarlo en el código, seguro habrá problemas 

queria saber como hacerle para saber que variables son las que me estan causando este conflicto y como hacer para solucionarlo, se tiene que modificar el linker??

Saludos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problema con bancos de memoria en c18
« Respuesta #1 en: 23 de Agosto de 2012, 17:41:10 »
Pero ya tienes modificado el linker uniendo varios bancos? Si no no debería dar el problema  :tongue: No sera que usas punteros y estas desbordando el buffer con el que trabajas?

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Diamel

  • PIC10
  • *
  • Mensajes: 13
Re: problema con bancos de memoria en c18
« Respuesta #2 en: 23 de Agosto de 2012, 19:07:04 »
no he modificado el linker, este es:


Citar
// $Id: 18f4620.lkr,v 1.3 2004/04/26 18:09:00 curtiss Exp $
// File: 18f4620.lkr
// Sample linker script for the PIC18F4620 processor

LIBPATH .

FILES c018i.o
FILES clib.lib
FILES p18f4620.lib

CODEPAGE   NAME=vectors    START=0x0            END=0x29           PROTECTED
CODEPAGE   NAME=page       START=0x2A           END=0xFFFF
CODEPAGE   NAME=idlocs     START=0x200000       END=0x200007       PROTECTED
CODEPAGE   NAME=config     START=0x300000       END=0x30000D       PROTECTED
CODEPAGE   NAME=devid      START=0x3FFFFE       END=0x3FFFFF       PROTECTED
CODEPAGE   NAME=eedata     START=0xF00000       END=0xF003FF       PROTECTED

ACCESSBANK NAME=accessram  START=0x0            END=0x7F
DATABANK   NAME=gpr0       START=0x80           END=0xFF
DATABANK   NAME=gpr1       START=0x100          END=0x1FF
DATABANK   NAME=gpr2       START=0x200          END=0x2FF
DATABANK   NAME=gpr3       START=0x300          END=0x3FF
DATABANK   NAME=gpr4       START=0x400          END=0x4FF
DATABANK   NAME=gpr5       START=0x500          END=0x5FF
DATABANK   NAME=gpr6       START=0x600          END=0x6FF
DATABANK   NAME=gpr7       START=0x700          END=0x7FF
DATABANK   NAME=gpr8       START=0x800          END=0x8FF
DATABANK   NAME=gpr9       START=0x900          END=0x9FF
DATABANK   NAME=gpr10      START=0xA00          END=0xAFF
DATABANK   NAME=gpr11      START=0xB00          END=0xBFF
DATABANK   NAME=gpr12      START=0xC00          END=0xCFF
DATABANK   NAME=gpr13      START=0xD00          END=0xDFF
DATABANK   NAME=gpr14      START=0xE00          END=0xEFF
DATABANK   NAME=gpr15      START=0xF00          END=0xF7F
ACCESSBANK NAME=accesssfr  START=0xF80          END=0xFFF          PROTECTED

SECTION    NAME=CONFIG     ROM=config

STACK SIZE=0x100 RAM=gpr14

tampoco estoy manejando punteros, antes me había pasado algo similar al usar estructuras y por eso deje de usarlas mejor..

Otra es que hace tiempo me habia pasado por tener los FUSES EBTR0, EBTR1, EBTR2, EBTR3 y EBTRB en ON pero tambien estan desactivados en este caso.

Saludos

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problema con bancos de memoria en c18
« Respuesta #3 en: 23 de Agosto de 2012, 23:04:15 »
Y podrás mostrar algo de código? Hasta donde funciona y que cambio hace que deje de funcionar? Que versión usas de C18? Raro  :undecided:


No contesto mensajes privados, las consultas en el foro

Desconectado Diamel

  • PIC10
  • *
  • Mensajes: 13
Re: problema con bancos de memoria en c18
« Respuesta #4 en: 24 de Agosto de 2012, 16:34:34 »
Empeze un proyecto nuevo para ver si se solucionaba pero ya se volvio a presentar el mismo error, estan estas dos funciones:


Código: [Seleccionar]
unsigned char PARAMETERS(void)
{

char comando[3]="&N";
char T_TIE_FLUJO[4]="155";
char TEMPKIL_VSG1[3]="12";
char TEMPKIL_VSG0[2]="5";
char TMIN1[3]="25";
char TMIN0[2]="2";
char TMAX1[3]="26";
char TMAX0[2]="5";
char TMMIN1[3]="02";
char TMMIN0[2]="5";
char TMMAX1[3]="02";
char TMMAX0[2]="8";
char CERO_MAXIMO[4]="300";
char T_TIE_DEST[3]="60";
char SEN_MOVPOS1[3]="20";
char SEN_MOVPOS0[2]="5";
char SEN_MOVNEG1[3]="21";
char SEN_MOVNEG0[2]="6";
char CALIBRA[6]="12345";
char MAX_CIL_NO_ENV[3]="05";
char PESO_MAX_PROM1[3]="60";
char PESO_MAX_PROM0[2]="5";


memset(STRING,0,sizeof(STRING));

strcpy(STRING,comando); // Forma Cadena de Lectura
strcat(STRING,ID);
strcat(STRING,T_TIE_FLUJO);
strcat(STRING,TEMPKIL_VSG1);
strcat(STRING,TEMPKIL_VSG0);
strcat(STRING,TMIN1);
strcat(STRING,TMIN0);
strcat(STRING,TMAX1);
strcat(STRING,TMAX0);
strcat(STRING,TMMIN1);
strcat(STRING,TMMIN0);
strcat(STRING,TMMAX1);
strcat(STRING,TMMAX0);
strcat(STRING,CERO_MAXIMO);
strcat(STRING,T_TIE_DEST);
strcat(STRING,SEN_MOVPOS1);
strcat(STRING,SEN_MOVPOS0);
strcat(STRING,SEN_MOVNEG1);
strcat(STRING,SEN_MOVNEG0);
strcat(STRING,CALIBRA);
strcat(STRING,MAX_CIL_NO_ENV);
strcat(STRING,PESO_MAX_PROM1);
strcat(STRING,PESO_MAX_PROM0);
strcat(STRING,CR);


PUTSTX(STRING,44);



}

Esta Manda una serie de parámetros por el puerto serie a una computadora, y esta la siguiente tambien:

Código: [Seleccionar]
unsigned char TIME(void)
{

overlay unsigned char CHECK;

overlay char SEC[3];
overlay char MIN[3];
overlay char HRS[3];
overlay char DAY[3];
overlay char MTH[3];
overlay char YRS[3];


memset(STRING,0,sizeof(STRING));


STRING[0]=IDENTIFIER_RADIO; STRING[1]='F'; STRING[2]=ID[0]; STRING[3]=ID[1]; STRING[4]=6; STRING[5]=13;

PUTSTX(STRING,6);

delay_ms(1);


CHECK = GETSTX(STRING,16,IDENTIFIER_RADIO,TIMEOUT_RADIO);

if(CHECK==SUCCESS)
{

STRCUT(SEC,STRING,4,5);    //SAVE(SEC,SEC_DIRECTION)
STRCUT(MIN,STRING,6,7);    //SAVE(MIN,MIN_DIRECTION)
STRCUT(HRS,STRING,8,9);    //SAVE(HRS,HRS_DIRECTION)
STRCUT(DAY,STRING,10,11);  //SAVE(DAY,DAY_DIRECTION)
STRCUT(MTH,STRING,12,13);  //SAVE(MTH,MTH_DIRECTION)
STRCUT(YRS,STRING,14,15);  //SAVE(YRS,YRS_DIRECTION)


memset(STRING,0,sizeof(STRING));

STRING[0]=IDENTIFIER_RADIO; STRING[1]='F';

strcat(STRING,ID);
strcat(STRING,SEC);
strcat(STRING,MIN);
strcat(STRING,HRS);
strcat(STRING,DAY);
strcat(STRING,MTH);
strcat(STRING,YRS);
strcat(STRING,CR);


PUTSTX(STRING,17);


}

}

Esta lee la fecha y hora mandada desde la computadora y regresa la misma cadena como confirmacion, si puedes observar tube que ponerles overlay a ciertas variables y actualmente esta funcionando, si les quito el overlay esas variables obtienen otros valores que no deberian, Saludos.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problema con bancos de memoria en c18
« Respuesta #5 en: 24 de Agosto de 2012, 18:22:09 »
 :? Puede ser problema del tamaño de la pila, y si la aumentas a 0x200 uniendo con otro banco? O sea:

Código: [Seleccionar]
DATABANK   NAME=gpr14      START=0xD00          END=0xEFF
//DATABANK   NAME=gpr14      START=0xE00          END=0xEFF

STACK SIZE=0x200 RAM=gpr14

Igualmente me parece que esta mal implementado. O sea, estas creando variables con datos establecidos que no cambian o porque truncaste el código que has mostrado? También si vas a usar las funciones de string asegúrate de establecer en Memory Model/Code Model la opción Large Code Model. 

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Diamel

  • PIC10
  • *
  • Mensajes: 13
Re: problema con bancos de memoria en c18
« Respuesta #6 en: 24 de Agosto de 2012, 19:53:43 »
El codigo solo fue para mostrar un ejemplo, en la funcion PARAMETERS mas adelante se leen esas variables de la EEPROM pero por el momento estan declaradas solamente con valores aleatorios, en ese caso el problema es que las variables de TIME adquieren otros valores como si el compilador perdiera las posiciones de memoria donde estan guardades y te apuntara a otra direccion mandando basura, como comento con overlay se soluciona el problema pero creo que esto no es algo que deberia de pasar, esta raro el asunto tengo instalado el c18 3.10 y el MPLAB IDE 8.60, por cuestiones de implementacion de codigo no creo que sea especialmente por el echo de que me he percatado de que cuando ocurre este problema por ejemplo con el solo echo de agregar una variable mas al programa otras variables que si estaban funcionando bien empiezan a adquirir basura, le pones static o overlay a la nueva variable y asunto solucionado pero yo lo veo  mas esto como un parche que como una solucion real, igual he realizado muchos programas en donde jamas se me presenta este problema, pero este no es el caso.

Checare lo que comentas de Large Code Model eso no lo habia tomado en cuenta.

Saludos!!


 

anything