Autor Tema: Problema con librería XLCD; No funciona del todo bien  (Leído 1723 veces)

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

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Problema con librería XLCD; No funciona del todo bien
« en: 05 de Noviembre de 2014, 20:07:23 »
Hola a todos, pues tengo un problemilla con la librería que maneja el LCD.

Estoy utilizando el típico LCD 2x16 con un PIC18F2455 y no funciona del todo correcto.

He montado un proyecto y parece que funciona pero mi sorpresa es que después de reiniciar varias veces llega un momento que en el display se ven caracteres raros pero el programa se sigue ejecutando.

he probado a modificar los tiempos en el archivo XLCD.C, se supone que con la formula que viene calculas los retardos con respecto al cristal que utilizas.

yo tengo puesto un cristal de 4MHz pero tengo forzado el pic a 48MHz configurando el prescaler y postcaler.

esta es la formula que empleo:
Código: [Seleccionar]
void DelayFor18TCY( void )
{
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
}
Delay1KTCYx(60); // Delay of 15ms
                   // Cycles = (TimeDelay * Fosc) / 4
                   // Cycles = (15ms * 16MHz) / 4
                   // Cycles = 60,000
Delay1KTCYx(20); // Delay of 5ms
                   // Cycles = (TimeDelay * Fosc) / 4
                   // Cycles = (5ms * 16MHz) / 4
                   // Cycles = 20,000

y este es el cálculo que he hecho para el cristal de 48MHz

Código: [Seleccionar]
void DelayFor18TCY(void){ //Donde se ajusta la velocidad de muestreo
Delay10TCYx(120);

}

void DelayPORXLCD(void){ //Delay de 15ms
Delay1KTCYx(180);
}

void DelayXLCD(void){ //Delay de 5ms
Delay1KTCYx(60);
}

pero no sé si ese problema es debido a la velocidad o a otra cosa, a ver si alguien me orienta sobre el tema.

Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Problema con librería XLCD; No funciona del todo bien
« Respuesta #1 en: 06 de Noviembre de 2014, 08:38:23 »
Hola a todos, pues como siempre y reconozco que siempre tropiezo en la misma piedra una y otra vez, todas las respuestas o la mayoría están en la documentación del fabricante.

en la documentación hay unas tablas donde se muestran las secuencias para la utilización del módulo LCD, no vale con hacerle un power reset solo al PIC hay que también hacérselo al display.

de todas maneras revisando el driver del fabricante he visto algunas cosas raras que he modificado y veo que funciona bien, por lo menos por lógica debería de hacerlo, ahora quiero vuestra opinión.

Resulta que las librerías suministradas por Microchip se definen las configuraciones para el manejo del módulo y por lo que veo no concuerda con lo que especifica el fabricante del LCD.

me explico.

en el archivo xlcd.h las definiciones que trae el archivo por defecto son estas.
Código: [Seleccionar]
/* Display ON/OFF Control defines */
#define DON         0b00001111  /* Display on      */
#define DOFF        0b00001011  /* Display off     */
#define CURSOR_ON   0b00001111  /* Cursor on       */
#define CURSOR_OFF  0b00001101  /* Cursor off      */
#define BLINK_ON    0b00001111  /* Cursor Blink    */
#define BLINK_OFF   0b00001110  /* Cursor No Blink */

/* Cursor or Display Shift defines */
#define SHIFT_CUR_LEFT    0b00000100  /* Cursor shifts to the left   */
#define SHIFT_CUR_RIGHT   0b00000101  /* Cursor shifts to the right  */
#define SHIFT_DISP_LEFT   0b00000110  /* Display shifts to the left  */
#define SHIFT_DISP_RIGHT  0b00000111  /* Display shifts to the right */

/* Function Set defines */
#define FOUR_BIT   0b00101100  /* 4-bit Interface               */
#define EIGHT_BIT  0b00111100  /* 8-bit Interface               */
#define LINE_5X7   0b00110000  /* 5x7 characters, single line   */
#define LINE_5X10  0b00110100  /* 5x10 characters               */
#define LINES_5X7  0b00111000  /* 5x7 characters, multiple line */

Y como se puede ver los valores no son los mismos que las especificaciones, con lo cual yo lo he dejado así:
Código: [Seleccionar]
/* Display ON/OFF Control defines */
#define DON         0b0000001100  /* Display on      */
#define DOFF        0b0000001000  /* Display off     */
#define CURSOR_ON   0b0000001010  /* Cursor on       */
#define CURSOR_OFF  0b0000001000  /* Cursor off      */
#define BLINK_ON    0b0000001001  /* Cursor Blink    */
#define BLINK_OFF   0b0000001000  /* Cursor No Blink */

/*Entry mode set */
#define INCREMENT 0b0000000110 /*Increment */
#define DECREMENT 0b0000000100 /*Decrement */
#define DISPLAY_SIFT_ON 0b0000000101 /* The display sift */
#define DISPLAY_SIFT_OFF 0b0000000100 /* The display does no sift */

/* Cursor or Display Shift defines */
#define SHIFT_CUR_LEFT    0b0000010000  /* Cursor shifts to the left   */
#define SHIFT_CUR_RIGHT   0b0000010100  /* Cursor shifts to the right  */
#define SHIFT_DISP_LEFT   0b0000011000  /* Display shifts to the left  */
#define SHIFT_DISP_RIGHT  0b0000011100  /* Display shifts to the right */


