Lauflicht am MCP23017 läuft nicht

Hallo Freunde,
ich möchte ein 16-fach Lauflicht am Schieberegister MPC23017 betreiben. Wenn ich eine einzelne LED/PIN am MCP anspreche, geht es. Nun habe ich offensichtlich ein Denkproblem.
Hier der Code:

/* 16-fach Lauflicht am MCP23017
 * erstellt: 03.08.22  
 */
#include <Wire.h>
#include <Adafruit_MCP23017.h>
Adafruit_MCP23017 mcp;
int i;
void setup()
{
  mcp.begin(); // Init MCP23017 at address 0x20
  for (i = 0; i < 16; i++);
  mcp.pinMode(i, OUTPUT);
}
void loop()
{
  for (i = 0; i < 16; i++)
  {
    mcp.digitalWrite(i, HIGH);
    delay(500);
    mcp.digitalWrite(i, LOW);
  }
}

Bitte helfen

Entschuldigung, vergessen, das Ganze wird über einen Nano gesteuert.

GND am MCP23017?

Ein Semikolon zu viel, korrigiert:

  for (i = 0; i < 16; i++)
  {
    mcp.pinMode(i, OUTPUT);
  }

Wieso Schieberegister ?
Der MCP23017 ist ein I2C Portexpander.

Die For-Schleife im Setup:

 for (i = 0; i < 16; i++);
  mcp.pinMode(i, OUTPUT);

funktioniert so nicht. So geht es besser:

for (i = 0; i < 16; i++)
  {
      mcp.pinMode(i, OUTPUT);
  }

VG, Tobias

Edit: Mit 'agmue' post überschnitten...

Ich hoffe die LED haben Vorwiderstände.

Ich war erst im Keller, um die ICs zu holen, daher hat es etwas länger gedauert bei mir.

Der primäre Fehler ist, dass i global ist.
Also weg damit.

Richtiger:
for ( int i = 0; i < 16; i++)

Dann wäre auch dieser Fehler gemeldet worden:

sketch_aug03d:12:15: error: 'i' was not declared in this scope
   12 |   mcp.pinMode(i, OUTPUT);
      |               ^

Ganz am Rande, Du benutzt eine alte Bibliotheksversion. Die neue kann auch MCP23S17 am SPI-Bus ansteuern.

Hallo agmue,
wie immer, danke. Wenn man da 5 mal draufschaut, brennt sich das Bild (Code) als "richtig" ein, den sieht man erst nach 2 Wochen Pause. Danke

Im Original schon, :wink:

Stimmt. Hatte vorher noch mit dem 74HC595 hantiert und verworfen, da nur 8 Pins.

kannste ja 2 in Reihe schalten und 16 Bit rausschieben.
Grüße Uwe

Hallo Uwe,
die Lösung mit dem MCP finde ich eleganter und durch die Direktansprache der Pins auch (für mich) verständlicher und später noch nachvollziehbar :wink:

MCP23017 ist ein Baustein mit I2C Bus. Der ist viel langsamer als ein MCP23S17 mit SPI oder ein 595 mit SPI angesteuert.

Wenn ich nur Outputs brauche sehe ich wenig Unterschied zwishen den genannten Lösungen. Wenn ich gemischt Outouts und Inputs bzw Interruptgesteuert durch INPUTänderungen einlese sind die MCP von Vorteil.

Grüße Uwe

die Adafruit lib macht halt einen Anwenderfreundliches API rund um den MCP und man hat hat ein "digitalWrite" auf Pin Ebene.

Wenn man aber eh nur ein Lauflicht haben will, wär ein Portzugriff bzw. ein Schieberegister auch wieder wurst.

delay(500);

vieleicht sogar zwei, damit man mehr als ein blitzen sieht.

da braucht man über Geschwindigkeitsvorteile der einen oder anderen Übertragungsart auch nicht mehr diskutieren.