I2C Display zeigt komische Zeichen

Gast #5864003
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
Gast #5864026
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.
Gast #5864079
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.
#5864151
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
Angehängte Dateien:
Gast #5864179
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.
Gast #5864183
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.
Gast #5864185
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
Gast #5864330
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.
Gast #5864384
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.
Angehängte Dateien:
#5864669
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
Angehängte Dateien:
Gast #5864758
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.
#5865206
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
Angehängte Dateien:
Beitrag #5865224 wurde von einem Moderator gelöscht.
Gast #5865231
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.
Angehängte Dateien:
(Firma: matzetronics) #5865235
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.
#5865676
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren