Forum: Mikrocontroller und Digitale Elektronik ansteuerung eines LCD mit PIC


von tom (Gast)


Angehängte Dateien:

Lesenswert?

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 !

von Ignis Aureus (Gast)


Lesenswert?

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*** :-)

von Günter Göbel (Gast)


Angehängte Dateien:

Lesenswert?

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

von tom (Gast)


Angehängte Dateien:

Lesenswert?

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 ?

von Ralf Hochhausen (Gast)


Lesenswert?

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

von tom (Gast)


Lesenswert?

ich hab leider nur einen schwarzen balken in der 1. zeile !

von Ralf Hochhausen (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

.. 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..

von Rein (Gast)


Lesenswert?

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

von tom (Gast)


Lesenswert?

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 !

von Peter D. (peda)


Lesenswert?

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

von tom (Gast)


Lesenswert?

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 ?

von Mike (Gast)


Lesenswert?

@ 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

von Uwe (Gast)


Lesenswert?

Hi!
Laut Datenblatt brauchst du nur beim lesen LHL, beim "nur" schreiben 
kann E schon auf H stehen.
Gruss Uwe

von BAB (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von tom (Gast)


Lesenswert?

so hab ich es aber eh !

von Peter D. (peda)


Lesenswert?

Hi Tom,

hast Du auch die vollständige Initialisierung gemacht mit den 
angegebenen Wartezeiten ?

Erst danach ist Busy-polling erlaubt.

Peter

von Jim Bob (Gast)


Lesenswert?

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 mssen 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 fr linke H„lfte
LCD_RIGHT  EQU  $40      ;DD-Adresse fr 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

von Ralf Hochhausen (Gast)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.