LCD Profis gesucht

C

Carsten Tröller

Guest
Hallo Group :eek:)
Ich habe mir ein AVR 2313 Board gebastelt welches auch wunderprächtig
funktioniert.
Nun wollte ich pfiffig sein und Leitungen sparen und habe mir diese Lösung
reingezogen und nachgebaut.
http://www.mcselec.com/download/appnotes/i2c%20to%20lcd%20interface.pdf
anschluss und programmierung
http://www.mcselec.com/download/appnotes/lcd_i2c.lib passende lib
Hardware scheint mir in Ordnung zu sein, doch habe ich einen Fehler den ich
nicht begreife.
Alle Funktionen mit setzten des Cursurs funktionieren, nur eine Funktion
nicht.
Das senden von Text. Es sieht (kurzzeitig) danach aus als würde es zwar
übertragen aber nicht angezeigt.
Wie kann das sein? Begreife ich nicht ...desweiteren bin ich noch Newbie in
AVR und umgebung.
Kann jemand helfen ?
 
Carsten Tröller schrieb:

Alle Funktionen mit setzten des Cursurs funktionieren, nur eine Funktion
nicht.
Das senden von Text. Es sieht (kurzzeitig) danach aus als würde es zwar
übertragen aber nicht angezeigt.
Wie kann das sein? Begreife ich nicht ...desweiteren bin ich noch Newbie in
AVR und umgebung.
Kann jemand helfen ?

Hallo,

lies mal das Datenblatt der LCD ganz genau.
Die Anschlussleitungen dürfen nicht zu lang sein, oft nur weniger als 10 cm.
Die Wartezeiten nach bestimmten zeitintensiven Befehlen an die LCD
müssen eingehalten werden, miss die Zeiten mal nach, geht am einfachsten
mit dem Logikanalysator wenn man einen hat.

Wenn Du den 4 Bit Modus benutzt musst Du eine spezielle Initialisierung
für diesen Modus einhalten, die ist über doppelt so lang wie die für 8 Bit.
Es gibt oft auch einen Display On/Off Befehl, damit kann man den Text
auch unsichtbar machen.

Da Du ja nicht verraten hast welches LCD Du benutzt bin ich mal von
einem HD44780 LCD Controller IC ausgegangen.

Bye
 
Hallo Uwe
Der Controller ist ein ks0066 (4 bit Modus) welcher kompatibel mit dem
HD44780 ist.
Logik analyser steht mir nicht zur verfügung.leider.
Das was mir wirklich spanisch vorkommt,ist, das der Controller die Befehle
ja annimmt und auch ausführt wie Cursor setzen,shift links/rechts,donwline
und upper line.Den Cursor habe ich ja gesetzt, somit kann ich festellen das
das LCD auf sichtbar steht.Was die anschluss Leitungen angeht,dürfte ich
nicht zu lang sein,weil das Signal ja über den PCF 8574 reinkommt und dieser
ist direkt mit dem LCD verbunden.Also nicht mal 5 mm.
Sobald ich aber Text mit dem 'LCD' Befehl ans LCD schicke, sieht man nur wie
von links nach rechts ein Schatten übers LCD geht.Über alle vier Zeilen.
Als wenn die Position des Cursors einmal komplett durch das Display rast.
Vielleicht muß man das Pferd anders herum aufzäumen. Wo liegt der
unterschied zwischen der Textausgabe und dem normalen Cursor setzten ?
Mfg
Troelli




Hallo,

lies mal das Datenblatt der LCD ganz genau.
Die Anschlussleitungen dürfen nicht zu lang sein, oft nur weniger als 10 cm.
Die Wartezeiten nach bestimmten zeitintensiven Befehlen an die LCD
müssen eingehalten werden, miss die Zeiten mal nach, geht am einfachsten
mit dem Logikanalysator wenn man einen hat.

Wenn Du den 4 Bit Modus benutzt musst Du eine spezielle Initialisierung
für diesen Modus einhalten, die ist über doppelt so lang wie die für 8 Bit.
Es gibt oft auch einen Display On/Off Befehl, damit kann man den Text
auch unsichtbar machen.

Da Du ja nicht verraten hast welches LCD Du benutzt bin ich mal von
einem HD44780 LCD Controller IC ausgegangen.

Bye
 
Carsten Tröller schrieb:

Vielleicht muß man das Pferd anders herum aufzäumen. Wo liegt der
unterschied zwischen der Textausgabe und dem normalen Cursor setzten ?
Hallo,

schau dazu doch in den Befehlssatz des HD44780.
Fragst Du vor jedem Schreib- und Lesezugriff das Busy Flag BF auf 0 ab?
Im 4 Bit Mode ist die Busy Abfrage vor jedem Bytezugriff nötig.

Hälst Du die vorgeschriebene Initialisierung ein?

Wenn Du keinen Logikanalysator hast, kannst Du die Zeiten wenigstens mit
einem Oszi überprüfen? Dabei ist oft hilfreich mit einem freien
Portausgang interessante Software Ereignisse zu markieren, z.B. Ausgang
bei Beginn des Delays für das LCD setzen, danach wieder löschen, dann
braucht man nur diesen Ausgang zu messen. Ohne einen Speicheroszi muß
man natürlich eine periodische Schleife programmieren.

Bye
 
Hallo Uwe
In den Befehlssatz habe ich natürlich geschaut.Doch wirklich klüger bin ich
nicht geworden.
Das Problem ist sicher das es ein nachbau ist, so wie die Soft.Beides nicht
von mir.
Intitialisierung: ja in 2 Schritten.

[_Init_LCD]
_Init_LCD:
*BASIC: waitms 50 'erster part
ldi r16,&hc0 ; this is to make the initialization on both halfs of a
4-line LCD
Ldi _temp1, &h03 ; at init-time I call all routines before _lcd_e is
loaded into r16
Rcall _Send_to_LCD
*BASIC: waitms 4 ,zweiter part
Rcall _Send_to_LCD
Rcall _Send_to_LCD
Ldi _temp1, &h02
Rcall _Send_to_LCD
Ldi _temp1, &h28
Rcall _Write_lcd_byte ;RS flag should to be 0, so jump directly to write
byte
Ldi _temp1, &h08
Rcall _Write_lcd_byte
Ldi _temp1, &h0c
Rcall _Write_lcd_byte
Ldi _temp1, &h01
Rjmp _Write_lcd_byte
[END]

eigentlich müßte es noch eine dritte mit 100 micro sek geben , jedoch hat
der Verfasser ist wohl für nicht wichtig empfunden.
Ich begreife auch nicht was in dieser Lib abgeht, derweil ich diese Sprache
nicht kenne oder besser, sie programmieren kann.
Fragst Du vor jedem Schreib- und Lesezugriff das Busy Flag BF auf 0 ab?
Tja ... das kann ich Dir nicht mal sagen.Denn ich habe es nicht dem code
hinzugefügt.Weiß aber das es enorm wichtig ist.
Oszi? Steht mir unglücklicherweise nicht zu verfügung.
Mein Code:

$regfile = "2313def.dat" 'AT90S2313
$crystal = 4000000
$lib "Lcd_i2c.lib" 'My i2c driver
for the LCD
Ddrd = &B0011000
Const Pcf8574_lcd = &H40 'Defines the
address of the I/O expander for LCD
'Für Bit 3 Von Portd
Config I2cdelay = 1
Config Scl = Portb.3 'Configure i2c
SCL
Config Sda = Portb.2 'Configure i2c
SDA
Dim _lcd_e As Byte 'Needed to
control 4 line LCD
_lcd_e = 128 'Upper half of
4-line display is selected
Config Lcd = 16 * 4 'configure lcd
screen
Wait 1
Cursor On Blink
Display On

Do
Cls 'clear the LCD
display

Portd.4 = 1 'LED (Pin PD3)
an
Portd.3 = 0 'LED (Pin PD2)
aus
Waitms 500

Lcd "Hello world." 'display this at
the top line 'select the
lower line
Wait 1
Lcd "Otter" 'display
this
Wait 1

Portd.4 = 0 'LED (Pin PD3)
aus
Portd.3 = 1 'LED (Pin PD2)
an
Waitms 500


Loop
End

Mfg
Troelli
 

Welcome to EDABoard.com

Sponsor

Back
Top