Forum: Mikrocontroller und Digitale Elektronik I2C Display zeigt komische Zeichen


von hannik46 (Gast)



Lesenswert?

Hallo
Ich habe heute ein I2C Display an einen Arduino Nano angeschlossen.
Wenn ich Text anzeigen lasse funktioniert es ohne Probleme.
Wenn ich allerdings Werte anzeigen lassen, zeigt es hinter dem Wert zwei 
komische Felder an.
Als Test hatte ich den ReadAnalogVoltage Sketch genommen.
Kann man etwas dagegen tun ? und wenn ja wie ?
Hoffe ihr könnt mir helfen

Danke schon mal im vorraus

von Karl M. (Gast)


Lesenswert?

Mein LCD mit I2C Interface funktioniert mit meiner AVR 
Programmiersprache.
Also liegt es an deinem Programm.

Tipp: Man kann KEINE Binärdaten direkt ausgeben!

von Karl M. (Gast)


Lesenswert?

Hier läuft noch etwas sehr falsch!
1
lcd.init();
2
lcd.init();

Was wird es wohl sein?

von Rene Z. (renezimmermann)


Lesenswert?

Hallo

"Serial.print(voltage);" ohne "ln" könnte dein Problem vieleicht lösen.

Gruß Rene

von da1l6 (Gast)


Lesenswert?

Hallo


Änder mal
1
lcd.println(voltage);
zu
1
lcd.print(voltage);

da1l6

von hannik46 (Gast)


Lesenswert?

Karl M. schrieb:
> Hier läuft noch etwas sehr falsch!
> lcd.init();
> lcd.init();
> Was wird es wohl sein?

Hallo
Dies stand so im HelloWorld Test Sketch so
ich probiere es mal anders

von hannik46 (Gast)


Lesenswert?

Danke an alle
Jetzt klappt es

Schönen Tag euch allen

von Thomas M. (langhaarrocker)


Lesenswert?

Dann sei doch so lieb und verrate wie die Lösung Deines Problems aussah.

von Karl M. (Gast)


Lesenswert?

Er hat
1
Serial.println(voltage);
 zu
1
Serial.print(voltage);
 geändert.
Den Tipp mit den Binärdaten hat er nicht verstanden.

Ein LCD kann in den 4Bit Modus - in der Regel! - nur einmalig 
initialisiert werden, da hier eine besondere Ansteuerfolge mit passendem 
Zeitverhalten notwendig ist.

von Christian S. (roehrenvorheizer)


Lesenswert?

hannik46 schrieb:
> Danke an alle
> Jetzt klappt es
>
> Schönen Tag euch allen

Juhu, es funktioniert! Und man kann nur erahnen weshalb.

MfG

von Wolfgang (Gast)


Lesenswert?

Karl M. schrieb:
> Ein LCD kann in den 4Bit Modus - in der Regel! - nur einmalig
> initialisiert werden, da hier eine besondere Ansteuerfolge mit passendem
> Zeitverhalten notwendig ist.

Falsch, die Initialisierung in den 4-Bit Modus muss unabhängig davon 
funktionieren, in welchem Zustand es vorher war.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Christian S. schrieb:
> Juhu, es funktioniert! Und man kann nur erahnen weshalb.

 Haben ihm Rene Z.  und da1l6 schon nach 7 Minuten erklärt.

: Bearbeitet durch User
von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Wolfgang schrieb:
> Falsch, die Initialisierung in den 4-Bit Modus muss unabhängig davon
> funktionieren, in welchem Zustand es vorher war.

Hi, full ack,
welche LCDisplays wurden benutzt?
Diese mit dem TWI_I2C-PIC-Adapter sind nichts anderes als HD44780 
kompatible.
Man muss lediglich die Steuerbits wie Enable und R/S etc, die sonst über 
Extra-Portbits geführt werden geschickt in die TWI-I2C-Routine 
softwaremäßig verpacken.

An der Initialisierungsroutine an sich hat sich rein überhaupt nichts 
geändert, ergo kann man auch im laufenden Betrieb "uminitialisieren" zum 
Beispiel, um den CGRAM-Inhalt zu "shiften" etc. oder "Cursor move" 
ändern.

ciao
gustav

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Wolfgang schrieb:
> Karl M. schrieb:
>> Ein LCD kann in den 4Bit Modus - in der Regel! - nur einmalig
>> initialisiert werden, da hier eine besondere Ansteuerfolge mit passendem
>> Zeitverhalten notwendig ist.
>
> Falsch, die Initialisierung in den 4-Bit Modus muss unabhängig davon
> funktionieren, in welchem Zustand es vorher war.

Kann Sie nicht!

Ich sehe, Du hast evtl. noch keine Bibliothek für 4-Bit Lcd-Ansteuerung 
geschrieben und diese auf 1 - 4 zeiligen Displays getestet.

Da der LCD Controller - nach der 4 Bit Datenbusinitialisierung - einen 
anderen internen Zustand, reagiert er "anders", wenn er nur ein 4 Bit 
Nibble erhält anstatt die Beiden auf einanderfolgenden.

Wenn Du eine allgemeingültige Lösung hast, dann freue ich mich diese zu 
erlernen.

von Karl M. (Gast)


Lesenswert?

Karl B. schrieb:
> An der Initialisierungsroutine an sich hat sich rein überhaupt nichts
> geändert, ergo kann man auch im laufenden Betrieb "uminitialisieren" zum
> Beispiel, um den CGRAM-Inhalt zu "shiften" etc. oder "Cursor move"
> ändern.

Das ist nicht das selbe, wenn man für ein LCD die Darstellung von 
Cursor, Scroll, Shift, Blink oder Unterstrich schaltet.

Das erfolgt erst nachdem der Datenbus auf den 4 Bit oder 8 Bit Modus, 1- 
(andere Zeichengröße) oder 2 Zeilen eingestellt wurde.

von hannik46 (Gast)


Lesenswert?

Guten Abend
Danke für die ganzen Tipps
Ich hatte einfach
lcd.println(voltage); zu lcd.print(voltage) geändert.
Das ich dort nur ein mal lcd.init(); geschrieben hatte anstatt zwei mal 
hat keine Veränderung gebracht.
Allerdings verstehe ich nicht wieso ich so ironische Kommentare bekomme.
Ich habe eine normale Frage gestellt.
Trotzdem Danke an alle die mir richtige Tipps gegeben haben.

Schönen Abend

von Wolfgang (Gast)


Lesenswert?

Karl M. schrieb:
> Ich sehe, Du hast evtl. noch keine Bibliothek für 4-Bit Lcd-Ansteuerung
> geschrieben und diese auf 1 - 4 zeiligen Displays getestet.

Ich habe auch das Rad noch nicht erfunden.

> Da der LCD Controller - nach der 4 Bit Datenbusinitialisierung - einen
> anderen internen Zustand, reagiert er "anders", wenn er nur ein 4 Bit
> Nibble erhält anstatt die Beiden auf einanderfolgenden.

Deshalb musst du vom worst Case ausgehen. FunctionReset (0x30) benutzt 
nur die oberen 4 Bit, so dass er das Kommando unabhängig vom Mode 
verstehen kann. Wenn der Controller dann in einem definierten Mode ist, 
geht es wie im Datenblatt beschrieben in den gewünschten Mode.

von Manfred (Gast)


Angehängte Dateien:

Lesenswert?

da1l6 schrieb:
> Änder mallcd.println(voltage);zulcd.print(voltage);

Schade, dass die Zitierfunktion des Forums die code-tags nicht mitnimmt.

"lcd.println" wird von der Arduino-IDE klaglos compiliert. Wie bei 
serial.print, dürfte es dem Datum $0d $0a anhängen und ist für LCD 
vermutlich sinnlos.

Ich gucke in die Zeichensatztabelle eines China 1602 und sehe dort, dass 
$0x den Bereich benutzerdefinierter Zeichen adressiert, wobei der auch 
noch spiegelt, MSB wird ignoriert.

"lcd.println" kommt in keinem meiner Programme vor. Ich setze fast immer 
die Cursorposition und schreibe nur Teile des Displays, alles andere 
gibt unnötige Flackerei.

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Wolfgang schrieb:
> Deshalb musst du vom worst Case ausgehen. FunctionReset (0x30) benutzt
> nur die oberen 4 Bit, so dass er das Kommando unabhängig vom Mode
> verstehen kann.

Hi,
D0 bis D3 sind garnicht belegt.
Bei einigen Displays werden, um sicher zu gehen, diese Portbits fest mit 
GND verbunden, damit logisch "0" 100%-ig erreicht wird. Es ist 
vollkommen gleichgültig, ob durch Software oder feste Verdrahtung eine 
logische "0" entsteht. Wobei wir wieder bei der leidigen Diskussion 
wären, was man mit den vier unteren Portbits macht. Genaueres dazu steht 
im jeweiligen Datenblatt. In den meisten Fällen lässt man diese 
Anschlüsse für den Fall der regulär verwendeten Vierbitansteuerung 
unbeschaltet. Genauso wie hier.

