Ok 1 tag später keine antwort, aber mehr erkenntnisse...
vergesst das programm ich hab wiedermal ein neues geschrieben
diesmal funzt es soweit, dass mir das display wirklich buchstaben anzeigt... nur leider nicht die die es soll...
das display zeigt nur buchstaben an bei denen das UNTERE nibble "HHHH" also 1111 ist... und es sieht für mich so aus als würde es die buchstaben an der falschen stelle im display anzeigen... kann mir das vielleicht nu jemand erklären? ein kleiner teilerfolg iss ja zu vermerken
!
EDIT: noch ne neue erkenntniss: wenn ich die am LCD freigebliebenen pins mit Pulldowns nach masse lege, dann zeigt es buchstaben mit "LLL" im unteren nibble an
->daraus folgt: fehler bei der Initialisierung... und genau da liegt der hund begraben.... aslo bitte ich nochmal um ne genaue beschreibung des 4 bit initvorganges (betonung liegt auf genau)
hier mal das Programm: wo liegt der Fehler... Danke
list p=16f628
include "p16f628.inc"
loops equ 0x20 ; Wartezeit für WAIT in Millisekunden
loops2 equ 0x21 ; interner timer für wait
sendbuff equ 0x22 ; sendepuffer
#define LcdE PORTB,7 ; enable Lcd
#define LcdRw PORTB,6 ; read Lcd
#define LcdRs PORTB,5 ; Daten Lcd (nicht control)
#define LcdPort PORTB ; Datenbus des LCD (obere 4 Bit)
org 0x00
;initialisierung und aktrivierung
init1
bsf STATUS, RP0 ; auf Bank 1 umschalten
movlw B'00000000' ; PortB alle output
movwf TRISB ;setzen
bcf STATUS, RP0 ; auf Bank 0 zurückschalten
movlw B'00000000' ; PortB löschen
movwf LcdPort
init2
movlw B'00000011' ;initschritt1
call send8bit ;senden an port B
movlw D'255' ;255 ms warten
movwf loops
call wait
movlw B'00000011' ;initschritt2
call send8bit ;senden an port B
movlw D'255' ;255 ms warten
movwf loops
call wait
movlw B'00000011' ;initschritt3
call send8bit ;senden an port B
movlw D'255' ;255 ms warten
movwf loops
call wait
movlw B'00000010' ;initschritt4 Function set 4-bit (das erste mal)
call send8bit ;senden an port B
movlw D'255' ;255 ms warten
movwf loops
call wait
;ab hier im 4 bit modus
movlw B'00100010' ;initschritt7 zeilen, zeichensatz einstellen
call send4bit ;senden an port B
movlw D'255' ;255 ms warten
movwf loops
call wait
movlw B'00001100' ;initschritt8 Display ON
call send4bit ;senden an port B
movlw D'255' ;255 ms warten
movwf loops
call wait
movlw B'00000001' ;initschritt9 Display LÖSCHEN
call send4bit ;senden an port B
movlw D'255' ;255 ms warten
movwf loops
call wait
movlw B'00000111' ;initschritt10 Display ENTRY mode
call send4bit ;senden an port B
movlw D'255' ;255 ms warten
movwf loops
call wait
;OK ausgeben
movlw 'O'
call sendchar
movlw D'255' ;255 ms warten
movwf loops
call wait
movlw B'01001111'
call sendchar
movlw B'01001011' ;255 ms warten
movwf loops
call wait
goto haupt
;____________________________________________________________________________
;hauptschleife
haupt
nop
goto haupt
;______________________________________________________________________________
;sendebefehle
;8-Bittig
send8bit
movwf sendbuff ;wert im arbeitsregister auf sendepuffer zwischenspeichern
andlw b'00001111' ;nur den datenteil des ports beibehalten
movwf PORTB ;genau diesen teil auf port B schreiben
bsf LcdE ;register im LCD zum lesen freigeben
nop ;kurz warten
movlw D'255' ;255 ms warten
movwf loops
call wait
bcf LcdE ;hi->lo flanke erzeugen
movlw B'00000000' ; PortB löschen
movwf LcdPort
movlw D'25' ;25 ms warten
movwf loops
call wait
return ;rücksprung zum aufruf
;___________________________________________________________________________________________
;4-bittig
;Contorl:
send4bit
movwf sendbuff ;wert im arbeitsregister auf sendepuffer zwischenspeichern
;high nibble senden
swapf sendbuff,w ;zuerst das high nibble holen
andlw b'00001111' ;nur den datenteil des ports beibehalten
movwf PORTB ;genau diesen teil auf port B schreiben
bsf LcdE ;register im LCD zum lesen freigeben
movlw D'255' ;255 ms warten
movwf loops
call wait
nop ;kurz warten
bcf LcdE ;hi->lo flanke erzeugen
movlw B'00000000' ; PortB löschen
movwf LcdPort
;low nibble senden
movlw D'25' ;25 ms warten
movwf loops
call wait
movf sendbuff,w ;jetzt das low nibble holen
andlw b'00001111' ;nur den datenteil des ports beibehalten
movwf PORTB ;genau diesen teil auf port B schreiben
bsf LcdE ;register im LCD zum lesen freigeben
movlw D'255' ;255 ms warten
movwf loops
call wait
nop ;kurz warten
bcf LcdE ;hi->lo flanke erzeugen
movlw B'00000000' ; PortB löschen
movwf LcdPort
return ;rücksprung zum aufruf
;___________________________________________________________________________________________
;BUCHSTABEN SENDEN
sendchar
movwf sendbuff ;wert im arbeitsregister auf sendepuffer zwischenspeichern
;high nibble senden
swapf sendbuff,w ;zuerst das high nibble holen
andlw b'00001111' ;nur den datenteil des ports beibehalten
movwf PORTB ;genau diesen teil auf port B schreiben
bsf LcdRs ;für das display als buchstabe markieren
bsf LcdE ;register im LCD zum lesen freigeben
movlw D'255' ;255 ms warten
movwf loops
call wait
nop ;kurz warten
bcf LcdE ;hi->lo flanke erzeugen
bcf LcdRs ;für das display als buchstabe markieren abschalten
movlw B'00000000' ; PortB löschen
movwf LcdPort
;low nibble senden
movlw D'25' ;25 ms warten
movwf loops
call wait
movf sendbuff,w ;jetzt das low nibble holen
andlw b'00001111' ;nur den datenteil des ports beibehalten
movwf PORTB ;genau diesen teil auf port B schreiben
bsf LcdRs ;für das display als buchstabe markieren
bsf LcdE ;register im LCD zum lesen freigeben
movlw D'255' ;255 ms warten
movwf loops
call wait
nop ;kurz warten
bcf LcdE ;hi->lo flanke erzeugen
bcf LcdRs ;für das display als buchstabe löschen
movlw B'00000000' ; PortB löschen
movwf LcdPort
return ;rücksprung zum aufruf
;Warten______________________________________________________________________________________
wait
top movlw .254 ; timing adjustment variable (1ms)
movwf loops2
top2 nop ; warten und nichts tun
nop
nop
nop
nop
nop
nop
nop
nop
decfsz loops2, F ; innere Schleife fertig?
goto top2 ; nein, noch mal rum
;
decfsz loops, F ; äußere Schleife fertig?
goto top ; nein, noch mal rum
return ; FERTIG und return
END
Ich entschuldige mich für die nerverei, aber wenigstens jornbyte oder alpha ranger könnten da doch durchsteigen oder?
mfg QuirinO
[ Diese Nachricht wurde geändert von: QuirinO am 9 Jan 2004 13:47 ]