HD44780 A00 und createChar

Hallo Freunde!

bin neu hier und finde das Forum (und Arduino) aber richtig Klasse! :)

Bin gerade dabei eine MFA Anzeige fürs Auto zu "entwickeln" und bin jetzt eben auf ein Problem mit meinem LCD gestoßen.

ich bekomme keine eigenen Zeichen dargestellt, alle Zeichen ausm Datenblatt hingegen werden einwandfrei dargestellt.

das LCD HD44780u mit A00 Rom http://www.adafruit.com/products/498

und verwende Testweise diesen Code:

...

byte A[8] = {B1110,B11011,B11011,B11111,B11011,B11011,B11011,B0}; byte I[8] = {B01100, B01100, B01100, B01100, B01100, B01100, B01100, B00000}; byte R[8] = {B11110,B11011,B11011,B11110,B11011,B11011,B11011,B0};

...

lcd.createChar(0, A); lcd.createChar(1, I); lcd.createChar(2, R);

lcd.print((char)0); lcd.print((char)1); lcd.print((char)2);

hab das alles noch mit einem zweiten LCD (mit I2C von Sainsmart) probiert und da funktionierts einwandfrei.

hab schon alles mögliche versucht und bekomme das einfach nicht hin... Suchmaschine läuft schon heiß.

Beste Grüße und vielen Dank im vorraus :)

Orestos

Möchtest du auch noch eine Frage stellen? Hab keine gelesen... ;)

Code solltest du erst einmal in die richtigen Code-Tags setzen, dann wirds etwas übersichtlicher für uns Leser. Am besten wäre es natürlich, wenn der gesamte, zumindest der relevante Code gepostet wird. So vermisse ich bspw. ein lcd.begin, was in der setup()- und was in der loop()-Funktion steht ist auch nicht ersichtich. Untypisch finde ich den Aufruf lcd.print((char)0);, hast du statt dessen mal lcd.write(0); probiert?

aber selbstverständlich:

ich möchte wissen wie ich Zeichen, mit diesem LCD, vorgeben kann.

lcd.write(0); - funktioniert seit IDE 1.0 nicht mehr. deswegen lcd.print((char)0);

#include <LiquidCrystal.h>
#include <Wire.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

byte A[8] = {B1110,B11011,B11011,B11111,B11011,B11011,B11011,B0};
byte I[8] = {B01100, B01100, B01100, B01100, B01100, B01100, B01100, B00000};
byte R[8] = {B11110,B11011,B11011,B11110,B11011,B11011,B11011,B0};

void setup() {

lcd.begin(20, 4);
lcd.home ();

lcd.createChar(0, A);
lcd.createChar(1, I);
lcd.createChar(2, R);

lcd.println((char)0);
lcd.println((char)1);
lcd.println((char)2);
}

void loop() {

}

das Ding spinnt gewaltig :0

zuerst hat er nur "||||" statt den Zeichen angezeigt.

anschließend hab ich LCDBitmap ausprobiert... (was nur zu etwa 90% korrekt angezeigt wurde)

dann zeigte er krumme Striche als ich meine Zeichen anzeigen wollte.

JETZT(aus unerklärbaren Gründen):

wenn ich den obenstehende Code ausführe zeigt er NICHTS.

blende ich durch //* folgenden part aus:

lcd.createChar(0, A); lcd.createChar(1, I); lcd.createChar(2, R); *//

zeigt er die Zeichen! aber eher so:

[ZeichenX] [Leer] [Zeichen2]

beispiel:

A R

oder

I R

oder

R R

Mache ich etwas falsch oder ist das Ding defekt??

EDIT: er zeigt das Zeichen nun beinah hinter jeder beschriebenen Zeile. Auch wenn keine eigenen Zeichen verwendet werden.

Orestos: lcd.createChar(0, A); lcd.createChar(1, I); lcd.createChar(2, R); ... hab das alles noch mit einem zweiten LCD (mit I2C von Sainsmart) probiert und da funktionierts einwandfrei.

