Forum: Mikrocontroller und Digitale Elektronik PIC 16F628A - LCD ansteuern


von Martin M. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich mache gerade meine ersten Versuche mit PIC-Programmierung und 
insbesondere mit dem ansteuern von LCD Displays ( 16 x 2 von Reichelt ). 
Bis jetzt haben meine Programme immer schön funktioniert (Lauflicht o.ä. 
:) ) aber beim LCD habe ich ein Problem.

Ich habe die LCD Prozeduren aus dem Lernbeispiel auf sprut.de in mein 
eigenes Programm kopiert und es noch ein wenig erweitert.

Was ich ersteinmal machen möchte ist, dass auf Tastendruck ( 4 Taster an 
PORT A angeschlossen ) jeweils ein gewisser Buchstabe ausgegeben wird.
Zum Test soll nach dem Initalisiern noch ein "OK:" ausgegeben werden.

Nun habe ich also das Programm geschrieben (Sourcecode siehe Anhang) und 
es auf den PIC geschrieben. Wenn ich nun den PIC in meine Testplatine 
einsetze und das ganze mit Spannung ( 5V ) versorge, erscheinen auf dem 
LCD in der ersten Zeile nur Schwarze Blöcke, ansonsten passiert nichts.

Meine Vermutung ist, dass das LCD nicht richtig initalisiert wird, 
deswegen auch nichts angezeigt wird. Nur wieso? Ich hoffe, jemand kann 
mir bei meinem Problem helfen. Vielen Dank :-)

von Atlas (Gast)


Lesenswert?

Hallo,
habe Deine Initialisierung mit der Init von mir verglichen.
Bei meiner lauffähigen Version habe ich zwischen den ersten Befehlen,
welche zum Display gesendet werden noch zwei zusätzliche Delays ein-
gefügt. Ich meine. dass im Datenblatt von dem Display steht, dass das
Display eine Ausführungszeit benötigt. Sofern man nicht das Busyflag
abfragt, welches bei den ersten Befehlen in der Init noch nicht der Fall 
ist, sollte man eine ausreichende Zeitverzögerung zwischen den einzelnen 
Befehlen setzen.

MfG

INIT_LCD  MOVLW  D'200'    ;Delay ==> 60,8 ms bei 4MHz Clock
    CALL  DELAY_VAR
    MOVLW  B'00110000'  ;
    MOVWF  PORTB
    BSF  PORTB,0
    NOP
    BCF  PORTB,0
    MOVLW  D'53'    ;Delay ==> 16,1 ms bei 4MHz Clock
    CALL  DELAY_VAR
    MOVLW  B'00110000'  ;
    MOVWF  PORTB
    BSF  PORTB,0
    NOP
    BCF  PORTB,0
    MOVLW  D'2'    ;Delay ==> 613 us bei 4MHz Clock
    CALL  DELAY_VAR
    MOVLW  B'00110000'  ;
    MOVWF  PORTB
    BSF  PORTB,0
    NOP
    BCF  PORTB,0
    MOVLW  D'1'    ;Delay ==> 309 us bei 4MHz Clock
    CALL  DELAY_VAR

    MOVLW  B'00100000'  ;auf 4 Bit Datenbus umstellen
    MOVWF  PORTB
    BSF  PORTB,0
    NOP
    BCF  PORTB,0

    MOVLW  B'00000001'  ;Display clear
    CALL  LcdControl
    MOVLW  B'00101000'  ;Function set, 4-bit  2-zeilig,
    CALL  LcdControl
    MOVLW  B'00001000'  ;Display, Cursor and Blinking OFF
    CALL  LcdControl
    MOVLW  B'00000110'  ;Entry mode set
    CALL  LcdControl
    MOVLW  B'00000011'  ;Cursor move to first digit
    CALL  LcdControl
    MOVLW  B'00001111'  ;Display, Cursor and Blinking ON
    CALL  LcdControl
    RETURN

von Martin M. (Gast)


Angehängte Dateien:

Lesenswert?

Vielen Dank für deine Antwort!

Ich hab jetzt mal die Schlafenszeiten erhöht :P und es scheint zu 
funktionieren. Nur ist mein LCD Display wohl beschädigt (hab das früher 
mal zu was anderem benutzt und bei dem einfachen Anlegen von Spannung 
schien das Display in Ordnung zu sein). Ich hab mal ein Foto angehängt. 
Die einzelnen dunklen Striche blinken fortlaufend. Bei Druck auf die 
Taster passiert nichts, beim betätigen des Reset Tasters am PIC geht das 
Display kurz auf und danach erscheinen wieder diese komischen Striche 
(er initalisiert das Display also von neuem)..

