¡Buenos dias!
Encontré el programa en internet, que guardaba solo un unico caracter y lo mostraba a traves de un hyperterminal. Yo lo he modificado para que en vez de guardar un dato, guarde una cadena, pero parece que no guarda en la eeprom ya que al sacar su contenido muestra unos caracteres que no corresponden. Aqui va el programa si alguien le hecha un vistazo se lo agradeceria.
Por si sirve de algo, el programa lo cargo en la PicDem 2 Plus con el ICD2 de Microchip.
Aqui os adjunto mi codigo. Necesito que alquien ajeno le heche un vistazo porque me estoy centrando tanto en ello que me vuelvo ciego.
////////////////////////////////////////////////////////////////////////////////////////
// Programa que almacena y extrae bytes de una memoria EEPROM externa con interface I2C,
// también recibe y emite mediante una comunicación Serie Asíncrona
// con los pines RC6 (transmisión) y RC7 (recepción) y se comunica con el
// puerto serie de un PC, trabajando éste como emulador de terminal. Entre el
// puerto del microcontrolador y el PC se intercala un circuito de adaptación
// a RS232 (MAX232)
//
// Se tienen dos estados posibles: "guardando", de manera que se reciben los caracteres mediante
// comunicación RS232 y se guardan en la EEPROM externa en posiciones correlativas a partir
// de la dirección 0x1F00. El otro estado posibles es "sacando", de manera secuencial se
// van leyendo los valores previamente almacenados en la EEPROM a partir de la
// dirección interna 0x1F00 y se envían a través del puerto serie para su visualización
// en un terminal
////////////////////////////////////////////////////////////////////////////////////////
// En el fichero de cabeceras están definidas las comunicaciones RS232 e I2C
#include "EEPROM_I2C.h"
//Incluimos el fichero de "driver" para memoria 24256
#include "24256.c" //Incluimos fichero con funciones para manejo de EEPROM I2C
#include "string.h"
void main() {
char caracter,leido,texto;
int str,i;
long int dir=0x1F00; //Dirección interna en la EEPROM a partir de la cual se graba
enum que_hace {guardando,sacando} estado; //Definimos 2 estados posibles
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_ccp2(CCP_OFF);
init_ext_eeprom(); //Inicializamos la memoria eeprom externa
while(1) //Bucle continuo de ejecución
{
do
{
printf("\n\r Guardamos ? (G) o Sacamos (S)?\n\r"); //Mostramos mensaje
while(!kbhit()); //Esperamos a que se recibe byte por RS232
caracter=getch(); //lo recogemos
} while ((caracter!='S')&&(caracter!='G')); //Repetimos hasta que se introduzca 'S' ó 'G'
//Si el carácter era 'S' y hay cambio de estado colocamos el puntero de direcciones al principio
if((caracter=='S')&&(estado==guardando)){
printf("\n\r cambiamos a sacar\n\r");
dir=0x1F00;
printf("\n\r redireccionado\n\r");}
//Si el carácter era 'G' y hay cambio de estado colocamos el puntero de direcciones al principio
if((caracter=='G')&&(estado==sacando)){
printf("\n\r cambiammos a guardar\n\r");
dir=0x1F00;
printf("\n\r redireccionado\n\r");}
switch(caracter) //En función del carácter leído nos vamos a:
{
case 'S': //Sacar, leyendo posiciones correlativas de la EEPROM
estado=sacando;
for(i=0;i<str;i++){
leido=read_ext_eeprom(dir); //Recogemos el byte almacenado en la dirección indicada
delay_ms(100);
dir++; //Incrementamos contador de direcciones
if (dir==0x2000)
dir=0x1F00;
putc(leido); //Lo enviamos a través del puerto serie
}
break;
case 'G': //Guardar, pedimos carácter
estado=guardando;
delay_ms(100);
printf("\n\r Introduce texto y presiona Enter\n\r");
gets(texto);
str=strlen(texto);
printf("\n\r texto:%s. La cadena mide %d \n\r",texto,str);
write_ext_eeprom(dir, texto); //Lo grabamos en EEPROM
break;
default: break;
}
}
}
Muchas gracias amigos!