Wenn es mit anderen LCDs funktioniert und mit dem einen nicht, würde ich ein Timing-Problem vermuten.

Erster Versuch:

lcd.createChar(0, A); delayMicroseconds(100); lcd.createChar(1, I); delayMicroseconds(100); lcd.createChar(2, R); delayMicroseconds(100);

Wenn es mit den kleinen Delays immer noch nicht funktioniert, dann kontrolliere mal Deine LiquidCrystal Library, ob da dieser Code für die pulseEnable-Funktion drinsteht:

(Datei: LiquidCrystal.cpp) void LiquidCrystal::pulseEnable(void) { digitalWrite(_enable_pin, LOW); delayMicroseconds(1); digitalWrite(_enable_pin, HIGH); delayMicroseconds(1); // enable pulse must be >450ns digitalWrite(_enable_pin, LOW); delayMicroseconds(100); // commands need > 37us to settle }

Sieht die Funktion bei Dir in der Library genau so aus, oder sind da eventuell kürzere Delays drin?

hat leider keine Besserung gebracht. Display zeigte heute nach dem Anschließen übrigens wieder “||||” hinter jeder Zeile statt der Zeichen.

nach dem ausführen des Codes hatte ich aber immernoch das Problem mit

A R
I R
R R

in der pulseEnable Funktion steht folgendes:

//
// pulseEnable
void LiquidCrystal::pulseEnable(void)
{
// There is no need for the delays, since the digitalWrite operation
// takes longer.
digitalWrite(_enable_pin, HIGH);
waitUsec(1); // enable pulse must be > 450ns
digitalWrite(_enable_pin, LOW);
}

//
// write4bits
void LiquidCrystal::writeNbits(uint8_t value, uint8_t numBits)
{
for (uint8_t i = 0; i < numBits; i++)
{
digitalWrite(_data_pins*, (value >> i) & 0x01);*

  • }*
  • pulseEnable();*
    }[/quote]

Orestos:
in der pulseEnable Funktion steht folgendes:

//
// pulseEnable
void LiquidCrystal::pulseEnable(void)
{
// There is no need for the delays, since the digitalWrite operation
// takes longer.
digitalWrite(_enable_pin, HIGH);
waitUsec(1); // enable pulse must be > 450ns
digitalWrite(_enable_pin, LOW);
}

Das sieht ja ein bisschen anders aus als die Version der Funktion, die ich gepostet habe.

Ich würde mal Deine Funktion testweise auskommentieren und die von mir gepostete Funktion in den Code der Library reinnehmen.

Oder mal nach der neuesten Version der Library suchen und diese statt der vorhandenen Version installieren.

Hab bereits die neuste.

Hab den Part mit deinem überschrieben und bekomme nun folgende Fehlermeldung:

HelloWorld.cpp.o: In function setup': C:\Users\lNx\ARDUINO\arduino-1.0.2-windows\arduino-1.0.2/HelloWorld.ino:13: undefined reference toLiquidCrystal::begin(unsigned char, unsigned char, unsigned char)'

EDIT: die selbe Fehlermeldung bekomme ich auch mit älteren Librarys.

Das Display macht ganz mittlerweile wirkürliche Sachen seit ich mit createChar experimentiert habe, auch wenn ich keine createChar o.ä. Anweisungen verwende.

hier z.B.(der Code enthält keine createChar o.ä. Anweisungen, die Zeichen hinter den Zahlen sind nicht erwünscht.):

das passiert wenn ich im o.g. Text den folgenden part ausblende:

lcd.createChar(0, A); lcd.createChar(1, I); lcd.createChar(2, R);

das passiert wenn ich ihn wieder einblende:

und wenn ich ihn anschließend wieder ausblende passiert das:

sollte in das display reklamieren? Speicher defekt?

Orestos: Hab den Part mit deinem überschrieben und bekomme nun folgende Fehlermeldung:

HelloWorld.cpp.o: In function setup': C:\Users\lNx\ARDUINO\arduino-1.0.2-windows\arduino-1.0.2/HelloWorld.ino:13: undefined reference toLiquidCrystal::begin(unsigned char, unsigned char, unsigned char)'

EDIT: die selbe Fehlermeldung bekomme ich auch mit älteren Librarys.

Kann es vielleicht sein, dass jetzt die LiquidCrystal-Library gar nicht mehr kompiliert werden kann, weil Du beim Austauschen der pulseEnable-Funktion irgendwas falsch eingebaut hast?

An LiquidCrystal::begin hast Du doch gar nicht herumgebastelt, aber das dürfte die erste Funktion der Library sein, die Du aufrufst. Das deutet darauf hin, dass LiquidCrystal gar nicht mehr richtig kompiliert wird und demzufolge auch nicht in Dein Programm aufgenommen wird.

sorry hab was vertauscht. die erste Fehlermeldung kommt mit älterer Library.

wenn ich die PulseEnable-Funktion mit der deiner austausche bekomme ich folgende Fehlermeldung:

C:\Users\lNx\ARDUINO\arduino-1.0.2-windows\arduino-1.0.2\libraries\LiquidCrystal\LiquidCrystal.cpp:279: error: expected constructor, destructor, or type conversion before ‘(’ token
C:\Users\lNx\ARDUINO\arduino-1.0.2-windows\arduino-1.0.2\libraries\LiquidCrystal\LiquidCrystal.cpp:280: error: expected constructor, destructor, or type conversion before ‘(’ token
C:\Users\lNx\ARDUINO\arduino-1.0.2-windows\arduino-1.0.2\libraries\LiquidCrystal\LiquidCrystal.cpp:281: error: expected constructor, destructor, or type conversion before ‘(’ token
C:\Users\lNx\ARDUINO\arduino-1.0.2-windows\arduino-1.0.2\libraries\LiquidCrystal\LiquidCrystal.cpp:282: error: expected constructor, destructor, or type conversion before ‘(’ token
C:\Users\lNx\ARDUINO\arduino-1.0.2-windows\arduino-1.0.2\libraries\LiquidCrystal\LiquidCrystal.cpp:283: error: expected constructor, destructor, or type conversion before ‘(’ token
C:\Users\lNx\ARDUINO\arduino-1.0.2-windows\arduino-1.0.2\libraries\LiquidCrystal\LiquidCrystal.cpp:284: error: expected constructor, destructor, or type conversion before ‘(’ token
C:\Users\lNx\ARDUINO\arduino-1.0.2-windows\arduino-1.0.2\libraries\LiquidCrystal\LiquidCrystal.cpp:285: error: expected declaration before ‘}’ token

Orestos: wenn ich die PulseEnable-Funktion mit der deiner austausche bekomme ich folgende Fehlermeldung:

Wenn Du das Austauschen der einzelnen Funktion nicht hinbekommst, installiere Dir diese Library: https://github.com/adafruit/LiquidCrystal

Das ist die Version die ich verwende und aus der die gepostete pulseEnable-Funktion mit den Delays stammt.

Vielleicht hilft's!

auch die Library zeigt leider keine Änderung.

Orestos: auch die Library zeigt leider keine Änderung.

Hm, irgendwie löscht Du auch nirgends das LCD, das passiert beim Reset nicht von alleine. Und im Programmierbeispiel zur Verwendung selbstdefinierter Zeichen steht die Zeichendefinition vor lcd.begin(), bei Dir ist es anders herum.

Versuch's mal mit diesem Code in dieser Reihenfolge, der erst die Sonderzeichen definiert, dann lcd.begin() startet, dann die vorherige Anzeige erstmal löscht, bevor etwas neues ausgegeben wird:

void setup() {
lcd.createChar(0, A);
lcd.createChar(1, I);
lcd.createChar(2, R);
lcd.begin(20, 4);
lcd.clear();  

lcd.print(char(0));
lcd.print(char(1));
lcd.print(char(2));
 }

ok hab den code so umgebaut

es kommt aber immer noch das bei raus:

und wenn ich anschließend einen anderen Code ausführe in dem ich keine createChar Anweisungen benutze kommt das bei raus:

Orestos:
ok hab den code so umgebaut

es kommt aber immer noch das bei raus:

OK, mal das erste Bild betrachtet: Der Code soll drei Zeichen in der ersten Zeile des Displays ausgeben.
Und bei Dir werden dreimal drei Zeichen in verschiedenen Zeilen ausgegeben.

Kann es sein, dass Deine Verdrahtung wackelig ist und irgendwo Wackelkontakte bei den Verbindungen Arduino<=>LCD vorhanden sind?

Denn dass bei Dir mehr Zeichen ausgegeben werden als der Code hergibt, im Beispiel des ersten Bildes gleich dreimal soviel Zeichen wie nach dem Löschen des Displays an die Ausgabe geschickt werden, sieht mir nicht ganz geheuer aus.

[Nachtrag] Und Du hast auch ganz bestimmt den von mir geposteten Code genau so getestet, mit “print()” und nicht etwa “println()”?

Also:

lcd.print(char(0));
lcd.print(char(1));
lcd.print(char(2));

Und NICHT:

lcd.println(char(0));
lcd.println(char(1));
lcd.println(char(2));

???

DOCH! ich verwende lcd.println(); - sorry wenn ich Dich verwirrt habe.

wenn man das erste Bild betrachtet soll folgendes ausgegeben werden:

A I R

was mittlerweile (warum auch immer) auch ausgegeben wird. Nur das "||R" dahinter ist falsch.

betrachtet man das zweite Bild wird auch alles korrekt dargestellt. Bis eben auf das "||R" dahinter.

ursprünglich hatte ich das Problem dass er überhaupt falsche Zeichen mit createChar-Anweisungen angezeigt hatte. Das hat sich mittlerweile, aus urerklärbaren Gründen, aber erledigt. Nun zeigt er halt das "||R" zuviel an.

aber selbst das klappt nur meistens, nicht immer.

Orestos: DOCH! ich verwende lcd.println(); - sorry wenn ich Dich verwirrt habe.

println() hängt am Ende der Ausgabe immer selbständig zwei Steuerzeichen dran: CR/Ascii-13/\r und LF/Ascii-10/\n.

Das sind dann deine zwei unerwünschten Matsch-Zeichen in der Anzeige hinter dem auszugebenden Zeichen.

Ausgaben über mehrere Zeilen des LCD-Displays NICHT mit println() machen, sondern alle Ausgaben nur mit print()!

Und wenn eine Ausgabe in die nächste Zeile soll, dann platzierst Du den Cursor in der Zeile darunter und machst dort die nächste Ausgabe mit print().

void setup() {
lcd.createChar(0, A); // Erzeuge Sonderzeichen A
lcd.createChar(1, I); // Erzeuge Sonderzeichen I
lcd.createChar(2, R); // Erzeuge Sonderzeichen R
lcd.begin(20, 4); // Starte LCD
lcd.clear();   // Loesche LCD, Cursor 0,0
lcd.print(char(0)); // Sonderzeichen A ausgeben
lcd.setCursor(0, 1); // Cursor in naechste Zeile
lcd.print(char(1)); // Sonderzeichen I ausgeben
lcd.setCursor(0, 2);  // Cursor in naechste Zeile
lcd.print(char(2)); // Sonderzeichen R ausgeben
 }

aaaaaaaahhhhhhh! scheiße ^^ bins vom java gewohnt :blush:

Danke :slight_smile:

jetzt muss ich das jetzt hinkriegen dass die Zeichen immer angezeigt werden -.- das klappt noch nicht 100%

aber bin jetzt dank Dir wesentlich weiter!!! Vielen vielen Dank für deine geduldige Hilfe :slight_smile:

Nachtrag: nun funktioniert alles einwandfrei :slight_smile: