ansteuerung eines LCD mit PIC

Gast #15860
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
Angehängte Dateien:
Gast #15861
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 ?
Angehängte Dateien:
Gast #15862
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
Gast #15864
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.
Gast #15865
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..
Gast #15866
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
Gast #15867
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 !
#15868
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
Gast #15869
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 ?
Gast #15872
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
Gast #15876
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
Gast #15877
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren