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.