PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit LCD an PIC



Bluesmash
04.06.2007, 07:40
Hallo Zusammen

wir arbeiten in der schule (leider) mit Pic's und programmieren in asm. momentan sind wir am LCD (2x16), die initialisierung klappt wunderbar, cursor blinkt an der ersten stelle in der oberen zeile.
wenn ich jetzt aber ein zeichen sende habe ich das problem dass ich gar nichts mehr auf dem display sehe, cursor weg und display zeigt nichts an.
hatte schonmal jemand dieses problem? oder an was könnte es liegen?

Benedikt.Seidl
04.06.2007, 08:30
leider mit pics... na na na! und dann auch noch hier hilfe erwarten pah!

;-) kleiner spaß.

hast du evtl. vergessen die "RS" leitung auf low zu setzten?
das ist das einzige was mir auf die schnelle einfällt.

SEIDL.

Bluesmash
04.06.2007, 08:41
naja ich arbeite im hobby halt mit avr's und bascom ;) da geht das alles einwenig einfacher :)

bei der übertragung der einstellungen (initialisieren) ist ja RS auf low, und beim übertragen der daten setze ich RS auf high habe es auch nachgemessen, der high pegel stimmt....

wir betreiben das lcd im 4bit modus...
übertragung der daten:
-RS auf high
-die höheren 4bit an die datenleitungen legen
-E kurz auf high
-kurz warten
-die niederwertigen 4bit an die datenleitungen
-E kurz auf high
-RS wieder auf low

gruss bluesmash

sollte doch so funktionieren?

Benedikt.Seidl
04.06.2007, 08:51
ist schon bisschen lange her, wie ich mit 4 bit rumgemacht habe,.. aber evtl. ist das "kurz auf high" einfach zu kurz.

(ich stell es mir auch grausam vor mit avrs und c arbeiten zu müssen ;-)

SEIDL.

Bluesmash
04.06.2007, 10:03
ich habe auch mal 2ms gewartet zwischen high und low... und bei der initialisierung geht es ja auch, ich habe mir mal ein paar beispiele angeschaut und da war auch nur ein nop zwischen high und low, das habe ich auch probiert...

aber komisch ist einfach dass sich das display ausschaltet... es ist nichts mehr zu sehen, übrigens ein klassenkollege hat genau das selbe problem (gleiches pic-board, lcd).

gruss bluesmash

Benedikt.Seidl
04.06.2007, 10:21
also eine letzte idee habe ich noch,... einfach der kontrast zu schwach?

du kannst auch mal den code online stellen, evtl. sieht da jemand was,..

ich habe jetzt keine ideen mehr :-/

SEIDL.

kalledom
04.06.2007, 10:40
Warum veränderst Du den RS (Data/Command) ständig ?

Wenn Du kein Busy-Bit abfragst, das R/W-Signal auf Low und nicht mehr verändern.
Bei der Ausgabe von Daten setzt Du als erstes RS auf High, dann nicht mehr verändern bis zur Ausgabe von Befehlen; da setzt Du als erstes RS auf Low, dann nicht mehr verändern bis zur Ausgabe von Daten; da setzt Du ....
Also, 2 Subrotinen z.B. LcdDat und LcdCmd. Bei LcdDat wird zuerst RS auf High gesetzt, bei LcdCmd auf Low. Dann geht es für beide Subroutinen gemeinsam weiter zur Ausgabe der beiden Nibl.
Nach jedem Nibl den Ausgang für Enable auf High, NOP, Enable auf Low.
Dazwischen eine kurze Wartezeit. Nach Ausgabe der beiden Nibl eine längere Wartezeit, damit das Byte auch vom Display verarbeitet werden kann.

Bluesmash
04.06.2007, 10:50
Kontrast ist ok, sonst würde ich ja auch den cursor nach dem initialisieren nicht sehen...

im moment geht es halt einfach mal darum ein zeichen auszugeben... darum das high/low mit RS aber sollte ja trozdem funktionieren, wenn es dann mal läuft werde ich alles schön mit subroutinen programmieren....

wartezeiten habe ich eigentlich drin... funktioniert aber nicht... ich kann mir einfach nicht erklären warum.... :( den code hab ich leider gerade nicht zur hand... stell in dan online wenn ich wieder zu hause bin... an der verdrahtung sollte es nicht liegen, da es ein fertiges board ist welches auch schon von unseren vorgängern benutzt wurde... und es lief darauf schonmal ein demoprogramm welches funktionierte...

gruss bluesmash

Bluesmash
04.06.2007, 12:31
Hab den Code doch noch auf dem USB Stick gefunden... war zwar nicht ganz komplett aber habe den rest noch ergänzt... :)

