mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD am I2C


Autor: jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Allerseits,

ich hab mein 16x2 HD44780 Display über einen PCF8574 von TI am TWI des
atmega8. Das ganze funktioniert soweit eigentlich auch ganz gut.
Einziger Schönheitsfehler ist das ich es nicht schaffe das Bussy-Flag
auszulesen. (im Moment kompensiere ich das mit Delays).

Meine Frage ist nun ob das ein Hardwareproblem ist, oder ob ich da in
der SW was falsch mache.

ich habe RS an P4, R/W an P5 und E an P7 des PCF8574. Meiner Ansicht
nach müsste ich also erst mal 0x20 senden damit R/E H ist, dann 0xA0
senden damit E auch noch nach H gehen. Nun sollten das High-Nibble an
den Datenleitungen anliegen. Nun lese ich also vom PCF8574 Daten. Da
ist jetzt die Frage was nun mit meinen Steuerleitungen passiert. Meiner
Ansicht nach müssten die Leitungen alle H sein da mit Pull-Ups
angeschlossen. Somit sollte es da eigentlich kein Problem geben, oder?
Danach E auf L ziehen damit das nächste Nibble am Datenbus anliegt und
wieder nach H damit die Daten gelesen werden können. Wieder lesen, und
gut ist.

Nur leider funktioniert das nicht. Kennt einer das Problem oder weiß
vielleicht woran das liegen könnte.

Danke schon mal, der Jochen

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der I2C ist ja mit 100kBit sehr langsam und Du must ne ganze Menge
I2C-Pakete erzeugen für das Signalspiel.

Da vermute ich mal, daß das Busy Bit schon längst wieder aus ist, ehe
Du es auch nur einmal eingelesen hast.

Mit den festen Wartezeiten solltest Du bei einem so langsamen Bus also
schneller sein.


Peter

Autor: Mark de Jong (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jochen,

Um die ports als eingang zu nutzten solltest Du die pins erst auf high
setzten.

auszug aus das datenblatt,erste seite:
"The I/Os should be high before being used as inputs."

Grüße Mark.

Autor: Moritz Veit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi jochen,
kannst du mal den code bitte posten weil ich mich demnächst auch an so
etwas dranmachen will allerdings immoment noch probs mit der
ansteuerung des pcf habe .... wäre supper wenn du den code grad
hochladen könntest damit ich das dann entsprechned bei mir abändern
kann.

cu
knirps

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenns schneller gehen soll, dann empfehle ich meine Lösung in der
Codesammlung mit dem 74HC164.
Man braucht zwar 3 Drähte, aber dafür ist die Ansteuerung wesentlich
einfacher und es muß nur je ein Byte geschoben werden.

Beim PCF8574 muß man ja je Byte 7 Bytes senden:
- Start
- I2C-Adresse
- 1.Nibble + E = 0
- 1.Nibble + E = 1
- 1.Nibble + E = 0
- 2.Nibble + E = 0
- 2.Nibble + E = 1
- 2.Nibble + E = 0
- Stop

Aber beim 74HC164:
- komplettes Byte reinschieben (über SPI) während E = 0
- E = 1 setzen (SBI)
- E = 0 setzen (CBI)


Peter

Autor: jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

die Lösung wäre ja mit dem PCF genauso möglich, wenn ich noch eine
Dritte Leitung (für E) mit dazu nehme.

Bin aber so wie es im Moment tut ganz zufrieden. Wäre zwar nett wenn
das mit dem Bussy-Flag gehen würde ist aber kein must have.

Der Jochen

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jochen,

trotzdem mußt Du dann immer noch mindestens 9 Bit bei lahmen 100kHz
senden, also 90µs.
Bei nötigen 37µs Wartezeit zwischen den Bytes bist Du bist dann also
immer noch um Klassen langsamer als mit 74HC164.

Ganz abgesehen davon, daß Du für einen PCF8574 fast 10 Stück 74HC164
kaufen kannst.

Mit der Nibble-Methode ohne extra E brauchst Du sogar (7*9+2)*10µs =
650µs, kein Wunder, daß Du da nie ein Busy zu sehen bekommst.


Das AVR SPI kann bis zu 4MHz, das sind dann nur 2µs bis in dem 74HC164
das Byte drin ist. Du must also noch zusätzliche 35µs echt warten bis
zum nächsten Byte.
Bzw. Du wählst gleich einen entsprechend niedrigeren SPI-Takt.


Peter

Autor: jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo noch mal,

Was die Kosten angeht, da hab ich drei Stück umsonst von TI bekommen
;-). Was die Geschwindigkeit angeht, geb ich Dir natürlich Recht. Das
ist für mich allerdings unwichtig da ich ja keine Daten in
Hochgeschwindigkeit durch das Display jagen will ;-)

Ansonsten werd ich mir die Idee auf jeden Fall im Hinterkopf behalten.

Schönen Tag noch, der Jochen

Autor: Markus Burrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
der AVRco Pascal Compiler macht das mit einem PCA9555. Da wird das
Display im 8Bit Modus angesprochen und das Busy Flag wird auch
berücksichtigt. Nachteil bei der Lösung ist eigentlich nur das es den
PCA9555 nur in SMD gibt, ansonsten funzt das prima.

Gruß
Markus
www.embedit.de

PS: Wenn das Display einen KS007x Controller hat kann es Probleme mit
dem Timing geben, das stimmt nämlich mit dem eines original HD44780
nicht überein

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.