/* Function Set defines */
#define EIGHT_BIT   0b0000110000  /* 8-bit Interface   */
#define FOUR_BIT   0b0000100000  /* 4-bit Interface   */
#define SINGLE_LINE 0b0000100000 /* One-line display */
#define TWO_LINE 0b0000101000 /* Two-line display */
#define CARAC_5X10  0b0000100100  /* 5x10 characters   */
#define CARAC_5X7   0b0000100000  /* 5x7 characters */

/* Funciones manejo display*/
#define CLEAR 0b0000000001 /*Limpiamos el LCD*/

al haber modificado yo esos parámetros ya no nos sirve la manera de llamarlos en la funciones OpenXLCD(), comandXLCD

hay una librería por ahí que la manera de emplear esos parámetros son así.
Código: [Seleccionar]
OpenXLCD(FOUR_BIT & LINES_5X7);        //Configuramos el lcd como de 4 hilos
comandXLCD(DON & CURSOR_OFF & BLINK_OFF ); //Activar el display, desactivar cursor y parpadeo del cursor



Y esta es la modificación que he hecho yo
Código: [Seleccionar]
OpenXLCD(FOUR_BIT | TWO_LINE | CARAC_5X7); //Configuramos el lcd como de 4 hilos, dos líneas y carácter 5x7
while( BusyXLCD() );                                   //wait untill LCD controller is busy
comandXLCD(DON | CURSOR_OFF | BLINK_OFF );  //Display ON, Cursor Off, Blink Off
while( BusyXLCD() );                                  //wait untill LCD controller is busy
comandXLCD(INCREMENT);
while( BusyXLCD() );                                  //wait untill LCD controller is busy

a su vez he tenido que modificar el archivo openxlcd.c solo la sección que muestro.
Código: [Seleccionar]
// Turn the display on then off
        while(BusyXLCD());              // Wait if LCD busy
        WriteCmdXLCD(DOFF & CURSOR_OFF & BLINK_OFF);        // Display OFF/Blink OFF
        while(BusyXLCD());              // Wait if LCD busy
        WriteCmdXLCD(DON & CURSOR_ON & BLINK_ON);           // Display ON/Blink ON

        // Clear display
        while(BusyXLCD());              // Wait if LCD busy
        WriteCmdXLCD(0x01);             // Clear display

        // Set entry mode inc, no shift
        while(BusyXLCD());              // Wait if LCD busy
        WriteCmdXLCD(SHIFT_CUR_LEFT);   // Entry Mode


        // Set DD Ram address to 0
        while(BusyXLCD());              // Wait if LCD busy
        SetDDRamAddr(0x80);                // Set Display data ram address to 0

        return;

a esta forma
Código: [Seleccionar]
// Turn the display on then off
        while(BusyXLCD());              // Wait if LCD busy
        WriteCmdXLCD(DOFF | CURSOR_OFF | BLINK_OFF);        // Display OFF/Blink OFF
        while(BusyXLCD());              // Wait if LCD busy
        WriteCmdXLCD(DON | CURSOR_ON | BLINK_ON);           // Display ON/Blink ON

        // Clear display
        while(BusyXLCD());              // Wait if LCD busy
        WriteCmdXLCD(CLEAR);             // Clear display

        // Set entry mode inc, no shift
        while(BusyXLCD());              // Wait if LCD busy
        WriteCmdXLCD(SHIFT_CUR_LEFT);   // Entry Mode


        // Set DD Ram address to 0
        while(BusyXLCD());              // Wait if LCD busy
        SetDDRamAddr(0x80);                // Set Display data ram address to 0

        return;

Creo que lo que he hecho yo es más lógico que lo que viene por defecto, pero no obstante al igual me equivoco y el driver original tiene una razón que yo no veo, a ver si algún experto da su opinión.

gracias a todos
« Última modificación: 06 de Noviembre de 2014, 08:41:05 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con librería XLCD; No funciona del todo bien
« Respuesta #2 en: 06 de Noviembre de 2014, 09:01:02 »
Hola Thulsa Doom yo hace un mes que lo intento con un 18F2550 y todavia no he conseguido que me funcione y parace que nadie sabe como hacerlo.
http://www.todopic.com.ar/foros/index.php?topic=40649.280

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Problema con librería XLCD; No funciona del todo bien
« Respuesta #3 en: 06 de Noviembre de 2014, 11:04:23 »
Pues te voy a dar la librería en la que he estado trabajando, estudiala y si tienes alguna duda no dudes en preguntar, si las tienes espero saber responder.

el proyecto está probado en un hardware físico, utilizo un PIC18F2455, con cristal 4MHz pero tiene los fuses configurados para 48MHz, las entradas del display de D4 a D7 está conectado en el nible bajo del puerto A y las señales E, R/W y RS están en el puerto C.

adjunto un esquema en proteus donde puedes ver el funcionamiento

XLCD_C18.zip

espero te sea útil
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problema con librería XLCD; No funciona del todo bien
« Respuesta #4 en: 06 de Noviembre de 2014, 12:05:32 »
Gracias Thulsa Doom por el aporte, si vuelvo a coger la electronica (como hobby) prometo mirarlo ya que de momento lo mande todo a la mierda.

Saludos!

PD: Tardare un poco porque lo tire todo a la basura.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Problema con librería XLCD; No funciona del todo bien
« Respuesta #5 en: 06 de Noviembre de 2014, 14:22:25 »
Jajajaja, pues nada, espero que te animes, en la electrónica hay que tener paciencia, como todo en la vida, la paciencia es la clave
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...