Nun ja, wenigstens ein Schritt weiter in Richtung Erfolg :) Jetzt muss 
nur ein funktionsfähiges Display her...

von Martin M. (Gast)


Angehängte Dateien:

Lesenswert?

Ich sehe gerade, man erkennt das DIsplay auf dem Foto nicht so toll, 
hier noch eine Nahaufnahme

von Atlas (Gast)


Lesenswert?

Hallo,

habe Dein Programm mal 1 zu 1 auf einen 16F628A geladen und ein
LCD-Display angeschlossen.
Bei mir erscheint auf dem Display fortlaufend der Text "OK:0", wie
Du es im Programm auch programiert hast.
Also muss etwas mit Deinem Hardwareaufbau nicht stimmen.
Aufgefallen sind mir noch folgende Punkte:
1. Das Programm reagiert nicht auf die Taster am Port A
2. In der Zeile "movlw  '0' " musst Du die Null in Anführungszeichen
    setzen, sonst erscheint ein undefiniertes Zeichen auf dem Display

MfG

von Martin M. (Gast)


Lesenswert?

Hi !

Es ist erfreulich, dass es bei dir funktioniert. Das mit den Tastern 
habe ich mir so gedacht:

Zuerst wird in W der wert 0 gespeichert, anschließend die checkKeys 
funktion aufgerufen. Ist hier eine der tasten gedrückt, wird wieder 
Zurückgekehrt (retlw) und dabei wird eben 'H' oder 'A' usw. in W 
geschrieben. Ist keine Taste gedrückt, kehrt er ohne Rückgabewert 
zurück, W bleibt also weiterhin 0 (hoffe ich).
Anschließend wird W in LcdDaten gespeichert. Wenn keine Taste gedrückt 
wurde (LcdDaten == 0), dann müsste doch auch das Zero Flag von LcdDaten 
gesetzt sein, oder?
Deswegen ist dann auch die Überprüfung nach dem Zeroflag (btfss 
LcdDaten, Z), denn wurde in dem Durchlauf keine Taste gedrückt, so muss 
auch nichts ausgegeben werden.. so wollte ich eine 
Endlos-Ausgabe-Schleife vermeiden.

Nur anscheinend stimmt dort etwas noch nicht, aber das mit dem 0 setzen 
für LcdDaten sollte dann doch das Zero Flag aktivieren, oder? Wenn 
nicht, könnte das natürlich ein Fehler sein..

von Atlas (Gast)


Lesenswert?

Hallo,

hier noch zwei Anmerkungen:

1. Port A ist nach dem Start auf Komparator-Betrieb eingestellt.
    Es muss erst auf digital I/O umgeschaltet werden.
    MOVLW  B'00000111'  ;Disable Comparator module's
    MOVWF  CMCON

2. Der Befehl " btfss  LcdDaten, Z " überprüft nicht ob das Register
    LcdDaten leer ist. Er überprüft nur, ob das Bit 2 im Register
    LcdDaten gesetzt ist. Um zu überprüfen, ob das Register leer ist,
    muss man eine Operation ausführen, die das Zero-Flag im Register
    STATUS beeinfusst und dieses dann abfragen. Z.B.
      MOVF  LcdDaten,F
      BTFSS  STATUS,Z

MfG

von Martin M. (kaktus621) Benutzerseite Flattr this


Angehängte Dateien:

Lesenswert?

Hallo !

Ich habe mir nun bei Pollin ein neues Display gekauft, ein POWERTIP PC 
1602-F (Best.Nr.: 120 476). Die PINs habe ich nun wieder nach dem dort 
verfügbaren Datenblatt verbunden.
Als ich nun meine Anwendung testen wollte, habe ich folgendes 
Festgestellt:

1.) Der 10k Poti für den Kontrast steht am Anschlag, trotzdem sind die 
schwarzen Blöcke nur ziemlich schwach zu erkennen.

2.) Mehr als die schwarzen Blöcke werden nicht angezeigt, also wieder 
ein Problem mit der Initalisierung? Im Datenblatt steht leider keine 
genaue Reihenfolge, aber sie müsste doch eigentlich identisch mit der 
des anderen Displays sein.

Ich habe auch mal die Suchfunktion betätigt und fand in einem Beitrag, 
dass man die 4 unbenutzten Datenpins mit GND verbinden sollte - gesagt, 
getan - trotzdem keine Änderung.

Was könnte also mein Problem sein? Im Anhang nochmal der Quellcode, der 
zur Zeit auf dem PIC ist (kleine Veränderungen zu vorher, wie nach euren 
Vorschlägen).

von Martin M. (kaktus621) Benutzerseite Flattr this


Lesenswert?

