Autor Tema: LCD 128x64 / ST7565R  (Leído 5261 veces)

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

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #30 en: 13 de Diciembre de 2021, 21:54:22 »
El dato que está representado en el diagrama es el 0b10100011. Es el primero en la rutina de inicialización. No coincide porque cuando tomé la foto lo cambié. Lo importante es que se represente envíe correctamente en este caso.

Estoy pensando en utilizar las instrucciones de SPI de CCS C por software para hacer la comunicación  y evitar estos tipos de errores. Que opinan?

Gracias.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #31 en: 13 de Diciembre de 2021, 22:13:08 »
El dato que está representado en el diagrama es el 0b10100011. Es el primero en la rutina de inicialización. No coincide porque cuando tomé la foto lo cambié. Lo importante es que se represente envíe correctamente en este caso.

Estoy pensando en utilizar las instrucciones de SPI de CCS C por software para hacer la comunicación  y evitar estos tipos de errores. Que opinan?

Gracias.

Puede ser, pero para mi estás haciendo mal la configuración.

Intenta esto a ver que sucede:

Código: C
  1. void Confi_LCDG(void)
  2. {
  3.      CS  = 1;
  4.     RST = 1;
  5.     A0  = 1;
  6.     DelayMs(1);
  7.     RST = 0;
  8.     DelayMs(1);
  9.     RST = 1;
  10.     DelayMs(10);
  11.     SdCmd(0xaf);            // display on
  12.     SdCmd(0x40);            // display start line=0
  13.     SdCmd(0xa1);            // ADC=1
  14.     SdCmd(0xa6);            // normal display
  15.     SdCmd(0xa4);            // Display all point = off
  16.     SdCmd(0xa2);            // LCD bias = 1/9
  17.     SdCmd(0xc0);            // Common output mode select= reverse
  18.     SdCmd(0x2f);            // Power control = all on
  19.     SdCmd(0x25);            // RA/RB setting
  20.     SdCmd(0xf8);SdCmd(0x00);// Booster Ratio Set= 2x,3x,4x (2byte command)
  21.     SdCmd(0x81);            // E-Vol setting
  22.     SdCmd(0x21);   // (2byte command)
  23.  
  24. }


Código: C
  1. unsigned char LCDRAM[8][128];
  2.  
  3. void LimpiarLCD(unsigned char DesdeDonde)
  4. {
  5.     unsigned char i;
  6.     unsigned char j;
  7.     //Confi_LCDG();
  8.     for(i = DesdeDonde; i < 8;i++)
  9.     {
  10.         //LCD_Instrucciones(i); // LCD lista para instrucciones
  11.         SdCmd(0xb0 | i);    // select page 0~7
  12.         SdCmd(0x10);        // start form column 0
  13.         SdCmd(0x00);        // (2byte command)
  14.  
  15.         for(j = 0; j < 128; ++j)
  16.         {
  17.             SdData(0);//LCD_ESCRIBIR(0,SicoyLogo[s++]); // Los pixeles encendidos a OFF
  18.             LCDRAM[i][j] = 0;
  19.  
  20.         }
  21.     }
  22.  
  23. }

Código: C
  1. const unsigned char DOSENE [8] = { 1,2,4,8,16,32,64,128};
  2.  
  3. void PUNTO_LCD(unsigned char x, unsigned char y,unsigned char color)
  4. {
  5.     unsigned char data;
  6.     //unsigned char xl;
  7.     //unsigned char xh;
  8.     unsigned char auxi;          //  Yo creo este auxiliar ya que no existe la función bit_set de PICC
  9.  
  10.     /*xl = x & 0x0F;
  11.     xh = x & 0xF0;
  12.     xh = (xh >> 4);*/
  13.     //xh &= 0x0F;
  14.  
  15.     //auxi =DOSENE[ y%8];
  16.     //auxi =
  17.     //EncenderLED(y58)
  18.  
  19.     data = LCDRAM[y/8][x]; // primero lee el dato de la RAM
  20.     auxi = DOSENE[ y%8];  //equivale a 2 elevado a la y
  21.  
  22.     /*LCDRAM[i][j] = 0;
  23.  
  24.     SdCmd(0xb0 | y/8); // coordenada y
  25.  
  26.     SdCmd(0x10 | xh);// coordenada x
  27.     SdCmd(xl);*/
  28.  
  29.     if (color)
  30.         data = data  |  auxi;   // enciendo los pixeles
  31.     else
  32.         data = data & (~auxi);  // data = data NAND auxi
  33.  
  34.     LCDRAM[y/8][x] = data;

Código: C
  1. void Transferir_LCDRAM_LCD(void)
  2. {
  3.     unsigned char i;
  4.     unsigned char j;
  5.     //INTDisableInterrupts();
  6.     //Banderas.TransfiriendoInfoRamAGLCD = 1;
  7.     ConfiguracionPorDefectoGLCD();// Para que arregle cualquier cosa en la GLCD
  8.     for(i = 0; i < 8; ++i)
  9.     {
  10.         //LCD_Instrucciones(i); // LCD lista para instrucciones
  11.         SdCmd(0xb0 | i);    // select page 0~7
  12.         SdCmd(0x10);        // start form column 0
  13.         SdCmd(0x00);        // (2byte command)
  14.         for(j = 0; j < 128; ++j) SdData(LCDRAM[i][j]);//LCD_ESCRIBIR(0,solintecelogo[s++]); // Los pixeles encendidos a OFF
  15.     }
  16.     DelayUs(150);
  17.     //Banderas.TransfiriendoInfoRamAGLCD = 0;
  18.     //INTEnableInterrupts();
  19. }

Código: C
  1. void main
  2. {
  3.     Confi_LCDG();
  4.     LimpiarLCD(0x00);
  5.     PUNTO_LCD(10,10,0x01); // pongo un punto en x = 10 et y = 10.
  6.     Transferir_LCDRAM_LCD(); // pasa el areglo LCDRAM a la LCD.
  7.     while(true);
  8. }
« Última modificación: 13 de Diciembre de 2021, 22:16:27 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #32 en: 16 de Diciembre de 2021, 23:41:26 »
Hola DominusDRR. Gracias por la ayuda.
Probé el código que me pasaste y el display no se inicializa.  En el código de la función de inicialización que subiste, lo escribiste teniendo en cuenta los pasos sugeridos por el datasheet?   

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #33 en: 17 de Diciembre de 2021, 09:41:49 »
Hola DominusDRR. Gracias por la ayuda.
Probé el código que me pasaste y el display no se inicializa.  En el código de la función de inicialización que subiste, lo escribiste teniendo en cuenta los pasos sugeridos por el datasheet?

Como mencioné antes, trabajé en una empresa donde fabricaban un producto con una LCD de bus paralelo, luego se migró a una LCD serial SPI (LM6063AFW). El fabricante nos proporcionó un pseudocódigo de ejemplo similar al tuyo donde emulaban un SPI en los pines de un microcontrolador cualquiera y graficaba el logo de su empresa.

Luego en base a los códigos ejemplos de CCS yo lo adapte para C32 (Ya que trabajaba con el PIC32MX)

Ya es casi diez años de eso y no encontraba el código, pensé que lo había perdido, pero al fin encontré una parte y lo compartí.

No se si es el mismos driver, pero lo que si te puedo decir es que al inicio tuve problemas, no funcionaba nada y era debido a un incorrecto uso del bus SPI. En mi caso no era el modo correcto (De los 4 que pueden ser con SPI) y también la frecuencia del reloj. La pantalla creo que trabaja a máximo 10MHZ y estaba utilizando 20MHz (me parce) luego use 8MHz.


« Última modificación: 17 de Diciembre de 2021, 09:48:58 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #34 en: 19 de Diciembre de 2021, 18:54:09 »
Muchas gracias por tu aporte.  Yo te consultaba porque comparé las rutinas con el datasheet y hay algunas diferencias. De todas formas, el mismo datasheet dice que ellos recomiendan inicializarlo de esa forma, lo que entiendo que significa que puede haber otras..  :shock:

Con respecto a la comunicación, ahora estoy usando #use  spi para descartar posibles problemas en la comunicación. El micro que estoy utilizando es un 18F46K20 y lo estoy corriendo a 4 Mhz. Las rutinas de escritura de commando y data quedarón así:

Código: C
  1. #use spi(MASTER, CLK=PIN_D0, DO=PIN_D1,FORCE_SW, MODE=3, BITS=8,stream=BUSSPI)
  2.  
  3. void glcd_command(char command) {
  4.    //int n;
  5.  
  6.    output_low(GLCD_RS);        // A0 low para que el dato enviado sea un comando
  7.    delay_us(5);
  8.    output_low(GLCD_CS);       // Seleccionamos el chip
  9.    delay_us(5);
  10.    
  11.    spi_xfer(BUSSPI,command);
  12.    
  13.    utput_high(GLCD_CS);
  14. }
  15.  
  16. void glcd_data(unsigned char data) {
  17.  
  18. output_high(GLCD_RS);        // A0 HIGH para que el dato enviado sea un data
  19.    delay_us(5);
  20.    output_low(GLCD_CS);       // Seleccionamos el chip
  21.    delay_us(5);
  22.  
  23.    
  24.     spi_xfer(BUSSPI,data);
  25.    
  26.     // Unselect the chip
  27.     output_high(GLCD_CS);
  28.  
  29. }

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #35 en: 19 de Diciembre de 2021, 19:12:20 »
Muchas gracias por tu aporte.  Yo te consultaba porque comparé las rutinas con el datasheet y hay algunas diferencias. De todas formas, el mismo datasheet dice que ellos recomiendan inicializarlo de esa forma, lo que entiendo que significa que puede haber otras..  :shock:


O sea la configuración es esa porque vas a trabajar con 128x64 pixeles (Recuerda que tu mismo indicabas que el driver había otro CS y es para pantallas de mayor resolución), también configuras el sentido de orientación de la pantalla, el nivel de brillo, etc, alguna vez estuve jugando para ver que eran esas configuraciones.

Con respecto a lo que no logras hacer que funcione y suponiendo que las conexiones son correctas y la LCD no tiene algún defecto, lo más probable es la manera incorrecta como estas enviando los datos por el SPI.

Yo te recomendaría ver no solo las señales de reloj y datos , sino por ejemplo CS y el reloj, A1 y el reloj, etc., es posible que una de estas señales actives antes o luego de cuando debían ser activadas.
Si tienes una analizador lógico, sería mucho mejor para determinar si estas haciendo lo correcto.

Respecto al código en PICC o CCS no estaría seguro si estas configurando y escribiendo correctamente , no soy experto en eso. Deberías esperar a un comentario de alguien con ese conocimiento.

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #36 en: 19 de Diciembre de 2021, 22:27:11 »
Con la configuración SPI por software y utilizando el scope, se  puede ver que la frecuencia del spi es de 13 Khz. Me parece baja, y aunque no se cual es la mínima y/o máxima que soporta este display, voy a cambiarle el cristal para mejorar un poco la frecuencia.
Ya empiezo a descartar problemas en la comunicación; es configuración como bien decís DominusDRR. Este display me está volviendo loco, debería ser fácil  :5] :5] :lol: :lol:

En la imagen se ve como se envía el código b10100011.  Según el datasheet tiene que enviarse el bit mas significativo primero.


Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #37 en: 20 de Diciembre de 2021, 10:34:43 »
Con la configuración SPI por software y utilizando el scope, se  puede ver que la frecuencia del spi es de 13 Khz. Me parece baja, y aunque no se cual es la mínima y/o máxima que soporta este display, voy a cambiarle el cristal para mejorar un poco la frecuencia.
Ya empiezo a descartar problemas en la comunicación; es configuración como bien decís DominusDRR. Este display me está volviendo loco, debería ser fácil  :5] :5] :lol: :lol:

En la imagen se ve como se envía el código b10100011.  Según el datasheet tiene que enviarse el bit mas significativo primero.



Lo que no comprendo es porqué no analizas las otras líneas (Reset, CS, A0) junto con el reloj para determinar si lo estás haciendo bien. Obviamente si tienes un scope de más de dos o tres entradas, podrías ver todas al mismo tiempo.

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #38 en: 26 de Diciembre de 2021, 19:59:52 »
Compañeros... El display está funcionando. Obviamente tenía problemas en la inicialización, como siempre lo dudé. Pero quedó funcionando.

Solo, hay un problema que aún no puedo resolver. El punto (0,0) está corrido, es decír que las columnas están fuera de posición. Por lo tanto cuando escribo algo en esas coordenas no se vé. Según el datasheet hay dos registros para desplazar las columnas, pero ya los modifiqué y no cambia.  :5]

Esta es la descripción de los registros para desplazar las columnas:



Y esta es la instrucción donde se utiliza, que ya está programada para que inicie en (0,0) pero no lo hace.

