Forum: Mikrocontroller und Digitale Elektronik Ärger mit blauem LCD Display


von Christian J. (Gast)


Lesenswert?

Hallo,

ich habe die Dinger schon tausendmal benutzt und eingesetzt aber immer 
wieder gibt es Ärger damit und zwar beim booten. Ich lasse dem Ding so 
rund 500ms Zeit bevor es initialisiert wird aber immer wieder kommt es 
vor, dass da nur eine Zeile voller Müll steht. Drücke ich dann ein paar 
mal Reset am Mikro ist es ok.

Unten mein Code (CCS Compiler für PIC), zumindest die Hauptroutine.

Es klappt immer, wenn ich das Ganze dreimal nacheinander aufrufe. Nur 
kann das ja nicht Sinn der Sache sein. In den Bitroutinen takte ich im 
2us Takt und statt BF abzufragen warte ich 3ms nach jedem Ausgabe 
Befehl, da ich den Pin für BF nicht opfern wollte.

jemand eine Idee?

Christian



    lcd_send_nibble(3);   delay_ms(6);
    lcd_send_nibble(3);   delay_ms(1);
    lcd_send_nibble(3);   delay_ms(1);
    lcd_send_nibble(2);   delay_ms(1);

    lcd_sendbyte(0,LCD_cntrl | cursor_off);
    lcd_sendbyte(0,LCD_shift);
    lcd_sendbyte(0,LCD_cntrl | display_on);
    lcd_sendbyte(0,LCD_clear);

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Initialisiere das Display einfach so, wie das Datenblatt des 
Displaycontrollers dies erfordert und alle sind glücklich. Die lange 
Software-Reset Routine des HD44780 funktioniert bei allen meiner 
kompatiblen Displays verschiedenster Hersteller zuverlässig.

von Jens (Gast)


Lesenswert?

Mit dem gleichen Problem hatte ich auch zu kämpfen. Einzige Abhilfe war 
ein Delay von 1s nach PowerOn. Interessant ist jedoch, dass dieses 
Problem nur bei dem blauen Display (Reichelt) auftritt, die grünen 
spielen so, wie sie sollen.

von Christian J. (Gast)


Lesenswert?

>Initialisiere das Display einfach so, wie das Datenblatt des
>Displaycontrollers dies erfordert

Nur tut es das leider nicht, es ist inzwischen nicht mehr 
nachvollziehbar wieviele 44780 er Derivate es gibt.

Die grünen spinnen aber genauso bei mir, zumindest die aus dieser 
Lieferung (ebay, Polen, 3,50€ das Stück), haben ja den gleichen 
Controller drauf.

von Marc S. (euro)


Lesenswert?

ich sehe das richtig dass die LCDs im 4-bit-modus betrieben werden ?

es kann passieren das der µC resettet wird genau dann während ein Teil 
des 8-bit-wertes übertragen wurde. nach dem Restart fängt der µC dann 
wieder brav mit den ersten 4 bit der Initialisierung an, das LCD ist 
aber noch bei der zweiten hälfte des letzten Bytes.... ;)

Hatte selber mal das problem. Hat sich dann bei mir allerdings damit 
erledigt dass ich mich für ein kleines GLCD entschieden hatte das einen 
8-Bit bus hat...im prinzip gibt es aber eine möglichkeit das problem zu 
umgehen, habe da schon in diversen datenblättern infos gesehen.

Gruß, Marc

von Christian J. (Gast)


Lesenswert?

>>ich sehe das richtig dass die LCDs im 4-bit-modus betrieben werden ?

Ja. Und das Problem raucht nur bei einem Kaltstart auf, wenn ich den 
Stecker in die Dose stecke, niemals aber bei einem normalen Reset.

von Marc S. (euro)


Lesenswert?

Hast du bei dem Kaltstart zufällig einen ISP-Stecker auf dem Board und 
kannst du ausschließen dass es einen zweiten Reset nach dem einstecken 
gibt ?


ich hatte mal mit dem EA-DIP204 ähnliche Probleme, habs dann damit 
gelöst dass ich einfach die Reset-Leitung des LCD mit der Reset-Leitung 
des µC verbunden habe, hatte nie wieder Probleme :D

von Christian J. (Gast)


Lesenswert?

Das LCD hat aber keine Reset leitung? Den RS Pin benutze ich während des 
Einspielens von Daten.

Der ISP Stecker ist mal drauf und mal ab, das hat keine Auwirkungen. 
Welchen Pin soll ich denn verbinden vom Display?

von Christian J. (Gast)


Lesenswert?

Ich bastel gerade.... so läufts:
3 x die ganze Chose, 2 Mal reicht nicht.

  for (i=0;i<3;i++)
  {
    lcd_send_nibble(3);  delay_ms(6);
    lcd_send_nibble(3);  delay_ms(1);
    lcd_send_nibble(3);  delay_ms(1);
       lcd_send_nibble(2);  delay_ms(1);
    lcd_sendbyte(0,LCD_cntrl | cursor_off);
    lcd_sendbyte(0,LCD_shift);
       lcd_sendbyte(0,LCD_cntrl | display_on);
       lcd_sendbyte(0,LCD_clear);
  }

von Marc S. (euro)


