mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RS485 am UART betreiben.


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Peter WIegand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie ist es mir möglich meinen Atmega8 direkt mit einer RS485 Gegenstelle 
zu vebinden?

Habe da Quellcodes gefunden und diverse Aussagen darüber das dies 
möglich sein soll.

Hier findet sich z.B. ein Quellcode der dies bewerkstelligen soll.
Ich weiß jedoch noch nicht so ganz wie ich den Controller beschalten 
muss
um das zum Laufen zu bekommen.

Ich habe bei RS485 zwei Datenleitungen und muss irgendwie umschalten
wenn ich senden will. So ganz bekomme ich das noch nicht in meinen
Kopf.

P.S: Ich will keinen MAX485 o.Ä verwenden aus Platzproblemen und wenn
die Datenübertragung etwas instabil ist, macht das nichts. Es handelt
sich nicht um Daten die "am Stück" ankommen müssen.
Hört sich komisch an, ist aber so ;). Der Controller wird einfach
von einem Baustein über RS485 permanent mit Daten beschossen, schnappt
diese auf und antwortet dann mit einem definiertem Wert. Wenn dabei ein 
paar
mal keine Antwort kommt, ist das nicht ganz so schlimm.

Danke für jede Antwort

Gruß

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst einen RS485-Treiberbaustein. Ohne geht nicht.

Platzgründe? Ein RS485-Transceiver ist ein 8poliges Baueelement. Dafür 
ist Platz da.

Das mit der Sender-/Empfänger-Umschaltung sieht so aus: Im Normalfall 
steht der RS485-Transceiver auf Empfangen; Dein µC hört am Bus mit. Nur, 
wenn er senden will, wird unmittelbar vor dem Senden des ersten Bytes 
der Transceiver auf Senden geschaltet und erst nach dem vollständigen 
Senden des letzten Bytes (also wenn das auch das UART-Schieberegister 
verlassen hat) der Transceiver wieder auf Empfang umgeschaltet.

Autor: Hm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen Max485 oder aenlichg gibt's in SO8 oder MSOP8 ... sorry.

Autor: Amateur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die gesamte serielle Datenübertragung muss in (mindestens) zwei Ebenen 
betrachtet werden.
1. Das "Impulsmuster" an den Ausgängen Rx und Tx.
2. Die tatsächlich übertragenen elektrischen Pegel.

Die üblichen 0V und 5V (3,3V) passen in kein übliches Raster.

RS232 arbeitet offiziell (manchmal) mit +15 und -15V.
Dazu sind zwei Drähte (Rx + Tx) plus Masse vonnöten.

RS485 benutzt ein differentielles, elektrisches Format.
Aus diesem Grunde werden auch immer 4 Drähte (2 Paare) verwendet.
Hinzu kommt noch, dass die Leitungen definiert abgeschlossen werden 
sollen.
Dafür kannst Du aber auch mit wesentlich größeren Abständen zwischen 
Sender und Empfänger arbeiten.

Zur Erzeugung des differentiellen Protokolls gibt es fertige ICs und Du 
hast keinen Ärger damit.

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Amateur schrieb:
> RS485 benutzt ein differentielles, elektrisches Format.
> Aus diesem Grunde werden auch immer 4 Drähte (2 Paare) verwendet.

RS485 wird im Halbduplexverfahren mit einem Paar abgehandelt, es werden 
also nicht immer zwei Paare verwendet.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hier findet sich z.B. ein Quellcode der dies bewerkstelligen soll.

Wo? Dann nimm den doch.

Autor: Peter WIegand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
https://github.com/kohyama/AVR-RS485
Habe jetzt auch festgestellt das es sich un eine Ansteuerung eines Rs485 
treibers handelt. So erklärt sich auch die umschaltung an dem einen Pin 
beim Senden.

Autor: Michael K. (Firma: Knoelke Elektronik) (knoelke)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter WIegand schrieb:
> Ich weiß jedoch noch nicht so ganz wie ich den Controller beschalten
> muss um das zum Laufen zu bekommen.

Nichts einfacher als das.
Es gibt einen Sender, der bekommt den TX
Der Empfänger bekommt den RX
Beide haben einen Eingang der die aktiv schaltet.
Das kann man jeweils separat machen, oder beide über einen pin 
umschalten.
Es ist somit z.B. möglich den Empfänger immer aktiv zu lassen und nur 
den Sender ein / auszuschalten.
Damit könnte man so eine art kollisionserkennung machen.

Will man nur eine einfache Punkt zu Punkt Verbindung unterscheidet den 
RS485 bis auf den RX/TX enable nicht von einem V24 Uart der in 
Halbduplex betrieben wird.
Jeder Sender muss nur wissen wann er dran ist mit senden.
Ein einfaches Master / Slave Protokoll funktioniert gut.
Der Master adressiert 'seine' Slaves, schickt Daten und fragt ggf 
geziehlt Daten ab.
Zur Beanteortung hat der Slave xx ms zeit, bis der Bus wieder frei sein 
muß.

Von Maxim gibt es die RS485 Treiber als nur RX oder nur TX auch im 
sot23-6.
Sonst weichst Du auf die uDFN aus, die sind 2x2mm groß.

Autor: Nosnibor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. Firefly schrieb:
> Du brauchst einen RS485-Treiberbaustein. Ohne geht nicht.

Das ist mir etwas zu extrem formuliert.

Die richtigen Ausgangspegel kann der AVR ja schon erzeugen. Muß man 
natürlich per software-UART machen, weil keine Hardware dafür vorgesehen 
ist, Gegentaktsignale zu erzeugen.
Für den differenziellen Eingang tut's erstmal der Analogkomparator. Auch 
hier wieder: Software-UART.
Natürlich gilt dann nur ein etwas eingeschränkter 
Eingangsspannungbereich; im  Ernstfall ist dann eben der Prozessor 
hinüber. Also zum Basteln geht's, aber man darf halt kein Risiko 
eingehen mit Leitungslängen, "Brummschleifen", etc.. Und immer einen 
Prozessor als Reserve bereithalten.

Nächste Stufe: RX und TX gemeinsam an die B-Leitung; A mit einem 
Spannungsteiler auf mittleren Pegel. Sollte zur Verständigung mit einer 
standardkonformen Gegenseite reichen, sofern man nicht vergißt, den 
TX-Pin bei Nichtgebrauch als Eingang zu konfigurieren. Damit gibt man 
aber sämtliche Vorteile des RS-485 gegenüber einer einfachen 
logic-level-UART-Verbindung auf; ich würde das also nur da machen, wo 
man auch problemlos IIC verwendet: innerhalb desselben Gehäuses, 
versorgt vom selben Netzteil usw.

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nosnibor schrieb:
> Rufus Τ. Firefly schrieb:
>> Du brauchst einen RS485-Treiberbaustein. Ohne geht nicht.
>
> Das ist mir etwas zu extrem formuliert.

Naja, was Du da beschreibst, würde ich schon eher als Hardcore-Frickeln 
verstehen.

Daher halte ich eher Rufus' Antwort für die normale, jedoch Deine 
Beschreibung eher schon "extrem formuliert" ;-)

Autor: Nosnibor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mir ist halt das "ohne geht nicht" aufgestoßen. Wenn USB per bit-banging 
geht, muß das auch mit RS-485 gehen. Ob man damit glücklich wird, ist 
eine andere Frage.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.