Depuración de la inicialización de la pantalla LCD con el controlador NT7605

4

He estado tratando de inicializar mi LCD durante aproximadamente una semana, y me da mucha pena decir que no he tenido éxito hasta ahora. He hecho esto en el pasado, y recuerdo que fue un poco difícil obtener la secuencia de inicialización de la manera correcta, pero en este punto creo que ya veté completamente la implementación y simplemente no está funcionando.

Configuración:

  1. LCD NHT-C0220AZ-FSW-FTW con un controlador NT7605
  2. TI Launchpad w / MSP430G2231
  3. bote de 10k de un solo turno para el control de contraste
  4. LCD alimentado con 3.3V
  5. Launchpad alimentado con USB
  6. Motivos para cada componente unidos
  7. utilizando la interfaz de 4 bits de la pantalla LCD
  8. retroiluminación de LCD conectada a Vcc (3.3V) desde Launchpad

Aquíhaycosasquehehechohastaahoraparalaspruebas:

  1. Conexionesdoblesverificadas
    1. pinesLCDD4-D7,RS,R/WyE
    2. Elpotenciómetroestáconectadoalpindecontroldecontraste,yheverificadoquelatensiónvade0aVdd.
    3. LCDVddconectadoa3.4V,queestáaaproximadamentelaespecificacióndevoltajemínimo
  2. RutinasdeE/SdedoblecomprobaciónenMSP430
    1. LospinesdelapantallaLCDserestablecen/configurancomoseesperaamedidaquepasopormicódigo
    2. Lasrutinasdetiempoestánsemi"calibradas" for loops
  3. Documentación cruzada para las rutinas de inicialización contra las rutinas de otros que he encontrado en línea
      1.

Sin embargo, después de todo esto, ¡no puedo ver nada en la pantalla LCD! Así que aquí están mis preguntas:

  1. El fabricante ha verificado que hay un error en el NT7605 donde el bit de ocupado no se valida correctamente. Así que he estado usando retrasos fijos (bien conmigo), pero quería usar el indicador de ocupado para ver si el controlador está respondiendo a los comandos. ¿Hay alguna otra manera de hacer un diagnóstico de bajo nivel para ver qué piensa la pantalla LCD cuando envío comandos de inicialización?
  2. ¿Alguien más aquí ha usado el mismo LCD? Todas las demás pantallas LCD estándar que he usado (tipos de 2x20 caracteres) se oscurecen notablemente cuando enciendo el ajuste de contraste, e IIRC lo hacen incluso cuando no se inicializan correctamente. Sin embargo, cuando enciendo la olla en la mía, la pantalla LCD no se oscurece en absoluto. Quizás esto se deba a que no está inicializado, pero no estoy seguro.
  3. ¿Puede alguien encontrar algo raro con esta rutina de inicialización?
    1. retraso > 30ms
    2. enviar 0x20, solo mordisco superior
    3. enviar 0x28 (establecer interfaz de 4 bits)
    4. espera 10ms
    5. enviar 0x0C (pantalla activada, cursor apagado, parpadear apagado)
    6. espera 10ms
    7. enviar 0x01 (pantalla clara)
    8. espera 10ms
    9. enviar 0x02 (cursor de incremento, sin cambio de pantalla)
    10. espera 10ms
    11. establezca RS alto para comenzar a enviar datos de caracteres
    12. enviar 0x48 (mostrar 'H')

Micódigoseveasí:

