logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[BASCOM] kilka urządzeń na RS-485

dorotazukowo 14 Lut 2010 17:35 3878 22
  • #1 7693809
    dorotazukowo
    Poziom 11  
    Mam pytanie. Przeglądam sobie od jakiegoś czasu tematy związane z RS485 ale im więcej czytam tym mniej wiem.Mam kilka układów które mam zamiar połączyć przy użyciu rs485 (max485). Odległości pomiędzy urządzeniami to jakieś 10m (największa odległość pomiędzy pierwszym a ostatnim urządzeniem to jakieś 100m).
    Ale jest jeden spory dla mnie problem. Otóż każde z urządzeń może w dowolnym momencie chcieć nadać jakieś dane. Nie mogę zrobić czegoś takiego że jedno z urządzeń nadaje a reszta czeka na odpowiedź.
    Oczywiście będę mieć swój własny "protokół" i każde z urządzeń będzie wiedzieć że jakieś dane są akurat dla niego.
    Myślałam nad dodaniem jeszcze jednej linii na której nadające akurat urządzenie ustawia np. poziom wysoki a reszta układów sprawdza tą linię i przełącza się na odbiór.

    Dodam że moje układziki mają na pokładzie MAX485 i wyprowadziłam na goldpiny :
    1. A (pomiędzy A i B jest rezystor 120R)
    2. B
    3. GND

    pin 4.dodała bym jako linię "kontrolną"


    Czy może jest prostsze rozwiązanie. Jeśli chodzi o komunikację przy pomocy RS232 nie mam większych problemów ale tu będzie więcej urządzeń (docelowo 8) i prosiłabym o jakiś przykład jak powinna wyglądać taka sieć. Czy wystarczy że połączę każde z urządzeń do linii A i B oraz GND czy muszę zrobić coś inaczej.


    Mikrokontrolery jakie mam na płytkach to Atmega 16.
  • Pomocny post
    #3 7694175
    markosik20
    Poziom 33  
    dorotazukowo napisał:
    Otóż każde z urządzeń może w dowolnym momencie chcieć nadać jakieś dane. Nie mogę zrobić czegoś takiego że jedno z urządzeń nadaje a reszta czeka na odpowiedź.


    No to kiszka, bo na magistrali może nadawać TYLKO jedno urządzenie. Wykorzystaj topologię sieci tzw. "żeton'u". Urządzenia przekazują sobie po kolei pozwolenie na nadawanie, jeżeli któreś ma coś do nadania to nadaje, jeżeli nie przesyła "żeton" dalej.
    Jeżeli urządzenie ma coś do nadania to powinno cierpliwie poczekać na swoją kolej :wink:.
    Rozumiem że nie będzie żadnego master'a w sieci?
  • #4 7694277
    dorotazukowo
    Poziom 11  
    Ale czy nie lepiej zastosować taką metodę jak przedstawiłam? Tzn. ta dodatkowa linia do sprawdzania stanu odbiór/nadawanie ? Wg, mnie to powinno być najlepsze rozwiązanie. Co do Mastera to takiego nie będzie. Ma to być sieć w którą mogę się wpiąć z dowolnym urządzeniem (z rs485) i bez problemu móc czytać i nadawać. Owszem będzie jedno urządzenie główne ale nie ma być to żaden master.
    Pytanie jeszcze do kwestii elektronicznej. Jak powinna wyglądać taka przykładowa sieć.
    Mam wątpliwości co do zastosowania terminatora(120R) w każdym urządzeniu. Przy 8 takich urządzeniach opór będzie dość spory. Czy sieć będzie pracować poprawnie? Czy nie lepiej zaterminować taką linię "na początku" i na "końcu"? Pytanie natury praktycznej.
  • #5 7694411
    markosik20
    Poziom 33  
    dorotazukowo napisał:
    Ale czy nie lepiej zastosować taką metodę jak przedstawiłam? Tzn. ta dodatkowa linia do sprawdzania stanu odbiór/nadawanie ?


    Ale co Ci to da? Jeżeli oba urządzenia naraz będą chciały nadawać i wykryją że sieć jest wolna to które ma pierwszeństwo?
  • Pomocny post
    #6 7694437
    tmf
    VIP Zasłużony dla elektroda
    Dodatkowa linie ani nie jest potrzebna, ani tez nie rozwiazuje, zadnego problemu. Bo nic nie zabezpieczy przed sytuacja, w ktorej dwa urzadzenia prawie jednoczesnie sprawdza ta linie, stwierdza, ze jest wolna i sprobuja ja zablokowac. Twoj problem mozna rozwiazac na dwa sposoby. Klasycznie po prostu sprawdzac linie, jesli przez jakis czas nikt nie nadaje to uznac, ze jest wolna. Oczywiscie to nie chroni przed kolizjami, a ze klasyczny RS485 nie ma stanow recesywnych to kolizji nie da sie wykryc. Wiec nadawany pakiet musi miec CRC, a slave musi odbior potwierdzac ACKiem. Przy braku potwierdzenia master po losowym czasie ponawia transmisje pakietu.
    Drugie rozwiazanie to zmienic nieco zasady na RS485 - zrobic z niej magistrale ze stanem recesywnym. Wtedy jesli nic nie nadaje to magistrala jest w stanie "1" utrzymywanym przez terminatory, nadawane sa tylko bity o wartosci "0". W takim ukladzie latwo stwierdzic kolizje - po prostu master sprawdza czy to co nadaje jest rowne temu co odbiera (zauwaz, ze w klasycznym RS485 takie sprawdzenie nie ma sensu). Wada jest to, ze skraca sie nieco max. odleglosc (no ale ty potrzebujesz tylko 100m) lub max. szybkosc tansmisji.
  • #7 7694577
    markosik20
    Poziom 33  
    tmf napisał:
    W takim ukladzie latwo stwierdzic kolizje - po prostu master sprawdza czy to co nadaje jest rowne temu co odbiera


    Czyli wysyłam 1 -> sprawdzam czy jest 1 na magistrali , wysyłam 0 -> sprawdzam czy jest 0 ? Tylko że przełączając się w tryb odbioru magistrala i tak wraca do stanu ustalonego przez terminatory.
  • #8 7694832
    adambehnke
    Poziom 24  
    Mi się wydaje że pomysł z dodatkową linią w tym przypadku nie jest złym pomysłem. Jeśli częstotliwość z jaką nadają urządzenia w sieci jest mała to występuje małe prawdopodobieństwo że akurat dwa lub więcej urządzeń zechcą nadawać w dokładnie tej samej chwili.Co prawda jest takie prawdopodobieństwo ale małe.
    Ja osobiście nie za bardzo rozumiem przykład kolegi TMF. Chyba że potrafi to jakoś zobrazować schematycznie i przykładowym kodem dla powiedzmy dwóch urządzeń. Problemem jest wydaje mi się to że terminatory ustalają stan linii.
  • #9 7695085
    michalko12
    Specjalista - Mikrokontrolery
    dorotazukowo napisał:

    Dodam że moje układziki mają na pokładzie MAX485 i wyprowadziłam na goldpiny :
    1. A (pomiędzy A i B jest rezystor 120R)
    2. B
    3. GND



    Jeśli przy każdym urządzeniu masz rezystor 120Ω to to jest błąd. Taki rezystor powinien występować tylko na końcach długich linii i to nie zawsze ma być wartość 120Ω.
    GND tez nie powinno być czystym GND tylko na złącza powinno być wyprowadzone przez 100Ω.
    Kolejna sprawa, mas urządzeń nie powinno się ze sobą łączyć, masa powinny być podłączona tylko do ekranu przewodu, ale tylko z jednej strony przewodu.

    Zobacz rysunek na 25 stronie Link
  • #10 7695164
    __Maciek__
    Poziom 20  
    Właściwie to z pierwszego postu nie do końca wynika czy urządzenia już istnieją czy dopiero są projektowane ..
    Jeśli to etap projektu to ciśnie mi się na usta protokół CAN. zrealizowany np. na MCP2515 ... (szkoda że nie są dostępne np. atmega32M1) - gotowy sterownik odciąża procesor i sam zajmuje się przetwarzaniem wysyłanych i odbieranych informacji w sieci multi-master.
    Jeśli urządzenia już istnieją no to IMHO trzeba kombinować z tokenem.
  • #11 7695279
    tmf
    VIP Zasłużony dla elektroda
    markosik20: odbior i nadawanie sa jednoczesne. W 75176 i innych mozesz jednoczesnie odblokowac nadajnik i odbiornik.
    adambehnke: ta linia do niczego nie jest potrzebna, a tylko komplikuje. Wszystko co mozna za jej pomoca zrobic, mozna dokladnie tak samo zrobic bez niej. Prawdopodobienstwo jednoczesnego nadawania moze i jest male, ale to jest bez znaczenia - albo dwa urzadzenia moga jednoczesnie nadawac albo nie. Jesli moga i w efekcie doprowadzi to do utraty pakietu to trzeba temu zapobiec. A skoro trzeba to lepiej od poczatku zrobic to jak nalezy. Co do RS485 ze stanem recesywnym to elektrycznie odpowiada to magistrali CAN. Nie wiem co tu jasniej tlumaczyc, jak masz konkretne pytanie to pytaj. Postaram sie odpowiedziec.
  • Pomocny post
    #12 7695360
    markosik20
    Poziom 33  
    tmf napisał:
    odbior i nadawanie sa jednoczesne. W 75176 i innych mozesz jednoczesnie odblokowac nadajnik i odbiornik.


    Tego to nawet nie wiedziełem (człowiek się niestety całe życie uczy :) )
    Czyli reasumują: urządzenie które chce wysłać dane sprawdza magistrale...jak jest wolna zaczyna nadawać i sprawdza czy wysyłania nic nie zakłóca. Co w przypadku jak drugie urządzenie też zacznie nadawać? Istnieje jakiś poziom priorytetów poszczególnych urządzeń?
  • #13 7695509
    tmf
    VIP Zasłużony dla elektroda
    To zadziala tylko w przypadku RS485 ze stanem recesywnym. W normalnym RS485 odbiornik odbiera to co nadal najblizszy nadajnik. Takze jesli dwa na raz zaczna nadawac to odbiorniki w zaleznosci od polozenia na magistrali odbiora zupelnie inne rzeczy. Stad potrzebne jest sprawdzanie CRC pakietow, bo porownywanie sekwencji nadawanej z odbierana przez mastera sie nie sprawdza.
  • #14 7702115
    dorotazukowo
    Poziom 11  
    Niestety chyba nic z tego na razie nie będzie. Nie rozumiem do końca jak to ma działać. Mastera mieć nie mogę to pewne. Może dysponujecie jakimś przykładowym kodem dla kilku nadajników. Dla mnie miało by to wyglądać tak:
    Są trzy urządzenia:

    1. Urządzenie 1 nadaje (z przeznaczeniem wiadomości dla urządzenia 3) coś takiego : "3- Zrob cos".
    2. Także odbiera tą wiadomość ale skoro nie jest dla niej to ją ignoruje
    3. Także odbiera te dane i realizuje je odpowiadając np: "1.zrobione"

    Chodzi mi o to dokładnie jak zrobić w Bascomie w jakiś prosty sposób przełączania się z odbioru na nadawanie i jak kolejne urządzenia sprawdzają czy linia jest ustawiona na nadawanie czy odbiór. Owszem jak przełączyć AX485 z odbioru na nadawanie to wiadomo -podając stan wysoki lub niski na pin ale jak dalej? Może piszę niejasno ale ja to tak rozumuję. Może błędnie , to proszę o wyjaśnienie. Chodzi mi o przykład.Resztę zrobię sama.
  • #15 7702396
    tmf
    VIP Zasłużony dla elektroda
    A nie mozesz zastosowac CAN? Odpadnie ci cala upierdliwosc z obmyslaniem jak zrobic multimaster namagistrali, ktora do tego nie byla projektowana. Kontrolery CAN wszystko realizuja sprzetowo, sa tez AVRy z wbudowanym kontrolerem CAN.
  • #16 7703135
    dorotazukowo
    Poziom 11  
    Niestety urządzenia są już gotowe. A co do CAN to nigdy jeszcze nie miałam z tym styczności. W sumie to mam jeszcze w każdym z urządzeń dojście do pinów Rxd i Txd oraz kilku innych. Nie wiem w jaki sposób działa Can i jak się komunikuje oraz jak wygląda sieć.

    Właśnie widzę że są dostępne układy CAN na I2C. Czy są może takie które mogą pracować na UART .Fajnie jak by można było komunikować się tak jak przez UART.
  • Pomocny post
    #17 7703694
    tmf
    VIP Zasłużony dla elektroda
    Sa takie, ktore maja SPI. Czy sa CANy z UARTem to trzebaby poszperac. Natomiast jesli masz juz to zmontowane na RS485 to po prostu przed nadawaniem sprawdzaj stan magistrali, jesli przez okreslony czas jest wolna to nadawaj. Kazdy pakiet odbiornik musi potwierdzic ACKiem, jesli nie potwierdzi to nadajnik po losowym czasie bezczynnosci ponownie go nadaje. Nie jest to super efektywne, ale proste i w sieciach, w ktorych obciazenie jest niewielkie (a co za tym idzie niewielkie prawdopodobienstwo kolizji) dziala to ok. Kazdy pakiet oczywiscie musi miec CRC, zeby odbiornik mogl sprawdzic integralnosc danych i wysylal ACKa tylko wtedy, kiedy otrzyma prawidlowy pakiet.
  • #18 7703904
    dorotazukowo
    Poziom 11  
    Obciążenie sieci będzie znikome. Ale mam głupie pytanie. W jaki sposób (chodzi o polecenie w Bascomie) sprawdzić stan magistrali. Jak ustawiać Max-a na nadawania i odbieranie to wiem ale jak sprawdzać stan sieci?
    Czy po prostu chodzi Ci o to że przez jakiś czas żaden z modułów nic nie nadaje to wtedy uznajemy że jest pusta? Jeśli tak to troszkę to chyba gorsze jednak to rozwiązanie niż poprowadzenie specjalnej linii kontrolnej. Nie miałam nigdy do czynienia z RS485 i może piszę bzdury ale kieruję się logiką.
  • Pomocny post
    #19 7703959
    netsecurite.pl
    Poziom 13  
    najlepiej odbierać i nadawać w przerwaniach od uart'u
    a nadawanie zaczynać przez wysłanie na magistralę np określonego bytu który powoduje że inne urządzenia które dokonują nasłuchu na magistrali są zablokowane na nadawanie danych przez np 2 sekundy oczekując w ciągu tego czasu danych które będą wysyłane
  • #20 7704056
    dorotazukowo
    Poziom 11  
    Metoda idealna i prosta w realizacji! Tak też zrobię. Dzięki
  • #21 7704735
    michalko12
    Specjalista - Mikrokontrolery
    netsecurite.pl napisał:
    najlepiej odbierać i nadawać w przerwaniach od uart'u
    a nadawanie zaczynać przez wysłanie na magistralę np określonego bytu który powoduje że inne urządzenia które dokonują nasłuchu na magistrali są zablokowane na nadawanie danych przez np 2 sekundy oczekując w ciągu tego czasu danych które będą wysyłane


    A równo po 2 sekundach odezwą się wszystkie, które w ciągu tych 2 sekund zebrały dane do wysłania. MOzna próbować zamiast stałego czasu, stały minimalny czas + losowa wartość.
  • #22 7705541
    tmf
    VIP Zasłużony dla elektroda
    Dokladnie. Nie ma sensu nadawac specjalnych znakow, bo sam fakt, ze pojawia sie cos na magistrali ma byc sygnalem dla innych, ze maja siedziec cicho. Zwykle w takich sytuacjach przyjmuje sie, ze urzadzenie moze nadawac jesli wykryje, ze magistrala jest w stanie bezczynnosci przez czas trwania rowny kilku znakom - daje to gwarancje, ze rozpoczetej transmisji nic nie przerwie. To oczywiscie nie gwarantuje braku kolizji. Mozna to zagwarantowac jesli czas od wykrycia ostatniej transmisji do chwili nadawania zalezy od adresu mastera. Wtedy jest zagwarantowane, ze zadne dwa nadajniki w sieci nie maja tego samego opoznienia w zwiazku z tym nie moga zaczac jednoczesnego nadawania. Co do dodatkowej linii - przeciez czy wykrywasz brak aktywnosci na magistrali, czy tez stan dodatkowej linii to jest to dokladnie to samo. Stad tez zadne dodatkowe linie nie sa potrzebne.
  • #23 8235676
    dorotazukowo
    Poziom 11  
    Problem rozwiązany poprzez zastosowanie w systemie dwóch na przemian nadających masterów. Każdy posiada własne i bezpieczne opóźnienie i żadne inne urządzenie nie ma prawa nadawania w odpowiednim przedziale czasowym. Oczywiście podczas nadawania wszystkie pozostałe urządzenia są w nasłuchu do czasu otrzymania specjalnego znaku informującego że master czeka na odpowiedź od wybranego modułu.

    Problem rozwiązany, Dziękuję.
REKLAMA