Debugging-Initialisierung von LCD mit NT7605-Treiber

Ich versuche jetzt seit ungefähr einer Woche, mein LCD zu initialisieren, und es ist mir ziemlich peinlich zu sagen, dass ich bisher erfolglos war. Ich habe dies in der Vergangenheit getan, und ich erinnere mich, dass es ein wenig schwierig war, die Initialisierungssequenz genau richtig hinzubekommen, aber an diesem Punkt denke ich, dass ich die Implementierung vollständig überprüft habe und es einfach nicht funktioniert.

Aufstellen:

  1. NHT-C0220AZ-FSW-FTW LCD mit einem NT7605-Treiber
  2. TI Launchpad mit MSP430G2231
  3. Single-Turn 10k-Poti zur Kontraststeuerung
  4. LCD mit 3,3 V versorgt
  5. Launchpad mit USB-Stromversorgung
  6. Gründe für jede Komponente, die miteinander verbunden sind
  7. über die 4-Bit-Schnittstelle des LCDs
  8. LCD-Hintergrundbeleuchtung an Vcc (3,3 V) vom Launchpad angeschlossen

Geben Sie hier die Bildbeschreibung ein

Hier sind Dinge, die ich bisher zum Testen gemacht habe:

  1. Anschlüsse doppelt geprüft
    1. LCD-Stifte D4-D7, RS, R/W und E
    2. Potentiometer an Kontraststeuerstift angeschlossen, und ich habe überprüft, dass die Spannung von 0 - Vdd geht.
    3. LCD Vdd an 3,4 V angeschlossen, was ungefähr der Mindestspannungsspezifikation entspricht
  2. E/A-Routinen auf MSP430 doppelt überprüft
    1. LCD-Pins werden wie erwartet zurückgesetzt / eingestellt, wenn ich meinen Code durchlaufe
    2. Timing-Routinen sind halb "kalibrierte" forSchleifen
  3. Quergeprüfte Dokumentation für Initialisierungsroutinen mit den Routinen anderer, die ich online gefunden habe
      1.

Doch nach all dem kann ich nichts auf dem LCD anzeigen! Hier also meine Fragen:

  1. Der Hersteller hat bestätigt, dass es einen Fehler im NT7605 gibt, bei dem das Busy-Bit nicht richtig bestätigt wird. Also habe ich feste Verzögerungen verwendet (für mich in Ordnung), wollte aber das Besetzt-Flag verwenden, um zu sehen, ob der Treiber überhaupt auf Befehle reagiert. Gibt es eine andere Möglichkeit für mich, eine Low-Level-Diagnose durchzuführen, um zu sehen, was das LCD denkt, wenn ich Initialisierungsbefehle sende?
  2. Hat jemand anderes hier das gleiche LCD verwendet? Alle anderen Standard-LCDs, die ich verwendet habe (2x20-Zeichentypen), verdunkeln sich merklich, wenn ich die Kontrasteinstellung drehe, und IIRC tun dies auch, wenn sie nicht richtig initialisiert sind. Wenn ich jedoch den Pot auf meinem drehe, verdunkelt sich das LCD überhaupt nicht. Vielleicht liegt das daran, dass es nicht initialisiert ist, aber ich bin mir nicht sicher.
  3. Kann jemand mit dieser Initialisierungsroutine etwas Verrücktes finden?
    1. Verzögerung > 30ms
    2. sende 0x20, nur oberes Nibble
    3. 0x28 senden (4 Bit Schnittstelle setzen)
    4. warte 10ms
    5. sende 0x0C (Anzeige an, Cursor aus, Blinken aus)
    6. warte 10ms
    7. 0x01 senden (Anzeige löschen)
    8. warte 10ms
    9. sende 0x02 (Cursor inkrementieren, keine Displayverschiebung)
    10. warte 10ms
    11. setze RS hoch, um mit dem Senden von Zeichendaten zu beginnen
    12. sende 0x48 (zeige 'H')

Initialisierungsroutine des Herstellers

Mein Code sieht so aus:

void InitializeLcd()
{
    DelayTicks( 10000);
    // 4 bit interface, 2 lines, 5x8 characters
    // the spec sheet shows the 0x20 part of 0x28 getting sent an extra time
    // so I used a special function to deal with this case.  This just sends
    // the 0x20 part and ignores the 0x08 part.
    SendLcdUpperNibble( COMMAND, 0x28);
    SendLcdByte( COMMAND, 0x28);
    DelayTicks( 1000);
    // Display on, cursor off, blink off
    SendLcdByte( COMMAND, 0x0C);
    DelayTicks( 1000);
    // clear display
    ClearLcd();
    // Entry mode set - increment cursor, no display shift
    SendLcdByte( COMMAND, 0x02);
    DelayTicks( 1000);
    // Set write to DDRAM mode since we'll just be sending data from now on
    SendLcdByte( DATA, 0x48);
    SendLcdByte( DATA, 0x65);
    SendLcdByte( DATA, 0x6C);
    SendLcdByte( DATA, 0x6C);
    SendLcdByte( DATA, 0x6F);
}

