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!
Hier läuft noch etwas sehr falsch!
1 | lcd.init(); |
2 | lcd.init(); |
Was wird es wohl sein?
Hallo "Serial.print(voltage);" ohne "ln" könnte dein Problem vieleicht lösen. Gruß Rene
Hallo Änder mal
1 | lcd.println(voltage); |
zu
1 | lcd.print(voltage); |
da1l6
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
Dann sei doch so lieb und verrate wie die Lösung Deines Problems aussah.
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.
hannik46 schrieb: > Danke an alle > Jetzt klappt es > > Schönen Tag euch allen Juhu, es funktioniert! Und man kann nur erahnen weshalb. MfG
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.
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
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
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
:
Bearbeitet durch User
Beitrag #5865224 wurde von einem Moderator gelöscht.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.