Código: C
  1. void Transferir_LCDRAM_LCD(void)
  2. {
  3.     unsigned char i;
  4.     unsigned char j;
  5.    
  6.     for(i = 0; i < 8; ++i)
  7.     {
  8.         //LCD_Instrucciones(i); // LCD lista para instrucciones
  9.         glcd_command(0xb0 | i);    // select page 0~7
  10.         glcd_command(0x10);       // start form column 0
  11.         glcd_command(0x00);        // (2byte command)
  12.         for(j = 0; j < 128; ++j)
  13.         glcd_data(LCDRAM[i][j]);  //LCD_ESCRIBIR(0,solintecelogo[s++]); // Los pixeles encendidos a OFF
  14.     }
  15.     delay_us(150);
  16. }


ver avatar online gratis en español completa

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #39 en: 27 de Diciembre de 2021, 10:17:05 »
Compañeros... El display está funcionando. Obviamente tenía problemas en la inicialización, como siempre lo dudé. Pero quedó funcionando.

Solo, hay un problema que aún no puedo resolver. El punto (0,0) está corrido, es decír que las columnas están fuera de posición. Por lo tanto cuando escribo algo en esas coordenas no se vé. Según el datasheet hay dos registros para desplazar las columnas, pero ya los modifiqué y no cambia.  :5]

Esta es la descripción de los registros para desplazar las columnas:



Y esta es la instrucción donde se utiliza, que ya está programada para que inicie en (0,0) pero no lo hace.

Código: C
  1. void Transferir_LCDRAM_LCD(void)
  2. {
  3.     unsigned char i;
  4.     unsigned char j;
  5.    
  6.     for(i = 0; i < 8; ++i)
  7.     {
  8.         //LCD_Instrucciones(i); // LCD lista para instrucciones
  9.         glcd_command(0xb0 | i);    // select page 0~7
  10.         glcd_command(0x10);       // start form column 0
  11.         glcd_command(0x00);        // (2byte command)
  12.         for(j = 0; j < 128; ++j)
  13.         glcd_data(LCDRAM[i][j]);  //LCD_ESCRIBIR(0,solintecelogo[s++]); // Los pixeles encendidos a OFF
  14.     }
  15.     delay_us(150);
  16. }


ver avatar online gratis en español completa

Suponiendo que no es un problema de configuración, cuando pones un punto en las coordenadas x = 0, y = 0, deberías primer revisar si LCDRAM[0][0] que debe ser igual a 0x80, si es correcto ese valor puede ser que al enviar el dato vía SPI lo alteres, por ejemplo pueda que esté trabajando con char en lugar de unsigned char.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #40 en: 30 de Diciembre de 2021, 21:58:11 »
Hola  DominusDRR. Gracias por la respuesta.

Porque dices que  LCDRAM[0][0] que debe ser igual a 0x80?

Feliz año nuevo!

Un abrazo

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #41 en: 30 de Diciembre de 2021, 22:17:45 »
Hola  DominusDRR. Gracias por la respuesta.

Porque dices que  LCDRAM[0][0] que debe ser igual a 0x80?

Feliz año nuevo!

Un abrazo

Lo voy a explicar en partes. Sabes que tu pantalla es de 128x64 pixeles. La coordenada 0,0 está en la esquina superior izquierda y la coordenada 128,64 está en la esquina inferior derecha.

La línea Vertical se denomina Y, et puede contener hasta 64 bytes (de 0 a 63)

La línea Horizontal puede contener hasta 16 bytes, cada byte es de 8 bits, por lo tanto 16 bytes * 8 = 128 bits o pixeles.



« Última modificación: 30 de Diciembre de 2021, 22:24:27 por DominusDRR »
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #42 en: 30 de Diciembre de 2021, 22:23:04 »
Hola  DominusDRR. Gracias por la respuesta.

Porque dices que  LCDRAM[0][0] que debe ser igual a 0x80?

Feliz año nuevo!

Un abrazo

Si deseas poner un punto en las coordenadas 0, 0, debes activar el bit 7 del primer byte, que está en la esquina izquierda superior: (De igual manera feliz año nuevo)

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re:LCD 128x64 / ST7565R
« Respuesta #43 en: 09 de Enero de 2022, 18:55:58 »
Gracias DominusDRR! Ya puedo utilizar el display con normalidad!

 ((:-)) ((:-)) ((:-))

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:LCD 128x64 / ST7565R
« Respuesta #44 en: 09 de Enero de 2022, 19:08:07 »
Gracias DominusDRR! Ya puedo utilizar el display con normalidad!

 ((:-)) ((:-)) ((:-))

Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32