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 :-)
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
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...
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
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..
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
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).
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..
Ä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 :-)
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 :
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)
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.
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
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.
>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.
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
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.
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?
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