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);
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.
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.
>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.
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
>>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.
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
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?
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...^^
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.
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...
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
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.