Forum: Mikrocontroller und Digitale Elektronik Rückwandbus mit I2C


von Tobias S. (tobias-s)


Lesenswert?

Hallo zusammen,

ich möchte mir eine modulare Gefahrenmeldeanlage bauen.
Prinzipieller Aufbau: Eine große Prozessoreinheit mit einem ATmega 644 
oder ähnlichem. Dieser stellt eine Anbindung ans Ethernet dar.

Weiter sollen Rauchmelder, Einbruchsensoren, Glasbruchmelder usw. über 
weitere Module angeschlossen werden können. Hierzu habe ich einen 
kleinen ATmega Vorgesehen.Größenordnung ATmega 8 und bei sehr kleinen 
Modulen nur ein Attiny.

Jetzt soll die ganze Geschichte in ein kleines Rack mit Rückwandbus. 
Stecker sind im Rack bereits verbaut. Meine Idee war es nun, die Module 
mit der Prozessoreinheit über I2C zu verbinden. Natürlich dann als 
Rückwandbus.

Nun habe ich gesehen dass, der übliche I2C Bus bei µC 100kbit/s hat.
Ist das ausreichend um 6-8 Module mit dem Hauptprozessor zu verbinden.

Wie ist eure Meinung dazu?

Gruß Tobias

von Haro (Gast)


Lesenswert?

Du wirst kaum ganze Romane übertragen sondern kodierte Informationen.
Daher ist die Geschwindigkeit des Busses eher sekundär.

Allerdings ist I2C eher für die Kommunikation für die Bauelemente auf 
einer Platine (=in einem Modul) gedacht, weniger für die Kommunikation 
mit externen Komponenten oder Baugruppen.
Dafür verwendet man eher robustere Busse, wie CAN oder RS485.

von Tobias S. (tobias-s)


Lesenswert?

danke für die schnelle Antwort.

Was wäre da leichter zu implementieren? CAN oder RS485?
CAN ist doch eher schon für längere Stecken oder?

von Haro (Gast)


Lesenswert?

Bei den von dir genannten Controllern ist RS485 wohl leichter umzusetzen 
als CAN.
Sowohl Hard- als auch Softwareseitig.
Ich will dich auch nicht von I2C abhalten, aber du kannst halt unter 
Umständen Probleme bekommen.

von Tobias S. (tobias-s)


Lesenswert?

Genau deswegen habe ich ja gefragt, ob es sinnvoll ist, I2C zu nutzen 
für meine Zwecke.

von Karl H. (kbuchegg)


Lesenswert?

Tobias Schu schrieb:
> Genau deswegen habe ich ja gefragt, ob es sinnvoll ist, I2C zu nutzen
> für meine Zwecke.

Für 2 Handvoll Sensoren, deren reihum abfragen nicht zeitkritisch ist?

Da kannst du so ziemlich alles nehmen, hauptsache du kannst es 
programmieren.

von Route_66 H. (route_66)


Lesenswert?

Hallo!
Bei Deinem Problem würde ich persönlich mir erst mal Gedanken um die 
zuverlässige Übertragung machen. Gefahrenmeldung, Brandmeldung, Einbruch 
- alles sicherheitskritische Sachen. Sowohl Fehlalarme als auch Versagen 
der Alarmierung sollte NIE vorkommen.
Mein Tipp wären midestens zwei unterschiedliche Busse. Auch die 
Controller würde ich nicht auf einsamer Flur arbeiten lassen. 
Zweikanalig ist das Zauberwort. Diversitär wäre zu überlegen. Hängt 
davon ab, ob Menschenleben in Gefahr sind. Rauchmelder könnten ja auch 
nur für den Holzschuppen sein.

I²C halte ich nicht für besonders zuverlässig, insbesondere wenn man den 
selbst programmiert.

von Helge A. (besupreme)


Lesenswert?

Sicherheit kommt ja auch ein klein wenig auf die Implementierung an. Mit 
I2C und nur "ein paar bits pro Sekunde" kommt man schon ziemlich weit, 
jedenfalls viel weiter als ein Rückwandbus reicht. Normale I2C - Slaves 
haben kein Problem damit, wenn die Busgeschwindigkeit gedrosselt wird.

Ist dein Master so programmiert, daß sich alle Slaves melden müssen, 
sehe ich da auch keinen Unsicherheitsfaktor.

Als zweite Sicherheit ist dann noch eine gemeinsame Alarmleitung 
denkbar. Die könnte dann von jedem Slave ausgelöst werden, auch in 
Fällen wo z.B. der Master tot ist oder mit einem Slave nit redet.

