1 votos

PIC : Problema con la inicialización del LCD

Como estamos desarrollando nuestra aplicación basada en el PIC18F66K22. Necesitamos interconectar el LCD con él. Tenemos el LCD trabajando con él, pero el problema que tenemos es que la inicialización del LCD tarda alrededor de 10 segundos y sólo después de que el LCD se inicia hasta entonces, incluso el microcontrolador no ejecuta ningún comando, pero después de la inicialización funciona como se esperaba sin ningún retraso. ¿Qué podría estar causando el problema? El controlador LCD es ili9163C. La hoja de datos se puede encontrar en https://www.displaytech-us.com/sites/default/files/driver-ic-data-sheet/ILI9163C_DS_V010_2011_0118.pdf .

El siguiente es el código de inicialización.

void LCD_init()
{
Send_Command(0x11); //Exit Sleep   
delay_ms(50);   
Send_Command(0x26); //Set Default Gamma   
Send_Data(0x04);   
// Send_Command(0xF2); //E0h & E1h Enable/Disable   
// Send_Data(0x00);   
Send_Command(0xB1);   
Send_Data(0x0C);   
Send_Data(0x14);   
Send_Command(0xC0); //Set VRH1[4:0] & VC[2:0] for VCI1 & GVDD   
Send_Data(0x0C);   
Send_Data(0x05);   
Send_Command(0xC1); //Set BT[2:0] for AVDD & VCL & VGH & VGL   
Send_Data(0x02);   
Send_Command(0xC5); //Set VMH[6:0] & VML[6:0] for VOMH & VCOML   
Send_Data(0x29);   
Send_Data(0x43);   
Send_Command(0xC7);   
Send_Data(0x40);   
Send_Command(0x3a); //Set Color Format   
Send_Data(0x55);   
Send_Command(0x2A); //Set Column Address   
Send_Data(0x00);   
Send_Data(0x00);   
Send_Data(0x00);   
Send_Data(0x7F);   
Send_Command(0x2B); //Set Page Address   
Send_Data(0x00);   
Send_Data(0x00);   
Send_Data(0x00);   
Send_Data(0x9F);   
Send_Command(0x36); //Set Scanning Direction   
Send_Data(0xA8);   
Send_Command(0xB7); //Set Source Output Direction   
Send_Data(0x00);   
Send_Command(0xf2); //Enable Gamma bit   
Send_Data(0x01);   
Send_Command(0xE0);   
Send_Data(0x36);//p1   
Send_Data(0x29);//p2   
Send_Data(0x12);//p3   
Send_Data(0x22);//p4   
Send_Data(0x1C);//p5   
Send_Data(0x15);//p6   
Send_Data(0x42);//p7   
Send_Data(0xB7);//p8   
Send_Data(0x2F);//p9   
Send_Data(0x13);//p10   
Send_Data(0x12);//p11   
Send_Data(0x0A);//p12   
Send_Data(0x11);//p13   
Send_Data(0x0B);//p14   
Send_Data(0x06);//p15   
Send_Command(0xE1);   
Send_Data(0x09);//p1   
Send_Data(0x16);//p2   
Send_Data(0x2D);//p3   
Send_Data(0x0D);//p4   
Send_Data(0x13);//p5   
Send_Data(0x15);//p6   
Send_Data(0x40);//p7   
Send_Data(0x48);//p8   
Send_Data(0x53);//p9   
Send_Data(0x0C);//p10   
Send_Data(0x1D);//p11   
Send_Data(0x25);//p12   
Send_Data(0x2E);//p13   
Send_Data(0x34);//p14   
Send_Data(0x39);//p15   
Send_Command(0x29); // Display On
}

Esta es la sección principal

void main()
{
OSCCONbits.IRCF0 = 1;   //HFINTOSC 16MHz with PLLEN
OSCCONbits.IRCF1 = 1;
OSCCONbits.IRCF2 = 1;
OSCTUNEbits.PLLEN = 1;
delay_ms(5);
while(!OSCCONbits.IRCF2);   //wait for HF-INTOSC oscillator frequency is stable
delay_ms(5);
    Config_IO();
    lcd_reset();    //LCD reset
delay_ms(5);    //LCD reset complete delay`
    LCD_init();
font_init();

    TRISBbits.TRISB3 = 0;
TRISCbits.TRISC2 = 0;
RELAY_EN = 0;

FillFullLcd(WHITE);
//LCD_image (0,33,159,96,(unsigned char rom *)benchmark);
// sprintf(&FirmVerText[6],"%d.%d",FW[0]-0x30,FW[1]-0x30);
// setfont((void *)font_Calibri_10);
// LCD_OutText(50,97,FirmVerText,BLACK);
setfont((void *)font_Calibri_10); //added by shailesh
    LCD_OutText(50,99,FirmVerText,BLACK);//added by shailesh
    LCD_image (0,33,159,96,(unsigned char rom *)benchmark);
    delay_ms(3000);
    FillFullLcd(BLUE);
    Hstart = 0;
    Vstart = 0;
    radius = 5;
    Hend = 100;
    Vend = 75;
    color = BLUE;
LCD_draw_round_corner_box(2,33,157,96,75,LOGOC,1);
//LCD_Rectangle(2,33,157,96,LOGOC,1);
LCD_OutText(35,55, productstr,WHITE);
    delay_ms(2000);
    calibration();
    while(1);
    }

Aquí en este código se tarda unos 10 segundos en pintar toda la pantalla de azul. pero después de eso todas las operaciones de la lcd funcionan perfectamente bien y sin retraso. ¿Qué podría estar causando el problema aquí?

1voto

Bernd Puntos 61

Es realmente difícil saber a partir de su código publicado, del que falta gran parte, lo que podría estar consumiendo todo el tiempo.

Tendrás que trabajar un poco para determinar dónde están todos los retrasos. Una manera probada y verdadera de hacer esto es encontrar un pin de E/S que esté actualmente inactivo o no se use y configurarlo como un pin de salida DEBUG. Entonces empieza a poner este pin en alto y luego de nuevo en bajo en varios puntos de tu código de activación y flujos de inicialización. Poner esta señal en un osciloscopio junto con la señal de Reset de la MCU te permitirá caracterizar cuánto tiempo están tardando en ejecutarse varias partes del código.

En poco tiempo podrá determinar si es el código de inicio del oscilador del MCU, el tiempo que tarda en ejecutarse la rutina init del LCD o el tiempo que tarda en ejecutarse la rutina FillFullLcd(). <- Estos son sólo ejemplos. Podría ser otra cosa.

0voto

dhk628 Puntos 345

Los retardos deben definirse de 2 a 5 ms desde la habilitación hasta el preámbulo y de 20 a 50 ms para el enclavamiento después del comando de inicialización, y luego uno mayor después de la inicialización para los comandos de control, siempre manteniendo los retardos de los pines de habilitación para cada caso, dependiendo de la interconexión, por ejemplo, en el caso del hc164... la habilitación a nivel bajo también debe ir precedida de un breve retardo para garantizar que el controlador de la pantalla se haya enclavado.

-1voto

Jimit Puntos 188

En realidad, hemos resuelto este problema. El problema era causado por el retardo de 50 ms después del comando "despertar del sueño". Después de eliminar el retardo, la pantalla LCD funciona perfectamente. Supongo que el retardo de 50 ms está causando que el controlador del LCD se despierte de la suspensión.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X