Autor Tema: Problema Libreria Lcd  (Leído 440 veces)

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

Desconectado BroncoITC

  • PIC10
  • *
  • Mensajes: 6
Problema Libreria Lcd
« en: 26 de Mayo de 2020, 02:37:17 »
Buenas tardes a todos, estoy intentando adaptar una libreria para un lcd LM016L de 16x2, para usarla desde el bus i2c, primero estoy buscando que me funcione usando el PORTB pero no me termina de desplegar nada en la pantalla, ya estuve revisando bastante el codigo pero no logro encontrar el problema, estoy usando un micro atmel atmega328p. Agradeceria que alguien me pudiera echar un cable, saludos

Cabecera
Código: C
  1. #define LCD_PORT              PORTB
  2. #define LCD_DDDR              DDRB
  3. #define LCD_BACKLIGHT         0x08
  4. #define LCD_NOBACKLIGHT       0x00
  5. #define LCD_FIRST_ROW         0x80
  6. #define LCD_SECOND_ROW        0xC0
  7. #define LCD_THIRD_ROW         0x94
  8. #define LCD_FOURTH_ROW        0xD4
  9. #define LCD_CLEAR             0x01
  10. #define LCD_RETURN_HOME       0x02
  11. #define LCD_ENTRY_MODE_SET    0x04
  12. #define LCD_CURSOR_OFF        0x0C
  13. #define LCD_UNDERLINE_ON      0x0E
  14. #define LCD_BLINK_CURSOR_ON   0x0F
  15. #define LCD_MOVE_CURSOR_LEFT  0x10
  16. #define LCD_MOVE_CURSOR_RIGHT 0x14
  17. #define LCD_TURN_ON           0x0C
  18. #define LCD_TURN_OFF          0x08
  19. #define LCD_SHIFT_LEFT        0x18
  20. #define LCD_SHIFT_RIGHT       0x1E
  21. #define LCD_TYPE              2 // 0 -> 5x7 | 1 -> 5x10 | 2 -> 2 lines
  22.  
  23. //prototipos
  24.  
  25. //static void lcd_write_4bit(unsigned char Nibble);
  26. //static void lcd_cmd(unsigned char cmd);
  27. void lcd_write_char(unsigned char data);
  28. void lcd_write_string(char* str);
  29. void lcd_set_cursor(unsigned char row, unsigned char column);
  30. void lcd_clear();
  31. void lcd_init();
  32.  

Archivo .c
Código: C
  1. #include "lcd_std.h"
  2.  
  3. unsigned char RS;
  4.  
  5. static void lcd_write_4bit(unsigned char Nibble)
  6. {
  7.         Nibble |= RS;
  8.         LCD_PORT = (Nibble | 0x04);          //bit EN en alto  00000100
  9.         _delay_us(50);
  10.         LCD_PORT = (Nibble | 0xFB);          //bit EN en bajo
  11.         _delay_us(50);
  12. }
  13.  
  14. static void lcd_cmd(unsigned char cmd)
  15. {
  16.         RS = 0;            //se enviara comando
  17.         lcd_write_4bit(cmd & 0xF0);                     //envia Nibble alto
  18.         lcd_write_4bit((cmd << 4) & 0xF0);              //envia Nibble bajo
  19. }
  20.  
  21. void lcd_write_char(unsigned char data)
  22. {
  23.         RS = 1;            //se enviara data
  24.         lcd_write_4bit(data & 0xF0);                     //envia Nibble alto
  25.         lcd_write_4bit((data << 4) & 0xF0);              //envia Nibble bajo
  26. }
  27.  
  28. void lcd_write_string(char* str)
  29. {
  30.         unsigned char i;
  31.         for (i = 0; str[i] != '\0'; i++)
  32.         {
  33.                 lcd_write_char(str[i]);
  34.         }
  35. }
  36.  
  37. void lcd_gotoxy(unsigned char row, unsigned char column)
  38. {
  39.         if (row == 1)
  40.         {
  41.                 lcd_cmd(0x80 + column - 1);
  42.         }
  43.         else
  44.         {
  45.                 lcd_cmd(0xC0 + column - 1);
  46.         }
  47. }
  48.  
  49. void lcd_clear()
  50. {
  51.         lcd_cmd(0x01);
  52.         _delay_us(40);
  53. }
  54.  
  55. void lcd_init()
  56. {
  57.         LCD_DDDR = 0xFF;           //PORTB como salida
  58.        
  59.    LCD_PORT = 0x00;
  60.   _delay_ms(30);
  61.   lcd_cmd(0x03);
  62.   _delay_ms(5);
  63.   lcd_cmd(0x03);
  64.   _delay_ms(5);
  65.   lcd_cmd(0x03);
  66.   _delay_ms(5);
  67.   lcd_cmd(LCD_RETURN_HOME);
  68.   _delay_ms(5);
  69.   lcd_cmd(0x20 | (LCD_TYPE << 2));
  70.   _delay_ms(50);
  71.   lcd_cmd(LCD_TURN_ON);
  72.   _delay_ms(50);
  73.   lcd_cmd(LCD_CLEAR);
  74.   _delay_ms(50);
  75.   lcd_cmd(LCD_ENTRY_MODE_SET | LCD_RETURN_HOME);
  76.   _delay_ms(50);
  77. }
  78.  

