Meerder RS485 devices en transceivers op 1 atmega 328 serial bus

Hoi,

Ik ben bezig om een RS485 ontwerpje te maken en wil dat doen met een AVR 328p. Volgende situatie

* 3 RS485 devices
* Deze devices hebben geen individueel bus address (alleen een algemeen adres). Dus je kan ze niet individueel aanspreken - dan reageren ze allemaal :-(

* Idee is om 3 transceivers te gebruiken en deze aan / uit te zetten wanneer je er 1 wilt gebruiken (dus Vcc transceiver gevoed door programmeerbare PIN van de 328)
* Dus Atmega328 MCU gebruiken (SoftSerial) - de ingebakken serial gebruik ik voor FTDI
* De RO / DI en RE/DE van de 328 zijn dus verbonden met alle transceivers.

Heeft iemand ervaring met zo'n opzet? Of misschien gebruik van multiplexer?

Thanks,
Buffel

buckfast_beekeeper

Golden Member

Net zoals gebruikelijk met SPI? datalijn, klok aan alle devices en een ship select?

Van Lambiek wordt goede geuze gemaakt.

De rs485 device hebben alleen A en B draad. En ik ken geen 485 transceiver met CS/NSS. Maar ben ook niet heel bekend op dat terrein

buckfast_beekeeper

Golden Member

Je transceivers hebben toch 3 ingangen?

Als je toch softserial gebruikt, kan je ze dan niet gewoon apart aan de µC hangen? Zijn tenslotte maar 6 uitgangen.

Van Lambiek wordt goede geuze gemaakt.

Schrijf je de firmware van die 485 slaves niet zelf? Dan zou je het adres configureerbaar kunnen maken zoals "normaal" bij een 485 setup. Het is een bus, dus je hebt per definitie meerdere slaves die elk een eigen adres moeten hebben.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

@buckfast-beekeeper - RS485 is niet geschikt om direct aan de MCU te hangen. De transceiver maakt er netjes TTL signalen van. Dat gaat imho nooit niet lukken door direct aan SoftSerial te koppelen (signaal A en B zijn geinverteerd en lopen tussen -12 en + 12V).

@flipflop - nee helaas kan ik de rs485 devices niet aanpassen (anders had ik een mooie busstructuur kunnen gebruiken - daarom op zoek naar alternatief). Post hier wel als ik iets vind en het getest heb

Beste buffel, /ik/ snap nog steeds niet wat je wilt. En aan de uiteenlopende reacties te zien, denk ik dat er minstens twee interpretaties zijn hierboven over wat men denkt dat jij wil. Ik heb het even aangzien, maar wat mij betreft is er nog geen verduidelijking.

Misschien als je uitlegt wat je aan het doen bent dat duidelijk wordt wat nu jou configuratie moet worden.

Wachteffe, Na drie keer herlezen denk ik dat ik het begin te begrijpen.

Jij hebt RS485 slaves, die "standaard 485" zijn en geen busadres hebben of zoiets. Flipflop denkt dat JIJ die devices programmeert maar dat is niet zo.

Jij wilt vanaf 1 atmega328 3 van dit soort devices aansturen.

Mijn voorstel buckfast probeert ook zoiets: Sluit alle DI, pinnen op 1 pin van de arduino aan. Sluit alle DO pinnen op een andere pin van de arduino aan. Sluit daarna de RE/DE pin van iedere max485 aan op een aparte pin van de arduino. Volgens mij tristate ie gewoon de DI pin als RE inactief is. Oh, wacht. Kleine complicatie... Als JIJ zend op kanaal 1, dan maak je DE van 2 en drie inacitef, maar dus ook RE van die dingen ACTIEF. Dus als je een antwoord verwacht van je device, moet je na het sturen van jou "vraag", meteen ALLE select/enable signalen inverteren. Nu wordt de RE van kanaal 1 actief, en kanaal 2 en drie gaan zenden (maar jij zend niets).

Jou plan met de VCC schakelen werkt niet: Zodra zo'n chip een hoog signaal op 1 van z'n pinnen heeft, wordt ie wakker.

@buckfast, om een RS485 tranciever aan te sturen heb je 3 of 4 signalen nodig. De RE (reciever enable) en DE (Driver enable) zijn omgekeerd kwa op welk niveau ie enabled is. Als je dus OF wilt zenden OF wilt ontvangen, hang je ze aan mekaar.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
buckfast_beekeeper

Golden Member

Maxim heeft de nodig shipies om uart RS485 om te zetten. In een ver verleden nog Z80=>RS232 gemaakt zonder max maar met een MC1488 en MC1489. Spanningen zaten ook tussen -12V en +12V terwijl de Z80 netjes op 5V draaide.

Van Lambiek wordt goede geuze gemaakt.
fatbeard

Honourable Member

@Rew heeft wel het juiste idee, je hebt alleen wat glue-logic nodig...

  • elke 485-slave zijn eigen A- en B-lijn naar een eigen driver chippie (LTC485 of equivalent) bij de AVR (vergeet de nul/GND niet als de slaves een eigen voeding hebben ivm common-mode spanningen)
  • alle DO van de driver chippies aan elkaar en aan de RXD input van de AVR UART.
  • alle DI van de driver chippies aan elkaar en aan de TXD output van de AVR UART.
  • van elke driverchip de REn en DE aan elkaar en aansturen via een 2-inputAND-poort.
  • één input van die AND-poorten aansturen met de TXE output van de AVR UART.
  • de andere input van die AND-poorten vormt de selctielijn voor elke slave.
Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.
Arco

Special Member

Of een controllertje nemen met 4 UART's, ook niet echt duur...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Tja, Of twee. 1 voor de communicatie met de PC, en 1 voor de 485 kant.

En dan zoals ik en Fatbeard uitleggen: de RE/DE lijn als CS gebruiken.

De TXE nog and-en met de CS zou ik in software doen. Een hardware TXE is leuk als je er dan verder geen omkijken naar hebt, maar hier is dat niet zo.

Ohja, Fatbeard z'n plannetje werkt NET niet.... Doordat de "enable" input op de AND-poort laag is, is de "DE" van de niet aangstuurde 485 slave niet actief... Maar de RE dus WEL! Het gevolg is dan dus dat twee van de drie hun DI signaal "inactief" maken (de andere slaves zullen wel niet aan het zenden zijn) en de actieve moet proberen dat te overrulen om data door te geven....

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

zenden de 485 devices altijd data? of alleen na een opdracht van de master.

wat je kan doen is de TX van de 328 via een paar AND gates naar de verschillende RI doorzetten, dan de RO van de modules op de RX van de atmel.

andere optie is 3x softserial gebruiken, en dan 3x TX en 3x RX op je 328.

GMT+1

Als je gaat proberen iemand iets uit te leggen, probeer dan OFWEL de JUISTE benamingen van de termen te gebruiken of je aan te passen aan wat de doelgroep gebruikt. De doelgroep is in dit geval Buffel.

RI bestaat niet.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Thnx, ga morgen direct proberen.

@Rew - mijn verhaal was misschien niet helemaal duidelijk maar je hebt het wel goed begrepen. Heb schemaatje aangepast aan jouw en Fatbeard's suggestie / situatie dat transceiver 1 verstuurt naar een device.

Nu valt bij mij ook het kwartje wat er in deze context met CS werd bedoeld (REn/DE)). En aangezien ik half duplex situatie heb zou het moeten werken

