Forum: Mikrocontroller und Digitale Elektronik I2C vs. RS232


von Stephan R. (Gast)


Lesenswert?

Moin!

Ich bin immernoch am Abwägen, wie ich meine fünf Atmegen8, von denen 
einer das Ruder in der Hand hat und die anderen fleissig Sollwerte 
übernehmen und Istwerte berichten sollen, nun miteinander verdrahte. 
(Distanz bummelig 1m.)

Am einfachsten erscheint mir die gemuxte UART zu benutzen, wohin ich 
bereits hier im Forum zu hingeraten wurde und womit ich mich eigentlich 
bereits abgefunden habe.

Doch je mehr ich mich mit I2C beschäftige (und das ist noch nicht sehr 
viel), so habe ich den Eindruck, schöön Allemann an einem Bus hängen, 
jeder eine Adresse für sich und kein Gemurkse mit Mux, das klingt auch 
gut. (Also, I2C Benutzung).

Für mein Verständnis: lassen sich per I2C genauso einfach Strings 
übertragen, wie über die gute alte UART?

von Purzel H. (hacky)


Lesenswert?

Die beiden Verbindungsstandards sind nicht austauschbar und erfuellen 
verschiedene Zwecke. Waehrend der I2C auf der Leiterplatte bleibt, ist 
der RS232 fuer Kabel gedacht. Der RS232 ist fuer eine punkt zu punkt 
Verbindung. Der I2C ist ein Leiterplatten Bus, der die Richtung 
umschaltet.
Ich wuerde beide nicht verwenden. Ein RS422 waere passender, denn er ist 
fuer einen Bus, und fuer auf Kabel. Wenn es einen Master gibt, ist der 
RS422 passender wie der RS485, denn der RS422 muss die richtung nicht 
umschalten. Der Master kann immer senden.

von ist_halt_so (Gast)


Lesenswert?

nimm i2c ist für so etwas gedacht...
ne lib findest du hier:  Beitrag "TWI I2C Slave Library"

viel erfolg

von ist_halt_so (Gast)


Lesenswert?

achso wenn es nur 1m ist kannste auch i2c nehmen ...
1m kabellänge macht der schon noch mit.
hab das mal mit 800khz getestet, ging problemlos.
;-)

von H.Joachim S. (crazyhorse)


Lesenswert?

1m, tja, als was soll man das einordnen? Eigentlich zuviel für direkte 
Verbindungen, zu wenig für echte Bustreiber (nicht im Sinne von das 
funktioniert nicht, sondern eher im Sinne von noch nicht nötig). 
Irgendwie ein komisches Zwischending.

Ich würde folgendes probieren:
-UART-Verbindung, alle Rx auf eine Leitung
-alle Tx über eine Diode ebenfalls auf diese Leitung
-aktiven pullup (Stromquelle) nach Vcc

Alle empfangen alles (auch das eigene gesendete Signal!)
Senden darf immer nur einer, per Protokoll auskaspern.

von Stephan R. (Gast)


Lesenswert?

Tjor. DIE Lösung scheints nicht zu geben (also erstmal nen Flens).

H.joachim Seifert schrieb:
> Ich würde folgendes probieren:
> -UART-Verbindung

Das ist eig auch mein Plan, auch schon fliegend fertig, nur hab ich 
Angst, dass... wovor eigentlich?

Aber klämmte ich alle Rxe zusammen, so würde ja jeder uC ständig am 
interrupten sein und von der Arbeit abgehalten werden. Also Mux 
dazwischen. (Gegenstimmen?)

von H.Joachim S. (crazyhorse)


Lesenswert?

Wenn deine MC so am Anschlag werkeln, dass si nicht mal mehr einen 
popeligen UART-Interrupt hinbekommen, hast du den falschen Controller 
gewählt.
Wenn ich es nicht besonders eilig habe, nehme ich normalerweise 
19200Baud. Da tröpfelt alle 0,5ms ein Byte rein.
Angenommene 12MHz Takt: alle 6000 (!) Takte ist ein Byte abzuholen und 
zwischenzuspeichern. Schlecht programmiert dauert das 100 Takte. Selbst 
ein dauernd feuernder Bus bringt nur <2% Auslastung.

von H.Joachim S. (crazyhorse)


Lesenswert?

Und in echt (und C): es sind 55 Takte. Inklusive ISR anspringen, 
Register sichern, Byte abholen, in einem Buffer speichern, Überprüfen ob 
Bufferüberlauf, Zeiger auf nächsten fein Speicherplatz setzen, Anzahl 
der empfangenen Bytes erhöhen, Rückkehr zum unterbrochenen Programm.
Noch Fragen?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Stephan R. schrieb:
> Für mein Verständnis: lassen sich per I2C genauso einfach Strings
> übertragen, wie über die gute alte UART?

Wenn Du Dich bereits gut mit UARTs auskennst, häng an jeden µC einen 
RS485 Transceiver und gut ist. Dann kannst Du einfach Deine Kommandos an 
den ersten Sklaven über den UART rausschicken, auf die Antwort warten 
und dann den nächsten abklopfen. Schick bei Deinem UART-Befehl einfach 
eine Adresse mit, damit klar ist, wer das Kommando entgegennehmen und 
antworten soll.

Gruß,

Frank

von XXX (Gast)


Lesenswert?

Hallo

Mach es so wie HJ Seifert es beschrieben hat. Habe ich bei meiner
Diplomarbeit auch so gemacht.
Ein 8051, der das sagen hat -> TXD auf die RXD aller anderen.

Die TXD aller anderen mit Dioden verdrahtet an den RXD des Chefs.

Der Chef hat alle der Reihe nach abgefragt, die anderen durften nur
was sagen, wenn der Chef sie gefragt hat.

Hat wunderbar funktioniert.

Gruß
Joachim

von Entwickler (Gast)


Lesenswert?

Alle TxDs der Slaves per OR-Verknüpfung auf den RxD des Masters wäre 
eine Möglichkeit. RS485 eine weitere.

Recht einfach, störunanfällig und erweiterbar, wäre UART Übertragung mit 
CAN-BUS-Treibern in halb-duplex. Fürs Protokoll nimmt man am besten die 
Multiprozessorfunktion der AVRs. Damit ist die Adressierbarkeit geklärt 
und die Belastung unbeteiligter Slaves minimal.

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.