Seltsame Probleme mit LCD (HD44780-kompatibel)

Ich versuche seit einigen Stunden, eine Schnittstelle mit einem HD44780-kompatiblen Display (16x2) herzustellen, bin aber auf einige seltsame Verhaltensprobleme gestoßen, die ich nicht lösen kann.

Mein Setup:

  • Ich verwende das LCD im 4-Bit-Modus (die oberen vier Bits, D4-D7, wie in allen Anleitungen, die ich gefunden habe, ist die Reihenfolge korrekt - ich habe es ein paar Mal überprüft).
  • Das LCD wird von einer geregelten 5-V-Versorgung betrieben. (Ich habe 3,3 V ausprobiert, gleiches Ergebnis, weniger Kontrast)
  • Die R/W-Leitung ist mit einem Pull-Down-Widerstand geerdet (fest im Schreibmodus).
  • Der Kontrast wird durch einen Topf eingestellt und ich kann die eine Reihe von Quadraten beim Start sichtbar machen.
  • Ich verwende sehr langsame Timings (~ 200 ms warten - hoch aktivieren - ~ 200 ms - Daten ändern - ~ 200 ms - niedrig aktivieren)

Meine Init-Sequenz:

(mit RS niedrig)

  • 0x03 - (dreimal) (als ein Nibble/Byte gesendet)
  • 0x02 – Vier-Bit-Modus aktivieren (als ein Nibble/Byte gesendet)
  • 0x28 - Funktionssatz (2 Zeilen, 4 Bit) (als zwei Nibbles gesendet, ms-Nibble zuerst)
  • 0x01 - Löschen (als zwei Nibbles gesendet)
  • 0x06 - Eingabemodus einstellen (Cursor beim Schreiben inkrementieren, keine Anzeigeverschiebung) (als zwei Nibbles gesendet)
  • 0x08 - Anzeige, Cursor und Blinken aus (als zwei Nibbles gesendet)
  • 0x0F - Anzeige, Cursor und Blinken an (als zwei Nibbles gesendet)

Hier passieren einige Dinge nicht wie erwartet:

  • Der Zweizeilenmodus scheint nicht aktiviert zu werden (keine dunklen Hintergrundquadrate in der zweiten Zeile, dort werden keine Zeichen geschrieben)
  • Klar passiert nicht
  • Der Cursor steht am Ende dieser Init-Sequenz im 3. statt im ersten Quadrat

Als nächstes versuche ich, einige Zeichen mit RS hoch zu schreiben, wobei ich 2 Nibbles pro Zeichen sende.

Auch hier bekomme ich ein seltsames Verhalten: Anstatt 1 Zeichen pro 2 Nibbles zu schreiben, schreibt es 2 (eins pro Nibble). Ich habe es durch die Zeichen 0-15 gehen lassen und ich bekomme zufällige Symbole (z. B. Schrägstrich) und japanische Zeichen. Alle von ihnen sind von zufälligen Stellen auf der Zeichentabelle, meistens die unterste Reihe, nicht in irgendeiner normalen Reihenfolge, aber es werden immer die gleichen Zeichen in der gleichen Reihenfolge gedruckt.

Meine Frage: Ich habe wirklich keine Ideen mehr, um das zu beheben. Übersehe ich irgendetwas Offensichtliches? Welche Probleme könnte ich haben und wie kann ich weiter debuggen?

Bearbeiten: Dies ist, was ich nach der Initialisierung auf meinem Bildschirm sehe, es kann hilfreich seinLCD nach Init

Bearbeiten 2:

Mein Hauptcode:

GPIOPin lcdEnablePin = PIN_B(11);
GPIOPin lcdRSPin = PIN_B(10);
GPIOPin lcdDataPins[] = {PIN_E(2), PIN_E(3), PIN_E(4), PIN_E(5)};

//Set all pins as outputs
GPIO::pinModeDigital(lcdEnablePin, 1);
GPIO::pinModeDigital(lcdRSPin, 1);
for(int i = 0; i < 4; i++)
 GPIO::pinModeDigital(lcdDataPins[i], 1);

GPIO::writePinDigital(lcdRSPin, 0); //Instruction register
lcdSendData4(lcdEnablePin, lcdDataPins, 2); //Enable 4 bit
lcdSendData8(lcdEnablePin, lcdDataPins, 40); //Function set, 2 line
lcdSendData8(lcdEnablePin, lcdDataPins, 1); //Clear and return home
lcdSendData8(lcdEnablePin, lcdDataPins, 2); //Entry Mode, Increment cursor position, No display shift
lcdSendData8(lcdEnablePin, lcdDataPins, 8); //All off
lcdSendData8(lcdEnablePin, lcdDataPins, 15); //All on

GPIO::writePinDigital(lcdRSPin, 1); //Data register
for(int i = 0; i < 16; i++) //Write test data, 4 bit because that's what seemed to work
 lcdSendData4(lcdEnablePin, lcdDataPins, i);

Meine SendData-Funktionen:

void lcdSendData4(GPIOPin lcdEnablePin, GPIOPin lcdDataPins[], char data)
{
 simpleBusy();

 //Set enable high
 GPIO::writePinDigital(lcdEnablePin, 1);

 simpleBusy();

 //Write data
 for(int i = 0; i < 4; i++)
  GPIO::writePinDigital(lcdDataPins[i], data & (1 << i));

 simpleBusy();

 //Falling edge
 GPIO::writePinDigital(lcdEnablePin, 0);
}

void lcdSendData8(GPIOPin lcdEnablePin, GPIOPin lcdDataPins[], char data)
{
 lcdSendData4(lcdEnablePin, lcdDataPins, data >> 4); //Send MSB
 lcdSendData4(lcdEnablePin, lcdDataPins, data); //Send LSB
}
Warten Sie ausreichend lange, bevor Sie mit dem Schreiben beginnen? Und welchen Wert hat der "Pulldown"-Widerstand?
Hast du die Zeiten im Datenblatt beachtet?
Sphero: Der Widerstand beträgt 1k
Ignacio: Ich habe kein Datenblatt für mein spezielles LCD, aber die von mir verwendeten Verzögerungen liegen weit über den im Datenblatt des HD44780 angegebenen Höchstzeiten. Wie ich in der Frage sagte, verbringe ich ungefähr 200 ms mit der Aktivierung hoch, ~ 200 ms, während Daten geschrieben werden, und ~ 200 ms nach der fallenden Flanke der Aktivierung.
Sind Sie sicher, dass die ersten drei 0x03 den 8-Bit-Modus nicht aktivieren? Im Datenblatt scheint es zwischen den Seiten 42 und 46 einige Unklarheiten zu geben.
Dieses Datenblatt hat ein schönes Flussdiagramm auf Seite 14 (beschriftet als 12), und es sagt, dass nur 0x02 0x02 0x08 benötigt wird.
Ich habe es auch ohne die 0x03s versucht und es hat leider keinen Unterschied gemacht. Ich habe gelesen, dass der Modus nur einmal eingestellt werden kann, aber ich habe auch gelesen, dass diese Folge von 0x03s ein spezieller "Hard Reset" ist. Außerdem habe ich versucht, die Stromversorgung des Displays physisch zu unterbrechen, es dann wieder anzuschließen und ein wenig zu warten, bevor ich die Init-Sequenz gestartet habe, um sicherzustellen, dass die erste Anweisung, die es erhält, der 4-Bit-Modus ist, der ebenfalls nicht geholfen hat. Danke an alle für eure bisherigen Vorschläge.
Ich habe ein Bild hinzugefügt, um zu zeigen, was passiert, nachdem init beendet ist. Die Ausgabe ist immer genau so.
Die Charaktere sind überhaupt nicht zufällig. Sie alle haben niedrigere vier Bits bei 1 1 1 1. Ich würde sagen, Sie befinden sich im 8-Bit-Modus und das untere Nibble wird von der Luft erfasst. Versuchen Sie, die D[0..3]-Pads mit Ihrem Finger zu berühren, und sehen Sie, ob sich die Zeichen ändern.
Endlich hat etwas funktioniert! Ich habe versucht, einen der zusätzlichen Datenpins zu erden, und alle Zeichen haben sich geändert. :) Interessant ist, dass die Reihenfolge nicht ganz dieselbe ist wie in der Zeichentabelle. Jetzt ist die Frage, wie stelle ich sicher, dass ich in den 4-Bit-Modus komme?
Vielleicht könnten Sie Ihren Quellcode hinzufügen, es könnte etwas mit dem Datentiming und der Formatierung nicht stimmen
Quelle habe ich hinzugefügt. Auch auf dieser Seite habe ich versucht, einen 10k-Pulldown bei der Aktivierung hinzuzufügen, um zu verhindern, dass er versehentlich ausgelöst wird, hat nicht geholfen. Ich kann morgen versuchen, alle Verbindungen neu zu löten, nur für den Fall.
Mann, ich finde keine Worte, um zu beschreiben, wie dumm ich mich gerade fühle. Ich sah mir noch einmal meine Verbindungen an und bemerkte, dass D6 und D5 von meinem Steckbrett zum LCD vertauscht waren. Jetzt funktioniert alles gut. Danke an alle für ihre Vorschläge, sorry für die Verwirrung. Venny - Sie sollten Ihre Anerkennung der Charaktere mit demselben oberen Nibble als Antwort hinzufügen, damit ich sie akzeptiere.

Antworten (4)

Bei einigen Modellen müssen Sie die Ersteinrichtungsbefehle mehrmals senden. Auch einige Modelle, die ich habe, verbrauchen Strom auf aggressive, gepulste Weise, haben also einen großen Kondensator in der Nähe der Stromversorgung (+ -) des LCD, um Stromschienenrauschen zu vermeiden.

Sie haben die E-Linie bisher nicht erwähnt.

E muss niedrig sein, dann Daten präsentieren, E hoch und dann niedrig setzen usw.

Willkommen im Forum! Und ja, das tat er. Es ist beim fünften Aufzählungszeichen (11. Zeile).
Ja, wie in der Frage erwähnt, mache ich das mit 200 ms Verzögerung zwischen jedem Schritt.

Haben Sie die notwendigen Verzögerungen bei der Initialisierung berücksichtigt? Laut Datenblatt müssen Sie nach dem Senden des ersten 0x3 mehr als 4,1 ms warten.

Willkommen bei EE.SE. Wir sind eher eine Q/A-Seite als ein Forum. Sie haben eine Antwort gepostet, die besser als Kommentar zur Frage geeignet wäre. Bitte versuchen Sie in Zukunft zu bedenken, dass die Antworten für eine größere, kompliziertere Unterstützung gedacht sind.
@Funkyguy IIRC StackExchange erlaubt es Benutzern mit weniger als 15 Punkten nicht, Kommentare abzugeben, sondern nur zu antworten. chamod hat wahrscheinlich alles getan, was ihm die Website zu dieser Zeit erlaubte. (das ist bei mir noch nicht lange her :)

Ich habe einmal eine Anzeige mit ähnlichem Verhalten erhalten. Ich musste es dreimal in den 8-Bit-Modus und dann noch einmal in den 4-Bit-Modus stellen, um es "wirklich" in den 4-Bit-Modus zu bringen. Nur so habe ich es im 4-Bit-Modus zum Laufen gebracht. Vielleicht hilft das.

Wenn sich die Anzeige im 4-Bit-Modus befindet, unterscheidet sich die obere und untere Hälfte jeder Transaktion nur davon, ob seit dem Umschalten der Anzeige auf den 4-Bit-Modus eine gerade oder ungerade Anzahl von Transaktionen stattgefunden hat. Das Umschalten auf 8 Bit und dann wieder zurück lässt Software und Display miteinander synchronisieren.