IOW28 und Portbaustein MCP23017

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

MBS_VB
Posts: 11
Joined: Mon May 11, 2020 2:54 pm

IOW28 und Portbaustein MCP23017

Post by MBS_VB »

Hallo zusammen,

ich bekomme es nicht hin die IOs des MCP23017 über IIC in C# zu lesen oder zuschreiben. Ich habe mich an den Beispielen des IOW24 gehalten. Hat jemand eine Beispiel-Code für das IOW28-Dongle? Oder kann jemand helfen?

Grüße
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW28 und Portbaustein MCP23017

Post by Christoph Jung »

Wie sieht denn der Code aus, ohne den kann man schlecht helfen.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
MBS_VB
Posts: 11
Joined: Mon May 11, 2020 2:54 pm

Re: IOW28 und Portbaustein MCP23017

Post by MBS_VB »

Anbei der zur Zeit existierende Code zum Lese. Ich danke wenn das funktionert geht schreiben analog dazu, oder?

private void ConnectIOWarrior()
{

iowHandle = IOWarrior.Functions.IowKitOpenDevice();

if (iowHandle != IntPtr.Zero)
{
int IOCount = (int)IOWarrior.Functions.IowKitGetNumDevs();
for (int c = 0; c <= IOCount; c++)
{
iowHandle = IOWarrior.Functions.IowKitGetDeviceHandle((uint)c);
pID = IOWarrior.Functions.IowKitGetProductId(iowHandle);
if (pID == IOWarrior.Defines.IOWKIT_PRODUCT_ID_IOW28) IOW28.iow28Handle = iowHandle;
}

if (IOW28.iow28Handle == IntPtr.Zero)
{
MessageBox.Show("Es konnte keine Verbindung zum Modellbahnsteuerungscontroller hergestellt werden.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
IOW28.iow28Handle = IntPtr.Zero;
}
}
else
{
MessageBox.Show("Es konnte keine Verbindung zum Modellbahnsteuerungscontroller hergestellt werden.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information);
IOW28.iow28Handle = IntPtr.Zero;
}
}

private void EnableIIC()
{
uint ret = 0;

//Init I2C Mode
IOW28.report[0] = 0x01; // I2C Mode
IOW28.report[1] = 0x01; // Enable
IOW28.report[2] = 0x00; // Speed, 0 - 100 kbit/s, 1 - 400 kbit/s, 2 - 50 kbit/s, 3 - 10 kbit/s, 4 - 1000 kbit/s
IOW28.report[3] = 0x00; // Timeout (not yet implemented)
ret = IOWarrior.Functions.IowKitWrite(IOW28.iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, IOW28.report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
}

private void ReadOverIIC_Click(object sender, EventArgs e)
{
ConnectIOWarrior();

EnableIIC();

IOW28.report[0] = 0x03; // Read mode
IOW28.report[1] = 0x02; // Count bytes to read
IOW28.report[2] = 0x00;
IOW28.report[3] = 0x00;
if (IOWarrior.Functions.IowKitWrite(IOW28.iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, IOW28.report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE) == IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE)
{
if (IOWarrior.Functions.IowKitRead(IOW28.iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, IOW28.report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE) == IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE)
{
label1.Text = IOW28.report[3].ToString();
}
else
{
MessageBox.Show("ERROR on IowKitRead(). CANCEL");
}
}
else
{
MessageBox.Show("ERROR on IowKitWrite(). CANCEL");
}
}

Danke für die angebotene Hilfe.
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW28 und Portbaustein MCP23017

Post by Christoph Jung »

Na es fehlt die I2C Adresse, von der er lesen soll.
Also das Byte IOW28.report[2] = 0x00; , hier muss die Adresse rein. Sonst weiß er ja nicht wer gemeint ist.
Bitte dran denken, dass die IO-Warrior eine 8-Bit I2C Adresse benötigen.

Ansonsten sieht der Code soweit OK aus
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
MBS_VB
Posts: 11
Joined: Mon May 11, 2020 2:54 pm

Re: IOW28 und Portbaustein MCP23017

Post by MBS_VB »

Habe jetzt bei IOW28.report[2] die Adresse 0x40 eingetrage, die wurde mit EasyI2C ermittelt. Das Ergebnis ist immer 0, egal was am GPA oder GPB am MCP23017 anliegt.
fr_a_nk
Posts: 6
Joined: Tue Jul 15, 2014 6:54 pm

Re: IOW28 und Portbaustein MCP23017

Post by fr_a_nk »

Als erstes muss ein Schreibzugriff mit der Adresse 0x40 erfolgen um dem MCP23017 mitzuteilen auf welches Register zugegriffen werden soll. Danach erfolgt der Lesezugriff mit der Adresse 0x41. Näheres siehe Datenblatt Punkt 1.3.2.2, Figure 1-1 und Punkt1.4
MBS_VB
Posts: 11
Joined: Mon May 11, 2020 2:54 pm

Re: IOW28 und Portbaustein MCP23017

Post by MBS_VB »

Datenblatt vom IOW28 oder MCP23017? Wenn MCP23017, dann von welchen Hersteller. Im meinem Datenblatt habe nichts gefunden.
Wie müsste der Code dann aussehen?
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW28 und Portbaustein MCP23017

Post by Christoph Jung »

Na es muss doch ein Datenblatt vorliegen, wenn man mit dem Baustein arbeitet, und da sollten dann auch die I2C-Register hinterlegt sein, die der Slave hat.

Wie Fr_a_nk schon geschrieben hat sollte man vor dem Lesen einen Schreibbefehl auf das I2C-Register absetzten, von dem man lesen möchte. Onst liest man unter Umständen ein anderes Register, wenn der Registerpointer im Chip automatisch hochzählt.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
MBS_VB
Posts: 11
Joined: Mon May 11, 2020 2:54 pm

Re: IOW28 und Portbaustein MCP23017

Post by MBS_VB »

Passendes Datenblatt gefunden. Werde mein Glück mal damit versuchen.
MBS_VB
Posts: 11
Joined: Mon May 11, 2020 2:54 pm

Re: IOW28 und Portbaustein MCP23017

Post by MBS_VB »

So das lesen funktioniert jetzt super. Danke für die Tips!

Aber beim Schreiben habe ich noch so meine Probleme.
Ich möchte an Port A vom MCP23017 Daten schreiben der Code hierzu sieht z.Zt. wie folgt aus:

//Init I2C Mode
report[0] = 0x01; // I2C Mode
report[1] = 0x01; // Enable
report[2] = 0x00; // Speed, 0 - 100 kbit/s, 1 - 400 kbit/s, 2 - 50 kbit/s, 3 - 10 kbit/s, 4 - 1000 kbit/s
report[3] = 0x00; // Timeout (not yet implemented)
IOWarrior.Functions.IowKitWrite(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);

// Daten am Port A schrieben
report[0] = 0x02; // Schriebenmodus
report[1] = 0xC2; // Start+Stop und 2 Byte
report[2] = 0x40; // Slave-Adresse
report[3] = 0x12; // Register, auf das zugegriffen werden soll
report[4] = 0x80; // Daten die geschrieben werden sollen
IOWarrior.Functions.IowKitWrite(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);
IOWarrior.Functions.IowKitRead(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);

Leider wir das Bit am Port aber nicht in 1 geschaltet. Wo liegt hier da Problem?
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: IOW28 und Portbaustein MCP23017

Post by Guido Körber »

Na wenn angegeben wird, dass zwei Bytes zu übertragen sind, dann werden auch zwei Bytes übertragen und nicht drei.
MBS_VB
Posts: 11
Joined: Mon May 11, 2020 2:54 pm

Re: IOW28 und Portbaustein MCP23017

Post by MBS_VB »

Super, funktioniert. Danke!
Da habe ich wohl den Wald vor lauter Bäumen nicht gesehen :-)
MBS_VB
Posts: 11
Joined: Mon May 11, 2020 2:54 pm

Re: IOW28 und Portbaustein MCP23017

Post by MBS_VB »

Eine Frage und ein Problem habe ich dann doch noch. Muss man vor jedem Schreib-/Lesezuriff den Modus für IIC initialisieren?

//Init I2C Mode
report[0] = 0x01; // I2C Mode
report[1] = 0x01; // Enable
report[2] = 0x00; // Speed, 0 - 100 kbit/s, 1 - 400 kbit/s, 2 - 50 kbit/s, 3 - 10 kbit/s, 4 - 1000 kbit/s
report[3] = 0x00; // Timeout (not yet implemented)
IOWarrior.Functions.IowKitWrite(iow28Handle, IOWarrior.Defines.IOW_PIPE_I2C_MODE, report, IOWarrior.Defines.IOWKIT28_SPECIAL_REPORT_SIZE);


Nach einer Laufzeit von ca. 13 Minuten 53 Sekunden und 8330 Messungen erhalte ich folgende Fehlermeldung:

Assistent für verwaltetes Debuggen "FatalExecutionEngineError"
Nachricht = Assistent für verwaltetes Debuggen "FatalExecutionEngineError" : "Die Laufzeit hat einen schwerwiegenden Fehler entdeckt. Fehleradresse: "0x737c92b1" in Thread "0x276c". Fehlercode: 0xc0000005. Bei diesem Fehler könnte es sich um ein Problem in der CLR oder in den unsicheren oder nicht verifizierbaren Teilen des Benutzercodes handeln. Übliche Ursachen dieses Bugs sind Marshallerfehler für COM-Interop oder PInvoke, die den Stapel beschädigen können."
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW28 und Portbaustein MCP23017

Post by Christoph Jung »

Nein, das Einschalten eines Specialmodes muss nur einmal erfolgen. Der bleibt so lange aktiv, bis man ihn entwerder abschaltet oder dem IO-Warrior den Strom abschaltet.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
MBS_VB
Posts: 11
Joined: Mon May 11, 2020 2:54 pm

Re: IOW28 und Portbaustein MCP23017

Post by MBS_VB »

Gibt es einen Unterschied zwischen IOW28-DG und IOW28-DIL in Bezug auf das Verhalten der Specialmode Initalisierung. Auch wenn Sie schreiben das die Initialisierung nur einmalig erfolgen brauch, muss ich diese vor jedem Schreib-/Lesenzugriff machen. Ansonsten passiert am MCP23017 nichts.
Ferner habe immer noch das Probelm des Absturzes mit dem Fehlercode 0xc0000005.
Post Reply