void ClearLcd()
{
    // Clear display
    SendLcdByte( COMMAND, 0x01);
    DelayTicks( 1000);  
}

void SetRS( int value)
{
    if( value == 0)
        P2OUT &= ~RS;
    else
        P2OUT |= RS;
}

void SetRW( int value)
{
    if( value == 0)
        P2OUT &= ~RW;
    else
        P2OUT |= RW;    
}

void SetE( int value)
{
    if( value == 0)
        P1OUT &= ~E;
    else
        P1OUT |= E;
}

void DelayMs( int delay)
{
    int ctr;
    int ms = delay * 100;
    for( ctr=0; ctr<ms; ctr++);
}

void DelayTicks( int ticks)
{
    int ctr;
    for( ctr=0; ctr<ticks; ctr++);
}

void SendLcdByte( unsigned char command_0_or_data_1, unsigned char command)
{
    SendLcdUpperNibble( command_0_or_data_1, command);
    // send the lower nibble next
    // special thank you to ToyBuilder for catching my missed bit-shift in the following line
    // I also had the mask on P1OUT incorrect, presumably because I messed up the command mask and just made it match that.
    P1OUT = ((command & 0x0F) << 4) | (P1OUT & 0x0F);
    Strobe( command_0_or_data_1);
}

void SendLcdUpperNibble( unsigned char command_0_or_data_1, unsigned char upper_nibble)
{
    P1OUT = (upper_nibble & 0xF0) | (P1OUT & 0x0F);
    Strobe( command_0_or_data_1);
}

void Strobe( unsigned char command_0_or_data_1)
{
    SetRS( command_0_or_data_1);
    SetRW( 0);
    DelayTicks( 1000);
    SetE( 1);
    DelayTicks( 1000);
    SetE( 0);       
}

Das einzige, was ich sagen kann, ist, dass das LCD so aussieht, als würde es flackern, wenn ich über SendLcdByte gehe und ihm Zeichendaten sende. Wenn ich alles durchschaue, sieht es sicher so aus, als würde ich die Bits richtig umdrehen ...

BEARBEITEN - Ich habe ein neues LCD aufgelötet und dieses Mal versucht, die unbenutzten Datenpins (D0-D3) getrennt zu lassen (dh schwebend). Es gab keinen Unterschied. Das LCD flackert immer noch, wenn ich initialisiere. Ich warte jetzt 100 ms auf alle Verzögerungen, einschließlich einer Verzögerung beim Stroben von E. Ich habe auch Vcc vom Launchpad-FET-Bereich getrennt und versorge jetzt nur den MSP430 und das LCD von meinem Labornetzteil.

BEARBEITEN #2 - Ich ging zu einem 3,3-V-LCD und alles fing auf magische Weise an zu arbeiten. Vielen Dank an ToyBuilder für das Auffangen eines dummen Codefehlers, als ich mit dem 5-V-LCD debuggte. Nach dem Austausch wurde das LCD ordnungsgemäß initialisiert. Ich zeige derzeit Müll anstelle von "Hallo" an, aber das hat nichts mit dieser Frage zu tun.

BEARBEITEN #3 -- habe meinen Anzeigefehler gefunden -- ich habe 0x06 für den Eingabemodus anstelle von 0x02 gesendet. Ich bin mir nicht sicher, warum ich das getan habe, muss ein Tippfehler gewesen sein.

Eine kleine Randnotiz: Wenn ich gewusst hätte, dass ich den MSP430 für dieses Projekt verwenden würde, hätte ich ein besser geeignetes LCD ausgewählt, wie das NHD-C0220AU-FSW-FTS, das ein 3,3-V-Teil ist. Ich bin mir nicht sicher, ob ein Teil meines Problems auf die Verwendung von 3,3-V-Logiksignalen zum Bitbang des Datenbusses zurückzuführen ist. Ich könnte jetzt einen dieser LCDs bestellen, weil ich zu viel Zeit damit verschwende.

Antworten (5)

Oh, duh, ich habe deinen Code nicht sorgfältig gelesen - dein send SendLcdByte ist falsch:

    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);
}
Großer Fang! Vielen Dank, dass Sie das gefunden haben - ich dachte total, dass die Dinge mit meinem Bit Twiddling funktionieren, aber ich habe beim Testen das untere Byte übersehen. Ich bin mir ziemlich sicher, dass dies die Ursache des Problems ist, und werde es bald testen.
Wenn ich mehr Zeit finde, muss ich das Zielfernrohr für das untere Knabbern verwenden. Ich war mir sicher, dass dieser Fix alles zum Laufen gebracht hätte, aber das LCD wird immer noch nicht initialisiert. Nochmals vielen Dank, dass Sie meinen Fehler entdeckt haben! Das ist mir jedes Mal, wenn ich mir den Code angesehen habe, völlig entgangen... echt peinlich. :)
ok, eigentlich sollte P1OUT = ((command & 0x0F) << 4) | (P1OUT & 0x0F);ich mir wünschen, ich könnte eine Entschuldigung machen, wie "Ich bin Legastheniker", aber ich kann nicht. Ich habe die Datenbusbits auf dem Oszilloskop überprüft, muss aber die Bits, die gestrobed werden, erneut überprüfen, da es immer noch nicht funktioniert. Ich probiere jetzt auf dem LCD selbst, anstatt das Steckbrett zu stoßen.
@ToyBuilder: Zu Ihrer Information, nach dem Wechseln der LCDs funktioniert mein Code, aber Ihre Antwort war sicherlich ein wichtiger Bestandteil, um dorthin zu gelangen. Ich weiß nicht, warum dies mit dem 5-V-LCD nicht funktioniert hat, da meine Logikpegel innerhalb der Spezifikationen lagen. Wie auch immer, ich habe beschlossen, das Kopfgeld neu zu starten, und morgen werde ich es Ihnen für diese Antwort zusprechen. Danke noch einmal!
Es kann mit der Fähigkeit des LCD-Controllers zu tun haben, die geeignete Ansteuerspannung für den Flüssigkristall im Gerät zu erzeugen - es könnte sein, dass der LC bei 3,3 V nicht ausreichend vorgespannt wird, um einen sichtbaren Unterschied zu machen ...
3,3 V liegen jedoch innerhalb der Spezifikation, und ich habe dies mit ihrem technischen Support bestätigt. Vielleicht schalte ich morgen nur zum Spaß wieder auf die 5-V-Anzeige um, nachdem ich bestätigt habe, dass der Code ordnungsgemäß funktioniert.

Überprüfen Sie die hohen/niedrigen Ausgangsspannungen des Signals vom MSP430 und die Mindestwerte für die Eingänge auf dem LCD.

Eine andere Sache ist, ob Sie zu schnell schlagen – Ihre Quellenliste zeigt nicht, wie Sie die Daten und E-Signale drehen. Wenn Sie nach dem Laden der Datenbits zu früh an E drehen, funktioniert es nicht. Wenn Sie E nicht lange genug gedrückt halten, damit das LCD die eingehenden Daten zwischenspeichern kann, funktioniert es nicht. Versuchen Sie, eine Zeitverzögerung zwischen dem Schreiben von D0-D7 und dann zwischen dem Aktivieren und Deaktivieren der E-Leitung hinzuzufügen.

Ich gehe davon aus, dass die Leitungen ausschließlich für die LCDs verwendet werden, sodass es kein Problem mit der Haltezeit gibt. Wenn Sie die Leitungen auch als Bus zu anderen Geräten verwenden, müssen Sie sicherstellen, dass Ihre Daten lange genug gespeichert werden, bevor der Bus für andere Dinge verwendet wird.

danke für den Hinweis zu den Verzögerungen nach dem Setzen der Datenbits. Mein Code zeigt die Verzögerung, die ich verwende, die keine ist. :) Ich habe nur eine Verzögerung von 1000 Ticks zwischen E high und E low, was laut meinem Oszilloskop etwa 10 ms entspricht. Ich werde es jetzt mit der Verzögerung versuchen, bevor ich E strobe.
Der Ausgangspegel des MSP430 beträgt Vcc-0,3 V, das sind also 3 V. Das LCD hat eine minimale Eingangsspannung von 2,4 V, also sollte ich bereit sein. Ich habe die Verzögerungen für alles auf 100 ms eingestellt , und das LCD flackert während der Initialisierung immer noch nur und zeigt mir nichts an.
Ich muss diesen Teil besser verstehen. Soweit ich das beurteilen kann, liegen die MSP430-Ausgänge innerhalb der Spezifikation für die hohen Pegel der LCD-Eingangslogik, aber der technische Support glaubt, dass der Kontrast das Problem ist.

Eine Sache, die mich auch einmal ausgetrickst hat, war, dass die Hintergrundbeleuchtung so schwach war, dass ich nicht sehen konnte, dass sie funktionierte.

