LiquidCrystal - Seltsames Verhalten bei bestimmten Zeichen

Hallo zusammen,
ich habe hier ein (kleines?) Problem, bei dem ich nicht wirklich weiterkomme:

Bei der LCD-Ausgabe bestimmter Zeichen an LETZTER Stelle in einer Zeichenkette schalten sich die Displays selbstständig ab! Sie schalten sich erst wieder ein, wenn ich eine andere Zeichenkette ans Display sende, die am Ende KEINES der bestimmten Zeichen enthält.

Wie kann das sein?
An welcher Stelle habe bzw. mache ich einen Fehler??

Rahmenbedingungen zu diesen Fragen:

Angeregt durch “DOC_Arduino” habe ich mich etwas intensiver mit den kleinen LCD-Displays 16x2 und 20x4 beschäftigt. Ein sehr gut laufendes Programm ist z.B. eine DigiClock mit Datum und Wochentag. Diese Uhr lässt sich manuell stellen, aber auch per PC via serieller Schnittstelle synchronisieren. Ein anderes ist in Verbindung mit einer 5x5-Tastenmatrix ein Codeschloß: Man gibt ein vorher gespeichertes Passwort ein und das Programm schaltet je nach Eingabe auf “Okay” oder “Falsch”. Hierbei sind nicht nur Ziffern sondern auch ASCII-Zeichen möglich und der betreffende Bediener wird (bei korrektem Passwort) mit Namen begrüßt. Im Grunde laufen auch andere (Versuchs-) Programme recht fein und bringen letztendlich die Ergebnisse die mir vorschweben. So weit, so gut.

Bei der Entwicklung stolper ich aber immer wieder über eine Sache, bei der ich sehr weit “drum herum” programmieren muss und was die ganze Angelegenheit etwas SEHR mühsam macht. Mehr als nach meiner Meinung notwendig. Besonders dann, wenn ich “lcd.cursor()” oder “lcd.blink()” benutzen möchte.

  • Displays: LCM 1602 C (16x2, blau/weiß) und W204B-NLW (20x4, blau/weiß)
  • Bibliothek “LiquidCrystal.h” ist original aus der IDE
  • Getestete IDE sind 1.0.6, 1.6.0, 1.6.7 und ganz frisch 1.6.8
  • Die Pin-Nummern und Anschlüsse sind original dem “StarterKit” entnommen
  • Verbindungen sind recht kurz (deutlich unter 10cm) und fest als Shield verlötet
  • Abblockkondensatoren sind angeschlossen

Hier ein Beispiel-Sketch, der in allen Varianten direkt im Setup() bei der Begrüßung diese (nervige) Eigenheit aufweist:

#include <LiquidCrystal.h>
LiquidCrystal lcd( 12, 11, 5, 4, 3, 2 ); 
void setup()
{
  pinMode( 13, OUTPUT ); 
  lcd.begin( 16, 2 );       
  lcd.print( "Hallo Rudi" ); // WIRD NICHT ANGEZEIGT!!!
}                            // Ersetzt man aber "Hallo Rudi" durch 
void loop()                  // "Hallo Welt" funktioniert alles...
{  
   Herzschlag();
}
// Obligatorisch gegen jegliche delay(x)-Vers[e]uchung...
void Herzschlag()
{
  static unsigned long mS;
  if( millis() - mS >= 500 )
    {
      mS += 500;
      digitalWrite( 13, !digitalRead(13) );
    }
}

Und hier ein simpler HEX-Zähler, bei dem bei JEDER Ausgabe von 8 und 9 am ENDE ebenfalls wieder abgeschaltet wird:

#include <LiquidCrystal.h>
LiquidCrystal lcd( 12, 11, 5, 4, 3, 2 ); 
unsigned long old;
byte count;
void setup()
{
  pinMode( 13, OUTPUT ); 
  lcd.begin( 20, 4 );       
}                            
void loop()                  
{  
  Herzschlag();
  if( millis() - old >= 1000 )
    {
      old += 1000; 
      lcd.clear(); // Bei "x8" und "x9" wird ABGESCHALTET
      lcd.print( count++, HEX );
    }
}
// Obligatorisch gegen jegliche delay(x)-Vers[e]uchung...
void Herzschlag()
{
  static unsigned long mS;
  if( millis() - mS >= 500 )
    {
      mS += 500;
      digitalWrite( 13, !digitalRead(13) );
    }
}

Weitere Untersuchungen zeigten: Laut ASCII-Tabelle sind ALLE Zeichen davon betroffen, die in den Lower-4 Bit einen Wert ÜBER 0bxxxx0111 aufweisen. Also eine “8” am Ende ist 0x38, das “i” aus dem ersten Sketch ist 0x69 …und prompt werden beide Displays “schlafen gelegt”.

Kennt jemand die Begründung dafür?
Was habe ich in den Dokumentationen vielleicht überlesen?
Weiß jemand einen Rat, wie man das (auf einfache Weise) lösen könnte?

Danke fürs geduldige Lesen
Rudi

Nur ein Tipp:
Hast du schon eine andere Library probiert?

Nein, bisher noch nicht. Ich habe nur diejenigen vorliegen, die bei der originalen Installation mitgeliefert werden.

Versuche doch mal LiquidCrystalFast und LiquidCrystal_I2C
Letztere ist für I2C Huckepackplatinen günstig und die Fast kann 40x4 Displays ansteuern, kann aber auch alternativ zur normalen LiquidCrystal Version eingesetzt werden.
Tritt der von dir beobachtete Effekt auf, wenn eins der fraglichen Zeichen das Letzte in einer Zeichenkette ist, oder nur, wenn es auch noch an letzter Displayposition steht? Also Zeichen 16 oder 20? Tritt es in allen Zeilen auf, oder nur in den Geraden, bzw. Ungeraden?
Weil mir ist das noch nie aufgefallen. Möglicherweise weil ich sehr, sehr selten nur das letzte Zeichen nutze. Außerdem gibt es bei der 2. und 4. Zeile so "seltsame" Probleme mit der Adressierung. Es ist immer Offset 4 dabei. Wenn ich auf der 2. Zeile das erste Zeichen will, muß ich entweder -3 nehmen oder Pos. 17 Zeile 1 :astonished:
Man gewöhnt sich dran, aber ein bisschen buggy ist das schon :wink:

Ich habe "Hallo Rudi" mit meinem LCD ausprobiert, bissel andere Pinbelegung und 16 x 4 LCD:

LiquidCrystal lcd(12, 11, 10, 9, 8, 5);

Fluppt reibungslos.

@nix_mehr_frei:
Dieser Effekt taucht überall auf, egal auf welcher Zeile oder in welcher Spalte. Und ebenso bei beiden Displays. Im Grunde stört es nicht wirklich wenn ich einfach ein Blank nachsende. Doch wenn ich z.B. in einen bestehenden Text hineinschreiben will, dann kann das zu diesen Sorgen führen und ich muss Klimmzüge machen, wenn ich die Zeichen wieder darstellen will. Besonders eben in Verbindung mit "lcd.cursor()" und/oder "lcd.blink()", welche ich im Moment gar nicht einsetze.

Für andere LIBs muss ich erst mal auf die Suche gehen. I2C ist vielleicht eine Alternative, aber wenn, dann würde ich gerne erst mal das bestehende Problem entweder lösen oder eine deutliche Aussage dazu finden - und mir ggf. entsprechende Programmier-Gewohnheiten aneignen.

@Klaus_ww:
Eine andere Pin-Belegung werde ich nachher mal ausprobieren. Vielleicht beißt sich da in der Tat etwas.

Auch in der Lib "Keypad.h" hatte ich schon mal so einen seltsamen Effekt, wenn die Pins NICHT in einer zusammenhängenden Reihenfolge konfiguriert sind. Zumindest für die Spalten-Treiber. Da ich hier ein 5x5-Keypad UND ein 20x4-Display gerne parallel betreiben möchte, ist wohl noch einiges an Forschungsarbeit angesagt...

Ein Wackelkontakt ist nehme ich mal ab ausgeschlossen, nachdem du zwei Displays verkabelt hast.

I2C ist das einfachste wenn du sowieso Probleme mit der Anzahl der freien Pins hast

Hie findest du unter "Libraries" eine aktuell Lib für LDC-Displays.

Und wenn du I2C nimmst, sparst du auch Pins am Arduino.

Danke für die Hinweise, an I2C wage ich mich im nächsten Schritt heran. Zuerst werde ich aber dem von "Klaus_ww" gemachten Vorschlag mit den anderen Pin-Belegungen nachgehen und an Stelle meiner Lötarbeit eine "freie Verdrahtung" testen. Sollte sich dabei herausstellen, dass es DOCH eine Macke auf meinem Shield ist, dann kappiere ich gar nix mehr. Denn ich habe die Displays dort steckbar gemacht, um schnell zwischen dem einen oder anderen Versuch "umswitchen" zu können. Und die Ausgaben funktionieren ja, sogar selbst definierte Sonderzeichen... eigentlich... bis halt auf den Umstand, dass ich "manchmal" einen "Nachtritt" in Form eines Blanks senden muss...

Teste doch wenigstens die andere Library, das geht doch schnell.

Da wird doch jetzt der Hund in der Pfanne verrückt...