Hat denn keiner eine Idee?

Ich habe nun auch mal ein DataVision DV-20208 ( Pollin : 120 519 ) 
getestet, gleiches Ergebnis, auch wenn hier der Schwarze Balken vom 
Kontrast her deutlicher zu sehen ist. Aber ansonsten keine Anzeige.

Hab auch das LCD Uhr 32 Beispiel von sprut.de auf den Chip geschrieben, 
einen "Mini-Uhrenquarz" von Reichelt ( 32 kHz ) angeschlossen und auch 
da nur ein schwarzer Balken.

Was könnte da nicht stimmen??
Ich bitte euch um hilfe..

von Martin M. (kaktus621) Benutzerseite Flattr this


Lesenswert?

Ähem...

ein Einfaches "Nein" würde mir auch reichen, wenn keiner weiter weiß.. 
aber muss der Thread denn ignoriert werden? Ich verzweifel langsam... 
Irgendwo muss ich doch einen Fehler haben, da beide Displays nicht 
Ordnungsgemäß funktionieren. Ein Fehler in der Schaltung könnte es 
eigentlich nicht sein, da zB bei einem Lauflicht Beispiel, dass ich 
gemacht habe, alle LED's korrekt aufleuchten, die Datenleitungen müssten 
also OK sein.

Und die Pin Belegung an die Display's habe ich nach dem Schaltbild auf 
Sprut genommen und eben mit den Datenblättern der beiden Displays 
abgeglichen.

Irgendeiner eine Idee ... vielleicht ??

Vielen Vielen Dank im Vorraus.. und diesmal nicht so einfach ignorieren 
und 2 Seiten nach unten fallen lassen :-)

von holger (Gast)


Lesenswert?

>Irgendeiner eine Idee ... vielleicht ??

Du benutzt einmal PORTB und einmal PORTD
für die Ausgabe der Daten. Du solltest dich mal entscheiden ;)

von Martin M. (kaktus621) Benutzerseite Flattr this


Lesenswert?

holger wrote:
>>Irgendeiner eine Idee ... vielleicht ??
>
> Du benutzt einmal PORTB und einmal PORTD
> für die Ausgabe der Daten. Du solltest dich mal entscheiden ;)


Ich verweise mal auf die Definitionen :
1
;***** CONTANT DEFINITIONS
2
PORTC  equ  PORTB    ; LCD-Control-Port
3
PORTD  equ  PORTB    ; LCD-Daten-Port
4
LcdE  equ  0    ; enable Lcd
5
LcdRw  equ  3    ; read Lcd
6
LcdRs  equ  2    ; Daten Lcd (nicht control)  
7
Ini_con Equ  B'00000000'  ; TMR0 -> Intetupt disable
8
Ini_opt  Equ  B'00000010'  ; pull-up

Ich hab das so aus dem Beispiel übernommen, und da ich einfach nur die 
Funktionalität des Displays testen wollte, habe ich so wenig wie möglich 
verändert und aus dem Grund diese definition so gelassen (ja, ich finde 
sie auch etwas komisch, aber was solls)

von holger (Gast)


Lesenswert?

>PORTC  equ  PORTB    ; LCD-Control-Port
>PORTD  equ  PORTB    ; LCD-Daten-Port

Mach das weg. Das ist doch pervers.

Statt LCDBusy abzufragen reicht es einfach mal
etwas länger als 100us zu warten.

Und das hier:


  bsf  PORTC, LcdRs  ; Daten
  nop
  bsf  PORTC, LcdE  ; Enable LcdBus
  nop
  bcf  PORTC, LcdE  ; Disable LcdBus
  swapf  LcdDaten, w
  andlw  H'F0'
  movwf  PORTD    ; Lo-teil Daten schreiben
  bsf  PORTC, LcdRs  ; Daten
  nop
  bsf  PORTC, LcdE
  nop
  bcf  PORTC, LcdE  ; Disable LcdBus
  nop
  bcf  PORTC, LcdRs  ;

von holger (Gast)


Lesenswert?

Vergiss meine Posts oben, das hier hatte ich übersehen:

>habe Dein Programm mal 1 zu 1 auf einen 16F628A geladen und ein
>LCD-Display angeschlossen.
>Bei mir erscheint auf dem Display fortlaufend der Text "OK:0", wie
>Du es im Programm auch programiert hast.

Dein Display ist falsch angeschlossen, Kurzschluss oder
offene Leitung. Masse vergessen oder VCC nicht richtig angeschlossen.

Also überprüfe deine Schaltung einfach noch ein paar mal
SEHR gründlich.

von Atlas (Gast)


Lesenswert?

