Forum: Mikrocontroller und Digitale Elektronik LCD @32kHz


von Tom (Gast)


Lesenswert?

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

von Eddie (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.