Sensoren am MCP23017 abfragen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Huhu,
    ich habe ein kleines Problemchen zwecks dem MCP23017.
    da an maneinem Rpi so langsam die Gpios ausgehen, habe ich mir 2 MCP23017 besorgt, einen für 16 eingänge (Adresse: 0x24), einen für 16 ausgänge (Adresse: 0x20)
    das setzen der ein bzw ausgänge und das schalten der ausgänge (LED´s an den ausgängen) funktioniert einwandfrei.
    nun jedoch zu dem der als eingänge dienen soll.
    ich habe bisher nichts wirklich gefunden, wie ich zb per python die daran hängenden sensoren abfragen kann.
    wenn ich nun zb einen MCP3208 zum messen von spannungen an den MCP32017 hänge, wie kann ich diesen per script abfragen?

    an den pins des Rpi ist das ja kein hexenwerk.
    ich hänge mal das script das ich für die Gpios am Pi nutze an, vll kann mir ja jemand erklären und/oder abändern, das dieses mit dem MCP23017 funktioniert.

    schonmal vielen dank im vorraus

  • Na, das macht ja nix anderes als ein händisches "bitbanging" einer SPI-Schnittstelle. Prinzipiell sollte das auch über deine Portexpander gehen - allerdings wird das bei deiner strikten Trennung von input und output expander etwas hässlich.

    Besser waere es, dir deine 4 Leitungen fuer SPI auf den normalen GPIOs zu belassen, wie gehabt, aber dafür über deine expander einfach nur den chipselect zu setzen. Also das was in deinem Code "CSPin" ist. Das sollte deutlich weniger Aufwand sein.

  • naja das ich 2 expander genommen habe, war eigentlich gedacht das es (für mich) einfacher ist, denn so weiß ich, der ist für input, der für output und werf das nicht durcheinander oder so
    wie könnte ich denn mit dem script den CS auf den expander legen? würde dann zumindest schonmal 1 Gpio sparen
    wenn ich vom prinzip mal weiß, wie das dann von statten geht, bekomm ich das sicherlich auch für andere sachen hin (hoffe ich mal)

  • nowaczuk: Um einen MCP3208 (o.ä) zu bitbangen, darf der Takt laut Datenblatt nicht unter 10kHz fallen, da sonst der sample & hold Kondensator sich bereits signifikant entlädt. Ich würde zunächst mal prüfen, ob Du mit dem MCP23017 überhaupt auf diese Datenrate kommst. Ich habe da so meine Zweifel. Mit jedem Bit, was Du rausschreibst, benötigst Du so 3 Byte auf dem I2C-Bus zum Schreiben und weitere 3 Byte zum Lesen - macht 6 Byte pro SPI-Bit. 6*8=54 Bit I2C für ein Bit SPI. Das ist mal eine Nummer! Wenn der SPI Bus nun mit 10kHz getaktet wird, dann brauchst Du also 540KHz auf dem I2C-Bus. Ich habe experimentell zwar mal um die 800KHz hinbekommen, aber Du schrabbelst voll am Ende herum und Deine CPU macht nix anderes, als Daten zu bangen. Von Timingproblemen aufgrund des Schedulers reden wir noch nicht mal... Wenn Dir Bits fehlen, dann handle das CS, wie es __deets__ schrieb (oder stopfe noch einen MCP23017 dazu), aber verwende auf jeden Fall MISO und MOSI vom Controller.

  • Servus,
    ehrlich gesagt verstehe ich das ganze Rumgehampel nicht ...
    Der MCP23017 hat ein I2C-Interface und kann über dieses problemlos vom Raspi aus angesprochen werden.
    Der MCP23S17 hätte SPI ... und auch das sollte mit dem Onboard-SPI gehen ...

    cu,
    -ds-

  • ich glaube ihr versteht auch nicht ganz um was es mir geht, bzw ich hab es nicht richtig deutlich gemacht
    ich habe die 2 mcp32017 und 2 mcp3208 bereits erfolgreich im betrieb, funktioniert alles soweit wie es soll
    mit dem port expander kann ich auch leds per ausgänge schalten, eingänge abfragen ob 1 oder 0 bekomme ich auch hin
    mir geht es nun nur darum, wie ich eben "daten" am port expander auslesen kann, damit ich neue sonsoren dann zukünftig dadran anschliesen kann, oder gegebenfalls bereits vorhandene vom pi an den expander hänge
    das auslesen vom mcp3208 ist da mehr beispielhaft genommen (da dieser eben 4 gpio beleget), damit ich überhaupt mal einen einblick bekomme wie das überhaupt geht.
    wie kann ich in dem script oben den Chip-Select pin auf den expander legen?

  • Hallo DS,

    ich glaube ich weis, was in Dir vorgeht. ;) Da steht etwas und in der 3. Inkarnation ist immer noch nicht annähernd beschrieben, wie die Aufgabenstellung eigentlich lautet. ""daten" am port expander auslesen kann, damit ich neue sonsoren dann zukünftig dadran anschliesen" - ist eben interpretierbar. Da wird der eine oder andere Leser schon mal ungeduldig - gell :) ? Ist mit einem Sensor nun ein Schalter gemeint oder irgendetwas "Analoges"? Mit etwas Orakelei interpretiert der geduldige Leser das Bemühen mehrere SPI-Devices anschließen zu wollen und erkennt die 2 spärlichen CS' die der Raspi vorhält. In diesem Sinne müssen die eine wunderbare "Vermehrung" erfahren. Und dazu ist ein Portexpander nun einmal recht gut. Mittels MCP23017 und allen Pins als Ausgang definiert kannst Du 16 SPI-Geräte multiplexen. Das war der Hintergrund.

    Schöne Grüße

    schnasseldag

  • nowaczuk wir haben das schon verstanden. Was schnasseldag schön ausgeführt hat - fuer den von dir gezeigten Code (SPI-Interface treiben) geht das mit einem Portexpander nicht (ausser, der unterstützt das explizit, das tut deiner aber nicht, und ich bin mir nicht sicher, ob es so etwas überhaupt gibt. Für I2C schon).

    SPI kannst du dich mal zu belesen, damit du verstehst, was damit gemeint ist. Und da das arbeiten mit einem solchen Interface die koordinierte Ansteuerung von 4 Pins die dreimal Ausgabe, einmal Eingabe sind erfordert, und das zu langsam wird, solltest du den SPI mit den PI-eigenen Pins betreiben. Ob du dazu das so machst wie schon in deinem Code, oder von DS vorgeschlagen, mit dem "richtigen" SPI interface ist nebensaechlich fuer den Moment (richtiges SPI ist aber performanter und resourcenschonender).

    Alles was du dazu tun musst ist die Logik des CSPin in *deinem Code* so zu aendern, dass sie über den Portexpander geht, und die CS der Chips natürlich auch damit zu verbinden.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!