Forum: Mikrocontroller und Digitale Elektronik MIDAS LCD Display ansteuern


von Sven Puga (Gast)


Lesenswert?

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

von 6a66 (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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)?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
von Sven Puga (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von LCDPlayer (Gast)


Lesenswert?

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 ....

von Sven Puga (Gast)


Lesenswert?

@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.

von Sven Puga (Gast)


Lesenswert?

Ne PORTD vorher anzulegen macht leider auch keinen Unterschied, sorry...

von LCDPlayer (Gast)


Lesenswert?

Sven Puga schrieb:
> Ne PORTD vorher anzulegen macht leider auch keinen Unterschied, sorry...

DDRA und DDRD auf Output programmiert?
(stehen nach Reset auf Input ...)

von 6a66 (Gast)


Lesenswert?

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

von Sven Puga (Gast)


Lesenswert?

-.-
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.

von Sven Puga (Gast)


Lesenswert?

Lasst es gut sein, es funktioniert alles perfekt!!!

Danke nochmals...

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
Noch kein Account? Hier anmelden.