Forum: Mikrocontroller und Digitale Elektronik LCD Ansteuern mit PIC 16F84A funzt nicht


von Thomas P (Gast)


Lesenswert?

Hi,
Ich sitze schon einige Tage an der Ansteuerung des LCD Displays und es 
will einfach nicht funktionieren. Ich verwende einen 16F84A PIC und die 
Hitachi HD44780 LCD Steuereinheit Auf dem LCD steht DEM 16216 SYH - PY. 
Ich hab schon überall in Foren gesucht und auch einiges gefunden, jedoch 
nichts das mein LCD zum funktionieren gebracht hat. Im Quellcode kann 
man sehen, dass ich das Beispiel von Sprut.de verwendet hab.

Ich hab sogar die Leitungen zw Display und PIC an ein Oszi 
angeschlossen. Der Fehler liegt irgendwo in der Übertragung vom Init. 
Nachdem es in den 4 Bit Modus umgeschalten wird, sendet der PIC 
irgendwie nur Schrott.

Die erste Zeile des Displays Leuchtet beim Einschalten kurz auf , geht 
wieder aus und leuchtet dann wieder schwach.

Ich hoffe das reicht erstmal an infos. Falls ihr noch was wissen müsst, 
schreibt einfach.

Danke im Voraus für eure Antworten,

Thomas

von Thomas P (Gast)


Lesenswert?

Hier noch der Quellcode der LCD Ansteuerung. Ich hab das als Anhang 
nicht hinbekommen. Ich hoff ihr seit mir nicht böse.
1
  list p=16f84
2
;**************************************************************
3
;*    Pinbelegung
4
;*  ----------------------------------  
5
;*  
6
;*  PORTB:  0-3  LC Display D4-D7
7
;*    4  Read/Write
8
;*    5  Register Select
9
;*    6  ENABLE 
10
;*  
11
;**************************************************************
12
;
13
;sprut (zero) Bredendiek 05/2000 (mod. 15.01.2002)
14
;
15
; LCD-Display mit Matrixtastatur
16
;
17
; Taktquelle: 4 MHz
18
;
19
;**************************************************************
20
; Includedatei für den 16F84 einbinden
21
22
  #include <P16f84.INC>
23
24
; Configuration festlegen
25
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator
26
27
  __CONFIG  _PWRTE_ON & _WDT_OFF & _XT_OSC
28
29
;**************************************************************
30
; Variablen festlegen
31
32
w_copy  Equ  0x20
33
s_copy  Equ  0x21
34
LcdDaten  Equ  0x22
35
LcdStatus Equ  0x23
36
loops  EQU  0x24
37
loops2  EQU  0x25
38
39
; Constanten festlegen
40
PORTC EQU PORTB
41
PORTD EQU PORTB
42
EN  equ  4    ; enable Lcd
43
RW  equ  6    ; read Lcd
44
RS  equ  5    ; Daten Lcd (nicht control)  
45
46
;********************************************************
47
; Das Programm beginnt mit der Initialisierung
48
49
Init  bsf     STATUS, RP0  ; Bank 1
50
    movlw  B'11111000'  ; RA0 .. RA2 outputs, RA3, RA4 input 
51
    movwf  TRISA    ; 
52
    movlw  B'00000000'  ; PortB alle outputs 
53
    movwf  TRISB
54
    bcf     STATUS, RP0  ; Bank 0
55
    clrf  PORTA    
56
    clrf  PORTB      
57
    call  InitLCD    ; Display initialisieren
58
    call  start
59
    call   Main
60
61
; am LCD "Hallo" ausgeben
62
  
63
start
64
  movlw  'H'
65
  movwf  LcdDaten
66
  call  OutLcdDaten
67
  movlw  'a'
68
  movwf  LcdDaten
69
  call  OutLcdDaten
70
  movlw  'l'
71
  movwf  LcdDaten
72
  call  OutLcdDaten
73
  movlw  'l'
74
  movwf  LcdDaten
75
  call  OutLcdDaten
76
  movlw  'o'
77
  movwf  LcdDaten
78
  call  OutLcdDaten
79
80
Main        
81
  goto   Main  
82
83
;*****************************************************************  
84
;Zeitverzögerung um loops * 1 ms
85
; 4MHz externer Takt bedeutet 1MHz interner Takt
86
; also dauert 1 ms genau 1000 Befehle
87
; 110 Schleifen a 9 Befehle sind 990 Befehle = 0.99 ms
88
; die restlichen 10 Befehle für Einsprung und Rücksprung
89
90
WAIT
91
top      movlw   .110           ; timing adjustment variable (1ms)
92
         movwf   loops2
93
top2     nop                    ; sit and wait
94
         nop
95
         nop
96
         nop
97
         nop
98
         nop
99
         decfsz  loops2, F      ; inner loops complete?
100
         goto    top2           ; no, go again
101
                                ;
102
         decfsz  loops, F       ; outer loops complete?
103
         goto    top            ; no, go again
104
         return              ; yes, return from subWAIT
105
106
;**********************************************************  
107
; Initialisierung des LCD-Displays
108
109
InitLCD
110
  movlw  D'255'    ; 250 ms Pause nach dem Einschalten
111
  movwf  loops  
112
  call  WAIT    
113
114
  movlw  B'00000011'  ; 1
115
  movwf  PORTB
116
  bsf  PORTB,EN
117
  nop  
118
  bcf  PORTB,EN
119
  
120
  movlw  D'50'    ; 50 ms Pause
121
  movwf  loops
122
  call  WAIT
123
  
124
  movlw  B'00000011'  ; 2
125
  call  Control8Bit
126
  movlw  B'00000011'  ; 3
127
  call   Control8Bit
128
  movlw  B'00000010'  ; 4
129
  call   Control8Bit
130
131
  movlw  B'00000010'  ; löschen und cusor home
132
  call  OutLcdControl  
133
  movlw  B'00001000'  ; 5 function set, 4-bit  2-zeilig,  5x7
134
  call  OutLcdControl  
135
  movlw  B'00000000'  ; 6 display off
136
  call  OutLcdControl
137
  movlw  B'00001000'  ; 7 entry mode, increment, disable display-shift
138
  call  OutLcdControl
139
  movlw  B'00000000'  ; 8 cursor home, cursor home
140
  call  OutLcdControl
141
  movlw  B'00000001'  ; 9 display on
142
  call  OutLcdControl
143
  movlw  B'00000000'
144
  call  OutLcdControl
145
  movlw  B'00000110'
146
  call  OutLcdControl
147
  return
148
149
; ein Steuerbyte 8-bittig übertragen
150
Control8Bit
151
  movwf  PORTB
152
  bsf  PORTB, EN
153
  nop
154
  bcf  PORTB, EN
155
  movlw  D'10'
156
  movwf  loops
157
  call   WAIT
158
  return
159
160
; darauf warten, daß das Display bereit zur Datenannahme ist
161
LcdBusy
162
        bsf     STATUS, RP0  ; make Port B0..3 input
163
  movlw  B'00001111'
164
  iorwf   TRISB, f 
165
        bcf     STATUS, RP0
166
BusyLoop    
167
  bcf  PORTC, RS
168
  bsf  PORTC, RW  ; Lesen
169
  bsf  PORTC, EN
170
  nop
171
  movf  PORTD, w
172
  movwf  LcdStatus
173
  bcf  PORTC, EN
174
  nop
175
  bsf  PORTC, EN  ; Enable
176
  nop
177
  bcf  PORTC, EN
178
  btfsc  LcdStatus, RS  ; teste bit 7
179
  goto  BusyLoop
180
  bcf  PORTC, RW
181
        bsf     STATUS, RP0  ; make Port B4..7 output
182
  movlw  B'00000000'
183
  andwf   TRISB, f    
184
        bcf     STATUS, RP0
185
  return  
186
187
; ein Byte mit Steuerdaten von LcdDaten zum Display übertragen
188
OutLcdControl
189
  movwf  LcdDaten
190
  call  LcdBusy
191
  swapf  LcdDaten, w
192
  andlw  H'0F'
193
  movwf  PORTD    ; Hi-teil Daten schreiben
194
  bsf  PORTC, EN
195
  nop
196
  bcf  PORTC, EN  ; Disable LcdBus
197
  movf  LcdDaten, w
198
  andlw  H'0F'
199
  movwf  PORTD    ; Lo-teil Daten schreiben
200
  bsf  PORTC, EN
201
  nop
202
  bcf  PORTC, EN  ; Disable LcdBus
203
  return
204
205
; ein Datenbyte von LCDDaten zum Display übertragen
206
OutLcdDaten
207
  movwf  LcdDaten
208
  call  LcdBusy
209
  movf  LcdDaten, w
210
  andlw  H'F0'
211
  movwf  PORTD    ; Hi-teil Daten schreiben
212
  bsf  PORTC, RS  ; Daten
213
  bsf  PORTC, EN  ; Enable LcdBus
214
  nop
215
  bcf  PORTC, EN  ; Disable LcdBus  
216
  swapf  LcdDaten, w
217
  andlw  H'F0'
218
  movwf  PORTD    ; Lo-teil Daten schreiben
219
  bsf  PORTC, RS  ; Daten
220
  bsf  PORTC, EN
221
  nop
222
  bcf  PORTC, EN  ; Disable LcdBus  
223
  bcf  PORTC, RS  ;
224
  return
225
226
  end

von Frank Z. (frankovic)


Lesenswert?

habe mit einem DEM16217 auch ewig Probleme gehabt, bis ich die 
Initialisierung etwas abgewandelt habe zu:

WriteCommandByteFourBitMode_LCD(0x03);
Sleep(15);
WriteCommandByteFourBitMode_LCD(0x03);
Sleep(4);
WriteCommandByteFourBitMode_LCD(0x03);
Sleep(1);
WriteCommandByteFourBitMode_LCD(0x02);
Sleep(1);
WriteCommandByteFourBitMode_LCD(0x10);
Sleep(1);
WriteCommandByteFourBitMode_LCD(0x0c);
WriteCommandByteFourBitMode_LCD(0x01);
WriteCommandByteFourBitMode_LCD(0x00);
WriteCommandByteFourBitMode_LCD(0x28);
WriteCommandByteFourBitMode_LCD(0x80);

probiers mal. Ich glaube das Teil hat keinen HD44780, sondern was 
"halbwegs" kompatibles, KS0070B. Auf www.Sprut.de steht dazu:

Der Controllerchip KS0073
In letyter Zeit tauchen vermehrt Displays mit dem Controller KS0073 von 
Samsung auf. Dieser Chip ist dem HD44780 sehr ähnlich, aber leider nicht 
100% kompatibel. Dass der Controller (im Vergleich zum HD44780) größere 
Displays ohne zusätzliche Spaltentreiber ansteuern kann, ist für den 
Nutzer belanglos, es gibt aber auch einige deutliche Unterschiede mit 
Konsequenzen für die Nutzung:

Displayanschluß
Der Controller hat einen Reseteingang, der normalerweise auf den 
Steckverbinder des Displays herausgeführt ist. Das wirkt sich auf die 
Stecker-Pinbelegung aus. Die Pins 1..14 sind in der Regel normal belegt. 
Dann folgt ein freies Pin (15), dann das Reset-Pin (16) und dann erst 
die LED-Anschlüsse für die Hintergrundbeleuchtung Led+ (17) und LED- 
(18).
Der Reseteingang ist Low-activ und wird im display auf high gezogen. Man 
kann ihn also einfach frei lassen.

RAM-Adressen
Die Anfangsadressen der zweiten (und aller weiteren) Displayzeile 
weichen vom HD44780 Standard ab.

