Hallo
ich habe da ein Problem mit einem Pic16F84, der soll bei einer
Quarzfreqenz von 32,768Khz ein LC-Display im 4bit-Modus ansteuern.
Zum Problem: Es klappt nicht! Genauer gesagt es klappt nicht bei Quarz,
denn sobalt ich einen 4MHz Quarz einsetze läuft das Programm auf anhieb.
Hier das Programm:
include p16f84.inc
_T equ b'01010100'
_l equ b'01101100'
_o equ b'01101111'
STATUS2 equ 20 ; REGISTER 20
LCDBSY2 equ 6
LCDDATA equ 21 ; REGISTER 21
E equ 1 ; PORTB,1
RS equ 2 ; PORTB,2
RW equ 3 ; PORTB,3
LCD equ PORTB
BSY equ 7 ; PORTB,7
;################################################################
clrf STATUS
clrf STATUS2
goto Start
Busy_Flag
movlw b'00000001'
andwf LCD,F
bsf STATUS,RP0
bsf LCD,BSY ; PORTB,7 ist Eingang
bcf STATUS,RP0
bsf LCD,RW
bsf LCD,E
bcf STATUS2,LCDBSY2
btfsc LCD,BSY
bsf STATUS2,LCDBSY2
bcf LCD,E
bsf LCD,E
bcf LCD,E
btfsc STATUS2, LCDBSY2
goto Busy_Flag
bsf STATUS,RP0
bcf LCD,BSY
bcf STATUS,RP0
return
SchreibeBefehlLCD
movwf LCDDATA
call Busy_Flag
goto Uebertagung
SchreibeDatenLCD
movwf LCDDATA
call Busy_Flag
bsf LCD, RS
Uebertagung
bcf LCD, RW
movf LCDDATA,W
andlw b'11110000'
bsf LCD, E
iorwf LCD,F
nop
bcf LCD, E
movlw b'00001111'
andwf LCD,F
swapf LCDDATA,W
andlw b'11110000'
bsf LCD,E
iorwf LCD, F
bcf LCD, E
return
;################################################################
Start
clrf LCD
bsf STATUS, RP0
clrf TRISB ; PORTB ist Ausgang
bcf STATUS, RP0
LCDINI bcf LCD, E
clrf LCD
bcf STATUS, RP1
bsf STATUS, RP0
bcf OPTION_REG,7
bsf TRISB,BSY
bcf STATUS, RP0
bcf LCD, RS
bsf LCD, RW
bsf LCD, E
btfsc LCD , BSY
goto LCDINI
bcf LCD, E
bcf LCD, RW
bsf STATUS, RP0
bcf TRISB,BSY
bcf STATUS, RP0
bsf LCD, 5
bsf LCD, E
bcf LCD, E ; Setze LCD Funktion auf 4bit- ; Uebertragung
movlw b'00101000' ; 4bit Datenlänge, 2-zeiliges
call SchreibeBefehlLCD ; Display, 5*7 Front
movlw b'00001111' ; Display ein, Curser ein,
call SchreibeBefehlLCD ; Curser blinkt
movlw b'00000001' ; lösche LCD, Curser auf 1Position
call SchreibeBefehlLCD
movlw b'00000110' ; Eingabemodus
call SchreibeBefehlLCD
movlw _T
call SchreibeDatenLCD
movlw _o
call SchreibeDatenLCD
movlw _l
call SchreibeDatenLCD
movlw _l
call SchreibeDatenLCD
loop
goto loop
end
Hi Tom, dein Programm ist bei 32kHz etwa 122 mal langsamer als bei 4MHz! Das ganze Timing für das LCD stimmt nicht mehr. Du solltest im Datenblatt des LCDs das Timing nachschauen und das Prog entsprechend umstellen. Bei 32,768 kHz braucht ein PIC-Befehl ca. 122µs (ausser Sprungbefehle, die brauchen doppelt so lange siehe PIC Datenblatt). Viel Erfolg, Eddie
Potz Blitz du hast recht! Es lag daran das ich zuerst das E-bit gesetzt
hatte, dann die Nibel auf den Port gelegt hatte und erst dann wieder das
E-bit gelöscht habe.
Richtig währe gewesen 1. Daten schreiben
2. E-bit setzen
3. E-bit löschen.
(Das Flusdiagramm im Datenblatt sagt da zwar ertwas anderes, aber wenn
es funktioniert)
Nochmal Danke für die schnelle Hilfe
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.