Autor Tema: Falta de memoria RAM al compilar  (Leído 2571 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Falta de memoria RAM al compilar
« en: 16 de Diciembre de 2008, 08:40:08 »
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.

Código: [Seleccionar]
// 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!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Falta de memoria RAM al compilar
« Respuesta #1 en: 16 de Diciembre de 2008, 15:47:29 »
Hola

Según veo estás volcando todos los floats a la ram del pic y luego los vuelcas a la EEPROM externa. El pic16f877a solo tiene 368bytes de ram por lo que no vas a poder hacerlo como tú quieres.

Lo recomendable es grabar la EEPROM con un grabador externo y no hacerlo con el pic.

Si el único objetivo del programa del pic es grabar la eeprom (no tienes un grabador de eeproms) entonces puedes hacer esto:

- Hacer un programa que grabe los primeros 200 bytes
- Grabar el pic y grabar la eeprom
- Hacer un segundo programa que grabe del byte 201 al byte 400
- Grabar el pic y grabar la eeprom de la 201 a la 400
...
- Y grabar hasta que esté lista

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: Falta de memoria RAM al compilar
« Respuesta #2 en: 16 de Diciembre de 2008, 16:01:40 »
Valeeeeee esto lo entiendo?¿?¿?¿

Existe alguna otra opcion, como que se quede en el programa, pero no en la ram... y k directamente el programa grabe estas variables en la eeprom?¿!?¿?¿!?¿

Muchas gracias, Un saludo!!!!!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Falta de memoria RAM al compilar
« Respuesta #3 en: 16 de Diciembre de 2008, 16:26:11 »
Ah sí la hay, puedes usar

const float variable=5.5;

y la grabará en la memoria de programa, ahorrándote ram.

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: Falta de memoria RAM al compilar
« Respuesta #4 en: 16 de Diciembre de 2008, 21:23:11 »
perdona no lo acabo d entender, esa consigna como la pongo por ejemplo para guardar esto?

 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};

de esta forma? const 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};

asi? o es incorrecto?

Muchas gracias de nuevo un saludo!!!

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: Falta de memoria RAM al compilar
« Respuesta #5 en: 17 de Diciembre de 2008, 08:08:55 »
BUenas, ya esta solucionado lo de la falta de RAM en el programa, muchas gracias migsantiago.

El problema es que no entiendo el motivo por el cual el pic me da por pantalla estos datos

312   -> esto es la hora minuto segundo       
57.0058.0059.0060.0061.0062.0063.00
64.0065.0066.0067.0068.0069.0
070.0071.0072.009.0010.0011.0
012.0013.0014.0015.0016.0017.
0018.0019.0020.0021.0022.0023
.0024.0025.0026.0027.0028.002
9.0030.0031.0032.0033.0034.00
35.0036.0037.0038.0039.0040.0
041.0042.0043.0044.0045.0046.
0047.0048.0049.0050.0051.0052
.0053.0054.0055.0056.0057.005
8.0059.0060.0061.0062.0063.00
64.0065.0066.0067.0068.0069.0
070.0071.0072.009.0010.0011.0
012.0013.0014.0015.0016.0017.
0018.0019.0020.0021.0022.0023
.0024.0025.0026.0027.0028.002
9.0030.0031.0032.0033.0034.00
35.0036.0037.0038.0039.0040.0
041.0042.0043.0044.0045.0046.
0047.0048.0049.0050.0051.0052
.0053.0054.0055.0056.0057.005
8.0059.0060.0061.0062.0063.00
64.0065.0066.0067.0068.0069.0
070.0071.0072.00
 "Estos son los datos que pasa el pic al ordenador"


cuando en verdad los que y grabo en la memoria RAM son los siguientes.
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};
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};
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};
vel[]         = {73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96};
volt[]        = {97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120};
inte[]        = {121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144};

Las consignas que utilizo para grabar son las que estan mencionadas en el programa de arriba, pero se sobreescriben no se por que motivo. alguien me puede ayudar

Un saludo!!!!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Falta de memoria RAM al compilar
« Respuesta #6 en: 17 de Diciembre de 2008, 11:47:44 »
Quieres apuntar más de 500 direcciones de memoria pero lo estás haciendo con variables de 8 bits, con las que sólo puedes apuntar de 0 a 255 direcciones.

Declara dir y dir2 como int16 para que te alcancen las direcciones.

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: Falta de memoria RAM al compilar
« Respuesta #7 en: 17 de Diciembre de 2008, 13:08:03 »
Muchisimas gracias migsantiago, mañana lo pruebo y te comento los resultado!!!!!!!!111

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: Falta de memoria RAM al compilar
« Respuesta #8 en: 18 de Diciembre de 2008, 08:29:18 »
Perfecto!!!!!!!!1 muchísimas gracias!!!! funciona a la perfección!!!!

Un saludo!!!!!!!!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Falta de memoria RAM al compilar
« Respuesta #9 en: 18 de Diciembre de 2008, 18:45:09 »
Bien hecho  :mrgreen:


 

anything