Anders sieht das für verteilte Sensoren im Feld aus. Da ist die 
Störempfindlichkeit das ausschlaggebende Kriterium und ein Feldbus wie 
RS485-basierte haben eindeutige Vorteile.

von Frank K. (fchk)


Lesenswert?

Tobias Schu schrieb:
> danke für die schnelle Antwort.
>
> Was wäre da leichter zu implementieren? CAN oder RS485?
> CAN ist doch eher schon für längere Stecken oder?

nicht unbedingt.
Der Vorteil von CAN ist, dass die Controller viel mehr selber in 
Hardware machen, was Du bei 485 selber programmieren musst. Dafür bist 
Du aber an die Paketstruktur des CAN (zB max 8 Datenbytes pro Paket) 
gebunden, weil das eben in Hardware gegossen ist.

Für CAN ist AVR eine unglückliche Wahl, weil nur wenige AVRs einen 
CAN-Controller eingebaut haben, und das sind dann große Bausteine mit 64 
Pins. Viele Bastler verwenden den per SPI extern angebundenen Controller 
MCP2515 von Microchip zB in Verbindung mit einem Mega8.

Ein Microchip PIC18F26K80 auf der anderen Seite hat CAN bereits 
eingebaut, und der eingebaute CAN-Controller ist eine stark verbesserte 
Version des MCP2515 mit mehr Pufferspeicher, und der PIC kann direkt auf 
die CAN-Register zugreifen, ohne SPI dazwischen. Zudem kostet der PIC 
deutlich weniger als der AVR plus MCP2515, und einen Quarz spart man 
auch noch.

Schön blöd, wer da mit AVR rumhühnert! Was die Auswahl an Peripherie und 
die Qualität der Peripherie angeht, ist PIC eindeutig besser. Es gibt zB 
auch PICs mit eingebautem Ethernet. Da musst Du nur noch Deine RJ45 
Buchse mit eingebautem Übertrager anklemmen, ein paar Widerstände und 
Kondensatoren, und der Rest ist auf dem Chip drauf.

Wenn Du I2C nehmen möchtest, gibt es von NXP oder TI Busswitches dafür, 
zB den PCA9547. Damit kannst Du dann den Bus vom Prozessor auf eine von 
8 Karten schalten und diese ansprechen. Die einzelnen Karten dürfen mit 
unterschiedlichen Versorgungsspannungen arbeiten - der PCA9547 ist 
gleichzeitig Level Shifter. Plus: Du kannst auf jeder Karte die gleichen 
I2C Adressen verwenden. Damit kannst Du jede Karte einfach so in einen 
beliebigen Slot stecken, und der Zentralprozessor weiß anhand eines 
EEPROMs auf der Karte, was für eine Karte mit welchen 
Peripheriebausteinen in dem jeweiligen Slot steckt. Wenn Du mehr als 8 
Slots brauchst, nimmst Du halt zwei von den PCA9547.

Der PCA9547 dient außerdem dazu, die einzelnen Segmente voneinander zu 
entkoppeln, um die ganze Geschichte zuverlässiger und fehlertoleranter 
zu machen. Eine defekte Karte stoppt so nicht die ganze Maschine. Und 
wenn mal der Bus hängt (was bei I2C immer mal wieder vorkommt), kannst 
Du ihn über den Reset-Pin des I2C Multiplexers immer wieder 
zurücksetzen.

Ich würde auf die Karten keine Mikrocontroller setzen, sondern einfache 
I2C Peripheriechips in der Richtung MCP23008 oder PCA9554, wenn es geht. 
Das vereinfacht die Entwicklung, weil Du nur einen Controller 
programmieren musst.

fchk

von Rudolph (Gast)


Lesenswert?

Frank K. schrieb:
> Für CAN ist AVR eine unglückliche Wahl, weil nur wenige AVRs einen
> CAN-Controller eingebaut haben, und das sind dann große Bausteine mit 64
> Pins.

Es gibt auch sowas wie den Mega16M1, M32C1 und so, der hat nur 32 Pins.

Und immer diese PIC Vergleiche, als ob ein 16F84 das gleiche wäre wie 
ein dsPIC32.
Welcher von den PIC32 hat denn einen Ethernet-Phy eingebaut?

Die AT32UC3C haben auch 2 CANs, Ethernet und USB, die gibt es mit 
64/100/144 Pins in 0,5mm Pitch - also mit 64 Pins so gross wie ein 
Mega644.
Nur, ein AVR32 ist eben kein AVR...

von Frank K. (fchk)


Lesenswert?

Rudolph schrieb:
> Frank K. schrieb:
>> Für CAN ist AVR eine unglückliche Wahl, weil nur wenige AVRs einen
>> CAN-Controller eingebaut haben, und das sind dann große Bausteine mit 64
>> Pins.
>
> Es gibt auch sowas wie den Mega16M1, M32C1 und so, der hat nur 32 Pins.

Wenn nicht einmal RS und Farnell den listen, dann denke ich mir meinen 
Teil.

> Und immer diese PIC Vergleiche, als ob ein 16F84 das gleiche wäre wie
> ein dsPIC32.

Einen dsPIC32 gibts nicht. Du meinst dsPIC33. Außerdem vergleiche ich 
nicht Äpfel mit Birnen, sondern 8-Bitter mit 8-Bittern.

> Welcher von den PIC32 hat denn einen Ethernet-Phy eingebaut?
von denen keiner. Auch hier habe ich 8 Bitter mit 8 Bittern verglichen.
Ich hatte die PIC18F97J60 Familie im Sinn. Die hat quasi den ENC28J60 
gleich mit eingebaut, natürlich abzüglich des bremsenden SPI dazwischen. 
Und abzüglich des extra Quarzes für den ENC, der auch noch Platz braucht 
und Kosten verursacht. Es gibt keine billigere Möglichkeit, einen 
Ethernet-Knoten zu realisieren.

> Die AT32UC3C haben auch 2 CANs, Ethernet und USB, die gibt es mit
> 64/100/144 Pins in 0,5mm Pitch - also mit 64 Pins so gross wie ein
> Mega644.

Bestreite ich auch nicht. Nur hat der Mega 644 nur 40/44 Pins.

> Nur, ein AVR32 ist eben kein AVR...

Auch das bestreite ich nicht. Nur, AVR ist nicht das Maß aller Dinge. 
Manchen Bastlern muss man ab und an zeigen, was es noch so alles in der 
Welt gibt.

fchk

von Tobias S. (tobias-s)


Lesenswert?

Hallo zusammen,

ich danke erst einmal allen für die Antwort.
Auch wenn ich keinen Streitschlichter spielen möchte, aber sollte es 
hier nicht viel mehr um das gemeinsame Interesse an Elektronik gehen, 
als um die Diskussion ob AVR oder PIC?

Ich habe mich mit den Atmels momentan angefreundet. Das wird auch erst 
einmal so bleiben. Trotzdem danke für den Einblick in die PICs ;)

So nun aber wieder zum Thema:

Also zur Sicherheit. Da ich in vielen Bereichen analoge Melder nutze mit 
einfacher Live-Zero Technik, brauche ich mir über Redundanz im privaten 
Bereich glaube ich keinerlei Sorgen machen. Natürlich sollte das System 
ohne Fehlalarme laufen, aber es ist eben ein Bastelprojekt.

Vom Prinzip finde ich CAN halt toll, da es sehr einfach ist zu 
implementieren. CAN ist meines Wissens sehr zuverlässig. RS485 ist da 
glaub ich schon weit aus aufwendiger oder?

Mein Problem mit dem MCP CAN-IC ist nur, dass ich noch keinerlei 
Erfahrung habe mit mehreren Slaves am SPI Bus. Der Master hat bereits 
einen ENC28J60 am SPI. Wäre es ohne große Probleme möglich, beide IC's 
mit dem Mega644 anzusteuern?

Gruß Tobias

: Bearbeitet durch User
von Marian (phiarc) Benutzerseite


Lesenswert?

Tobias Schu schrieb:
> Wäre es ohne große Probleme möglich, beide IC's
> mit dem Mega644 anzusteuern?

Flowchart für mehrere Slaves bei SPI:

Haben alle ICs ein /CS oder/OE? -> Ja: Funktioniert.

von Frank K. (fchk)


Lesenswert?

Tobias Schu schrieb:

> Ich habe mich mit den Atmels momentan angefreundet. Das wird auch erst
> einmal so bleiben. Trotzdem danke für den Einblick in die PICs ;)

Einen Glaubenskrieg ist hier ohnehin fehl am Platz, denn Glauben gehört 
in die Kirche - hier gehts um nachprüfbare Fakten. In diesem Fall ist 
aber wohl nicht die Technik das Problem, sondern Dein begrenztes Wissen.

> Vom Prinzip finde ich CAN halt toll, da es sehr einfach ist zu
> implementieren. CAN ist meines Wissens sehr zuverlässig. RS485 ist da
> glaub ich schon weit aus aufwendiger oder?

Eigentlich nicht. Die Echtzeitfähigkeit wirst Du wohl nicht brauchen, 
andere Dinge wie CRCs kannst Du problemlos nachimplementieren.

> Mein Problem mit dem MCP CAN-IC ist nur, dass ich noch keinerlei
> Erfahrung habe mit mehreren Slaves am SPI Bus. Der Master hat bereits
> einen ENC28J60 am SPI. Wäre es ohne große Probleme möglich, beide IC's
> mit dem Mega644 anzusteuern?

Ja, es ist möglich. Allerdings ist der SPI bei Dir ohnehin ein 
Flaschenhals. Den ENC28J60 kann man ja auch an einen PIC18F67J60 mit 
internem Ethernet anschließen und vergleichen. Mit dem internen Ethernet 
ist die Ethernet-Geschwindigkeit fast doppelt so hoch wie mit dem extern 
per SPI (10 MHz SPI Clock) angebundenen Chip. Da Prozessor, Software und 
die ganze Systemumgebung jeweils identisch sind und der Ethernetteil des 
PIC18F67J60 recht ähnlich zum ENC28J60 ist, bleibt nur noch die 
Anbindung als Verursacher für den Faktor 2 in der Geschwindigkeit übrig.

Da Du ja ein armer AVR-User bist, dem der Zugriff auf Prozessoren mit 
internem Ethernet verwehrt bleibt, will ich Dir den Flaschenhals nicht 
noch enger machen, als er ohnehin schon ist. Daher habe ich einen 
anderen Vorschlag:

Wenn Du keinen Mega644, sondern einen 644*P* nimmst, hast Du einen 
zusätzlichen seriellen Port. Zum einen könntest Du den im SPI-Modus 
betreiben, zum anderen kannst Du auch schlicht einen CAN-Transceiver an 
den UART anschließen. Das, was dort dann rauskommt, ist natürlich kein 
CAN mehr, aber das ist für Deine Zwecke egal. Es ist eine serielle 
Busverbindung zwischen den einzelnen Knoten. Natürlich muss der Bus an 
beiden Enden terminiert werden, und ebenso natürlich sind keine(!) 
Stichleitungen erlaubt, aber das ist bei 485 auch nicht anders. Es 
entfällt die bei 485-Transceivern erforderliche Umschaltung der 
Senderichtung. Alles, was Du sendest, empfängst Du auch wieder, und 
damit kannst Du feststellen, ob Dein Paket korrekt gesendet worden ist, 
oder ob jemand anderes versucht hat, gleichzeitig zu senden. Die 
CAN-Hardware macht das selber, Du musst das in Software implementieren, 
aber das ist eine leicht lösbare Aufgabe, genau wie das Erzeugen und 
Prüfen einer CRC.
Dieser Vorschlag reduziert den Hardwareaufwand sowohl beim 
Hauptprozessor als auch bei den Slaves.

fchk

von Rudolph (Gast)


Lesenswert?

CAN über SPI angebunden ist grausam.
Da kannst Du auch gleich RS485 nehmen, dann hast Du wahrscheinlich sogar 
noch weniger Protokoll zu implementieren.

Wobei, okay, Ethernet über SPI ist dann noch schlimmer. :-)

Dann überlege lieber ob Du statt dem Mega644 nicht einen 
90CAN32/90CAN64/90CAN128 benutzen kannst.

Oder halt wirklich mal einen AVR32 UC3C, ist zwar was ganz anderes, aber 
wenigstens bleibt die Entwicklungs-Umgebung komplett gleich. :-)

Die Mega16M1 gibt es im Moment bei DigiKey, hab vorhin erst welche auf 
der Arbeit für ein zukünftiges Projekt bestellt bei dem wir Euro-Karten 
in einem 19" Einschub benutzen möchten...
Ende Juni hat Mouser die auch wieder.

Und ich hoffe der Farnell Vertreter der mir schmackhaft machen wollten 
was für ein guter Atmel-Distri die sind hat meinen Hinweis auf den 
fehlenden Mega16M1 mal weitergeleitet...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Helge A. schrieb:
> Ist dein Master so programmiert, daß sich alle Slaves melden müssen,
> sehe ich da auch keinen Unsicherheitsfaktor.

Das ist im I2C Standard sowieso schon drin. Wenn während der 
Addressierung der Slave nicht mit dem ACK bit antwortet, gilt das als 
Kommunikationsfehler. Wenn I2C sauber über mit GND getrennte Leitungen 
geführt wird mit kräftigen Pullups, sollten 1-2m drin sein, 
vorausgesetzt, man fährt den Bus langsam. 400kHz wird also knapp, 
scheint hier aber auch nicht nötig zu sein.

: Bearbeitet durch User
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.