TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: gonzalonalbandian en 15 de Noviembre de 2012, 20:23:46

Título: Problema con lectura de cadena en eeprom externa (con punteros)
Publicado por: gonzalonalbandian en 15 de Noviembre de 2012, 20:23:46
Saludos a todos. Estoy realizando una libreria para una eeprom i2c. Tengo todas las funciones creadas y funcionando perfectamente exepto la de leer una cadena de bytes. No me explico que puede ser pero al simularlo solo me toma el primer caracter, y no es un problema de lectura propiamente dicho sino mas bien un problema de punteros o del propio compilador. Para simplificar la cuestion hago un ejemplo limpio sin las rutinas de eeprom propiamente dichas.
Todo esto esta compilado en Hi-Tech PICC 18 en un PIC18F4520.

Código: [Seleccionar]
void leer_cadena(char addr_mem, int pointer_addr, int *buffer, char cant_bytes)
{
for(char cnt = 0; cnt < cant_bytes; cnt++)
{
*buffer = cnt + 0x30; // convierto cnt en su valor pero en ascii para poder imprimir con printf %s como si fuera un string
buffer++;
}
return;
}

void main ()
{
char buffer[10];

leer_cadena(0xA0,0x00,&buf,10); // direccion de memoria, posicion en memoria, direccion de memoria del buffer, cantidad de bytes a leer
printf(">>Texto leido: %s",buf);

return;
}

En el simulador la salida seria la siguiente:
>>Texto: 0

cuando en realidad deberia ser
>>Texto: 0123456789

A alguien se le ocurre alguna idea con respecto al motivo de esta falla?
Muchas gracias!

Gonzalo
Título: Re: Problema con lectura de cadena en eeprom externa (con punteros)
Publicado por: BrunoF en 15 de Noviembre de 2012, 20:46:28
Estás definiendo mal los tipos.

(char addr_mem, int pointer_addr, int *buffer, char cant_bytes)

Fijate que declarás buffer como un int. un int es de 16 o 32 bits, dependiendo el compilador.

Es importante definir bien el tipo de puntero, sino cuando haces por ejemplo:

buffer++;

en lugar de recorrer la memoria byte a byte, la vas a recorrer de a 2(16 bits) o 4(32 bits) en cada incremento.

Si el puntero apunta a chars, tiene que ser de tipo char, no int.

Saludos
Título: Re: Problema con lectura de cadena en eeprom externa (con punteros)
Publicado por: gonzalonalbandian en 15 de Noviembre de 2012, 21:32:32
Estás definiendo mal los tipos.

(char addr_mem, int pointer_addr, int *buffer, char cant_bytes)

Fijate que declarás buffer como un int. un int es de 16 o 32 bits, dependiendo el compilador.

Es importante definir bien el tipo de puntero, sino cuando haces por ejemplo:

buffer++;

en lugar de recorrer la memoria byte a byte, la vas a recorrer de a 2(16 bits) o 4(32 bits) en cada incremento.

Si el puntero apunta a chars, tiene que ser de tipo char, no int.

Saludos


Era tan simple como ese pequelo detaller. Muchisimas gracias!