Autor Tema: Librerias en XC8. Archivos .h? archivos .c?  (Leído 4139 veces)

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

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Librerias en XC8. Archivos .h? archivos .c?
« en: 21 de Mayo de 2018, 10:34:05 »
Hola a todos.

Por fin me he decidido a dejar de lado el assembler por un tiempo y estudiar c de una vez 8).

Ya tengo el MPLAB 4.15, el XC8 y estoy escribiendo pequenos programas (para pic16) para leer entradas, encender y apagar leds y escribir en la EEPROM interna y poco mas de momento
 
Ahora, para manejar LCD, I2C, etc. quiero empezar a crear y anadir librerias, como por ejemplo esta de todopic

http://www.todopic.com.ar/foros/index.php?topic=39767.msg353639#msg353639

El caso es que buscando sobre librerias me encuentro dos tipos de archivos: .h y .c y cuanto mas leo menos entiendo :? :

1) Son necesarios los dos archivos para que funcione la libreria?
2) En el main.c es necesario utilizar #include para los dos?

Agradecere cualquier ayuda que puedan prestarme

Saludos

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Librerias en XC8. Archivos .h? archivos .c?
« Respuesta #1 en: 21 de Mayo de 2018, 11:10:15 »
Es buena practica poner ambos... voy a hacerte una comparacion con ASM

En ASM podias tener un archivo libreria y luego hacias:

Código: ASM
  1. #include "lcd.inc"
  2.  ;Codigo de tu archivo principal


Luego que pasa el compilador, este es el resultado:

Código: ASM
  1. ;Codigo del LCD
  2.  ;Codigo de tu archivo principal


Como si fuera un solo archivo para todo.

Hay otras formas de realizarlo en ASM. Y es no incluirlo al archivo, en el cual los 2 archivos estan separados sin nigun include, donde declaras tus subrutinas y variables como "globales", asi mismo para usarlas en tu archivo principal necesitas decirle que existe alguna subrutina y variable con ese nombre "externo" a tu archivo. Ahora el compilador va a tener 2 archivos separados, y el linker va a ser quien una ambos archivos. Es decir va a ver el archivo principal.s y va a notar que existe un simbolo (nombre de la variable) que no es de ese archivo y esta en otro, entonces mientras pasa por archivo y archivo encuentra donde se encuentra definido y lo "enlaza" los une.
No recuerdo bien como era hacerlo pero suponete que era asi:

archivo1.s
Código: ASM
  1. global sumar
  2. global restar
  3.  
  4. sumar:
  5.     ;Aca codigo ASM
  6.     return
  7.  
  8. restar:
  9.     ;Aca codigo ASM
  10.     return

main.s
Código: ASM
  1. ;Omito los vectore e incializacion, pero antes poner:
  2.  
  3. extern sumar
  4. extern restar
  5.  
  6. ;El codigo
  7.    CALL sumar

-------------------------------------------------------------------------------------

En C ocurre lo mismo.. Podes hacer las 2 formas. Sin un .h podes hacer:

Código: C
  1. #include "lcd.c"
  2.  
  3.  // Aca codigo del main.c

Obviamente esto es como poner ambos codigos en todo un archivo. Nomas que lo tenemos separado en 2.. Esto puede ser un problema y tambien es considerado una mala practica en C.

La otra forma es ofrecer con el .h una "interfaz" hacia el .c. Y ahora voy a ser un poco mas especifico con los ejemplos.

Suponete que tenemos estos archivos:

operaciones.c
Código: C
  1. char sumar(char a, char b)
  2. {
  3.     return (a+b);
  4. }
  5.  
  6. char restar(char a, char b)
  7. {
  8.     return (a-b);
  9. }

main.c
Código: C
  1. #include <xc.h>
  2.  
  3. void main(void)
  4. {
  5.   char x;
  6.    x = suma(1,2);
  7.    x = resta(10,2);
  8.  
  9.    while(1)
  10.    {
  11.        //Nuestro loop infinito
  12.    }
  13. }

Como dije tengo 2 formas de hacerlo pero vamos por la segunda que es la que nos interesa.
El linker no tiene idea que existe las funciones suma y resta en otro archivo, la esta usando pero no saben de donde vienen, y si tratas de compilar los 2 archivos asi nomas vas a tener un error que dice que suma y resta se declararon implicitamente.  Tambien a veces si usamos suma y resta en el archivo operaciones.c necesitamos declararlas en ese archivo. Entonces creamos un .h

operaciones.h
Código: C
  1. // Esto es una guarda, para que no se incluya muchas veces en un archivo .c , sino que al incluirse una ves
  2. // ya se define _OPERACIONES_H entonces para la proxima no va a entrar. Solo entra si no esta definido.
  3. #ifndef _OPERACIONES_H
  4. #define _OPERACIONES_H
  5.  
  6. char sumar(char a, char b);
  7. char restar(char a, char b);
  8.  
  9. #endif

Para no entrar en tanto detalles voy a resumir la explicacion como vine haciendo hasta ahora, a ese archivo lo incluis en operaciones.c (donde tenes definida las funciones) y en main.c (donde queres usarlas). Y con eso le decis al linker que se encuentra en otro archivo. Es decir al momento de unir los archivos, va a mirar el main.c y va a pensar: "Tengo estas dos funciones en otro archivo" Entonces las va a ir a buscar a otro.c

Como te dije no quiero entrar en detalles sobre porque es que se comparten, ni el alcance de los simbolos, ni otras formas de hacerlo (como usar extern y no incluir un .h), sino darte una explicación simple y entendible de porque necesitarias un .h. Luego avanzaras sobre otros temas, por ahora con lo minimo pienso que te sobraria.

----------------------------------------------------------------------

