ich versuche schon seit einiger zeit ein LCD mit dem PIC 16F84 anzusteuern ! ich schaffe nicht einmal die initialisierung des displays ! vielleicht kann mir wer einen tipp geben !
Ich schätze du meinst ein Zeichendisplay. Da musst du auf das Timing achten. Nach dem Einschalten musst du min. 15ms warten, bis du den ersten Befehl losschickst, danach min 4,1ms bis zum 2 ten Befehl und dann min 100us bis zum 3. Schau am besten auch mal hier vorbei: http://sprut.de/electronic/lcd/index.htm Mfg. Ignis Aureus PS: vielleicht ist auch das Display im Ar*** :-)
Hast du es schon mal mit JAL versucht? Habe in einer ELEKTOR davon gelesen.Herundergeladen, PIC und Display zusammengelötet, ein paar Zeilen in JAL programmiert und hat gleich funktioniert.Für kleine Anwendungen superleicht. Du kannst dir ja mal das Beispiel für ein Thermometer mit LM75 und Display (HD44780) ansehen. MFG Günter
seit dem letzten posting hab ich viele neue erkenntnisse gewonnen ! jedoch läuft das display leider noch immer nicht ! wann übernimmt das display die daten, darüber hab ich schon unterschieliche angaben gehört ! bei fallender oder steigender flanke ?
Hallo, soweit ich weiß werden die Daten bei der negativen Flanke übernommen. Aber das ist eigentlich auch egal, da Du ja immer zuerst die Daten anlegst und dann einen Impuls am Enable-Pin erzeugst. Was zeigt das Display denn an? Einen schwarzen Balken in der ersten Zeile? Dann hat die Initialisierung normaler weise nicht funktioniert. Ich kann dir am Montag mal meinen ASM-Code anhängen, dann kannst Du dein Display mal testen, ob es funktioniert. Habe mir auch mal eins geschossen (glaube mit der Programmierspannung des PIC) und dann tagelang an einem kaputten Display herumgerätselt oberwohl mein Code ok war. Gruß, Ralf
Hallo, das war bei mir auch so. Das kann entweder daran liegen, dass die Initialisierung nicht funktioniert hat, das Display nicht per Befehl eingeschaltet wurde oder das Display nicht gelöscht wurde. Als letztes bleibt dann noch das das Display kaputt ist(so war es leider bei meinen ersten Versuchen), aber da sollte man ja zunächst nicht dran denken. Fragst Du zur Zeit das Busy-Flag ab? Falls nicht, ist das für das Timing der Befehle von Vorteil, da man so immer solange wartet, bis das Display intern nichtmehr arbeitet und für einen neuen Befehl zur Verfügung steht.
.. das mit der fallenden Flanke hab ich auch so gehandhabt wie´s im Datenblatt steht. Enable war immer high, Daten angelegt - ein paar nop´s damit die Daten passen und dann Enable auf low, warten bis die Daten im Diaplay gepuffert waren und enable wieder auf high. so hätts eigentlich funktionieren müssen. Hat es aber nicht in ca. 50% der Fälle kam nur Mist raus... Dann hab ich die Software abgeändert: Enable immer low, daten anlegen, enable high,warten E auf low, warten... seitdem funktioniert alles fehlerfrei. Verstanden hab ich den zusammenhang nicht ?? Michael..
Hallo allerseits, ich habe gelesen, das man vor dem Senden des eigentlichen Datums das Busy-Flag abwarten muß. Das könnte der Fehler sein, bei mir wird jedes Zeichen geschluckt und angezeigt. Reini
ich warte eigentlich immer das bussyflag ab, außer natürlich bei der initialisierung, da warte ich die vorgegebenen zeiten ! trotzdem habe ich keinen erfolg ! ich einen fehler im programm ahben den ich einfach nicht finde !und langsam verzweifle ich daran !
Also ich mache das immer so, daß RS, R/W und Daten stabil anliegen und dann wird E = high, 1µs warten und E = low. Beim Lesen genau so, nur eben Daten = FF (beim 8051) und gelesen wird direkt bevor E = low. Das mit ständig E = high kann meiner Meinung nach nicht funktionieren. Peter
da mein 4MHz PIC eh 1µs pro befehl braucht brauche ich keine wartezeit zwischen dem setzen und löschen von Enable, oder ? nur das lesen ist mir noch nicht ganz klar ! also du setzt einable auf 1, dann liest du das bussyflag oder was auch immer, und dann setzt du wieder E auf 0. hab ich das richtig verstanden ?
@ Peter Danegger Hi, es hat auch nicht funktioniert mit E immer high; aber verstehen tu ich das nicht; weil neg. edge triggered (.. siehe Datenblatt...) Michael
Hi! Laut Datenblatt brauchst du nur beim lesen LHL, beim "nur" schreiben kann E schon auf H stehen. Gruss Uwe
du musst auch die RS und RW leitungen richtig setzten !! beim senden von befehlen: RS = LOW RW = LOW beim senden von daten: RS = HIGH RS = LOW beim abfragen des busyflags: RS = LOW RW = HIGH wenn LCD beschäftigt dann BUSY = HIGH
Nochmal: der Ruhezustand ist E = low. Probiert es doch so, wie ich es beschrieben habe. Ich mache es mit einem 8051 so und da funktioniert es. Beim 8051 muß man den Port zum Lesen auf FF setzen, beim PIC die Richtung umschalten. Das sollte der einzige Unterschied sein. Peter
Hi Tom, hast Du auch die vollständige Initialisierung gemacht mit den angegebenen Wartezeiten ? Erst danach ist Busy-polling erlaubt. Peter
Hi, ich poste hier einfach mal, was ich vor etlichen Jahren in meinem jugendlichem Leichtsinn für meine PIC-Library zurechtgezimmert hatte. Ist recht ordentlich dokumentiert, wie ich sehe, hätte ich mir gar nicht zugetraut ;) Die Umlaute sind leider flöten gegangen, damals habe ich das noch mit DOS oder Windows gemacht. Ich hoffe, das hilft weiter! ; ;Routinen zur Ansteuerung eines LCD-Displays mit Hitachi 44780-Controller ;Vor dem ersten Aufruf mssen PA0, PA1 und PB4-PB7 auf Ausgang gestellt werden ; ;Portzuweisung LCD_DATA EQU PORTB LCD_CTRL EQU PORTA ;Fileregister lcd_counter EQU $2D ;PORTA Kontroll Bits LCD_E EQU 0 LCD_RS EQU 1 ;LCD-Kommandos LCD_CLEAR EQU %00000001 LCD_HOME EQU %00000010 LCD_INC_SHIFT EQU %00000111 LCD_INC_FREEZE EQU %00000110 LCD_DEC_SHIFT EQU %00000101 LCD_DEC_FREEZE EQU %00000100 LCD_OFF EQU %00001000 LCD_ON EQU %00001100 LCD_CURSOR_ON EQU %00001111 LCD_CURSOR_OFF EQU %00001100 LCD_LEFT EQU $0 ;DD-Adresse fr linke H„lfte LCD_RIGHT EQU $40 ;DD-Adresse fr rechte H„lfte ;*** LCD-Display initialisieren lcd_init movlw 30 ;Startup-Verz”gerung 15ms call x_delay500 movlw 48 movwf LCD_DATA call pulse movlw 9 ;Verz”gerung 4,5ms call x_delay500 movlw 48 movwf LCD_DATA call pulse call delay500 ;Verz”gerung 500æs movlw 48 movwf LCD_DATA call pulse movlw 9 ;Verz”gerung 4,5ms call x_delay500 movlw 32 ;4-Bit-Mode movwf LCD_DATA call pulse call delay500 ;Verz”gerung 500æs movlw 40 ;1/16 duty cycle call lcd_cmd movlw LCD_OFF ;Display, Cursor, Blinken aus call lcd_cmd movlw LCD_CLEAR ;Display l”schen, Curser auf 1 call lcd_cmd movlw LCD_INC_FREEZE ;Inkrementelles Schreiben call lcd_cmd clrf lcd_counter ;Cursorposition initialisieren return ;*** Zeichen auf dem LCD-Display ausgeben lcd_char movwf temp1 ;Zeichen zwischenspeichern movlw %00001111 ;Portbits B4-B7 l”schen andwf LCD_DATA,F ;und ausgeben movlw %11110000 ;Highnibble extrahieren andwf temp1,W ;in W iorwf LCD_DATA,F ;und ausgeben bsf LCD_CTRL,LCD_RS ;Byte ist Zeichen call pulse movlw %00001111 ;Portbits B4-B7 l”schen andwf LCD_DATA,F ;und ausgeben movlw %00001111 ;Lownibble extrahieren andwf temp1,F ;in F swapf temp1,W ;in Highnibble von W iorwf LCD_DATA,F ;und ausgeben call pulse bcf LCD_CTRL,LCD_RS ;RS-Flag l”schen call delay500 ;Verz”gerung 500æs incf lcd_counter,F ;Cursorposition aktualisieren return ;*** Befehl an LCD-Controller bergeben lcd_cmd movwf temp1 ;Befehl zwischenspeichern movlw %00001111 ;Portbits B4-B7 l”schen andwf LCD_DATA,F ;und ausgeben movlw %11110000 ;Highnibble extrahieren andwf temp1,W ;in W iorwf LCD_DATA,F ;und ausgeben call pulse movlw %00001111 ;Portbits B4-B7 l”schen andwf LCD_DATA,F ;und ausgeben movlw %00001111 ;Lownibble extrahieren andwf temp1,F ;in F swapf temp1,W ;in Highnibble von W iorwf LCD_DATA,F ;und ausgeben call pulse movlw 4 ;Verz”gerung 2ms call x_delay500 return lcd_setcursor movwf temp3 ;Adresse zwischenspeichern movwf lcd_counter ;Cursor aktualisieren bsf temp3,7 ;DD-RAM adressieren movf temp3,W call lcd_cmd ;und anzeigen return ;*** Enable-Puls ausgeben pulse bsf LCD_CTRL,LCD_E bcf LCD_CTRL,LCD_E return
Hallo zusammen, hab auch nochmal mein MPLAB Programm angehängt. Es ist auch ein hex-file dabei, sollte sich also gleich auf den 16F84 programmieren lassen und was ausgeben. (****Messwert****) Gruß, Ralf
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.