Autor Tema: Memoria rom insuficiente - Out of ROM, A segment or the program is too large  (Leído 14320 veces)

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

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #15 en: 15 de Enero de 2013, 12:14:41 »
Hola a todos. Lo que no termino de entender es si es muy largo el programa en cantidad de lineas o si se refiere
al contenido del main, o de una funcion especifica ??
El mensaje que me aparece es

Out of ROM, a segment or the program is too large funcion_1

y si veo el contenido de funcion_1 son dos lineas dentro de una interrupcion, no creo que sea ese el problema
ya que me sale ese error cuando coloco en el main la llamada a otra funcion función, si la dejo comentada funciona
todo bien, es mas, solo usa un 41% de la ROM, es como que es medio raro porque no modifico nada en funcion_1..

Agradeceria que alguien explique bien el objetivo de este mensaje, a que hace referencia ??  :5]

Saludos y gracias por la colaboracion
« Última modificación: 15 de Enero de 2013, 12:18:02 por Simon21 »
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #16 en: 16 de Enero de 2013, 01:15:17 »
Hola Simon21.
El problema es que una función (y main también lo es) no sea demasiado larga.
Podés subir tu código ?
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #17 en: 16 de Enero de 2013, 09:04:33 »
La siguiente función es la que me está haciendo desbordar la ROM.

Lo que hace es lo siguiente:

Es el modo programación de parametros, lo cual al usuario le van apareciendo
pantallas con valores predefinidos, y mediante dos teclas (subir y bajar) modifica
el valor de dichos valores predefinidos. Luego al presionar otra tecla (ok) pasa
al siguiente parámetro, y asi sucesivamente hasta que programa todos los parámetros
y vuelve al programa principal.

Si ven, desde un punto en adelante está comentado el código, eso lo hice
ya que el comentario en ese punto hace que compile con un uso de la rom
de un 68%, pero cuando le saco el comentario se queda sin espacio.

Gracias por la ayuda de antemano.

Código: [Seleccionar]
void programar_parametros (){
       
         lcd_gotoxy(1,1);
         printf(lcd_putc, " MODO  PROGRAMACION ");
         lcd_gotoxy(1,2);
         printf(lcd_putc, "  INGRESE EL VALOR  ");
         delay_ms (500); //Para darle tiempo al usuario que suelte los 3 pulsadores que hicieron que entre en esta rutina
         
         lcd_gotoxy(1,3);
         printf(lcd_putc, "    tblin  [seg]    "); // Tiempo de baja linea
       
         while (input(PIN_D3)==0){  // Al presionar la tecla OK salgo de este parametro y voy al siguiente
         lcd_gotoxy(1,4);
         printf(lcd_putc, "        %d        ", variables_a_enviar [0]); // Tiempo de baja linea
         if (input(PIN_D1)==1){ // Pulsador sube valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [0]++; }
         if (input(PIN_D2)==1){ // Pulsador baja valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [0]--;}
         }
         
         lcd_gotoxy(1,3);
         printf(lcd_putc, "    talin  [seg]    "); // Tiempo de alta linea
         delay_ms (500); //Para darle tiempo al usuario que suelte el pulsador de ok
         while (input(PIN_D3)==0){  // Al presionar la tecla OK salgo de este parametro y voy al siguiente
         lcd_gotoxy(1,4);
         printf(lcd_putc, "        %d        ", variables_a_enviar [1]); // Tiempo de baja linea
         if (input(PIN_D1)==1){ // Pulsador sube valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [1]++; }
         if (input(PIN_D2)==1){ // Pulsador baja valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [1]--;}
         }
       
         lcd_gotoxy(1,3);
         printf(lcd_putc, "     tbuj [seg]     "); // Tiempo de funcionamiento bujia
         delay_ms (500); //Para darle tiempo al usuario que suelte el pulsador de ok
         while (input(PIN_D3)==0){  // Al presionar la tecla OK salgo de este parametro y voy al siguiente
         lcd_gotoxy(1,4);
         printf(lcd_putc, "        %d        ", variables_a_enviar [2]); // Tiempo de baja linea
         if (input(PIN_D1)==1){ // Pulsador sube valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [2]++; }
         if (input(PIN_D2)==1){ // Pulsador baja valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [2]--;}
         }
         
         
         lcd_gotoxy(1,3);
         printf(lcd_putc, "     tbur [seg]     "); // Tiempo de funcionamiento burro
         delay_ms (500); //Para darle tiempo al usuario que suelte el pulsador de ok         
         while (input(PIN_D3)==0){  // Al presionar la tecla OK salgo de este parametro y voy al siguiente
         lcd_gotoxy(1,4);
         printf(lcd_putc, "        %d        ", variables_a_enviar [3]); // Tiempo de baja linea
         if (input(PIN_D1)==1){ // Pulsador sube valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [3]++; }
         if (input(PIN_D2)==1){ // Pulsador baja valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [3]--;}
         }
       
/*           
         lcd_gotoxy(1,3);
         printf(lcd_putc, "     tcm  [seg]     "); // Tiempo de calentamiento motor
         while (input(PIN_D3)==0){  // Al presionar la tecla OK salgo de este parametro y voy al siguiente
         lcd_gotoxy(1,4);
         printf(lcd_putc, "        %d        ", variables_a_enviar [4]); // Tiempo de baja linea
         if (input(PIN_D1)==1){ // Pulsador sube valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [4]++; }
         if (input(PIN_D2)==1){ // Pulsador baja valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [4]--;}
         }
         
       
         lcd_gotoxy(1,3);
         printf(lcd_putc, "     tar  [seg]     "); // Tiempo arrancado cuando se arranque solo
         while (input(PIN_D3)==0){  // Al presionar la tecla OK salgo de este parametro y voy al siguiente
         lcd_gotoxy(1,4);
         printf(lcd_putc, "        %d        ", variables_a_enviar [5]); // Tiempo de baja linea
         if (input(PIN_D1)==1){ // Pulsador sube valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [5]++; }
         if (input(PIN_D2)==1){ // Pulsador baja valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [5]--;}
         }
         
       
         lcd_gotoxy(1,3);
         printf(lcd_putc, "    dpar  [dias]    "); // Cantidad de días para arranque automatico
         while (input(PIN_D3)==0){  // Al presionar la tecla OK salgo de este parametro y voy al siguiente
         lcd_gotoxy(1,4);
         printf(lcd_putc, "        %d        ", variables_a_enviar [6]); // Tiempo de baja linea
         if (input(PIN_D1)==1){ // Pulsador sube valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [6]++; }
         if (input(PIN_D2)==1){ // Pulsador baja valor
            delay_ms (500); //Anti rebote
            variables_a_enviar [6]--;}
         }
         
   */
   
delay_ms(300);
parametros_modificados=1;         

 }
« Última modificación: 16 de Enero de 2013, 09:09:44 por Simon21 »
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #18 en: 16 de Enero de 2013, 10:02:59 »
Creo que deberias hacer lo siguiente:
Descomentar la parte que comentaste para poder compilar.
A medida que te de el mensaje de error, ir comentando una linea Printf(), y volver a compilar.
Hacer esto hasta que compile bien, ademas ir observando cuanto consume la sentencia printf() que vas comentando.

Seguramente esto te dara solucion, ya que es esta sentencia la gran consumidora de recursos.

Para hacer menues, te conviene dejar una sola sentencia printf() por cada renglon del lcd, que muestre un string de 16 caracteres.

En cada opcion de menu, en vez de mandar a Printf(), el texto a mostrar lo cargas en el string que corresponda al renglon que corresponda.
Cada vez que sales de la seleccion del menu, la sentencia printf() unica se encarga de enviar el texto que formateaste al lcd.

Esto tiene dos ventajas:
La primera es lograr meter todo el menu en un micro.
La segunda es lograr una gran mejora el la lectura de tu programa futuro...

Recuerda que todos los programas seguramente funcionaran, pero solo pocos seran posibles de ser leidos e interpretados rapidamente (aun por su programador) cuando pasen los años... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #19 en: 16 de Enero de 2013, 10:09:06 »
Con la siguiente línea, me sube un 4% la rom !!

Pasa de 53% a 57%


Código: [Seleccionar]
printf(lcd_putc, "        %d        ", variables_a_enviar [0]);
En cambio con la siguiente linea, no aumenta ni un 1%, cada 4 o 5 impresiones
recién aumenta un 1% el uso de la ROM.

Código: [Seleccionar]
printf(lcd_putc, "    dpar  [dias]    ");
Veo que ocupa mucho mas ROM cuando imprimo el valor de una variable.. Más si es un vector..

¿¿ Y ahora ??  :shock:

El problema es que tengo que ir indicandole al usuario los parametros a cambiar, no puedo hacer un solo
printf, ya que a medida que seleccione el parametro, le tengo que mostrar el valor de ese parametro...  :?
« Última modificación: 16 de Enero de 2013, 10:26:34 por Simon21 »
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #20 en: 16 de Enero de 2013, 10:27:29 »
Hay instrucciones que te permiten formatear los valores numéricos y textos (todo junto) a string, luego le pasas el string...

Aqui te pongo un ejemplo que corre en un PIC18F252.


Código: C
  1. ////////////////////////////////////////////////////
  2. //  Muestra el mensaje de Menu elegido.
  3.       if (ModoOPER == MODO_Seteos)
  4.          {
  5.             switch (MenuSeteos)
  6.             {
  7.                 case Max_Pres:
  8.                     strcpy (MiBuffer, "Alarma AP  "); break;
  9.  
  10.                 case Min_Pres:
  11.                     strcpy (MiBuffer, "Alarma BP  "); break;
  12.  
  13.                 case Max_Temp:
  14.                     strcpy (MiBuffer, "Al. Temp   "); break;
  15.  
  16.                 case Max_Humedad:
  17.                     strcpy (MiBuffer, "Al.Humedad "); break;
  18.  
  19.                 case T_Pulso:
  20.                     strcpy (MiBuffer, "Timer ON   "); break;
  21.  
  22.                 case T_Espera:
  23.                     strcpy (MiBuffer, "Timer OFF  "); break;
  24.  
  25.                 case Cant_Valv:
  26.                     strcpy (MiBuffer, "# Valvulas "); break;
  27.  
  28.                 case RondasFin:
  29.                     strcpy (MiBuffer, "# Rondas FS"); break;
  30.  
  31.                 case Filtrado:
  32.                     strcpy (MiBuffer, "Filtro CAD "); break;
  33.             } // END switch
  34.         }


y como se envia el valor al LCD, en este caso Mibuffer contiene los textos y Mibuffer2 los valores, de esa forma evito tener que concatenar todo en un solo String.

Código: C
  1. case Velocidad:
  2.                      {
  3.                         switch (NuevoValor)
  4.                         {
  5.                            case B9600_E_8_1:  strcpy (MiBuffer2, " 9600 8E1"); break;
  6.                            case B9600_N_8_1:  strcpy (MiBuffer2, " 9600 8N1"); break;
  7.                            case B9600_O_8_1:  strcpy (MiBuffer2, " 9600 8O1"); break;
  8.                            case B19200_E_8_1: strcpy (MiBuffer2, "19200 8E1"); break;
  9.                            case B19200_N_8_1: strcpy (MiBuffer2, "19200 8N1"); break;
  10.                            case B19200_O_8_1: strcpy (MiBuffer2, "19200 8O1"); break;
  11.                            case B38400_E_8_1: strcpy (MiBuffer2, "38400 8E1"); break;
  12.                            case B38400_N_8_1: strcpy (MiBuffer2, "38400 8N1"); break;
  13.                            case B38400_O_8_1: strcpy (MiBuffer2, "38400 8O1"); break;
  14.                            case B57600_E_8_1: strcpy (MiBuffer2, "57600 8E1"); break;
  15.                            case B57600_N_8_1: strcpy (MiBuffer2, "57600 8N1"); break;
  16.                            case B57600_O_8_1: strcpy (MiBuffer2, "57600 8O1"); break;
  17.                         }
  18.                         lcdText (8, 2, MiBuffer2);
  19.                      } break;
  20.  
  21.                } //end switch
  22.          } //end if

Y aqui la funcion lcdText (), ya que no la vas a encontrar en las librerias...

Código: C
  1. /**
  2.  *   Muestra < string > en el display LCD.
  3.  */
  4.    void lcdString(char *string)
  5.    {
  6.       while (*string != 0)
  7.       lcd_send_byte (1,*string++);
  8.    }
  9.  
  10.    void lcdText (unsigned int x, unsigned int y, char *text)
  11.    {
  12.       lcd_gotoxy (x, y);
  13.       lcdString (text);
  14.    }

Espero te sirva !! :mrgreen:
« Última modificación: 16 de Enero de 2013, 10:45:35 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #21 en: 16 de Enero de 2013, 10:35:20 »
Que opinas si utilizo en vez de

Código: [Seleccionar]
printf(lcd_putc, "     Pantalla 01    ");
utilizo

Código: [Seleccionar]
lcd_putc, "     Pantalla 01    "; ??

Por ahi he leido que disminuye el uso de la ROM, pero no comprendo aun la diferencia
usando el printf.
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #22 en: 16 de Enero de 2013, 10:48:40 »
Lee de nuevo mi mensaje, acabo de agregarle info, hoy se me fue sin querer...

Printf le agrega todas las caracteristicas de formateo de numeros y variables a lcd_putc() que esta hecha solo para string.
lo que te comento saltea ambos problemas mejor.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #23 en: 16 de Enero de 2013, 11:08:20 »
Está buena la idea que me proponés, pero me parece que es complicado adaptarlo a mi caso en particular.

Te hago otra consulta, he probado simularlo al mismo código con el pic 18F452 y me ocupa un 25% de la ROM.

Tengo 2 de estos pics guardados, si reemplazo el 16F877A directamente por éste, quedará funcionando el resto
del código o tendré que hacer todo nuevamente ??

Gracias por tu ayuda MGLSOFT
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #24 en: 16 de Enero de 2013, 11:16:57 »
Casi todo el traslado de mi aplicación fue hecho (por falta de ROM aun después de optimizar el código) desde un PIC16F876 a un PIC18F252, y tuve que hacer solo algunos cambios menores.
No recuerdo cuales en este momento, pero creo que la eeprom y algunas otras cosas trabajan diferente, ademas que ya no tiene bancos de memoria sino que es lineal, es decir no tiene los típicos saltos entre bancos.
Pero eso es transparente en CCS.

Creo que debería funcionarte bien, por las dudas leete las instrucciones de Microchip para pasar de ese PIC al otro, que precisamente es el que suplanta en la nueva linea.

una vez uses un PIC18F ya no querrás volver a la linea 16F, eso te lo aseguro... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #25 en: 16 de Enero de 2013, 11:18:20 »
jaja eso parece !! pregunto ya que nunca he usado un 18F...

Voy a probar primero en proteus, ya que el compilador CCS lo compila lo mas bien.

Si funciona en proteus, deberia funcionar en la placa !! jaja veremos..
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #26 en: 16 de Enero de 2013, 11:24:45 »
La diferencia mas grande esta en los fuses (ahora me acorde) , leete bien los fuses en ambos PIC, asi aprendes esas diferencias, ya que despues en la linea 18F vas a verlos repetidos nuevamente.
Y las opciones de oscilador tambien crecen mucho y hay que entenderlas bien...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #27 en: 16 de Enero de 2013, 11:32:46 »
Tienes algun link que me recomiendes sobre esto ?
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #28 en: 16 de Enero de 2013, 11:36:31 »
Las hojas de datos de Microchip, en excelente ingles !! :D :D
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Simon21

  • PIC18
  • ****
  • Mensajes: 302
Re: Memoria rom insuficiente - Out of ROM, A segment or the program is too large
« Respuesta #29 en: 16 de Enero de 2013, 12:07:43 »
Veo en el #include <18f452.h> los siguientes FUSES:

//////// Fuses: LP,XT,HS,RC,EC,EC_IO,H4,RC_IO,PROTECT,NOPROTECT,OSCSEN
//////// Fuses: NOOSCSEN,NOBROWNOUT,BROWNOUT,WDT1,WDT2,WDT4,WDT8,WDT16,WDT32
//////// Fuses: WDT64,WDT128,WDT,NOWDT,BORV20,BORV27,BORV42,BORV45,PUT,NOPUT
//////// Fuses: CCP2C1,CCP2B3,NOSTVREN,STVREN,NODEBUG,DEBUG,NOLVP,LVP,WRT
//////// Fuses: NOWRT,NOWRTD,WRTD,NOWRTB,WRTB,WRTC,NOWRTC,CPD,NOCPD,CPB
//////// Fuses: NOCPB,EBTR,NOEBTR,EBTRB,NOEBTRB

Tengo que mencionarlos a todos al empezar el programa ??

En mi programa anterior tenía los siguientes, y me lo compila sin problemas en el 18F

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD, HS PARA 20 MHz
#FUSES NOPROTECT                //Código sin Protección para Lectura
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOCPD                    //No EE protection
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPUT                    //No Power Up Timer
« Última modificación: 16 de Enero de 2013, 12:14:33 por Simon21 »
INGENIERIA ELECTRONICA
UNIVERSIDAD TECNOLOGICA NACIONAL