Hallo,
ich möchte auf einen i2C-Bus mehrere (~50) identische ADCs als Slave
hängen.
Problematisch ist, dass es geeignete ADCs nur mit maximal 9
verschiedenen Adressen zu kaufen gibt.
Multiplexer ist ungünstig, da sich der Verkabelungsvorteil des
Bus-System durch die dann notwendige parallelverkabung minimiert.
1.)
Eine option wäre ein ADC mit frei wählbarer adresse.
Der ADC sollte 10 Bit haben, min. 2 Kanäle gegen Masse, 2 differentielle
wären besser,
2.) Alternativ wäre auch ein Bauteil denkbar welches die Signale
durchschleift, aber die Adresse ändert (Funktionsweise wie ein Proxy)
Vielen Dank im Voraus
Der räumliche Abstand der einzelnen Wandler ist gering <1m, allerdings
sollen aus platzproblem keine kabelpeitschen verbaut werden.
Mit Multiplexer hatte ich i²c-Multiplexer gemeint.
Die Variante mit den 5 kleinen Controllern würde mich interessieren, wie
kann man sich das vorstellen?
> Der räumliche Abstand der einzelnen Wandler ist gering <1m,
Das heißt aber doch, dass der Bus insgesamt 50m lang wird, und dafür ist
i2c nicht gemacht. Selbst 5 m Buslänge würde ich keinesfalls wagen
wollen.
fchk
... ... ... schrieb:> Bierschinken schrieb:>> Mit Multiplexer hatte ich i²c-Multiplexer gemeint.> Wieso soll der mehr Platz brauchen als der I²C-Proxi?
Abgesehen davon, dass es den I²C-Proxi wohl gar nicht gibt... ;-)
ADC mit 10Bit Auflösung, dazu I2C.. das klingt nicht so, als müsste es
garzu schnell sein.. Ich bin zwar eigentlich kein Freund davon, aber man
könnte da doch einen kleinen Mikrocontroller mit integriertem ADC statt
dem I2C-ADC verwenden.. die Adressen kann man sich ja dann
programmieren, wie man lustig ist (das Protokoll evtl. auch)..
Grüße
Christian
Der Hinweis von Christian sollte Erfolg versprechen.
Nimm einen ATtiny mit USI-Schnittstelle und 10-Bit ADC's (z.B.
ATtiny26).
Mit Hilfe der USI-Schnittstelle kann ein TWI-Slave nachgebildet werden,
dazu gibt es sogar App-Notes bei Atmel.
Der Slave könnte seine eigene TWI-Adresse aus seinem Eeprom lesen.
Dann könnten alle Slave mit dem selben Code programmiert werden,
lediglich die TWI-Adresse muss auf geeignete Weise ins Eeprom
geschrieben werden.
Michael S.
> Abgesehen davon, dass es den I²C-Proxi wohl gar nicht gibt... ;-)
Ich glaub ich habe vor kurzem so ein Teil gesehen. Leider weiss
ich nicht mehr wo. Entweder Maxim oder NXP.
Es war jedenfalls extra ein Umsetzer falls man mehere Geraete hat
die nur eine Adresse haben koennen.
Olaf
Danke für die Antworten bis hierher.
Eine weitere Frage:
Angenommen ich habe einen Master (ATmega32) und viele Slaves (ATtiny)
auf dem TWI hängen. Die Slaves messen über den internen ADC eine
Spannung und der Master "erfragt" diesen Messwert aller Slaves über TWI.
Ab Seite 183 im ATmega 32 sind sogenannte "Transmission Modes"
aufgeführt.
Läuft der Master dann die ganze Zeit als "Receiver" und die Slaves immer
als "Transmitter" oder gibt es im Rahmen der Kommunikation zwischen
Master und Slave Szenarien wo beide die Rolle tauschen müssen?
bierschinken schrieb:> Ab Seite 183 im ATmega 32 sind sogenannte "Transmission Modes"> aufgeführt.>> Läuft der Master dann die ganze Zeit als "Receiver" und die Slaves immer> als "Transmitter" oder gibt es im Rahmen der Kommunikation zwischen> Master und Slave Szenarien wo beide die Rolle tauschen müssen?
wenn der Master die Adresse oder Daten sendet, dann ist er im
Master-Transmitter-Mode, wenn er dann die Daten vom Slave (ADC) liest
dann ist er im Master-Receiver-Mode.
Sascha
Sascha Weber schrieb:> wenn der Master die Adresse oder Daten sendet, dann ist er im> Master-Transmitter-Mode, wenn er dann die Daten vom Slave (ADC) liest> dann ist er im Master-Receiver-Mode.>> Sascha
Meiner Meinung nach nicht ganz richtig, zum Adresse senden muss der
Master nicht in den Transmitter mode, hier der Auszug aus dem
Datenblatt, S187:
"After a START condition has been transmitted, the TWINT Flag is set by
hardware, and the status code in TWSR will be $08 (See Table 74). In
order to enter MR mode, SLA+R must be transmitted. This is done by
writing SLA+R to TWDR. Thereafter the TWINT bit should be cleared (by
writing it to one) to continue the transfer. This is accomplished by
writing the following value to TWCR: When SLA+R have been transmitted
and an acknowledgement bit has been received, TWINT is set again and a
number of status codes in TWSR are possible. Possible status codes in
master mode are $38, $40, or $48. The appropriate action to be taken for
each of these status codes is detailed in Table 75. Received data can be
read from the TWDR Register hen the TWINT Flag is set high by hardware.
This scheme is repeated until the last byte has been received. After the
last byte has been received, the MR should inform the ST by sending a
NACK after the last received data byte. The transfer is ended by
generating a STOP condition or a repeated START"
Ist das Richtig?
Werft bitte jetzt die logische Funktion nicht mit der physikalischen
Funktion durcheinander. Wenn der Master die Adresse auf den Bus legt ist
er physikalisch im Master-Transmit, da er die Clock und die Daten
vorgibt.
Liest der Master dann nach dem Senden der Adresse die Daten, so gibt er
ebenfalls die Clock vor und ist damit im Master-Receive.
Erst wenn es einen weiteren Master am Bus gibt, kann der o.A. Master als
Slave angesprochen werden und wäre dann beim Empfang der Adresse im
Slave-Receive und beim Senden der Daten im Slave-Transmit Modus, denn er
bekommt von einem anderen Master die Clock vorgegeben.
Einige Hersteller vereinfachen das Handling des I2C Bus durch etwas mehr
'Intelligenz' in der Hardware und automatisieren z.B. das Versenden der
Adresse oder auch das Versenden der Chip internen Adresse ( z.B. EEPROM
die Speicheradresse der zu schreibenden/lesenden Zelle). Das verwirrt,
weil damit die Master-/Slave-Funktionen durch mehr oder weniger den
gleichen Code / die gleiche State-Machine bearbeitet werden können. Aber
trotzdem ist der I2C bus nicht in anderen Modi als in den zuerst
genannten. Master / Slave unterscheidet sich nur durch die Tatsache, wer
die Clock (SCL) vorgibt.
Es beeinträchtigt aber auch nicht das Recht, dass jeder Slave Bit- oder
ACK-Stretching machen darf, also die Geschwindigkeit auf seine Fähigkeit
herunter bremsen darf.
Gruß, Ulrich