Wat ik niet begrijp is waarom de prog. Vcc niet zou kunnen werken. Hoe reageert de transceiver als ik de Vcc eraf gooi in het geval dat alle RO, DI en REn/DE wel direct op de 328 zijn aangesloten Dus bijvoorbeeld:
- transceiver 1 actief (met Vcc) en
- transceiver 2 en 3 hebben geen Vcc

@Progger:
- RS485 devices zijn de slaves. Dus ze zenden pas als de master (328) erom vraagt, dus nooit uit zichzelf.
- 3x SoftSerial te gebruiken heb ik ook overwogen - maar denk dat ik dan naar de 644 of 1284 moet ivm geheugen :-). Staat nog wel op mijn lijst om meerdere SoftSerials te gebruiken.

Waarschijnlijk worden ze als je de voedingsspanning afschakelt gevoed door de signalen via de clampingdiodes tegen ESD. Dit afhankelijk van de gekozen tranceiver.
Dat is op meerdere manieren ongewenst.

Extra geheugengebruik valt in zo een geval wel meestal mee, de compiler doet zijn best. Ik zou het even proberen.

[Bericht gewijzigd door Aart op zaterdag 14 januari 2017 20:06:14 (23%)

Zoals Aart al zegt: voeding via de clamping diodes.

Ik geloof dat het aansturen van RS485 met forse stromen gepaard gaat. Dus je outputs die perongeluk de niet-aanstaande drivers voeden worden zwaar belast. Te zwaar. En... omdat de driver zo veel stroom kan gebruiken (let op: ze specificeren het stroomgebruik bij niet-belaste output!) heb je weer extra componenten nodig om de voeding van de chips te schakelen.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
fatbeard

Honourable Member

@Rew: je hebt gelijk, de niet geactiveerde slaves moeten ook de receiver afgeschakeld krijgen: een NAND poort!
Als je die AND/NAND in software gaat doen heb je 6 processorpoten extra nodig: twee per 485-driver. Met 'externe' poorten heb je per driver maar 1 processorpoot extra nodig, plus een voor de TXE...
Bij elke driver 'win' je met externe poorten dus een processorpin (in mijn wereld is er een chronisch tekort aan die dingen ;)).

