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?
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); }
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...
Ich habe gar keine 100n Fahräder bei mir, aus eben dem Grund. Vielleicht sollte ich ja doch mal einen spendieren am Display....
> Ich habe gar keine 100n Fahräder bei mir, aus eben dem Grund. Vielleicht > sollte ich ja doch mal einen spendieren am Display.... Toll....
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.
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.