TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: AV9 en 15 de Enero de 2011, 16:21:15
-
Hola a todos,
¿Alguien me sabría decir cómo usar la librería XLCD del C18 para con un display conectado en el PUERTO D del PIC18F4550?
Llevo todo el dia leyendo foros y buscando una solución a mi problema pero no he querido crear un nuevo post debido a que he visto que ya hay muchísima info sobre esto, sin embargo ya llevo varias horas probando mil códigos distintos y distintas soluciones y no consigo nada de nada...
En principio hay una zona de esta librería que parace indicar el puerto de conexión, donde yo he cambiado "B" por "D":
#define DATA_PORT PORTD
#define TRIS_DATA_PORT TRISD
#define RW_PIN LATDbits.LATD6
#define TRIS_RW TRISDbits.TRISD6
#define RS_PIN LATDbits.LATD5
#define TRIS_RS TRISDbits.TRISD5
#define E_PIN LATDbits.LATD4
#define TRIS_E TRISDbits.TRISD4
Pero aunque cambiar esto siguen saliendo todos los datos por el puerto "B". Si alguien me puede ayudarme o indicarme un enlace a una posible solución estaría muy agradecido.
Gracias de antemano.
-
A leer: http://www.micros-designs.com.ar/tutorial-mplab-c18/
Saludos!
-
Hola Suky,
Ya me descargué este manual que colgaste y me pareció muy bueno, pero en la sección del LCD habla de cómo conectarlo al PORTB que es cómo viene por defecto en XLCD, pero no he visto nada para cambiarlo de puerto.
Gracias por la ayuda.
-
Hola Suky,
Ya me descargué este manual que colgaste y me pareció muy bueno, pero en la sección del LCD habla de cómo conectarlo al PORTB que es cómo viene por defecto en XLCD, pero no he visto nada para cambiarlo de puerto.
Gracias por la ayuda.
No te lo cito por que sí ;-) Página 58, Librerias/Modificar librerias
Saludos!
-
Esa parte no la había visto! Voy a probarlo!
Mil gracias!!!!!!
-
Hola Suky,
He copiado el mismo código que sale en el manual y he seguido todos los pasos al pie de la letra pero me aparecen los siguientes errores:
C:\Documents and Settings\AndreW\Mis documentos\Projects\C18\PFC v1\xlcd.h:134:Warning [2058] call of function without prototype
C:\Documents and Settings\AndreW\Mis documentos\Projects\C18\PFC v1\xlcd.h:137:Warning [2058] call of function without prototype
C:\Documents and Settings\AndreW\Mis documentos\Projects\C18\PFC v1\xlcd.h:140:Warning [2058] call of function without prototype
C:\MCC18\src\pmc_common\XLCD\putrxlcd.
c:16:Error [1109] type mismatch in redeclaration of 'putrsXLCD'
Halting build on first failure as requested.
Entonces aquí he quitado de "Source Files" putrxlcd.c y me aparece este otro error:
C:\Documents and Settings\AndreW\Mis documentos\Projects\C18\Test\main.c:18:Error [1504] redefinition of 'DelayPORXLCD'
C:\Documents and Settings\AndreW\Mis documentos\Projects\C18\Test\main.c:21:Error [1504] redefinition of 'DelayXLCD'
C:\Documents and Settings\AndreW\Mis documentos\Projects\C18\Test\main.c:25:Error [1504] redefinition of 'comandXLCD'
C:\Documents and Settings\AndreW\Mis documentos\Projects\C18\Test\main.c:30:Error [1504] redefinition of 'gotoxyXLCD'
C:\Documents and Settings\AndreW\Mis documentos\Projects\C18\Test\main.c:47:Warning [2058] call of function without prototype
C:\Documents and Settings\AndreW\Mis documentos\Projects\C18\Test\main.c:49:Warning [2058] call of function without prototype
Halting build on first failure as requested.
He vuelto a agregar putrxlcd.c donde estaba y me sale este último error de nuevo.
Ya no se por donde tirar...he realizado la configuración del programa como indica en el comienzo. El caso es que con el puerto B no tengo problema, pero claro...
Alguna idea?
Gracias por la ayuda.
-
Primero que nada, un consejo, trata de no guardar tus proyectos en una ubicacion cuya direccion sea tan larga, ya que si no estoy equivocado MPLAB solo acepta hasta 64 caracteres para la ubicación de los archivos. y esto
C:\Documents and Settings\AndreW\Mis documentos\Projects\C18\PFC v1\xlcd.h
tiene mas de 64 caracteres.
Prueba con eso primero. Ademas, los warnings te explican muy bien cual puede ser el problema, busca en las lineas 134, 137 y 140 para ver cual es la función a la que aparentemente le falta el prototipo.
Saludos!
-
Hola de nuevo,
Gracias por las respuestas. Efectivamente la ruta era demasiado larga y a parte he corregido otros errores...hasta ahora que ya no tengo warnings pero sí un error que no sé qué quiere decir porque además hace referencia a un archivo que no he tocado, dice lo siguiente:
C:\MCC18\src\pmc_common\XLCD\putrxlcd.c:16:Error [1109] type mismatch in redeclaration of 'putrsXLCD'
¿......?
-
Que tienes en la linea 16 del archivo C:\MCC18\src\pmc_common\XLCD\putrxlcd.c?
Saludos!
-
La librería donde me indica el error contiene el siguiente código:
#include <p18cxxx.h>
#include <xlcd.h>
/********************************************************************
* Function Name: putrsXLCD
* Return Value: void
* Parameters: buffer: pointer to string
* Description: This routine writes a string of bytes to the
* Hitachi HD44780 LCD controller. The user
* must check to see if the LCD controller is
* busy before calling this routine. The data
* is written to the character generator RAM or
* the display data RAM depending on what the
* previous SetxxRamAddr routine was called.
********************************************************************/
void putrsXLCD(const rom char *buffer) <-------------------------------------------------------------------- LINEA 16
{
while(*buffer) // Write data to LCD up to null
{
while(BusyXLCD()); // Wait while LCD is busy
WriteDataXLCD(*buffer); // Write character to LCD
buffer++; // Increment buffer
}
return;
}
Ahí marqué la linea de interés.
-
Bueno si me dan alguna nueva indicación la haré mañana porque ahora aquí en España son las 2:07 de la madrugada y llevo desde que me desperté delante del ordenador y lo veo ya todo borroso jeje.
Un saludo y gracias por la ayuda!
-
Busca en xlcd.h y ve si la función en cuestión esta definida de la misma forma!
Además de eso, ahora mismo no se me ocurre otra cosa!
Saludos!
-
Ese problema aparece dependiendo de la versión de C18. Utiliza la ultima o saca ese archivo del proyecto.
Saludos
-
Solucionado!
Mil gracias a todos.
Por cierto Suky muy buen manual.
Saludos!
-
Hola,
Me ha surgido una nueva duda. Siguiendo el Tutorial_C18, en la página 64 habla de cómo utilizar el Printf para escribir en LCD, muy útil para escribir variables que es mi intención. El caso es que he agregado y modificado el archivo "_user_putc.c" tal y como indica el manual pero el programa me da el siguiente error:
could not fin definition of symbol 'putcXLCD' in file 'Objects\_user_putc.o'.
Tuve que desagregar el archivo putcXLCD porque si no, no iba, y si lo agrego ahora me sale el mismo error de antes....
-
Pusiste extern?
-
Sip, en "_user_putc.c" puse lo siguiente:
extern putcXLCD(unsigned char c);
{
putcXLCD(c);
{
Saludos.
-
Sip, en "_user_putc.c" puse lo siguiente:
extern putcXLCD(unsigned char c);
{
putcXLCD(c);
{
Saludos.
No es correcto, revisa de nuevo el ejemplo.
Saludos!
-
Lo siento me equivoqué pegando. Lo que tengo es esto:
extern putcXLCD(unsigned char c);
void
_user_putc (unsigned char c)
{
putcXLCD(c);
{
-
Alguna idea de donde puede venir el error?
Gracias.
-
En tu codigo has cambiado la salida estandar mediante stdout = _H_USER; ??
Saludos!
-
Este es el código del main.c :
//Archivo con definición de registros y bits del microcontrolador elegido
#include <p18f4550.h>
#include <delays.h>
#include <xlcd.h>
#include <stdio.h>
#include <usart.h>
//Configuración de los Fuses del microcontrolador
#pragma config FOSC=XT_XT ,FCMEN=OFF ,IESO=OFF ,CPUDIV=OSC1_PLL2
#pragma config PWRT=ON ,BOR=OFF ,BORV=0 ,WDT=OFF ,WDTPS=32768
#pragma config MCLRE=ON ,LPT1OSC=OFF ,PBADEN=OFF ,CCP2MX=OFF
#pragma config STVREN=OFF ,LVP=OFF ,XINST=OFF ,DEBUG=OFF
#pragma config CP0=OFF ,CP1=OFF ,CP2=OFF ,CPB=OFF ,CPD=OFF
#pragma config WRT0=OFF ,WRT1=OFF ,WRT2=OFF
#pragma config WRTB=OFF ,WRTC=OFF ,WRTD=OFF
#pragma config EBTR0=OFF ,EBTR1=OFF ,EBTR2=OFF ,EBTRB=OFF
unsigned char var=125;
void DelayFor18TCY(void){
Delay10TCYx(2);
}
void DelayPORXLCD(void){
Delay1KTCYx(15);
}
void DelayXLCD(void){
Delay1KTCYx(2);
}
// Envia comando al LCD
void comandXLCD(unsigned char a){
BusyXLCD();
WriteCmdXLCD(a);
}
// Ubica cursor en (x = Posición en linea, y = nº de linea)
void gotoxyXLCD(unsigned char x, unsigned char y){
unsigned char direccion;
if(y != 1)
direccion = 0x40;
else
direccion=0;
direccion += x-1;
comandXLCD(0x80 | direccion);
}
void main(void){
stdout =_H_USER;
OpenXLCD(FOUR_BIT & LINES_5X7); //Iniciamos LCD
comandXLCD(0x06); //Nos aseguramos incremento de dirección, display fijo
comandXLCD(0x0C);
gotoxyXLCD(5,1);
printf("Var= %u", var);
while(1){ //Bucle infinito.
}
}
Debo de decir que no tengo incluida la librería putrsXLCD porque si no me da el siguiente error al compilar:
C:\MCC18\src\pmc_common\XLCD\lcd_all.c:232:Error [1109] type mismatch in redeclaration of 'putrsXLCD'
Además tengo el siguiente warning:
C:\Test\main.c:54:Warning [2066] type qualifier mismatch in assignment -------> En esta linea tengo: printf("Var= %u", var);
-
prueba con extern void putcXLCD(unsigned char c);
Saludos!
-
¿Pero eso en sustitucion de la funcion: void putrsXLCD(const rom char *buffer) situada en la librería putrsXLCD ??
-
Disculpa por no especificar!
La modificación que te dije es en el archivo _user_putc.c.
Cual es el error que te da ahora al compilar?
-
Voy a hacer eso que me dices pero antes un dato curioso.
No escribo la linea:
char Buffer[12]={"2 linea...};
No da error, pero si el warning que comente antes: "type qualifier mismatch in assignment", y el LCD no va.
Sin embargo si escribo lo del Buffer, me da un error me da un error sintáctico en la funcion: printf("Var= %u, var);
La clave debe estar ahí xq el LCD sí que va cuando no uso printf, pero claro lo que quiero es imprimir variables y con los put no puedo...
Te da eso alguna pista?
-
y cuando usas printf no saca muestra nada en el LCD??
-
No, se queda en blanco y me da un warning en esa linea siempre que no ponga la declaración del Buffer. Si lo pongo directamente me da un error sintáctico en esa misma linea.
Estoy viendo una cosa que no he puesto y esta en el manual....son las funciones OpenUSART. ¿Estas hay que ponerlas? como pensé que esto es para el puerto serie no tendría nada que ver....
Voy a probar para tenerlo exactamente igual que en el manual.
-
Nada....lo tengo todo exactamente igual que en el manual y me dice error sintáctico en:
printf("Var= %u", var);
-
La USART no tiene importancia ahora mismo, asi que no hace falta que uses la funcion OpenUSART().
Has lo siguiente, en el archivo _user_putc.c, usa esto:
extern void WriteDataXLCD(char);
void
_user_putc (char c)
{
WriteDataXLCD(c);
}
A mi me acaba de funcionar haciendo eso! Y el error sintactico lo puedes obviar!
Saludos!
Edito: Y no olvides agregar ademas el archivo _user_putc.c al proyecto!
-
OK, voy a probarlo, pero una cosa, yo no tenía agregados ni stdout.c ni _user_putc.c, aunque acabo de agregarlos sin tocar nada y no va.
Voy a probar con lo tuyo.
-
Nada, no compila y me sigue dando el error sintáctico.
-
En C18 se deben agregar todos los archivos fuentes que han sido modificados o en los que se utilicen datos que han sido modificados, este es el caso de los archivos para el lcd, y tambien el caso del _user_putc.c!
Si te fijas en el archivo xlcd.h, putcXLCD realmente no es una funcion, sino que es una etiqueta #define putcXLCD WriteDataXLCD, el compilador aparentemente no la reconoce como una función en si y por eso, si en el _user_putc.c la utilizas, da un error de que no se la encuentra, entonces, lo que hice fue utilizar la funcion WriteDataXLCD.
Espero que se entienda algo de lo que trata de explicar, si algo esta equivocado, porfavor corrijan! No se si esta es la solucion optima, pero al menos funciona!
Saludos!
-
Nada, no compila y me sigue dando el error sintáctico.
Que error te da ahora? a mi me funciona de maravillas!
-
JUUUUUeer que envidia!!!! qué estaré haciendo mal!!!
A ver...te pego lo que tengo para ver si la stoy cagando:
main.c :
//Archivo con definición de registros y bits del microcontrolador elegido
#include <p18f4550.h>
#include <delays.h>
#include <xlcd.h>
#include <stdio.h>
#include <usart.h>
//Configuración de los Fuses del microcontrolador
#pragma config FOSC=XT_XT ,FCMEN=OFF ,IESO=OFF ,CPUDIV=OSC1_PLL2
#pragma config PWRT=ON ,BOR=OFF ,BORV=0 ,WDT=OFF ,WDTPS=32768
#pragma config MCLRE=ON ,LPT1OSC=OFF ,PBADEN=OFF ,CCP2MX=OFF
#pragma config STVREN=OFF ,LVP=OFF ,XINST=OFF ,DEBUG=OFF
#pragma config CP0=OFF ,CP1=OFF ,CP2=OFF ,CPB=OFF ,CPD=OFF
#pragma config WRT0=OFF ,WRT1=OFF ,WRT2=OFF
#pragma config WRTB=OFF ,WRTC=OFF ,WRTD=OFF
#pragma config EBTR0=OFF ,EBTR1=OFF ,EBTR2=OFF ,EBTRB=OFF
void DelayFor18TCY(void){
Delay10TCYx(2);
}
void DelayPORXLCD(void){
Delay1KTCYx(15);
}
void DelayXLCD(void){
Delay1KTCYx(2);
}
// Envia comando al LCD
void comandXLCD(unsigned char a){
BusyXLCD();
WriteCmdXLCD(a);
}
// Ubica cursor en (x = Posición en linea, y = nº de linea)
void gotoxyXLCD(unsigned char x, unsigned char y){
unsigned char direccion;
if(y != 1)
direccion = 0x40;
else
direccion=0;
direccion += x-1;
comandXLCD(0x80 | direccion);
}
void main(void){
char Buffer[12]={"2 linea...};
unsigned char Variable=125;
OpenXLCD(FOUR_BIT & LINES_5X7); //Iniciamos LCD
comandXLCD(0x06); //Nos aseguramos incremento de dirección, display fijo
comandXLCD(0x0C);
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,25); //9600,8,N,1
// Modificamos para utilizar funcion del usuario, o sea escribir en un LCD.
stdout =_H_USER;
// Convertimos a string variable.
printf("Var=%u",Variable);
gotoxyXLCD(1,2);
// Enviamos string contenido en Buffer.
printf("%s", Buffer);
//Modificamos para utilizar nuevamente puerto serial.
stdout =_H_USART;
printf("Var=%u",Variable);
while(1){ //Bucle infinito.
}
}
_user_putc.c :
extern void WriteDataXLCD(char c);
void
_user_putc (char c)
{
WriteDataXLCD(c);
}
Y tengo agregado todo lo de la carpeta XLCD, _user_putc.c, main.c y xlcd.h.
-
El error que me da es este:
C:\Test\main.c:56:Error: syntax error
en la linea del printf.
-
char Buffer[12]={"2 linea...};
Te falta cerrar las comillas!! ;-)
char Buffer[12]={"2 linea..."};
Saludos!
-
TOMAAAA!!!! POR FIN!!!!!!!! UEUEUEUEUE!!!!!
MIL GRACIAS!!! JAJAJAJAJA
Me ha dado un error como siempre en putrxlcd.c, lo he desagregado y ya va!!!
Otra cosa, en el futuro quiero usar el puerto serie para realizar una comunicación con otros sistemas, ¿estas configuraciones del USART me afectarán?
¿lo de "stdout=_H_USART" hay que ponerlo siempre antes de cada printf ?
Gracias por la ayuda tio llevaba varios dias detrás de esto!
-
AHHH y una última cosilla...¿ cómo hago para borrar el display entero ?. Yo estoy acostumbrado al CCS y había una función para borrar, ¿aquí también?
Gracias.
-
TOMAAAA!!!! POR FIN!!!!!!!! UEUEUEUEUE!!!!!
MIL GRACIAS!!! JAJAJAJAJA
Me ha dado un error como siempre en putrxlcd.c, lo he desagregado y ya va!!!
Otra cosa, en el futuro quiero usar el puerto serie para realizar una comunicación con otros sistemas, ¿estas configuraciones del USART me afectarán?
¿lo de "stdout=_H_USART" hay que ponerlo siempre antes de cada printf ?
Gracias por la ayuda tio llevaba varios dias detrás de esto!
Excelente! que bueno que ya haya funcionado! :-/ :-/ :-/
¿lo de "stdout=_H_USART" hay que ponerlo siempre antes de cada printf ?
En el caso que lo vayas a utilizar tanto para el LCD como para el USART en un mismo proyecto, si, o por lo menos cada vez que desees cambiar de salida estandar.
Para borrar el LCD deben enviar un comando al mismo, seria con cualquiera de estas 2 funciones:
comandXLCD(0x01);
WriteCmdXLCD(0x01);
Saludos!
-
Bueno pues ya quedó todo claro, muchas gracias por la ayuda y hasta pronto!!! ;-) ;-) ;-) ;-)
-
Hola a todos!
Me ha surgido una nueva duda...¿es posible imprimir flotantes con el printf que aparece en el manual de C18 que colgó Suky?. He leído que no, pero pensé que igual hay alguna modificación nueva para hacerlo.
Si no, ¿me pueden indicar alguna librería que sí lo permita?
Grasias!
-
No, no se puede. En el foro han dejado una rutina, hay que utilizar el buscador ;-)
Saludos!
-
ok, gracias.
-
Hola, estoy teniendo algunos problemillas yo también con la libreria XLCD aunque creo que también tengo algunos problemas con la versión del compilador.
Si compilo el código con la versión 3.00 del C18 me da este error:
Error - unknown switch: -z__MPLAB_BUILD=1
make[2]: *** [dist/default/production/XLCD_D_300.X.production.hex] Error 1
make[1]: *** [.build-conf] Error 2
Errors : 1
make: *** [.build-impl] Error 2
Si lo compilo con la última versión del compilador full bajada de Microchip, compila bien, pero al simular en PROTEUS me da un problema de algo así como
TBLDTR
Hace un par de semanas hice varios programas para el LCD y iba todo perfecto, no entiendo donde está el problema.
-
Hola!
Tras mi último comentario he formateado el ordenador y he conseguido una versión del compilador que parece ser que vuelve a funcionar, aún
así, he probado algo que suponía debería funcionar y no ha sido el caso:
He cambiado directamente sobre <xlcd.h> la definición de los puertos y sigue mandando las señales por el puerto B, no debería haber cambiado???
Qué debería hacer para que funcionase aunque sea directamente modificado el archivo xlcd.h del path de C18???