Muy buenas,
Antes de todo quiero aradecer la ayuda mostrada anteriormente para solucionar los problemas de comunicacion rs485, el problema eran las masas que no eran equivalentes.
Ahora tengo un pequeño problema, quiero grabar nuos datos en una EEPROM externa (24lc512) en total son unos 144 floats, con lo que suman 576 bytes, a la hora de compilar me dice que Not enough RAM for all variables.
Existe alguna forma de poder grabar estos datos en la EEPROM, sin que de este error. el programa en cuestión es este.
// FUSES DEFINES e INCLUDES
#include <16F877.h> // Se añade la libreria del PIC a utilizar
#FUSES NOWDT,HS,NOPUT,PROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT,NODEBUG
#use delay(clock=20000000) //Velocidad del reloj
#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5) //enable=PIN_C5 hace que el C maneje el pin de habilitación
#define EEPROM_SDA PIN_C4
#define EEPROM_SCL PIN_C3
#include <24512.c> // Se añade la libreria de la EEPROM 24LC512
#include <external_eeprom.c> // Se añade la libreria para controlar una EPROM externa
// VARIABLES GLOBALES
//Variables float que contienen datos de las tablas
float irra[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};
float tempa[] = {25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48};
float tempm[] = {49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72};
float vel[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};
float volt[] = {25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48};
float inte[] = {49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72};
//Variables int que contienten el valor de la fecha
int min=1,sec=2,hr=3;
//Inicialización de las variables necesarias para movernos por la EEPROM
int dir=0, dir2=0, dato=0;
float dato2=0;
//Iniciaización variables para necesarias para moverse dentro de los datos
int f=0,g=0,h=0,i=0,j=0,k=0;
Char rec;
// INTERRUPCION
#int_rda
void rda_handler(void){
if(Kbhit()){
rec=getc();
}
}
// MAIN
void main(void){
// TODO LO NECESARIO PARA PONER EN MARCHA EL PIC o TU PROGRAMA
////////////////////////////////////////////////////////////////////////////////////
/// ///
/// GUARDAR DATOS EN EEPROM EXTERNA Y INICIALIZAR CONTAJE RELOJ ///
/// ///
////////////////////////////////////////////////////////////////////////////////////
init_ext_eeprom(); // Inicializamos EEPROM EXTERNA
delay_ms(2000);// retraso 2000 milisegundos para no colapsar PIC
printf("Si");
delay_ms(200);// retraso 200 milisegundos para no colapsar PIC
//rtc_get_time(hr,min,sec); //Guardamos la hora, minuto y segundo que nos da el RTC
write_ext_eeprom(dir,hr); // Escribimos la hora en la EEPROM
delay_ms(200);// retraso 200 milisegundos para no colapsar PIC
dir=dir+1; // Incrementamos el puntero de la EEPROM
delay_ms(200);// retraso 200 milisegundos para no colapsar PIC
printf("Si2");
write_ext_eeprom(dir,min); // Escribimos los minutos en la EEPROM
dir=dir+1; // Incrementamos el puntero de la EEPROM
printf("Si3");
write_ext_eeprom(dir,sec); // Escribimos los segundos en la EEPROM
dir=dir+1; // Incrementamos el puntero de la EEPROM
delay_ms(200);
for (f=0; f<24; f++){ // Escribimos las irradiancias en la EEPROM EXTERNA
write_float_ext_eeprom(dir, irra[f]);
delay_ms(200);
dir=dir+4;
}
f=0;
for (g=0; g<24; g++){// Escribimos las temperaturas ambientes en la EEPROM EXTERNA
write_float_ext_eeprom(dir, tempa[g]);
delay_ms(200);
dir=dir+4;
}
g=0;
printf("Si");
for (h=0; h<24; h++){// Escribimos las temperaturas en la placa en la EEPROM EXTERNA
write_float_ext_eeprom(dir, tempm[h]);
delay_ms(200);
dir=dir+4;
}
h=0;
for (i=0; i<24; i++){// Escribimos las velocidades del viento en la EEPROM EXTERNA
write_float_ext_eeprom(dir, vel[i]);
delay_ms(200);
dir=dir+4;
}
i=0;
for (j=0;j<24;j++){// Escribimos los voltios en la EEPROM EXTERNA
write_float_ext_eeprom(dir, volt[j]);
delay_ms(200);
dir=dir+4;
}
j=0;
for (k=0;k<24;k++){// Escribimos las intensidades en la EEPROM EXTERNA
write_float_ext_eeprom(dir, inte[k]);
delay_ms(200);
dir=dir+4;
}
k=0;
printf(" ariburri ");
delay_ms(500); // espera por ejemplo 0,5 seg para enviar nuevamente el dato,
output_HIGH(PIN_B1); // por ejemplo conectas un led entre el pin B1 y masa y este debe prender
delay_ms(250); // espera por ejemplo 0,25 seg
output_LOW(PIN_B1); // se apaga el led
delay_ms(250); // esperas otros 0,25 seg para enviar nuevamente el dato,
// HABILITO INTERRUPCIONES
enable_interrupts(int_rda);
enable_interrupts(global);
// BUCLE INFINITO
do{
// DETECTO NECESIDAD DE HACER ALGO Y LO HAGO
if(rec=='H'){
rec='\0'; // Para no volver a entrar has recibir un nuevo 'H'
// AQUI HAGO TODO LO QUE ANTES HACÍA DENTRO DE LA INTERRUPCIÓN
///////////////////////////////////////////////////////////////////////////////////
/// ///
/// LECTURA DE DATOS EN LA EEPROM Y ENVIAR AL PC ///
/// ///
///////////////////////////////////////////////////////////////////////////////////
disable_interrupts(int_rda);//Aqui deshabilito la interrupción
dato=read_ext_eeprom(dir2); // Leemos la hora en la EEPROM
dir2=dir2+1; // Incrementamos el puntero de la EEPROM
printf("%u",dato);// Enviamos dato a ordenador
delay_ms(200);
dato=read_ext_eeprom(dir2); // Leemos los minutos en la EEPROM
dir2=dir2+1; // Incrementamos el puntero de la EEPROM
printf("%u",dato);// Enviamos dato a ordenador
delay_ms(200);
dato=read_ext_eeprom(dir2); // Leemos los segundos en la EEPROM
dir2=dir2+1; // Incrementamos el puntero de la EEPROM
printf("%u",dato);// Enviamos dato a ordenador
delay_ms(200);
delay_ms(200);
for (f=0; f<24; f++){ // Leemos las irradiancias de la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
for (g=0; g<24; g++){// Leemos las temperaturas ambientes en la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
for (h=0; h<24; h++){// Leemos las temperaturas en la placa de la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
for (i=0; i<24; i++){// Leemos las velocidades del viento de la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
for (j=0;j<24;j++){// Leemos los voltios de la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
for (k=0;k<24;k++){// Leemos las intensidades de la EEPROM EXTERNA
dato2= read_float_ext_eeprom(dir2);
delay_ms(200);
dir2=dir2+4;
printf("%f",dato2);// Enviamos dato a ordenador
}
}
}while(TRUE);
}
Muy amables!!!!!
Un saludo a todos!