TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: raulacub en 16 de Junio de 2017, 01:50:16

Título: out of rom
Publicado por: raulacub en 16 de Junio de 2017, 01:50:16
hola buenas noches estoy recien iniciandome en los microcontroladores pic y no entiendo mucho lo que han hablado al respecto del #separate no entiendo como utilizarlo y donde alguien me puede mandar un ejemplo o guiarme donde lo puedo utilizar para que no me salga este error y pueda compilar mi codigo.
les dejo mi codigo para que lo vean y porfavor alguno que me explique con peras y manzanas como se hace para no cambiar de pic ya que aca son bastante caras y escasas.

este es el codigo.

#include <16f877a.h>
#fuses xt,NOPROTECT
#device ADC=8
#use delay(clock=4M)
#include "DRIVER_DHT22.c"
#include "lcd.c"
#define use_portd_lcdTRUE
int8 temp1;
float temp,dhthum,dhttemp;
void main(){
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
set_tris_a(0b111111);            // comprobar puertos
set_tris_b(0b00000000);
set_tris_d(0b00000000);
output_high(pin_b0),output_high(pin_b1),output_high(pin_b2),output_high(pin_b3),output_high(pin_b4),output_high(pin_b5),output_high(pin_b6),output_high(pin_b7);
lcd_init();                       //INICIALIZA EL LCD
lcd_putc(" Planata de  "); //MUESTRA EN PANTALLA
lcd_gotoxy(2,2);                  //COLOCA EL CURSOR EN COLUMNA 2 FILA 2
lcd_putc("  secado ");             //IMPRIME EN PANTALLA
delay_ms(500);                   //ESPERA 2 SEGUNDOS
lcd_putc("\f");                   //LIMPIA PANTALLA
while(true){
float dhthum,dhttemp;
setup_adc(ADC_CLOCK_INTERNAL);
Setup_adc_ports(RA0_ANALOG);          //PONE PUERTO RA0 ANALOGO
set_adc_channel(0);                   // INDICA EL PIN A LEER RA0
delay_us(20);       
temp1=read_adc();                     //LEE EL VALOR DEL PIN
temp=(temp1*0.01960784314*100);       //CONVIERTE EL VALOR LEIDO DE HEXA AL REAL el numero 0.01960784314 viene de dividir (5/255) y el resultado se multiplica por 100 para alcanzar 150 grados
lcd_gotoxy(1,1);
printf(lcd_putc,"Temp= %2.2f C",temp);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
delay_ms(500);
leer_dht22(dhthum,dhttemp);
delay_ms(10);
lcd_gotoxy(1,2);
printf(lcd_putc,"Humedad= %2.1f %%",dhthum);
delay_ms(1);
while(input(pin_a2)==0){
float dhthum,dhttemp;
   setup_adc(ADC_CLOCK_INTERNAL);
   Setup_adc_ports(RA0_ANALOG);          //PONE PUERTO RA0 ANALOGO
   set_adc_channel(0);                   // INDICA EL PIN A LEER RA0
   delay_us(20);       
   temp1=read_adc();                     //LEE EL VALOR DEL PIN
   temp=(temp1*0.01960784314*100);       //CONVIERTE EL VALOR LEIDO DE HEXA AL REAL el numero 0.01960784314 viene de dividir (5/255) y el resultado se multiplica por 100 para alcanzar 150 grados
  lcd_gotoxy(1,1);
printf(lcd_putc,"Temp= %2.2f C",temp);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
delay_ms(500);
leer_dht22(dhthum,dhttemp);
delay_ms(10);
lcd_gotoxy(1,2);
printf(lcd_putc,"Humedad= %2.1f %%",dhthum);
delay_ms(1);
   if(input(pin_a5)==1){                      //CONDICION DE TEMPERATURA Y SENSOR DE HUMEDAD
      lcd_gotoxy(1,1);
      printf(lcd_putc,"Temp= %2.2f C",temp);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
      delay_ms(500);
      output_low(pin_b5);//ENERGIZA MOTOR DE CINTA
      delay_ms (3000);
      output_low(pin_b0);            //ABRE TOLVA
      delay_ms (500);                 
      output_high(pin_b0);             
      delay_ms (500);
      output_low(pin_b2);            //CIERRA TOLVA
      delay_ms (500);
      output_high(pin_b2);
      output_low(pin_b4);            //LEVANTA BRAZO DE SALIDA
      delay_ms(500);
      output_high(pin_b4);
      delay_ms(500);
      leer_dht22(dhthum,dhttemp);
delay_ms(10);
lcd_gotoxy(1,2);
printf(lcd_putc,"Humedad= %2.1f %%",dhthum);
delay_ms(1);
      while(input(pin_a2)==0){
        lcd_gotoxy(1,1);
        printf(lcd_putc,"Temp= %2.2f C",temp);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
         delay_ms(500);
         leer_dht22(dhthum,dhttemp);
         delay_ms(10);
         lcd_gotoxy(1,2);
         printf(lcd_putc,"Humedad= %2.1f %%",dhthum);
         delay_ms(1);
         if(temp<120&&dhthum>50){   //CONDICION DE TEMPERATURA Y SENSOR DE HUMEDAD
            output_low(pin_b3),output_high(pin_b0);//ENERGIZA CALEFACTOR//TOLVA SE MANTIENE CERRADA//
            output_low(pin_b4);   //LEVANTA EL BRAZO DE SALIDA         
            delay_ms(500);
            output_high(pin_b4);
            delay_ms(500);}
         else {output_high(pin_b3);}
         if(temp<120&&dhthum>50){   //CONDICION DE TEMPERATURA Y SENSOR DE HUMEDAD
            output_low(pin_b3),output_high(pin_b0);//ENERGIZA CALEFACTOR//TOLVA SE MANTIENE CERRADA   
            output_low(pin_b4);             
            delay_ms(500);
            output_high(pin_b4);
            delay_ms(500);}
         else {output_high(pin_b3);}
         if(temp>120&&dhthum>50){   //CONDICION DE TEMPERATURA Y SENSOR DE HUMEDAD
            output_high(pin_b3),output_high(pin_b0);//DESNERGIZA CALEFACTOR//TOLVA SE MANTIENE CERRADA   
            output_low(pin_b4);             
            delay_ms(500);
            output_high(pin_b4);
            delay_ms(500);}
         else {output_low(pin_b3);}
         if (temp>120&&dhthum>50){
            output_low(pin_b4);             
            delay_ms(500);
            output_high(pin_b4);
            delay_ms(500);}
           if (temp>120&&dhthum<50){
            output_high (pin_b3);//DESENERGIZA CALEFACTOR
            delay_ms(3000);
            output_low(pin_b1);// BAJA BRAZO DE SALIDA DE MATERIAL
            delay_ms (500);
            output_high(pin_b1);// DESCONESTA BRAZO DE SALIDA DE MATERIAL
            delay_ms(500);
output_high(pin_b0),output_high(pin_b1), output_high(pin_b2);
output_high(pin_b3), output_high(pin_b4), output_high(pin_b5);
output_high(pin_b6),output_high(pin_b7);
lcd_putc("\f");}
lcd_putc("\f");}
output_high(pin_b0),output_high(pin_b1), output_high(pin_b2);
output_high(pin_b3), output_high(pin_b4), output_high(pin_b5);
output_high(pin_b6),output_high(pin_b7);
lcd_putc("\f");}}}}
Título: Re:out of rom
Publicado por: remi04 en 16 de Junio de 2017, 09:05:55
Lo mejor que puedes hacer es reestructurar el código. Divide en funciones mas pequeñas. No lo hagas todo en el main, de hecho en el main yo lo único que haría, aparte de iniciar los puertos y configurar los perisféricos sería llamar a funciones, pero no hacer operaciones como tienes puestas ya que eso ocupa un huevo y una función o bloque en C no puede cruzar una pagina de memoria.

