Autor Tema: Error al compilar en un puerto desde una funcion  (Leído 2843 veces)

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

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Error al compilar en un puerto desde una funcion
« en: 13 de Abril de 2024, 22:16:14 »
Cordial saludo, se que les puede parecer muy basico pero no encuentro la solucion.
he creado una funcion en una libreria .h y al compilar me muestra erores, dejo el codigo.(ccs)
Gracias de antemano.


Citar
Compiling C:\Users\zolution\Desktop\code4\code3 on 13-abr-24 at 20:12
*** Error 12 "C:\Users\zolution\Desktop\code4\funci.h" Line 6(26,29): Undefined identifier   BC1
*** Error 12 "C:\Users\zolution\Desktop\code4\funci.h" Line 7(26,30): Undefined identifier   BDIR
*** Error 12 "C:\Users\zolution\Desktop\code4\funci.h" Line 12(27,30): Undefined identifier   BC1
*** Error 12 "C:\Users\zolution\Desktop\code4\funci.h" Line 13(27,31): Undefined identifier   BDIR
*** Error 12 "C:\Users\zolution\Desktop\code4\funci.h" Line 18(26,29): Undefined identifier   BC1
*** Error 12 "C:\Users\zolution\Desktop\code4\funci.h" Line 19(27,31): Undefined identifier   BDIR
*** Error 12 "C:\Users\zolution\Desktop\code4\funci.h" Line 25(15,20): Undefined identifier   PORTB
*** Error 12 "C:\Users\zolution\Desktop\code4\funci.h" Line 28(15,20): Undefined identifier   PORTB
      8 Errors,  0 Warnings.
Build Failed.

Código: C
  1. #include <16F628A.h>
  2.    //#device ADC=16
  3.    
  4.    //#FUSES NOWDT                    //No Watch Dog Timer
  5.    //#FUSES NOBROWNOUT               //No brownout reset
  6.    //#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  7.    
  8.    //#use delay(internal=4000000)
  9.    
  10.    //#define LED PIN_A0
  11.  //  #include <funciones.c>
  12.    #include <funci.h>
  13.  
  14.    //#include <16F628a.h>
  15.    
  16.    #FUSES NOWDT
  17.    #FUSES NOMCLR
  18.    #FUSES NOBROWNOUT
  19.    #FUSES NOLVP
  20.    #FUSES PROTECT
  21.    
  22.    
  23.    #use delay(internal=4MHz)
  24.    //#use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_a0, rcv = pin_a1)
  25.    //#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,stream=RF1,errors)
  26.    #define NO_ANALOGS      0       // None
  27.    
  28.     #define BDIR PIN_A7
  29.     #define BC1  PIN_A6
  30.    
  31.       void sonido(unsigned char registro,unsigned char valor);
  32.    #byte porta= 0x05
  33.    #byte portb= 0x06
  34.    #byte trisa= 0x85
  35.    #byte trisb= 0x86
  36.    
  37.    
  38.   //declaracion ariables globales
  39.     unsigned    CHAR value=0;
  40.     unsigned   char x=0;
  41.  
  42.  
  43.    // const unsigned char tone[] = {0x13, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00};
  44.  
  45.   // void sound_play_song(unsigned char length, unsigned char song[]);
  46.   // void sound_register(unsigned char regnum, unsigned char value[]);
  47.  
  48.  
  49.   // protipos funciones
  50.    void set_mode_inactive();
  51.    void set_mode_latch();
  52.    void set_mode_write();
  53.    void set_mode_write();
  54.    void write_register(char reg, char value);
  55.  
  56.  
  57.       void main()
  58.       {
  59.       SET_TRIS_A(0B00100000);
  60.      
  61.       SET_TRIS_B(0B00000000);
  62.       porta=0x00;
  63.       portb=0x00;  
  64.    
  65.      // set_mode_inactive();
  66.          
  67.            
  68.          while(TRUE)
  69.          {
  70.    
  71.        write_register(0, 223);
  72.       write_register(1, 1);
  73.    
  74.          delay_ms(500);
  75.              
  76.            
  77.         }
  78.          
  79.    }
Código: C
  1. //funciones
  2.      
  3.              void set_mode_inactive()
  4.             {
  5.               output_low(BC1);
  6.               output_low(BDIR);
  7.             }
  8.            
  9.             void set_mode_latch()
  10.             {
  11.               output_high(BC1);
  12.               output_high(BDIR);
  13.             }
  14.            
  15.             void set_mode_write()
  16.             {
  17.               output_low(BC1);
  18.               output_high(BDIR);
  19.             }
  20.            
  21.             void write_register(char reg, char value)
  22.             {
  23.               set_mode_latch();  
  24.               PORTB = reg;  
  25.               set_mode_inactive();  
  26.               set_mode_write();  
  27.               PORTB = value;  
  28.               set_mode_inactive();
  29.             }
« Última modificación: 13 de Abril de 2024, 22:20:28 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado Jiha

  • PIC10
  • *
  • Mensajes: 28
Re:Error al compilar en un puerto desde una funcion
« Respuesta #1 en: 14 de Abril de 2024, 01:14:12 »
Line 12 in line 37

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Error al compilar en un puerto desde una funcion
« Respuesta #2 en: 14 de Abril de 2024, 02:41:32 »
Line 12 in line 37
Trabajo de una... Gracias.
Si algo parece complicado... es por que esta mal explicado.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Error al compilar en un puerto desde una funcion
« Respuesta #3 en: 14 de Abril de 2024, 12:42:52 »
Es porque ponés  #include<funci.h> con las funciones antes de la definición de BC1,BDIR y PORTB

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Error al compilar en un puerto desde una funcion
« Respuesta #4 en: 14 de Abril de 2024, 14:07:40 »
Es porque ponés  #include<funci.h> con las funciones antes de la definición de BC1,BDIR y PORTB
Realice el cambio y ahora me sale otro error.
Citar
Compiling C:\Users\zolution\Desktop\code4\code3 on 14-abr-24 at 11:47
*** Error 12 "C:\Users\zolution\Desktop\code4\funci.h" Line 42(21,27): Undefined identifier   tone_1
      1 Errors,  0 Warnings.
Build Failed.
Código: C
  1. #include <16F628A.h>
  2.    //#device ADC=16
  3.    
  4.    //#FUSES NOWDT                    //No Watch Dog Timer
  5.    //#FUSES NOBROWNOUT               //No brownout reset
  6.    //#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  7.    
  8.    //#use delay(internal=4000000)
  9.    
  10.    //#define LED PIN_A0
  11.  //  #include <funciones.c>
  12.   // #include "funci.h"
  13.  
  14.    //#include <16F628a.h>
  15.    
  16.    #FUSES NOWDT
  17.    #FUSES NOMCLR
  18.    #FUSES NOBROWNOUT
  19.    #FUSES NOLVP
  20.    #FUSES PROTECT
  21.    
  22.    
  23.    #use delay(internal=4MHz)
  24.    //#use RS232 (baud = 9600, bits = 8, parity = N, xmit = pin_a0, rcv = pin_a1)
  25.    //#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,stream=RF1,errors)
  26.    #define NO_ANALOGS      0       // None
  27.    
  28.     #define BDIR PIN_A7
  29.     #define BC1  PIN_A6
  30.    
  31.  
  32.    #byte porta= 0x05
  33.    #byte portb= 0x06
  34.    #byte trisa= 0x85
  35.    #byte trisb= 0x86
  36.  
  37.    #include <funci.h>
  38.    #include <arreglos.c>
  39.  
  40.  
  41.  
  42.  
  43.   // const  unsigned char tone_1[] = {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1c, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00};
  44.      // unsigned char tone_1[] = {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x00};
  45.  
  46.  //  unsigned char __musica[] = {0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0xe0, 0x00, 0x01, 0x00, 0x00};
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.   // protipos funciones
  54.    void set_mode_inactive();
  55.    void set_mode_latch();
  56.    void set_mode_write();  
  57.    void write_register(char reg, char value);
  58.    
  59.    void sound_play_tone(unsigned char tone);
  60.    
  61.    //void sound_play_tone(unsigned char tone);
  62.    
  63.  
  64.  
  65.       void main()
  66.       {
  67.       SET_TRIS_A(0B00100000);      
  68.       SET_TRIS_B(0B00000000);
  69.       porta=0x00;
  70.       portb=0x00;  
  71.      
  72.  
  73.    
  74.       set_mode_inactive();
  75.    
  76.      // Enable only the Tone Generator on Channel A
  77.      write_register(7, 0b00111110);
  78.      
  79.      // Set the amplitude (volume) to maximum on Channel A
  80.      write_register(8, 0b00001111);
  81.            
  82.          while(TRUE)
  83.          {
  84.          
  85.        sound_play_tone(1);
  86.        DELAY_MS(500);
  87.        
  88.          }
  89.       }

funci.h
Código: C
  1. //funciones
  2.    
  3.              void set_mode_inactive()
  4.             {
  5.               output_low(BC1);
  6.               output_low(BDIR);
  7.             }
  8.            
  9.             void set_mode_latch()
  10.             {
  11.               output_high(BC1);
  12.               output_high(BDIR);
  13.             }
  14.            
  15.             void set_mode_write()
  16.             {
  17.               output_low(BC1);
  18.               output_high(BDIR);
  19.             }
  20.            
  21.             void write_register(char reg, char value)
  22.             {
  23.               set_mode_latch();  
  24.               PORTB = reg;  
  25.               set_mode_inactive();  
  26.               set_mode_write();  
  27.               PORTB = value;  
  28.               set_mode_inactive();
  29.             }
  30.            
  31.       void sound_play_tone(unsigned char tone)
  32. {
  33.     unsigned char x;
  34.     unsigned char value = 0;
  35.  
  36.     // Output Tone
  37.     for (x = 0; x < 14; x++)
  38.     {
  39.         switch(tone) {
  40.         case 1:
  41.             value = tone_1[x];
  42.             break;
  43.         case 2:
  44.            // value = tone_2[x];
  45.             break;
  46.         case 3:
  47.            // value = tone_3[x];
  48.             break;
  49.         case 4:
  50.           //  value = tone_4[x];
  51.             break;
  52.         case 5:
  53.           // value = tone_5[x];
  54.             break;
  55.         case 6:
  56.            // value = tone_6[x];
  57.             break;
  58.        
  59.  }
  60.  
  61.         write_register(x, value);
  62.     }
  63. }

arreglos.c
Código: C
  1. const  unsigned char tone_1[] = {0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1c, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00};
« Última modificación: 14 de Abril de 2024, 14:13:41 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Error al compilar en un puerto desde una funcion
« Respuesta #5 en: 14 de Abril de 2024, 14:30:33 »
Lo mismo que antes.  La definición de tone_1 está en arreglos.c , que está después de funci.h

Hay compiladores que hacen 2 o mas pasadas. Pero CCS hace una sola (como la mayoría), por lo que las variables y funciones deben estar declaradas previamente a la línea que las usa.
« Última modificación: 14 de Abril de 2024, 14:32:54 por Eduardo2 »

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Error al compilar en un puerto desde una funcion
« Respuesta #6 en: 14 de Abril de 2024, 14:46:35 »
Lo mismo que antes.  La definición de tone_1 está en arreglos.c , que está después de funci.h

Hay compiladores que hacen 2 o mas pasadas. Pero CCS hace una sola (como la mayoría), por lo que las variables y funciones deben estar declaradas previamente a la línea que las usa.
Gracias Eduardo, perdoname aun no comprendo, nunca he realizado librerias (estoy tratando de implementar la primera), ustedes que tienen tanto conocimiento, sugieren hacerlas para optimizar el codigo.
Incluso aun tengo dudas si van <funci> o "funci".
Lo que tratas de decirme es que debo declarar en el programa principal  algo asi " char tone_1[];"

Realice esto despues de pensar mucho en tu respuesta.
       #include <funci.h>
       #include <arreglos.c>
     por esto..
      #include <arreglos.c>
      #include <funci.h>

y ya compilo, es como decir que no puedo llamar a algo que esta despues, creo.

« Última modificación: 14 de Abril de 2024, 15:09:16 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Error al compilar en un puerto desde una funcion
« Respuesta #7 en: 14 de Abril de 2024, 15:12:12 »
Imagina que compilaras "a mano", cuando llegas a la línea de value=tone_1(x) ;  tenés que escribir en la dirección de memoria donde esta value (que ya fue asignada al comienzo de la funcion) el contenido de tone_1(x), y tone_1 no se sabe donde está pues no fue asignado todavía y tampoco se sabe donde va estar pues falta asignar variables.