bitte nicht hauen für die Programmierung ;) es wird dann schon noch alles schön mit senderoutinen und so gemacht, ist halt einfach für den ersten test...

gruss bluesmash




;-----------------------------------------------------------------------------------------------------------------
; LCD Ansteuerung
;-----------------------------------------------------------------------------------------------------------------
;
; Autor: Roman Sutter
; Datum: 28.04.2007
; Filename: LCD.asm
;
;-----------------------------------------------------------------------------------------------------------------
;
; Programmfunktion:
; Name auf LCD ausgeben
;
;-----------------------------------------------------------------------------------------------------------------
;
;
;
;
;
;
;
;
;
;
;
;
;-----------------------------------------------------------------------------------------------------------------


;-----------------------------------------------------------------------------------------------------------------
; Definition des Prozessors:
;-----------------------------------------------------------------------------------------------------------------

list p=16f873
#include <p16f873a.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

;-----------------------------------------------------------------------------------------------------------------
; Makros Bankumschaltung
;-----------------------------------------------------------------------------------------------------------------

BANK_0 MACRO
BCF STATUS,5
BCF STATUS,6
ENDM

BANK_1 MACRO
BSF STATUS,5
BCF STATUS,6
ENDM

BANK_2 MACRO
BCF STATUS,5
BSF STATUS,6
ENDM

BANK_3 MACRO
BSF STATUS,5
BSF STATUS,6
ENDM

;-----------------------------------------------------------------------------------------------------------------
; Variablen Definitionen
;-----------------------------------------------------------------------------------------------------------------

w_temp EQU 0x70
status_temp EQU 0x71
counter EQU 0x72


;Variablen für Wait
Zähler1 EQU 0x22
Zähler2 EQU 0x23
Zähler3 EQU 0x24

;-----------------------------------------------------------------------------------------------------------------
; Konstanten
;-----------------------------------------------------------------------------------------------------------------

FOSC = .4000000 ;Oszillator Frequenz
Zeitkonstante = .100 ;Konstante für Wartezeit *10ms

;-----------------------------------------------------------------------------------------------------------------
; Definitionen
;-----------------------------------------------------------------------------------------------------------------

#DEFINE lcd_e PORTA,2
#DEFINE lcd_rs PORTA,5
#DEFINE lcd_rw PORTC,1

;-----------------------------------------------------------------------------------------------------------------
; Adresse für Programm Start und Interrupt Vektor
;-----------------------------------------------------------------------------------------------------------------

ORG 0x000 ;Prozessor Reset Vector
clrf PCLATH ;PC cleared
goto HW_Config ;An den Anfang des Programms springen

ORG 0x004 ;Interrupt Vector
movwf w_temp ;Inhalt des W-Register speichern
movfw STATUS ;Statusregister in W-Register kopieren
movwf status_temp ;Status in status_temp speichern

HW_Config

;-----------------------------------------------------------------------------------------------------------------
; Configuration Ports
;-----------------------------------------------------------------------------------------------------------------
BANK_1
;Ausgänge für LED
movlw 0x00 ;0=Output 1=Input
movwf TRISC ;Alle Pin's an Portc als Ausgänge definieren

;Ports für Matrixtastatur
movlw B'11110000' ;PortB4-B7 Als Eingänge, B0-B3 als Ausgänge Definieren
movwf TRISB
bcf OPTION_REG,7 ;Pull-UP Widerstände aktivieren

;Ports für LCD Display
movlw B'11011011' ;PortA2+5 als Ausgänge, Rest Eingänge
movwf TRISA

;-----------------------------------------------------------------------------------------------------------------
; Start Programm
;-----------------------------------------------------------------------------------------------------------------
BANK_0


call lcd_init

call wait_1s

;Zeichen Ausgeben
bcf lcd_e
bsf lcd_rs
bcf lcd_rw

movlw b'00000101' ;High Nibble
movwf PORTB
bsf lcd_e
NOP
bcf lcd_e
call wait_2ms
movlw b'00001001' ;Low Nibble
movwf PORTB
bsf lcd_e
NOP
bcf lcd_e
call wait_2ms

warten
goto warten

;#####--Subroutine LCD Initialisieren--#####
lcd_init
call wait_1s
;Steuerleitungen setzen
bcf lcd_e
bcf lcd_rs
bcf lcd_rw
;LCD in 4-Bit Modus Schalten
movlw b'00000010'
movwf PORTB
bsf lcd_e
bcf lcd_e
call wait_2ms
;4-Bit datenlänge, 2-Zeiliges Display, 5x7 Font
movlw b'00000010' ;High Nibble
movwf PORTB
bsf lcd_e
bcf lcd_e
call wait_2ms
movlw b'00001000' ;Low Nibble
movwf PORTB
bsf lcd_e
bcf lcd_e
call wait_2ms
;Display ein. Cursor ein, Cursor blinken
movlw b'00000000' ;High Nibble
movwf PORTB
bsf lcd_e
bcf lcd_e
call wait_2ms
movlw b'00001111' ;Low Nibble
movwf PORTB
bsf lcd_e
bcf lcd_e
call wait_2ms
;Display löschen, Cursor auf 1. Spalte von 1. Zeile
movlw b'00000000' ;High Nibble
movwf PORTB
bsf lcd_e
bcf lcd_e
call wait_2ms
movlw b'00000001' ;Low Nibble
movwf PORTB
bsf lcd_e
bcf lcd_e
call wait_2ms
;Cursor Auto-Increment
movlw b'00000000' ;High Nibble
movwf PORTB
bsf lcd_e
bcf lcd_e
call wait_2ms
movlw b'00000110' ;Low Nibble
movwf PORTB
bsf lcd_e
bcf lcd_e
call wait_2ms

return



;#####--Subroutine 2ms Warten--#####
wait_2ms
movlw .3 ;Schleife mit 3 * 750us
movwf Zähler2
Schleife2
movlw .250
movwf Zähler1 ;Schleife mit 250 Durchgängen ca. 750us
Schleife1
DECFSZ Zähler1
goto Schleife1
DECFSZ Zähler2
goto Schleife2

return


;#####--Subroutine 1s Warten--#####
wait_1s
movlw .100 ;Zähler3 mit Wert für 1s Schleifendurchläufe laden
movwf Zähler3
Schleife_3
movlw .13 ;Schleife für Zählung der 10ms Schleifendurchläufe
movwf Zähler2
Schleife_2
movlw .250
movwf Zähler1 ;Schleife mit 250 Durchgängen ca. 750us
Schleife_1
DECFSZ Zähler1
goto Schleife_1
DECFSZ Zähler2
goto Schleife_2
DECFSZ Zähler3
goto Schleife_3

return


END (für Assembler)

Bluesmash
04.06.2007, 15:49
habe jetzt gerade gelesen dass man den cursor entweder auf "unterstrich" oder "blinkend" schalten kann? stimmt es dass nur eines geht? bei mir ist es so dass ich beides sehe... blinkender cursor und wenn er während dem blinken weg ist sehe ich den unterstrich...


---edit---

http://www.sprut.de/electronic/lcd/index.htm
ganz unten ist ein beispiel für die 4-Bit Initialisierung, ist es nötig dass man das Display 3-mal!! auf 8-Bit einstellt bevor man in den 4-Bit Betrieb wechselt?


gruss bluesmash

GoTo
04.06.2007, 19:51
Ich habe hier ein 2x16 LCD mit einem KS0070B Controller, der mit dem bei sprut beschriebenen HD44780 kompatibel ist, und laut Datenblatt ist ein 3maliges Senden des Wortes 0011****, also 8-bit, mit unterschiedlichen Wartezeiten nötig. Erst dann kann man es auf 4-bit stellen.

Bluesmash
04.06.2007, 20:01
ich habe gerade vor 5min den fehler gefunden... ich hatte die A-ports nicht auf digital umgestellt... jetzt funktionierts...

danke an alle für die hilfe!

@GoTo: bei mir geht es ohne das 3malige einstellen auf 8-Bit.....

gruss Bluesmash

Benedikt.Seidl
04.06.2007, 20:04
http://www.sprut.de/electronic/lcd/index.htm
ganz unten ist ein beispiel für die 4-Bit Initialisierung, ist es nötig dass man das Display 3-mal!! auf 8-Bit einstellt bevor man in den 4-Bit Betrieb wechselt?

wie goto schon sagte: ja es ist nötig und zwar auch mit den pausen dazwischen, wie angegeben.

das hat mich an deinem code auch ein bisschen gewundert ;-) du willst schon so ein HD44780 kompatibles display ansteuern?!

SEIDL.

Bluesmash
04.06.2007, 20:18
jep ist so ein display... aber es läuft jetzt sehr gut! ohne die 3mal auf 8-bit initialisieren...


gruss bluesmash

GoTo
04.06.2007, 20:32
hab das grad mal selber probiert und festgestellt: es geht tatsächlich nur mit einer Routine. Ich könnte mir denken, dass dabei das automatische PowerOn-Reset im LCD die nötigen Einstellungen vornimmt. Allerdings weiß ich jetzt nicht, wozu dann diese drei Befehle gut sein sollen, da sie ja auf Grund langer Wartezeiten mehrere ms in Anspruch nehmen.