Hay una cosa que debo aclarar, si observas en nuestro .h no hay nada que ocupe lugar en el micro, Las funciones estan definidas en el .c, las variables deberian estar definidas en los .c, en el .h deberías poner: prototipos de funciones (como el ejemplo, el cual no tienen codigo), la definicion de una estructura/union, etc. Como nombre antes, si lo que pusiste crea una variable que ocupa espacio tanto en RAM como en ROM eso NO va sobre el .h (omitiendo las macros que eso lo vas a ver mucho mas adelante)
« Última modificación: 21 de Mayo de 2018, 11:13:33 por KILLERJC »

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Librerias en XC8. Archivos .h? archivos .c?
« Respuesta #2 en: 21 de Mayo de 2018, 11:57:35 »
Gracias KILLERJC.
Sin duda la mejor respuesta que he visto hasta ahora ((:-))


Sin un .h podes hacer:

Código: C
  1. #include "lcd.c"
  2.  
  3.  // Aca codigo del main.c

Obviamente esto es como poner ambos codigos en todo un archivo. Nomas que lo tenemos separado en 2.. Esto puede ser un problema y tambien es considerado una mala practica en C.

Siguiendo la forma de hacer del ASM he intentado poner de la manera que describes arriba, haciendo un include al lcd_pic16.c y me daba un error que todavia no he podido identificar (incluyo foto)


* ERROR (500) .PNG
(8.94 kB, 818x146 - visto 1176 veces)


Por eso empece a sospechar que en c era diferente :lol:.
Leyendo tu explicacion deduzco que, si quiero utilizar esta libreria, tengo que crear un .h, no es asi?


Hay una cosa que debo aclarar, si observas en nuestro .h no hay nada que ocupe lugar en el micro, Las funciones estan definidas en el .c, las variables deberian estar definidas en los .c, en el .h deberías poner: prototipos de funciones (como el ejemplo, el cual no tienen codigo), la definicion de una estructura/union, etc. Como nombre antes, si lo que pusiste crea una variable que ocupa espacio tanto en RAM como en ROM eso NO va sobre el .h (omitiendo las macros que eso lo vas a ver mucho mas adelante)

Buscando por la web me he encontrado librerias .h llenas de codigo, lo contrario a lo que me cuentas.
Por eso estaba absolutamente perdido con el tema.

Sigo estudiando

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Librerias en XC8. Archivos .h? archivos .c?
« Respuesta #3 en: 21 de Mayo de 2018, 12:00:59 »
Buscando un poco por el foro parece que el tema del LCD para XC8 no es tan facil :shock:...

http://www.todopic.com.ar/foros/index.php?topic=48753.0
http://www.todopic.com.ar/foros/index.php?topic=48757.0


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Librerias en XC8. Archivos .h? archivos .c?
« Respuesta #4 en: 21 de Mayo de 2018, 12:08:13 »
Ellos estan utilizando la libreria XLCD que viene con el MLA de Microchip.
Lo que propuse es general, valido para cualquier libreria, o podes crearte vos la libreria (sea de 0 o copiarla) y no vas a tener problema.

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Librerias en XC8. Archivos .h? archivos .c?
« Respuesta #5 en: 21 de Mayo de 2018, 19:34:01 »
Gracias por la ayuda

o podes crearte vos la libreria (sea de 0 o copiarla) y no vas a tener problema.

Creo que puede ser lo mejor, aprendiendo de los errores poco a poco.

Ya me tendreis por aqui dentro de poco preguntando de nuevo :D

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Librerias en XC8. Archivos .h? archivos .c?
« Respuesta #6 en: 21 de Mayo de 2018, 20:30:30 »
Acabo de ver que editaste tu respuesta

Citar
Leyendo tu explicacion deduzco que, si quiero utilizar esta libreria, tengo que crear un .h, no es asi?

No se lo que contiene el archivo lcd.c como para decirte donde esta el error. Pero desde el vamos que no debes incluir un .c

Citar
Buscando por la web me he encontrado librerias .h llenas de codigo, lo contrario a lo que me cuentas.

Suele ocurrir y todo puede suceder. Y sucede porque en proyectos chicos no importa. Pero cuando crecen la cantidad de archivos ya ese código se hace inmantenible e ilegible. Porque jugas con incluso el lugar donde pones el include.

Creo que puede ser lo mejor, aprendiendo de los errores poco a poco.

Ya me tendreis por aqui dentro de poco preguntando de nuevo :D

Por supuesto, nadie nacio sabiendo y se hace a los golpes, poco a poco aprendes cosas nuevas y te motivan a ponerlas a prueba. Cualquier duda que tengas podes ponerla en este mismo hilo o en otro.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re:Librerias en XC8. Archivos .h? archivos .c?
« Respuesta #7 en: 27 de Mayo de 2018, 06:17:36 »
Hola Loudness, si tienes dudas sobre el proyecto que he compartido para el manejo de la librería XLCD me dices tus dudas y te ayudaré en la medida de lo posible, no soy tan bueno programando como el compañero KILLERJC pero intentaré echarte una mano.  ;-)
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Re:Librerias en XC8. Archivos .h? archivos .c?
« Respuesta #8 en: 29 de Mayo de 2018, 01:35:51 »
Gracias Thulsa Doom por tu ayuda y perdon por no responder antes.

Buscando por san google me he topado con unas librerias que medio funcionan.
Ahora las estoy modificando un poco pero cuando funcionen las colgare por aqui.

Ahora estoy luchando con las interrupciones  :lol:

No se si es problema del c, que todavia no lo domino, o mas bien me la esta jugando el proteus, que ya van varias veces :5]

Seguramente me tengais preguntando por aqui dentro de poco.

Saludos


 

anything