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
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.
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...
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
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.
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.
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...
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?
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.
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?
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):
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
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.
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
voidbruteForcePins(void){
5
unsignedintdata=17;
6
unsignedintdata1=17;
7
unsignedshortintrw_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
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
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
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.