4-Bit-Initialisierung
Die Initialisierung des 4-Bit-Datenbus-Modes weicht etwas vom 
HD44780-Standard ab.

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Die Display sind sicher sehr gut ... ein paar Tausend davon haben wir 
schon verbaut.

Aber ... da fällt mir auf:

Du verwendest den 16F84A - im Assembler definierst Du den 16F84 ? Warum 
?

Das Programm verwendet dann auch PortC für die Signale und PortD für die 
Daten. In meiner Kopie des Handbuchs für den 16F84A gibt es diese Ports 
nicht...

von Thomas P (Gast)


Lesenswert?

Das mit den Bibliotheken des 16f84 war n copy und paste fehler :D. Hab 
die richtigen header eingebunden. PORTC und PORTD sind PORTB nur unter 
anderem Namen: PORTB EQU PORTC usw.

Das Programm funktioniert jedoch immer noch nicht.

Könnte mal jemand nachkontrollieren ob die Initialisierung rein von der 
Übertragung so funktionieren könnte?

danke

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Also,
mich stört die b'00000011' in der Initialisierung.
Hast Du schon mal das Datenblatt des LCD-Controllers durchgesehen ? Da 
stehen für die Initialisierung des 8-Bit-Modus mit 1/2-Zeilen etwas ganz 
anderes drin.

von Thomas P (Gast)


Lesenswert?

Also ich hab 2 verschiedene Initialisierungen versucht. Einmal die des 
HD44780 und dann noch die Initialisierung des KS0070B-00.

HD44780 Init:
RS  RW  DB7  DB6  DB5  DB4

Warte 15 ms oder länger
0   0   0    0    1    1
Warte 4,1 ms oder länger
0   0   0    0    1    1
Warte 100 us oder länger
0   0   0    0    1    1

0   0   0    0    1    0    4 Bit Modus
0   0   0    0    1    0
0   0   0    0            1 Zeile, 5 * 7 Zeichen (* = 0)
0   0   0    0    0    0
0   0   1    0    0    0    Display aus
0   0   0    0    0    0
0   0   0    0    0    1    Display clear
0   0   0    0    0    0
0   0   0    1    1    0    Inkrement, Shift aus

KS0070B-00 Init:
RS  RW  DB7  DB6  DB5  DB4

Warte 30 ms oder mehr
0   0   0    0    1    0    4 Bit Modus
0   0   0    0    1    0
0   0   0    0            (* = 0)
Warte 39 us oder mehr
0   0   0    0    0    0
0   0   1    0    1    1    Display aus, Kurser an und blinkend
Warte 39 us oder mehr
0   0   0    0    0    0    Display clear
0   0   0    0    0    1
warte 1.53 ms oder mehr
0   0   0    0    0    0
0   0   0    0    1    0    Inkrement und shift aus

Vielleicht sind die datenblätter die ich hab veraltet oder falsch. Das 
LCD ist vom TYP DEM 16216 SYH-PY. Welcher Controller da jetzt drin is 
steht jedoch nicht drauf.

von Thomas P (Gast)


Lesenswert?

Ich will übrigens im 4 Bit modus übertragen...

von Frank Z. (frankovic)


Angehängte Dateien:

Lesenswert?

bei dem Datenblatt hier ist auf Seite 2 in figure 1 der Controller mit 
KS0070 eingezeichnet. Wenn ich Zweifel an einem Display hab, ratter ich 
einfach Zufallszahlen an E, RS, und D4 bis D7. Früher oder später muss 
dann irgendein Buchstabensalat erscheinen...

von Frank Z. (frankovic)


Lesenswert?

sehe gerade unter Beitrag "LCD (Ks0066) initialisieren" , dass 
meine Initialisierung eigentlich eher auf einen KS0066 passt...

von Thomas P (Gast)


Lesenswert?

Hmm, das hilft mir jetzt zwar nich weiter aber trotzdem danke...
 Kann sich vielleicht jemand noch die beiden initialisierungen anschauen 
die ich oben gepostet hab und mir sagen ob die richtig sind?

von Thomas P (Gast)


Lesenswert?

