Forum: Mikrocontroller und Digitale Elektronik HD44780 8bittig ansteuern mit PIC18F4550


von PrototypePHX (Gast)


Lesenswert?

Hallo,

will ein HD44780-Display 8bittig mit einem PIC18F4550 über Assembler 
ansteuern, krieg es aber nicht gebacken bzw. finde meinen Fehler nicht. 
Ich kann lediglich den Kontrast einstellen. Hier mein Code:
1
init
2
  CLRF  TRISB
3
  CLRF  PORTB
4
5
  CLRF  TRISC
6
  CLRF  PORTC
7
8
9
#define DB0  PORTB, RB0
10
#define DB1  PORTB, RB1
11
#define DB2  PORTB, RB2
12
#define DB3  PORTB, RB3
13
#define DB4  PORTB, RB4
14
#define DB5  PORTB, RB5
15
#define DB6  PORTB, RB6
16
#define DB7  PORTB, RB7
17
#define RS  PORTC, RC6
18
#define E  PORTC, RC7
19
20
main
21
  CALL  lcd_init
22
  CALL  delay_20ms
23
  MOVLW  'A'
24
  CALL  lcdchar
25
  MOVLW  'B'
26
  CALL  lcdchar
27
  MOVLW  'C'
28
  CALL  lcdchar
29
loop
30
  GOTO  loop
31
32
33
lcd_init
34
  BCF  RS
35
  CALL  wait_20ms
36
  MOVLW  b'00110000'  ;Interface auf 8bit setzen
37
  CALL  lcdcomm
38
  CALL  wait_20ms  ;Interface auf 8bit setzen 2
39
  CALL  lcde
40
  CALL  wait_20ms  ;Interface auf 8bit setzen 3
41
  CALL  lcde
42
43
  CALL  wait_20ms
44
  MOVLW  b'00111000'  ;2 Zeilen, 5x8
45
  CALL  lcdcomm
46
47
  CALL  wait_20ms
48
  MOVLW  b'00001100'  ;Display ein, Cursor aus
49
  CALL  lcdcomm
50
51
  CALL  wait_20ms
52
  MOVLW  b'00000110'  ;Cursor aus, Shift aus, rechts
53
  CALL  lcdcomm
54
55
  RETURN
56
57
58
lcde
59
  BSF  E
60
  NOP
61
  NOP
62
  BCF  E
63
  RETURN
64
65
66
lcdchar
67
  BSF  RS
68
  MOVWF  PORTB
69
  CALL  lcde
70
  CALL  wait_20ms
71
  RETURN
72
73
lcdcomm
74
  BCF  RS
75
  MOVWF  PORTB
76
  CALL  lcde
77
  CALL  wait_20ms
78
  RETURN
Variablendeklaration, usw. hab ich weggelassen, ist nicht relevant denke 
ich. Die wait-Zeiten hab ich mit einem Delay-Generator erzeugt, sollten 
also auf jeden Fall stimmen.
Danke schonmal ;)

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> #define RS PORTC, RC6
> #define E  PORTC, RC7

RW des LCD hast du auf GND verdrahtet?

> lcd_init
>   BCF  RS
>   CALL  wait_20ms
>   MOVLW  b'00110000'  ;Interface auf 8bit setzen
>   CALL  lcdcomm

20 ms ist da ziemlich knapp. 1 s würde ich testen und mich dann 
runtertasten oder es so lassen :-)

Auf den Delaygenerator würde ich mich nicht verlassen. Wenn keine 
Messmittel vorhanden sind, versuche mit einer 20ms Delayroutine eine LED 
im 1s Takt blinken zu lassen und mit einer Uhr und Mitzählen die Delays 
zu kontrollieren.

Nebensache: Statt

>  CALL  wait_20ms
>  MOVLW  b'00110000'  ;Interface auf 8bit setzen
>  CALL  lcdcomm

hätte ich erwartet:

  CALL  wait_20ms
  MOVLW  b'00110000'  ;Interface auf 8bit setzen
  CALL  lcde

von PrototypePHX (Gast)


Lesenswert?

Ja, RW ist auf GND. Das mit der delay-Routine versuche ich gleich mal.

von sebihepp (Gast)


Lesenswert?

Hmm, es fehlt noch ein Clear Display Kommando.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Vergiss das mit der Nebensache. PIC ASM ist "anders". Das müsste so 
passen.

Aber bei

> lcde
>   BSF  E
>   NOP
>   NOP
>   BCF  E
>   RETURN

könnten nur 2 NOPs zu knapp sein. Wie schnell läuft dein PIC und wie 
passt die Ausführungszeit von 2x NOP zu dem Mindesttiming im Datenblatt?

von PrototypePHX (Gast)


Lesenswert?

Hab wait jetzt auf 1 Sekunde gesetzt und ich bekomme jetzt zumindest 
Zeichen auf dem LCD, aber an völlig zufälligen Stellen und meistens auch 
erst nach ein paar Resets.
---
Mein PIC läuft mit 12MHz, laut Datenblatt muss E mindestens 1µS lang 
sein.
2/3000000=0,0000006s, also in der Tat zu kurz. Habe dann 3 NOPs 
zusätzlich hinzugefügt, hat aber leider auch nicht viel geholfen.

Danke für die Antworten bisher, bin jetzt zumindest ein paar Schritte 
weiter :)

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.