Ja, ich habe definitiv die Hintergrundbeleuchtung funktioniert! Es ist hell. Das einzige, was mich beunruhigt, ist, dass ich beim Drehen des Kontrastknopfs keinen visuellen Hinweis darauf sehe, dass er funktioniert, und der technische Support hat mir gesagt, dass ich Blöcke in der ersten Zeile sehen sollte.
Und es sieht so aus, als hätten Sie getestet, dass Ihr Kontrasttopf nicht kaputt ist ... seltsam.
Ja, ich habe den Spannungshub beobachtet, wenn ich ihn drehe.

Der technische Support von Newhaven Display hat mir empfohlen, das LCD auszutauschen und es erneut zu versuchen. Es ist möglich, dass ich es während der Ersteinrichtung beschädigt habe, also werden wir sehen, wie das geht. Die Ergebnisse poste ich hier.

Das allererste LCD-Modul, das ich je bekam, um 1989, war DOA; Die Freigabeleitung wirkte wie ein 100-Ohm-Widerstand gegen Masse. Digi-Key ersetzte es kostenlos außer Versand (nett von ihnen) und der Ersatz funktionierte beim ersten Versuch.
Ich glaube nicht, dass die LCDs beschädigt sind. Der technische Support hat sich selbst korrigiert und mich wissen lassen, dass die Blöcke nicht angezeigt werden, wenn das Kontrastpoti ohne vorherige Initialisierung eingestellt wird. Daran wird noch gearbeitet!

Kann es sein das du die Pins vertauscht hast?

Hin und wieder stieß ich auf LCDs mit umgekehrten Pin-Nummern, entweder auf dem Teil selbst oder auf dem Datenblatt oder auf beiden.

Ich weiß, dass dies wie ein "Ist es eingesteckt?" erscheinen mag. Frage - aber ich persönlich wurde damit überrascht.

* BEARBEITEN *

Ugh, in meinem früheren Kommentar sagte ich, ich solle 0x80 schreiben -- was ich beabsichtigte, war, dass Sie versuchen, den Wert 0x40 oder 0x60 in den Datenleitungen zu halten.

Wenn sich herausstellt, dass die Pins vertauscht sind, würde das Schreiben von 0x40 Strom und Masse über die Datenpins an das LCD anlegen und ihm die Möglichkeit geben, seinen Selbst-Reset durchzuführen. Dies ist möglich, weil ein typisches LCD-Zeichenmodul nur etwa 1 bis 5 mA Strom zieht, was weit innerhalb der Treiberfähigkeit der meisten Ausgänge liegt.

Was ich vermute, ist, dass Sie während der Initialisierung des LCD für kurze Zeit einige 0x6X- und 0x4X-Werte auf Ihr LCD schreiben - und dass das LCD während dieser kurzen Zeit eingeschaltet wird. aber wenn Sie anfangen, andere Werte zu schreiben, schalten Sie es effektiv aus.

*ÄNDERN 2*

Beim Nachschlagen des Datenblatts eines anderen LCDs zur Überprüfung der aktuellen Anforderungen ist mir aufgefallen, dass Sie möglicherweise Ihre Vcc- und Vcontrast-Pins vertauscht haben. Kontrollieren Sie das unbedingt auch!

Ich habe gerade im NHT-C0220AZ-FWS-FTW-Datenblatt (wo Sie oben Ihre schematische Zeichnung erhalten haben) nachgesehen und gesehen, dass der Kontrast Pin 2 und die Versorgungsspannung Pin 3 ist. Dies ist die Umkehrung der Vishay- und Optrex-Teile, in denen Kontrast vorhanden ist ist Pin 3 und die Versorgungsspannung ist Pin 2.

Nun, zum Teufel, sogar der NHD-0420DZ-FSW-FBW von NewHaven hat Kontrast auf Pin 3 und Versorgung auf Pin 2.

Nun, ich bin direkt von ihrem Datenblatt ausgegangen, anstatt auf Erfahrungen aus der Vergangenheit zurückzugreifen, also bin ich richtig verkabelt. Aber wie es sich anhört, meint der technische Support, dass ich dieses LCD aufgrund inkompatibler Spannungspegel einfach nicht mit dem MSP430 verwenden sollte. Ich habe ein 3,3-V-Teil bestellt und das könnte alle meine Probleme lösen. Aber ehrlich gesagt verstehe ich immer noch nicht, warum eine 3,3-V-MCU mit diesem LCD nicht funktionieren würde.
In Bezug auf Ihre erste Bearbeitung glaube ich nicht, dass dies der Fall ist. Ich habe das LCD eingeschaltet, lange bevor ich meine Initialisierungsroutine durchlaufe.
Wenn ich mir das Datenblatt zu Ihrem speziellen Teil ansehe, stimme ich zu, dass es so aussieht, als könnte es (wenn auch an den Rändern) mit 3,3 V betrieben werden.