Hola muchachos que tal... Bueno he estado trabajando con la memoria interna del pic18f4550 y pues he visto unos ejemplitos del ccs que son faciles, pero al parecer no lo es tanto como parece, porque intento hacer un programa que me escriba datos del conversor analógico - digital en la memoria y luego dependiendo de un pulsador colocado en RA5 pues lo lee y lo manda al hyperterminal. La cuestión es que la memoria si se lee, pero al parecer no escribe, porque cuando la mando a leer, lo que hace es ,mndarme por FF, es decir, VACÍA

... Y no entiendo porque... Si alguien me puede echar una manita se lo agradezco... Aquí dejo el código...
#include <18f4550.h>
#fuses NOPROTECT,NOCPD,NOLVP,WDT64,XT,NOMCLR
#use fast_io (A)
#use fast_io (B)
#use fast_io (C)
#use fast_io (D)
#use delay(clock=4000000)
#byte PIR1=0xF9E
#bit TXIF=PIR1.4
#include "lcd.c" // Libreria de la LCD por el puerto B
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Habilita las funciones RS232, velocidad a 9600 baudios
#byte portd= 0xF83
#byte portb= 0xF81
#byte portc= 0xF82
//::::::::::::::::::::::::::Declaración de variables:::::::::::::::::::::::::::::::::::::
float dato,value,valord;
int x=0,cont=0,medida,indicador=0,puntero=0;
//:::::::::::::::::::::::::::Programa Principal:::::::::::::::::::::::::::::::::::::::::::
void main (void)
{
set_tris_a(0xe7); // Puerto A, como b'11100111
set_tris_b(0x00); // Puerto B, como b'00000000 (salida)
set_tris_d(0x00); // Puerto D, como b'11111111 (salida)
output_a(0); // Limpio el puerto A
output_c(0); // Limpio el puerto C
output_b(0); // Limpio el puerto B
setup_wdt(WDT_ON); // Watchdog Encedido
setup_port_a(AN0_ANALOG ); // RA0 son analógicos y los demás son digitales
lcd_init(); // Para inicializar el LCD
restart_wdt(); // Inicio el perro Guardian
//*********************************************************************************
//*
//* PROGRAMA PRINCIPAL
//*
//*********************************************************************************
while(true)
{
restart_wdt(); // Inicio el perro Guardian
SLEEP(); // Modo sleep
// Se desborda Watchdog y sale del modo Sleep
if (restart_cause()==WDT_FROM_SLEEP) // Si el pic despierta por watchdog, entonces...
{
if(x==0) // Pregunto por bandera
{
setup_adc(ADC_CLOCK_INTERNAL ); // Tomará el dato contando el tiempo con el reloj interno
set_adc_channel(0); // El canal de adquisición del dato es el RA0
delay_ms(10); // Un retardo para capturar bien el dato
value=read_adc(); // Leo el dato
valord=(value*0.4); // Multiplico el valor por 0.4 para hacer la equivalencia a 2V
portd=valord; // Lo mando al puerto D
setup_adc (ADC_OFF); // Apago el conversor A/D
x=1; // Seteo la bandera
}
else if (x==1) // Si x es igual a 1
{
mostrar: dato=(value*5)/255; // Convierto el valor a decimal y lo guardo
printf(lcd_putc,"\f"); // Borro la pantalla LCD
printf(lcd_putc,"Voltaje= %2.2g",dato); // Mando a mostrar el valor del conversor en la LCD
//printf("\f"); // Limpio pantalla del hyperterminal
//printf(" Voltaje= %2.2g V",dato); // Mando a mostrar el valor del conversor
delay_ms(10);
//WRITE_EEPROM(0,puntero);
//indicador= READ_EEPROM(0); // Le mando a indicador el valor de puntero (puntero está en la dirección 00 de la memoria)
//if(indicador>5) // Si el puntero (indicador) pasa de 24 posiciones de memoria, no sigo escribiendo (reescribo)
//{
//puntero=1; // Si llega a 160 pues reseteo al puntero y reescribo la memoria
//}
puntero=puntero+8; // Incremento puntero
//puntero++;
WRITE_EEPROM(puntero,dato); // Escribo los datos en la memoria
if(input(PIN_A5)==0)
{
printf(" \n\r ");
printf(" Puntero= %d V",puntero);
printf(" \n\r ");
printf(" \n\r ");
printf(" \n\r ");
//printf("\f");
//medida=READ_EEPROM(0x01);
printf(" Voltaje= %2u V",READ_EEPROM(puntero)); // Mando a mostrar el valor del conversor
}
//WRITE_EEPROM(0,puntero); // Escribo el nuevo valor de puntero
x=0; // Reseteo la bandera
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
De antemano gracias...
Atte: Enigma... La llanerita de Guayana
