Autor Tema: programacion con CCS error 71  (Leído 2743 veces)

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

Desconectado alraid

  • PIC10
  • *
  • Mensajes: 7
programacion con CCS error 71
« en: 30 de Enero de 2012, 07:12:47 »
buenas a todos,

Estoy haciendo el proyecto final de carrera en la universidad. El proyecto es el diseño y implementación de un medidor de campo magnético mediante un sensor para luego mostrar el resultado en una pantalla LCD. Para conseguir eso estoy utilizando un pic 16F876A programando en C con el CCS. El caso es que ha llegado un punto en el que a la hora de compilar el programa me da el error 71: Out of ROM, A segment or the program is too large.
He estado mirando y he visto que eso se debe a un desbordamiento de la pila ya que de ROM sólo utilizo un 40%. Me han recomendado que utilice la función #SEPARATE para separar mi función en otras de más pequeñas para que no acurra este error pero por mucho que he probado no he sido capaz de subsanar el problema. Aquí les dejo mi programa sin los #SEPARATE.

#include <16f876a.h>                                           
#device adc=10                                                 
#FUSES XT,NOWDT                                           
#use delay (clock=2000000)                               
#include <lcd420.c>                                           

   float b;                                                   
   float valor;                                             
   int8 unitat=1;                                         
   