Lesenswert?

Naja, entweder das LCD hat eine Resetleitung oder man muss leider die 
Versorgungsspannung über nen Mosfet beim Reset ausschalten (einfach 
irgendeinen Logic-Level p-Mosfet, Gate an die Resetleitung).



Die "Lösung" oben habe ich auch schon verwendet, bei o.g. genanntem 
EA-DIP204. Hat immer einwandfrei funktioniert...^^

von Benedikt K. (benedikt)


Lesenswert?

Christian J. wrote:
> Ich bastel gerade.... so läufts:
> 3 x die ganze Chose, 2 Mal reicht nicht.

Das deutet stark darauf hin, dass die Wartezeit vor Beginn der 
Initialisierung zu kurz ist.

von Martin (Gast)


Lesenswert?

Ich hatte auch mal so einen Fehler. Bei mir war es aber ein 
Hardwarefehler. Ich war der Meinung ich könnte den 100nF Kondensator 
weglassen, ich habe ja schon nen 100µ Elko...

von Christian J. (Gast)


Lesenswert?

Ich habe gar keine 100n Fahräder bei mir, aus eben dem Grund. Vielleicht 
sollte ich ja doch mal einen spendieren am Display....

von Marc S. (euro)


Lesenswert?

was die frage aufwirft wie dein schaltplan aussieht... ;)

von Troll vom Dienst (Gast)


Lesenswert?

> Ich habe gar keine 100n Fahräder bei mir, aus eben dem Grund. Vielleicht
> sollte ich ja doch mal einen spendieren am Display....

Toll....

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Hier mal meine LCD-INIT, ist zwar ASM aber vielleicht kannst Du etwas 
ableiten. "Delay3" ist ein ~40ms Delay, "DispDelay" ist ein 40µs Delay, 
"DispCommand" ist eine Ausgaberoutine, die das Byte auf den Port legt, 
R/W entsprechend schaltet und Enable toggelt. Alle bisher verwendeten 
LCDs laufen damit sicher an, egal ob Kalt- oder Warmstart. Die Init wird 
nach den grundlegenden Inits der Peripherie im Controller aufgerufen.

;---------------------------------------
;Display initialisieren
Init_Display:
 rcall  Disp_Delay3    ;Wartezeit für DisplayStartUp
 rcall  Disp_Delay3
 ldi  Temp, 0b00110000  ;Display auf 8Bit-Interface initialisieren
 out  PortC, Temp
 nop
 nop
 sbi  PortC, Enable
 nop
 nop
 nop
 cbi  PortC, Enable
 rcall  Disp_Delay
 wdr

 rcall  Disp_Delay3
 ldi  Temp, 0b00110000  ;Display auf 8Bit-Interface initialisieren
 out  PortC, Temp
 nop
 nop
 sbi  PortC, Enable
 nop
 nop
 nop
 cbi  PortC, Enable
 rcall  Disp_Delay3
 wdr

 ldi  Temp, 0b00110000  ;Display auf 8Bit-Interface initialisieren
 out  PortC, Temp
 nop
 nop
 sbi  PortC, Enable
 nop
 nop
 nop
 cbi  PortC, Enable
 rcall  Disp_Delay

 ldi  Temp, 0b00100000  ;Display auf 4Bit-Interface initialisieren
 sts  PortC, Temp
 nop
 nop
 sbi  PortC, Enable
 nop
 nop
 nop
 cbi  PortC, Enable
 rcall  Disp_Delay

 ;Function Set: 4Bit Interface, Font 5x8 - ;immer ganz zuerst 1x senden!
 ldi  Temp, 0b00101000
 rcall   DispCommand
 rcall  Disp_Delay

 ;Display on, kein Cursor, kein Blinken
 ldi  Temp, 0b00001100
 rcall  DispCommand
 rcall  Disp_Delay

;Display clear. cursor at home
 wdr
 ldi  Temp, 0b00000001
 rcall  DispCommand
 rcall  Disp_Delay3
 rcall  Disp_Delay3
 rcall  Disp_Delay3

 ;Entry Mode, Cursor increment, kein shifting
 ldi  Temp, 0b00000110
 rcall  DispCommand
 ret

von Benedikt K. (benedikt)


Lesenswert?

Travel Rec. wrote:
> Hier mal meine LCD-INIT, ist zwar ASM aber vielleicht kannst Du etwas
> ableiten.

Ich sehe da 2 kleine Fehler:
Du rufst nach dem 2. Senden Disp_Delay3 auf. Laut Datenblatt muss man 
aber nach dem 1. Senden mindestens etwa 4-5ms warten.
Die 40µs sind sehr knapp bemessen und sind somit außerhalb der Specs 
(die 37-40µs sind die Werte die bei 270kHz Oszillatorfrequenz gelten, 
und laut Datenblatt hat der Oszillator irgendwo zwischen 190-350kHz 
aufgrund der Toleranzen.) Spätestens wenn das LCD mit 3,3V läuft, wird 
es daher so nicht mehr gehen.

Ansonsten bin auch aber auch deiner Meinung:
Man braucht nicht für jedes Display eine eigene Software, eine Software 
die wirklich alle Specs aus dem Datenblätt einhält läuft bei allen 
Displays.

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.