-         
Ergebnis 1 bis 9 von 9

Thema: MCP23017 Adressierungsproblem

  1. #1
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    42
    Beiträge
    53

    MCP23017 Adressierungsproblem

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    4.770
    Zitat Zitat von modtronic Beitrag anzeigen
    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.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    34
    Beiträge
    3.406
    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

    Code:
    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/e.../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
    Geändert von Ceos (04.06.2019 um 18:26 Uhr)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    42
    Beiträge
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    34
    Beiträge
    3.406
    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)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    4.770
    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.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  7. #7
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    42
    Beiträge
    53
    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

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    999
    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.

  9. #9
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    42
    Beiträge
    53
    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

Ähnliche Themen

  1. i2c Bus Timing mit dem MCP23017
    Von modtronic im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 13.03.2018, 16:55
  2. Input beim MCP23017
    Von modtronic im Forum C - Programmierung (GCC u.a.)
    Antworten: 14
    Letzter Beitrag: 23.03.2017, 11:08
  3. Mcp23017
    Von modtronic im Forum C - Programmierung (GCC u.a.)
    Antworten: 17
    Letzter Beitrag: 20.02.2017, 00:15
  4. MCP23017 mit Python steuern
    Von opc im Forum Raspberry Pi
    Antworten: 4
    Letzter Beitrag: 23.01.2015, 10:43
  5. [ERLEDIGT] MCP23017 - I2C ansprechen ohne Erfolg
    Von JoeM1978 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 07.01.2014, 08:15

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •