Moin Kolleginnen & Kollegen, es will einfach nicht. Das LCD zeigt nur 2 Balken und mehr nicht. Hat jemand eine Idee was ich da übersehe? Code anbei.. Eckdaten zum Aufbau: µC Atmega328p auf Steckbrett IDE MPLAB X Compiler = GCC 7.3.0 Compileroptimierung = s F_CPU per Symbol auf 16000000UL gesetzt PCF8574_ADDRBASE in pcf8574.h auf 0x27 gesetzt (soll die Adresse des Moduls laut Datenblatt sein wenn die 3 A Pins offen sind) lcdpcf8574.h auf soweit ich das überblicken konnte auf 4x20LCD gesetzt SCL und SDA sind an Port 4 & 5 des Atmega328p angeschlossen. Beide Pins sind mit einem 4700k R gegen VCC beschaltet. Das Display ist übrigens in Ordnung, denn es funktioniert nach der "üblichen" 4bit Beschaltung, wie es im LCD Tutorial hier im Forum beschrieben ist. bG & merci B.
> PCF8574_ADDRBASE in pcf8574.h auf 0x27 gesetzt > (soll die Adresse des Moduls laut Datenblatt sein wenn die 3 A Pins offen sind) Offen?! > SCL und SDA sind an Port 4 & 5 des Atmega328p angeschlossen. > Beide Pins sind mit einem 4700k R gegen VCC beschaltet. Das sind 4.7 MΩ, ein bisschen viel.
Baumbart schrieb: > laut Datenblatt sein wenn die 3 A Pins offen sind im NXP Datenblatt finde ich diese Aussage nicht. Hast du mal die Pins fest auf VCC gelegt?
Baumbart schrieb: > Code anbei.. Sorry ich habe mich jetzt registriert, nu sollte auch der Upload klappen. bG B.
Georg G. schrieb: > laut Datenblatt sein wenn die 3 A Pins offen sind moin Georg, in meiner zip-Datei befindet sich auch das Datenblatt, das ich von azdelivery erhalten habe. Dort gibt es zu dem Modul eine kleine Übersicht (Seite 5) wie die Adresse sich aus der Beschaltung dieser 3 Pins zusammensetzt. Offer würde demnach 0x27 bedeuten. bG B.
DerDetlef schrieb: > Das sind 4.7 MΩ, ein bisschen viel. Moin DerDetlef, sorry ein Vertipper von mir. Ich meine 4,7k. bG B.
Reza E. schrieb: > Sorry ich habe mich jetzt registriert, nu sollte auch der Upload > klappen. Mit der Registrierung hat das nichts zu tun Baumbart schrieb: > PCF8574_ADDRBASE in pcf8574.h auf 0x27 gesetzt (soll die Adresse des > Moduls laut Datenblatt sein wenn die 3 A Pins offen sind) Und kannst du es dort ansprechen? (LA oder I2C-Scanner)
Baumbart schrieb: > SCL und SDA sind an Port 4 & 5 des Atmega328p angeschlossen Die Reihenfolge die du nennst könnte einen Fehler beinhalten. So wie du schreibst ist SCL A4 und SDA A5. Das wäre falsch.
DerDetlef schrieb: >> (soll die Adresse des Moduls laut Datenblatt sein wenn die 3 A Pins offen sind) > Offen?! Ach Detschleff, er schrieb "Modul", da sind Widerstände drauf, die bei offenen Wischbrücken für einen korrekten Pegel sorgen. uff basse schrieb: > Die Reihenfolge die du nennst könnte einen Fehler beinhalten. > So wie du schreibst ist SCL A4 und SDA A5. Das wäre falsch. Mal in eines meiner gucken: LCD I2C - A4 SDA / A5 SCL Baumbart schrieb: > Hat jemand eine Idee Ja: Den bekannt bewährten I2C-Scanner hochladen und mit dem seriellen Monitor gucken, was der findet. Neben dem vermuteten Verdrahtungsfehler kann auch ein anderer 8574 bestückt sein, dann wäre es 0x3F.
Baumbart schrieb: > es will einfach nicht. Das LCD zeigt nur 2 Balken und mehr nicht. Hat > jemand eine Idee was ich da übersehe? > Das Display ist übrigens in Ordnung, denn es funktioniert nach der > "üblichen" 4bit Beschaltung, wie es im LCD Tutorial hier im Forum > beschrieben ist. Mal das Kontrastpoti des I2C Interface in beide Richtungen gedreht?
uff basse schrieb: > Die Reihenfolge die du nennst könnte einen Fehler beinhalten. > So wie du schreibst ist SCL A4 und SDA A5. Das wäre falsch. Moin, die Reihenfolge habe ich geprüft, das passt. Ich habe beim Forumseintrag nicht auf die Schreibweise geachtet. > Mal das Kontrastpoti des I2C Interface in beide Richtungen gedreht? jap auch schon probiert. Zeigt entweder nichts an oder aber die 2 Balken > Ja: Den bekannt bewährten I2C-Scanner hochladen und mit dem seriellen > Monitor gucken, was der findet. Neben dem vermuteten Verdrahtungsfehler > kann auch ein anderer 8574 bestückt sein, dann wäre es 0x3F. 0x3F war auch eine Vermutung anderer azdelivery Käufer. Bereits getestet.. ohne Erfolg. Den I2C-Scanner muss ich mir mal genauer anschauen. bG & danke b.
Baum B. schrieb: > 0x3F war auch eine Vermutung anderer azdelivery Käufer. Bereits > getestet.. ohne Erfolg. > Den I2C-Scanner muss ich mir mal genauer anschauen. So, du hast also noch nie nachgeschaut, ob und auf welcher I2C-Adresse dein Konstrukt tatsächlich anzusprechen ist. Mal ganz abgesehen davon, daß man zum Nachschauen keinen "I2C-Scanner" braucht, sondern sich sowas mit ein paar dürren Quellcodezeilen selber schreiben kann. Hast du eigentlich das Manual zum Display gelesen? Ich geb dir mal ein kleines symbolisches Beispiel: const WriteI2C = true; ReadI2C = false; Acked = true; var Response: boolean; Gefunden: integer; Gefunden:= 0; for i:=0 to 127 do begin Response:= OpenSlave(i, WriteI2C); if Response=Acked then begin writeln('Adr: ', i,' WR'); inc(Gefunden); end; StopCond; Response:= OpenSlave(i, ReadI2C); if Response=Acked then begin writeln('Adr: ', i,' RD'); inc(Gefunden); end; StopCond; end writeln('gefundene Adressen: ', Gefunden); So, das war sozusagen der ganze I2C-Scanner. Du brauchst dafür lediglich den Lowlevel-Treiber für den I2C, der die folgenden Funktionen hat (und den du ohnehin benötigst): Übertragung starten und adressieren OpenSlave (Adresse: Byte; R_W: Boolean): Boolean; // Übertragung stoppen StopCond; sowie ein Byte schreiben I2C_Write (aByte: Byte): Boolean; ein Byte lesen I2C_Read (Acknowledge: Boolean): Byte; W.S.
Robert schrieb: > Mal das Kontrastpoti des I2C Interface in beide Richtungen gedreht? Ein sinnloser Tip, weil: Baumbart schrieb: > denn es funktioniert nach der "üblichen" 4bit Beschaltung, W.S. schrieb: > So, du hast also noch nie nachgeschaut, ob und auf welcher I2C-Adresse > dein Konstrukt tatsächlich anzusprechen ist. Genau das ist die Stelle, wo eigenständige Fehlersuche beginnt. > Mal ganz abgesehen davon, > daß man zum Nachschauen keinen "I2C-Scanner" braucht, sondern sich sowas > mit ein paar dürren Quellcodezeilen selber schreiben kann. Ich kann mir auch eine Stange Rundstahl kaufen, Scheibe absägen, Loch bohren ... und eine Sechskantmutter selbst herstellen. Es ist einfach überflüssig, wenn fertige Produkte billig verfügbar sind. Genau das ist dieser I2C-Scanner: Kopieren, drauf laden und fertig, drei Minuten und Klarheit, wo es lang geht.
Manfred schrieb: > Neben dem vermuteten Verdrahtungsfehler > kann auch ein anderer 8574 bestückt sein, dann wäre es 0x3F. So viel Auswahl gibt es da nicht. Der PCF8574 liegt bei 0100xxx (Basis I2C-Adresse 0x20) und der PCF8574A bei 0111xxx (Basis I2C-Adresse 0x38). Durch einen Blick auf die Beschriftung des auf dem Modul verbauten ICs sollte sich das klären lassen ;-) Baum B. schrieb: > Den I2C-Scanner muss ich mir mal genauer anschauen. Anschauen nützt nichts. Du musst den Code auf einen Arduino hochladen, dein Modul anschließen und dir dann die Ausgabe des Arduino auf der seriellen Schnittstelle angucken.
Wolfgang schrieb: > Durch einen Blick auf die Beschriftung des auf dem Modul verbauten ICs > sollte sich das klären lassen Im Katalog von AZDelivery sieht es allerdings so aus, als kratzen die Jungs die Beschriftung ab (so idiotisch das auch ist). Da es aber nur 2 Möglichkeiten gibt, ist die Auswahl sehr klein.
Matthias S. schrieb: > Im Katalog von AZDelivery sieht es allerdings so aus, als kratzen die > Jungs die Beschriftung ab (so idiotisch das auch ist). Das könnte ein Grund für die Preise sein, die sie dort für das Interface verlangen. Der Mehraufwand muss bezahlt werden ;-)
Moin Leute, also! Die Adresse des Moduls lautet 0x27. Das Problem saß wie immer vor dem Bildschirm. Ich hatte die Widerstände von SDA & SCL als PullDown angeschlossen und nicht als PullUp. Ist mir grade beim Blick auf mein Steckbrett aufgefallen :/ dämlich dämlich. Es funzt nun alles wunderbar. Danke nochmal an alle! Falls es wen noch interessiert .. Ich benutze die I2C Umsetzung von David Prentice. bG und angenehmes Wochenende B.
Ich habe da eine Frage zu dem Modul, der bei mir einfach nicht laufen will. Allerdings habe ich keinen ARDUINO sondern mache das Ganze mit Assembler bzw. C. Mein Programm steht und läuft perfekt mit einem Eigenbau I2C Portexpander PCF8574A, der laut Datenblatt eine Basis-Adresse 0x70 hat - A0,A1,A2 auf GND - (und nicht 0x30 oder 0x38 wie Wolfgang schrieb). An diesem PORT hängt ein LCD162 Display nach der üblichen 4Bit Beschaltung (identisch mit dem 1602 Modul). Alles funktioniert. Nun habe ich das neue Display an die gleiche Schnittstelle gehängt und meine Software in Bezug auf die I2C-Adresse des beim 1602+I2C Adapter verbauten PCF8574T (gut lesbar) gemäß Datenblatt auf 0x40 angepasst (A0,A1,A2 an GND). Die beiden Steuersignale SCL = PC4 und SDA = PC5 meines ATMEGA8. Die Signale RS,RW,EN liegen auf dem PORT P0,P1,P2, D4..D7 an P4..P7. Das Display zeigt nur eine weiße 1. Zeile an, wird also noch nicht einmal initialisiert. Habe dann mal die Adresse 0x20 probiert (obwohl für mich unlogisch genau wie die 0x30/0x38), es ändert sich nichts. Hat jemand das Display mal mit C oder AVR Assembler angesteuert? mfG Frewer
Da ein anderes Display funktioniert, könnte es sein, dass das neue Display ein anderes Timing hat.
usuru schrieb: > Da ein anderes Display funktioniert, könnte es sein, dass das neue > Display ein anderes Timing hat. Danke usuru, das werde ich im Detail testen. Was mich nur wundert ist, dass die Datenblätter im wesentlichen gleiche "Timings" haben und meine Zeitspannen eher größer als kleiner sind. mfG
Werner F. schrieb: > Hat jemand das Display mal mit C oder AVR Assembler angesteuert? > mfG Frewer Dieses spezielle nicht, aber andere. Betreibe eine systematische Fehlersuche. Als erstes muss du prüfen, ob dein I2C Expander wirklich angesprochen wird und ACK treibt. Dann musst du die einzelnen Steuersignale am LCD wackeln lassen und prüfen, ob sie am richtigen Pin ankommen. Wenn das alles paßt, läuft auch dein 2. LCD.
Werner F. schrieb: > beim 1602+I2C Adapter Finde heraus, wie der PCF8574 mit dem Display verbunden ist. Es gibt mehrere Varianten der Chinaboards, die unterschiedlich initialisiert werden wollen. Mich irritieren auch Deine 0x70. Arduino-üblich sind 0x3F oder 0x27, die man über die Adressjumper noch um 7 verschieben könnte. Da komme ich dann auf 0x20, was ein Bit (siebentes, 64) neben Deinen 0x70 ist.
Werner F. schrieb: > Mein Programm steht und läuft perfekt mit einem > Eigenbau I2C Portexpander PCF8574A, der laut Datenblatt eine > Basis-Adresse 0x70 hat - A0,A1,A2 auf GND - (und nicht 0x30 oder 0x38 > wie Wolfgang schrieb). Die I2C-Adresse besteht aus 7 Bit (s. I2C-Specs) Die Basisadresse des PCF8574A wird zumindest von TI im Datenblatt als 0x38 angegeben ("Responder Adress" in Fig. 7-2). Der Master baut diese I2C-Adresse mit dem R/W-Bit zum ersten übertragenen Byte zusammen.
vielen Dank für die Tipps, die ich alle detailliert nachvollziehen werde. Zum Thema "Adresse" bin ich nicht schlauer. Gemäß Wolfgang steht im Datenblatt (und das ist völlig korrekt) eine Basisadresse "S 0111A2A1A0W/R AK. Ich übergebe in meinem Ass-Programm deshalb (A0..A2=GND) i2c_Start, i2c_write($70 + W) usw. Bei meinem Eigenbau mit dem PCF8574A heißt die Adresse unter gleichen Bedingungen $40 und wie gesagt, das funktioniert auch. $30 ($38) scheint Arduino spezifisch zu sein. Es ist verrückt, habe das Display heute morgen an meinen programmierten (Adresse $70) ATMEGA angeschlossen und siehe da ich lese "Hallo". Also vermute ich, dass entweder ein "Wackler" oder das Timing zu den Schwierigkeiten geführt hatte. Das werde ich genauer wie vorgeschlagen prüfen und berichten. mfG Frewer Ps: ok, verstehe jetzt die Adressangabe $30..$38. In der Arduino-Lib wird Adresse und W/R wohl anders zusammengesetzt. Ich bin halt stets bei 8Bit, die übertragen werden und nicht bei 7Bit + 1Bit.
:
Bearbeitet durch User
Werner F. schrieb: > (A0..A2=GND) i2c_Start, i2c_write($70 + W) usw. Bei meinem Eigenbau mit > dem PCF8574A heißt die Adresse unter gleichen Bedingungen $40 und wie > gesagt, das funktioniert auch. $30 ($38) scheint Arduino spezifisch zu > sein. Nein. Es ist der Unterschied zwischen der 8 und 7 Bit Schreibweise. Beitrag "Re: Kann mir bitte wer beim USI-TWI helfen?"
Und das hat nichts mit Arduino zu tun. Arduino macht es richtig wenn es um die reine Adresse geht. Aber dieser Streit ist so alt wie I2C selbst.
ok, vielen Dank für die Aufklärung. Habe den Unterschied kapiert. Habe mein Programm zwischenzeitlich um die mögliche SubAdr ergänzt, sodass ein Fehler in dieser Hinsicht nicht auftreten kann. mfG Frewer
Werner F. schrieb: > $30 ($38) scheint Arduino spezifisch zu sein. Warum sollte TI Arduino spezifische Adressen angeben? Die I2C-Spec ist in Bezug auf die Definition der I2C-Adresse eindeutig (z.B. Fig.9 auf S.13). https://www.nxp.com/docs/en/user-guide/UM10204.pdf Nimm einen I2C-Scanner oder einen LA und guck, ob dein I2C-Slave den Empfang des ersten Byte mit einem Ack bestätigt.
Wolfgang schrieb: > Nimm einen I2C-Scanner Würde ich auch sagen. Es gibt nämlich auch den PCF8574B, und somit insgesamt 16 verschiedene Adressen, dazu unterschiedliche Schreibweisen der Adresse (7/8 Bit) und unterschiedliche Pinbelegungen.
J. S. schrieb: > Aber dieser Streit ist so alt wie I2C selbst In der I2C-Spezifikation ist die Adresse mit 7 Bit definiert. Was gibt es da zu streiten? Klar, wenn Leute das erste übertragene Byte mit der I2C-Adresse in einen Topf schmeißen, muss es Chaos geben. Wer sich nicht an die Spezifikation hält, muss halt die daraus entstehenden Unklarheiten ausbaden.
wirklich vielen Dank für die Erläuterungen. Habe die Datenübertragung mit dem Oszi nachgeprüft und stelle fest, dass das Timing meines Programms ok ist. Einen I2C-scanner habe ich noch nicht, dafür eben den Oszi. Wahrscheinlich gab es ein Hardware-Problem (Lötstelle), denn die Anzeige funktioniert mit der Adresse (8Bit) $70 + W/R jetzt perfekt. In die 7Bit-8Bit Diskussion will ich garnicht eintreten, weil ich die unterschiedliche Betrachtungsweise jetzt kapiert und meine Variante im Programm umgesetzt habe. mfG Frewer
Werner F. schrieb: > Einen I2C-scanner habe ich noch nicht Wurde doch weiter oben als Anhang gepostet: Beitrag "Re: i2c & LCD stellt sich quer :/" Außerdem enthält die Arduino IDE einen. Selbst wenn du kein Arduino Fan bist, kann es sich dennoch allein deswegen lohnen, die IDE mal eben schnell zu installieren. Oder du nimmst die i2c-tools von Linux (konkret: i2cdetect). Ich benutze dazu einen Sparkfun Digistump als I²C Adapter, die Firmware dazu findest du auf https://github.com/harbaum/I2C-Tiny-USB/tree/master/digispark
Werner F. schrieb: > Einen I2C-scanner habe ich noch nicht Das sind ein paar Dutzend Programmzeilen auf einem µC für wenige €, den du als I2C-Master an deinen Slave hängst.
Wolfgang schrieb: > Werner F. schrieb: >> Einen I2C-scanner habe ich noch nicht > > Das sind ein paar Dutzend Programmzeilen auf einem µC für wenige €, den > du als I2C-Master an deinen Slave hängst. Hallo Wolfgang, vielen Dank für die Info. Finde ich irgendwo die Codezeilen? Und ist dazu ein separates Gerät (uC) zum Test notwendig oder wie funktioniert das Ganze? mfG Frewer
Werner F. schrieb: > Finde ich irgendwo die Codezeilen? Im Arduino Framework Werner F. schrieb: > Und ist dazu ein separates Gerät (uC) zum Test notwendig Ja, irgendein Arduino. Werner F. schrieb: > wie funktioniert das Ganze? Steht irgendwo auf Arduino.cc beschrieben. https://playground.arduino.cc/Main/I2cScanner/ OMG. Kann man sich wirklich so dumm anstellen?
erst mal danke und ja, kann man, wenn man mit Arduino nichts zu tun hat sondern sich mit der Programmierung in AVR-Assembler und C/C++ beschäftigt. Deshalb hilft natürlich der Arduino-Hinweis nichts und ich werde mich an eine Ass Lösung machen. Dann versteht man auch, auf was es im Einzelnen ankommt. mfG Frewer
Werner F. schrieb: > wenn man ... sich mit der Programmierung in AVR-Assembler > und C/C++ beschäftigt... > Deshalb hilft natürlich der Arduino-Hinweis nichts Arduino ist aber C/C++, die Software ist kostenlos und sehr leicht zu installieren. Alleine der integrierte I²C Scanner Sketch ist Grund genug, die Arduino IDE mal auszuprobieren. Wenn du mit anderer Software klar kommst: gerne, aber es sieht wohl eher nicht danach aus.
Werner F. schrieb: > ist dazu ein separates Gerät (uC) zum Test notwendig Nein, irgendein x beliegiber uC/Pc, der i2c sprechen kann und einfach alle Adressen nacheinander anspricht und das Ergebniss (ein Ack) irgendwie mitteilen kann. Wenn Du es selbst schreibst würde ich jede Adresse zweimal nach einander ansprechen, da manche Module durch die erste Anrede geweckt werden und somit erst die zweite Anrede mit Ack quittieren.
Werner F. schrieb: > erst mal danke und ja, kann man, wenn man mit Arduino nichts zu tun hat > sondern sich mit der Programmierung in AVR-Assembler und C/C++ > beschäftigt. Gratuliere zum erfolgreich bestandenen Test über Beratungsresistenz. Da hilft wohl nix mehr. Ausserdem hast du damit bewiesen dass du ausser von Assembler noch nichts Anderes eine Ahnung hast.
erklehr behr schrieb: > ausser von Assembler noch nichts Anderes eine Ahnung hast. .... und von Assembler vermutlich auch nicht viel sonst hättest du den Scanner schnell mal selbst hingerötzt und hättest schon längst eine Aussage zu deinem Problem.
Danke pluto25 für die konstruktive Antwort. Damit kann ich was anfangen. Die anderen "Intelligenzler" kann ich nur bedauern, denn mit arroganten Kommentaren kann man niemandem helfen. Ich bin halt nicht mehr der Jüngste, daher kein Arduino-boy und programmiere seit Jahren die ATMEL AT89C,S Serie in Assembler und den ATMEGA8,16,32,168p sowohl in Ass als auch in C. Auch meine FernAnzeige (LCD mit PCF8574A) hatte bisher funktioniert. Erst mit dem Erwerb der sog. Arduino LCD Anzeige auf Basis des I2C-Adapters FC-113 macht mir Kummer. Deshalb war ich in diesem Forum. mfG Frewer
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.