Hallo,
ich würde gerne wissen, ob meine Lösung zufällig funktioniert, oder auf
lange Sicht Bauteile zerstört :-) Im Forum habe ich zu diesem Ansatz
nichts finden können.
Aufbau: (drei teilnehmende Bauteile: Arduino, Bauteil, PC; jeweils zwei
verbunden)
Batteriebetrieb:
Arduino Pro Mini mit ATMEGA328p auf 3,2V --- schreibt Daten auf Bauteil
über serielle Schnittstelle ---> Bauteil.
Angeschlossen über USB:
Bauteil <--- schreib und Lesezugriff über serielle Schnittstelle ---> PC
Problembeschreibung:
Das Problem besteht darin, dass mein Bauteil nur eine serielle
Schnittstelle anbietet. Die Verbindung wird über einen FTDI hergestellt.
Wenn ich den FTDI anschließe, müsste der genau so geschaltet sein, wie
der Arduino, also zum Bauteil TX -> RX und umgekehrt.
Ich möchte mir zusätzliche Hardware sparen duck, also habe ich ins
Datenblatt des ATMEGA geguckt und gesehen, dass die Pins für die USART
Schnittstelle auch als Eingang im Tri-State geschaltet werden können
(Tabelle 13.1 Seite 77).
Mein Ansatz setzt also, beim Einstecken des FTDI (irgendein Port zeigt
mir an, was gesteckt ist), die Register DDRD0 und DDRD1, sowie PORTD0
und PORTD1 auf 0x00. Damit sollte meiner Meinung nach der Arduino von
den Leitungen getrennt sein.
Verbunden ist jetzt also [PC, ARDUINO, BAUTEIL] [TX, TX, RX] und [RX,
RX, TX], wobei der Arduino seine Ports im Tri-State hat.
Die Kommunikation zwischen dem Bauteil und dem PC funktioniert.
Fragen:
Kann ich das dauerhaft so betreiben?
Werde ich Probleme bekommen, weil der Arduino beim Einschalten erst den
Bootloader startet und damit die serielle Schnittstelle aktiviert, die
dann falsch verbunden ist (macht es was kaputt, wenn TX mit TX und RX
mit RX verbunden ist?)? Vom PC muss ich da noch nichts senden, sondern
warte auf ein "Hallo" des Bauteils.
Wenn es nicht geht würde ich mich über eine kurze Erklärung freuen :-)
Vielen Dank schon mal im Voraus für die Unterstützung!!!
Thomas
Moin,
da du wahrscheinlich nicht weisst, wann einer deiner Master(PC, µC) auf
das "unbekannte" Bauteil zugreift, wäre ein wired or Anschluss
angebracht.
Also an die TX Ausgänge der Master ne Diode und nen Pullup an den RX
Eingang des "unbekannten" Bauteils.
Gruß
Hallo Jean Player,
danke für die schnelle Antwort :-)
Ich weiß sehr genau wann ich lesen / schreiben möchte.
uC: Wenn die Batterie angeschlossen ist. -> Dann ist der PC [mit FTDI]
nicht angeschlossen, er wird über den gleichen Anschluss wie die
Batterie angesteckt. Im Stecker zur Batterie gibt es eine Brücke, die
einen Pin auf Masse zieht (sonst über internen Pullup auf High).
PC: Wenn der FTDI angeschlossen ist. -> Dann ist die oben genannte
Brücke offen und der Pin per Pullup auf High.
Die Schutzschaltung, die Du beschreibst, ist aber wahrscheinlich eine
gute Idee, da am Anfang der Bootloader des Arduino auf dem uC zu
kommunizieren versucht. Ist das nur "unschön" oder macht die Beschaltung
TX auf TX Probleme?
Gruß zurück,
Thomas
Wenn die beiden Ausgänge unterschiedliche Pegel haben (und das passiert,
wenn einer der beiden sendet) hast du eigentlich einen satten
Kurzschluss. Eine Diode oder zumindest ein Schutzwiderstand der den
Strom auf verträgliche Werte reduziert, sind mehr als angebracht. 300
Ohm dürften recht gut passen und je nach Baudrate durchaus verträglich
sein.
Bei Openkollektor-Ausgängen mit externem Pullup wäre es egal.
Push-Pull-Ausgänge wie du sie bei einem AVR und FTDI hast, dürfen nicht
parallel betrieben werden.
Hallo me, danke für die Antwort :-)
Ich verstehe Jean und Dich so, dass ich auf jeden Fall eine Diode bei
beiden TX Pins benötige. Muss das so aussehen? (hinter den tx Pins am uC
und Pc eine Diode, später zusammengeführt an rx, des Bauteils)
(+)
|
[r]
[ ]
PC (tx) --->|--- |
>------- (rx) Bauteil
uC (tx) --->|---
Wenn ich die Dioden einbaue, würde ich auch gleich den Pullup Widerstand
beim RX des Bauteils einsetzen, wenn es zur Stabilität beiträgt (ich
verstehe nicht, wofür der gebraucht wird).
Ist mein Szenario mit dem Tristate am AVR generell unklug? Ich dachte
der Tristate Zustand verhindere den Kurzschluss. Dauert es zu lange bis
der Tristate aktiv ist, weshalb ich noch Kurzschlüsse habe?
Wenn ich auf den Bootloader verzichte und die Pins wie oben beschrieben
setze, sendet nur der FTDI, der AVR bleibt stumm. Bin ich in dem Fall
sicher?
Welche Diode sollte man einsetzen? 1N5817?
Vielen Dank nochmal, hoffe die übrigen Fragen können noch beantwortet
werden. Dieses Forum ist wirklich toll :-)
Thomas
Wenn du ohne Bootloader arbeitest und Kollisionen mit dem FTDI
auschließen kannst, kannst du natürlich auch den AVR-Pin Tristate oder
Pullup schalten. Du musst allerdings zu jeder Zeit verhindern, dass
einer der ICs Highpegel treibt und der andere Low zieht. Du darfst mit
dem AVR daher nicht senden solange der FTDI in deiner Schaltung steckt.
Da Programmfehler nie auszuschließen sind, würde ich dir immer zu
100-300 Ohm als Schutzbeschaltung in einer der beiden TX-Leitungen
raten.
Wie Peter Diener ja bereits gesagt hat, gehören die Dioden umgedreht.
Die TX-Pins ziehen die Leitung nur mehr auf Low. High wird über den
Pullup erreicht (falls dein unbekanntes Bauteil nicht ohnehin einen
Pullup an RX hat). Die Dioden verhindern, dass Strom aus den ICs heraus
fließen kann und verhindern so die Kurzschlussgefahr.
(+)
|
[R]
[ ]
PC (tx) ---|<|--- |
>--------- (rx) Bauteil
uC (tx) ---|<|---
oder (wenn du erkennen kannst, dass der FTDI in deiner Schaltung ist):
PC (tx) ---------
>--------- (rx) Bauteil
uC (tx) ---[R]---
Wow, super, danke für die vielen guten Antworten!
Und vielen Dank für die Zusammenfassung, me!!!
Ihr habt mir sehr weiter geholfen! Ich werde mir meinen Aufbau nochmal
ansehen, wenn genügend Platz ist, werde ich die Dioden einbauen.
Danke auch dafür, dass ich mich jetzt von dem falschen Gedanken trennen
konnte die TX-Leitungen würden Impulse "Senden" :-s Manchmal lohnt es
sich doch Dinge nicht einfach zu verwenden, sondern auch mal
nachzusehen, wie sie funktionieren... .
Werde mir RS-232 mal durchlesen :-)
Schönen Gruß,
Thomas