Autor Tema: C18 + LCD  (Leído 10596 veces)

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

Desconectado Facundo

  • PIC10
  • *
  • Mensajes: 28
C18 + LCD
« en: 15 de Noviembre de 2010, 18:24:17 »
Hola gente!!!
Tengo un hard ya desarrollado donde el LCD está conectado en el puerto D (4 bit´s por la parte alta del puerto) de un 18F4550 y el control por el puerto E y el pin R/W esta puesto a GND.
La cosa es que esto todo está en CCS y estoy tratando de pasarlo a C18 pero me encuentro con problemas para hacer funcionar el LCD bajo estas condiciones que no son las que tiene la libreria para lcd del C18 ya que esta usa incluso un pin para R/W, si alguien me puede tirar una mano muy agradecido.

Un saludo para todos!!!

  Facundo

Desconectado gary_servin

  • PIC12
  • **
  • Mensajes: 65
Re: C18 + LCD
« Respuesta #1 en: 15 de Noviembre de 2010, 19:09:09 »
Cual es el problema especifico? Para hacerlo funcionar primero debes modificar los archivos en donde se configuran los pines en C18, están normalmente en la carpeta C:/MCC18/src/pmc_common/xLCD, una vez que los hayas modificado, debes agregar todos los archivos modificados al proyecto y compilarlos. con respecto al R/W si mal no recuerdo, no debes incluir el archivo busyXLCD.c para que no trate de leer el estado del mismo.

Saludos

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: C18 + LCD
« Respuesta #2 en: 15 de Noviembre de 2010, 19:12:14 »
por aqui puedes encontrar una libreria para lcd hecha para MikroC tendrás que adaptarla para C18.
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: C18 + LCD
« Respuesta #3 en: 15 de Noviembre de 2010, 19:31:08 »
Aquí dejé una librería para C18 idéntica a flex_lcd que se usa en CCS:

http://www.todopic.com.ar/foros/index.php?topic=17017.msg251661#msg251661


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Facundo

  • PIC10
  • *
  • Mensajes: 28
Re: C18 + LCD
« Respuesta #4 en: 16 de Noviembre de 2010, 08:45:31 »
Genial, gracias!!!!!!
Me voy a poner a investigar, el tema es que tengo todo en CCS pero estoy tratando de migrar varias cosas a C18 pero el hard ya esta construido y como comentaba no se ajusta a la libreria que tiene C18, lo que si me queda claro es que CCS es mucho mas simple de implementar que C18.

Como siempre muy agradecido cuando resuelva mas o menos el tema posteo los resultados.

 Saludos para todos.

     Fernando

Desconectado gary_servin

  • PIC12
  • **
  • Mensajes: 65
Re: C18 + LCD
« Respuesta #5 en: 16 de Noviembre de 2010, 10:02:50 »
CCS es mas "amigable" jajajaja C18 es mas "ANSI" o estándar!

Saludos!

Desconectado Facundo

  • PIC10
  • *
  • Mensajes: 28
Re: C18 + LCD
« Respuesta #6 en: 17 de Noviembre de 2010, 11:33:13 »
Hola gente linda!!!
Como ven esto.

Mi LCD esta conectado de la siguiente forma:
datos: D4,D5,D6,D7
E:       E2
RS:     E1
RW:    GND

Para  eliminar el pin RW que esta puesto a GND he cambiado lo siguiente en el archivo busyxlcd.c

unsigned char BusyXLCD(void)
{
Delay10TCYx(8);
return(0);
}

El archivo klc.h lo he cambiado de la siguiente forma:


//*****************************************
 #define UPPER */

/* DATA_PORT defines the port to which the LCD data lines are connected */
#define DATA_PORT      PORTD
#define TRIS_DATA_PORT TRISD

/* CTRL_PORT defines the port where the control lines are connected.
 * These are just samples, change to match your application.
 */
#define RW_PIN   LATBbits.LATB6         /* No me importa en este momento en el LCD es GND */
#define TRIS_RW  TRISBbits.TRISB6    /* No me importa en este momento en el lCD es GND*/
#define RS_PIN   LATEbits.LATE1         /* PORT for RS */
#define TRIS_RS  TRISEbits.TRISE1    /* TRIS for RS */
#define E_PIN    LATEbits.LATE2         /* PORT for D  */
#define TRIS_E   TRISEbits.TRISE2    /* TRIS for E  */
//***************************************************

Todo compila sin problemas (y de todos los archivos desde puego he hecho copias) pero el asunto es que no funciona el LCD sigue sin inicializar.
El programa pincipal de prueba es basicamente del maestro suky

//****************************************
#include <p18f4550.h>
#include <delays.h>
#include "xlcd.h"

#pragma config FOSC = HS,FCMEN = OFF,IESO = OFF, CPUDIV = OSC1_PLL2
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config 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
#pragma config 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
#pragma config EBTRB = OFF

void DelayFor18TCY(void){
Delay10TCYx(2);
}
void DelayPORXLCD(void){
Delay1KTCYx(15);
}
void DelayXLCD(void){
Delay1KTCYx(2);
}
void comandXLCD(unsigned char a){
BusyXLCD();
WriteCmdXLCD(a);
}
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){
OpenXLCD(FOUR_BIT & LINES_5X7);
Delay1KTCYx(15);
comandXLCD(0x06);
comandXLCD(0x0C);
putrsXLCD("LCD en Puerto D");
gotoxyXLCD(1,2);
putrsXLCD("Linea 2");

for(;;){
}   
   }

//***************************************************

Saludos para todos!!!!!
 
Facundo

Desconectado Facundo

  • PIC10
  • *
  • Mensajes: 28
Re: C18 + LCD
« Respuesta #7 en: 20 de Noviembre de 2010, 18:02:34 »
Holaaaa gente

Bueno luego de mucho dar vueltas finalmente logré que funcionara el LCD pero la migración de mis códigos de CCS a C18 termina ahí, al menos por ahora. Relamente una desilución el C18 si lo comparo con la practicidad del CCS. El código que intentaba pasar a C18 es de un control numérico de un torno. Aplicación construida toalmente en CCS y funcionando desde hace 3 años sin problemas.
Bueno imagino que aquí se aplica "Si funciona bien NO LO TOQUES "

Un saludo para todos y gracias por prestarme su tiempo.
 
  Facundo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: C18 + LCD
« Respuesta #8 en: 20 de Noviembre de 2010, 19:26:09 »
En el mensaje anterior te había mostrado una rutina que se podía usar en C18 tal como se usa en CCS.  ;-) Las compareciones, a gusto de cada uno  :mrgreen:


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Vigo

  • PIC10
  • *
  • Mensajes: 20
Re: C18 + LCD
« Respuesta #9 en: 24 de Noviembre de 2010, 19:32:56 »
En el mensaje anterior te había mostrado una rutina que se podía usar en C18 tal como se usa en CCS.  ;-) Las compareciones, a gusto de cada uno  :mrgreen:


Saludos!

Hola Suky
Una consulta, en la rutina que has mostrado se pueden manejar float??
Esta buena, te felicito buen trabajo!!!!!

Saludos
       Vigo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: C18 + LCD
« Respuesta #10 en: 24 de Noviembre de 2010, 20:32:25 »
Es una librería para manejo de LCD, no para formatear datos. En el foro han subido un par de funciones para pasar una variable float a string, seguramente salen con el buscador.  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: C18 + LCD
« Respuesta #11 en: 02 de Enero de 2011, 10:19:17 »
Hola, iba a poner nuevo tema, pero madre mia, no soy el único con problemas en LCD con C18 ( libreria XLCD.h). Bueno, estoy mirando bastantes links, y veo que hay varias modificaciones. Mi propósito es modificar lo menos posible el código original, e incluso adaptar el Hardware ( bueno, las Frecuencia de Oscilacion mas bien ) para que " funcione". Una vez lo haga, entonces si que modificaria yo a placer los pines y demás.

Bien, como no, he visto el manual de Suky, en otro hilo de otro foro : http://www.ucontrol.com.ar/forosmf/tutoriales-guias-y-cursos-en-ucontrol/tutorial-mplab-c18-desde-0/msg6854/#msg6854
Me gusta, porqué es lo mas parecido al original que he visto, quitando esas dos funciones agregadas ( y no me refiero a los delays).

Mi proposito era ir con un cristal de 20 MHz, pero para adecuarlo exactamente al ejemplo de Suky-Microchip, uso un cristal de 4MHz, y usando la misma Frec. de programa a 4MHz( correjidme si eso no es asi..)

Bueno, el reusltado, es que si, se enciende el LCD, pero se queda un guión bajo permanente. No hay mas. he creido que serian los delays, ya qie Microchip te dice que has de agregar unos delays especificos, y uno que temnga 18 veces el TCY. Es por eso que he cambiado la F de programa de momento a lo que he visto que a los demas ( Suky) les funciona.

mi main es el siguiente :
Código: C
  1. //////////////////////////////////////////////////////////////////////////////////////////
  2. //                                                                                                                                                                              //
  3. //                                                                                                                                                                              //
  4. //      Proposoito:guardar una configuracion(programacion) y visualizar en LCD 2 lineas     //
  5. //                                                                                                                                                                              //
  6. //////////////////////////////////////////////////////////////////////////////////////////
  7.  
  8.  
  9. //////////////////////////////////////////////////////////////////////////////////////////
  10. //                                                                                      //
  11. // Usaré, de momento, un cristal de 4MHz, para usar en memoria interna de programa, tam-//
  12. // bién de 4MHz, con propósito de usar el mismo tiempo de Delays que veo en manuales.   //
  13. //                                                                                                                                                                              //
  14. //////////////////////////////////////////////////////////////////////////////////////////
  15.  
  16.  
  17.  
  18. #include <p18f4550.h>
  19. #include <p18cxxx.h>
  20. #include <stdio.h>
  21. #include <xlcd.h>
  22. #include <delays.h>
  23.  
  24.  
  25. #pragma config FOSC = HS
  26. #pragma config CPUDIV = OSC1_PLL2
  27. #pragma config VREGEN = OFF //Disabled  USB power
  28. #pragma config WDT = OFF// HW Disabled - SW Controlled  
  29.  
  30.  
  31.  
  32.  
  33. /////////// PROTOTIPO FUNCIONES PARA DELAYS y XLCD /////////////
  34. //
  35. void DelayFor18TCY(void){  // TCY=4/Frec.Trabajo
  36.         Delay10TCYx(2);        // Mi TCY para F_trabajo=4MHz es de 1mS. El retardo que piden será pues de 18*TCY=18mS
  37. }                          // 10*x*(4/4MHz)=18uS; aislamos x, y x=1,8, por eso se pone 2. Seria algo mas de 18 TCY.
  38.  
  39.  
  40. void DelayPORXLCD(void){
  41.         //Delay1KTCYx(15);       // 1000*15*(4/4MHz)= 0,015 s
  42.       Delay1KTCYx(18);
  43. }
  44. void DelayXLCD(void){
  45.         Delay1KTCYx(2);        // 1000*2*(4/4MHz)= 0,002 s
  46. }
  47.  
  48. // Envia comando al LCD
  49. void comandXLCD(unsigned char a){
  50.         BusyXLCD();            
  51.         WriteCmdXLCD(a);
  52. }
  53. // Ubica cursor en (x = Posicion en linea, y = nº de linea)
  54. void gotoxyXLCD(unsigned char x, unsigned char y){
  55.         unsigned char direccion;
  56.  
  57.         if(y != 1)
  58.                 direccion = 0x40;
  59.         else
  60.                 direccion=0;
  61.        
  62.         direccion += x-1;
  63.         comandXLCD(0x80 | direccion);
  64. }
  65.  
  66.  
  67. ///////////////////////////////////////////////////////////////////
  68. void main(){
  69.  
  70. char datoLCD={"Esto es 1 string"};
  71. unsigned char ocupado;
  72.  
  73. TRISA = 0x00;  //Define  puerto A como pines de salida.
  74. OpenXLCD(FOUR_BIT & LINES_5X7); // Iniciamos LCD.-
  75. comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
  76. comandXLCD(0x0C);                       // Encendemos LCD.-
  77. putrsXLCD("Hola");
  78. gotoxyXLCD(1,2);                        //Pasamos al oriden del Linea 2.-
  79. putrsXLCD("Mundo!");
  80. while(1) {
  81.  
  82. }
  83. }

pongo los archivos que uso para el proyecto

y el esquema electrico que uso


cabe decir que no he modificado ( de momento, porque lo querré hacer una vez funcione con el original) la libreria XLCD.h, uso los pines tal cual pone ahí.
Tengía la duda de si UPPER, se refiere a los pines del puerto B ( uso los bajos, por eso UPPER sigue comentado), pero está solventada al ver que Suky dejaba descomentado el #define UPPER .
Otra duda que tengo, es acerca de esas funciones extra hechas por Suky, para el manejo del LCD. He leido el manual, desde el Proteus ( la opcion que te deja descargar manual - si está- del componente que estés viendo , en pripiedades) y veo una serie de órdenes, que se corresponden a su codificacion en hexadecimal:


y he ido comparando, por ejemplo, con esto :
Código: C
  1. comandXLCD(0x06); // Nos aseguramos incremento de direccion, display fijo
  2. comandXLCD(0x0C);                       // Encendemos LCD.-
y bueno, tampoco entiendo muy bien por que 0x06 es la orden de incremento de direccion ( estoy viendo pues el manual correcto?)
Bueno, en resumidas cuentas, qué parte no hago bien ??

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: C18 + LCD
« Respuesta #12 en: 04 de Enero de 2011, 16:48:18 »
me hecha alguien una mano...? En que medida he de cambiar delays? Si es eso....( no creo, pq uso los mismos componentes en Proteus..). Si todos hemos de hacer algun cambio que otro..es que hay gato escondido, no ?

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: C18 + LCD
« Respuesta #13 en: 06 de Enero de 2011, 07:36:55 »
bueno, para ver que pasaba, me he bajado el datasheet del controlador de Hitachi, y me he fijado en una figura, donde pone un ejmeplo de data bit transfer. he puesto el osciloscopio, para ver si  la información que hay en ese ejemplo se corresponde con la sdel osciloscopio. Comento los pasos que he hecho por si alguien se encuentra con el mismo problema que yo, que las cosas, aunque lo parezcan, a veces no son tan obvias...
 en el datasheet aparece esta informacion:



y la he ido comparando con mi circuito :



He ido comparando la secuencia de bits con la del datasheet, y a atrves de aqui es como me he dado cuenta del error. enable no aparecia como señal, bueno, estaba en 0 siempre. Eso ya se ve el el Proteus sin usar osciloscopio ( nunca se ve el pin rojo), pero con el osciloscopio te das cuenta de cuando si deberia ser. Entonces lo veo..uhm..por qué nunca se activa?? debe ser demasiado tiempo de espera?? A lo que he ido a los archivos correspondientes al XLCD.h En efecto... esta la cabecera en el programa, pero si leemos ...en ningun lado dice donde estan los archivos "x.c", esos también se han de agregar al proyecto! estan en "C:\Program Files\Microchip\MCC18\src\pmc_common\XLCD"
Y ahora ¡ aparece "mi ola mundo!" Ojo, he escrito ola y no hola... porque aún no está bien, pero entre eso y nada...¡ hay un abismo! Ahora al aparecer el mensaje veo esto en el osciloscopio:




Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: C18 + LCD
« Respuesta #14 en: 06 de Enero de 2011, 07:43:20 »
ok, solucionado del todo. Como no, faltaba "gotoxyXLCD(1,1);" antes de escribir la primera linea.