MCP23017 korrekt anschließen / ansprechen

Moin,

ich habe einen Arduino Mega, dem langsam aber sicher die IO Ports ausgehen. Also habe ich mir zwei von diesen Boards gekauft: # MCP23017 IO Expansion Board

Nach meinem Verständnis sollten die Pull Up Widerstände schon im Board sein, also habe ich nur folgendes getan:

  • VCC an 5V des Arduino
  • GND an GND
  • SDA an Port 20 (SDA) auf dem Arduino
  • SCL an Port 21 (SCL) auf dem Arduino

Bekommt der Arduino Strom, leuchtet auch die LED mittig auf dem Board. Ganz falsch war das also bislang scheinbar nicht :slight_smile:

Aber wenn ich nun versuche, eine I2C Verbindung zu initiieren, "hängt" die Anwendung:

#include <Wire.h>
#include <Adafruit_MCP23X17.h>
#include <Arduino.h>

void setup() {
  Serial.begin(9600);
  Serial.print("Start init\n");
  mcp.begin_I2C();
  Serial.print("Finished init\n");
}

void loop() {
	Serial.println("Reading mcp0 port: " + mcp.readGPIO());
	delay(1000);
//  StateMachine::registry->nextStep();
}

Gibt noch die erste Zeile aus, danach passiert nichts mehr.

Ich bin nun etwas ratlos: Wo kann ich noch ansetzen? Was kann ich ausprobieren? Oder noch besser: Was mache ich falsch? ;)

Vielen Dank für eure Hilfe!
Robert

a) Prüfe mit einem I2C-Scanner (Sketch in der IDE) ob der MCP23017 sichtbar ist.
b) nimm zum Anfang einen Sketch aus der Library - mach keine Experimente. Nimm was wo wir wissen das es funktioniert.

Berichte.

Hast du dir denn die Beispiele der Library angesehen ?
Ich sehe z.B. nicht, mit welcher I2C-Adresse die Bausteine angesprochen werden.

Hi,

bin mir nicht ganz sicher, was du mit "Sketch in der IDE" meinst. Aber etwas google hat mir z.B. folgendes gebracht:

Ausgabe ist dann:

I2CI2C Scanner ist bereit.

Scanne im standard mode (100 kHz)

Wenn ich das richtig sehe, "hängt" das also auch :frowning:

Hast du die MCP23017 denn auch so angeschlossen, wie im Beitrag gezeigt.
Der Scanner ist auch in der IDE verfügbar.

Zeig mal ein Foto deines Aufbaus.

Wie schon angesprochen - jetzt braucht es saubere Fotos. ALLE Kabel müssen eindeutig erkennbar sein wo was angeschlossen ist. Wir sehen nicht auf deinen Schreibtisch. Bedenke das bei deinen Bildern!

1 Like

Die Wire Methoden geben Error/Erfolg Meldungen zurück.
:japanese_ogre: Könnte Sinn machen, dieses auszuwerten. :japanese_ogre:

Zudem:
Wer sagt, dass die 10k auf dem Board ausreichend sind?
Bei den langen Kabeln, die du da verwendest........

Hallo,

eine Bemerkung zum Pullup Wert. Hat im Grunde keinen Einfluss auf die generelle Funktion. Zu große Widerstände führen "nur" zu einem langsameren Takt, wenn man mit Oszi nachmisst. Oder anders herum, höhere eingestellte Frequenzen werden nicht erreicht. Der Master taktet nicht sturr raus, er guckt wann er die nächste Flanke schalten kann. Eingestellte Frequenz und echte Busfrequenz müßte man immer nachmessen wenn man will das der Bus mit gewünschter Frequenz taktet. Bei Standard 100kHz im Grunde egal.

Aua...
Das würde ich nochmal überdenken....

Du meinst vermutlich das Clock stretching innerhalb eines Bytes.
Das hat allerdings nichts mit den Pullup zu tun.

Alternativ, mal die Oszi Bilder(pdf) hier anschauen:

Hui,
hier herrscht eine ganz schöne Schlagzahl, vielen Dank für eure Antworten.

Die Arduino IDE hatte ich seit Ewigkeiten nicht auf, weil mir da zum Entwickeln einige Komfort Funktionen fehlen. Ich nutze iA Eclipse / Sloeber für dieses Projekt. Dass es da fertige Beispiele gibt, ist aber gut zu wissen :slight_smile:

Der Hinweis, dass die Wire Funktionen auch Fehler ausgeben ist gut - ich gucke nachher Mal, ob ich da irgendwas finde - aktuell weiß ich gerade noch nicht, was ich da noch hätte ausgeben können.
Ein Beispiel aus der Adafruit Library habe ich in der Tat auch noch nicht ausprobiert, das kann ich nachher auch noch Mal nachholen.

Hier jetzt erst Mal die Bilder. Da der Arduino wie gesagt schon in Verwendung ist und mir eine reine "Testmaschine" fehlt, gestaltete sich das Fotografieren etwas schwierig. Ich will ungern alle ~40 Kabel abstöpseln, um den Arduino aus der Schublade zu befreien, in der er aktuell verbaut ist :wink:
Ich hänge drei Bilder an:

  • Die Belegung am Board
  • Power / GND am Arduino
  • SDA / SCL am Arduino

Auf dem Arduino steckt noch ein Network shield, nach meinen Recherchen sollte das aber keinen Einfluss haben, oder?



Wie lang sind die I2C Kabel?

