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

rs485, full-duplex, nie można wysyłać jedncześnie.

zibi11 12 Sty 2007 19:01 2629 8
  • #1 3438383
    zibi11
    Poziom 19  
    Posty: 539
    Pomógł: 1
    Ocena: 30
    Witajcie zrobiłem magistrale rs485 full-duplex 4 przewody


    ............... rs485
    atmega ====== komputer
    .................. ||
    ................. attiny


    dałem terminatory 120 om

    Wysyłając sygnał (bez konkretnego adresu mikrokontrolera) z komputera
    dane zostały debrane przez oba mikrokontrolery jednocześnie (tak miało być)

    Co w przypadku jak chciałbym wysłać z atmegi i attiny jednocześnie do terminala nie da się
    da się tylko albo dane z jednego albo z drugiego mikrokontrolera dlaczego???



    (z attiny)
    Do

    Print "test"

    wait 2

    Loop

    (z atmegi)
    Do

    Print "test1"
    wait 1

    Loop
  • #2 3438407
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    Ano dlatego, że jak nadają na jednej linii dwa procesory to jest na niej... No właśnie - kto to wie co...

    Analogia - ty i dwóch kolegów, Ty do nich wołasz, oni słuchają i usłyszą, a potem oni obydwaj równocześnie zaczynają wołać do Ciebie. Owszem coś usłyszysz ale zrozumieć masz małe szanse.
  • #3 3438415
    zibi11
    Poziom 19  
    Posty: 539
    Pomógł: 1
    Ocena: 30
    co zrobić żeby jeden nadawał potem drugi
    czyl sprawdzał czy inny nie nadaje i potem wysyłał???
    może prosty przykład w bascomie???
  • #4 3438440
    jacur
    Poziom 32  
    Posty: 1748
    Pomógł: 166
    Ocena: 295
    Pasowało by je zaadresowac. Tak aby na wysłaną komende odzywał sie wołany a nie czałe stado ;). Moze to byc naprzykład kilka bajtów z rozkazem w którym jeden bajt bedzie maił unikalny numer odpowiadajacy tylko jednemu układowi.
  • #5 3438447
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    Na takie okoliczności wymyślono protokoły Master - Slave, polega to na tym, że jeden uC jest nadrzędny (Master) i to on kolejno odpytuje pozostałe (Slave). Inne procesoery/urządzenia nie zapytane przez układ nadrzędny milczą.
    Wiąże się to z opracowaniem jakiegoś protokołu (można skorzystać z gotowych MODBUS PROFIBUS itp.), dodatkowo każde urządzenie (bo to nie mysi być tylko uC) musi mieć swój indywidualny adres.
  • #6 3440641
    zibi11
    Poziom 19  
    Posty: 539
    Pomógł: 1
    Ocena: 30
    System z masterem i slavami jeso ok
    Jak mając dwa układuy u1 i u2 do magistralli rs485
    sprawdzić że nadaje np u1 wtym czasie u2 sprwadza że linia zajęta
    i nic nie nadaje jak sprawdzi że wolna to zaczyna nadawać i odwrotnie
    u2 sprawdza i jak wolna magistrala to nadaje??
    jaki jest stan linii w momencie nadawania i odbioru??
    może kawałek kodu w bascomie?
  • #7 3440788
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    Witam,

    mając nawet wiele układów w tej magistrali, jeśli zdecydujesz się np na takie rozwiązanie, że jeden z nich będzie masterem i to on będzie zarządzał magistralą to możesz to zorganizować np w taki sposób:

    Wybierasz sobie Mastera i to on cyklicznie co jakiś ustalony przez ciebie czas odpytuje (adresując uprzednio zapytanie) kolejne układy typu Slave. Jeśli Slave widzi, że przychodzi zapytanie ale nie ma w nim jego adresu to siedzi poprostu cicho ;)

    Oczywiście nic nie stoi na przeszkodzie aby Slave w czasie zapytania od Mastera i po udzieleniu mu odpowiedzi - sam nie zapytał o coś Mastera i poczekał na odpowiedź - po czym dopiero wysłałby do Mastera info, że to już wszystko i on zwalnia magistralę. Wtedy Master ponawia cykl - zapytaniem do kolejnego Slave'a

    .... jeśli natomiast koniecznie chciałbyś mieć możliwość aby każdy mógł gadać z każdym w "dowolnej" chwili tak aby nie było kolizji to można to zrobić także w oparciu o poprzedni model, tzn Master wysyła zapytanie do SLAVE'a i udziela mu czasu w magistrali do momentu gdy nie załatwi on swoich spraw czyli nie zada pytań tym układom z których potrzebuje zassać jakieś dane. Po zrobieniu wszystkiego zwraca kontrolę do Mastera a ten jeśli sam nie ma żadnych pytań to przekazuje "pałeczkę" lub określa się taką wymianę zezwolenia "żeton" lub "token" do kolejnage Slave'a. Oczywiście trzeba sobie założyć jakieś maksymalne długie czasy w ciągu których taki Slave może gadać na magistrali i jeśli je przekroczy to Master się wkurzy i po upłynięciu czasu TimeOut zabierze mu TOKEN, może to spowodować kolizję, ale w każdego Slave'a trzeba wbudować mechanizm, że gdy dojdzie do kolizji to ma przestać nadawać, i uznać że stracił TOKEN czyli buzia w kubeł i siedzieć cicho ;) - to jest też ważne w przypadku gdy poprostu taki Slave gdy otrzyma akurat TOKEN - umrze, spali się itp ;)

    .... oczywiście to jest tylko jakaś propozycja, choć podobna do rozwiązania w sieciach ArcNet. W nich jest tak, że każdy układ w magistrali po kolei dostaje TOKEN - robi swoje i przekazuje go następnemu o wyższym adresie. A ten o najwyższym adresie po załatwieniu swoich spraw przekazuje go pod najniższy adres poza zerowym, który służy do rozgłaszania ... to tak w ogólnym skrócie ;) ...

    jak więc widzisz wszystko zależy od twojej inwencji a napisanie do tego jakiegoś softu nie powinno graniczyć z cudem. Trzeba tylko albo opracować swój własny standard, czasem prosty - taki na swoje potrzeby albo skorzystać z gotowca jak zdaje się ModBus itp..

    ja taki protokół opieram na tzw ramkach. Tzn każda informacja przesyłana jest w postaci ramki o konkretnej strukturze gdzie np na początku są jakieś 2 znaczniki startu, później adres układu dla którego jest ona przeznaczona, potem komenda, potem ilość bajtów danych, które teraz będą lecieć a zaraz po tej ilości właśnie bajty tych danych ;) a na końcu jedna albo ze dwie sumy kontrolne ;)

    pozdrawiam
  • #8 3441608
    zibi11
    Poziom 19  
    Posty: 539
    Pomógł: 1
    Ocena: 30
    Jeszcze jedno pytanko o sprawdzenie poprawności przesyłu
    crc jak to robicie w praktyce?
  • Pomocny post
    #9 3441693
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    można na miliony sposobów ja użyłem akurat narazie na moje potrzeby najprostszego chyba ;) ... zliczam sumę XOR wszystkich po kolei bajtów w ramce i jako ostatni bajt leci ta suma. W odbiorniku robi się sytuację odwrotną też przez XOR i wynik musi się zgadzać z ostatnim bajtem

    pozdr

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu jednoczesnej transmisji danych na magistrali RS485 full-duplex z wykorzystaniem dwóch mikrokontrolerów (ATmega i ATtiny) podłączonych do komputera. Wysyłanie danych jednocześnie z obu mikrokontrolerów do terminala powoduje kolizję sygnałów, co uniemożliwia poprawne odbieranie informacji. Przyczyną jest fakt, że na jednej linii transmisyjnej nie można nadawać jednocześnie z dwóch źródeł bez ryzyka zakłóceń. Proponowane rozwiązania obejmują implementację protokołu Master-Slave, gdzie jeden mikrokontroler pełni rolę nadrzędną (Master) i kolejno adresuje pozostałe urządzenia (Slave), które odpowiadają tylko na swoje unikalne adresy. W ten sposób unika się kolizji i zapewnia kontrolę dostępu do magistrali. Wskazano również na konieczność opracowania protokołu komunikacyjnego z adresacją oraz mechanizmem sprawdzania zajętości linii przed nadawaniem. Dodatkowo omówiono prostą metodę kontroli poprawności transmisji danych za pomocą sumy kontrolnej CRC realizowanej przez operację XOR wszystkich bajtów ramki. Przykłady kodu w Bascom sugerują implementację sprawdzania stanu magistrali i sekwencyjne nadawanie danych przez urządzenia.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA