PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EA Dogm204-a ansteuern



demmy
26.12.2014, 13:09
Hallo zusammen,

hat jemand von euch schon mal erfolgreich ein dogm204-a lcd angesteuert und zum laufen gebracht?

Ich bekomme es nicht hin. Ich würde es gerne im 4bit Modus betreiben.
Ich habe die Initialisierung genau wie im Datenblatt S.5 beschrieben durchgeführt, aber ich bekomme es noch nicht mal initialisiert.

http://www.lcd-module.de/fileadmin/pdf/doma/dogm204.pdf

Nach dem Initialisieren müsste ich doch irgendwo mal den Cursor blinken sehen oder?

Die Bascom internen Funktionen kann man für das Display nicht zufällig verwenden oder?

Ich hoffe Ihr könnt mir helfen?

Viele Grüße

BMS
26.12.2014, 15:30
Hallo,
speziell dieses Display habe ich noch nicht verwendet, jedoch Grafikdisplays des gleichen Herstellers ; außerdem Textdisplays von anderen Herstellern mit HD44780-Controller.
Zeige doch mal deinen Programmcode, fischen wir hier im Trüben und können keine hilfreichen Tipps geben oder Fehler suchen.
Grüße, Bernhard :Weihnacht

demmy
26.12.2014, 15:57
Hi,

ja sicher, hier is mein code:



$regfile = "M1284pdef.dat"
$crystal = 14745600

$hwstack = 100
$swstack = 100
$framesize = 200

' LCD
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.6 , Wr = Portc.5
'Config Lcdbus = 4
Config Lcd = 20 * 4a

' #PortC

' PINC.0 = LCD / DB7
Lcd_db7 Alias Portc.0
Config Lcd_db7 = Output
Lcd_db7 = 0

' PINC.1 = LCD / DB6
Lcd_db6 Alias Portc.1
Config Lcd_db6 = Output
Lcd_db6 = 0

' PINC.2 = LCD / DB5
Lcd_db5 Alias Portc.2
Config Lcd_db5 = Output
Lcd_db5 = 0

' PINC.3 = LCD / DB4
Lcd_db4 Alias Portc.3
Config Lcd_db4 = Output
Lcd_db4 = 0

' PINC.4 = LCD / E
Lcd_e Alias Portc.4
Config Lcd_e = Output
Lcd_e = 0

' PINC.5 = LCD / R/W
Lcd_rw Alias Portc.5
Config Lcd_rw = Output
Lcd_rw = 0

' PINC.6 = LCD / RS
Lcd_rs Alias Portc.6
Config Lcd_rs = Output
Lcd_rs = 0

' PINC.7 = LCD / Reset
Lcd_reset Alias Portc.7
Config Lcd_reset = Output
Lcd_reset = 1 ' Reset ausschalten

Declare Sub Lcd_befehl(byval Befehl As Byte)
' Befehl Bitmaske: 7=0 , 6=0 , 5=Rs , 4=R/W , 3=Db7, 2=Db6 , 1=Db5 , 0=Db4
Declare Sub Lcd_enable


do

' LCD INITIALISIEREN
if init = 0 then
init = 1

' Synchronize1:
Call Lcd_befehl(&B00000011)
Call Lcd_enable
Call Lcd_befehl(&B00000011)
Call Lcd_enable
' Synchronize2: Switcht to 4 bit data length
Call Lcd_befehl(&B00000011)
Call Lcd_enable
Call Lcd_befehl(&B00000010)
Call Lcd_enable
' Function Set: 4 bit data length extension
Call Lcd_befehl(&B00000010)
Call Lcd_enable
Call Lcd_befehl(&B00001010)
Call Lcd_enable
' Extended function: 4 line display
Call Lcd_befehl(&B00000000)
Call Lcd_enable
Call Lcd_befehl(&B00001001)
Call Lcd_enable
' Entire mode set:
Call Lcd_befehl(&B00000000)
Call Lcd_enable
Call Lcd_befehl(&B00000110)
Call Lcd_enable
' Bias setting:
Call Lcd_befehl(&B00000001)
Call Lcd_enable
Call Lcd_befehl(&B00001110)
Call Lcd_enable
' Function Set:
Call Lcd_befehl(&B00000010)
Call Lcd_enable
Call Lcd_befehl(&B00001001)
Call Lcd_enable
' Internal OSC:
Call Lcd_befehl(&B00000011)
Call Lcd_enable
Call Lcd_befehl(&B00001011)
Call Lcd_enable
' Follower control:
Call Lcd_befehl(&B00000110)
Call Lcd_enable
Call Lcd_befehl(&B00001110)
Call Lcd_enable
' Power control
Call Lcd_befehl(&B00000101)
Call Lcd_enable
Call Lcd_befehl(&B00000111)
Call Lcd_enable
' Contrast set:
Call Lcd_befehl(&B00000111)
Call Lcd_enable
Call Lcd_befehl(&B00000100)
Call Lcd_enable
' Function set:
Call Lcd_befehl(&B00000010)
Call Lcd_enable
Call Lcd_befehl(&B00001001)
Call Lcd_enable
' Display on, cursor on, blink on
Call Lcd_befehl(&B00000000)
Call Lcd_enable
Call Lcd_befehl(&B00001111)
Call Lcd_enable

end if

Loop


' LCD BEFEHL

Sub Lcd_befehl(byval Befehl As Byte)

' Befehl Bitmaske: 7=0 , 6=0 , 5=Rs , 4=R/W , 3=Db7, 2=Db6 , 1=Db5 , 0=Db4

' Db4
Lcd_db4 = Befehl.0
' Db5
Lcd_db5 = Befehl.1
' Db6
Lcd_db6 = Befehl.2
' Db7
Lcd_db7 = Befehl.3
' R/W
Lcd_rw = Befehl.4
' Rs
Lcd_rs = Befehl.5

End Sub

Sub Lcd_enable

Lcd_e = 1
Waitus 400
Lcd_e = 0
Waitms 2

End Sub



Ich hoffe du kannst da was rauslesen?

Viele Grüße

demmy
27.12.2014, 13:30
Hi, also es funktioniert leider immer noch nicht.
Ich habe jetzt nochmal mein Programm überarbeitet. Das sieht nun so Aus:



$regfile = "M1284pdef.dat"
$crystal = 14745600

' #PortC

' PINC.0 = LCD / DB7
Lcd_db7 Alias Portc.0
Config Lcd_db7 = Output
Lcd_db7 = 0

' PINC.1 = LCD / DB6
Lcd_db6 Alias Portc.1
Config Lcd_db6 = Output
Lcd_db6 = 0

' PINC.2 = LCD / DB5
Lcd_db5 Alias Portc.2
Config Lcd_db5 = Output
Lcd_db5 = 0

' PINC.3 = LCD / DB4
Lcd_db4 Alias Portc.3
Config Lcd_db4 = Output
Lcd_db4 = 0

' PINC.4 = LCD / E
Lcd_e Alias Portc.4
Config Lcd_e = Output
Lcd_e = 0

' PINC.5 = LCD / R/W
Lcd_rw Alias Portc.5
Config Lcd_rw = Output
Lcd_rw = 0

' PINC.6 = LCD / RS
Lcd_rs Alias Portc.6
Config Lcd_rs = Output
Lcd_rs = 0

' PINC.7 = LCD / Reset
Lcd_reset Alias Portc.7
Config Lcd_reset = Output
Lcd_reset = 0 ' Reset ausschalten

dim init as bit

do

if init = 0 then
init = 1

call lcd_initialisieren

end if
Loop

Sub Lcd_initialisieren

' Reset:
Lcd_reset = 1
Waitms 200
Lcd_reset = 0
Waitms 200
Lcd_reset = 1
Waitms 200

' Synchronize1:
Call Lcd_befehl(&H30)
Waitus 1
' Synchronize1:
Call Lcd_befehl(&H30)
Waitus 1
' Synchronize1:
Call Lcd_befehl(&H30)
Waitus 1
' Synchronize2:
Call Lcd_befehl(&H20)
Wait 1
' Function Set: 4 bit data length extension
Call Lcd_befehl(&H2a)

' Extended function: 4 line display
Call Lcd_befehl(&H09)

' Entire mode set: Bottom View
Call Lcd_befehl(&H06)

' Bias setting: BS1=1
Call Lcd_befehl(&H1e)

' Function Set: 4-Bit data length extension Bit RE=0; IS=1
Call Lcd_befehl(&H29)

' Internal OSC: BS0=1 -> Bias=1/6
Call Lcd_befehl(&H1b)

' Follower control: Devider on and set value
Call Lcd_befehl(&H6e)

' Power control: Booster on and set contrast (BB1=C5, DB0=C4)
Call Lcd_befehl(&H57)

' Contrast set: (DB3-DB0=C3-C0)
Call Lcd_befehl(&H72)

' Function set: 4-Bit data length extension Bit RE=0; IS=0
Call Lcd_befehl(&H28)

' Clear display:
Call Lcd_befehl(&H01)

' Set Cursor Position:
Call Lcd_befehl(&H80)

' Display on, cursor on, blink on:
Call Lcd_befehl(&H0f)

End Sub

Sub Lcd_bits_setzen(byval Datenbyte As Byte)

' Datenbyte Bitmaske: 7=0 , 6=0 , 5=0 , 4=0 , 3=DB7, 2=DB6 , 1=DB5 , 0=DB4

' Db4
Lcd_db4 = Datenbyte.0
' Db5
Lcd_db5 = Datenbyte.1
' Db6
Lcd_db6 = Datenbyte.2
' Db7
Lcd_db7 = Datenbyte.3

Call Lcd_enable

End Sub

Sub Lcd_befehl(byval Datenbyte As Byte)

Dim Highnibble As Byte
Dim Lownibble As Byte

Lownibble = Datenbyte And &B00001111 ' mask out upper nibble
Highnibble = Datenbyte ' 1. copy original Value to Highnibble
Shift Highnibble , Right , 4 ' 2. Shift upper 4 bits to lower 4 bits

' R/W
Lcd_rw = 0
' Rs
Lcd_rs = 0

Call Lcd_bits_setzen(highnibble )
Call Lcd_bits_setzen(lownibble )

End Sub

Sub Lcd_text(byval Datenbyte As Byte)

Dim Highnibble2 As Byte
Dim Lownibble2 As Byte

Lownibble2 = Datenbyte And &B00001111 ' mask out upper nibble
Highnibble2 = Datenbyte ' 1. copy original Value to Highnibble
Shift Highnibble2 , Right , 4 ' 2. Shift upper 4 bits to lower 4 bits

' R/W
Lcd_rw = 0
' Rs
Lcd_rs = 1

Call Lcd_bits_setzen(highnibble2 )
Call Lcd_bits_setzen(lownibble2 )

End Sub

Sub Lcd_enable

Lcd_e = 1
Waitms 2
Lcd_e = 0
Waitms 2

End Sub



Ich glaube aber inzwischen das ich ein Hardwareproblem habe. Wenn ich an Pin23 des Displays messe, dann messe ich lediglich 2,7V.
Laut Datenblatt des Display Controllers müssten da aber zwischen 8V und 10V anliegen.
Irgendwie wird wohl der Displaybooster nicht richtig gestartet. Warscheinlich wird deshalb das Display nicht richtig initialisiert.

Hat das schon mal jemand gehabt das Problem, oder kann mir da weiterhelfen?

Hier ist noch der Schaltplan der Displayplatine:

29553

BMS
27.12.2014, 17:57
Hallo,
habe grob drüber geschaut und auf die Schnelle nichts auffälliges gefunden.
Außer dass Pins am PORTC verwendet werden, wo auch JTAG rausgeführt wird.
Du musst auf jeden Fall die JTAG-FUSE deaktivieren, sonst werden einige Pins am PORTC nicht funktionieren (z.B. der Pin PC4 und PC5 werden nicht normal funktionieren und das Display wird sich auch erst recht nicht initialisieren lassen...). Kannst ja auch mal die Pegel an PC4,PC5 nachmessen! Falls jtag noch aktiviert ist, liegen dort "krumme" Spannungen an.
Grüße, Bernhard

demmy
28.12.2014, 13:03
Hi,

Also ich habe eben nochmal nachgemessen und nachgeschaut, jtag ist definitiv deaktiviert und die Zuordnung der einzelnen Pins funktioniert auch.

Was ist mit meinen waits? Sind die evtl. zu kurz oder zu lang? Ich habe an Displaypin 23 immernoch nur 2,7V anliegen. Kann das evtl. etwas mit meinem 3,3V Festspannungsregler zu tun haben? Die Kondensatoren die ich momentan verbaut habe sind deutlich kleiner als die im Datenblatt empfohlenen. Diese werde ich jetzt nochmal tauschen und anpassen.

Habt Ihr keine Ideen mehr? Bin für jede Hilfe dankbar.

Viele Grüße

demmy
28.12.2014, 15:28
Juhuu es läuft jetzt!!!! :D

Ich habe die Kondensatoren getauscht, was aber letztendlich den Erfolg gebracht hat, war folgendes.

Bei der Initialisierung des Displays muss zunächst mehrmals (ca. 6x) nur das Highbyte von &H30 gesetzt werden (also einmal enable toggeln lassen) dann einmal nur das Highbyte von &H20 setzen. Damit wird dann in den 4bit-Modus gewechselt. Von jetzt an muss / kann ganz normal wie im Datenblatt weiter initialisiert werden also high- und lowbyte.

That's it! :)

Das steht leider nicht so im Datenblatt!!!!

Soo jetzt habe ich noch eine Frage. Wie kann ich jetzt eine Funktion schreiben um einen String oder einen Zahlenwert auszugeben ohne jedes Zeichen einzeln setzen zu müssen. Also sprich, ich will an die Funktion eine String oder Byte Variable übergeben und die soll dann dargestellt werden.

Könnt ihr mir da vielleicht eine kleine Hilfestellunggeben?

Viele Grüße

Klebwax
28.12.2014, 16:40
Bei der Initialisierung des Displays muss zunächst mehrmals (ca. 6x) nur das Highbyte von &H30 gesetzt werden (also einmal enable toggeln lassen) dann einmal nur das Highbyte von &H20 setzen. Damit wird dann in den 4bit-Modus gewechselt. Von jetzt an muss / kann ganz normal wie im Datenblatt weiter initialisiert werden also high- und lowbyte.

Das scheint ein typisches 4-Bit Ansteuerungsproblem zu sein
https://www.roboternetz.de/community/threads/66389-LCD-St%C3%B6rungen-nach-Atmega-Reset/page2?p=610173&viewfull=1#post610173


Das steht leider nicht so im Datenblatt!!!!

Da wird davon ausgegangen, daß das LCD frisch aus einem Hardware-Reset kommt.

MfG Klebwax

demmy
28.12.2014, 18:07
Ja, das muss man aber erst mal wissen. Wieso schreibt man sowas nicht ganz klar ins Datenblatt rein? Dann wäre es auch kein Problem mehr!

Hat jemand noch eine Idee wie ich den Zeichensatz möglichst einfach in den entsprechenden Hexwert umwandeln kann?

Gruß