Problema con la libreria delay en los 18F
3 participantes
Página 1 de 1.
Problema con la libreria delay en los 18F
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
#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
- Mensajes : 38
Fecha de inscripción : 17/12/2008
Edad : 61
Localización : Bilbao
Re: Problema con la libreria delay en los 18F
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
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
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Problema con la libreria delay en los 18F
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
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
- Mensajes : 38
Fecha de inscripción : 17/12/2008
Edad : 61
Localización : Bilbao
Re: Problema con la libreria delay en los 18F
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 <> y las comillas parece que se pueden intercambiar, si es
mas correcto usar <> pues no hay mas que hablar, uno esta para
aprender.
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.
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:He escrito en el toolchain/linker el directorio donde estan las librerias del 18f
/usr/share/sdcc/lib/pic16. Pero el error no desaparece.
.............-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..
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Problema con la libreria delay en los 18F
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
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
- Mensajes : 38
Fecha de inscripción : 17/12/2008
Edad : 61
Localización : Bilbao
Re: Problema con la libreria delay en los 18F
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.
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.
arcachofo- Participante Activo
- Mensajes : 91
Fecha de inscripción : 26/11/2008
Re: Problema con la libreria delay en los 18F
Checando en el Makefile: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
- 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
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 .
Temas similares
» SDCC: Driver para Usart PIC16*
» SDCC con delay en ensamblador embebido generado en PIKLoops para PIC16F628A y obtencion de la mediana con Quicksort
» Bug en la librería ADC para 18F
» SDCC USB libreria
» Libreria para PIC
» SDCC con delay en ensamblador embebido generado en PIKLoops para PIC16F628A y obtencion de la mediana con Quicksort
» Bug en la librería ADC para 18F
» SDCC USB libreria
» Libreria para PIC
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.