TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Diamel 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:
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
-
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 he modificado el linker, este es:
// $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
-
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:
-
Empeze un proyecto nuevo para ver si se solucionaba pero ya se volvio a presentar el mismo error, estan estas dos funciones:
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:
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.
-
:? Puede ser problema del tamaño de la pila, y si la aumentas a 0x200 uniendo con otro banco? O sea:
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!
-
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!!