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
Wo sind die Pullup-Widerstände an SDA und SCL? Wo ist der Entkopplungskondensator an der Betriebsspannung vom MCP23008?
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
NXP erfand vor langer Zeit eine Pegelschnittstelle für I2C mit zwei Logic-Level MOSFETS. Einfach GATE auf die 3.3V Seite anlegen. SRC zum ESP hin und DRAIN zum MCP23008 (5V Seite). Beide Seiten brauchen Pullup-Rs. Diese Pegelwandler gibt es fertig konfektioniert in der Bucht bzw. von einigen Vertreibern. Diese Methode habe ich schon unzählige Male im Einsatz und funktioniert 100% zuverlässig. BSS138 wäre ein Vorschlag: https://www.onsemi.com/pub/Collateral/BSS138-D.PDF https://www.nxp.com/docs/en/application-note/AN10441.pdf https://www.sparkfun.com/products/12009
:
Bearbeitet durch User
Pegelwandler sind hier nicht nötig, weil beide IC's mit 3,3V kommunizieren können.
portwandler schrieb: > gibt es die auch mit mehr Ports? > 16 oder so? MCP23017 https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/port-expander-mcp23017-teil-1
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.
:
Bearbeitet durch User
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.
portwandler schrieb: > gibt es die auch mit mehr Ports? > 16 oder so? https://www.nxp.com/documents/data_sheet/PCA9505_9506.pdf?
@ 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.
Gerhard O. schrieb: > portwandler schrieb: >> gibt es die auch mit mehr Ports? >> 16 oder so? > > https://www.nxp.com/documents/data_sheet/PCA9505_9506.pdf? Mordsklopper!! wie oft pro Sekunde kann ich den "Updaten" mit den Arduino Libraries? Hat da jemand komkretes Zahlenwerk? BG. Glückauf
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
|
3 | // ESP32 DevKit - Arduino IDE 1.8.5
|
4 | // Device tested PCF8574 - Use pullup resistors 3K3 ohms !
|
5 | // PCF8574 Default Freq 100 KHz
|
6 | |
7 | #include <Wire.h> |
8 | |
9 | void setup() |
10 | {
|
11 | Serial.begin (115200); |
12 | Wire.begin (21, 22); // sda= GPIO_21 /scl= GPIO_22 |
13 | }
|
14 | |
15 | void Scanner () |
16 | {
|
17 | Serial.println (); |
18 | Serial.println ("I2C scanner. Scanning ..."); |
19 | byte count = 0; |
20 | unsigned int frequenz; |
21 | |
22 | Wire.begin(); |
23 | Serial.print ("I2C Taktfrequenz: "); |
24 | frequenz = Wire.getClock(); |
25 | Serial.println (frequenz); |
26 | Serial.println (); |
27 | delay (5000); |
28 | |
29 | for (frequenz = 100000; frequenz > 1000; frequenz = frequenz - 1000) |
30 | {
|
31 | Wire.setClock(frequenz); |
32 | delay (500); |
33 | Serial.print ("I2C Taktfrequenz gesetzt: "); |
34 | Serial.print (frequenz, DEC); |
35 | Serial.println (); |
36 | delay (100); |
37 | Serial.print ("I2C Taktfrequenz ist : "); |
38 | Serial.print (Wire.getClock(), DEC); |
39 | Serial.println (); |
40 | delay (100); |
41 | |
42 | count = 0; |
43 | for (byte i = 8; i < 120; i++) |
44 | {
|
45 | Wire.beginTransmission (i); // Begin I2C transmission Address (i) |
46 | if (Wire.endTransmission () == 0) // Receive 0 = success (ACK response) |
47 | {
|
48 | Serial.print ("Found address: "); |
49 | Serial.print (i, DEC); |
50 | Serial.print (" (0x"); |
51 | Serial.print (i, HEX); |
52 | Serial.println (")"); |
53 | count++; |
54 | }
|
55 | }
|
56 | Serial.print ("Found "); |
57 | Serial.print (count, DEC); // numbers of devices |
58 | Serial.println (" device(s)."); |
59 | delay (1000); |
60 | }
|
61 | }
|
62 | void loop() |
63 | {
|
64 | Scanner (); |
65 | delay (1000); |
66 | }
|
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.
Im Quelltext steht maximal 400kHz bei 80MHz CPU Takt, bzw 800kHz bei 160MHz CPU Takt. Größere Werte werden automatisch reduziert.
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...
Geert V. schrieb: > To me, this is not correct. Yes you are right, we found this out already before.
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!
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.