PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Umschalt IC für 2 bis 6 TX Pins



HeXPloreR
02.10.2014, 22:18
Hallo zusammen,

ich würde gerne eine SSC-32 mit Daten von mehreren ATmegas beschicken. Diese kann aber nur TTL-RS232, was dazu führt das keinen Daten mehr bei direkt Anschluss von mehreren TX-Pins auf den einen RX-Pin empfangen werden.
Die AVR's sollen in einer bestimmten Reihenfolge ihre Daten zur SSC senden und sich dann wieder von RX trennen damit der Nächste sich verbinden kann usw usw. Das Ganze soll dann in einem Ring laufen, in dem maximal 6 TX-Pins zu trenen/verbinden wären.

Jetzt ist mein Problem mit welchem IC ich die TX Pins so von einander trennen kann dass der Datenaustauch nicht durch andere TX-PIns unterbunden oder gestört wird?
Würde sich ein Demultiplexer (reichelt) (http://www.reichelt.de/74HC-238/3/index.html?&ACTION=3&LA=446&ARTICLE=3172&artnr=74HC+238&SEARCH=demultiplexer) dazu eignen? Nur das Problem ist auch das jeder µC sich selbst rauf oder runter schalten müsste vom IC, da ich keine andere zusätzliche Syncronisation vorgesehen habe.

Hat jemand vielleicht schon etwas Erfahrung mit so einer Sache und kann weitere Tipps geben oder vielleicht auch etwas ganz Anderes empfehlen was vorraussichtlich besser funktionieren könnte?




Vielen Dank und Grüße
Jörg

Bumbum
03.10.2014, 09:15
Hallo Jörg,

mit welcher Baudrate werden die Daten übertragen? Ich überlege gerade, ob folgende Schaltung funktionieren könnte. Ich denke solange du dafür sorgst, dass immer nur einer sendet müsste es klappen:

29146

Der Ruhepegel ist high, dieser wird pro Sender invertiert und dann zusammen auf einen NPN-Transistor mit Pull-Up geführt, der das Signal noch mal invertiert und "verstärkt". Es könnte sein, dass noch Dioden in Reihe zu den 6 Ausgangswiderstände müssen, da ja immer 5 Ausgänge das Signal schon auf low ziehen und nur einer auf high. Das könnte zu wenig zum durchsteuern des Transistors sein. Aber ansonsten sehe ich bei nicht allzuhohen Baudraten keine Probleme mit der Schaltung.

Ich bin mir gerade bezüglich des Ruhepegles nicht sicher, aber falls der Ruhepegel low ist wäre es sogar noch einfacher. Dann könnte man sich die erste Invertierung per 6x-Nicht-Gatter sparen und alle sende-Pins per Diode zusammenschalten und somit "verodern" und dann einfach mit einer doppelten NPN-Transistor + Pull-Up "verstärken". (Zwei mal, weil das Signal invertiert wird pro Stufe)

Oder noch einfacher, aber gefährlich: Einfach alle sende-Pins als Eingang konfigurieren und nur im Sende-Fall als RS232-Ausgang konfigurieren. Die Sende-Pins können dann alle verbunden werden und sollten zusätzlich mit einem Widerstand auf dem Ruhepegel gehalten werden. Das ist aber wie gesagt gefährlich, da bei einem Software-Fehler eventuell mehrere Ausgänge gegeneinander "kämpfen". Wenn man das nicht schnell genug merkt gewinnt der stärke und der oder die anderen werden nie mehr was senden...

Viele Grüße
Andreas

Mxt
03.10.2014, 09:51
Hallo,

diese Schaltung arbeitet wie ein "Wired OR", das kann man bei TTL auch nur mit Dioden und einem Widerstand machen:
http://www.elv.de/controller.aspx?cid=758&detail=10&detail2=97


oder vielleicht auch etwas ganz Anderes empfehlen was vorraussichtlich besser funktionieren könnte?

Es gibt ICs für zusätzliche UARTs an I2C oder SPI. Damit könnte ein zusätzlicher Controller die Daten reihum einsammeln. Wäre aber wohl etwas oversized. Allerdings ist es dabei egal, wenn mehrere Sender gleichzeitig senden.
http://www.maximintegrated.com/en/products/interface/controllers-expanders/MAX14830.html

Bumbum
03.10.2014, 10:11
Hallo Mxt,

diese Schaltung arbeitet nicht wie ein Or! Soll sie auch nicht, sonst würde es nicht funktionieren. Die nicht aktiven Sender schalten den Ausgang bei einem normalen or immer auf High. Das bedeutet der Ausgang kann nie low werden, so lange ein Sender inaktiv ist.

Viele Grüße
Andreas

Mxt
03.10.2014, 10:50
Achso, der Ruhepegel ist high. Habe ich übersehen.

Das innere deiner Schaltung arbeitet aber trotzdem wie ein wired OR. Nur halt mit vor- und nachgeschalteten Invertern. Die Widerstände und den Transistor könnte man auch durch Dioden, einen Pull-Down-Widerstand und einen weiteren Inverter, eventuell besser einen 74..14, ersetzen.

Grüße

Frank

[Edit]
Wenn man es genauer betrachtet, die Schaltung ist ein AND mit 6 Eingängen ...

PICture
03.10.2014, 11:43
Hallo!


Wenn man es genauer betrachtet, die Schaltung ist ein AND mit 8 Eingängen ...

Ja. in "negative logic", wo H = 0, in "positive logic" ist es NOR, aber kein "wired". ;)

