Forum: Mikrocontroller und Digitale Elektronik Portexpander mit I2C oder SPI (5 I/O's)


von mnme (Gast)


Lesenswert?

Hallo,

Ich habe maximal 5 I/O's zur Verfügung um 24 Relais zu schalten. Ich 
möchte den ULN2803 als Treiber verwenden. Weiter habe mir nun einige 
Port-Expander angesehen und finde vom Funktionsumfang her 
(konfigurierbare interne Pull-Ups, Reset-Pin) MCP23009 bzw. MCP23S09 
passend. Mein Problem ist die Adressierung bei I2C (MPC23009) bzw. der 
Chip Select bei SPI (MPC23S09).

Einer der 5 I/O's wird für den Reset (low-aktiv) benötigt.

Bei I2C werden 2 I/O's für SCL und SDA benötigt, somit bleiben nur 2 
I/O's um insgesamt 3 Port-Expander zu adressieren, ich kann aber keine 
festen Adressen geben da ich insgesamt noch mehr Port-Expander benötigen 
werde. Deshalb habe ich an einen AND-verknüpften Enable (SCK und EN) mit 
festen Adressen gedacht, ich weiss aber nicht wie gut das ist.

Bei SPI werden 3 I/O's für SO, SI und SCK benötigt. Bleibt 1 I/O um 3 
Port-Expander zu selektieren (geht nicht). Bei SPI gibt es aber die 
sogenannte Daisy Chain, aber der Chip muss diese unterstützen. Falls ich 
das Datenblatt richtig gelesen habe steht dort nichts davon.

Gibt es eine einfache Möglichkeit mit 4 I/O's 24 Relais zu schalten? 
Oder was eint ihr zu meinem I2C + Enable Ansatz?

von Digi S. (digispark)


Lesenswert?

dann nimm doch einfach einen PCF8574 ... der hat 3 Pins, mit dem man 
seine Adresse konfigurieren kann. Damit brauchst Du am Controller nur 
SDA und SCL. Die Adressierung erfolgt dann software-mäßig.

Durch die 3 Adress-Pins lassen sich 8 der Expander gleichzeitig an einem 
I2C betreiben.

von MarcVonWindscooting (Gast)


Lesenswert?

Meine Meinung: SPI bringt hier nichts, es sei denn du kannst eine 'daisy 
chain' machen, d.h. die SPI-Devices ALLE in Serie schalten und nur EIN 
/CS nehmen.

Besser I2C. Da ist Adressierung schon drin.
Ich versteh dein Problem ehrlich gesagt gar nicht. Du kannst mit SCL und 
SDA 8*8 = 64 Kan"ale realisieren. Es bleiben also Pins "ubrig...

Was meinst Du mit du kannst keine 'festen Adressen' vergeben??
Das hat doch nix damit zu tun, wie viele Expander du anschliesst.

von Nitram L. (nitram)


Lesenswert?

Digi Spark schrieb:
> dann nimm doch einfach einen PCF8574 ... der hat 3 Pins, mit dem man
> seine Adresse konfigurieren kann. Damit brauchst Du am Controller nur
> SDA und SCL. Die Adressierung erfolgt dann software-mäßig.
>
> Durch die 3 Adress-Pins lassen sich 8 der Expander gleichzeitig an einem
> I2C betreiben.

Und wenn das nicht reicht nimm noch die PCF8574A dazu...
Die haben eine andere Basisadesse...

nitraM

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Hallo,

aber gerade da ist doch die Idee mit 'daisy chain' genau das richtige.
2 Datenleitungen und einmal ^CS. Einfacher geht fast nicht.

Grüße aus Berlin

von mnme (Gast)


Lesenswert?

Digi Spark schrieb:
> dann nimm doch einfach einen PCF8574 ... der hat 3 Pins, mit dem
> man
> seine Adresse konfigurieren kann. Damit brauchst Du am Controller nur
> SDA und SCL. Die Adressierung erfolgt dann software-mäßig.
>
> Durch die 3 Adress-Pins lassen sich 8 der Expander gleichzeitig an einem
> I2C betreiben.

Das war mein ursprünglicher Ansatz, geht aber nicht. Der MCP23009 kann 
auch I2C mit Adressen (Dabei wird ein Spannungsteiler mit ADC 
verwendet).

Leider habe ich diese Vorgaben:
Stecker mit max. 5 Pins (der Rest ist Speisung) -> 3 Portexpander (?) -> 
24 Relais

Von diesen Platten sollen mehrere universell mit einem µC verwendet 
werden. Zusätzlich sollen diese Platten austauschbar sein => Adressen 
müssen vom µC vergeben werden und nicht fest verdrahtet.

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Als Alternative kannst du an die "Wechsel"-Platten einen ATtiny der 
macht die I/O's und Port-Expander und spricht über I2C/SPI mit dem 
Master. Dann kannst du alle Aufgabenstellungen damit erschlagen.

von mnme (Gast)


Lesenswert?

Rene Schube schrieb:
> Hallo,
>
> aber gerade da ist doch die Idee mit 'daisy chain' genau das richtige.
> 2 Datenleitungen und einmal ^CS. Einfacher geht fast nicht.
>
> Grüße aus Berlin

Kannst du mir sagen ob der MCP23S09 das unterstützt? Ich habe wie gesagt 
nichts gefunden im Datenblatt.

Datasheet: http://ww1.microchip.com/downloads/en/DeviceDoc/22121b.pdf

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Der SO (Serial OUT) des ersten geht in den SI (Serial IN) des zweiten, 
der SO2 -> SI3 ; SO3 -> SI(n) ; SO(n) -> zurück zum Controller

von Digi S. (digispark)


Lesenswert?

und warum soll das nicht gehen? Du brauchst sogar nur 4 Leitungen: 
Versorgungsspannung + SDA + SCL. Diese werden an alle Portexpander 
durchgereicht. Fertig! Den fünften Pin am Stecker kannst Du dann noch 
nutzen um die Weihnachtsbeleuchtung oder was auch immer sonst zu steuern 
;-)

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?


von mnme (Gast)


Lesenswert?

Rene Schube schrieb:
> http://www.mikrocontroller.net/articles/SPI_Daisychain

Ja das habe ich auch gefunden, da steht genau der springende Punkt unter 
Hinweise:

> Unterstützen die Slaves Daisychaining?

von mnme (Gast)


Lesenswert?

Digi Spark schrieb:
> und warum soll das nicht gehen? Du brauchst sogar nur 4 Leitungen:
> Versorgungsspannung + SDA + SCL. Diese werden an alle Portexpander
> durchgereicht. Fertig! Den fünften Pin am Stecker kannst Du dann noch
> nutzen um die Weihnachtsbeleuchtung oder was auch immer sonst zu steuern
> ;-)

Wie ich geschrieben habe:
> Von diesen Platten sollen mehrere universell mit einem µC verwendet
> werden. Zusätzlich sollen diese Platten austauschbar sein => Adressen
> müssen vom µC vergeben werden und nicht fest verdrahtet.

1. universell: Wenn jede Platte andere Adressen benötigt sind sie nicht 
universell.
2. austauschbar: Man sollte jede Platte irgendwie 
vertauschen/austauschen können, man sollte nicht auf Adressen schauen 
müssen.


Rene Schube schrieb:
> Als Alternative kannst du an die "Wechsel"-Platten einen ATtiny
> der
> macht die I/O's und Port-Expander und spricht über I2C/SPI mit dem
> Master. Dann kannst du alle Aufgabenstellungen damit erschlagen.

Dieser Ansatz tönt interessant falls ich mit Port-Expander nicht 
weiterkomme, werde mal schauen ob ich da einen passenden ATtiny finden 
kann :)

Ansonsten könnte ich mir auch etwas mit Multiplexern überlege... Keine 
Ahnung wie ich das genau machen will.

von Digi S. (digispark)


Lesenswert?

ein dreifacher DIP-Schalter (und drei Pulldown-Widerstände) drauf und 
fertig. Beim Austauschen einer Platine sollte das Setzen der richtigen 
Schalterstellungen ein vertretbarer Aufwand sein. Damit kannst Du jedes 
Modul an jeder "Stelle" in der Kette (sprich mit jeder Adresse) 
verwenden. Das ist in meinen Augen durchaus universell ;-)

Wenn Du das mit dem Attiny machst, muss der ja auch wissen, auf welche 
Adresse er reagieren soll. Also genau das selbe Thema wie bei den 
Portexpandern.

von avr (Gast)


Lesenswert?

Ich versteh nicht wie manche so auf den I2C Bausteinen rumhacken können, 
wo es bei SPI viel einfacher läuft, ohne Adresse und 4 zusätzliche 
Bauteile.  Warum nicht drei 74HC595 oder drei TPICxx595, die könnten 
deine Relais möglicherweise direkt treiben.

von mnme (Gast)


Lesenswert?

avr schrieb:
> Ich versteh nicht wie manche so auf den I2C Bausteinen rumhacken
> können,
> wo es bei SPI viel einfacher läuft, ohne Adresse und 4 zusätzliche
> Bauteile.  Warum nicht drei 74HC595 oder drei TPICxx595, die könnten
> deine Relais möglicherweise direkt treiben.

So, mit deiner Möglichkeit habe ich nun 3 verschiedene machbare 
Szenarien. Ich werde mir das noch durch den Kopf gehen lassen und melde 
mich welche ich gewählt habe.

Zusammenfassung:

- I2C Portexpander (MCP23009), SCL Leitung mit einem Enable verknüpfen.
    - Feste Adressen (auf jeder Platte die gleichen)
    - 4 I/O's (SDA, SCL, Enable, Reset)
    - Platten werden durch den Enable nacheinander angesprochen

- I2C Multiplexer (PCA9544A) auf Steuerboard
    - Feste Adressen (auf jeder Platte die gleichen)
    - 3 I/O's (SDA, SCL, Reset)
    - Jeweils 1 I2C-Multiplexer für 4 Platten

- Schieberegister (74HCT595) kaskadiert
    - Keine Adressen
    - SPI kompatibel (SERIN = MOSI, CLK = SCK, RCLK = ^CS)
    - 4 I/O's

Gruss

von Falk B. (falk)


Lesenswert?

@ mnme (Gast)


>So, mit deiner Möglichkeit habe ich nun 3 verschiedene machbare
>Szenarien.

4.)

- Schieberegister (TPIC6595) kaskadiert, können direk bis zu 250mA/ 
Kanal treiben
    - SPI kompatibel (SERIN = MOSI, CLK = SCK, RCLK = ^CS)
    - 3 I/Os
    - all in one Relaistreiber

von Jens M. (Gast)


Lesenswert?

mnme schrieb:
> Von diesen Platten sollen mehrere universell mit einem µC verwendet
> werden. Zusätzlich sollen diese Platten austauschbar sein => Adressen
> müssen vom µC vergeben werden und nicht fest verdrahtet.

Du musst also die Position der Relaisbaugruppen am Bus wissen. 
Andersherum geht es aber auch, wenn die Relaisgruppe ihre Position weiß.

Dafür brauchst du nur eine Daisy chain. Also einen Draht rein und einen 
raus. Auf der läuft eine serielle Schnittstelle. Deren Pegel wird über 
Spannungsteiler abgestuft von einer Baugruppe zur nächsten abgeschwächt.

Zur Positionsbestimmung wird der Signalpegel auf der Baugruppe gemessen 
und der Pegel auf den Eingangspegel der seriellen gebracht (besser 
abgesenkt). Durch die Stromaufnahme weißt du zusätzlich ob und wie viele 
Baugruppen am Bus hängen (oder stellst Drahtbruch fest).

Mit z.B 42V Pegel am Master wird der Störabstand in traumhafte Regionen 
gezogen und durch die Spannungsteiler das ganze beliebig niederohmig 
gemacht.

Zusätzlich kannst du gesicherte Protokolle fahren.
Wenn du das ganze noch auf den LIN Standard aufsetzt ist Betrieb in zwei 
Richtungen möglich.

von mnme (Gast)


Lesenswert?

@ falk

Danke für den Tipp, werde mir das im Hinterkopf behalten für später 
falls ich wieder so etwas mache.

@ jens

Eine sehr gute Möglichkeit, mal anders herum. Aber ich denke der 
Schaltungsaufwand ist zu hoch und lohnt sich nicht gegenüber den anderen 
Methoden.


Schlussendlich habe ich mich für den PCA9544A entschieden, damit ist die 
Schaltung ausbaufähig und am einfachsten zu realisieren. Zusätzlich habe 
ich noch 2 freie Pins (einer werde ich für einen zusätzlichen 5V 
Anschluss verwenden, der andere bin ich noch am überlegen).

Viele Dank für die zahlreichen Ideen!
Gruss

Nicolas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.