230V Kabel hast da eh nicht in der Nähe?

Nein ich rede vom Takt. Ich hatte das vor längerer Zeit mit verschiedenen Werten und Frequenzen durchgemessen. Natürlich gibts irgendwo Grenzen. Aber Widerstandsänderungen im funktionierenden Bereich wirken sich auf die Taktfrequenz aus. Wie gesagt taktet der Master nicht sturr raus.

Ich auch.

Die Messung solltest du nochmal wiederholen!
(mach ich auch gerne, wenn du mir die Parameter nennst)

Die beiden PDF zeigen einmal funktionierende Zugriffe und einmal versagende.
Wie man deutlich sieht, hat das keinen Einfluss auf den Takt.

Vom Kabelverlauf ist da nichts zu erkennen.
Wie sollen wir da sehen, ob die Kabel richtig laufen ?

Hallo,

ich hatte meine RTC nur mit

Wire.beginTransmission(0x68); 
Wire.endTransmission();

unter Dauerfeuer beackern lassen und das Oszi rangehangen und mit unterschiedlichen Pullups mir den Takt/Signalverschleifung angeschaut. Auf Grund der Signalverschleifung kommt der Schwellwert später worauf der Master "schaut". Das Spiel kann man mit höheren Taktvorgaben wiederholen womit die Taktabweichungen größer werden, wenn der Pullup zu groß wird. Erst wenn der Pullup zu groß ist das der Schwellwert nicht mehr erreicht wird ist Schluss. Das alles hatte ich einmal mit einem AVRxDB untersucht um die DxCore Einstellungen zu überprüfen. Daraufhin wurden kleine Anpassungen gemacht damit mit üblichen Pullupwerten (bspw. 4.7k) die Taktvorgaben auch nahezu erreicht werden. Die waren für mich zu weit weg gewesen.

4 Bilder habe ich gefunden.

1.0k_Wire.setClock_400kHz

1.6k_Wire.setClock_400kHz

2.2k_Wire.setClock_400kHz

3.3k_Wire.setClock_400kHz

Ja, da sind leichte Verschleifungen, auf Grund zu krummer Flanken.
Da hast du wahr!
Und ja, das ist das Clockstretching, was da rein spielt.
Allerdings sind die Ausmaße doch mit ca 10% ehr winzig.

Einzig das erste Bild, würde ich durch gehen lassen.
Da ist ein Plateau zu erkennen.

Die anderen sind eher untauglich.

Schön ist, dass AVR TWI das Clockstretching in Bytes so schön mit macht. Bis zum Timeout der Wire Lib.

Ein Raspberry I2C (und einige weitere) spuckt dir da viel eher ins Essen. Da geht der Takt ohne Gnade weiter.
Da kann das erste Bild schon fast zu einem Problem werden.

230V gibt es da in der Tat:
Der Arduino ist eingebettet zwischen zwei 16x Relais Platinen, die jeweils von einer Mehrfachsteckdose flankiert werden. Die Zuleitungen dazu verlaufen in einem doppelten Boden in der Schublade, also ggfs. Nur ein paar cm entfernt :-/

Ich probiere nachher Mal was passiert, wenn ich die komplett stromlos stelle.

Die Kabel zum Board sind ca. 30 cm lang. Da der mitgelieferte Stecker nur Adern female Ende hat, hab ich da jeweils ein Male - Male Kabel gleicher Farbe dran gestöpselt .
Daran, hatte ich gehofft, könntet ihr die Anschlüsse nachvollziehen. Ich kann aber auch noch Mal versuchen, ein Gesamtbild ohne störende weitere Kabel zu machen, und ich setze gleich Mal mein Multimeter an

nimm mal kürzere Kabel ("15 cm" Gesamtlänge!).
Schalte alle anderen Stromkreise ab.
Teste mit dem originalen Arduino I2C-Scanner Sketch.
Berichte.

1 Like

Hallo,

@ combie

sehe ich anders. Clock Stretching in dem Sinne kann hier noch nicht "aktiv" gewesen sein. Die RTC verkraftet ja max. 400kHz. Dennoch reagiert der Takt auf verschiedene Widerstände. Wenn die Widerstände (in gewissen Rahmen) egal wären hätte man immer den gleichen Takt messen müssen. Man muss die Unterschiede zwischen den Meßwerten betrachten. Nicht jeweils zu den nominell 400kHz. Denn diese kann man anpassen was letztlich auch gemacht wurde. Das heißt die 400kHz werden erreicht. Wenn dabei die RTC nicht mitkommen würde und den Bus verlangsamen müßte, wären die 400kHz in dem Fall nicht möglich, egal wie die TWI Register einstellt sind.

Ha :slight_smile:
Kurz: Es klappt jetzt.

  1. Das SCL Kabel war "nicht durchgängig" - auch, wenn ich nur von Kabelende bis Kabelende gemessen hab => Hab's ausgetauscht, jetzt findet der I2C Scanner etwas (0x27).

  2. Die Beispiele aus der Adafruit Bibliothek laufen - aber nur, wenn ich die Adresse anpasse, also: mcp.begin_I2C(0x27);

Funktioniert - ich verstehe nur noch nicht warum. Ich habe an den Adress Pins nichts überbrückt, also sollte das doch die Standard-Adresse sein? Vielleicht ist es aber auch einfach schon zu spät für mich :slight_smile:
Danke jedenfalls für euren Support, ganz besonders noiasca!