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:
Meine Init-Sequenz:
(mit RS niedrig)
Hier passieren einige Dinge nicht wie erwartet:
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 sein
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
}
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.
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.
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.
Spehro Pefhany
Ignacio Vazquez-Abrams
tehwalris
tehwalris
Venny
Venny
tehwalris
tehwalris
Venny
tehwalris
Venny
tehwalris
tehwalris