Forum: Mikrocontroller und Digitale Elektronik PIC 16F628A und LCD


von Urs66 (Gast)


Lesenswert?

Hallo

Ich habe gerade ein Problem mit einem Display! Dieses hat den 
Standart-Treiber HD44780. Leider macht das Display keinen Wank!!
Der Code ist ca. nach sprut.de, wobei ich mit dem 8-Bit Interface 
arbeite.
Im mpasm SIM funktioniert es eigentlich wie gewünscht... Nur die 
Hardware wil halt nicht...
Fällt jemandem ein gröberer Fehler auf??
1
;    Notes:       
2
;  Pin Connections
3
;  RB0-RB7 Data Port
4
;  RA0    RS
5
;  RA1    R/W
6
;  RA2    E
7
;                                                   *
8
;                                                                     *
9
;**********************************************************************
10
11
    list      p=16F628A           
12
    #include <p16F628A.inc>      
13
14
    errorlevel  -302              ; suppress message 302 from list file
15
16
    __CONFIG   _CP_OFF & DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _XT_OSC
17
18
;**********************************************************************
19
; VARIABLE DEFINITIONS
20
;**********************************************************************
21
22
VAR             UDATA 0x22
23
loops      RES    1
24
loops1      RES    1
25
Temp            RES     1
26
Lcd_Data    RES    1
27
Lcd_Status    RES    1
28
29
;**********************************************************************
30
; EQU Befehle
31
;**********************************************************************
32
Lcd_RS      equ     RA0
33
Lcd_RW      equ     RA1
34
Lcd_E       equ     RA2
35
Lcd_Line  equ    PORTB
36
Lcd_Cont  equ    PORTA
37
38
;**********************************************************************
39
; MAIN PROGRAM
40
;**********************************************************************
41
42
MAIN_PROG     CODE
43
44
START
45
    bcf    STATUS, C
46
    clrf  PORTA
47
    clrf  PORTB
48
    call   IniReg
49
    call  IniLcd
50
      
51
    
52
    
53
Main        
54
    goto   Main  
55
56
57
58
;**********************************************************************
59
; SUBROUTINES
60
;**********************************************************************
61
;Zeitverzögerung um loops * 1 ms
62
; 4MHz externer Takt bedeutet 1MHz interner Takt
63
; also dauert 1 ms genau 1000 Befehle
64
; 110 Schleifen a 9 Befehle sind 990 Befehle = 0.99 ms
65
; die restlichen 10 Befehle für Einsprung und Rücksprung
66
Wait
67
top      movlw   .110           ; timing adjustment variable (1ms)
68
         movwf   loops1
69
top2     nop                    ; sit and wait
70
         nop
71
         nop
72
         nop
73
         nop
74
         nop
75
         decfsz  loops1, F      ; inner loops complete?
76
         goto    top2           ; no, go again
77
                                ;
78
         decfsz  loops, F      ; outer loops complete?
79
         goto    top            ; no, go again
80
         return               ; yes, return from subWAIT
81
;**********************************************************************
82
;Steuerbyte 8-bittig übertragen
83
Lcd_ContSend
84
    movwf  Lcd_Data
85
    call  LcdBusy
86
    movf  Lcd_Data,w
87
    movwf  Lcd_Line
88
    bcf    Lcd_Cont, Lcd_RW
89
    bcf    Lcd_Cont, Lcd_RS
90
    bsf    Lcd_Cont, Lcd_E
91
    nop
92
    bcf    Lcd_Cont, Lcd_E
93
    movlw  D'50'
94
    movwf  loops
95
    call   Wait
96
    return
97
;**********************************************************************
98
;Datenbyte 8-bittig übertragen
99
Lcd_DataSend
100
    movwf  Lcd_Data
101
    call  LcdBusy
102
    movf  Lcd_Data,w
103
    movwf  Lcd_Line
104
    bcf    Lcd_Cont, Lcd_RW
105
    bsf    Lcd_Cont, Lcd_RS
106
    bsf    Lcd_Cont, Lcd_E
107
    nop
108
    bcf    Lcd_Cont, Lcd_E
109
    movlw  D'50'
110
    movwf  loops
111
    call   Wait
112
    return
113
;**********************************************************************
114
; darauf warten, daß das Display bereit zur Datenannahme ist
115
LcdBusy
116
    banksel TRISB
117
    movlw  B'11111111'
118
    movwf   TRISB 
119
      banksel PORTB
120
BusyLoop    
121
    bcf    Lcd_Cont, Lcd_RS
122
    bsf    Lcd_Cont, Lcd_RW      ; Lesen
123
    bsf    Lcd_Cont, Lcd_E
124
    nop
125
    movf  Lcd_Line, w
126
    movwf  Lcd_Status
127
    bcf    Lcd_Cont, Lcd_E
128
    nop
129
    bsf    Lcd_Cont, Lcd_E  ; Enable
130
    nop
131
    bcf    Lcd_Cont, Lcd_E
132
    btfsc  Lcd_Status, 7  ; teste bit 7
133
    goto  BusyLoop
134
    bcf    Lcd_Cont, Lcd_RW
135
      banksel TRISB
136
    movlw  B'00000000'
137
    movwf   TRISB 
138
      banksel PORTB
139
    return  
140
;**********************************************************************
141
;Iinitialisierung der Resgister
142
IniReg
143
    bcf    STATUS,C
144
    banksel OPTION_REG    ;Bank1
145
    movlw  B'00000010' ;  pull-up enalbled
146
    movwf  OPTION_REG
147
    movlw  B'00000000' ;PortA RA0-RA2 Output
148
    movwf  TRISA
149
    movlw  B'00000000' ;PortB Outputs
150
    movwf  TRISB
151
    movlw  B'00000000' ;
152
    movwf  PIE1
153
    movlw  B'00000011' ;
154
    movwf  PCON
155
    movlw  B'00000010' ;
156
    movwf  TXSTA
157
    movlw  B'00000000' ;
158
    movwf  EECON1
159
    movlw  B'00000000' ;
160
    movwf  VRCON  
161
    banksel TMR0    ;Bank 0
162
    movlw  B'00000000'
163
    movwf  PORTA
164
    movlw  B'00000000'
165
    movwf  PORTB
166
    movlw  B'00000000' ;
167
    movwf  INTCON
168
    movlw  B'00010000' ;
169
    movwf  PIR1
170
    movlw  B'00000000' ;
171
    movwf  T1CON
172
    movlw  B'00000000' ;
173
    movwf  T2CON
174
    movlw  B'00000000' ;
175
    movwf  CCP1CON
176
    movlw  B'00000000' ;
177
    movwf  RCSTA
178
    movlw  B'00000111' ;
179
    movwf  CMCON
180
    return
181
;**********************************************************  
182
; Initialisierung des LCD-Displays
183
184
IniLcd
185
    movlw  D'250'      ; 250 ms Pause nach dem Einschalten
186
    movwf  loops  
187
    call  Wait    
188
189
    movlw  B'00110000'    ; 1
190
    movwf  Lcd_Line
191
    bsf    Lcd_Cont, Lcd_E
192
    nop  
193
    bcf    Lcd_Cont, Lcd_E
194
  
195
    movlw  D'100'      ; 100 ms Pause
196
    movwf  loops
197
    call  Wait
198
  
199
    movlw  B'00110000'    ; 2
200
    call  Lcd_ContSend
201
    movlw  B'00110000'    ; 3
202
    call   Lcd_ContSend  
203
    
204
    movlw  B'00000001'    ; löschen und cusor home
205
    call  Lcd_ContSend
206
    movlw  B'00111000'    ; 5 function set, 8-bit  2-zeilig,  5x7
207
    call  Lcd_ContSend  
208
    movlw  B'00001000'    ; 6 display off
209
    call  Lcd_ContSend
210
    movlw  B'00000110'    ; 7 entry mode, increment, disable display-shift
211
    call  Lcd_ContSend
212
    movlw  B'00000011'    ; 8 cursor home, cursor home
213
    call  Lcd_ContSend
214
    movlw  B'00001111'    ; 9 display on
215
    call  Lcd_ContSend
216
    return
217
    
218
    
219
;**********************************************************************
220
; END OF PROGRAM
221
;**********************************************************************
222
223
        END

Gruss Urs

von spess53 (Gast)


Lesenswert?

HI

>Dieses hat den
>Standart-Treiber HD44780. Leider macht das Display keinen Wank!!
>Der Code ist ca. nach sprut.de, wobei ich mit dem 8-Bit Interface
>arbeite.

Und warum nicht exakt nach dem Datenblatt vom HD44780?

>Im mpasm SIM funktioniert es eigentlich wie gewünscht...

Dort zeigt das Display etwas an?

MfG Spess

von holger (Gast)


Lesenswert?

Vergiss das

    movlw  B'00110000'    ; 2
    call  Lcd_ContSend
    movlw  B'00110000'    ; 3
    call   Lcd_ContSend

Eine Busy Abfrage ist nicht möglich bis die
Software Reset Sequenz beendet ist. Das steht auch im
Datenblatt zum HD44780.

von Ottmar K. (wil1)


Lesenswert?

Hallo Urs 66,
bei der Nutzung des 16F628 für das LCD mit 8bit-Parallelport stellt sich 
doch die Frage ob das überhaupt einen Sinn ergibt, wenn Du nur noch für 
andere Zwecke 2 Pins übrig hast. . Am PORTA sind ja schon 2 Pins durch 
den Quarz (XT-Oszillator) und den MCLR belegt.
Ich selbst verwende seit Jahren praktisch unverändert wie von Sprut 
bereitgestellt, den 4bit-seriellen Bus zur Initialisierung von LCDs, mit 
stets 100%igem Erfolg. Damit konnte ich  auchr Grafik-Displays 
erfolgreich betreiben. Kupfere doch einfach nochmal den Sprut-Code 1:1 
ab. Wenn es dann funktioniert, machst Du die Änderungen nach Deinem 
eigenen Kopf. Mir persönlich ist es zu dumm mich durch Deinen Code zu 
quälen.
mfG Ottmar

von Jens H. (nase71)


Lesenswert?

org 0x00 ?

von Ron (Gast)


Lesenswert?

Mich würde interessieren ob du es hingekommen hast mache zwei tage rum 
und mehr wie Kästchen sehe ich nicht..

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.