void main() {                                           
   
   setup_adc_ports(all_analog);                 
   setup_adc(ADC_CLOCK_INTERNAL);       
   lcd_init();                                             
   printf(lcd_putc, "   BENVINGUTS\n");       
   delay_ms(20000);                                 
   printf(lcd_putc, "\f");                                                               
   printf(lcd_putc, "   GAUSSIMETRE\n");   
   printf(lcd_putc, "     DIGITAL");             
   delay_ms(20000);                               
   inici:                                                   
   printf(lcd_putc, "\f");
 
  for (;;)                                                 
  {                                                   
   printf(lcd_putc, "1-MESURA\n");           
   printf(lcd_putc, "2-UNITATS  3-SEG\n");
     
      if (input(pin_c0)==1)                       
         {while (input(pin_c0)==1)
         {
         printf(lcd_putc, "1-MESURA\n");     
         printf(lcd_putc, "2-UNITATS  3-SEG\n");
         }         
           while (input(pin_c3)==0)                   
               {
               set_adc_channel(0);                     
               valor=read_adc();                       
               delay_ms(20);                             
               set_adc_channel(2);                     
               b=read_adc();                             
               delay_ms(20);                             
               b=(5.0*b/1024.0)/2.5;                 
         
                  if (input(pin_c4)==0)               
                     {
                     if (unitat==1)                       
                        {                                                   
                        valor=(5.0*valor/1024.0);   
                        valor=(((400.0)*valor)-(b*1000.0));
                        printf(lcd_putc, "\f  %01.2f Gauss", valor);
                        printf(lcd_putc, "\n           4-ANT\n");       
                        delay_ms(2500);
                        }
                     else if (unitat==3)                                     
                        {
                        valor=(5.0*valor/1024.0);                       
                        printf(lcd_putc, "\f   %01.2f Volts", valor);
                        printf(lcd_putc, "\n           4-ANT\n");       
                        delay_ms(2500);
                        }
                     else if (unitat==2)                                     
                        {                                           
                        valor=(5.0*valor/1024.0);                     
                        valor=(((400.0)*valor)-(b*1000.0));         
                        valor=valor*0.1;                                   
                        printf(lcd_putc, "\f  %01.2f mTeslas", valor);
                        printf(lcd_putc, "\n           4-ANT\n");           
                        delay_ms(2500);
                        }
                     }
                  else if (input(pin_c4)==1)                                 
                     {                                 
                     if(unitat==1)                                           
                        {
                        valor=(5.0*valor/1024.0);                     
                        valor=((1000.0*valor)-(b*2500.0));       
                        printf(lcd_putc, "\f  %01.2f Gauss", valor);                                                                   
                        printf(lcd_putc, "\n           4-ANT\n");           
                        delay_ms(2500);
                        }
                     else if (unitat==3)                                     
                        {
                        valor=(5.0*valor/1024.0);                       
                        printf(lcd_putc, "\f   %01.2f Volts", valor);
                        printf(lcd_putc, "\n           4-ANT\n");       
                        delay_ms(2500);
                        }
                     else if (unitat==2)                                     
                        {
                        valor=(5.0*valor/1024.0);                     
                        valor=((1000.0*valor)-(b*2500.0));       
                        valor=valor*0.1;                                   
                        printf(lcd_putc, "\f  %01.2f mTeslas", valor);
                        printf(lcd_putc, "\n           4-ANT\n");           
                        delay_ms(2500);
                        }
                     }}
      goto inici;                                                             
         }
         
      if(input(pin_c1)==1)                                             
               {while (input(pin_c1)==1)
                  {printf(lcd_putc, "1-MESURA\n");               
                   printf(lcd_putc, "2-UNITATS  3-SEG\n");     
                  }
               printf(lcd_putc, "\f");                                   
               for(;;)                                                           
                  {
                  printf(lcd_putc, "1-GAUSS  2-TESLA\n");   
                  printf(lcd_putc, "3-VOLT   4-ANT\n");         
                  if(input(pin_c0)==1)                               
                     {while (input(pin_c0)==1)
                        {printf(lcd_putc, "1-GAUSS  2-TESLA\n");
                         printf(lcd_putc, "3-VOLT   4-ANT\n");     
                        }
                     printf(lcd_putc, "\f");                                 
                     unitat=1;                                               
                     printf(lcd_putc, "  MESURA GAUSS\n");     
                     delay_ms(10000);                                 
                     goto inici;                                             
                     }
                  if(input(pin_c1)==1)                                 
                     {while (input(pin_c1)==1)
                        {printf(lcd_putc, "1-GAUSS  2-TESLA\n");
                         printf(lcd_putc, "3-VOLT   4-ANT\n");     
                        }
                     printf(lcd_putc, "\f");
                     unitat=2;                 
                     printf(lcd_putc, "  MESURA TESLAS\n");
                     delay_ms(10000);                             
                     goto inici;                                         
                     }
                  if(input(pin_c2)==1)                             
                     { while (input(pin_c2)==1)
                        {printf(lcd_putc, "1-GAUSS  2-TESLA\n");
                         printf(lcd_putc, "3-VOLT   4-ANT\n");     
                        }
                     printf(lcd_putc, "\f");                                 
                     unitat=3;                                               
                     printf(lcd_putc, "  MESURA VOLTS\n");     
                     delay_ms(10000);                                   
                     goto inici;                                             
                     }
                  if(input(pin_c3)==1)                                 
                     {                                                       
                     goto inici;                                           
                     }
                  }
               }
                 
      if(input(pin_c2)==1)                                           
         { while (input(pin_c2)==1)
                  {
                  printf(lcd_putc, "1-MESURA\n");               
                  printf(lcd_putc, "2-UNITATS  3-SEG\n");   
                  }
         printf(lcd_putc, "\f");                                       
         
          for(;;)                                                           
            {
            printf(lcd_putc, "1-GUANY    3-ANT\n");           
            printf(lcd_putc, "\n");                                     
           
            if(input(pin_c2)==1)                                     
               {
               while (input(pin_c2)==1)
                  {
                  printf(lcd_putc, "1-GUANY    3-ANT\n");     
                  printf(lcd_putc, "\n");             
                  }
               goto inici;                                 
               }
            }
         }
  }
  }


Espero que alguien me pueda ayudar con este problema.

Muchas gracias

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: programacion con CCS error 71
« Respuesta #1 en: 30 de Enero de 2012, 11:00:28 »
Hola amigo, en estos PIC la memoria ROM viene dividida en segmentos de 2048 posiciones de memoria, cuando creamos una rutina que supere este valor de instrucciones aparece el error mencionado, lo que debes hacer es estructurar tu programa con subrutinas o funciones.
Hay que tener en cuenta que funciones como printf incluyen gran cantidad de código.

Saludos.