Moin zusammen!
Ich habe gerade ein ziemliches Anfängerproblem.
Ich nutze ein D1 Mini Board mit ESP8266 Chipsatz und würde gerne den
Portextender MCP23008 via I2C einsetzen.
Ich habe dazu schon in der Arduino IDE einen Testsketch erstellt, der
die interne LED des D1 Mini im Wechsel mit einer an den MCP23008
angeschlossenen LED blinken lässt.
Das Problem dabei: Das Ganze funktioniert ungefähr 10 Sekunden lang
perfekt. Danach fängt der MCP23008 an zickig zu werden und blinkt nur
noch sporadisch mal mit.
An Librarys nutze ich "Wire.h" für die I2C-Verbindung und die
"Adafruit_MCP23008.h", um den MCP komfortabel ansprechen zu können.
Für die Librarys hatte ich schon nach Alternativen gesucht. Für die
Wire.h bin ich da nicht fündig geworden. Die Adafruit-Library habe ich
testweise zwischenzeitlich rausgeworfen und die Adressbits selbst im
Code gesetzt. Auch ohne Erfolg.
Um auszuschließen, dass es sich um ein Problem mit dem MCP-Chip handelt,
hab ich den auch schon ausgetauscht, ohne Erfolg.
Um das Problem weiter einzugrenzen, habe ich auf den ESP dann den Sketch
"I2C_Scanner"
(https://github.com/wemos/D1_mini_Examples/blob/master/examples/02.Special/Wire/I2C_Scanner/I2C_Scanner.ino)
kompiliert. Dieser fragt sekündlich den I2C-Bus ab und listet im
Serial-Monitor erkannte Geräte auf. Dabei fällt auf, dass der MCP die
ersten Sekunden problemlos gefunden wird ("I2C device found at address
0x20 !"). Nach besagten etwa 10 Sekunden wird der MCP dann nicht, bzw.
nur noch sporadisch zwischendurch erkannt. Warum weiß ich nicht.
Kann ich meine Verdrahtung erstmal als Fehlerquelle ausschließen, wenn
das Ansprechen des MCPs ja die ersten Sekunden problemlos funktioniert?
Letztlich kann man da ja auch nicht viel falsch machen, oder?
Der D1 Mini ist via D1 (GPIO5/SCL) und D2 (GPIO4/SDA) mit dem Pendant
des MCP verbunden. Das sind auch soweit ich gesehen habe die
Standardpins des D1 Mini. Adressbits des MCP A0 bis A2 sind alle auf
Masse gezogen, was 0x20 entspricht. Betrieben wir das Ganze mit den 5V
am USB-Port. Der MCP bekommt die 5V vom D1 Mini, hat also keine eigene
Spannungsversorgung. Ist aber auch testweise aktuell nur die eine LED
dran.
Hoffe das ist soweit verständlich.
Ich bin grad etwas ratlos, was ich noch ausprobieren kann. Ich bin zwar
kein völliger Mikrocontroller-Anfänger, habe mich aber bisher immer nur
im Arduino-Bereich aufgehalten und mittels Breadboards experimentiert.
Danke schonmal im Voraus für eure Hilfe!
VG Stefan
Moin Helmut,
vielen Dank für die Tipps. In meinen bisherigen Projekten hatte ich die
Pullup-Widerstände und auch den Entkopplungskondensator immer mal wieder
eingebaut, wenn ich das in vorhandenen Schaltungen so gesehen habe. Ich
habe bisher jedoch nicht gewusst, wofür die eigentlich sind. Jetzt weiß
ich mehr!
Ich habe beides gerade kurz in meiner Schaltung ergänzt und es - Du hast
es wahrscheinlich schon vermutet - löst mein Problem und funktioniert
nun einwandfrei.
Vielen Dank für die schnelle Hilfe! Man lernt nie aus :-)
Kritisch sehe ich die Verbindung über I2C ohne Levelshifter.
Der ESP8266 arbeitet intern mit 3,3V, damit auch auf den Pins. Der MCP
bei dir mit 5V.
Bisher habe ich noch keine offizielle Info (Datenblatt) gelesen, dass
der ESP an den Pins auch 5V tolerant ist.
Brain 2.0 schrieb:> Bisher habe ich noch keine offizielle Info (Datenblatt) gelesen, dass> der ESP an den Pins auch 5V tolerant ist.
Muss er auch nicht, weil anders herum der Port-Expander zu 3,3V
kompatibel ist. Man legt einfach die Pull-Up Widerstände auf 3,3V.
Stefan ⛄ F. schrieb:> Brain 2.0 schrieb:> Bisher habe ich noch keine offizielle Info (Datenblatt) gelesen, dass> der ESP an den Pins auch 5V tolerant ist.>> Muss er auch nicht, weil anders herum der Port-Expander zu 3,3V> kompatibel ist. Man legt einfach die Pull-Up Widerstände auf 3,3V.
Ok, danke.
Das wusste ich bisher nicht, da ich den Expander bisher nicht verwendet
habe.
Was die 5V Toleranz des ESP8266 angeht: Die gibt es nicht. In einem
Diskussionsforum hat Espressif das mal erklärt.
Die meisten CMOS Chips haben ESD Schutzdioden nicht mehr 0,5V über VCC
und unter GND zulassen.
Beim ESP ist das anders. Er hat an dein Eingängen eine Schaltung die
ähnlich wie ein Thyristor wirkt, der bei 4-6V auslöst und dann den
Eingang kurz schließt und dadurch so lange blockiert, bis kein Strom
mehr fließt. Die Schwelle ist nicht genau definiert.
Wenn du kein Oszilloskop zur Hand hast, kannst du die Pegel am inaktiven
I²C Bus mit einem Multimeter prüfen. Die idealen Werte sind:
Spannung zwischen GND und SDA: 3,3V sein
Spannung zwischen GND und SCL: 3,3V sein
Strom zwischen GND und SDA: 1-2mA
Strom zwischen GND und SCL: 1-2mA
Stefan ⛄ F. schrieb:> Pegelwandler sind hier nicht nötig, weil beide IC's mit 3,3V> kommunizieren können.
Im Datenblatt auf Seite 24V (2.1) aber steht, daß die HIGH Pegelschwelle
des MCP23008 bei 0.8 x VDD lieg und das macht bei 5V VDD 4V. Bei 3.V ist
man da schon unter der Grenze. Das mag funktionieren, aber man geht ein
Risiko ein.
Weniger riskant wäre also beidseitige Pegelanpassung schon da er ja
selber bestätigt, daß der Expander mit 5V vsorgt wird.
Gerhard O. schrieb:> Im Datenblatt auf Seite 24V (2.1) aber steht, daß die HIGH Pegelschwelle> des MCP23008 bei 0.8 x VDD lieg.
Oh Scheiße, das hatte ich das falsch in Erinnerung. Gut dass du
aufgepasst hast!
Dann sollte man wohl doch besser Pegelwandler einsetzen.
@ Stefan (Gast)
Selten erlebt in diesem Forum, das jemand seine Frage derart vernünftig
und strukturiert stellt - Respekt.
Schön das die so schnell geholfen werden konnt - das hast du dir
wirklich verdient.
Stefan ⛄ F. schrieb:>> Dann sollte man wohl doch besser Pegelwandler einsetzen.
Dann lag ich mit meinem Post doch nicht so "ganz" falsch.
Lediglich der Auslöser ist nicht der ESP8266, sondern der MCP23008.
portwandler schrieb:> Hat jemand dazu Erfahrung?
Rechne es dir doch selber aus. Wie viele Bytes musst du übertragen und
wie schnell geht das bei der gewünschten Übertragungsrate? Kann ja nicht
so schwer sein, dass man dafür über 24 Stunden braucht.
Standard Mode kann laut SPEc/Wikipedia:
Standard Mode (Sm) 0,1 Mbit/s
das sind 100 Kbit/s
Damit sollte es doch locker möglich sein ein 16 Bit Schieberegister
mindestens 100 Mal pro Sekunde zu aktualisieren.
Keine Ahnung was eine Arduino Library davon noch wegschluckt.
Hat da jemand "Ahnung" ?
;-)
Danke
portwandler schrieb:> Standard Mode kann laut SPEc/Wikipedia:> Standard Mode (Sm) 0,1 Mbit/s>> das sind 100 Kbit/s
Ja, 100 KBit/s ist auch beim ESP8266 der Standard. Nach unten sind ca.
10 KHz möglich, nach oben sollten 400 kHz möglich sein.
> Keine Ahnung was eine Arduino Library davon noch wegschluckt.> Hat da jemand "Ahnung" ?>
Was soll da wegeschluckt werden? Für den Prozessor-Takt sind 100 kHz
nicht viel. Anbei ein Programm mit dem ich die untere Grenzfrequenz
getestet habe. Für Dich sollte "Wire.setClock(frequenz)" interessant
sein.
mfg Klaus
1
// ESP32 I2C Scanner
2
// Based on code of Nick Gammon http://www.gammon.com.au/forum/?id=10896
Moin nochmal,
vielen Dank für die ganzen Antworten. Ich hatte gar nicht mehr mit so
vielen Reaktionen gerechnet, nachdem ich schon eine für mich
funktionierende Antwort bekommen hatte.
Um nochmal kurz zurück zum Thema 3.3V und 5V zwischen ESP8266 und
MCP23008 zu kommen:
Wenn ich euch richtig verstanden habe, müsste es ja reichen, wenn ich
die Pullup-Widerstände von SDA/SCL anstatt an den 5V-Pin an den 3.3V-Pin
des ESP8266 verbinde?
Ich könnte ja genauso gut sowohl die Pullups, als auch die
Versorgungsspannung des MCP23008 über den 3.3V-Pin nutzen, oder?
Der MCP arbeitet ja auch laut Datenblatt mit 3.3V ohne Probleme.
Angegeben ist 1.8V-5.5V bei 100kHz. Mehr als 100kHz kann der ESP8266
wohl eh nicht ohne zusätzlichen Aufwand, wenn ich das in dessen
Datenblatt richtig nachgeschlagen habe.
Danke euch!
Stefan schrieb:> Wenn ich euch richtig verstanden habe, müsste es ja reichen, wenn ich> die Pullup-Widerstände von SDA/SCL anstatt an den 5V-Pin an den 3.3V-Pin> des ESP8266 verbinde?
Das hatte ich gemeint, aber nun stellte sich ja doch heraus, dass der
Chip mit 3,3V Pegel nicht klar kommt, wenn er selbst mit 5V versorgt
wird. Dann brauchst du Pegelwandler. Die kannst du speziell für I²C Bus
als kompakte Module kaufen. Da sind zwei kleine MOSFET Transistoren und
4 Pull-Up Widerstände drauf.
Stefan schrieb:> Ich könnte ja genauso gut sowohl die Pullups, als auch die> Versorgungsspannung des MCP23008 über den 3.3V-Pin nutzen, oder?> Der MCP arbeitet ja auch laut Datenblatt mit 3.3V ohne Probleme.
Wenn du den Chip mit 3,3V versorgst, brauchst du keine Pegelwandler.
Aber Pull-Up Widerstände. Ja, der MCP arbeitet auch mit 3,3V. Aber was
schließt du denn an seine I/O Pins an? Kommt das mit 3,3V klar? Und ist
der 3,3V Spannungsregler auf deinem ESP Modul genügend belastbar. Gerade
die Wemos Module sind da meistens nur sehr knapp ausgestattet.
Stefan schrieb:> Mehr als 100kHz kann der ESP8266> wohl eh nicht ohne zusätzlichen Aufwand, wenn ich das in dessen> Datenblatt richtig nachgeschlagen habe.
Das ist nicht richtig, er schafft auch die 400 kHz locker flockig.
Stefan ⛄ F. schrieb:> Du brauchst also Pegelwandler
der MCP kann aber auch mit VCC 3,3V arbeiten!
Dann braucht er keinen Pegelwandler, wird denn 5V benötigt?
Im Bild wird ja NUR eine LED geschaltet und wenn man nicht gerade high
power LEDs schaltet dann sollte 3,3V reichen, blaue und weisse LEDs sind
zwar mit 3,2-3,6V angegeben leuchten aber trotzdem nur nicht immer volle
Helleigkeit.
Stefan schrieb:> Mehr als 100kHz kann der ESP8266> wohl eh nicht ohne zusätzlichen Aufwand, wenn ich das in dessen> Datenblatt richtig nachgeschlagen habe.
Dazu steht nichts im Datenblatt, da der ESP8266 keine Hardware I2C/TWI
Einheit hat.
Das wird in Software realisiert.
Stefan ⛄ F. schrieb:> Im Quelltext steht maximal 400kHz bei 80MHz CPU Takt, bzw 800kHz> bei> 160MHz CPU Takt. Größere Werte werden automatisch reduziert.
Und kleinere als 10 KHz werden ebenfalls korrigiert.
mfg Klaus
Stefan ⛄ F. schrieb:> Pegelwandler sind hier nicht nötig, weil beide IC's mit 3,3V> kommunizieren können.
To me, this is not correct. When looking to the scheme, I see the
MCP23008 is powered with +5V. According the datasheets, the HIGH levels
(also for SDA and SCL) must be above 0.7VDD, which is above 3.5V. In
this case, since the ESP is working on 3.3V, you don't satisfy this
requirement.
Maybe because of tolerances, it MIGHT work. But it's not guaranteed...
Da mein Schwerpunkt mehr auf Programmieren, als auf Analog-Elektronik
ist, bitte ich gleich vorab die vielleicht "blöde" Frage zu
entschuldigen, aber nur mit lesen und fragen kann man lernen:
Die fehlenden Pullup-Widerstände für SDA und SCL habe ich verstanden und
auch schon in diversen anderen Schaltungen gesehen. Bitte kann mir
jemand kurz erklären was ein Entkopplungs-Kondensator für VCC ist? Wie
stark sollte dieser ungefähr sein und wo in der ursprünglichen Schaltung
gehört er hinein?
In meinem Fall möchte ich den MCP23008 mit 3.3V betreiben und er soll 4
LED's leuchten lassen und für 4 Tasten-Inputs verwendet werden. Reicht
da als "Entkopplungs-Kondensator" einfach ein 100µF Elko zwischen VCC
für MCP23008 und GND?
Johann K. schrieb:> Bitte kann mir jemand kurz erklären was ein> Entkopplungs-Kondensator für VCC ist?
Der sorgt dafür, dass die Stromversorgung trotz sprunghafter Wechsel der
Stromaufnahme einigermaßen stabil bleibt.
"Entkoppeln" meint hier, dass die Störungen die ein IC sonst verursachen
würde sich nicht auf andere IC auswirken.
> Wie stark sollte dieser ungefähr sein
#Kann man nicht pauschal sagen, es kommt auf die Bedürfnisse der
Schaltung an. 100nF ist ein gängiger Wert, der meistens passt.
> und wo in der ursprünglichen Schaltung gehört er hinein?
An jedes IC direkt an dessen Stromversorgungs-Pins. Wenn es mehrere
solche Pins hat, dann nimmt man auch mehrere Kondensatoren.
> Reicht da als "Entkopplungs-Kondensator" einfach ein 100µF Elko
Große Kondensatoren sind träger, als kleine. Deswegen gilt hier nicht
"viel hilft viel". Fange mal mit 100nF an und Kontrolliere die Spannung
mit einem Oszilloskop. Bei den Frequenzen um die es hier geht ist
alleine das richtige Messen schon eine Herausforderung für sich.
VIELEN DANK an Euch Alle!
Ich habe nur durch mit-lesen schon einiges in diesem Forum gelernt und
bin begeistert wie rasch hier mit Wissen zur Selbsthilfe unterstützt
wird!
Danke!