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...
Ich sehe gerade, man erkennt das DIsplay auf dem Foto nicht so toll, hier noch eine Nahaufnahme
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 :-)
>Irgendeiner eine Idee ... vielleicht ??
Du benutzt einmal PORTB und einmal PORTD
für die Ausgabe der Daten. Du solltest dich mal entscheiden ;)
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)
>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 ;
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.
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
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
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.