Hi Zusammen
Ich bin zur Zeit daran das LCD Display MC20805B6W von MIDAS anzusteuern,
leider bisher erfolglos. (Datenblatt über Farnell:
http://www.farnell.com/datasheets/2021751.pdf)
Ich habe immer mit der Initialisierung (auf Seite 15 im DB) angefangen:
Versorgungsspannung eingeschaltet und 50ms gewartet (gemessen 4.6V)
Drei mal die "Fuction set" mit einem Abstand von 50ms gesendet (8-Bit)
Und anschliessend die folgenden vier Befehle im Abstand von je 50us
gesendet
Wenn ich nun mit dem Konstarst spiele, erscheint und verschwindet nur
line 1 obwohl ich zuvor 2-line gesetzt hatte. Auch bei allen folgenden
Befehlen, wie auch "Display ON" passiert nix und wenn ich BF auslesen
will, ist dieses konstant high.
Hab ich bereits flasch angefangen oder weiss jmd genau, was ich der
Reihenfolge nach machen muss?
Falls relevant: Ansteuerung mit ATMega644A
Freundliche Grüsse
Sven Puga
Sven Puga schrieb:> Hab ich bereits flasch angefangen oder weiss jmd genau, was ich der> Reihenfolge nach machen muss?
Hallo Sven,
Die Reihenfolge sollte schon passen.
Bitte prüfen:
a) Stromversorgung stabil, 4,6V erscheint ein bisschen wenig
b) Verdrahtung richtig? Enable, R/W richtig, Datenleitungen richtig?
c) Prüfen ob Verdrahtung auch aktiv wird: Wackelt das Enable, die Daten,
R/W?
d) Sind die Execution times (Seite9) eingehalten?
e) Nachprüfen ob die Zeiten der Initialisieerung auch eingehalten
werden.
rgds
Sven Puga schrieb:> Und anschliessend die folgenden vier Befehle im Abstand von je 50us> gesendet
Die folgenden vier Befehle. Welche?
Und wie steuerst Du das Ding an? Du schreibst "8 Bit", aber erzeugst Du
neben den Daten auch die zusätzlichen Steuersignale (E, R/!W und RS)?
Sven Puga schrieb:> Drei mal die "Fuction set" mit einem Abstand von 50ms gesendet (8-Bit)> Und anschliessend die folgenden vier Befehle im Abstand von je 50us> gesendet
Da steht doch aber was ganz anderes, nämlich die Standardsequenz für
HD44780 kompatible LCD:
Nach Poweron 15ms warten, dann Function Set
nochmal min. 4,1ms warten, dann Function Set.
nochmal 100µs warten und ein letztes Mal Function Set.
Wie bei allen diesen LCD gilt 'ich sags dreimal und es ist wahr' - und
das auch nur, wenn man mit genügend Geduld agiert. Das gilt auch für
alle anderen Befehle. Der Chip ist nun mal etwas langsam, aber dafür
sehr stromsparend.
Beachte auch, das Zeile 2 erst ab Adresse 0x40 beginnt.
Hi zusammen
Danke für die Antworten im voraus...
@6a66:
a) Stromversorgung ist stabil. Die 4.6V kommen daher, dass ich die
Versorgungsspannung des Displays über einen Port des uC laufen lass, um
diesen ausschalten zu können.
b) Hab ich gerade eben nochmals geprüft, konnt aber keine Fehler
feststellen.
c) Das Überpruefen ist etwas schwierig ohne Oszi. Ich hab eine LED
angehängt, die flakert ein wenig. Es tut sich also zumindest etwas. Da
mir aber BF als high zurückgegeben wird, müssten E, R/W und RS schon mal
funktionieren.
d) Alles mit 1.52ms nach DB lass ich mit _delay_ms(10) laufen und alle
38us mit _delay_us(50). Ich schraub nochmals alle Werte um einiges
höher. (F_CPU ist 8000000)
e) Ist eben nochmals schwierig ohne Oszi. Idee wie ichs ohne machen
kann?
@Rufus und Matthias:
PORTA |= (1<<V_disp); //Versorgungsspannung für Display einschalten
PORTA &= ~((1<<RW) | (1<<RS));
_delay_ms(50); //im Datenblatt mit >15ms angegeben
PORTA |= (1<<E);
PORTD = 0b00111000;
_delay_us(10);
PORTA &= ~(1<<E);
_delay_ms(10); //1st, angegeben mit >4.1ms
PORTA |= (1<<E);
PORTD = 0b00111000;
_delay_us(10);
PORTA &= ~(1<<E);
_delay_ms(10); //2nd, angegeben mit >100us
PORTA |= (1<<E);
PORTD = 0b00111000;
_delay_us(10);
PORTA &= ~(1<<E);
_delay_us(50); //3rd, >38us
PORTA |= (1<<E);
PORTD = 0b00111000;
_delay_us(10);
PORTA &= ~(1<<E);
_delay_us(50); //setting 1st (8Bit mode, 2 lines, 5x8 dots)
PORTA |= (1<<E);
PORTD = 0b00001000;
_delay_us(10);
PORTA &= ~(1<<E);
_delay_us(50); //setting 2nd (Display off)
PORTA |= (1<<E);
PORTD = 0b00000001;
_delay_us(10);
PORTA &= ~(1<<E);
_delay_us(50); //setting 3rd (Display clear)
PORTA |= (1<<E);
PORTD = 0b00000110;
_delay_us(10);
PORTA &= ~(1<<E);
_delay_us(50); //setting 4th (DDRAM Address increase)
Zeitabstände müssten also genug gross sein, sofern ich das nicht
komplett falsch gemacht habe.
Nach diesen Befehlen gibt der Display noch keine Daten aus, aber
zumindest müsste er, wenn ich mit dem Kontrast spiele, beide Linien
anzeigen und nicht nur die obere.
lg Sven
Sven Puga schrieb:> Die 4.6V kommen daher, dass ich die Versorgungsspannung des Displays> über einen Port des uC laufen lass, um diesen ausschalten zu können.
Lass' das mal sein und schließe das Display direkt an +5V an. Wenn das
Display funktioniert, kannst Du das ja immer noch ändern.
R/W Leitung statisch auf 0 gezogen?
Sven Puga schrieb:> PORTA |= (1<<E);> PORTD = 0b00111000;> _delay_us(10);> PORTA &= ~(1<<E);> _delay_ms(10); //1st, angegeben mit >4.1ms
Das mag vielleicht so nicht funktionieren. Das Datum muss
möglicherweise bei steigender Flanke schon anliegen.
Also:
PORTD = (..Datum...);
PORTA |= (1<<E);
_delay_us(10);
PORTA &= ~(1<<E);
Bei allen anderen Operationen dann dementsprechend.....
Sven Puga schrieb:> PORTA |= (1<<E);> PORTD = 0b00001000;> _delay_us(10);> PORTA &= ~(1<<E);> _delay_us(50); //setting 2nd (Display off)
------------------------------------------^^^^
Irgendwann müsstest du das Display auch einschalten ....
.... meine 2 cents ....
@Rufus:
Leichter gesagt als getan, aber habs überbrückt. Ligt jetzt direkt an 5V
an, leider immer noch das selbe.
@LCDplayer:
RW ist auf null, siehe zweite Zeile im Programm. Hingegen die Daten
vorher an PIND anzulegen, das versuch ich gleich mal...
Display wieder einschalten hab ich schon versucht, bringt aber auch nix,
solange BF high ist.
Sven Puga schrieb:> Ne PORTD vorher anzulegen macht leider auch keinen Unterschied, sorry...
DDRA und DDRD auf Output programmiert?
(stehen nach Reset auf Input ...)
Sven Puga schrieb:> a) Stromversorgung ist stabil. Die 4.6V kommen daher, dass ich die> Versorgungsspannung des Displays über einen Port des uC laufen lass, um> diesen ausschalten zu können.
Das macht man z.B. mit nem LP2985.
LCDPlayer schrieb:> Das mag vielleicht so nicht funktionieren. Das Datum muss> möglicherweise bei steigender Flanke schon anliegen.
Nein sagt das Datenblatt anders.
Rein Programmtechnsich sollte das gehen. Bitte steppe das Programm im
Singelstep durch und verifiziere die Pegel an den Ports mit Multimeter.
rgds
-.-
DDRA ja, aber anstelle von DDRD stand DDRB
Ich glaub ich versteck mich mal in der Ecke...
Danke vielmals! ^^
Jetzt sind auch beide Zeilen Aktiv
Trotzdem noch schnell ne zweite Frage:
Wie setzt ich jetzt die Daten für die Anzeige ein? Soweit ich verstehe
müssten die in DDRAM eingeschrieben werden oder? Also RS=1 und RW=0 dann
Daten rein nach Seite 18, und vorher noch DDRAM-Address an die richtige
Stelle setzen, korrekt?
Danke nochmals und sorry für den peinlichen Fehler
@6a66: Jap, funktioniert jetzt auch, wenn ich PORTD wieder wie anfangs
setze.