main.c
Código: C
  1. #define F_CPU 1000000UL
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #include "lcd_std.h"
  5.  
  6. int main(void)
  7. {
  8.     /* Replace with your application code */
  9.         lcd_init();
  10.         _delay_ms(1000);
  11.         lcd_clear();
  12.         lcd_gotoxy(1,1);
  13.         lcd_write_string("hola");
  14.        
  15.     while (1)
  16.     {
  17.                
  18.     }
  19. }
  20.  
« Última modificación: 26 de Mayo de 2020, 16:31:25 por BroncoITC »

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3533
    • Impresiones en 3D
Re:Problema Libreria Lcd
« Respuesta #1 en: 26 de Mayo de 2020, 10:05:00 »
¿Qué lenguaje C estás usando?
Esta pregunta me delata, pero los lenguajes de alto nivel son parecidos a la hora de trabajar.

En otros lenguajes no se hace tantas cosas para trabajar con un LCD y estoy sospechando que no sabes usar las librerías.

Para adelantar, normalmente, se parte de un código. Se inicializan las cosas, luego se va al main o al bucle infinito y se comienza enviar datos; la espera de datos, procesar datos, ect.

A la hora de inicializar el LCD, se incluye la librería, se configura la librería con una función dedicada a ello y luego se le envía los datos.
Por ejemplo. Para configurar la librería, dicha librería tiene una función de configuración; donde se le indica en qué puerto está conectado el LCD, si los datos se envían por los 8 bit o en 4 bit, y algunas cosillas más. Luego, se inicializa el LCD para luego enviarle los datos.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado Eduardo2

  • PIC18
  • ****
  • Mensajes: 355
Re:Problema Libreria Lcd
« Respuesta #2 en: 26 de Mayo de 2020, 13:26:30 »
Código: [Seleccionar]
void lcd_write_char(unsigned char data)
{
        RS = 1;            //se enviara data
        lcd_write_4bit(cmd & 0xF0);                     //envia Nibble alto
        lcd_write_4bit((cmd << 4) & 0xF0);              //envia Nibble bajo
}

Raro que te lo haya compilado pues cmd no está definido.

Debe ser
Código: [Seleccionar]
void lcd_write_char(unsigned char data)
{
        RS = 1;            //se enviara data
        lcd_write_4bit(data & 0xF0);                     //envia Nibble alto
        lcd_write_4bit((data << 4) & 0xF0);              //envia Nibble bajo
}

Desconectado BroncoITC

  • PIC10
  • *
  • Mensajes: 6
Re:Problema Libreria Lcd
« Respuesta #3 en: 26 de Mayo de 2020, 16:39:40 »
¿Qué lenguaje C estás usando?
Esta pregunta me delata, pero los lenguajes de alto nivel son parecidos a la hora de trabajar.

En otros lenguajes no se hace tantas cosas para trabajar con un LCD y estoy sospechando que no sabes usar las librerías.

Para adelantar, normalmente, se parte de un código. Se inicializan las cosas, luego se va al main o al bucle infinito y se comienza enviar datos; la espera de datos, procesar datos, ect.

A la hora de inicializar el LCD, se incluye la librería, se configura la librería con una función dedicada a ello y luego se le envía los datos.
Por ejemplo. Para configurar la librería, dicha librería tiene una función de configuración; donde se le indica en qué puerto está conectado el LCD, si los datos se envían por los 8 bit o en 4 bit, y algunas cosillas más. Luego, se inicializa el LCD para luego enviarle los datos.

Hola, estoy usando el ide atmel studio 7 el compilador creo que es el avr gcc, desconozco el estándar de C que utilice si el ANSI o el C99 u otro.
Y tienes razón, apenas se usar las librerías.

Desconectado BroncoITC

  • PIC10
  • *
  • Mensajes: 6
Re:Problema Libreria Lcd
« Respuesta #4 en: 26 de Mayo de 2020, 16:43:01 »
Código: [Seleccionar]
void lcd_write_char(unsigned char data)
{
        RS = 1;            //se enviara data
        lcd_write_4bit(cmd & 0xF0);                     //envia Nibble alto
        lcd_write_4bit((cmd << 4) & 0xF0);              //envia Nibble bajo
}

Raro que te lo haya compilado pues cmd no está definido.

Debe ser
Código: [Seleccionar]
void lcd_write_char(unsigned char data)
{
        RS = 1;            //se enviara data
        lcd_write_4bit(data & 0xF0);                     //envia Nibble alto
        lcd_write_4bit((data << 4) & 0xF0);              //envia Nibble bajo
}

Gracias Eduardo2, pero eso fue un error al copiar aqui una version del programa que no habia depurado bien, en realidad ya me habia percatado de eso antes de compilarlo.
Sospecho que el problema esta en la funcion lcd_write_4bit, donde hace esto : LCD_PORT = (Nibble | 0x04);
Pero solo es una corazonada... :(
« Última modificación: 26 de Mayo de 2020, 16:45:37 por BroncoITC »

Desconectado AleSergi

  • PIC16
  • ***
  • Mensajes: 188
Re:Problema Libreria Lcd
« Respuesta #5 en: 27 de Mayo de 2020, 01:00:09 »
hola, mira si andas en eso de entender finamente el funcionamiento de los lcd hitachi 44780 genéricos, te recomiendo que con la hoja de datos en mano veas los videos del U2, donde muestran como los manejan manualmente a fuerza de mini interruptores dip.
Luego te bajas y estudias las librerias de Donald Weiman, donde hace funcionar esos lcd, muy didacticamente.

http://web.alfredstate.edu/faculty/weimandn/index.html

Ahira de todo ésto y sabiendo como funcionan los integrados i2c pcf8574, podrás entender  como hacer tu propia librería versión i2c, o mejor usar una ya lista, como es el caso del greco Vassilis Serasidis, donde muestra hasta con video como controla varias cosas i2c...

https://www.serasidis.gr/circuits/i2c_sensors/I2C_sensors.htm

Hice todo lo que digo y llegue a buen puerto, y logre que me funcionen esas librerias i2c, que en realidad las escribio un tal Davide Gironi, y con el WinAvr, con el Studio 7, te ira mejor.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3533
    • Impresiones en 3D
Re:Problema Libreria Lcd
« Respuesta #6 en: 27 de Mayo de 2020, 09:08:42 »
tienes razón, apenas se usar las librerías.

No te preocupes, te vamos a enseñar.

¿Podrías subir la librería lcd_std.h?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado BroncoITC

  • PIC10
  • *
  • Mensajes: 6
Re:Problema Libreria Lcd
« Respuesta #7 en: 29 de Mayo de 2020, 01:28:54 »
Hola LeonPic, "lcd_std.h" es el archivo de cabecera, esto :
Código: C
  1. #define LCD_PORT              PORTB
  2. #define LCD_DDDR              DDRB
  3. #define LCD_BACKLIGHT         0x08
  4. #define LCD_NOBACKLIGHT       0x00
  5. #define LCD_FIRST_ROW         0x80
  6. #define LCD_SECOND_ROW        0xC0
  7. #define LCD_THIRD_ROW         0x94
  8. #define LCD_FOURTH_ROW        0xD4
  9. #define LCD_CLEAR             0x01
  10. #define LCD_RETURN_HOME       0x02
  11. #define LCD_ENTRY_MODE_SET    0x04
  12. #define LCD_CURSOR_OFF        0x0C
  13. #define LCD_UNDERLINE_ON      0x0E
  14. #define LCD_BLINK_CURSOR_ON   0x0F
  15. #define LCD_MOVE_CURSOR_LEFT  0x10
  16. #define LCD_MOVE_CURSOR_RIGHT 0x14
  17. #define LCD_TURN_ON           0x0C
  18. #define LCD_TURN_OFF          0x08
  19. #define LCD_SHIFT_LEFT        0x18
  20. #define LCD_SHIFT_RIGHT       0x1E
  21. #define LCD_TYPE              2 // 0 -> 5x7 | 1 -> 5x10 | 2 -> 2 lines
  22.  
  23. //prototipos
  24.  
  25. //static void lcd_write_4bit(unsigned char Nibble);
  26. //static void lcd_cmd(unsigned char cmd);
  27. void lcd_write_char(unsigned char data);
  28. void lcd_write_string(char* str);
  29. void lcd_set_cursor(unsigned char row, unsigned char column);
  30. void lcd_clear();
  31. void lcd_init();
  32.  

Desconectado BroncoITC

  • PIC10
  • *
  • Mensajes: 6
Re:Problema Libreria Lcd
« Respuesta #8 en: 29 de Mayo de 2020, 01:37:40 »
hola, mira si andas en eso de entender finamente el funcionamiento de los lcd hitachi 44780 genéricos, te recomiendo que con la hoja de datos en mano veas los videos del U2, donde muestran como los manejan manualmente a fuerza de mini interruptores dip.
Luego te bajas y estudias las librerias de Donald Weiman, donde hace funcionar esos lcd, muy didacticamente.

http://web.alfredstate.edu/faculty/weimandn/index.html

Ahira de todo ésto y sabiendo como funcionan los integrados i2c pcf8574, podrás entender  como hacer tu propia librería versión i2c, o mejor usar una ya lista, como es el caso del greco Vassilis Serasidis, donde muestra hasta con video como controla varias cosas i2c...

https://www.serasidis.gr/circuits/i2c_sensors/I2C_sensors.htm

Hice todo lo que digo y llegue a buen puerto, y logre que me funcionen esas librerias i2c, que en realidad las escribio un tal Davide Gironi, y con el WinAvr, con el Studio 7, te ira mejor.

Muchas gracias, me ha sido de gran utilidad, en este momento me estoy estudiando la libreria lcd_4bit de Donald Weiman, haber que saco de ella


 

anything