Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Init LCD in lcdext vs. pcflcd Kategorie: Sonstige Hardware (von André H. - 17.08.2003 9:31)
Als Antwort auf Re: Init LCD in lcdext vs. pcflcd von Rolf - 17.08.2003 1:19

Hallo Rolf,

> ich fürchte, da ist in pcflcd.c2 doch was nicht ganz ok.
> Und zwar in der Initialisierung für das Display fast am Ende der Funktion.
 
Bevor Du jetzt wieder anfängst von nicht vorhandenen Fehlern
zu schreiben, schlage ich einmal vor, daÃ? Du Dir eine
Doku zum HD44780 durchliest. :-)

In der Initialisierungs-Sequenz der LCD-Module sind keinerlei Fehler.

> Wenn Du die Website http://www.sprut.de/electronic/lcd/  (hatte Link gepostet)
> anschaust, gibt es dort unten die Tabelle zum initialisieren eines 4-Bit-Displays.
> Schon dort in dieser Tabelle hat sich ein Fehler eingeschlichen, der anscheinend nie
> gefixt und von vielen Leuten ohne Prüfung einfach kopiert wurde. Ich hab erst geglaubt, ich könne
> selbst nicht mehr zählen aber ich komme immer auf den Fehler....

Das ist der Grund, warum ich mich nur aus Infos von Originaldatenblättern verlasse. :-)

> Vergleichst Du Deine Befehlssequenz nicht mit der fehlerhaften Tabelle sondern mit den richtigen
> Befehlen aus der Tabelle weiter oben oder den Datenblättern, merkst Du, das sich da jemand beim
> Zählen von Bits bei der Nibleaufteilung für den Entry-Mode verzählt hat.
>
> Einfach und nachvollziehbar, weiter oben gehst Du das Register zum Einschalten vom Display
> und Cursor mit:  00 C0 an.
>
>  i2c.write(0x04 or light); // Display Control
>  i2c.write(0x00 or light); // Set highnibble
>  i2c.write(0xC4 or light); // Cursor Off, display On
>  i2c.write(0xC0 or light); // Set lownibble
>
> an, dann kann aber folgendes nicht stimmen. 00 60
>
>  i2c.write(0x04 or light); // Entry-Mode
>  i2c.write(0x00 or light);
>  i2c.write(0x64 or light); // inkrement, Cursor-shift
>  i2c.write(0x60 or light);

Ã?hhh. Hier ist alles korrekt. Schau bitte mal in die Dokus von HD44780.
Erst High-Nibble, dann Low-nibble !! im 4-Bit-Mode.

So entsprechen die beiden Befehle oben genau diesem:
0x0C = 0b00001100 = Register Display On/Off control:
           Display ein, kein Cursor, Cursor als Unterstrich(:wird ignoriert, da kein Cursor)
0x06 = 0b00000110 = Entry-Mode: inkrementieren, Cursor autom. schieben.

Also, was soll daran nicht stimmen ??
Sonst hätte die letzten zwei Jahre kein Display gefunzt.
Und das währe mir bei ein paar gewerblichen Projekten, teils Kleinserien, schnell aufgefallen. :-)

> So ist's richtig: 10 C0
>
>  i2c.write(0x14 or light); // Entry-Mode
>  i2c.write(0x10 or light);
>  i2c.write(0xC4 or light); // inkrement, Cursor-shift
>  i2c.write(0xC0 or light);
>
> Ein wirklich interssanter Fehler da er nicht nur bei Dir auftaucht.... :-) :-) :-)

Also, das wäre ein Fehler !
0x1C = 0b00011100 = Cursor/Display Shift: Display einmal nach rechts schieben.

Warum willst Du den Displayinhalt beim Init einmal nach rechts schieben? :-)
Hier kann ich nur wieder sagen: Den HD44780 Befehlssatz lesen !

> Dann wollte ich noch wissen, warum Du am Anfang mehrmals die gleichen Bytefolgen in das
> PCF schreibst... das mit dem Low-Nibble 4 hab ich verstanden, Datenübergabe bei fallendem E...
>
>  i2c.write(0x30 or light);  //???
>  i2c.write(0x30 or light);  //???
>  i2c.write(0x34 or light); // Function Set 8 Bit
>  i2c.write(0x30 or light);
>  sleep 2;
>
>  i2c.write(0x30 or light);  //???
>  i2c.write(0x34 or light); // Function Set 8 Bit
>  i2c.write(0x30 or light);  //???
>  i2c.write(0x30 or light);
>

Das ist Funktion-Set im 8Bit Mode, um den 8-Bit-Mode zu aktivieren.
(Wird genauso bei lcdext.c2 und rblcd.c2 gemacht)
Dies wird im Ganzen dreimal gesendet.
Der Sinn ist ganz einfach erklärt:
Bei einem Reset weist Du nicht, ob ein Kommando (beide Nibbles im 4-Nbit-Mode)
komplett gesendet wurde, oder nur ein Nibble. Bei letzterem muÃ?t man
Das Display auf jeden Fall wieder "syncronisieren".
Das geht, indem man das Display geziehlt in den 8-Bit-Mode versetzt, und das öfters.
Die Anzahl mu� dabei ungerade sein, da es drei Möglichkeiten für den
Zustand des Display gibt:
8-Bit Mode: Hier wird bereits das erste Funktion-Set erfasst.
     Die beiden nachfolgenden Function-Set wiederholen lediglich dieses Kommando.
4-Bit-Mode: Hier werden zwei 8-Bit-Befehle benötigt(=2 Nibbles), um zuerst
     in den 8-Bit-Mode zu schalten. Das dritte Function-Set wird als 8-Bit-Kommando
     erfasst.
4-Bit-Mode/half Byte: Hier wurde vor einem Reset des Controllers
     noch ein Nibble im 4-Bit-Mode gesendet. Das erste Funktion-Set hat hier
     keine Auswirkung => Low-Nibble nach Abbruch durch Reset.
     Das zweite Function-Set ist das High-Nibble. Das dritte Function-Set
     muÃ? noch gesendet werden,  damit Zwei Nibbles gesendet wurden.

Erst jetzt kann man mit der "normalen" initialisierung beginnen, da das Display
sich nun auf jeden Fall im 8-Bit-Mode befindet.
Hier der Init im Klartext:

0x30 Function-Set 8Bit als 8Bit-Kommando
0x30 Function-Set 8Bit als 8Bit-Kommando
0x30 Function-Set 8Bit als 8Bit-Kommando
// spätestens ab hier befindet sich das Display garantiert im 8-Bit-Mode
0x20 Function-Set 4Bit als 8Bit-Kommando
// ab hier: Display befindet sich im 4-Bit-Mode
0x24 Function-Set 4Bit, 2 Zeilen, 5x7Dots, als 4Bit-Kommando
0x0C Display On/Off-Control, Cursor Off, Display on, als 4Bit-Kommando
0x01 Display Clear, als 4Bit-Kommando
0x06 Entry-Mode, Auto increment, Cursor-Shift, als 4Bit-Kommando


> Mein Display macht immer noch nicht was es soll, ich bin mir aber jetzt sicher, das ich es nicht falsch rum
> (also SEIKO-Zählweise) angeschlossen hab.... wenn dem so wäre, lägen auf D6 und D7 Masse und + 5V an...
> ich glaube nicht, das sich das Display dann ausser mit einer Qualmwolke gemeldet hätte ;-)
> Anscheinend ist der Controller aber doch etwas anders / empfindlicher als der übliche 44780

Falsch angeschlossene Hardware endet nicht immer in Rauchwolken.
Gerade Displays kann man durch FalschanschluÃ? sehr leicht schrotten.
Wahrscheinlich ist bei Dir irgendeine Datenleitung des Displays durchgebrannt.
Mein Tip: Versuch' einmal die Original-Doku zu Deinem Display ausfindig zu machen,
damit Du weist, wie die Pinbelegung wirklich lautet.
Auf den meisten Display steht auf der Platine eine Herstellerbezeichnung.
Mit Hilfe dieser sollte sich leicht das passende Datenblatt zum Display
(nicht zum Controller !) finden lassen.

> Dann möchte ich noch eine �nderung des Funktionskopes von init anregen.
> Man muÃ? vor jedem init ein setpcf machen da byte PCF; nicht initialisiert ist.
> Bei mehreren Displays entsprechend jedesmal vor dem init und dann pro LCD ein init...
> mit:
>
> function init (byte pcfnr) //!!!
> {
>  if pcfnr > 7 PCF=((pcfnr+16) shl 1)or 64; else PCF=(pcfnr shl 1) or 64; //!!!
>  light=light and 8;
>  i2c.start(PCF);
>
> könnte man sich das sparen und es kommt keiner auf die Idee, das setpcf vor dem init zu vergessen...
> denn dann muÃ? ja pcflcd.init(displaynr); aufgerufen werden und byte PCF; bekommt damit zwangsweise
> ein Wert. Die Funktion setpcf mu� aber bleiben damit im Betrieb die Displays umgeschaltet werden können.
> Das sehe ich nicht als Fehler sondern eher als "Verbesserungsvorschlag".

Ich hatte das Anfangs(vor zwei Jahren) auch überlegt. Jedoch habe ich aus Kompatibilitätsgründen
zu den anderen LCD-Modulen die Init-Funktion ohne Parameter gelassen.
Au�erdem benötigt man init() nicht nur beim Systemstart, sondern auch
während dem Betrieb, wenn man mit längeren Leitungen arbeitet.
Hin und wieder ein Zwangs-Init kann hier nicht schaden.
z.B. gibt's bei meinen Anwendungen immer einen Init, wenn ich von
der Standardanzeige ins Menü wechsle.
(Es kann immer eine Störung geben, bei der ein Nibble "untergeht")


MfG André H.


Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: Init LCD in lcdext vs. pcflcd (von Rolf - 19.08.2003 16:21)
    Re: Init LCD in lcdext vs. pcflcd (von Rolf - 19.08.2003 16:59)
        Re: Init LCD in lcdext vs. pcflcd (von André H. - 19.08.2003 17:04)
            Re: Init LCD in lcdext vs. pcflcd (von Rolf - 22.08.2003 14:50)
                Re: Init LCD in lcdext vs. pcflcd (von André H. - 22.08.2003 16:54)
                    Re: Init LCD in lcdext vs. pcflcd (von Rolf - 23.08.2003 17:16)
                    Re: Init LCD in lcdext vs. pcflcd (von Rolf - 22.08.2003 23:02)
                       Re: Init LCD in lcdext vs. pcflcd (von André H. - 23.08.2003 0:50)
                          Re: Init LCD in lcdext vs. pcflcd (von Rolf - 23.08.2003 2:14)
                             Re: Init LCD in lcdext vs. pcflcd (von Rolf - 23.08.2003 13:27)
                       Re: Init LCD in lcdext vs. pcflcd (von Rolf - 23.08.2003 0:43)