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?
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.
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
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.
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?"
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
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