- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 15

Thema: Input beim MCP23017

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    du liest ja bytes, also 8 Eingänge als Bitmuster auf einmal.
    Ist dein Problem, wie du das Byte in ein Bitpattern auflösen kannst, wo jedes Bit einen diskreten Eingang repräsentiert?

    das wäre dann so etwas was du meinst...? (source ist dein Byte, funktioniert aber auch mit int)

    #define bitRead(source, bit) ( ((source) >> (bit)) & 0x01 )

    daneben kann man noch machen:

    #define bitSet (source, bit) ( (source) |= (1UL << (bit)) )
    #define bitClear(source, bit) ( (source) &= ~(1UL << (bit)) )
    #define bitWrite(source, bit, bitvalue) ( bitvalue ? bitSet(source, bit) : bitClear(source, bit) )

  2. #2
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    48
    Beiträge
    68
    Hallo

    Nein..ich möchte einfach 1 Byte eines MCP23017 auf einen anderen Übertragen...relativ simpel.
    über eine Expander soll der Bus dann ca 10 - 15 Meter überwinden. Auf der Eingabeseite sollen dann 4 MCP sitzen mit der CPU und sender und auf der anderen Seite der Empfänger mit 4 MCP23017 als Ausgabe. also nix wildes. so spare ich mir halte viele Adern.

    Daher der Gedanke immer ein Byte in eine Variable Lesen z.b int data1, int data2..etc und einfach auszugeben.

    vom Programm her wäre das ub.
    data = i2c_read (0x12)..lesen vom MCP..aber irgendwie will er das nicht so machen

    Gruss
    Patrick

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Hast du jetzt schon zwei MCPs auf dem Bus? Falls ja, mit unterschiedlichen HW-Adressen?

  4. #4
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    48
    Beiträge
    68
    Zitat Zitat von RoboHolIC Beitrag anzeigen
    Hast du jetzt schon zwei MCPs auf dem Bus? Falls ja, mit unterschiedlichen HW-Adressen?
    Hallo

    Ja..habe zwei Stück am Bus
    einer sind alle Adresspins auf Low der andere alle auf HIgh.
    zum testen reicht es ja erstmal.

    bei einem wollte ich alle 16 Pins über Pull Down auf Masse legen, habe ich aber noch nicht gemacht
    der andere sind 16 Leds über 2 ULN 2804 Treiber angeschlossen

    Gruss
    Patrick

  5. #5
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    48
    Beiträge
    68
    Hallo

    Keiner der mir hier helfen kann ?
    Das mit den Registern verstehe ich nicht, was ihr meint

    Laut Datenblatt muss ich 0x12 und ox13 lesen für die Eingangpins.
    Leider weiss ich auch noch nicht so ganz welche Adresse er zb bei alle Adresspins auf LOw braucht

    0x21 ? 0x41 ?

    Beispiel
    i2c_start();
    i2c_write(0x21); (0x41) ??
    data = i2c_read(0x12);
    i2c_stop();

    kann mir hier mal einer auf die Sprünge helfen ? beim PCF 8574 war das kein Problem

    Hat den keiner nen kleinen Programmauszug ? stehe grade irgendwie auf dem Schlauch

    Patrick

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Hallo modtronic.

    Zitat Zitat von modtronic Beitrag anzeigen
    Laut Datenblatt muss ich 0x12 und ox13 lesen für die Eingangpins.
    Leider weiss ich auch noch nicht so ganz welche Adresse er zb bei alle Adresspins auf LOw braucht

    0x21 ? 0x41 ?
    0x12 und 0x13 sind richtig nach einem Reset, ohne Manipulation des BANK-Bits (ich schrieb bereits darüber), ist also OK nach PowerUp.
    Die selben Register kannst du im Ziel-/Output-IC auch beschreiben. Die Werte werden aber in die OLATx-Register geschrieben, die Output LATches.
    "Richtiger" wäre es, die OLATx direkt zu beschreiben, macht aber nix.

    Oh ja, die liebe Adressverwirrung bei I2C in der Praxis dank des separat betrachteten r/W-Bits (
    Inklusive des R/W-Bits muss aus Controllerperspektive als Control Byte zur Schreibadressierung eine 0x40 und zur Leseadressierung eine 0x41 in das Senderegister des Controllers geschrieben werden, wenn alle Adresspins LOW sind.- so kenne ich das zumindest.
    Wenn alle Adresspins HIGH sind, müssen das entsprechend 0x4E und Leseadresse 0x4F sein.

    In meinem Datenblatt ist das in Kap. 1.4 "Hardware Address Decoder" aufgezeichnet. Daran sollte man es eigentlich erkennen können. Mag sein, dass manche Library die Unterscheidung zwischen Adresse und Control Byte nachvollzieht; dann wären die Adressen eben 0x20 (Adr. LLL) und 0x27 (Adr. HHH). (letztere Betrachtungsweise finde ich irreführend, wiel ich bei 0x'irgendwas' eben an 8-Bit-Einheiten denke.)
    Setz dich wirklich damit auseinander, damit du das unter die Füße kriegst. Wenn's doch nicht klarer wird, frag nochmal nach.

  7. #7
    Benutzer Stammmitglied Avatar von modtronic
    Registriert seit
    14.05.2011
    Ort
    Hagen
    Alter
    48
    Beiträge
    68
    Zitat Zitat von RoboHolIC Beitrag anzeigen
    Hallo modtronic.



    0x12 und 0x13 sind richtig nach einem Reset, ohne Manipulation des BANK-Bits (ich schrieb bereits darüber), ist also OK nach PowerUp.
    Die selben Register kannst du im Ziel-/Output-IC auch beschreiben. Die Werte werden aber in die OLATx-Register geschrieben, die Output LATches.
    "Richtiger" wäre es, die OLATx direkt zu beschreiben, macht aber nix.

    Oh ja, die liebe Adressverwirrung bei I2C in der Praxis dank des separat betrachteten r/W-Bits (
    Inklusive des R/W-Bits muss aus Controllerperspektive als Control Byte zur Schreibadressierung eine 0x40 und zur Leseadressierung eine 0x41 in das Senderegister des Controllers geschrieben werden, wenn alle Adresspins LOW sind.- so kenne ich das zumindest.
    Wenn alle Adresspins HIGH sind, müssen das entsprechend 0x4E und Leseadresse 0x4F sein.

    In meinem Datenblatt ist das in Kap. 1.4 "Hardware Address Decoder" aufgezeichnet. Daran sollte man es eigentlich erkennen können. Mag sein, dass manche Library die Unterscheidung zwischen Adresse und Control Byte nachvollzieht; dann wären die Adressen eben 0x20 (Adr. LLL) und 0x27 (Adr. HHH). (letztere Betrachtungsweise finde ich irreführend, wiel ich bei 0x'irgendwas' eben an 8-Bit-Einheiten denke.)
    Setz dich wirklich damit auseinander, damit du das unter die Füße kriegst. Wenn's doch nicht klarer wird, frag nochmal nach.
    Guten Morgen

    Leider verstehe ich das nicht was du mir sagen willst
    die 0x12 und 0x13 habe ich schon ausgelesen jedoch bekomme ich keine Daten vom MCP

    also muss ich 0x41 schreiben
    und kan dann 0x12 und 0x13 in eine Integer Variable schreiben?

    so ?
    i2c_start();
    i2c_write(0x41);
    data = i2c_read(0x12);
    i2c_stop();

    das habe ich so schon gemacht..in der Variable tut sich gar nix

    Das hier ist doch für C-Programmierung gedacht..hier sind doch leute die es schon gemacht haben
    kann da nicht mal einer nen kleines Beispiel schreiben,,mit du musst diese Register auslesen komme ich nicht weiter

    Gruss
    Patrick

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von RoboHolIC Beitrag anzeigen
    Mag sein, dass manche Library die Unterscheidung zwischen Adresse und Control Byte nachvollzieht
    Dann würde sie sich daran orientieren, was im geschriebenen Standard und eigentlich auch in allen Datenblättern der Bausteine steht. Es gäb dann natürlich auch nicht mehr soviele Threads in den Foren "Kann meinen I2C Slave nicht ansprechen" oder

    Er hört allerdings auf die Adresse 0x40 anstatt auf 0x20..gibt es hier Bauart Unterschiede
    (letztere Betrachtungsweise finde ich irreführend, wiel ich bei 0x'irgendwas' eben an 8-Bit-Einheiten denke.)
    Warum grad 8 und nicht 16, 32 oder 64? Es gibt auch genügend kleinere Werte, Prescaler Register z.B. die dann auch noch auf ungraden Bitadressen liegen. I2C mit Adresse und R/W Bit ist ja noch harmlos, schau dir mal andere Protokolle an. Da werden die Bytes (meist Oktets genannt) munter mit unterschiedlich großen Werten gefüllt. Und wenn 8 mal nicht reichen, 16 aber zu viel sind werden die Reste in einem Byte gesammelt (Nunchuk). Wenn man damit arbeiten will, muß man sich das natürlich immer passend zusammensetzen.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. Mcp23017
    Von modtronic im Forum C - Programmierung (GCC u.a.)
    Antworten: 17
    Letzter Beitrag: 19.02.2017, 23:15
  2. MCP23017 mit Python steuern
    Von opc im Forum Raspberry Pi
    Antworten: 4
    Letzter Beitrag: 23.01.2015, 09:43
  3. [ERLEDIGT] MCP23017 - I2C ansprechen ohne Erfolg
    Von JoeM1978 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 07.01.2014, 07:15
  4. "Input" scheint nur beim ersten mal richtig erkannt zu werden?!
    Von Testus2K im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 06.06.2013, 22:09
  5. int2 am avr32 braucht beim input ein zusatzbefehl
    Von robbifan im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 17.05.2007, 11:52

Berechtigungen

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

12V Akku bauen