Ich habs jetzt endlich hinbekommen, dass das display funktioniert. Es 
zeigt an was ich will, jedoch nur wenn ich es neu an die spannung 
anlege. Drück ich den reset knopf des entwicklungsboards, zeigts nur 
mist an. Kann es an den Wartezeiten liegen? Die Initialisierung muss ja 
stimmen, sonst würde es nie was anzeigen.

von Thomas P (Gast)


Lesenswert?

Kann mir jemand sagen warum das display nur funktioniert wenn ich es an 
den strom hänge und nicht wenn es schon dran hängt und ich den reset 
knopf drücke?

von tastendrücker (Gast)


Lesenswert?

Da ist einiges im Argen:

1)
1
Init  bsf     STATUS, RP0  ; Bank 1
2
    movlw  B'11111000'  ; RA0 .. RA2 outputs, RA3, RA4 input 
3
    movwf  TRISA    ; 
4
    movlw  B'00000000'  ; PortB alle outputs 
5
    movwf  TRISB

unschön, so eifach den Code bei 0x00 starten zu lassen.  Besser ist, 
sich anzugewöhnen, immer alle Interrupt-Vektoren zu definieren (auch 
wenn sie nicht verwendet werden):
1
      org   0x00
2
      goto  Start          ;Reset-Vektor
3
4
      org   0x04
5
      goto  P_ISR          ; Peripheral Interrupt Service Routine
6
7
Start:
8
Init  bsf     STATUS, RP0  ; Bank 1
9
      movlw  B'11111000'  ; RA0 .. RA2 outputs, RA3, RA4 input 
10
      movwf  TRISA    ; 
11
      movlw  B'00000000'  ; PortB alle outputs 
12
      movwf  TRISB
13
      :


2)
1
      :
2
      call  InitLCD    ; Display initialisieren
3
      call  start

Wenn du 'call start' aufrrufst, musst Du auch mit 'return' wieder zurück 
springen!


3)
1
    call   Main

und hier kommt ein 'goto Main' hin, kein 'call Main'


Der entsprechende Codeausschnitt sollte dann so aussehen:
1
      :
2
      org   0x00
3
      goto  Start    ;Reset-Vektor
4
5
      org   0x04
6
      goto  P_ISR    ; Peripheral Interrupt Service Routine
7
  
8
;********************************************************
9
; Das Programm beginnt mit der Initialisierung
10
11
Start:
12
Init  bsf     STATUS, RP0  ; Bank 1
13
      movlw  B'11111000'  ; RA0 .. RA2 outputs, RA3, RA4 input 
14
      movwf  TRISA    ; 
15
      movlw  B'00000000'  ; PortB alle outputs 
16
      movwf  TRISB
17
      bcf     STATUS, RP0  ; Bank 0
18
      clrf  PORTA    
19
      clrf  PORTB      
20
      call  InitLCD    ; Display initialisieren
21
      call  start      ; "Hallo ausgeben" 
22
      goto  Main       ; <<<<<< HIER 'GOTO', NICHT 'CALL' !!!
23
24
25
P_ISR:                 ; Hier eventuell Interrupts handeln
26
      retfi            ; /
27
28
; am LCD "Hallo" ausgeben  
29
start
30
      movlw  'H'
31
      movwf  LcdDaten
32
      call  OutLcdDaten
33
      movlw  'a'
34
      movwf  LcdDaten
35
      call  OutLcdDaten
36
      movlw  'l'
37
      movwf  LcdDaten
38
      call  OutLcdDaten
39
      movlw  'l'
40
      movwf  LcdDaten
41
      call  OutLcdDaten
42
      movlw  'o'
43
      movwf  LcdDaten
44
      call  OutLcdDaten
45
      return          ; <<<<< HIER MIT 'RETURN' VERLASSEN     
46
47
48
Main  goto   Main     ; boah is dat langweilig
49
50
      :

von Raoul R. (Gast)


Lesenswert?

Hallo Leute!