Con las funciones es la misma historia, por eso se declaran los prototipos al principio, así el compilador puede generar el código correspondiente a los argumentos de llamada y retorno y solo le queda por actualizar la dirección hacia donde debe saltar, que se hace al final.
 
« Última modificación: 14 de Abril de 2024, 15:32:24 por Eduardo2 »

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Error al compilar en un puerto desde una funcion
« Respuesta #8 en: 14 de Abril de 2024, 20:15:59 »
Imagina que compilaras "a mano", cuando llegas a la línea de value=tone_1(x) ;  tenés que escribir en la dirección de memoria donde esta value (que ya fue asignada al comienzo de la funcion) el contenido de tone_1(x), y tone_1 no se sabe donde está pues no fue asignado todavía y tampoco se sabe donde va estar pues falta asignar variables.

Con las funciones es la misma historia, por eso se declaran los prototipos al principio, así el compilador puede generar el código correspondiente a los argumentos de llamada y retorno y solo le queda por actualizar la dirección hacia donde debe saltar, que se hace al final.
Muchas gracias por la explicacion....
Por ultimo para no postear un nuevo tema, me podrian indicar por favor lo siguiente.
tengo un arreglo de 0 - 543 posiciones (544) pero necesito ir leyendolas en tramos de 16, lo he intentado con un for paero aun no lo consigo.
« Última modificación: 14 de Abril de 2024, 20:19:52 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Error al compilar en un puerto desde una funcion
« Respuesta #9 en: 14 de Abril de 2024, 20:20:26 »
Imagina que compilaras "a mano", cuando llegas a la línea de value=tone_1(x) ;  tenés que escribir en la dirección de memoria donde esta value (que ya fue asignada al comienzo de la funcion) el contenido de tone_1(x), y tone_1 no se sabe donde está pues no fue asignado todavía y tampoco se sabe donde va estar pues falta asignar variables.

Con las funciones es la misma historia, por eso se declaran los prototipos al principio, así el compilador puede generar el código correspondiente a los argumentos de llamada y retorno y solo le queda por actualizar la dirección hacia donde debe saltar, que se hace al final.
Muchas gracias por la explicacion....

Por ultimo para no postear un nuevo tema, me podrian indicar por favor lo siguiente.
tengo un arreglo de 0 - 543 posiciones (544) pero necesito ir leyendolas en tramos de 16, lo he intentado con un for pero aun no lo consigo.
Código: C
  1. void sound_play_tone()
  2. {
  3.     unsigned char conta=0;;
  4.      //unsigned char n=0;
  5.     unsigned int16 x;
  6.   //  unsigned char i;
  7.     unsigned char value ;
  8.  
  9.     // Output Tone
  10.  
  11.   // delay_ms(200);
  12.       for (x = 0; x<544; x++)
  13.     {  
  14.        value=(tone_1[x]);    
  15.        write_register(conta,value);
  16.        
  17.            if (conta>15)
  18.             {
  19.            conta=0;     }
  20.    
  21.            conta++;
  22.  
  23.  
  24.     }    
  25.  
  26. }
« Última modificación: 14 de Abril de 2024, 20:26:15 por johenrod »
Si algo parece complicado... es por que esta mal explicado.

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Error al compilar en un puerto desde una funcion
« Respuesta #10 en: 14 de Abril de 2024, 21:19:08 »
Una forma:
Código: [Seleccionar]
    for (x = 0; x<544; ){
        for(int8 conta=0 ; conta<16 ; conta++){
            value=(tone_1[x++]); 
            write_register(conta,value);
            .................... 
            ....................             
        }   
        .................... 
        ....................         
    }                         

Desconectado johenrod

  • PIC18
  • ****
  • Mensajes: 276
Re:Error al compilar en un puerto desde una funcion
« Respuesta #11 en: 15 de Abril de 2024, 10:14:26 »
Una forma:
Código: [Seleccionar]
    for (x = 0; x<544; ){
        for(int8 conta=0 ; conta<16 ; conta++){
            value=(tone_1[x++]); 
            write_register(conta,value);
            .................... 
            ....................             
        }   
        .................... 
        ....................         
    }                         
Gracias Eduardo2, Dios te bendiga.
Si algo parece complicado... es por que esta mal explicado.