Conexión física de LCD usando PIC18F4550 y xlcd.h

3

Quiero encender una pantalla LCD con un PIC18F4550 y la biblioteca periperial xlcd.h. Mi código es el siguiente:

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <plib/xlcd.h>
#include <plib/delays.h>

#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2
#pragma config FOSC = HSPLL_HS, FCMEN = OFF, IESO = OFF
#pragma config PWRT = OFF, BOR = OFF, VREGEN = OFF
#pragma config WDT = OFF, WDTPS = 32768
#pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF
#pragma config STVREN = ON, LVP = OFF, ICPRT = OFF, XINST = OFF

#define _XTAL_FREQ 48000000

void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);

int main() {

 OpenXLCD(FOUR_BIT & LINES_5X7);

 while(BusyXLCD());

 WriteCmdXLCD(0x06);

 WriteCmdXLCD(0x0C);

 while(1)
 {

    SetDDRamAddr(0x00);
    putrsXLCD("HELLO");

    SetDDRamAddr(0x40);
    putrsXLCD("WORLD");
 }

}
void DelayFor18TCY(void)
{
 Delay10TCYx(120);
}

void DelayPORXLCD(void)
{
 Delay1KTCYx(180);
 return;
}

void DelayXLCD(void)
{
 Delay1KTCYx(60);
 return;
}

Y funciona perfectamente en Proteus

Elproblemavieneconhacerelcircuitoreal,yaquelapantallaLCDsoloparpadeaenlaprimeraposición:

Midiagramaeselsiguiente( enlace ):

No veo por qué no funciona, todo está conectado como muestra el diagrama. La pantalla LCD funciona bien cuando uso un Arduino. Todas las conexiones vss tienen una base común y la misma para las conexiones vdd que tienen un 5V común. Incluso tengo condensadores de desacoplamiento para los pines vdd. Agradecería cualquier sugerencia, gracias

Información adicional: Estoy usando el PICkit3 para programarlo y un adaptador de 5V DC de un teléfono celular. Ya he probado con 2 adaptadores diferentes y dos PIC18F4550 diferentes

    
pregunta Delfin

1 respuesta

3

Estoy lejos de mi entorno de desarrollo PIC18, pero puedo ver un problema en su configuración (aunque puede que no sea el único).

Resumen:

Su código intenta leer el "estado de ocupado" del controlador LCD, pero el diseño de su hardware no lo admite. Resultado: su código se bloqueará o no esperará el tiempo suficiente para que el controlador LCD se inicie. De cualquier manera, es poco probable que su pantalla LCD muestre los caracteres correctamente, que es el problema que está informando.

Explicación:

Puede ser útil saber que, aunque a menudo se escribe como "R / W", esa señal a un módulo LCD mediante un El controlador compatible con HD44780 como el suyo, es realmente \ $ \ small {\ textrm R /} \ overline {\ textrm W} \ $ (consulte la hoja de datos de HD44780 como éste para obtener más información). Esto significa para esa señal:

  • logic 1 = Leer desde LCD (por ejemplo, verificar el estado de ocupado del controlador LCD)
  • lógica 0 = escribir en LCD (por ejemplo, enviar comandos y caracteres para mostrar)

Su " esquema real " muestra que ha conectado el LCD \ $ \ small {\ textrm R / } \ overline {\ textrm W} \ $ pin (pin 5) a Gnd. Esto es bastante común, pero significa que no puede leer el "estado de ocupado" del controlador LCD. Esto se debe a que el controlador LCD esperará que todos los datos se escriban en la LCD, cuando su entrada \ $ \ small {\ textrm R /} \ overline {\ textrm W} \ $ esté conectada a tierra ( lógica 0).

Sin embargo, también está utilizando la función de biblioteca periférica de Microchip BusyXLCD() que intenta leer el estado del controlador LCD. Por lo general, asumiendo que está configurado para el puerto B, la biblioteca espera que el pin LCD \ $ \ small {\ textrm R /} \ overline {\ textrm W} \ $ esté conectado al pin PIC RB6 . En su esquema, vemos que no hay conexión entre esos pines.

Por lo tanto, dependiendo de si el pin PIC flota alto o bajo, el código de la biblioteca:

  • girar-esperar y bloquearse cuando llamas a while(BusyXLCD()); para que el resto de tu código no se ejecute, o;

  • ejecute inmediatamente la siguiente declaración, es decir, no esperará el tiempo suficiente para que el controlador LCD esté listo antes de enviarle más comandos, lo que provocará un mal funcionamiento de la pantalla LCD.

Solución:

O bien:

  • Cambie su código principal para usar los retrasos apropiados en lugar de llamar a BusyXLCD() , o;

  • Suponiendo que los ajustes de configuración en su xlcd.h esperan que el LCD \ $ \ small {\ textrm R /} \ overline {\ textrm W} \ $ pin (pin 5) se conecte a PIC RB6 , y suponiendo (como parece ser cierto en el esquema) que el PIC y la LCD utilizan la misma fuente de alimentación (es decir, el mismo voltaje V dd ), simplemente conecte esos dos pines. Eso debería permitir que las llamadas a BusyXLCD() funcionen según lo previsto.

Es posible que haya más problemas en su diseño, pero necesita solucionarlo.

    
respondido por el SamGibson

Lea otras preguntas en las etiquetas