voidInitializeLcd(){DelayTicks(10000);//4bitinterface,2lines,5x8characters//thespecsheetshowsthe0x20partof0x28gettingsentanextratime//soIusedaspecialfunctiontodealwiththiscase.Thisjustsends//the0x20partandignoresthe0x08part.SendLcdUpperNibble(COMMAND,0x28);SendLcdByte(COMMAND,0x28);DelayTicks(1000);//Displayon,cursoroff,blinkoffSendLcdByte(COMMAND,0x0C);DelayTicks(1000);//cleardisplayClearLcd();//Entrymodeset-incrementcursor,nodisplayshiftSendLcdByte(COMMAND,0x02);DelayTicks(1000);//SetwritetoDDRAMmodesincewe'lljustbesendingdatafromnowonSendLcdByte(DATA,0x48);SendLcdByte(DATA,0x65);SendLcdByte(DATA,0x6C);SendLcdByte(DATA,0x6C);SendLcdByte(DATA,0x6F);}voidClearLcd(){//CleardisplaySendLcdByte(COMMAND,0x01);DelayTicks(1000);}voidSetRS(intvalue){if(value==0)P2OUT&=~RS;elseP2OUT|=RS;}voidSetRW(intvalue){if(value==0)P2OUT&=~RW;elseP2OUT|=RW;}voidSetE(intvalue){if(value==0)P1OUT&=~E;elseP1OUT|=E;}voidDelayMs(intdelay){intctr;intms=delay*100;for(ctr=0;ctr<ms;ctr++);}voidDelayTicks(intticks){intctr;for(ctr=0;ctr<ticks;ctr++);}voidSendLcdByte(unsignedcharcommand_0_or_data_1,unsignedcharcommand){SendLcdUpperNibble(command_0_or_data_1,command);//sendthelowernibblenext//specialthankyoutoToyBuilderforcatchingmymissedbit-shiftinthefollowingline//IalsohadthemaskonP1OUTincorrect,presumablybecauseImessedupthecommandmaskandjustmadeitmatchthat.P1OUT=((command&0x0F)<<4)|(P1OUT&0x0F);Strobe(command_0_or_data_1);}voidSendLcdUpperNibble(unsignedcharcommand_0_or_data_1,unsignedcharupper_nibble){P1OUT=(upper_nibble&0xF0)|(P1OUT&0x0F);Strobe(command_0_or_data_1);}voidStrobe(unsignedcharcommand_0_or_data_1){SetRS(command_0_or_data_1);SetRW(0);DelayTicks(1000);SetE(1);DelayTicks(1000);SetE(0);}

LoúnicoquepuedodeciresquelapantallaLCDparecequeparpadeacuandopasoporencimadeSendLcdByteyleenvíodatosdecaracteres.Cuandoalcancetodo,seguroqueparecequeestoyvolteandobitscorrectamente...

EDITAR-HesoldadounanuevapantallaLCD,yestavezintentédejarlospinesdedatosnoutilizados(D0-D3)desconectados(esdecir,flotando).Nohabíadiferencia.LapantallaLCDtodavíaparpadeacuandoseinicializa.Ahoraestoyesperando100msparatodaslasdemoras,incluidaunademoracuandoseapagaelindicadorE.TambiéndesconectéelVccprovenientedelasecciónLaunchpadFETyahorasoloestoyalimentandoelMSP430ylaLCDdesdelafuentedealimentacióndemilaboratorio.

EDIT#2-FuiaunapantallaLCDde3.3Vytodocomenzóafuncionarmágicamente.GraciasaToyBuilderpordetectarunerrordecódigoestúpidocuandoestabahaciendounadepuraciónconelLCDde5V.DespuésdelintercambiolapantallaLCDseinicializócorrectamente.Actualmenteestoymostrandobasuraenlugarde"Hola", pero eso no está relacionado con esta pregunta.

EDIT # 3 - encontré mi error de visualización - estaba enviando 0x06 para el modo de entrada en lugar de 0x02. No estoy seguro de por qué hice eso, debe haber sido un error tipográfico.

    
pregunta Dave

5 respuestas

3

Oh, duh, no leí tu código con cuidado, tu envío SendLcdByte está mal:

    void SendLcdByte( unsigned char command_0_or_data_1, unsigned char command)
{
    SendLcdUpperNibble( command_0_or_data_1, command);
    // send the lower nibble next
 // AS WRITTEN:
    P1OUT = (command & 0x0F) | (P1OUT & 0xF0);
 // SHOULD BE:
    P1OUT = ((command & 0x0F) << 4) | (P1OUT & 0xF0);
    Strobe( command_0_or_data_1);
}
    
respondido por el Toybuilder
2

Verifique dos veces los voltajes de salida alta / baja de la señal del MSP430 y los mínimos para las entradas en la pantalla LCD.

Otra cosa es si estás golpeando los bits demasiado rápido: tu lista de fuentes no muestra cómo estás cambiando los datos y las señales E. Si giras E demasiado pronto después de cargar los bits de datos, no funcionará. Si no mantiene presionado E el tiempo suficiente para que la pantalla LCD retenga los datos entrantes, no funcionará. Intente agregar un retraso de tiempo entre la escritura D0-D7, y luego entre afirmar y luego desestimar la línea E.

Supongo que las líneas se usan estrictamente para los LCD, por lo que no hay problemas de tiempo de espera. Si también está utilizando las líneas como un bus para otros dispositivos, deberá asegurarse de que sus datos se conserven el tiempo suficiente antes de que el bus se utilice para otras cosas.

    
respondido por el Toybuilder
1

Una cosa que me engañó una vez fue que la luz de fondo era tan baja que no podía ver que funcionaba.

    
respondido por el kenny
0

El soporte técnico de Newhaven Display ha recomendado que reemplace la pantalla LCD y vuelva a intentarlo. Es posible que lo haya dañado durante la configuración inicial, así que veremos cómo va. Voy a publicar los resultados aquí.

    
respondido por el Dave
0

¿Podría ser posible que tenga los pines conectados al revés?

De vez en cuando, me encontraba con LCD con los números de pin invertidos, ya sea en la parte misma o en la hoja de datos o en ambas.

Sé que esto puede parecer un "¿está enchufado?" Pregunta, pero personalmente me ha sorprendido con esto.

* EDIT * *

En mi comentario anterior, dije que escribiera 0x80; lo que pretendía era que intentara mantener el valor 0x40 o 0x60 en las líneas de datos.

Si resulta que los pines están invertidos, la escritura de 0x40 aplicaría energía y tierra a través de los pines de datos a la pantalla LCD, lo que le da la oportunidad de restablecerse automáticamente. Esto es posible porque un módulo LCD de caracteres típicos solo consume de 1 a 5 mA de corriente, dentro de la capacidad de conducción de la mayoría de las salidas.

Lo que sospecho que puede estar sucediendo es que estás escribiendo algunos valores 0x6X y 0x4X en tu LCD durante un breve período de tiempo mientras estás inicializando la LCD, y que la LCD se está encendiendo durante ese breve período; pero cuando empiezas a escribir otros valores, lo estás desactivando.

* EDIT 2 *

Mientras buscaba en la hoja de datos de otra pantalla LCD para verificar los requisitos actuales, noté que es posible que tengas tus pines Vcc y Vcontrast intercambiados. ¡Asegúrate de comprobar eso también!

Acabo de mirar y vi en la hoja de datos NHT-C0220AZ-FWS-FTW (donde obtuvo su dibujo esquemático arriba) que el contraste es el pin 2, y la tensión de alimentación es el pin 3. Que es el reverso de Vishay y Optrex partes donde el contraste es el pin 3 y la tensión de alimentación es el pin 2.

Bueno, diablos, incluso el NHD-0420DZ-FSW-FBW de NewHaven tiene contraste en el pin 3 y suministro en el pin 2.

    
respondido por el Toybuilder

Lea otras preguntas en las etiquetas