Der Hinweis auf die andere Pin-Konfiguration von "Klaus_ww" hat mich auf eine Fährte gebracht, die mir eine Lösung des Problems liefern könnte. Denn bei einer gesteckten Verdrahtung läuft alles auf einmal OHNE Macke! Ich glaube mein Shield hat doch 'ne Meise - aber die werde ich morgen oder so einfangen. Für heute habe ich mir genügend die Augen verdorben :wink: Dennoch wundere ich mich schon ein wenig, dass trotz offensichtlichem Verdrahtungsfehler eine "normale" Ausgabe aufs Display funktioniert grübel

dat is ja echt erstaunlich…

Nicht eine andere Lib. hat es gebracht, und an I²C kann ich zur Zeit noch nicht heran weil mir (noch) ein paar Grundlagen dazu fehlen. Diese Lücke fülle ich demnächst, zumal ich unter notorischen Pin-Mangel leide…

Aber der Hinweis von “Klaus_ww” hat es gebracht:

Ich habe mein (eigentlich) funktionierendes Shield heruntergenommen und die ganze Sache mit Steckstrippen verkabelt. Und siehe da: Es klappt! Auch die andere Pin-Konfiguration von Klaus. DAS aber erst brachte mich auf den Gedanken, meine Schaltung noch einmal “genauer” zu prüfen… Mehr Licht und eine gute Lupe zeigten mir dann, dass ein Haar feines Kupferfädchen einen Kurzschluß bewirkte… es war mit bloßen Augen fast nicht zu erkennen. Asche auf mein Haupt! Dieser Krümel sorgte dafür, dass LCD-Pin 14 (D3) auf HIGH “gezwungen” wurde - und dadurch die seltsamen Effekte auslöste. Dennoch haben es der Mega328p UND die Displays überlebt. Manchmal hat der Mensch auch etwas Glück! Seltsam alles dennoch, weil die vorherigen Programme trotzdem funktionierten. Aber wohl auch nur, weil ich (teilweise zufällig) “drum herum” programmiert hatte.

Ach herrjee, gerade lief im Radio “Queen > It’s A Kind Of Magic”, so fühle ich mich gerade mit den Displays und es macht jetzt total Laune, mit diesen Dingern zu experimentieren!

Wie auch immer, die nächsten Versuche stehen schon in den Startlöchern. Vielen herzlichen Dank für die nette Korrespondenz und die Hinweise auf I2C und GitHub. Kleine Ursache, große Wirkung. Mal sehen, womit ich demnächst wieder auftauche…
:slight_smile:

Bis denne und liebe Grüße
Rudi

Super, dass es jetzt funktioniert und alles noch in Takt ist. :wink:

Hier ein paar Beiträge über I2C.

Beispiel 2

Beispiel 3

RudiDL5:
"It's A Kind Of Magic"

Die Magie ist in Dir! Glückwunsch!

Zu I2C: Wenn Du nicht die einzelnen Bits selbst bespaßen willst, sondern Bibliotheken verwendest, ist das nicht so schlimm mit dem Verstehen. Wenn Du an PullUp-Widerstände (je ein 10k von SDA und SCL nach +5 V) denkst, kann kaum was schief gehen. :slight_smile:

Sehe gerade, bin nicht alleine mit I2C, das muß einen Grund haben :grin:

Hallo Rudi,

Glückwunsch auch meinerseits. Fehler gefunden. Hat sich gelohnt. Alles wird gut. :slight_smile:

I2C. Man sollte aber nicht wahllos Pullups verballern. Viele fertige Module, wie zum Bsp. die RTC3231 aus der Bucht haben schon je einen 4,7kOhm Pullup drauf. Das nur am Rande. Lieber vorher nachschauen oder nachmessen.

Hallöchen zusammen,
vielen Dank fürs Lob und die wertvollen Hinweise. :slight_smile:

Es ist wie so oft: Ganz winzige Ursachen - erzeugen große Wirkungen. Gut dass meine Komponenten diesen Bock überstanden haben. Vor allen Dingen, weil meine Programme ja “eigentlich” gut funktionierten… Egal, somit kann ich mich getrost auf die nächsten Dinge stürzen. Die Sache mit I2C werde ich in den nächsten Tagen direkt in Angriff nehmen, bei “parallel” angeschlossenen Displays plus 5x5 Keypad bleiben in der Tat nicht mehr viele Anschlüsse für den Rest übrig. Hier “schreit” mehr oder weniger alles nach Optimierung.

Bezüglich Verständnis I2C denke ich, dass ich das wohl im wesentlichen “gebacken” bekomme. Ich bin etwas vorbelastet durch “RTTY” und “Packet Radio” - hierbei war so etwas an der Tagesordnung und das hatte ich damals recht gut programmiert bekommen. Sollte ich wieder Probleme haben weiß ich ja, wo ich schreiben kann: “Hallo? Ich hätte da ma 'ne Frage…”
:smiley: :smiley:

Bis bald also
Rudi