Habe selbiges Display und Problem wie Thomas P. Leider kann ich diesem 
Forum keine E-Mailadresse von Thomas etlocken ...
Gleich vorweg muß ich sagen, dass ich den ICD2 und pic18f2552 erst seit 
~zwei  Wochen besitze & mich seit dem intensiv damit beschäftige! Bin 
also daweil noch bissl "greenhorn". :D
Ich würde zu gerne wissen woran es bei Thomals gelegen hat und wie weit 
das Datenblatt korrekt ist. Mir scheint das Datenblatt ist Müll o. ä.! 
Bin mir nicht sicher, denke aber selber einen kleinen Fehler in der 
Angabe entdeckt zu haben. Weiters meinte ein Bekannter (den ich leider 
diesbezüglich nicht allzusehr ausquetchen kann), er hatte mit dem 
gleichen Display sehr gekämpft, vorallem weil die Timings aus dem 
Datenblatt nicht korrekt angegeben waren. Leider hat er den Code zu dem 
Display nicht mehr [...].

Mich würde interessieren, ob & wie man dieses Display rücksetzen kann 
(reset). So weit ich gemessen habe, sind die Daten- und Steuerleitungen 
(R/W, RS) des DEM16216 im Betrieb auf hi. Wenn ich nun den Pic 
konfiguriere (alle am LCD angeschlossenen Pins auf output, lo setze), 
und somit den Port des LCD auf lo ziehe, habe ich bereits eine fallende 
"enable" Flanke generiert und damit Daten gesendet (jain, denn die 
Portbits werden "ohne Delay" konfiguriert). Bitte korrigiert mich wenn 
ich nicht richtig liege!

Ich verwende den MCC18 Kompiler, somit habe ich keinen Assemblercode bei 
Hand, aber der Kern meiner Vorgehensweise zum Initialisieren, welche 
anscheinend nicht korrekt abläuft, ist in dieser:

1
 /*---BEGIN Code---*/
2
3
 resetPins(); //alle Pins (D4-D7, R/W, RS) output, lo
4
 
5
 //Delay > ~30ms
6
 //set function mode:
7
 enableE();   //enable -> hi (berücksichtigt data hold time
8
              //und min. Cycle time.
9
 LCD_D04 = 0; //nicht berücksichtigt
10
 LCD_D05 = 1; //nicht berücksichtigt
11
 LCD_D06 = 1; //5x10 pixel
12
 LCD_D07 = 1; //2-zeilen
13
 disableE();  //enable -> lo (berücksichtigt data hold time
14
              //und min. Cycle time.
15
16
 
17
 //delay > ~40µs
18
 //set display on/off, cursor mode:
19
 enableE();
20
 LCD_D04 = 1; //blinken an
21
 LCD_D05 = 1; //cursor an
22
 LCD_D06 = 1; //display an
23
 LCD_D07 = 1; //vorgabe aus datenblatt
24
 disableE();
25
 
26
 //delay > ~40µs
27
 //clear display:
28
 enableE(); 
29
 LCD_D04 = 1; //vorgabe aus datenblatt
30
 LCD_D05 = 0;
31
 LCD_D06 = 0;
32
 LCD_D07 = 0;
33
 disableE();
34
35
 //delay > ~1.60ms
36
 //set entry mode:
37
 enableE();
38
 LCD_D04 = 0; //alles shift aus
39
 LCD_D05 = 1; //increment modus
40
 LCD_D06 = 0; //ich vermute hier sollte eine 1 stehen, laut
41
              //datenblatt (für 4-bit modus) jedoch 0
42
 LCD_D07 = 0;
43
 disableE();
44
45
 /*--- END Code ---*/

Frank Zöllner hat von Zufallszahlen geredet, ich habs mal ausprobiert, 
doch entweder mache ich es komplett falsch oder mein Display ist ein 
Sturkopf lol. Es rührt sich nämlich garnichts!

Bei allem was ich bisher versucht habe, ist das Resultat immer das 
selbe. Am Display sind die Felder der ersten Zeile alle vollkommen 
schwarz ausgefüllt. Die der zweiten jedoch nicht!