Mxt
03.10.2014, 12:07
Nein, ein AND in positiver Logik und ein OR in negativer Logik.

Nur wenn alle Eingänge High sind, sind die Ausgänge aller 7404-Gatter Low, also sperrt der Transistor und der Ausgang ist High.

Ist nur ein Eingang Low, ist der Ausgang des zugehörigen 7404 High und der Transistor zieht den Ausgang auf Low.

PICture
03.10.2014, 12:12
Ich kann leider nur über Schaltungen diskutieren, deren Schaltpläne ich sehe._.

Mxt
03.10.2014, 12:15
Siehe erste Antwort (von BumBum).

PICture
03.10.2014, 12:21
Sorry, ich habe die Rechtecke als Widerstände interpretiert. :oops:

Mxt
03.10.2014, 12:28
Macht nix, dafür habe ich in meiner Antwort zuerst 8 statt 6 Eingänge gesehen. ;)

PICture
03.10.2014, 12:30
Wir beide sind nur Menschen und "nobody is perfect" ... :D

HeXPloreR
03.10.2014, 13:53
Hallo und vielen Dank für die vielen Antworten.

Also die Baudrate wäre maximal 38400.

Ich würde natürlich dem geringsten Aufbauaufwand vorerst den Vorzug geben.

Es sitzt noch ein weiterer Atmega328 drauf, der sollte aber nur also Haupteinheit das ganze System überwachen.
Vermutlich wird es tatsächlich einfacher sein, was zusätlichen Hardware aufwand betrifft, einen Master zu haben und die anderen (2-6) als Slaves über I²C zu betreiben. Und der Master schickt dann die Daten allein zur SSC.

Der Plan war allerdings die ATmegas einmal kurz über die Haupteinheit zu aktivieren, das Sie das versenden der Daten zur SSC dann ohne Haupteinheit tun.
Der Grund dafür liegt in meiner Berechnung der Inversen Kinematik für meinen Hexapod. Ich wollte dort durch aufteilen der Berechnungen etwas mehr Geschwindigkeit heraus bekommen.

Verliere ich diese Idee damit oder fahre ich mit der Slave Lösung in vielen Fällen immer noch schneller als die Berechnung von einem einizigen 328-20MHz durch führen zu lassen?

Viele Grüße
Jörg

Mxt
03.10.2014, 14:34
Ein Master und eine Busverbindung wäre die eine Möglichkeit.

Man könnte das ganze auch dezentral lösen, z.B. mit einer Art "Token Ring": Zuerst sendet der Master dem ersten Slave über ein IO-Bit das Signal (als kurzen Impuls), dass dieser Senden darf. Der Slave sendet etwas (oder hat ggf. nix zu sagen) und gibt danach das Signal an den zweiten Slave weiter. Dieser an den nächsten und zum Schluss der Letzte wieder an den ersten.

Die Kette läuft dann immer reihum, die Slaves senden nur, wenn sie die Signalflanke erhalten. Der Master stuppst das Ganze nur beim Start an.

Man kommt mit wenig Signalen aus, je ein Ein- und Ausgang bei jedem Slave. Natürlich können da Probleme wie in anderen Token-Netzwerken entstehen, wenn z.B. das Signal verloren geht, weil ein Slave vergisst es weiterzugeben. Da wäre eine Master Lösung wie bei SPI ausfallsicherer.

HeXPloreR
04.10.2014, 18:49
Ja, genau sowas wollte ich im vorherigen Post beschrieben haben.

Hier mal etwas ausführlicher:
Also die Haupteinheit schaltet die 5V Versorgung der Slaves erst frei wenn die Akkuspannung positiv geprüft wurde.
Die Slaves sind auf Steckplätze gesteckt und messen über einen ADC ihre Steckplatznummer, der über Widerstände eingestellt wird. Erst wenn sich alle eingesteckten µC beim Master per extra IO gemeldet haben, werden Daten zur Berechnung abgeschickt. Diese Daten hatte ich auch über UART geplant. Dadurch wird es möglich das der jeweilige µC im Programmcode verzweigt und nur die Berechnungen durchführt auf dessen Steckplatz er steckt. Und dann eben die zyklische Aktivierung der Sendepins erfolgt.
An dieser Stelle allein macht I²C schon Sinn, denke ich, da mir die aufwändige Verdrahtung von den IO Pins erspart bleibt.
Allein der ADC muss messen können auf welchem Steckplatz der µC steckt und dementsprechend der Code abzweigen. Theoretisch könnten dann auch nur einer gesteckt sein, wenn es im Code abgefangen werden kann und die jeweiligen Berechnungen der anderen Steckplätze dann übernommen werden können.
Wichtig wäre hier jetzt noch zu erwähen das auf allen Slaves der selbe Code laufen wird, und allein durch die ADC-Messung,dann eine Slave-Adresse zugewiesen werden würde. Der Master wäre dann der der auf maximal 6 bekannte Slaves scannt und nachdem alle Slaves identifiziert wären würde ich vermutlich nur noch mit einem General-Call arbeiten damit alle Slaves die selben Daten zur Berechnung erhalten.

Das alles ist noch theoretischer Natur - ich habe momentan nur zwei identische Arduino-ProMini Clone und hatte mich eigentlich in der Planung auf TTL RS232 bisher erfolglos "eingespielt".
Aber ich merke schon I²C hat da einfach Vorteile was auch die Rückmeldungen der Slaves betrifft. Und man ist nicht auf einige IO' sfixiert.

Vielen Dank und Grüße
Jörg

Mxt
05.10.2014, 09:50
Hallo,

wenn es die Slaves noch nicht gibt, hast du da mehr Freiheiten. Ich habe am Anfang gedacht, die gäbe es schon. Wenn nämlich mehrere Slave unsynchronisiert senden würden, bleibt wohl nichts anderes übrig, als das ein Master mit vielen UARTs das einsammelt und neu sortiert.

Bei AVR ist I2C dann die naheliegendste Lösung. Bei meinen ARM-Boards würde ich wegen der Performance eher zu SPI tendieren.

Und wenn die Slaves nicht zu viele IOs haben und von der Rechenleistung nur einen 8-Bit Controller auslasten, würde ich sie alle zusammen als Threads auf auf einen großen Controller legen.
http://developer.mbed.org/handbook/RTOS
als Hardware z.B. so was
http://developer.mbed.org/platforms/mbed-LPC1768/
http://developer.mbed.org/platforms/EA-LPC4088/