PIC: Problema con la inicialización de LCD

1

Como estamos desarrollando nuestra aplicación basada en el PIC18F66K22. Necesitamos una interfaz LCD con él. Tenemos la pantalla LCD trabajando con ella, pero el problema que estamos obteniendo es que la inicialización de la pantalla LCD dura unos 10 segundos y solo después se inicia la pantalla LCD hasta que incluso el microcontrolador no ejecuta ningún comando. Pero después de la inicialización funciona como se espera sin demora. . ¿Qué podría estar causando el problema? El controlador LCD es ili9163C. La hoja de datos se puede encontrar en enlace .

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 lcd funcionan perfectamente bien y sin demora. ¿Qué podría estar causando el problema aquí?

    
pregunta Jimit

3 respuestas

1

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

Tendrá que hacer un poco de trabajo para reducir exactamente dónde están todos los retrasos. Una forma 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. Luego comience a establecer este pin alto y luego vuelva a bajar en varios puntos de la activación del código y los flujos de inicialización. Poner esta señal en un osciloscopio junto con la señal de restablecimiento de la MCU le permitirá caracterizar el tiempo que tardan en ejecutarse las distintas partes del código.

Dentro de poco tiempo podrá determinar si se trata del código de inicio del oscilador MCU, el tiempo que lleva ejecutar la rutina de inicio de LCD o el tiempo que tarda en ejecutar la rutina FillFullLcd (). < - Estos son solo ejemplos. Podría ser otra cosa.

    
respondido por el Michael Karas
0

los retrasos deben definirse entre 2 y 5 ms. Habilitar el froom habilitado para preámbulos y 20 a 50 para enclavar después del comando de inicialización y luego uno más grande después de la inicialización para los comandos de control, siempre manteniendo los retrasos de los pines de habilitación para cada caso, según el ejemplo de interfaz. hc164 ... habilitar a bajo también puede estar precedido por un breve retraso para garantizar que el controlador de la pantalla se haya bloqueado.

    
respondido por el Diego Cadogan
-1

En realidad hemos resuelto este problema. El problema se debió a la demora de 50 ms después del comando "despertar del sueño". Después de eliminar la demora, la pantalla LCD funciona perfectamente. Supongo que el retraso de 50 ms está causando que el controlador LCD se despierte del sueño.

    
respondido por el Jimit

Lea otras preguntas en las etiquetas