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ß
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.
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.
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.
>Hier findet sich z.B. ein Quellcode der dies bewerkstelligen soll.
Wo? Dann nimm den doch.
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.
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ß.
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.
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" ;-)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.