Habe Deine letzte Programmversion auch auf einen 16F628A mit
einem LCD_Modul 162C übertragen.
Bei mir erscheint auch "OK:" nach der Initialisierung auf dem
Display.
Kann mich Holger nur anschließen. Es muss an deinem Hardwareaufbau
liegen.

MfG

von Martin M. (kaktus621) Benutzerseite Flattr this


Lesenswert?

Hmm Okay danke, das mit den Tasten klappt auch?

Nun gut.. dann werd ich mich gleich nochmal dransetzen.. wegen den 
offenen Leitungen -> Müssen also D0 - D3 mit GND vom Display verbunden 
werden? (was ich übrigens auch mal getestet habe, und trotzdem kein 
Erfolg)

Und an den Displays selbst liegt es wahrscheinlich nicht, oder? Laut 
Pollin sind beide HDD44780 Kompatibel.

von holger (Gast)


Lesenswert?

>Nun gut.. dann werd ich mich gleich nochmal dransetzen.. wegen den
>offenen Leitungen -> Müssen also D0 - D3 mit GND vom Display verbunden
>werden?

Bei meinen Displays brauchte ich das noch nie.
Und ich hab ne Menge Displays ;) Schaden tuts aber
auch nicht.

>1.) Der 10k Poti für den Kontrast steht am Anschlag, trotzdem sind die
>schwarzen Blöcke nur ziemlich schwach zu erkennen.

Ich tippe auf VCC oder GND nicht richtig angeschlossen.

von Atlas (Gast)


Lesenswert?

Die nicht benutzten Anschlüsse vom Display (D0-D3) habe ich nicht
mit Masse verbunden. Bei mir sind die Ansclüsse offen und es 
funktioniert
auch.

Füge mal in der Display-Initialisierung die Zeile "GOTO $" ein.
Dann bleibt das Programm an dieser Stelle hängen. Dann kannst Du
direkt an den Anschlüssen des Displays messen, welche 0V oder 5V
führen.

Beispiel:

InitLCD
  movlw  D'255'
  movwf  loops
  call  WAIT

  movlw  B'00110000'
  movwf  PORTB
  bsf  PORTB, LcdE
        GOTO    $
  nop
  bcf  PORTB, LcdE
        ....

MfG

von Martin M. (kaktus621) Benutzerseite Flattr this


Lesenswert?

Also hab das GOTO $ mal eingefügt und die Spannungen gemessen.

An dem Display hatten D4 und D5 +5 Volt (bzw. genauer gesagt laut meinem 
Messgerät 4.89V) und die Restlichen Datenleitungen ( D6, D7, E, RW, R/S 
) jeweils 0V.
Zusätzlich lag an Pin 1 von Port B auch eine Spannung von +5V an, dieser 
Pin ist aber mit nichts verbunden.

von Atlas (Gast)


Lesenswert?

Wenn Du den Haltepunkt an der oben angegebenen Stelle eingefügt hast,
dann müsste auch der Anschluss "Enable" vom Display auf +5V liegen.

MfG

von Martin M. (kaktus621) Benutzerseite Flattr this


Lesenswert?

Das erste Display funktioniert nun einwandfrei :) Hab den Thread über 
meine Erkenntnis versehentlich gelöscht, um es kurz zu sagen ich hab bei 
der Pinbelegung am PIC Pin 0 mit Pin 1 vertauscht!

Soo bezüglich des Zweiten Displays:

Habe das 10k Poti komplett gegen ein neues eingetauscht (hab das alte 
nochmal Nachgemessen, ist völlig in Ordnung) und auch hier hab musste 
ich bis zum Anschlag drehen um ganz blasse Kästchen angezeigt zu 
bekommen, von einem OK keine Spur..

Könnte es also sein, dass das Display eine negative Kontrastspannung 
benötigt?!

Der Widerstand zw. Masse Pin und Schieber ist (da ja der Schieber 
komplett bis zum Anschlag gedreht) = 0. Das bedeutet für meine 
bescheidenen Elektronikkenntnisse, dass somit 0V am Kontrastpin 
anliegen, trotzdem nur schwache Anzeige. Je weiter ich es in richtung + 
drehe, wird es noch blasser
==> Kann es also sein, dass das Display eine negative Kontrastspannung 
benötigt?

von PICKOLiK (Gast)


Lesenswert?

ich habe es heute gesehen und auf PIC 16F628A übertragen..Es 
funktioniert einwandfrei ( auch mit Tasten )..Ich habe es erweitert ( 6 
tasten ) und statt Buchstaben , die zahlen eingegeben:Das Ergebnis ist 
Perfekt..Aber nur erste Zeile..
Auf dir 2.te zeile springt nicht weiter

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.