-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Problem mit LCD an PIC

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979

    Problem mit LCD an PIC

    Anzeige

    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?

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2005
    Beiträge
    195
    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.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    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?

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2005
    Beiträge
    195
    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.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    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

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    13.08.2005
    Beiträge
    195
    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.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    67
    Beiträge
    2.063
    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.
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    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

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    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


    Code:
    ;-----------------------------------------------------------------------------------------------------------------
    ; 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)

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.04.2005
    Ort
    Aarau
    Alter
    34
    Beiträge
    979
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •