PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MCP23017 Adressierungsproblem



modtronic
04.06.2019, 18:03
Mahlzeit

ich habe mittels eines AT Mega 128 und dem MCP 23017 eine Art SPS gebaut.
ich betreibe den MCP am i2c Bus und nutze ihn nur für die Ausgänge.
Hierfür habe ich eine Platine gebaut, die je einen MCP aufnimmt, dieser treibt ULN 2804 Treiber und so habe ich pro Platine 16 Ausgänge, und kann somit 8 Platinen davon stecken.

Die Adressen werden Hardwaretechnisch mittels Lötbrücken gesetzt.

nun zu meiner Frage.
Laut Unterlagen und Internet soll der MCP über die Adressen 0x20 -0x27 angesprochen werden können, was aber nicht klappt.
ich habe nach mehreren versuchen ihn zum Leben bringen können, nutze die register 0x14 und 0x15 für Ausgänge.
bei mir geht das aber nur über die Adressen 0x40, 0x42, 0x44...bis 0x54...im Klartext 0x20 entspricht 0x40, 0x21 entspricht 0x42 und so weiter.
Hier wäre meine Frage warum?

Ein weiteres Problem ist, ich kann ihn bis zur 5 Adresse, also ox40 bis 0x48 Problemlos ansprechen, 0x50, 0x52 und 0x54 verweigert er seinen Dienst, hat hier jemand eine Erklärung. Habe auch 0x26 mal versucht geht leider auch nicht.

Somit kann ich derzeit nur 5 Karten verwenden.
das Problem ist auch erst heute aufgetreten weil ich eine 6.te Karte nicht mehr ansprechen kann.
Die Softwareroutine ist immer das gleiche, im programmkopf setze ich die Register auf Ausgang was ja auch bei den anderen Problemlos geht und im Programm werden diese angesprochen, ebend bis zur jenen Adresse die nicht mehr geht.

Gibt es hier einen Trick oder muss ich das was beachten, oder verschieben sich hier evlt Adressen ?

Danke und Gruss
Patrick

HaWe
04.06.2019, 18:15
Mahlzeit

ich habe mittels eines AT Mega 128 und dem MCP 23017 eine Art SPS gebaut.
ich betreibe den MCP am i2c Bus und nutze ihn nur für die Ausgänge.
Hierfür habe ich eine Platine gebaut, die je einen MCP aufnimmt, dieser treibt ULN 2804 Treiber und so habe ich pro Platine 16 Ausgänge, und kann somit 8 Platinen davon stecken.

Die Adressen werden Hardwaretechnisch mittels Lötbrücken gesetzt.

nun zu meiner Frage.
Laut Unterlagen und Internet soll der MCP über die Adressen 0x20 -0x27 angesprochen werden können, was aber nicht klappt.
ich habe nach mehreren versuchen ihn zum Leben bringen können, nutze die register 0x14 und 0x15 für Ausgänge.
bei mir geht das aber nur über die Adressen 0x40, 0x42, 0x44...bis 0x54...im Klartext 0x20 entspricht 0x40, 0x21 entspricht 0x42 und so weiter.
Hier wäre meine Frage warum?

Ein weiteres Problem ist, ich kann ihn bis zur 5 Adresse, also ox40 bis 0x48 Problemlos ansprechen, 0x50, 0x52 und 0x54 verweigert er seinen Dienst, hat hier jemand eine Erklärung. Habe auch 0x26 mal versucht geht leider auch nicht.

Somit kann ich derzeit nur 5 Karten verwenden.
das Problem ist auch erst heute aufgetreten weil ich eine 6.te Karte nicht mehr ansprechen kann.
Die Softwareroutine ist immer das gleiche, im programmkopf setze ich die Register auf Ausgang was ja auch bei den anderen Problemlos geht und im Programm werden diese angesprochen, ebend bis zur jenen Adresse die nicht mehr geht.

Gibt es hier einen Trick oder muss ich das was beachten, oder verschieben sich hier evlt Adressen ?

Danke und Gruss
Patrick

vermutlich sind 0x20 -0x27 die 7-bit-Adressen, während die doppelt so hohen Werte in 2er-Schritten die 8-bit-Adressschreibweisen sind.
Arduino gpp und gcc/gpp auf Raspi nutzen die 7-bit-Schreibweise, bei dir sind es vermutlich die anderen.
Ein i2c-Scanner kann dir die aktuellen mcp-Adressen für deine Software auslesen.

Ceos
04.06.2019, 18:17
I2C Adresssen sind immer 7 Bit, das unterste Bit wird als Steuerinformation für lesen oder schreiben gewertet