Karl M. schrieb:
> Ich sehe, Du hast evtl. noch keine Bibliothek für 4-Bit Lcd-Ansteuerung
> geschrieben und diese auf 1 - 4 zeiligen Displays getestet.

Siehe Video.

Auf ausdrücklichen Wunsch poste ich gerne den zugehörigen ASM-Code.

ciao
gustav

von Nosnibor (Gast)


Lesenswert?

Karl M. schrieb:
> Da der LCD Controller - nach der 4 Bit Datenbusinitialisierung - einen
> anderen internen Zustand, reagiert er "anders", wenn er nur ein 4 Bit
> Nibble erhält anstatt die Beiden auf einanderfolgenden.
>
> Wenn Du eine allgemeingültige Lösung hast, dann freue ich mich diese zu
> erlernen.

Der übliche Weg ist, zuerst drei einzelne Command-Nibble mit dem 
Umschaltbefehl auf den 8bit-Modus zu senden. Danach ist das Display im 
8bit-Modus, egal in welchem Zustand es vorher war. Dann sendet man den 
Befehl zum Umschalten auf 4bit, und dann geht es normal (immer zwei 
Nibble für ein Byte) weiter.

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Hi,
mehrere Möglichkeiten des Nibble-Vertauschens und der Portausnutzung 
sind möglich von Seiten der CPU aus gesehen.

Beitrag "Re: HD44780+PIC18F25k22 Rise Time Probleme?"

Das Display aber will seinerseits immer nur die oberen 4 Datenbits 
zuerst.
Das ist im HD44780-Standard festgelegt.
Andersherum kommen solche Bildchen heraus wie oben.
Und zweimal "Enable"-Impuls bei Vierbitmodus
auch bei Busyflagabfrage, eine Dummy-Abfrage nicht vergessen.

ciao
gustav

: Bearbeitet durch User
Beitrag #5865224 wurde von einem Moderator gelöscht.
von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Ich bin 100% sicher, dass man die Displays mehrfach initialisieren kann. 
Mann muss es nur so tun, wie im Datenblatt des HD44780 beschrieben ist, 
dann geht das auch.

Alles andere wäre auch gaga. Zum Beispiel müsste man das Gerät während 
der Entwicklung sonst immer kurz stromlos schalten, anstatt normal zu 
resetten bzw. per Debugger neu zu starten.

Im angehängten Screenshot Step 2 und 3 sind die drei Zugriffe zu sehen, 
die Nosnibor meinte.

Dabei lässt man die Leitungen DB0 bis DB3 unbeschaltet - das steht 
übrigens auch im Datenblatt. Ich verstehe gar nicht, warum darüber immer 
wieder kontrovers diskutiert wird.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Manfred schrieb:
> "lcd.println" wird von der Arduino-IDE klaglos compiliert. Wie bei
> serial.print, dürfte es dem Datum $0d $0a anhängen und ist für LCD
> vermutlich sinnlos.

Dann ist es aber nicht richtig implementiert. Es sollte den String 
schreiben und dann zum Anfang der nächsten Zeile springen.
Ganz korrekt wäre es, wenn LF eine Zeile nach unten rutscht und CR zum 
Anfang der Zeile springt.
Diese LCD Library scheint also etwas halbgar zu sein.

von Stefan F. (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch der Ablauf mit Timing

von Karl B. (gustav)


Angehängte Dateien:

Lesenswert?

Stefanus F. schrieb:
> Ich bin 100% sicher, dass man die Displays mehrfach initialisieren kann.

Hi,
das ist sogar die Regel, denn das Display vollführt einen Power On Self 
Reset nach Anlegen der Betriebsspannung, vorausgesetzt, er erfolgt mit 
einer bestimmten "Flankensteilheit". Ganz schleichendes Hochfahren von 
Vcc geht also nicht. (Das bedeutet, möglichst kein zu großer Elko direkt 
an der Displayversorgungsspannung.)
Und im POSR werden genau die Init-Schritte durchgeführt, die hinterher 
nochmal vom µP hinterhergeschoben werden.
Der POSR endet "sinnigerweise" mit dem Ausschalten des Displays.
Um etwas dargestellt zu bekommen, muss dann das Display per 
Ansteuersoftware "eingeschaltet" werden. Dass dann nochmal der µP 
nachinitialisiert, ist auch deswegen nötig, weil man dann den 
4-Bit-Modus haben und nicht im 8-Bit-Modus stecken bleiben möchte.


ciao
gustav

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.