Hallo,
ich suche ein IC, dass aus einer (seriellen) UART mehrer macht bzw.
Befehl verteilt.
Mein Problem ist, dass mein ATmega32 nur 1 x UART hat. Ich möchte aber 2
weitere ATmega's sowie einen PC daran hängen. Dafür suche ich nun einen
Chip, der mir quasi das Singal teilt bzw. dem man vor abschicken eines
Befehls sagt, wo er das ganze hinleiten soll. Wieder wäre es nicht
schlim, wenn alles was "rein" kommen soll in den ATmega immer dort hin
geleit wird. Es wäre sogar vorteilhaft, da dieser der "Hauptchip" ist.
ATmega32 (Chip)
| |
|- ATmega >|
| |
|- ATmega >|
| |
|- PC --->--
Das man alle drei nicht paralle schalten kann ist mir bewusst, da es
sonst ja ein Timingproblem geben würde wenn alle 3 gleichzeitig etwas an
den "Hauptchip" senden würden. Also muss das Bauteil einen Buffer
besitzen.
Jemand eine Idee?
Liebe Grüße
P.S.: Beispiel Codes in C sollte es für den Chip geben, da ich mich
nicht sonderlich mit Bits verdrehen auskenne.
Das lässt sich mit einem Multiplexer erledigen. Der wird mit ein paar
zusätzlichen Portpins angesteuert, die auswählen, mit welcher
Gegenstelle kommuniziert werden soll.
Das bedeutet aber auch, daß Daten immer nur von einer Gegenstelle
empfangen werden können. Ein "Mischen" der Daten ist sehr
fehleranfällig, denn was passiert, wenn zwei Gegenstellen gleichzeitig
senden?
Für Deine Anforderung ist möglicherweise eine Software-UART sinnvoller,
damit kannst Du auch auf einem AVR, der nur eine Hardware-UART hat,
mehrere voneinander unabhängige Schnittstellen einrichten.
Wie meinst du das, mit der Software? Der Hauptchip ist so gut wie voll
belegt. Aus diesem Grund muss ich jetzt "Erweiterungsplatinen" bauen.
Und ja, wenn alle 3 gleichzeitig senden habe ich ja das Problem... Ich
habe mir das so vorgestellt, dass wenn jeder gleichzeigt sendet das
Signal gebuffert wird und dann nach einander dem Chip übergeben wird.
Dieser könnte ja auch gleichzeitig an alle das Singal raußschicken.
Diese wäre ja nicht schlim. Ich könnte in den erstens Byte angeben für
wen der Befehl bestimmt ist.
Linekeying schrieb:> Hallo,>> ich suche ein IC, dass aus einer (seriellen) UART mehrer macht bzw.> Befehl verteilt.>> Mein Problem ist, dass mein ATmega32 nur 1 x UART hat. Ich möchte aber 2> weitere ATmega's sowie einen PC daran hängen. Dafür suche ich nun einen> Chip, der mir quasi das Singal teilt bzw. dem man vor abschicken eines> Befehls sagt, wo er das ganze hinleiten soll. Wieder wäre es nicht> schlim, wenn alles was "rein" kommen soll in den ATmega immer dort hin> geleit wird. Es wäre sogar vorteilhaft, da dieser der "Hauptchip" ist.
Nimm doch einfach einen größeren AVR mit 4 UARTS wie den M1280/2560.
Dann hast Du keine Klimmzüge nötig.
Oder Du baust einen RS485-Bus auf. Da hängen alle Controller an einem
Adernpaar, und jeder kann an jeden senden. Während Du bei RS232 einen
MAX232 oder MAX3232 nehmen würdest, nimmst Du bei RS485 einen LTC485
oder MAX485.
Siehe http://www.mikrocontroller.net/articles/RS-485
Und daran denken: Bei einem Bus ist es wie bei einer Wurst - Die Enden
müssen abgeschlossen sein, mit 120 Ohm.
fchk
Frank K. schrieb:> Oder Du baust einen RS485-Bus auf. Da hängen alle Controller an einem> Adernpaar, und jeder kann an jeden senden.
Nö, dann gibts Kollisionen.
Es darf immer nur einer senden!
Du brauchst einen Master oder ein spezielles Protokoll (Token Passing).
Daß jeder sendet, geht z.B. bei CAN (Carrier Sense Multiple Access /
Collision Resolution)
Peter
Hallo,
es gibt kaum noch einzelne UART-ICs (z.B. 85C30), aber die sind designt
für einen Bus und brauchen daher 13 bis 16 Leitungen als Anschluss an
den Prozessor. Teuer sind sie auch.
Günstiger wird es, wenn du dir einen einfachen AVR oder PIC als
UART-Slave selbst zurechtbastelst.
Gruss Reinhard
Erstmal danke für die guten Antworten!
Also nochmal: ATmega32 ist für mich soweit ausreichend. Platine ist
soweit fertig und kann auch nicht mehr geändert werden. Die I/O Ports
sind fast vollständig belegt!
Nochmal kurz Software UART ...was genau ist damit gemeint? Wie
funzt's?
Erst zusammenlöten und dann nachdenken was man will funktioniert nicht.
Den Aufwand den du jetzt treibst ist größer als eine neue Platine zu
machen mit größerem Controller
Ich würde I2C als Verbindung zwischen den AVRs verwenden. Damit bist du
sehr flexibel, weil weitere Controller problemlos hinzukommen können,
ohne das mehr Pins gebraucht werden.
Ansonsten haben manche AVRs auch einen UART-Modus mit Adressierung (über
das neunte Bit). Damit kann man dann alle Empfänger parallel schalten
und jeder reagiert nur auf seine Daten. Die Sender dann per Dioden
zusammenführen, und jeder antwortet nur, wenn er zuvor dazu aufgefordert
wurde. Da müsste man nur schauen, wie das mit dem PC zusammen
funktionieren würde.
Uwe ... schrieb:> Ansonsten haben manche AVRs auch einen UART-Modus mit Adressierung (über>> das neunte Bit). Damit kann man dann alle Empfänger parallel schalten>> und jeder reagiert nur auf seine Daten. Die Sender dann per Dioden>> zusammenführen, und jeder antwortet nur, wenn er zuvor dazu aufgefordert>> wurde. Da müsste man nur schauen, wie das mit dem PC zusammen>> funktionieren würde.
^^ Das wäre doch ne Idee... =) Wie genau funktioniert das mit dem
neunten Bit ?
P.S.: Ist es den auch Möglich die ATmega's über den 1Wire - Bus laufen
zu lassen und nur den PC an die UART ?
Ich kann ja jetzt bereits per 1Wire den DS1820 Sensor auslesen. Dieser
Antwortet mir dann. Nun aber woher bekomme ich jetzt die Seite? Die
anderen Chips würden ja dann als Slaves an der Datenleitung mit dran
hängen.
Linekeying schrieb:> ^^ Das wäre doch ne Idee... =) Wie genau funktioniert das mit dem> neunten Bit ?
Steht im Datenblatt als "Multi-processor Communication Mode".
> P.S.: Ist es den auch Möglich die ATmega's über den 1Wire - Bus laufen> zu lassen
Prinzipiell ja, allerdings ist es vom Timing her deutlich kritischer.
I2C/TWI können die AVRs dagegen in Hardware, was speziell bei den Slaves
sehr nützlich ist.