Problema con la libreria delay en los 18F

Ir abajo

Problema con la libreria delay en los 18F

Mensaje por Fernan el Vie 9 Ene 2009 - 18:38

Si uso la libreria Include con el 18f4520 :
#include "pic18f4520.h"
#include "delay.h"

// initialize board
void init_board(void) {
ADCON1=0x7; // PORTA used for digital I/O
TRISBbits.TRISB0=0; // configure PORTB0 for output (right LED)
TRISBbits.TRISB1=0; // configure PORTB1 for output (right LED)
TRISBbits.TRISB2=0; // configure PORTB2 for output (center LED)
TRISBbits.TRISB3=0; // configure PORTB3 for output (left LED)
TRISAbits.TRISA4=1; // configure PORTA4 for input (pushbutton)
}

void main() {
int button_down=0;
init_board();
// switch LEDs off
LATBbits.LATB0=1;
LATBbits.LATB1=0;
LATBbits.LATB2=1;
LATBbits.LATB3=0;
while (1) {

if (!PORTAbits.RA4) { // is button pressed?
if (!button_down) { // toggle LEDs
LATBbits.LATB0^=1;
LATBbits.LATB1^=1;
LATBbits.LATB2^=1;
LATBbits.LATB3^=1;
delay1ktcy(1);
}
button_down=1;
} else {
button_down=0;
}
}
}

Al linkar da un fallo

missing definition for symbol "_delay1ktcy", required by "led.o"

He buscado algun ejemplo en la web pero los programas que encuentro usan rutinas propias para los retardos.

Muchas gracias
Un saludo

Fernan

Fernan
Participante Activo
Participante Activo

Mensajes : 38
Fecha de inscripción : 17/12/2008
Edad : 54
Localización : Bilbao

Volver arriba Ir abajo

Re: Problema con la libreria delay en los 18F

Mensaje por arcachofo el Vie 9 Ene 2009 - 19:21

Bueno... está claro que no encuentra la librería...
Una cosa: poner los include entre comillas debería funcionar,... pero no sería lo correcto ponerlos entre: < > .. ?

De todas formas fíjate en la linea de ejecución del linker.. creo que los delays estan en libc18f.lib, si no aparece quizás tengas que añadirla para que la incluya, para esto en: opciones del proyento - toolchain -linker, tendrías que añadir una linea para que incluya libc18f.lib
avatar
arcachofo
Participante Activo
Participante Activo

Mensajes : 91
Fecha de inscripción : 26/11/2008

Volver arriba Ir abajo

Re: Problema con la libreria delay en los 18F

Mensaje por Fernan el Vie 9 Ene 2009 - 20:14

Muchas gracias por contestar

Los <> y las comillas parece que se pueden intercambiar, si es mas correcto usar <> pues no hay mas que hablar, uno esta para aprender.

He escrito en el toolchain/linker el directorio donde estan las librerias del 18f
/usr/share/sdcc/lib/pic16. Pero el error no desaparece.

El error completo que aparece la linkar es este:
+ "/usr/bin/gplink"
-I"/usr/bin/../share/sdcc/lib/pic16" -I"/usr/share/sdcc/lib/pic16" -c
-m -s/usr/share/gputils/lkr/18f4520i.lkr -w -r -o led.hex led.o crt0i.o
pic18f4520.lib libsdcc.lib
+ "/usr/bin/gplink"
-I"/usr/bin/../share/sdcc/lib/pic16" -I"/usr/share/sdcc/lib/pic16" -c
-m -s/usr/share/gputils/lkr/18f4520i.lkr -w -r -o led.hex led.o crt0i.o
pic18f4520.lib libsdcc.lib returned errorcode 256

Revisando la rutina delay.h que esta en /usr/share/sdcc/include/pic16 creo que falta la ruta y el nombre de la libreria que tiene que usar.Aparece asi

#ifndef __DELAY_H__
#define __DELAY_H__

#pragma library c

/*
* the delayNNtcy family of functions performs a
* delay of NN cycles. Possible values for NN are:
* 10 10*n cycles delay
* 100 100*n cycles delay
* 1k 1000*n cycles delay
* 10k 10000*n cycles delay
* 100k 100000*n cycles delay
* 1m 1000000*n cycles delay
*/

void delay10tcy(unsigned char) __wparam;
void delay100tcy(unsigned char) __wparam;
void delay1ktcy(unsigned char) __wparam;
void delay10ktcy(unsigned char) __wparam;
void delay100ktcy(unsigned char) __wparam;
void delay1mtcy(unsigned char) __wparam;

#endif

Creo que despues del pragma deberia estar la libreria a usar. Pero no se si le falta algo mas.

De nuevo gracias

un saludo

Fernan

Fernan
Participante Activo
Participante Activo

Mensajes : 38
Fecha de inscripción : 17/12/2008
Edad : 54
Localización : Bilbao

Volver arriba Ir abajo

Re: Problema con la libreria delay en los 18F

Mensaje por arcachofo el Vie 9 Ene 2009 - 21:10

Los <> y las comillas parece que se pueden intercambiar, si es
mas correcto usar <> pues no hay mas que hablar, uno esta para
aprender.
Si... se supone que las comillas las usas cuando quieres que mire primero en el directorio donde está el programa a compilar, aunque si no encuentra ahí busca en los directorios incluidos, pero las comillas se "deberían" usar para archivos que esten en el mismo directorio que el archivo a compilar, aunque en teoría luego busca en los include.

Los <> se utilizan para archivos que no están en la carpeta del archivo a compilar sino en los include.
Se pueden intercambiar según en que casos, pero precisamente hoy mismo tuve problemas por poner <> cuando el archivo estaba en la misma carpeta del archivo a compilar, tuve que poner " ".

Como tampoco tengo claro del todo como funciona esto exactamente, pues pongo <> para los include y eso y "" si esta en la misma carpeta del archivo a compilar.
Lo decía por si acaso... pero seguramente no haya problema con eso.

He escrito en el toolchain/linker el directorio donde estan las librerias del 18f
/usr/share/sdcc/lib/pic16. Pero el error no desaparece.
Lo que tendrías que escribir no es esa ruta, eso ya está en el linker, el tema es poner el nombre de la librería que hay que usar,... fíjate que las librerias que está usando estan en la linea de comando del linker:

.............-m -s/usr/share/gputils/lkr/18f4520i.lkr -w -r -o led.hex led.o crt0i.o pic18f4520.lib libsdcc.lib

Está usando estas dos librerías:

pic18f4520.lib
libsdcc.lib

Fíjate que están nombradas una a una, aunque anteriormente nombre la ruta de las librerías, las que no se nombren no se usan, no estoy seguro de sea esto, pero creo que los delays estan en esta otra librería: libc18f.lib
Aunque puede que me equivoque.
Si el problema es este que yo digo, tendrías que añadir una linea con el nombre de esta última librería, de manera que la linea de comando del linker te que quedara así:

etc.......-m -s/usr/share/gputils/lkr/18f4520i.lkr -w -r -o led.hex led.o crt0i.o pic18f4520.lib libsdcc.lib libc18f.lib


Revisando la rutina delay.h que esta en /usr/share/sdcc/include/pic16
creo que falta la ruta y el nombre de la libreria que tiene que
usar.Aparece asi

#ifndef __DELAY_H__
#define __DELAY_H__

#pragma library c

/*
* the delayNNtcy family of functions performs a
* delay of NN cycles. Possible values for NN are:
* 10 10*n cycles delay
* 100 100*n cycles delay
* 1k 1000*n cycles delay
* 10k 10000*n cycles delay
* 100k 100000*n cycles delay
* 1m 1000000*n cycles delay
*/

void delay10tcy(unsigned char) __wparam;
void delay100tcy(unsigned char) __wparam;
void delay1ktcy(unsigned char) __wparam;
void delay10ktcy(unsigned char) __wparam;
void delay100ktcy(unsigned char) __wparam;
void delay1mtcy(unsigned char) __wparam;

#endif

Creo que despues del pragma deberia estar la libreria a usar. Pero no se si le falta algo mas.

Este archivo es un encabezado, solo hace algunas definiciones y declara las funciones, las verdaderas funciones están compiladas en las librerías y las busca el linker, por eso hay que especificar en que librerías están las funciones cuando se ejecuta el linker; pero no se hace en el encabezado, fíjate en otros encabezados, puede que incluyan a otros encabezados.h, pero no verás que indiquen ninguna librería.
Por eso me parece que la librería que contiene los delays no está indicada en el linker, el error que dá indica que no ha encontrado las funciones de delay como tu dices... pero eso hay que hacerlo en el linker, no en el encabezado.
Y no vale solo con poner la ruta donde están las librerías, al linker hay que decirle concretamente qué librerías tiene que usar.

Suerte..
avatar
arcachofo
Participante Activo
Participante Activo

Mensajes : 91
Fecha de inscripción : 26/11/2008

Volver arriba Ir abajo

Re: Problema con la libreria delay en los 18F

Mensaje por Fernan el Vie 9 Ene 2009 - 21:52

Corregido y arreglado.

Muchas gracias.

+ "/usr/bin/gplink" -I"/usr/bin/../share/sdcc/lib/pic16" -I"/usr/share/sdcc/lib/pic16" -c -m -w -r -o led.hex led.o crt0i.o libc18f.lib pic18f4520.lib libsdcc.lib

Pero ahora otra duda, ¿cada vez que me haga falta una libreria voy a tener que indicarla en el toolchain, porque por lo menos podia indicar cual le falta?.
O es solo para esta rutina

Un saludo

Fernan

Fernan
Participante Activo
Participante Activo

Mensajes : 38
Fecha de inscripción : 17/12/2008
Edad : 54
Localización : Bilbao

Volver arriba Ir abajo

Re: Problema con la libreria delay en los 18F

Mensaje por arcachofo el Vie 9 Ene 2009 - 22:18

Me alegro de que solo fuera eso y se haya solucionado...

Cada vez que tengas que usar una función tienes que especificar la librería en el linker, pero ya no hay muchas librerías más, osea que con eso lo tienes casi todo. En cada librería vienen muchas funciones, la mayoría están en las dos librerías que te pone por defecto en el linker, la del pic utilizado: pic18f4520.lib y libsdcc.lib, pero se vé que algunas cosas vienen en esa otra librería.

De todas formas creo que tendrás que añadir eso en cada proyecto que tengas que utilizar los delays.

La verdad es que hay poca información sobre esto... aquí van quedando estos temas para los siguientes que tengan la duda, pero estaría bien ir recopilando toda esta información y hacer una especie de manual en español de sdcc para pic... incluso en el manual oficial de sdcc en ingles no viene casi nada de los pic.
avatar
arcachofo
Participante Activo
Participante Activo

Mensajes : 91
Fecha de inscripción : 26/11/2008

Volver arriba Ir abajo

Re: Problema con la libreria delay en los 18F

Mensaje por Geo el Vie 9 Ene 2009 - 23:25

Fernan escribió:
Pero ahora otra duda, ¿cada vez que me haga falta una libreria voy a tener que indicarla en el toolchain, porque por lo menos podia indicar cual le falta?.
O es solo para esta rutina
Checando en el Makefile:
Código:

lib_LIBRARIES = libc18f.a
libc18f_a_SOURCES = ctype/iscntrl.c ctype/isdigit.c ctype/isgraph.c \
   ctype/islower.c ctype/isprint.c ctype/ispunct.c \
   ctype/isspace.c ctype/isupper.c ctype/isxdigit.c \
   delay/delay100ktcy.S delay/delay100tcy.S delay/delay10ktcy.S \
   delay/delay10tcy.S delay/delay1ktcy.S delay/delay1mtcy.S \
   stdio/fprintf.c stdio/printf.c stdio/printf_small.c \
   stdio/printf_tiny.c stdio/putchar.c stdio/sprintf.c \
   stdio/streams.c stdio/strmgpsim.c stdio/strmmssp.c \
   stdio/strmputchar.c stdio/strmusart.c stdio/vfprintf.c \
   stdio/vprintf.c stdio/vsprintf.c stdlib/atof.c stdlib/atoi.c \
   stdlib/atol.c stdlib/calloc.c stdlib/crc16.c stdlib/free.c \
   stdlib/g_ftoa.S stdlib/itoa.c stdlib/ltoa.c stdlib/malloc.c \
   stdlib/memfree.c stdlib/memfreemax.c stdlib/memmisc.c \
   stdlib/rand.c stdlib/realloc.c stdlib/x_ftoa.c \
   string/memccpy.c string/memchr.c string/memchrpgm.c \
   string/memchrram.c string/memcmp.c string/memcpy.c \
   string/memcpypgm2ram.c string/memcpyram2ram.c string/memmove.c \
   string/memrchr.c string/memset.c string/strcat.c \
   string/strchr.c string/strcmp.c string/strcpy.c \
   string/strcspn.c string/strlen.c string/strlwr.c \
   string/strncat.c string/strncmp.c string/strncpy.c \
   string/strpbrk.c string/strrchr.c string/strspn.c \
   string/strstr.c string/strtok.c string/strupr.c \
   utils/cnvfrac.S utils/cnvint.S utils/cvtdec.S
El archivo libc18f contiene todas las funciones que se listan, necesitarás enlazarlo cuando hagas uso de alguna de ellas.

Este tipo de detalles son los que se resuelven teniendo documentación a la mano, la cual lamentablemente hace falta.
Por otro lado, a mi me parecería más cómodo que se tuviera una libdelay, en lugar de meter sus funciones en libc18f, aunque tuviera que indicar muchas librerías a enlazar Wink.

Geo
Participante Activo
Participante Activo

Mensajes : 92
Fecha de inscripción : 16/12/2008
Localización : México

http://hsblog.mexchip.com

Volver arriba Ir abajo

Re: Problema con la libreria delay en los 18F

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Volver arriba

- Temas similares

 
Permisos de este foro:
No puedes responder a temas en este foro.