Hola bmfranky. Gracias por contestar. Este es el programa y no creo que se haya llenado la ROM, porque cuando le quito algunas intrucciónes lo compila perfectametne y me dice que estoy usando un 30 % de ROM. Gracias.
#include <16f887.h>
#device adc=10
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7,disable_ints)
#use i2c(Master,sda=PIN_C4,scl=PIN_C3)
//Definiciones pines LCD
#define _FLEX_LCD
#define LCD_DB4 PIN_B3
#define LCD_DB5 PIN_B4
#define LCD_DB6 PIN_B5
#define LCD_DB7 PIN_B6
#define LCD_RS PIN_C0
#define LCD_RW PIN_C1
#define LCD_E PIN_B2
///////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
#include <flex_lcd.c>
#include <EEPROM_24512.c> //Ficheros driver de los periféricos
#include <eeprom_interna_16bits.c>
#include <floatee.c>
int dat_in;
int16 address=0,address1,address2;
float dato,dato1,dato2;
void up (void); // Lectura de EEprom
void down (void); // Escritura de EEprom
#int_rda //Interrupción para el puerto serie
rda_isr()
{
dat_in=getc(); //Lee el puerto serie
if (dat_in=='2') //Si es "2" se visualizan los primeros datos de la eeprom
{
// printf("%lu",555);
}
return(dat_in);
}
#int_ext
ext_isr()
{
write_eeprom_16bits(0x00,address);
output_low(PIN_D2);
delay_ms(20);
output_high(PIN_C5); //led on
do{ //bucle...
} while(1);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void main() {
lcd_init();
enable_interrupts(int_rda);
enable_interrupts(int_ext); //Habilita la interrupción RBO...
ext_int_edge(L_TO_H); //Por flanco de subida
enable_interrupts(global);
address=0;
do{ //bucle...
if(!input(PIN_D1)) //¿switch abierto?
up(); //SI -> Lectura de EEprom
else
down(); //NO -> Escritura de EEprom
} while(1);
}
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
//MODO LECTURA
void up (void)
{
// lcd_putc("\up\n");
output_high(PIN_D2); //Leed confirmación
do{
// if(kbhit())
if(dat_in=='9'){
goto sigue;
}
}while(1);
sigue:
output_low(PIN_D2);
// lcd_putc("\fpaso");
address=read_eeprom_16bits(0x00);
address2=(address/4);
printf("%lu",address2);
address1=0;
arriba:
do{
output_high(PIN_D2);
//if(kbhit())
if(dat_in=='3') //Si es "2" se visualizan los primeros datos de la eeprom
{
// lcd_putc("\fConfirmo");
dat_in=0;
dato=READ_FLOAT_EXT_EEPROM(address1); //Guarda 4 bytes del FLOAT
address1=address1+4;
delay_ms(50);
if (address1==address) {
do{
goto termino;
}while(1);
}
dato1=READ_FLOAT_EXT_EEPROM(address1); //Guarda 4 bytes del FLOAT
address1=address1+4;
delay_ms(50);
if (address1==address) {
do{
goto termino;
}while(1);
}
dato2=READ_FLOAT_EXT_EEPROM(address1); //Guarda 4 bytes del FLOAT
address1=address1+4;
delay_ms(50);
if (address1==address) {
do{
goto termino;
}while(1);
}
termino:
printf("/%4.0f" "/%4.0f" "/%4.0f",dato,dato1,dato2);
if (address1==address) {
printf("/%c",'1');
do{
output_low(PIN_D2);
delay_ms(20);
output_high(PIN_C5);
}while(1);
}
goto arriba;
}
} while(1);
}
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
void down (void)
{
address=0; //Variables globales
setup_adc_ports(sAN0|sAN1|sAN3 ); //configuración adc
setup_adc (adc_clock_internal); //enciende adc
setup_adc(ADC_CLOCK_DIV_8 ); //configurando la frecuencia de lectura del ADC a 12Mhz
delay_us(10);
output_high(PIN_D2); //Leed confirmación
lcd_putc("Modo Escritura"); //Visualiza en LCD la hora
delay_ms(2000);
lcd_putc('\f');
do {
set_adc_channel(0); //elige canal a medir RA1
dato=read_adc();
WRITE_FLOAT_EXT_EEPROM(address,dato); //Guarda 4 bytes del FLOAT
address=address+4; //Incrementa 4 posiciones la ADDRESS
lcd_gotoxy(1,1);
printf(lcd_putc,"%4.0f",dato); //Visualiza en LCD
delay_ms(100);
if (address==32760) {
lcd_putc("\fMEMORIA LLENA\n");
write_eeprom_16bits(0x00,address);
do{
}while(1);
}
set_adc_channel(1); //elige canal a medir RA1
dato=read_adc();
WRITE_FLOAT_EXT_EEPROM(address,dato); //Guarda 4 bytes del FLOAT
address=address+4; //Incrementa 4 posiciones la ADDRESS
lcd_gotoxy(1,2);
printf(lcd_putc,"%4.0f",dato); //Visualiza en LCD
delay_ms(100);
if (address==32760) { //32760
lcd_putc("\fMEMORIA LLENA\n");
write_eeprom_16bits(0x00,address);
do{
}while(1);
}
set_adc_channel(3); //elige canal a medir RA1
dato=read_adc();
WRITE_FLOAT_EXT_EEPROM(address,dato); //Guarda 4 bytes del FLOAT
address=address+4; //Incrementa 4 posiciones la ADDRESS
lcd_gotoxy(10,2);
printf(lcd_putc,"%4.0f",dato); //Visualiza en LCD f=flotante con truncado
delay_ms(100);
if (address==32760) {
lcd_putc("\fMEMORIA LLENA\n");
write_eeprom_16bits(0x00,address);
do{
}while(1);
}
}while(1);
}