TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: bitclock001 en 16 de Agosto de 2016, 16:22:09

Título: ERROR EN COMPILACIÓN EN CCS COMPILER
Publicado por: bitclock001 en 16 de Agosto de 2016, 16:22:09
Estoy realizando un programa en CCS con una LCD y cuando compilo me saca el siguiente error:

Error 71....Out off the ROM, A segment or the program is too large.

Me extraña porque solo estoy utilizando el 29% de ROM y el 16% de RAM.  Qué puede ser?
 
Título: Re:ERROR EN COMPILACIÓN EN CCS COMPILER
Publicado por: KILLERJC en 16 de Agosto de 2016, 16:34:24
Sin el programa es dificil de saber, imagino que debe ser por algun array demasiado grande.
Título: Re:ERROR EN COMPILACIÓN EN CCS COMPILER
Publicado por: bitclock001 en 16 de Agosto de 2016, 16:46:19
En el .LST me muestra estos datos

Stack used: 9 locations (4 in main + 5 for interrupts)
               Stack size: 8

Este es el código

Código: [Seleccionar]
#INCLUDE <16F887.H>
#DEVICE ADC=10 //Define que el conversor trabaja a 10 bits
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#BYTE PORTA=5
#BYTE PORTB=6
#BYTE PORTC=7
#BYTE PORTD=8
#INCLUDE <LCD.C>
#BYTE tmrl1= 14
#DEFINE start portb,1
#DEFINE inc portb,2
#DEFINE dec portb,3
#DEFINE motor_cajas portb,4
#DEFINE motor_bolsas portb,5

int8 n_bolsas=10, L_entera=0,L_desc=0, N_entera=0, N_desc=0;
int8 cajas=0,bolsas_aux=0, bolsas_neto=0;
int8 bolsas=0;
int1 st=0;
   
#int_ext                       
void ext_isr() // Rutina de interrupción por cambio en el pin RB0

   lcd_putc("\f");      // Borra pantalla
   lcd_putc("PROGRAM");
   delay_ms(2000);
   lcd_putc("\f");      // Borra pantalla
   lcd_gotoxy(1,1);     // Linea 1, primer caracter
   printf(lcd_putc,"N_entera=%c", N_entera);         
   lcd_gotoxy(1,2);     // Linea 2, primer caracter
   printf(lcd_putc,"N_desc=%c", N_desc);     
}

//******************************************
// Función para mostrar datos en pantalla
//******************************************
void visual(int8 bolsas, int8 cajas)
{
    lcd_putc("\f");      // Borra pantalla
    lcd_gotoxy(1,1);     // Primera fila primer caracter
    printf(lcd_putc,"Bol_Ent=%u",bolsas);
    lcd_gotoxy(1,2);     // Segunda fila primer caracter
    printf(lcd_putc,"Bol_Des=%u",bolsas);
    lcd_gotoxy(11,2);     // Segunda fila
    printf(lcd_putc," Ca=%u",cajas);
    delay_ms(10); 
}
//***********************
// Programa principal
//***********************
void main()
{
   set_tris_a(0B11111111);
   set_tris_b(0B00000111);
   set_tris_c(0B00000111);
   set_tris_d(0B00000000);
   setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1);    //Configuración TMR1
   set_timer1(0);                   // Inicia TMR1 en cero
   
   lcd_init();                      // Función para inicializar la LCD
   lcd_putc("\f");                  // Borra pantalla
   lcd_gotoxy(1,1);                 // Linea 1, primer caracter
   lcd_putc(" AUTOMATIZACION ");
   lcd_gotoxy(1,2);                 // Linea 2, primer caracter
   lcd_putc(" EMPAQUE BOLSAS ");
   enable_interrupts(int_ext);      // Activa interrupción por cambio de RB0
   enable_interrupts(global);       // Activa interrupción global
   bolsas=tmrl1;                    // Lectura del del byte bajo del timer1
   bolsas_aux=bolsas;
   
   
   WHILE(true)
   {
      if(bit_test(start))           // Se dió start?
      {
         bit_set(motor_bolsas);     // Arranca motor banda bolsas
         delay_ms(50);
         bolsas=tmrl1; 
         visual(bolsas, cajas);     // Llama función mostrar valores en pantalla
         st=1;                      // Bandera para indicar el start 
       }
       
       if(st==1)
       {
         bolsas=tmrl1;
       
          if(bolsas_aux != bolsas)
          {
            bolsas_neto ++;
            bolsas=tmrl1;
            bolsas_aux=bolsas;
            visual(bolsas, cajas);
           
            if(bolsas_neto==10)
            {
               cajas++;
               visual(bolsas, cajas);
               bolsas_neto=0;
               bit_clear(motor_bolsas);
               bit_set(motor_cajas);
               delay_ms(2000);
               bit_set(motor_bolsas);
               bit_clear(motor_cajas);
             }
          }
       }
   }
}


Título: Re:ERROR EN COMPILACIÓN EN CCS COMPILER
Publicado por: KILLERJC en 16 de Agosto de 2016, 17:13:17
Sep tal ves es eso. El stack es por hardware y esta limitado. No podes llamar a demasiadas funciones. Si tenes en cuenta que la interrupcion ademas es como una llamada y ocupa un lugar en el peor de los cosas tendrias:

En tu main:
Llamando a Visual ( 1 espacio en el stack)
Visual llama a lcd_putc (supongamos que este llama a otros 2 mas )
lcd_putc usa las funciones ( enviar_dato y delay )

Ahi tendrias tus 4 espacios ocupados del stack. Ahora mientras ocurre eso aparece una interrupcion. La interrupcion de por si es 1.
Y dentro de la interrupcion ocurre lo mismo que antes.
Por lo cual no llega a guardar todas las direcciones de retorno por que tiene para 8 lugares y en el peor caso en tu programa tenes para 9.

Primero consejo es...

Quita Todo lo referente al LCD / printf y delays de las interrupciones. No por lo anterior, sino por una cuestion de que si tenes algo que ocupe mucho tiempo en una interrupcion, no va a poder atender otra interrupcion cuando suceda, esto por que al entrar a la interrupcion se deshabilitan.
Título: Re:ERROR EN COMPILACIÓN EN CCS COMPILER
Publicado por: bitclock001 en 16 de Agosto de 2016, 20:56:07
Gracias por su respuesta

Le agregué más código y ya me compiló bien. No se porqué