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.
:
Bearbeitet durch User
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.
Ne PORTD vorher anzulegen macht leider auch keinen Unterschied, sorry...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.