PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mcp23017



modtronic
18.02.2017, 16:11
Guten Tag

ich versuche verweifelt den MCP23017 zum leben zu erwecken.
Ich möchte einfach nur die 16 Pins als Ausgänge nutzen

ich arbeite mit der Programmiersprache C mit dem Programm Codevision.
Erfahrung mit dem PCF 8574 sind reichlich vorhanden..daher bin ich in der i2c Programmierung vertraut.
der PCF gibt es nciht mehr als DIP Versiobn, daher wollte ich auf den MCP wechseln...das kann doch eigentlich nicht so schwer sein

Ich Möchte diesen gerne mit einem AT Mega 8L betreiben. Habe dazu eine kleine Platine gebaut und immer 2 Leds über einen ULN2804 auf die Ports A und B des MCP geschaltet.
Soweit ist er Hardwaremässig verdrahtet. die beiden Leitungen SCL und SDA liegen über 4,7 K auf +5V, Reset ebendso..Adresse ist alles auf Ground (Hex 0x20)

Ich habe die beiden Registes 0x00 und 0x01 geschrieben und laut Tabelle
soll ich dann die Register 12 , 13, 14 und 15 einfach schreiben..so habe ich auch ein Bespiel gefunden,,jedoch ohne Erfolg
habe hier jedoch schon wiedersprüchliche aussagen..einigen sagen 12 und 13 andere 14 und 15..jedoch läuft weder so noch so etwas...

er tut einfach nix..hat jemand evlt ein Beispiel welches gut erklärt ist ??

Ich hoffe mir kann jemand helfen..optional könnte ich den Bus noch testen ob er überhaupt läuft..aber wie gesagt das ist ja eigentlich kein Hexenwerk

Gruss
Patrick

HaWe
18.02.2017, 18:56
hallo,
ich habe hier ein eine gute Doku mit brauchbarem source code gefunden (in der Mitte, 2. Beispiel):
http://www.netzmafia.de/skripten/hardware/RasPi/Projekt-I2C-Expander/index.html

ansonsten habe ich speziell für den Pi mit gcc hier eine kleine Zusammenfassung mit links und libs:
http://www.mindstormsforum.de/viewtopic.php?f=78&t=8689&p=68574#p70059

modtronic
18.02.2017, 19:18
hallo,
ich habe hier ein eine gute Doku mit brauchbarem source code gefunden (in der Mitte, 2. Beispiel):
http://www.netzmafia.de/skripten/hardware/RasPi/Projekt-I2C-Expander/index.html

ansonsten habe ich speziell für den Pi mit gcc hier eine kleine Zusammenfassung mit links und libs:
http://www.mindstormsforum.de/viewtopic.php?f=78&t=8689&p=68574#p70059

Hallo

Dank dir..den Link zur Netzmafia kann ich leider nicht laden.
kommt immer Fehler auf der Seite

Gruss
Patrick

HaWe
18.02.2017, 19:50
hi,
stimmt, krieg ich jetzt plötzlich auch nicht mehr. Vielleicht (hoffentlich) nur temporär down.
Macht aber nichts, den .c und .h File samt Lauflicht-Beispiel habe ich sicherheitshalber auch im 2. Link mit veröffentlicht (letzte 3 Codeblöcke), nur die allgemeinen Infos habe ich nicht ebenfalls zitiert.

modtronic
18.02.2017, 20:01
Leider weiss ich nicht genau was du meinst ?

KÖnntest du das evlt etwas ausführlicher erklären ?
Muss ich mir noch Librarys runterladen ?

Gruss
Patrick

HaWe
18.02.2017, 20:27
es ist alles genau so, wie ich bereits schrieb, alles was du brauchst steht genau hier drin:
http://www.mindstormsforum.de/viewtopic.php?f=78&t=8689&p=68574#p70059
einfach alles in diesem Post durchlesen und ggf. kopieren!

Feuerring
18.02.2017, 20:30
hallo modtronic (https://www.roboternetz.de/community/members/49906-modtronic)

ich habe den MCP23017 mal verwendet, weil ich Ausgänge mit Tri-State benötigte ...

dafür habe ich zwischen IN / OUT umgeschaltet ... Ausgänge waren auf 0 dabei immer gesetzt

siehe hier (http://greinert.hopto.org/main/index.php?id=gdfgtfr8rf8sdr88w877d65c5zhhehh3)

Register 0 / 1 IODIR festlegen ob Eingang oder ausgang
Register 14 / 15 GPPUA Pull-Up-Widerstande
Register 20 / 21 GPIOA Ausgang setzen

restlichen Register aus NULL setzen !

RoboHolIC
18.02.2017, 23:49
Ich habe die beiden Registes 0x00 und 0x01 geschrieben und laut Tabelle
soll ich dann die Register 12 , 13, 14 und 15 einfach schreiben..so habe ich auch ein Bespiel gefunden,,jedoch ohne Erfolg
habe hier jedoch schon wiedersprüchliche aussagen..einigen sagen 12 und 13 andere 14 und 15..jedoch läuft weder so noch so etwas...

Kennst du die Wirkung des Bits IOCON.BANK bei diesem Chip? Damit wird die Zuordnung der Adressen zu den Registern umgeschaltet. Das kann (nicht nur) bei Paste&Copy-Programmierung zu Verwechslungen führen, wenn man die Vorgeschichte im Programmablauf nicht beachtet/kennt. Insgesamt ist dieser Chip etwas komplexer als der PCF 8574.
Also: RTFM - oder eben freundlicher: Lies das Datenblatt, es ist dein Freund.

modtronic
19.02.2017, 03:27
Hallo

Vielen Dank für eure Tips..Leider habe ich Probleme beim entschlüsseln des Datenblattes
und bin jetzt noch verwirtter als vorher

Mit den Links zum Rasperry PI komme ich leider nicht klar..

@Feuerring..hättest du evlt mal den Programmauszug zum 23017..bzw könntest du mir evlt mal aufschreiben was ich wo ich welches Register schreiben muss ?
ich stehe grade wirklich auf dem Schlauch

Gruss
Patrick

kann mir nicht jemand mal das Datenblatt aufschlüsseln ?

- - - Aktualisiert - - -

Hallo nochmal



Adress(hex) Name Funktion Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
00 IODIRA In or Out GPA GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
01 IODIRB In or Out GPB GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0
12 GPIOA On Off GPA GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
13 GPIOB On Off GPB GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0
14 OLATA On Off GPA GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
15 OLATB On Off GPB GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0

Das ist mal die Vereinfachte Tabelle aus dem Datenblatt.
Auf einer Seite bin ich darauf gestossen das jemand mit diesen Adressen die Ausgämge schreibt.
das habe ich auch so gemacht.jedoch tut sich nix.

Kann mir das jemand erklären ?

Gruss
Patrick

modtronic
19.02.2017, 09:40
hallo modtronic (https://www.roboternetz.de/community/members/49906-modtronic)

ich habe den MCP23017 mal verwendet, weil ich Ausgänge mit Tri-State benötigte ...

dafür habe ich zwischen IN / OUT umgeschaltet ... Ausgänge waren auf 0 dabei immer gesetzt

siehe hier (http://greinert.hopto.org/main/index.php?id=gdfgtfr8rf8sdr88w877d65c5zhhehh3)

Register 0 / 1 IODIR festlegen ob Eingang oder ausgang
Register 14 / 15 GPPUA Pull-Up-Widerstande
Register 20 / 21 GPIOA Ausgang setzen

restlichen Register aus NULL setzen !



Hallo Feuerring

könntest Du mir das evlt etwas Genauer erklären..vllt mit einem Programmauszug etc ?

Gruss
Patrick

- - - Aktualisiert - - -


Kennst du die Wirkung des Bits IOCON.BANK bei diesem Chip? Damit wird die Zuordnung der Adressen zu den Registern umgeschaltet. Das kann (nicht nur) bei Paste&Copy-Programmierung zu Verwechslungen führen, wenn man die Vorgeschichte im Programmablauf nicht beachtet/kennt. Insgesamt ist dieser Chip etwas komplexer als der PCF 8574.
Also: RTFM - oder eben freundlicher: Lies das Datenblatt, es ist dein Freund.

Leider sagt mit das nichts
Könntest Du mir da vllt etwas helfen ?

Gruss
Patrick

Feuerring
19.02.2017, 10:25
Hallo Patrick,

mal die erste Frage, kannst Du den MCP23017 denn über I2C fehlerfrei ansprechen,
sprich Register schreiben / lesen ...

Bei der I2C-Übertragung ist das erste Byte die Register Auswahl


Register 0 (A) DIR 0=OUT / 1=IN
Register 1 (B) DIR 0=OUT / 1=IN

Register 12 (A) Pull-UP 0=aus / 1=ein
Register 13 (B) Pull-UP 0=aus / 1=ein

Register 18 (A) IO 0=LOW / 1=HIGH
Register 19 (B) IO 0=LOW / 1=HIGH

Programm kann ich Dir nicht geben, würde dich nur noch mehr verwirren,
ich steuere den MCP23017 über einen I2C-Bus und einem IOW-Worrior

modtronic
19.02.2017, 10:53
Hallo Patrick,

mal die erste Frage, kannst Du den MCP23017 denn über I2C fehlerfrei ansprechen,
sprich Register schreiben / lesen ...

Bei der I2C-Übertragung ist das erste Byte die Register Auswahl


Register 0 (A) DIR 0=OUT / 1=IN
Register 1 (B) DIR 0=OUT / 1=IN

Register 12 (A) Pull-UP 0=aus / 1=ein
Register 13 (B) Pull-UP 0=aus / 1=ein

Register 18 (A) IO 0=LOW / 1=HIGH
Register 19 (B) IO 0=LOW / 1=HIGH

Programm kann ich Dir nicht geben, würde dich nur noch mehr verwirren,
ich steuere den MCP23017 über einen I2C-Bus und einem IOW-Worrior

Morgen

Das war auch gestern ein Gedanke..ich wollte mal mit einem PCF 8574 testen ob der Port überhaupt läuft
Laut Oskar wurden aber Daten übertragen

Jetzt ist ebend meine Frage zu den Registern

Laut eines Beitrages im Netz soll ich das so machen
i2c_start();
i2c_wirte (0x20);
i2c_write(0x00);
i2c_write(0x00);
i2c:stop();

i2c_start();
i2c_write(0x20);
i2c_write(0x01);
i2c_write(0x00);
i2c:stop();

i2c_start();
i2c_write(0x20);
i2c_write(0x12);
i2c_write(0xFF);
i2c:stop();

die 0x12 sollen den Port A ansprechen und 0x13 den Port B ist das denn überhaupt richtig ??
FF wären ja alle Pins auf High..das habe ich aber schon gar nicht hinbekommen

kannst du mir das mit den Registern evlt mal genauer erklären
anhand eines kleines Beispieles ?

Gruss
Patrick

Klebwax
19.02.2017, 12:10
Morgen

Das war auch gestern ein Gedanke..ich wollte mal mit einem PCF 8574 testen ob der Port überhaupt läuft
Laut Oskar wurden aber Daten übertragen

Jetzt ist ebend meine Frage zu den Registern

Laut eines Beitrages im Netz soll ich das so machen
i2c_start();
i2c_wirte (0x20); <-- hier sollte ACK/NAK ausgewertet werden
i2c_write(0x00);
i2c_write(0x00);
i2c:stop();

Typischer I2C-Code, wie er so im Netz zu finden ist, keine Auswertung von ACK/NAK. Sonst würde man sehen, daß das Control Byte falsch ist, siehe FIGURE 1-2 im Datenblatt. Eine I2C Adresse hat 7 Bit und liegt in den oberen 7 Bit des Control Bytes, machmal auch Address Byte (nicht Adresse) genannt. Das unterste Bit ist das R/W Bit. Eine I2C Übertagung beginnt immer mit

i2cStart()
i2cWrite((I2CAdress << 1) | R/Wbit)

Wenn bis hierher alles stimmt, die Adresse richtig ist und der Bus am Anfang Idle war, gibts ein ACK und man kann weiter machen. Ansonsten Stop schicken und den Service rufen.

MfG Klebwax

P.S. Bei jedem Write sollte ACK/NAK ausgewertet werden, ansonsten ist alles wie das Rufen in einen dunklen Wald. Niemand weiß, ob man je gehört worden ist.

modtronic
19.02.2017, 13:14
Hallo

Ich habe eine komplette Modellbahnsteuerung mit dem i2c Bus gebaut.
Diese läuft seit 2,5 Jahren ohne Probleme. Verwendung findet der PCF 8574 für die Adressierung.
Auch hier wird kein ACK ausgewertet.

So..der MCP 23017 läuft genau wie oben beschrieben mit dem Code
Register 0x00 und 0x01 auf Low
0x14 und 0x15 sind für die Ausgänge..werde damit die Tage dann weiter experimentieren

Er hört allerdings auf die Adresse 0x40 anstatt auf 0x20..gibt es hier Bauart Unterschiede wie beim PCF 8574 ??
Übrigens auch hier habe ich die Adresse nicht im Datenblatt damals gefunden

ich Bedanke mich erstmal für eure Tipps..muss aber sagen "steht im Datenblatt" ist keine Lösung das dann zu schreiben wenn jemand nicht weiterkommt.
Weil das mit der Adresse steht da nämlich auch nicht.

Oder habe ich da etwas überlesen ?

Gruss
Patrick

Klebwax
19.02.2017, 16:41
Hallo

Ich habe eine komplette Modellbahnsteuerung mit dem i2c Bus gebaut.
Diese läuft seit 2,5 Jahren ohne Probleme. Verwendung findet der PCF 8574 für die Adressierung.
Auch hier wird kein ACK ausgewertet.

So..der MCP 23017 läuft genau wie oben beschrieben mit dem Code
Register 0x00 und 0x01 auf Low
0x14 und 0x15 sind für die Ausgänge..werde damit die Tage dann weiter experimentieren

Er hört allerdings auf die Adresse 0x40 anstatt auf 0x20..gibt es hier Bauart Unterschiede wie beim PCF 8574 ??

Ich schrieb oben:

Eine I2C Adresse hat 7 Bit und liegt in den oberen 7 Bit des Control Bytes, machmal auch Address Byte (nicht Adresse) genannt. Das unterste Bit ist das R/W Bit.
Er hört schon auf die Adresse 0x20. Wird die, wie sowohl in der I2C Spec:


After the START condition (S), a slave address is sent. This address is 7 bits long followed by an eighth bit which is a data direction bit (R/W) - a ‘zero’ indicates a transmission (WRITE), a ‘one’ indicates a request for data (READ)

als auch im Datenblatt

32425

beschrieben, in die oberen 7 Bit des Control Bytes gepackt, ergibt das 0x40.

Ob man einen Slave ansprechen kann, egal ob es ein HW oder ein SW Problem ist, läßt sich leicht am ACK erkennen. Aber man kann natürlich auch fragen.

MfG Klebwax

RoboHolIC
19.02.2017, 16:57
So, jetzt hab ich aufgeholt und bin wieder auf dem Laufenden.
Daß du Meinungen und Codeschnipsel Dritter zitiert hast, fördert bei mir nicht gerade den Eindruck ernsthafter Eigenbemühungen. War nicht böse gemeint, nur ehrlich ;-). Jetzt also konstruktiv weiter.

Die Chipadresse ist aus Figure 1-2 im Abschnitt 1.4 abzulesen: beginnend mit dem MSBit: 0100, dann die drei HW-Aresspins/-bits, danach das R/W-Bit.
Je nachdem, in welchen Format die Adresse anzugeben ist, variiert diese auch: als Adresse OHNE R/W-Bit ist es eben 0100 000, also 0x20, dazu das R/W-Bit.
Zählt man aber das R/W-Bit zur Adresse dazu, dann ist die Leseadresse des Chips 0100 000 0, also 0x40, die Schreibadresse 0100 000 1, also 0x41. (Die Leerzeichen sind nur zur Strukturierung eingefügt, haben keine Bedeutung!)
Aus Table 1-5 und 1-6 ist abzulesen, dass der Wert des IOCON.BANK-Bits nach dem Reset gleich "0" ist. Das ist, wie bereits gesagt, wichtig für die richtige Registeradressierung.

Byte Mode, Sequential Mode - ich gestehe, ich krieg die speziellen Sachen auch nicht mehr aus dem Ärmel geschüttelt, habe aber vor ein, zwei Jahren eine Pin-sparende Grafik-LCD-Ansteuerung via MCP23017 nach Datenblatt zum laufen gekriegt. Da steht schon alles drin was man zu diesem Chip wissen muss.

Prüfe doch einfach bei den Lib-Funktionen mal nach, ob du nicht doch das ACK bzw. NACK abwarten musst. Das ist im Grunde anzunehmen.
Ich hab selbst schon mal Code Produziert, der nicht I2C-konform war, aber trotzdem funktionierte, weil damals der Controller diesen Fehler kaschierte, sein Nachfolger aber nicht mehr ...



Adress(hex) Name Funktion Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
00 IODIRA In or Out GPA GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
01 IODIRB In or Out GPB GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0
12 GPIOA On Off GPA GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
13 GPIOB On Off GPB GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0
14 OLATA On Off GPA GPA7 GPA6 GPA5 GPA4 GPA3 GPA2 GPA1 GPA0
15 OLATB On Off GPB GPB7 GPB6 GPB5 GPB4 GPB3 GPB2 GPB1 GPB0

Das sind jedenfalls schon mal die richtigen Registeradressen nach einem Reset.

modtronic
19.02.2017, 19:35
So, jetzt hab ich aufgeholt und bin wieder auf dem Laufenden.
Daß du Meinungen und Codeschnipsel Dritter zitiert hast, fördert bei mir nicht gerade den Eindruck ernsthafter Eigenbemühungen. War nicht böse gemeint, nur ehrlich ;-). Jetzt also konstruktiv weiter.

Die Chipadresse ist aus Figure 1-2 im Abschnitt 1.4 abzulesen: beginnend mit dem MSBit: 0100, dann die drei HW-Aresspins/-bits, danach das R/W-Bit.
Je nachdem, in welchen Format die Adresse anzugeben ist, variiert diese auch: als Adresse OHNE R/W-Bit ist es eben 0100 000, also 0x20, dazu das R/W-Bit.
Zählt man aber das R/W-Bit zur Adresse dazu, dann ist die Leseadresse des Chips 0100 000 0, also 0x40, die Schreibadresse 0100 000 1, also 0x41. (Die Leerzeichen sind nur zur Strukturierung eingefügt, haben keine Bedeutung!)
Aus Table 1-5 und 1-6 ist abzulesen, dass der Wert des IOCON.BANK-Bits nach dem Reset gleich "0" ist. Das ist, wie bereits gesagt, wichtig für die richtige Registeradressierung.

Byte Mode, Sequential Mode - ich gestehe, ich krieg die speziellen Sachen auch nicht mehr aus dem Ärmel geschüttelt, habe aber vor ein, zwei Jahren eine Pin-sparende Grafik-LCD-Ansteuerung via MCP23017 nach Datenblatt zum laufen gekriegt. Da steht schon alles drin was man zu diesem Chip wissen muss.

Prüfe doch einfach bei den Lib-Funktionen mal nach, ob du nicht doch das ACK bzw. NACK abwarten musst. Das ist im Grunde anzunehmen.
Ich hab selbst schon mal Code Produziert, der nicht I2C-konform war, aber trotzdem funktionierte, weil damals der Controller diesen Fehler kaschierte, sein Nachfolger aber nicht mehr ...


Das sind jedenfalls schon mal die richtigen Registeradressen nach einem Reset.

Nabend

Na ich habe versucht diesen IC nach Datenblatt zum laufen zu kriegen.
Ob es nun falsch oder Richtig war, oder ob meinen Eigenbemühungen zu wenig sind und dann im Netz zu suchen, sei dahin gestellt.
Ich habe versucht eine Lösung zu finden, ohne dieses Forum.
Dachte eigentlich dieses Forum ist für sowas gut geeignet...sorry das man dann halt fragt...
Hatte mich halt durch die Suche im Netz auch etwas verannt und wie es so schön heisst, den Wald vor lauten Bäumen nicht gesehn.

Bin dann mit der Adresse dann auch von selber drauf gekommen ;-)

Das Zitieren kam nur, weil es Leute auch so gemacht hatten wie ich, es aber nicht geklappt hat.

Und wie man sieht bin ich hier schon länger angemeldet aber nicht wirklich aktiv gewesen, weil ich immer alleine drauf gekommen bin.
bin jetzt öfters hier bereits angemacht worden, weil man man ein Frage hat die für andere vielleicht ganz klar ist..habe mir das MC Programmieren komplett selber bei gebracht.
war jetzt das letzte Mal das ich hier etwas gefragt habe.

ich hatte etwas Probleme mit dem ganzen Registern, muss aber sagen habe ausser dem PCF 8574 nicht viel mit dem i2c Bus gemacht..er ist einfach zu Programmieren und hat mir
20 Jahre Gute Dienste geleistet...da er leider nicht mehr so einfach zu bekommen ist, und wenn nur zu etwas teureren Preisen war ich halt auf der Suche nach einer anderen Lösung

Der Gedanke war zunächst das ganze über Schieberegister zu lösen, jedoch wollte ich meine Schaltung mit dem AT-Mega 8L lösen und hatte dann für 8 Schieberegister die ich benötigt hätte einfach nicht genug Pins zur Verfügung, und dann stiess ich auf diesen Kanditat hier.

Tschüss
Pat

RoboHolIC
20.02.2017, 00:15
... bin jetzt öfters hier bereits angemacht worden, weil man man ein Frage hat die für andere vielleicht ganz klar ist..
Ich hab mir mal die Mühe gemacht und die Threads überflogen, an denen du beteiligt warst. Deine Kritik am Forum (also an den Mitgliedern) kann ich absolut nicht nachvollziehen - außer, du verwechselst unverblümte inhaltliche Richtigstellungen bzw. Nachfragen mit Anmache. (Für meine eigenen Beiträge mag dies nicht gelten, ich bin vielleicht zu persönlich geworden, verletzen wollte ich dich aber nicht.)

... war jetzt das letzte Mal das ich hier etwas gefragt habe. Mitglieder verprellen ist hier unüblich. Und dein Hinweis auf die abnehmende Verfügbarkeit des PCF 8574 als DIL war mir wertvolle Randinformation.