I2C Arduino Uno und Teensy 3.2 | MCP23017

Hallo an Alle,
ich bin gerade am testen wie die MCP23017 funktionieren und benutze dazu den Demo Code aus der Adafruit library.
Dieser Sketch funktioniert an meinem Arduino Uno. Genau mit diesen Verbindungen.
Wenn ich den Sketch auf meinen Teensy 3.2 spiele geht leider garnichts. Die Pins für Clock und Data hängen auf dem SCL und SDA Pin 18/19 am Teensy 3.2.

Hat jemand eine Idee an was das liegen kann?

Danke und Gruß

#include <Wire.h>
#include "Adafruit_MCP23017.h"

// Basic pin reading and pullup test for the MCP23017 I/O expander
// public domain!

// Connect pin #12 of the expander to Analog 5 (i2c clock)
// Connect pin #13 of the expander to Analog 4 (i2c data)
// Connect pins #15, 16 and 17 of the expander to ground (address selection)
// Connect pin #9 of the expander to 5V (power)
// Connect pin #10 of the expander to ground (common ground)
// Connect pin #18 through a ~10kohm resistor to 5V (reset pin, active low)

// Input #0 is on pin 21 so connect a button or switch from there to ground

Adafruit_MCP23017 mcp;
  
void setup() {  
  mcp.begin();      // use default address 0

  mcp.pinMode(0, INPUT);
  mcp.pullUp(0, HIGH);  // turn on a 100K pullup internally

  pinMode(13, OUTPUT);  // use the p13 LED as debugging
}



void loop() {
  // The LED will 'echo' the button
  digitalWrite(13, mcp.digitalRead(0));
}

Spontane Idee: Verwendest Du Level-Shifter und PullUp-Widerstände?

Level Shifter?

Hallo,

der Teensy hat im Gegensatz zum Uno keine eingebauten Pull-Up Widerstände für den I2C-Bus.

Man muss SCL und SDA jeweils über einen Widerstand (z.B. 4,7 kOhm) an Vcc legen, also normalerweise an 3,3 V, den MCP23017 kann man auch mit 3,3 V betreiben.

Im Prinzip sollte der Teensy 3.2 5 V tolerant sein, aber Pins 18 und 19 sind auch Analogeingänge, da bin ich mir nicht ganz sicher mit der Toleranz, andere Chips aus der Famile sind nur an reinen Digitalpins 5V tolerant. Allerdings habe ich für den Teensy noch nicht entsprechendes gelesen.

Laut Refernz http://pjrc.com/teensy/pinout.html ist SCL Pin 19 und SDA 18, aber eventuell hast Du das oben nur falsch rum hingeschrieben.

ArduFE:
der Teensy hat im Gegensatz zum Uno keine eingebauten Pull-Up Widerstände für den I2C-Bus.

Die hat der Uno auch nicht.

Meines Wissens nach werden in der Wire Library die eingebauten ~50k Pullups des Uno Controllers aktiviert. Kann aber auch sein, dass sich das geändert hat.

Die Pullups im Teensy Controller funktioneren jedenfalls nicht richtig, sie sind viel zu klein https://github.com/nox771/i2c_t3

The internal pullup resistances of the Teensy devices are as follows:

Teensy LC - ~44k Ohms Teensy 3.0/3.1/3.2 - ~190 Ohms (this is believed to be a HW bug) Teensy 3.5 - ~150 Ohms (this is believed to be a HW bug) Teensy 3.6 - ~25 Ohms (this is believed to be a HW bug)

None of these internal pullups is a particularly good value.

Hallo, also Pullups habe ich jeweils von der 3.3 Vss auf die SCL and SDA Line über einen 4,7kOhm Widerstand gezogen. Funktioniert bisher trotzdem nicht. Die LED am Teensy ist an.

ArduFE: Meines Wissens nach werden in der Wire Library die eingebauten ~50k Pullups des Uno Controllers aktiviert. Kann aber auch sein, dass sich das geändert hat.

Das stimmt, hat aber nichts direkt mit dem Uno zu tun.

Und meist sind die internen Widerstände für eine saubere Funktion zu groß, daher sollten die 4,7 k auch eingebaut werden, wenn diese nicht auf anderen Boards schon vorhanden sind. Also auch immer die zusätzlichen Module prüfen.

Ok, können wir davon ausgehen, dass die Pins wirklich stimmen ? Ich nehme mal an, die Möglichkeit mit einem Scope an den Eingängen vom MCP zu messen gibt es nicht ?

Was ist mit einem I2C Scanner Sketch wie diesem http://playground.arduino.cc/Main/I2cScanner findet der was ?

Soo. Es funktioniert jetzt. Habe nochmal alles von vorne Verkabelt und siehe da es geht. War wohl doch mein Fehler. Danke für eure Unterstützung.

Dennoch gleich eine Weitere Frage:

Mein Teensy sendet ja über diese Funktion

digitalWrite(13, mcp.digitalRead(7));

das die Led an geht wenn der Taster an Pin 7 vom MCP23017 gedrückt wird. Funktioniert auch.

Kann ich anstatt der 13 (die LED) ein Midi Out senden?

Würde bei einem Button der direkt angeschlossen ist per:

usbMIDI.sendNoteOn(3,127,3); //note, velocity, channel

funktionieren. Klappt auch.

Wenn ich nun anstatt der 13 diesen Code einfüge geht es nicht. Jemand eine Idee?

Danke

uezi89:
Jemand eine Idee?

Du kannst nicht irgendwelche Befehle miteinander kombinieren. Wie wäre es mit:

if(mcp.digitalRead(7)){
  usbMIDI.sendNoteOn(3,127,3); //note, velocity, channel
}

Warum das digitalWrite(13, mcp.digitalRead(7)); funktioniert:

digitalWrite(13, Wert); mit Wert = true|false|HIGH|LOW|1|0
mcp.digitalRead(7) liefert HIGH|LOW zurück, daher kann es die Vatiable Wert direkt ersetzen.

Vielen Dank. Funktioniert so.

Hallo nochmal,

war gerade nochmal auf der Suche nach Möglichkeiten um die MCP23017 in einer guten Variante an meinen Teensy 3.2 zu bekommen.

Dabei habe ich diese Karte gefunden: https://www.tindie.com/products/land_boards/64128-channel-digital-io-card-digio-128/

Ist diese in Verbindung mit meinem Teensy zu verwenden? Ohne das mein Sketch großartig umprogrammiert werden muss? Wie verhält es sich hier mit den Pullup Widerständen die in die I2C Leitung müssen?

Über Meinungen und Infos bedanke ich mich.

Meinung: Zu wenige Informationen auf der Händlerseite, um eine vernünftige Aussage machen zu können. Ich sehe viele Jumper, aber keine Beschreibung, wozu die gut sind. Dafür 75$ wäre mir zu viel.

sind wohl keine US$

Du meinst, die Adresse Connellsville, PA, United States hat möglicherweise eine eigene Währung? Bei den Amis weiß man nie. Aber auch die angegebenen €44.86 EUR sind nicht ohne.

Ich werde denen mal Mailen ob es weitere Infos zu gibt. Werde ich dann veröffentlichen.

Habe diesen Link noch gefunden, weiß nicht ob der evtl. schon weiter hilft

http://land-boards.com/blwiki/index.php?title=DIGIO-128

erinnert an das Centipede board

uezi89: Habe diesen Link noch gefunden, weiß nicht ob der evtl. schon weiter hilft

Er hilft, PullUps sind mittels Steckbrücke wählbar: "3-4. Installed = terminate SCL line (2.2K pullup) 5-6. Installed = terminate SDA line (2.2K pullup)"

:)

Okay. Also kann ich das Teil ja verwenden. Oder was denkt ihr? Was hat es mit dem EEPROM auf sich?