Hätte noch ne Frage zum Delay. Angenommen ich verwende einen 2mHz 
Oszilator, so is eine Clock 0,5µs lang. Wenn ich nun ein Delay von 2µs 
plane, so muß ich zwei Nop(); abwarten? Muß ich von vier Clocks pro Nop 
ausgehen? Ich verwende die Delayfunktionen aus der Microchip Library, 
somit sollten meine Timings schlimmstenfalls 4x zu lang sein, obwohl ich 
sie sowieso seeehr großzügig eingestellt habe :D.


Ich bin für jeden Tipp dankbar!

lg, raoul

von Frank Z. (frankovic)


Lesenswert?

Zufallszahlen in dem Sinn dass wild an den Datenbits und auch an RS, E 
usw. rumgeklappert wird. Eigentlich kommt da bei jedem Display ganz 
schnell irgendwas. Dachte auch schon oft das LCD ist hinüber, dieser 
Test beweist ganz schnell das Gegenteil. Man kann ein mit obiger 
Grobmethode "initialisiertes" Display dann danach auch regulär 
ansprechen. Also rumklappern bis was kommt, dann versuchen ordnungsgemäß 
was draufzuschreiben. Wenn das hinhaut, ist nur im Init was faul. Wenn 
nicht, stimmt ganz grundsätzlich, vermutlich an der Beschaltung, was 
nicht.

von Raoul R. (Gast)


Lesenswert?

Hallo!

Danke erstmal für die schnelle Antwort!
Bzgl. Zufallszahlen habe ich mir zuerst ausgedacht keine Zufallszahlen, 
sondern alle Möglichkeiten eines 6-bit Busses zu senden. Dabei ist mir 
die Datenübertragung eingefallen, welche in zwei Taktzyklen 
abgeschlossen wird. Somit bin ich auf die unten angeführte, 
wahrscheinlich zu komplizierte :D :D, Variante gekommen.
1
/**
2
 * @2MHz
3
 */
4
void bruteForcePins(void) {
5
  unsigned int data = 17;
6
  unsigned int data1 = 17;
7
  unsigned short int rw_rs = 5; 
8
9
  while (rw_rs > 0) {
10
    --rw_rs;
11
    LCD_RW  = (rw_rs & 1<<0) ? 1 : 0;
12
    LCD_RS  = (rw_rs & 1<<1) ? 1 : 0;
13
14
    while (data > 0) {
15
      --data;
16
      LCD_E = 1;
17
      LCD_D04 = (data & 1<<0) ? 1 : 0;
18
      LCD_D05 = (data & 1<<1) ? 1 : 0;
19
      LCD_D06 = (data & 1<<2) ? 1 : 0;
20
      LCD_D07 = (data & 1<<3) ? 1 : 0;
21
      Delay100TCYx(10);
22
      LCD_E = 0;
23
      Delay100TCYx(10);
24
25
      while (data1 > 0) {
26
        --data1;
27
        LCD_E = 1;
28
        LCD_D04 = (data1 & 1<<0) ? 1 : 0;
29
        LCD_D05 = (data1 & 1<<1) ? 1 : 0;
30
        LCD_D06 = (data1 & 1<<2) ? 1 : 0;
31
        LCD_D07 = (data1 & 1<<3) ? 1 : 0;
32
        Delay100TCYx(10);
33
        LCD_E = 0;
34
        Delay100TCYx(10);
35
      }
36
    }
37
  }
38
}

Müßte ich das Display nicht zwischendurch resetten, oder gelangt es 
durch diese "Attacke" nie in einem undefinierten Zustand?

lg, raoul

von Raoul R. (Gast)


Lesenswert?

Ich habe es nun geschafft !!

Die Idee mit den Zufallszahlen ist eine sehr gute!! Ich habe die 
Funktion nochmals übderdacht und mit den Sequenzen am unteren Limit 
angefangen (von 0) und bis zum Oberen duchlaufen (bis, je nach 
Anschlusmodus, 2^6 oder 2^10). Dabei habe ich nur einen Duchrgang dür 
die Datenbits berücksichtigt (ich neige dazu zu kompliziert zu denken :) 
). Siehe da, es hat zumindest irgendwas angezeigt. Hurra!

Was ich verschlampt habe, war, dass ich V0 (LCD-Versorgung) an Masse 
gezogen habe. Damit war der Balken, also die erste Zeile, schwarz wie 
die Nacht. Man konnte daher nur von der Seite etwas erkennen. Bei 
Zimmertemperatur erziele ich zwischen 0.5V - 1.5V ein gutes Ergebnis.

Der Initialisierungscode hat sich nicht viel geändert, aber für all 
diejenigen die auch Troubles damit haben, schreibe ich es nochmals hin 
wie ich mein DEM16216 SYH-PY/zu etwas bewegen konnte:
1
 resetPins();
2
 wait500ms();
3
4
 LCD_E = 1;
5
 LCD_D04 = 0;  //function mode
6
 LCD_D05 = 1;
7
 LCD_D06 = 1;
8
 LCD_D07 = 1;
9
 wait12us();
10
 LCD_E = 0;
11
 wait50ms();
12
13
14
 LCD_E = 1;
15
 LCD_D04 = 1; //disp control
16
 LCD_D05 = 1;
17
 LCD_D06 = 1;
18
 LCD_D07 = 1;
19
 wait12us();
20
 LCD_E = 0;
21
 wait50ms();
22
23
24
 LCD_E = 1; //clear display
25
 LCD_D04 = 1;
26
 LCD_D05 = 0;
27
 LCD_D06 = 0;
28
 LCD_D07 = 0;
29
 wait12us();
30
 LCD_E = 0;
31
 wait50ms();
32
33
 LCD_E = 1; //entry mode
34
 LCD_D04 = 0;
35
 LCD_D05 = 1;
36
 LCD_D06 = 1;
37
 LCD_D07 = 0;
38
 wait12us();
39
 LCD_E = 0;
40
 wait50ms();

Vielen Dank an Frank, für den Hinweis mit den Zufallszahlen!

lg, raoul

von Raoul R. (Gast)


Lesenswert?

Hallo allerseits !!

Da es mich Zeit & Nerven gekostet hat, wirklich richtig zu 
initialisieren, hier noch ein kleiner Beitrag zur richtigen 
Initialisierung des KS0070B Kontrollers, dessen Beschreibung im 
Datenblatt nicht korrekt/vollständig ist. Die Initialisierung klappt 
nicht wenn das LCD nicht zuvor vom Strom genommen wurde (siehe: Thomas P 
am 20.07.2007 (10:52)). Die im Manual angeführte Initialsierungssequenz 
funktioniert NUR wenn das LCD vorher stromlos war. Wurde es bereits 
initialisiert, und sollte es nochmals initialisiert werden (z.B. Reset 
oder neuer Programmdurchlauf des PIC), so muß wie unter [2] 
initialisiert werden.

Begründung hier [1]


hth & lg, raoul

[1] 
http://www.myavr.de/myForum/viewtopic.php?p=3087&sid=b90eaffc4183870518c2e63fdd23d466
[2] http://www.sprut.de/electronic/lcd/index.htm#init

von margo (Gast)


Lesenswert?

ich habe auch Probleme beim Ansteuern des LCDs mit PIC18F4550, aber ich 
programmiere gerade in C kann mir jemand sagen wie ich vorgehen kann??

von gast (Gast)


Lesenswert?

hallo,

da hier auch das Display:

DEM 16216 SYH-LY

vorkommt,
mal eine Frage hierzu.
gibt es dieses auch in anderer Farbe ?
ich denke, dass LY für light yellow steht, daher nehme ich das an,
ich bin auf der Suche nach einem andersfarbigen, es muss aber 
schaltungsmäßig kompatibel sein (Bausatz!)

danke für Info,

Gruss A.

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.