485-drivers hebben meestal de niet-belaste voedingsstroom in de datasheet staan (afhankelijk van de technologie tot een tiental mA), plus de maximum stroom die ze aan de A-B lijnen kunnen leveren (vaak een mA of 80!), maar die stroom moet dus wel óók door de voeding geleverd kunnen worden...
Vanwege die behoorlijke drive-capaciteit (model afhankelijk, 50-120mA) én de behoorlijke gevoeligheid van de ontvanger (model afhankelijk, 20-350mV) is de ontkoppel-C bij een 485 driver heel belangrijk, dat zie je zelfs terug in de pinout.

Er zijn (letterlijk!) boeken over 485 volgeschreven, een groot aantal door Texas Instruments.

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.

Heb de setup van Rew geprobeerd en die werkt prima (dus per 485-driver 1 REn/DE signaal. Dus REn en DE niet apart aangestuurd).

Ik schakel de Vccs nog met de 328 en geeft vooralsnog geen problemen (verander ik tzt). In de POWER-DOWN (mcu sleeps) mode wil ik de 485 drivers "uitzetten" om batterij te besparen. Feit is dat ik weinig poorten over heb (as usual) :-|

@fatbeard - waar zie je de ontkoppel-C terug in de pinout?

Bedankt

Gewoon een protocolletje maken. Je kunt een standaard protocol nemen, maar ik zou er een zelf maken, wat ik al vaker heb gedaan:

Stuur het bericht dus naar alle nodes. In die nodes doe je zelf de adressering, Zet dus in het bericht in een van de bytes voor welke node het is. En alleen die node reageert dan, de andere gooien het bericht gewoon weg. In je nodes moet je wel een adres instellen met switches/jumpers of in harde code of eeprom of zo. Denk ook even na of je single of multiple master wil werken, ik raad single master aan ivm de simpelheid.

Gebruik wel een RS485 buffer, voor aansluiten van de processor helpen hier anderen je al. Spiek anders even bij bekende bussen als profibus, ethernet, bitbus (ken ik door en door, helaas weinig meer gebruikt). Google helpt je wel.

bprosman

Golden Member

In het verleden als eens een paar keer het "SNAP" protocol gebruikt.Is best goed over nagedacht.

http://www.hth.com/snap/

Groeten, Bram

[Bericht gewijzigd door bprosman op woensdag 18 januari 2017 13:25:13 (11%)

De jongere generatie loopt veel te vaak zijn PIC achterna.
bprosman

Golden Member

Heeft iemand ervaring met zo'n opzet? Of misschien gebruik van multiplexer?

Je kunt er toch 3 transceivers opzetten en met de /Enable lijn de juiste kiezen en mee communiceren ? Dan heb je een soort multiplexer.

De jongere generatie loopt veel te vaak zijn PIC achterna.

Op 18 januari 2017 13:24:23 schreef bprosman:
In het verleden als eens een paar keer het "SNAP" protocol gebruikt.Is best goed over nagedacht.

http://www.hth.com/snap/

Groeten, Bram

Even het protocol bekeken. Ziet er op het eerste zicht goed uit. Komt me bekend voor, een beetje SDLC-achtig. Waarschijnlijk wel robuust.

Op 18 januari 2017 12:27:08 schreef Hoeben:
Gewoon een protocolletje maken.

Je kan ook het topic lezen voordat je onzin spuit. Er zijn drie slaves, waarvan het protocol al vast ligt. Niet onder controle van de vraagsteller.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
fatbeard

Honourable Member

De meeste RS485 drivers hebben de bus lijnen tussen de voedingsaansluitingen zitten, aan een en dezelfde kant van het IC; bij (veel te) veel andere ICs zitten de voedingsaansluitingen op tegenoverliggende hoeken, heel onhandig voor goede ontkoppeling...

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.

Op 18 januari 2017 19:10:07 schreef rew:
[...]Je kan ook het topic lezen voordat je onzin spuit. Er zijn drie slaves, waarvan het protocol al vast ligt. Niet onder controle van de vraagsteller.

Aha, dus geen software mogelijk. Dat is inderdaad onhandig. Dan blijft nog altijd een klein cpu-tje als buffer mogelijk met RS485 in en uit.

Maar: het protocol ligt dus ook al vast. Wat staat daar dan in?

Is het gewoon asynchrone communicatie met standaard snelheden? Dan is het met een klein processortje best te doen. Lees alle berichten in en geef alleen die door met het juiste adres (wel extra bytje toevoegen)