Forum: Mikrocontroller und Digitale Elektronik HD44780 LCD am Arduino - häufige Bildstörungen, zu lange Kabel?


von Björn C. (bcordes)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein großes Problem mit meinem HD44780 Display.
Es ist an einem Arduino Uno Rev. 3 angeschlossen. Der Kabelweg zum 
Display ist 110 cm lang und kann auch leider nicht verkürzt werden. 
Kabeldurchmesser: 0.35 mm².

Das Display soll den Zustand meiner Alarmanlage anzeigen, also finden 
nur selten (10 mal pro Tag) Aktualisierungen des Displays statt. Dies 
ist auch so im Arduino Sketch implementiert, es wird nur bei 
Statusänderungen auf das Display geschrieben.

Leider passiert es häufig, dass bei Aktualisierungen auf dem Display 
falsche Zeichen angezeigt werden. Danach bekomme ich bis zum Reset auch 
keine vernünftige Ausgabe mehr aufs Display.
In dem Bild seht ihr, was mir das Display dann anzeigt.

Über die 5V Stromversorgung für das Display wird außerdem noch eine 
Relaiskarte geschaltet (wird für Signalgeber benötigt).

Was ich schon versucht habe: 100 nF Kondensatoren parallel zur 
Stromversorgung von Display und Relaiskarte angeschlossen und 100 Ohm 
Widerstand in Reihe zur E-Leitung des Displays. Leider hat es wenig 
geholfen.


Ich freue mich auf eure Ideen!

Gruß Björn

von Benedikt S. (benedikt_s)


Lesenswert?

http://www.miniinthebox.com/de/iic-i2c-2-5-blue-screen-lcd-display-modul-fuer-arduino_p1141469.html
sowas in der art dann hast du nur noch 2 Leitungen die gestört werden 
könnten.

von Troll (Gast)


Lesenswert?

...Schaltplan,
...Programm,
...sonstige Nebenbedingung
?

...also also das übliche für die Glaskugel!

von aSma>> (Gast)


Lesenswert?

Servus,
arbeitest du mit einen i2c bus oder nur mit Gpio´s?

Sonst würde ich beim i2c bus die Baudrate runterschrauben und bei Gpio 
Ansteuerung müsset du die Timings (delays) ein wenig anpassen.

Bei 10 Werten pro Tag ist es wohlmachbar.

mfg

von Dieter S. (Gast)


Lesenswert?

Die Leitung zu deinem Display ist def. viel zu lang.
Da kommen haufenweise Störungen rein. Das wirst du durch Kondensatoren 
kaum verhindern können.

Die Idee von Benedikt ist genau richtig, allerdings ist die Kabellänge 
für I2C auch schon recht lang, nur kann man das, wenn noch Störungen 
auftreten, durch weitere IC's (Portextender P82B715) verlängern.

Damit wirst du dein Problem mit den Störungen los.

von Werner M. (Gast)


Lesenswert?

Dieter S. schrieb:
> allerdings ist die Kabellänge für I2C auch schon recht lang

Das kann man so oder so sehen.

NXP spricht in seiner AN10658 bei 100 Metern Länge von "long 
communications cables", wenn es um I2C geht.
http://www.nxp.com/documents/application_note/AN10658.pdf

von Björn (Gast)


Lesenswert?

Hallo,

momentan ist das Display per GPIO angeschlossen. Ich hatte mir schon 
gedacht, dass das Kabel dafür zu lang ist, weil die 2. Steuerung (wo das 
Displaykabel nur 20 cm hat) einwandfrei funktioniert.

Danke für den Tipp mit I2C, habe mir gestern noch drei Adapter bestellt.


Die Timings kann ich beim Arduino nicht verändern, soweit ich weiß.


Gruß Björn

von Wolfgang (Gast)


Lesenswert?

Björn schrieb:
> Die Timings kann ich beim Arduino nicht verändern, soweit ich weiß.

