Forum: Projekte & Code PCA9554 schnelle I2C Datenrate Verbesserungsvorschlag


von Gerhard O. (gerhard_)


Angehängte Dateien:

Lesenswert?

Beispiel einer schnellen PCA9554 I2C LCD Interface Funktion

Im Anhang ist ein Beispiel zu finden.

Die untenstehende Funktion ist ein Beispiel einer schnellen I2C
LCD Treiber Anwendung. Es hat mich immer gestoert dass bei vielen
I2C Parallel Expander ICs wie PCF8574, PCA9554 fuer jedes Zeichen zwei, 
bzw. drei I2C Schreibvorgaenge notwendig sind. Die untenstehende 
Funktion
kommt mit nur vier internen Schreibvorgaengen aus.

Z.B. Fuer die String "IRREN IST MENSCHLICH" muessen nur 24 Zeichen 
gesendet werden anstatt der traditionellen 60 bytes. Bei laengeren 
Texten
macht sich das angenehm bemerkbar. Das ist immerhin eine 
zweieinhalbfache
Reduzierung der Uebertragungszeit bei 20 Zeichen. Bei 400Khz I2C 
Taktrate braucht man anstatt 1.4ms also nur ca. 550us um 20 Zeichen zum 
LCD zu senden. Bei traditionellen Gebrauch von I2C Funktionen wird noch 
mehr Zeit mit dem CALL Overhead verschwendet.

Ich hoffe Ihr findet diese Methode vielleicht nuetzlich.

Vielleicht geht es anders noch schneller.

mfg
Gerhard

von Peter D. (peda)


Lesenswert?

> PCA9554 Parallel Ausgaenge an LCD Dateneingaenge DB0-DB7
> Drei uC GPIO Ausganege fuer RS, RW, und E

Damit brauchst Du aber 5 IOs.
Der einzige Grund, warum man I2C nimmt, ist doch, nur 2 IOs zu 
benötigen.

Dann kannst Du auch gleich 6 IOs nehmen und das LCD direkt im 4-Bit Mode 
anschließen:

http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip


Oder nimm nur 3 IOs und schließe es per 74HC164 an:

Beitrag "Standard LCD über nur 3 Drähte"


Oder nimm nur einen IO und schließe es mit eigenem MC (ATtiny25) an:

Beitrag "LCD über nur einen IO-Pin ansteuern"


Um die LCD-Ausgabe wirklich effektiv zu beschleunigen, nimmt man besser 
einen Puffer von der Größe des LCD und schreibt einfach direkt dort 
hinein, das geht ratzfatz.
Und ein Timerinterrupt gibt dann im Hintergrund an das LCD aus:

Beitrag "Formatierte Zahlenausgabe in C"


Peter

von Michael S. (Gast)


Lesenswert?

Hallo Gerhard O.

> LCD Anschluss Details:

> PCA9554 Parallel Ausgaenge an LCD Dateneingaenge DB0-DB7
> Drei uC GPIO Ausganege fuer RS, RW, und E

wenn ich es richtig sehe, dann benötigst du einen Port-Expander UND
einen mc ?
Ist das nicht ein ziemlicher Aufwand ?

Einen PCF8574 zum Ansteuern eines LCD's zu verwenden, macht nach meiner 
Auffassung nur dann Sinn, wenn bereits ein I2C-Bus vorhanden ist 
UND/ODER die Anzahl freien Pins nicht ausreicht, um das LCD direkt 
anzusteuern.

Auf der anderen Seite:
wenn ich doch bereits eine I2C-Bus habe, dann würde ich das gesamte 
Handling des LCD's dem I2C-Slave überlassen und einen "programmierbaren 
Portexpander" wählen.

Nebenbei ist z.B. ein ATTINY2313 preisgünstiger als ein PCF8574.
Und er kann die Initialisierung des LCD's, die Ausgabe der Zeichen sowie 
noch reichlich Zusatzaufgaben freier Wahl meistern.

Dein I2C-Master muss dann - um einen Text der Länge (n) zu übertragen - 
lediglich (n+1) Bytes über den Bus schicken (nämlich die Slave-Adresse + 
den Text).
Plus gelegentlich mal Kommandos zum Positionieren des Cursors.

mfg

Michael S.

von Gerhard O. (gerhard_)


Lesenswert?

Hallo Peter und Michael,

Eure Einwaende sind auf alle Faelle richtig und ich bedanke mich fuer 
Eure Stellungsnahme. Mir ging es eigentlich mehr darum rauszustellen 
dass der PCA9554 fuer eine direkte sequentielle Datenuebertragung 
geeignet ist. Das Datenblatt dokumentiert nur dass so eine Art der 
Datenuebertragung nur im READ Modus moeglich sei. Ich war eben nur 
neugierig ob das auch in die andere Richtung moeglich waere.

Moechte aber nur bemerken dass in diesem Fall das LCD nur ein Teil eines 
mehrgliedrigen I2C Bus auf meiner ZILOG Experimentierplatine sind und 
der Einsatz von drei uC Portleitungen nur fuer das LCD vertretbar waren 
da ja alles auf der Platine sitzt.

Fuer eine reine I2C LCD Steuerung habe ich auch schon eine kleine LCD 
Platine mit uC entwickelt die hinterm LCD aufsteckbar ist und natuerlich 
mit nur 2 Draehten auskommt und entweder I2C, SPI, und RS232/485 macht.

mfg,
Gerhard

von Peter D. (peda)


Lesenswert?

Gerhard O. wrote:
> Das Datenblatt dokumentiert nur dass so eine Art der
> Datenuebertragung nur im READ Modus moeglich sei. Ich war eben nur
> neugierig ob das auch in die andere Richtung moeglich waere.

Beim Vorgänger PCF8574 war das noch drin.


> der Einsatz von drei uC Portleitungen nur fuer das LCD vertretbar waren
> da ja alles auf der Platine sitzt.

Dann wäre aber der 74HC164 an 3 Leitungen und ohne I2C noch besser, da 
der nicht auf 400kHz begrenzt ist.

Allerdings sehe ich nirgends in Deinem Code die Wartezeit von >40µs 
zwischen den Bytes. Bei 400kHz komme ich auf nur 22,5µs und das ist arg 
weit weg von der HD44780 Spezifikation.
Falsches Zeit sparen kann somit auch Nichtfunktionieren bedeuten.
Besser spart man daher mit der Methode mit Timerinterrupt.


Peter

von Gerhard O. (gerhard_)


Lesenswert?

Hallo Peter,

Peter Dannegger wrote:
> Gerhard O. wrote:
>> Das Datenblatt dokumentiert nur dass so eine Art der
>> Datenuebertragung nur im READ Modus moeglich sei. Ich war eben nur
>> neugierig ob das auch in die andere Richtung moeglich waere.
>
> Beim Vorgänger PCF8574 war das noch drin.
>
>
Das habe ich ganz vergessen;-(

Weil ich meistens nur mehr PCA95XX Port Expander verwende.

>> der Einsatz von drei uC Portleitungen nur fuer das LCD vertretbar waren
>> da ja alles auf der Platine sitzt.

Da hast Du nicht unrecht.
>
> Dann wäre aber der 74HC164 an 3 Leitungen und ohne I2C noch besser, da
> der nicht auf 400kHz begrenzt ist.

Stimmt. Ich waehlte I2C fuer das LCD weil ich den SPI port fuer eine SD 
Karte reservieren wollte.

Auch wollte ich auf meiner Platine den PCA9554 fuer andere Anwendungen 
ohne LCD als INPUT/OUTPUT Parallel Interface verwenden.
>
> Allerdings sehe ich nirgends in Deinem Code die Wartezeit von >40µs
> zwischen den Bytes. Bei 400kHz komme ich auf nur 22,5µs und das ist arg
> weit weg von der HD44780 Spezifikation.

Das stimmt. ab 375kHz gibt es Probleme mit dem LCD module. Allerdings 
wenn ich ein DOGM163 verwende geht es bis 475kHz gut. (Die LCD 
Initialisierung ist umschaltbar zwischen HD44780 und DOGM163 LCD Module) 
Beim HD44780 habe ich die I2C Baudrate auf 250kHz festgelegt. Das sollte 
genug Sicherheitsabstand geben.

> Falsches Zeit sparen kann somit auch Nichtfunktionieren bedeuten.

Da hast Du recht.

> Besser spart man daher mit der Methode mit Timerinterrupt.

Obwohl ich die Timer Interrupt Methode bis jetzt noch nicht selber bei 
LCDs verwendet habe, gefaellt mir das im Prinzip auch besser. Werde mich 
mal damit befassen. Man koennte auch einen gepufferten Treiber schreiben 
welcher die LCD Datenbytes mittels I2C Interrupts fortbewegt. Habe das 
mit RS232 so gemacht und funktioniert recht gut. Der Aufwand ist nicht 
zu gross.

Vielleicht war das LCD BEispiel auch ein schlechtes Beispiel. Ich wollte 
eigentlich nur aufzeigen dass man den PCA9554 zu sequenziellen 
Datenuebertragungen missbrauchen kann. Aber trotzdem Danke fuer Deine 
konstruktive Kritik.

Gruss,
Gerhard

>
>
> Peter

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.