Aparte, cosas como esta linea entera: 

  output_high(pin_b0),output_high(pin_b1),output_high(pin_b2),output_high(pin_b3),output_high(pin_b4),output_high(pin_b5),output_high(pin_b6),output_high(pin_b7);

Se puede sustituir por tan solo esto:

 output_b(0xff);

y ocupa menos y gasta 7 veces menos tiempo de ejecución.




Título: Re:out of rom
Publicado por: raulacub en 16 de Junio de 2017, 20:32:59
Lo mejor que puedes hacer es reestructurar el código. Divide en funciones mas pequeñas. No lo hagas todo en el main, de hecho en el main yo lo único que haría, aparte de iniciar los puertos y configurar los perisféricos sería llamar a funciones, pero no hacer operaciones como tienes puestas ya que eso ocupa un huevo y una función o bloque en C no puede cruzar una pagina de memoria.

Aparte, cosas como esta linea entera: 

  output_high(pin_b0),output_high(pin_b1),output_high(pin_b2),output_high(pin_b3),output_high(pin_b4),output_high(pin_b5),output_high(pin_b6),output_high(pin_b7);

Se puede sustituir por tan solo esto:

 output_b(0xff);

y ocupa menos y gasta 7 veces menos tiempo de ejecución.






muchas gracias
lo otro como llamo al otro void al terminar el primero la verdad es que soy bastante tonto para comprender lo que leo siempre hago las cosas de manera instintiva y esta vez no lo consigo, estube leyendo el manual del ccs y no entendi nada no soy programador pero me gusta bastante esto agradeceria un monton tu ayuda
ejemplo
void main_1(){
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
set_tris_a(0b111111);            // comprobar puertos
set_tris_b(0b00000000);
set_tris_d(0b00000000);
output_b(0xff);
lcd_init();                       //INICIALIZA EL LCD
lcd_putc(" Planata de  "); //MUESTRA EN PANTALLA
lcd_gotoxy(2,2);                  //COLOCA EL CURSOR EN COLUMNA 2 FILA 2
lcd_putc("  secado ");             //IMPRIME EN PANTALLA
delay_ms(500);                   //ESPERA 2 SEGUNDOS
lcd_putc("\f");}                  //LIMPIA PANTALLA
void inicio_de_proceso_2(){
while(true){
float dhthum,dhttemp;
setup_adc(ADC_CLOCK_INTERNAL);
Setup_adc_ports(RA0_ANALOG)


Título: Re:out of rom
Publicado por: remi04 en 17 de Junio de 2017, 15:30:37
No pongas void main_1() sino void main() sin nada mas.

  Ese es el main principal y luego cuando quieras llamar a una funcion, por ejemplo en tu caso pones:

inicio_de_poceso_2();

 Y con eso es suficiente. El programará saltará a esa funcion y luego volverá y continuará por donde iba.
Título: Re:out of rom
Publicado por: KILLERJC en 17 de Junio de 2017, 15:42:04
No pongas void main_1() sino void main() sin nada mas.

  Ese es el main principal y luego cuando quieras llamar a una funcion, por ejemplo en tu caso pones:

inicio_de_poceso_2();

 Y con eso es suficiente. El programará saltará a esa funcion y luego volverá y continuará por donde iba.

Hay un problema, el problema es que no identa su codigo y te confunde hasta a vos :P

Este es su codigo identado, y veras que esta MAL, demasiado MAL

Código: C
  1. void main()
  2. {
  3.       setup_adc_ports(NO_ANALOGS);
  4.       setup_adc(ADC_OFF);
  5.       set_tris_a(0b111111);            // comprobar puertos
  6.       set_tris_b(0b00000000);
  7.       set_tris_d(0b00000000);
  8.       output_b(0xff);
  9.       lcd_init();                       //INICIALIZA EL LCD
  10.       lcd_putc(" Planata de  "); //MUESTRA EN PANTALLA
  11.       lcd_gotoxy(2,2);                  //COLOCA EL CURSOR EN COLUMNA 2 FILA 2
  12.       lcd_putc("  secado ");             //IMPRIME EN PANTALLA
  13.       delay_ms(500);                   //ESPERA 2 SEGUNDOS
  14.       lcd_putc("\f");
  15. }                  //LIMPIA PANTALLA
  16.  
  17. void inicio_de_proceso_2()
  18. {
  19.       while(true){
  20.             float dhthum,dhttemp;
  21.             setup_adc(ADC_CLOCK_INTERNAL);
  22.             Setup_adc_ports(RA0_ANALOG)

Para raulacub:
Acostumbrate a identar (agregar espacios/tabs) a tu codigo cuando abras una llave, de esa forma se puede ver mejor y mas facil que estas intentando hacer, no solo para los que te ayudan, sino para vos tambien.

PD: Dejo su codigo original identado:
Código: C
  1. #include <16f877a.h>
  2.  
  3. #fuses xt,NOPROTECT
  4. #device ADC=8
  5. #use delay(clock=4M)
  6.  
  7. #include "DRIVER_DHT22.c"
  8. #include "lcd.c"
  9.  
  10. #define use_portd_lcdTRUE
  11.  
  12. int8 temp1;
  13. float temp,dhthum,dhttemp;
  14.  
  15.  
  16. void main()
  17. {
  18.       setup_adc_ports(NO_ANALOGS);
  19.       setup_adc(ADC_OFF);
  20.       set_tris_a(0b111111);            // comprobar puertos
  21.       set_tris_b(0b00000000);
  22.       set_tris_d(0b00000000);
  23.       output_high(pin_b0),output_high(pin_b1),output_high(pin_b2),output_high(pin_b3),output_high(pin_b4),output_high(pin_b5),output_high(pin_b6),output_high(pin_b7);
  24.       lcd_init();                       //INICIALIZA EL LCD
  25.       lcd_putc(" Planata de  "); //MUESTRA EN PANTALLA
  26.       lcd_gotoxy(2,2);                  //COLOCA EL CURSOR EN COLUMNA 2 FILA 2
  27.       lcd_putc("  secado ");             //IMPRIME EN PANTALLA
  28.       delay_ms(500);                   //ESPERA 2 SEGUNDOS
  29.       lcd_putc("\f");                   //LIMPIA PANTALLA
  30.       while(true){
  31.             float dhthum,dhttemp;
  32.             setup_adc(ADC_CLOCK_INTERNAL);
  33.             Setup_adc_ports(RA0_ANALOG);          //PONE PUERTO RA0 ANALOGO
  34.             set_adc_channel(0);                   // INDICA EL PIN A LEER RA0
  35.             delay_us(20);        
  36.             temp1=read_adc();                     //LEE EL VALOR DEL PIN
  37.             temp=(temp1*0.01960784314*100);       //CONVIERTE EL VALOR LEIDO DE HEXA AL REAL el numero 0.01960784314 viene de dividir (5/255) y el resultado se multiplica por 100 para alcanzar 150 grados
  38.             lcd_gotoxy(1,1);
  39.             printf(lcd_putc,"Temp= %2.2f C",temp);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
  40.             delay_ms(500);
  41.             leer_dht22(dhthum,dhttemp);
  42.             delay_ms(10);
  43.             lcd_gotoxy(1,2);
  44.             printf(lcd_putc,"Humedad= %2.1f %%",dhthum);
  45.             delay_ms(1);
  46.             while(input(pin_a2)==0){
  47.                   float dhthum,dhttemp;
  48.                   setup_adc(ADC_CLOCK_INTERNAL);
  49.                   Setup_adc_ports(RA0_ANALOG);          //PONE PUERTO RA0 ANALOGO
  50.                   set_adc_channel(0);                   // INDICA EL PIN A LEER RA0
  51.                   delay_us(20);        
  52.                   temp1=read_adc();                     //LEE EL VALOR DEL PIN
  53.                   temp=(temp1*0.01960784314*100);       //CONVIERTE EL VALOR LEIDO DE HEXA AL REAL el numero 0.01960784314 viene de dividir (5/255) y el resultado se multiplica por 100 para alcanzar 150 grados
  54.                   lcd_gotoxy(1,1);
  55.                   printf(lcd_putc,"Temp= %2.2f C",temp);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
  56.                   delay_ms(500);
  57.                   leer_dht22(dhthum,dhttemp);
  58.                   delay_ms(10);
  59.                   lcd_gotoxy(1,2);
  60.                   printf(lcd_putc,"Humedad= %2.1f %%",dhthum);
  61.                   delay_ms(1);
  62.                   if(input(pin_a5)==1){                      //CONDICION DE TEMPERATURA Y SENSOR DE HUMEDAD
  63.                         lcd_gotoxy(1,1);
  64.                         printf(lcd_putc,"Temp= %2.2f C",temp);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
  65.                         delay_ms(500);
  66.                         output_low(pin_b5);//ENERGIZA MOTOR DE CINTA
  67.                         delay_ms (3000);
  68.                         output_low(pin_b0);            //ABRE TOLVA
  69.                         delay_ms (500);                
  70.                         output_high(pin_b0);            
  71.                         delay_ms (500);
  72.                         output_low(pin_b2);            //CIERRA TOLVA
  73.                         delay_ms (500);
  74.                         output_high(pin_b2);
  75.                         output_low(pin_b4);            //LEVANTA BRAZO DE SALIDA
  76.                         delay_ms(500);
  77.                         output_high(pin_b4);
  78.                         delay_ms(500);
  79.                         leer_dht22(dhthum,dhttemp);
  80.                         delay_ms(10);
  81.                         lcd_gotoxy(1,2);
  82.                         printf(lcd_putc,"Humedad= %2.1f %%",dhthum);
  83.                         delay_ms(1);
  84.                         while(input(pin_a2)==0){
  85.                               lcd_gotoxy(1,1);
  86.                               printf(lcd_putc,"Temp= %2.2f C",temp);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
  87.                               delay_ms(500);
  88.                               leer_dht22(dhthum,dhttemp);
  89.                               delay_ms(10);
  90.                               lcd_gotoxy(1,2);
  91.                               printf(lcd_putc,"Humedad= %2.1f %%",dhthum);
  92.                               delay_ms(1);
  93.                               if(temp<120&&dhthum>50){   //CONDICION DE TEMPERATURA Y SENSOR DE HUMEDAD
  94.                                     output_low(pin_b3),output_high(pin_b0);//ENERGIZA CALEFACTOR//TOLVA SE MANTIENE CERRADA//
  95.                                     output_low(pin_b4);   //LEVANTA EL BRAZO DE SALIDA          
  96.                                     delay_ms(500);
  97.                                     output_high(pin_b4);
  98.                                     delay_ms(500);
  99.                               } else {
  100.                                     output_high(pin_b3);
  101.                               }
  102.                               if(temp<120&&dhthum>50)
  103.                               {   //CONDICION DE TEMPERATURA Y SENSOR DE HUMEDAD
  104.                                     output_low(pin_b3),output_high(pin_b0);//ENERGIZA CALEFACTOR//TOLVA SE MANTIENE CERRADA    
  105.                                     output_low(pin_b4);            
  106.                                     delay_ms(500);
  107.                                     output_high(pin_b4);
  108.                                     delay_ms(500);
  109.                               } else {
  110.                                     output_high(pin_b3);
  111.                               }
  112.                               if(temp>120&&dhthum>50)
  113.                               {   //CONDICION DE TEMPERATURA Y SENSOR DE HUMEDAD
  114.                                     output_high(pin_b3),output_high(pin_b0);//DESNERGIZA CALEFACTOR//TOLVA SE MANTIENE CERRADA    
  115.                                     output_low(pin_b4);            
  116.                                     delay_ms(500);
  117.                                     output_high(pin_b4);
  118.                                     delay_ms(500);
  119.                               } else {
  120.                                     output_low(pin_b3);
  121.                               }
  122.                               if (temp>120&&dhthum>50)
  123.                               {
  124.                                     output_low(pin_b4);            
  125.                                     delay_ms(500);
  126.                                     output_high(pin_b4);
  127.                                     delay_ms(500);}
  128.                                     if (temp>120&&dhthum<50)
  129.                                     {
  130.                                           output_high (pin_b3);//DESENERGIZA CALEFACTOR
  131.                                           delay_ms(3000);
  132.                                           output_low(pin_b1);// BAJA BRAZO DE SALIDA DE MATERIAL
  133.                                           delay_ms (500);
  134.                                           output_high(pin_b1);// DESCONESTA BRAZO DE SALIDA DE MATERIAL
  135.                                           delay_ms(500);
  136.                                           output_high(pin_b0),output_high(pin_b1), output_high(pin_b2);
  137.                                           output_high(pin_b3), output_high(pin_b4), output_high(pin_b5);
  138.                                           output_high(pin_b6),output_high(pin_b7);
  139.                                           lcd_putc("\f");
  140.                                     }
  141.                                     lcd_putc("\f");
  142.                               }
  143.                               output_high(pin_b0),output_high(pin_b1), output_high(pin_b2);
  144.                               output_high(pin_b3), output_high(pin_b4), output_high(pin_b5);
  145.                               output_high(pin_b6),output_high(pin_b7);
  146.                               lcd_putc("\f");
  147.                         }
  148.                   }
  149.             }
  150.       }
Título: Re:out of rom
Publicado por: raulacub en 27 de Junio de 2017, 01:12:38
muchas gracias a todos han sido de mucha ayuda seguire cada consejo para mejorar en lo que me proponga se les agradece.