Manche Hersteller geben die Adresse maskiert also als 8 bit WErt an udn manche geben sie als 7Bit Wert an

In der Programmierung sieht dass dann üblicherweise so aus



address = (SOME_ADDRESS<<1)+DIRECTION_BIT

und der Shift nach Links verdoppelt dann logischerweise den Wert den du zunächst angenommen hast 0x20 zu sein auf 0x40 + 1 für lesen




-----------------


Nachtrag

http://ww1.microchip.com/downloads/en/devicedoc/20001952c.pdf

mit 3 Address-Bits hast du 2^3 = 8 Mögliche Adressen

Auf Seite 15, Figure 3-4 findest du wie genau deine Adresse aussehen muss

modtronic
04.06.2019, 18:53
Mahlzeit

mit der 7 und 8 Bit Adressierung hatte ich mich beschäftigt.
Mit der 7 Bit Adressierung kann ich den MCP aber von meinem Microcontroller nicht ansprechen, somit habe ich mich für die andere
Variante entscheiden müssen. ich habe lange damit rumgespielt, allerdings bisher nich so hohe adressen belegt.

wenn ich das also richtig verstehe komme ich bei der 6. Adresse nicht mehr an den MCP ran, weil der Adressraum durch die 8 Bit Adresse überläuft ?? nennen
wir das mal so..
Mein Ansprechen sind nun folgender Massen aus

i2c_start();
i2c_write(ox50); beispiel
i2c_write(Port a oder b)
i2c_write(Portwert)
i2c_stop;


Wie kann ich nun die anderen Drei Adressen ansprechen, bzw was ist ein i2c scanner ? wo bekomme ich so einen Her ?
bzw wie müsste ich das schreiben das ich evlt doch per 7 Bit Adresse an den MCP rankomme ?

vllt ein beispiel in meiner schreibweise ?

grüsse
Patrick

Ceos
04.06.2019, 19:06
Ein I2C Scanner ist nichts weiter als eine kleine Schleife die einfach versucht ein Byte über I2C zu lesen mit steigender Adresse pro Schleife

deine Basis Adresse lautet 0x20 (7bit) das macht dann dem Datenblatt nach 0b.0010.000x

Du die letzten 3 Bit vor dem x-Bit entsprechen deinen Adressleitungen A0-A2

du kannst also folgende Adressen nutzen (Hex in 8bit, alles nur schreiben ... jeweils +1 zum lesen logischerweise :) )

0b.0010.000x (0x40)
0b.0010.001x (0x42)
...
0b.0010.111x (0x4E)

HaWe
04.06.2019, 19:11
ich würde mir an deiner Stelle für deine Software fertige Codebeispiele oder fertige libs für die mcp23017 suchen und dann darauf aufbauen.
Ist übrigens genau der Grund, weshalb ich zum Programmieren grundsätzlich Arduino mit fertigen C++ libs nutze.
Ich bin mir auch einigermaßen sicher, dass sich dein ATMega128 per Arduino programmieren lässt.

modtronic
04.06.2019, 19:22
ok..dank dir

ich habe das ganze mal in einem hex - dez umgerechnet
würde da in dem fall evlt auch gehn.weil

ox40 wäre ja 64
ox48 w#re ja 72
ox50 aber schon 80...

würde das auch gehn, oder muss es dann wirklich die 7 bit variante sein?

grüsse
Patrick

- - - Aktualisiert - - -

ich glaube ich aber die falsche adresse genommen
wenn ich das wie du das hier schreibst, lese
ist es nciht der adressraum 0x40 - 0x54 sondern ox40 - 0x4e...
und die letzten drei adressen sind nicht 0x50, 0x52 und 0x54 sonder ox4a, ox4c und ox4e..

kann das evlt sein das ich einfach nur ein denkfehler habe bzw wenn ich es dezimal programmierz hätte es gar nicht aufgefallen wäre ?

grüsse
Patrick

RoboHolIC
04.06.2019, 23:59
Ich denke du hast es erfasst! Du hast den Adressraum in dezimalen Zahlen gedacht, aber als hex-Zahlen geschrieben. Mit 0x40 .. 0x4e wird das jetzt funktionieren.

Im Übrigen sind 7bit-Adressen und 8bit-Adressen keine verschiedenen Adressen oder Methoden sondern ĺediglich eine Frage der binären Interpretation des erforderlichen Registerinhaltes beim Adressbyte. Das nur nochmals zur Verdeutlichung.

modtronic
05.06.2019, 01:26
Mahlzeit

Danke für eure Hilfe..ich habe wirklich die letzten drei Adressen falsch programmiert, bzw den Falschen Adressraum genutzt.
Jetzt geht es. Perfekt.

Grüsse
Patrick