ich befasse mich seit einiger Zeit damit, ein 4 Zeilen Display zum "Laufen" zu bekommen bringen. Ich verwende das o.g. Display über einen TWI-Portexpander PCF 8574. Die Initialisierung funktioniert m.E. nach, denn ich kann Zeichen und Strings am LCD-Display ausgeben. Nur die Einstellung des 4-Zeilen Modus gelingt mir nicht ?????. Ich habe bisher noch nichts gefunden (Datenblatt des LCD' s / Foren etc.) wo das Ein und Ausschalten des RE Bits im Beispiel dargestellt wird. Zeichen und Strings kann ich zwar anzeigen, aber nur, wenn ich für die Zeilenanfangspositionen $06/$C0/$94/$D4 (je für Zeile 1-4) als Zeilen- Code sende. Mit $0/$20/$40/$60 springt der Cursor an undefinierte Stellen bzw. es werden wirre Zeichen angezeigt oder die Zeichenhintergründe werden hell. Das Tutorial und die Foren Beiträge habe ich auch schon gefunden und studiert, nur bisher nicht den entscheidenden Hinweis auf dieses ominöse RE-Bit. Finde ich irgendwo ein Codebeispiel in ASS. Die TWI-Ansteuerung ist nicht das Problem. Programmiert habe ich das Ganze in Assembler mit AVR Studio-4. Danke im Voraus für Eure Hilfe egerd
Da https://www.lcd-module.de/pdf/doma/dip204-4.pdf ist die Nutzung des RE-Bits auf Seite 2 dargestellt. Dort unter "extended function set" NW=1: 4-line display. Und dann kannst Du ggf. noch mal hier schauen: Beitrag "Re: LCD EA DIP204-4 Initialisieren"
Daran habe ich mich ja auch orientiert, es hat aber nichts gebracht. Dieses Re-Bit kann ich doch erst aktivieren, wenn ich im 4-Bit Modus bin, oder sehe ich das falsch?
egerd schrieb: > Dieses Re-Bit kann ich doch erst aktivieren, wenn ich im 4-Bit Modus > bin, oder sehe ich das falsch? Das hat erstmal nichts mit dem 4-Bit-Modus zu tun. Du kannst es aktivieren - dann steht Dir der erweiterte Modus zur Verfügung - und natürlich auch wieder deaktivieren. Aber nur wenn Du im erweiterten Modus bist /RE-Bit ist gesetzt) kannst Du den 4 Zeilen-Modus (ungleich 4-Bit-Modus) aktivieren. Das RE-Bit wird mit "Function Set" ein- und ausgeschaltet. Du solltest es auch nur dann einschalten, wenn Du es benötigst und danach gleich wieder ausschalten.
Gerd W. schrieb: > Zeichen und Strings kann ich zwar anzeigen, aber nur, wenn ich für die > Zeilenanfangspositionen $06/$C0/$94/$D4 (je für Zeile 1-4) als Zeilen- > Code sende. Mit $0/$20/$40/$60 springt der Cursor an undefinierte > Stellen bzw. es werden wirre Zeichen angezeigt oder die > Zeichenhintergründe werden hell. Hi, ist für mich jedenfalls völlig normal, dass man (mit wenigen Ausnahmen) "Locate"-Anweisungen der eigentlichen Daten/Text-Ausgabe voranstellt. Der Adressbereich der HD44780-kompatiblen Controller ist nicht für jedes Display so, dass der 80 Byte grosse Pufferbereich auch dargestellt wird. "...Da das Display oft kleiner als der Textpuffer ist, wird oft nur ein Ausschnitt des Puffers angezeigt..." http://www.sprut.de/electronic/lcd/index.htm#adressen ciao gustav
:
Bearbeitet durch User
Hallo Gustav, anhand deines beigefügten Bildes erkenne ich die gleichen Zeilen-Adressen welche ich auch durch Probieren auch herausbekommen habe, aber nicht 0h,20h,40h,60 was für den 'echten' 4_Zeilen Modus eingestellt werden sollte. wobei bei sprut.de wieder ganz andere Adressen angezeigt werden. Irgendwie werde ich daraus nicht schlau. Den 4_Zeilen Modus kann ich doch nur im 4-Bit Modus am LCD einstellen, wenn ich dort das RE Bit einschalte und danach wieder ausschalte, denn der Befehl für das Einschalten ist doch 0b0010_0100, also 0x24 dann 0x09 für den 4-Zeilen Modus und dann wieder 0x20 zum Ausschalten des RE-Bits. Dort brauche ich ja sowohl das High und das Low Nibble, um dieses Bit zu aktivieren. oder sehe ich das falsch? Bitte weiterhin um Hilfe, das muss doch funktionieren
Gerd W. schrieb: > oder sehe ich das falsch? Liest Du eigentlich, was ich Dir schreibe? RE-Bit einschalten (unabhängig vom 4- oder 8-Bit-Modus) "Function Set" RS 0, RW 0, 0b001xx1xx (x = egal, je nach Wunsch) Umschalten auf 4-zeilig "extended Function Set" RS 0, RW 0, 0b00001xx1 (x = egal ...) RE-Bit ausschalten (unabhängig vom 4- oder 8-Bit-Modus) "Function Set" RS 0, RW 0, 0b001xx0xx (x = egal, je nach Wunsch) Im von mir verlinkten Beitrag wird genau das gemacht (halt im 4-Bit-Modus, weil der Poster den 4-Bit-Modus gewählt hat):
1 | ldi temp,0b00100100 ;4-bit RE=1 |
2 | rcall lcd_command |
3 | |
4 | ldi temp,0b00001001 ; 4 Zeilen-Modus |
5 | rcall lcd_command |
6 | |
7 | ldi temp,0b00100000 ; 4-bit RE=0 |
8 | rcall lcd_command |
Gerd W. schrieb: > Programmiert habe ich das Ganze in Assembler mit AVR Studio-4. Hi, der komplette Initit-Code als Anhang gäbe Aufschluss. Vielleicht ist da noch eine Kleinigkeit übersehen worden. (Bei I2C kann die häufigste Fehlerquelle: Falsche Portbitzuordnung (Ena, Rs, RW) wohl ausgeschlossen werden.) Dieter F. schrieb: > rcall lcd_command wie sieht das aus im Code? Gerd W. schrieb: > RE-Bits. Dort brauche ich ja sowohl das High und das Low Nibble, um > dieses > Bit zu aktivieren. Es werden stets beide Nibble benötigt, sie werden lediglich gemäß den Anforderungen des Controller-Standards nacheinander gesendet. HD44780 und kompatible verlangen erst das high nibble, dann das low nibble. Von der MCU aus gesehen. Auch beim PIC TWI Portadapter ist das so. Nur die Steuerbits sind verpackt, verundet bzw. verodert und verlangen evtl- nach einer Extra-Ausgabe. Beitrag "Re: Anfänger Will ATtiny2313 mit Display uber I2C verbinden" ciao gustav
:
Bearbeitet durch User
Hallo Jim, ich habe das schon gelesen, aber ich kann dem nicht ganz folgen (bin ja wohl auch nicht der Einzige, der mit dem Erweiterungsbit Probleme hat) Im 8-Bit Modus kann ich das RE-Bit nicht einschalten, da ja das Low-Nibble (D0-D3 vom LCD) immer auf Gnd liegt, hab' s trotzdem probehalber natürlich ohne Erfolg probiert. Aber auch im 4-Bit Modus wird Zeile 1 und 3 weiß, d.h. ich komme m.E. nicht in den 4_Zeilen Modus. Vielleicht sollte ich mal meinen Code posten, ist aber bedingt durch die Ansteuerung über das Portexpander-TWI-Modul PCF 8574 ist das etwas unübersichtlicher als direkt über einen Port zu programmieren. Ich kann wie schon mehrfach gesagt, Zeichen und Strings darstellen und auch platzieren nur halt nicht an den Startpositionen 0h,20h,40h,60h und die weiteren Möglichkeiten nutzen, die man nach erfolgreicher Zuschaltung des RE-Bits noch hat. Habt trotzdem vielen Dank für Eure Unterstützung und vielleicht noch ein paar Hinweise. Danke im Voraus egerd
Hi, >Im 8-Bit Modus kann ich das RE-Bit nicht einschalten, da ja das >Low-Nibble (D0-D3 vom LCD) immer auf Gnd liegt Kopfschüttel, wie kommst du darauf das im 8 Bit Modus D0-D3 auf GND sind? Die must du schon ansteuern. Nee nee, Ideen haben die Leute.
Gerd W. schrieb: > ist aber bedingt durch die > Ansteuerung über das Portexpander-TWI-Modul PCF 8574 ist das etwas > unübersichtlicher als direkt über einen Port zu programmieren. Hi, die Steuerzeichensequenzen für die Initialisierung sind aber dieselben. Schau 'mal: Beitrag "Re: Anfänger Will ATtiny2313 mit Display uber I2C verbinden" Uwe schrieb: > Kopfschüttel, wie kommst du darauf das im 8 Bit Modus D0-D3 auf GND > sind? Von wo aus gesehen? Von der MCU aus oder vom LCD aus. Der MCU-Port kann "verdreht" werden, wird PortD beim ATtiny4313 genommen, muss man das sogar, denn der hat ein Bit weniger - nur 7-Bit Breite. Diese Portbitzuordnung wird durch die Software (das ASM-Programm) vorgenommen. So ist das Swappen mal im ersten Durchgang, anderweitig im zweiten Durchgang. Oder die Initroutine $03 oder $30. ciao gustav
:
Bearbeitet durch User
Gerd W. schrieb: > Im 8-Bit Modus kann ich das RE-Bit nicht einschalten, da ja das > Low-Nibble > (D0-D3 vom LCD) immer auf Gnd liegt, hab' s trotzdem probehalber > natürlich ohne Erfolg probiert. Wie wäre es, wenn Du mal Deinen Anschluss postest - also welcher Pin des PCF8574 ist mit welchem Pin des DIP204-4 verbunden. Langsam beschleicht mich das Gefühl, dass Du tatsächlich im 4-Bit-Modus arbeitest. In diesem Fall ist es ja auch O.K., dass D0 bis D3 auf GND liegen. Dann musst Du halt "nibble-weise" übertragen. Und ja - Dein Code wäre schon hilfreich ... dann könnte man sehen, ob Du alles korrekt machst ...
hallo, ich habe meine LCD_TWI.asm und den Anschlussplan des LCD' s an den PCF 8574 mal angefügt, hoffe, das es funktioniert. Bin neu im Forum. Die LCD Pins D0-D3 sind nicht wie ich dachte auf GND gelegt, sondern nicht am PCF 8574 angeschlossen auch nicht mit Widerstand nach 5V, was aber auf das gleiche hinausläuft. (siehe Anschlussplan). hoffe, man kann damit was anfangen
Hi, Du kannst mich ruhig Dieter nennen :-) Ich bin nicht der Assembler-Freak, aber das
1 | ; eigentliche Senderoutine für Init/Kommandos/Zeichen und Strings |
2 | |
3 | Senden: ;High & Low Nibble senden (X = H oder L) |
4 | andi temp,0b1111_0000 ;XXXX_0000 Maske rechtes Nibble ausblenden |
5 | or temp,OR_Maske ;XXXX_X1XX OR_Maske (Li/En=1/RW/DB x=1|0) |
6 | rcall TWI_Send ;Datenbyte mit E=H senden |
7 | andi temp,0b1111_1011 ;XXXX_X0XX AND_Maske (En=0) |
8 | rcall TWI_Send ;Datenbyte mit E=0 senden |
9 | ret
|
passt für mich nicht mit der KS0073-Spezifikation zusammen. Enable wird erst gesetzt, wenn die Daten am LCD-Port anliegen (und muss mindestens 800 ns gehalten werden). Das Halten wird wohl ausreichend durch die TWI_Send-Routine erfolgen - aber Du legtst nicht erst die Daten an und gibst dann das Enable-Signal - Du sendest beides gleichzeitig. Mir fehlen auch die mindestens 20ms Wartezeit nach dem Einschalten. Wenn Du das korrigiert hast kannst Du aus meiner Sicht in der Initialisierung den 4-Zeilen-Modus unmittelbar nach dem 4-Bit-Modus setzen.
1 | LCD_TWI_INIT:
|
2 | ldi or_Maske,0x0C |
3 | ldi count,0x03 ;3x wiederholen |
4 | m1: ldi temp,0x30 ;8_Bit Modus Li=0 EN=1 w=0 B=0 |
5 | rcall Senden |
6 | rcall P_4ms ;Pause 4ms |
7 | dec count |
8 | brne m1 |
9 | rcall P_4ms |
10 | |
11 | ;*** 4-Bit Modus senden (0x20) ********************** |
12 | ;*** und zusätzlich RE-Bit einschalten -> 0x24 |
13 | ;kein Restart, Bus bleibt belegt |
14 | ldi temp,0x24 ;4_Bit Modus RE=1 |
15 | rcall Senden ;senden |
16 | rcall P_39us |
17 | |
18 | ;*** 4-Zeilig einschalten (kein inverser Cusor, 5-dot font width) |
19 | ldi temp,0x09 ;4-Zeilig einschalten |
20 | rcall Senden ;senden |
21 | rcall P_39us |
22 | |
23 | ;*** RE-Bit wieder ausschalten |
24 | ldi temp,0x20 ;4_Bit Modus RE=0 |
25 | rcall Senden ;senden |
26 | rcall P_39us |
27 | |
28 | rcall twi_Stop |
29 | ret ;nach LCD_TWI_INIT |
Die P_39us habe ich dazu erfunden - die solltest Du einrichten. Gelten für fast alle Befehle, ausser "Clear Display" und "Return Home" - die brauchen 1,52 ms Wartezeit.
Hallo Dieter, vielen Dank für deine Hinweise, ich werde die Pausen mal einbauen und die Routinen nach deinen Vorschlägen versuchen anzupassen. Das muss doch mal funktionieren. Durch die TWI-Ansteuerung ist halt alles etwas komplizierter und ich bin auch nicht mehr der jüngste. Ist schon gut, wenn ein Zweiter sich die Sache mal ansieht, irgendwo kommt man sonst an einem Punkt nicht weiter. Also erst mal danke, ich werde es weiter austesten. Gerd
:
Bearbeitet durch User
Hi, Glaube nicht, dass man mit Zeitschleifen das Problem löst. Die LCDs sind da doch nicht so langsam wie vermutet. Die Verzögerungen müssen nur dann eingefügt werden, wenn man die Verarbeitungszeit abwartet (- interne Taktfrequenz des LCD liegt bei ca. 250 kHz!). Zum sicheren Anlegen der Daten am Port ist das Timing völlig unkritisch. Hauptsache der Enable-Impuls kommt nach Anlegen der Daten an den Port, und bis zur fallenden Flanke, die das LCD triggert, sind es ja noch ein paar NOPs mehr. Und die TWI/USI-Routinen sorgen allein schon für ausreichend lange Pausen. Bei mir sieht das dann bei ca. 4 MHz Taktfrequenz so aus. Zur Not reichen auch ein paar NOPs. Nehme an, die Befehlsfolgen als solche stimmen nicht mit denen überein, auf die das aktuelle LCD reagiert. Die Dokus sind auch oft nicht auf dem neuesten Stand. Die 8-Bit-Initialisierung ist eine absolute "quick and dirty Lösung", wenn man nicht weiter weiß. Und mit höheren MCD-Taktfrequenzen Probleme vermutet. ciao gustav
:
Bearbeitet durch User
Gerd W. schrieb: > Das muss doch mal funktionieren. Durch die TWI-Ansteuerung ist halt > alles etwas komplizierter Hi, der einzige Unterschied ist, dass man beim TWI (USI) die Steuerbits R/W, RS, Enable nicht durch "einfaches" sbi/cbi Portbitsetzen/löschen verändern kann. (Weil man ja nicht auf diese Portbits physisch zugreifen kann.) Man verpackt diese Bits in ein Achtbit-Format und macht eine Extra-Ausgabe dafür. Das heißt, die Bits werden ausmaskiert (ori für log. Eins und andi für log. Null). Damit das nicht mit den eigentlichen Daten kollidiert, muss man zwingend im Vierbit-Modus arbeiten. Von vorne herein sind die Portbits D0 bis D3 am PIC Portadapter nicht beschaltet. Beim Enable-Impuls wird also zweimal gesendet. Einmal mit ausmaskierter "Eins" und nach den NOPs (1000 ns) mit der ausmaskierten "Null". ciao gustav
:
Bearbeitet durch User
Hi, so sieht das LCD via den I2C/TWI-Portadapter die Signale. viel Spaß ciao gustav
Hallo an alle, Vielen Dank für Eure Unterstützung, aber jetzt ruft erst mal der Garten. Melde mich wieder, wenn ich weitergekommen bin. egerd
Dieter F. schrieb: > passt für mich nicht mit der KS0073-Spezifikation zusammen. > > Enable wird erst gesetzt, wenn die Daten am LCD-Port anliegen (und muss > mindestens 800 ns gehalten werden). Das Halten wird wohl ausreichend > durch die TWI_Send-Routine erfolgen - aber Du legtst nicht erst die > Daten an und gibst dann das Enable-Signal - Du sendest beides > gleichzeitig. Enable darf sogar auf high gesetzt werden bevor die Daten anliegen, und das beliebig lange. Laut Datenblatt vom KS0073 müssen nur RS und R/W gesetzt sein bevor E auf high gesetzt wird. Die Daten werden mit der fallenden Flanke von E übernommen. Es reicht wenn die gültigen Daten min. 300ns vor der fallenden Flanke von E anliegen.
Deine Initialisierung sieht so aus wie meine: - Drei (pseudo) 8-bit Befehle um sicher in den 8-bit-Modus zu schalten:
1 | 0x3 |
2 | 0x3 |
3 | 0x3 |
- ein (pseudo) 8-bit Befehl um in den 4-bit-Modus zu schalten:
1 | 0x2 |
- restliche Initialisierung (Ausgabe: High-Nibble dann Low-Nibble):
1 | 0x24 ; 4 bit Datenlänge, extension Bit RE=1 |
2 | 0x09 ; 4 Zeilen Modus |
3 | 0x20 ; 4 bit Datenlänge, extension Bit RE=0 |
4 | 0x0C ; Display ein, Cursor aus, blinken aus |
5 | 0x06 ; Cursor Auto-Increment |
Gerd W. schrieb: > Zeichen und Strings kann ich zwar anzeigen, aber nur, wenn ich für die > Zeilenanfangspositionen $06/$C0/$94/$D4 (je für Zeile 1-4) als Zeilen- > Code sende. Mit $0/$20/$40/$60 springt der Cursor an undefinierte > Stellen bzw. es werden wirre Zeichen angezeigt oder die > Zeichenhintergründe werden hell. Bist du sicher, dass es sich bei deinem LCD-Modul, wie im Betreff angegeben, um ein EA DIP204-4 handelt? Das EA DIP204-4 lässt sich direkt über SPI ansteuern. Hast du an deinem Controller kein SPI mehr frei, oder warum nimmst du den Umweg über einen I2C-Portexpander? PS.: Sind eigentlich
1 | Autor: Gerd Wolf (egerd) |
2 | Autor: egerd (Gast) |
3 | Autor: Gerd Wolf (gerd_w) |
4 | Autor: Gerd W. (egerd) |
ein und dieselbe Person?
John schrieb: > Enable darf sogar auf high gesetzt werden bevor die Daten anliegen, > und das beliebig lange. Da muss ich Dir Recht geben - die fallende Flange ist entscheident. Ich suche mir eine Ecke, in welcher ich mich schämen kann ...
Gerd W. (egerd) bin ich (auch die anderen), hatte mich zuerst in einem anderen Thread als Gast angemeldet. Zu SPI, den Portexpander hatte ich schon am LCD angelötet, nachdem ich das Teil gekauft hatte und möchte es ungern wieder alles entlöten. Jetzt mache ich erst mal Sommerpause (Garten). Danach werde ich mich weiter damit befassen. Also nochmals Dank für Eure Tipps. Ich melde mich wieder. egerd
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.