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
Mein LCD mit I2C Interface funktioniert mit meiner AVR
Programmiersprache.
Also liegt es an deinem Programm.
Tipp: Man kann KEINE Binärdaten direkt ausgeben!
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
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.
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.
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
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.
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.
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
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.
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.
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
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.
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
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.
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.
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