Warum nicht?
Auf deinem Arduino Board werkelt höchstwahrscheinlich ein ganz normaler 
Microkontroller von Atmel. Die Dinger kann man programmieren und dann 
manchen die genau was man ihnen gesagt hat (wenn die Hardware stabil 
läuft).

von Georg G. (df2au)


Lesenswert?

Björn schrieb:
> Die Timings kann ich beim Arduino nicht verändern

Selbstverständlich kannst du das Timing ändern. Du musst dich nur von 
den mitgelieferten Software Schablonen lösen und selbst programmieren.
Aber dein Problem ist weniger das Timing, es sind die verschliffenen 
Flanken deiner Signale, bedingt durch das viel zu lange Kabel.

von Björn (Gast)


Lesenswert?

Achso, ich arbeite mit der normalen Arduino IDE, das ist mir momentan 
genug Programmierung.

von Carl D. (jcw2)


Lesenswert?

Versuch mal in die langen Leitungen Serienwiderstände einzubauen. So 
33/47/100Ω (Größenordnung). Das besänftigt die Flanken und ist einfach 
auszuprobieren.

von Wolfgang (Gast)


Lesenswert?

Georg G. schrieb:
> Selbstverständlich kannst du das Timing ändern. Du musst dich nur von
> den mitgelieferten Software Schablonen lösen und selbst programmieren.

So arg muss man es gar nicht treiben. Ein paar NOPs zwischen Setzen der 
Datenleitungen und Übernahmeflanke bei der LCD-Ausgabe dürfen schon 
reichen, falls es an Signalverschmierungen liegt.
Ein Oszi hilft da Wunder, um das zu beurteilen. Aber Trial&Error führt 
vielleicht auch irgendwann zum Ziel.

von aSma>> (Gast)


Lesenswert?

Servus,
du könntest auf ein weniger capazitives Kabel umsteigen. Schneide ein 
Lan Kabel auf (cat5). Hat ja 8 Adern :).

Laut Datenblatt heißt es:
Enable rise/fall timetEr, tEf    max 20ns.

mfg

von Joachim B. (jar)


Lesenswert?

oder erhöhe die Treiberleistung

2,2k bis runter 560 Ohm pullups am Ende des Kabels (LCD) sollte die 
kapazitive Umladung wieder schneller machen.

Timing verlängern wie schon vorgeschlagen geht natürlich auch.

: Bearbeitet durch User
von aSma>> (Gast)


Lesenswert?

Joachim B. schrieb:
> oder erhöhe die Treiberleistung
>
> 2,2k bis runter 560 Ohm pullups am Ende des Kabels (LCD) sollte die
> kapazitive Umladung wieder schneller machen.
>
> Timing verlängern wie schon vorgeschlagen geht natürlich auch.

Servus,
er hat KEIN i2b bus, sondern normale Gpio Ansteuerung.

Aber du hast einerseits recht, man kann die Gpio Ausgänge als open drain 
deklarieren und mit Pullups arbeiten.

Aber ich denke das übersteigt das Wissen des TE´s.

mfg

von aSma>> (Gast)


Lesenswert?

Joachim B. schrieb:
> Timing verlängern wie schon vorgeschlagen geht natürlich auch.

aSma>> schrieb:
> Laut Datenblatt heißt es:
> Enable rise/fall timetEr, tEf    max 20ns.

Ja, das timing bringt nichts, wenn die Flanke mau ist :(.

von Dieter S. (Gast)


Lesenswert?

Wenn dir die Erfahrung fehlt, solltest du nicht an der Hardware 
rumbasteln. Mach es mit I2C, das ist deutlich einfacher und wird bei der 
Kabellänge auch ohne Änderungen funktionieren.
Sollte das mit der Länge von 1 Meter nicht funktionieren, kannst du 2 
von den Portexpander zwischenschalten. Wie schon geschrieben.

von Wolfgang (Gast)


Lesenswert?

Dieter S. schrieb:
> Wenn dir die Erfahrung fehlt, solltest du nicht an der Hardware
> rumbasteln.

Und was genau spricht jetzt gegen die Verlängerung des Schreibzyklus für 
das Display, damit trotz kapazitiver Belastung bei der Latch-Flanke 
stabile Pegel anliegen bzw. der Latch-Puls überhaupt voll zwischen den 
Logikpegeln hin- und her schaltet?

von Dieter S. (Gast)


Lesenswert?

Wolfgang schrieb:
> Dieter S. schrieb:
> Wenn dir die Erfahrung fehlt, solltest du nicht an der Hardware
> rumbasteln.
>
> Und was genau spricht jetzt gegen die Verlängerung des Schreibzyklus für
> das Display, damit trotz kapazitiver Belastung bei der Latch-Flanke
> stabile Pegel anliegen bzw. der Latch-Puls überhaupt voll zwischen den
> Logikpegeln hin- und her schaltet?

Warum interpretierst du mein Post verkehrt?
Ich habe nicht dagegen gesprochen.

von Wolfgang (Gast)


Lesenswert?

Dieter S. schrieb:
> Warum interpretierst du mein Post verkehrt?
> Ich habe nicht dagegen gesprochen.

Du hast sogar für eine Änderung der Hardware und Verwendung eines ganz 
anderen Bus-Systems plädiert, statt erstmal der einfachen Lösung mit dem 
gezielten Plazieren von ein paar NOPs eine Chance zu geben ;-)

von Dieter S. (Gast)


Lesenswert?

Wolfgang schrieb:
> Dieter S. schrieb:
> Warum interpretierst du mein Post verkehrt?
> Ich habe nicht dagegen gesprochen.
>
> Du hast sogar für eine Änderung der Hardware und Verwendung eines ganz
> anderen Bus-Systems plädiert, statt erstmal der einfachen Lösung mit dem
> gezielten Plazieren von ein paar NOPs eine Chance zu geben ;-)

Dann solltest du bitte mal den kompletten Post lesen. Da steht: Wenn dir 
die Erfahrung fehlt...
Und nicht "Du musst..."
Letztendlich überlasse ich die Entscheidung immer dem User.

von Carl D. (jcw2)


Lesenswert?

Wolfgang schrieb:
> Dieter S. schrieb:
>> Warum interpretierst du mein Post verkehrt?
>> Ich habe nicht dagegen gesprochen.
>
> Du hast sogar für eine Änderung der Hardware und Verwendung eines ganz
> anderen Bus-Systems plädiert, statt erstmal der einfachen Lösung mit dem
> gezielten Plazieren von ein paar NOPs eine Chance zu geben ;-)

Oder der genauso simplen Platzierung von ein paar Serienwiderständen in 
den vermutlich "klingelnden" Leitungen und/oder Abschlußwiderständen am 
LCD-Ende der Leitung. Beides bedämpft die durch die Leitungen gebildeten 
Schwingkreise. Und es behebt, anders als die NOP's das eigentliche 
physikalische Problem.

von Björn (Gast)


Lesenswert?

Hallo,

ich werde erst mal die I2C Verbindung testen, da mir die Kabeleinsparung 
sehr gelegen kommt. Momentan habe ich nämlich fast alle Ports des 
Arduino belegt.

Einen 100 Ohm Widerstand hatte ich schon in der E-Leitung getestet, aber 
es hat nichts bewirkt.
Wenn I2C auch nicht geht, werde ich nochmal auf die Basteleien mit 
Widerständen und Software-Anpassungen zurückkommen.
Ich möchte aber am liebsten eine Lösung, bei der man nah am Standard 
bleiben kann.

Danke und Gruß

von Björn C. (bcordes)


Lesenswert?

Hallo,

seit dem Umbau auf I2C Verkabelung sind keine Bildfehler mehr 
aufgetreten.
Leider ist das Display jetzt nicht mehr so kontrastreich wie vorher, 
aber da kann man wohl nichts machen...

von Uwe (de0508)


Angehängte Dateien:

Lesenswert?

Hallo Börn,

hier ist noch eine weitere Anregung.

Wenn ich ein abgesetztes LCD benötige, dann nutze ich ein serielles 
Datenprotokoll, wie 600Bit/s - 460800Bit/s,none,8,1 ein.
Evtl. muss ich noch RS232 Pegelkonverter einsetzen oder bei kleineren 
Entfernungen reichen auch TTL Pegel mit 0V und +5V aus.

Die Idee und der Befehlssatz stammt aus
"Parallax Serial LCD Product Guide"
https://www.parallax.com/downloads/parallax-serial-lcd-product-guide

Meine Firmware ist mit dem dargestellten Befehlssatz kompatibel und hat 
noch eine Erweiterung in Richtung Ausgabe von Morse-Zeichen erhalten.

Durch die Firmware kann man u.a. auch kleine Musikstücke zum Atmel 
übertragen und abspielen lassen. Die Tongenerierung erfolgt, wie im 
Original auch, über PWM., deshalb auch der "harte" Klang.

: Bearbeitet durch User
von Dieter S. (Gast)


Lesenswert?

Björn C. schrieb:
> Hallo,
>
> seit dem Umbau auf I2C Verkabelung sind keine Bildfehler mehr
> aufgetreten.
> Leider ist das Display jetzt nicht mehr so kontrastreich wie vorher,
> aber da kann man wohl nichts machen...

Der Kontrast ändert sich durch die u.U. veränderte Spannung am LCD.

Das kannst du durch ändern der Potieinstellung anpassen.
Wenn kein Poti vorhanden ist, müssen die Festwiderstände dazu geändert 
werden.

von Björn C. (bcordes)


Lesenswert?

Hallo,

es ist ein Poti vorhanden.
Aber auch bei der besten Einstellung ist der Kontrast leider etwas 
schlechter als bei direkter Verbindung mit dem Arduino.

von Falk B. (falk)


Lesenswert?

Dann hast du noch einen Fehler in deiner Anschaltung. SOOO hochohmig 
können die Leitungen nicht sein, das bei den paar mA nennenswerte 
Spannungsabfälle entstehen. Poste ein gutes Bild des realen Aufbaus.

von Chris M. (yoblid) Benutzerseite


Lesenswert?

Björn C. schrieb:
> seit dem Umbau auf I2C Verkabelung sind keine Bildfehler mehr
> aufgetreten.
> Leider ist das Display jetzt nicht mehr so kontrastreich wie vorher,
> aber da kann man wohl nichts machen...

Vermutlich wird nun deine Anzeige mehrmals pro Sekunde gelöscht und neu 
beschrieben, was zur Abnahme des Kontrastes führt.
Schau dir mal die Anzeigeroutine an.

von Björn C. (bcordes)


Lesenswert?

Das könnte natürlich sein. Wäre dann ja ein systembedingtes Problem bei 
I2C.
Mein Programm habe ich mit/für "Arduino" geschrieben und es sendet nur 
ganz selten Aktualisierungen ans Display.

Kann man die Frequenz für die Displayaktualisierung ggf. reduzieren oder 
gibt es andere Ideen?

von Joachim B. (jar)


Lesenswert?

Björn C. schrieb:
> Kann man die Frequenz für die Displayaktualisierung ggf. reduzieren oder
> gibt es andere Ideen?

schreib die Routinen selber, reserviere dir Platz für deine 2 Zeilen und 
Zeichen, char zeile1[] usw.

schreibe in zeile1 und 2 und aktualisiere nur 2-4x pro Sekunde, in einer 
ISR ein LCDupdate flag setzen, in der loop nur neu schreiben wenn die 
Zeit reif ist.

Statt LCD komplett löschen ist es besser nur die benötigten Zeichen zu 
überschreiben notfalls mit <SPACE> 0x20 oder 32

von Dieter S. (Gast)


Lesenswert?

Besteht das Problem auch, wenn das Display direkt am Arduino betrieben 
wird, also ohne Kabel dazwischen.
Mir ist so nicht bekannt, dass sich der Kontrast über I2C verändert.
Hast du mal die Spannung am Display gemessen?
Du verwendest doch auch die Hintergrundbeleuchtung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.