Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

ATmega8 - USART pytania dotyczące zasilania

David.C 21 Dec 2012 23:02 5493 42
Optex
  • #1
    David.C
    Level 9  
    Witajcie, ostatnio mam problem z komunikacją między dwoma mikroprocesorami ATmega8. Transmisja odbywa się przy użyciu USART. Pierwszy mój problem to kwestia zasilania. Mikrokontrolery oddalone będą o siebie o ponad 50m, co stwarza wiele problemów. W dodatku do transmisji mam tylko 2 żyły, co dodatkowo utrudnia pracę. Transmisja ma odbywać się w jedną stronę. Problem jest taki: jeśli podłączę oba uC do tego samego zasilania to wszystko działa prawidłowo. Jeśli podłącze uC do innych źródeł to nic nie działa. Oba uC mają kwarce 16mHz. Przed chwilą zrobiłem trochę inne rozwiązanie. Na 2 żyłach puściłem TxD i RxD. Oba uC były zasilanie osobnymi źródłami. Dodałem tylko przed zasilaniem stabilizator na 5V i wszystko działa, lecz nie jestem przekonany, co do tego rozwiązania. Wspólna masa również nie skutkuje.

    Proszę o pomoc, totalnie nie wiem już, co robić.

    Pozdrawiam
    Dawid
  • Optex
  • #2
    piotrva
    VIP Meritorious for electroda.pl
    A zanim był stabilizator 5V to jak był ten uC zasilany?
    Na pewno stabilizowane napięcie pomoże, pomocny może być też kwarc USART-friendly, jak np. 11059200Hz. Połączenie mas jest OBOWIĄZKOWE. Do transmisji w jedną stronę (bez żadnych danych zwrotnych) możesz wykorzystać tylko jedną linię RS232. Ewentualnie pomyśl nad RS485.
  • Optex
  • #3
    tehaceole

    Level 28  
    RS485 - tutaj kod DEDYKOWANY do komunikacji ze sobą 2 atmeg. Zaznaczam: TYLKO 2.
    piotrva wrote:
    Połączenie mas jest OBOWIĄZKOWE.
    Pod warunkiem, że łączy bezpośrednio ze sobą 2 usarty. Ale to raczej nonsens robić coś takiego na 50 metrach. Dla 485 masa jest zbędna, a wręcz nie wskazana jeżeli układy transceiverów 485 nie są izolowane galwanicznie od reszty układu.
  • #4
    BlueDraco
    MCUs specialist
    Wiesz, gdyby wystarczały dwa przewody, jeden dla RXD, drugi dla TXD, to w gniazdkach w ścianach byłaby jedna dziurka, a we wtyczkach zasilania - tylko jeden bolec.

    50 m to zdecydowanie za daleko dla takiej transmisji (z trzema żyłami oczywiście - musi być wspólna masa. Ogólnie jest to na ogół za daleko dla jakiejkolwiek transmisji asymetrycznej (czyli te stałym potencjałem odniesienia).

    Przy takich odległościach na ogół używa się par różnicowych - przyjrzyj się interfejsom RS485/RS422. Dla RS485 rzeczywiście wystarczą dwa przewody, ale trzeba w oprogramowaniu zadbać o przełączanie kierunku łącza - kiedy jeden nadaje - drugi odbiera, i odwrotnie.
  • #5
    piotrva
    VIP Meritorious for electroda.pl
    tehaceole wrote:

    piotrva wrote:
    Połączenie mas jest OBOWIĄZKOWE.

    (...)Dla 485 masa jest zbędna, a wręcz nie wskazana jeżeli układy transceiverów 485 nie są izolowane galwanicznie od reszty układu.

    http://www.chipkin.com/rs485-cables-why-you-need-3-wires-for-2-two-wire-rs485/
    Uuuu, a to mi nowość. Rozpatrzmy sytuację, gdy zasilamy 2 układy z różnych zasilaczy. Załóżmy, że różnica potencjałów między "masami" tych zasilaczy wynosi powiedzmy 40V. Co się stanie po podłączeniu MAX485, którego linie nie są przecież izolowane galwanicznie? Będzie on dostawał na swoje nóżki napięcia podniesione (lub obniżone) o 40V!!! A to dużo poza zakresem normalnej pracy tego układu...
  • #6
    tmf
    Moderator of Microcontroller designs
    tehaceole wrote:
    RS485 - tutaj kod DEDYKOWANY do komunikacji ze sobą 2 atmeg. Zaznaczam: TYLKO 2.
    piotrva wrote:
    Połączenie mas jest OBOWIĄZKOWE.
    Pod warunkiem, że łączy bezpośrednio ze sobą 2 usarty. Ale to raczej nonsens robić coś takiego na 50 metrach. Dla 485 masa jest zbędna, a wręcz nie wskazana jeżeli układy transceiverów 485 nie są izolowane galwanicznie od reszty układu.


    USART na 50m spokojnie da radę, to jest odległość zgodna ze specyfikacją. Przy RS485 masy układów zawsze muszą być połączone, ze względu na dozwolone napięcie wspólne dla transceivera, o czym pisze kolega piotrva. Należy zapewnić aby przewodem masy nie płynął prąd, ale to już zupełnie inna kwestia.
  • #7
    piotrva
    VIP Meritorious for electroda.pl
    tmf wrote:
    USART na 50m spokojnie da radę, to jest odległość zgodna ze specyfikacją.

    Zależy to imho nie tylko od specyfikacji, ale także od tego na jakim kablu i w jakim otoczeniu ten kabelek sobie leży ;-)
    tmf wrote:
    Należy zapewnić aby przewodem masy nie płynął prąd, ale to już zupełnie inna kwestia.

    No to jest druga kwestia, bo jak w mojej sytuacji połączymy masy to zasilacz się pewnie nieco zbuntuje ;-) A jeśli masy nie będzie to się mogą MAX485 zbuntować :D
  • #8
    johny_w
    Level 21  
    tehaceole:
    Quote:
    Dla 485 masa jest zbędna

    Powiedz to mojemu klientowi, któremu przestała kiedyś działać komunikacja. Zadzwonił i powiedział że "interface is hot". Na miejscu okazało się, że konwerter RS485-USB był prawie spalony. Max485 miał krater na obudowie i był już "przyspawany" do ścieżek. Płytki nie dało się uratować.
    Powód? Różnica potencjałów pomiędzy komputerem a urządzeniami odbiorczymi ponad 30V.

    Quote:
    a wręcz nie wskazana jeżeli układy transceiverów 485 nie są izolowane galwanicznie od reszty układu.

    Właśnie izolacja galwaniczna eliminuje problemy różnicy potencjałów.

    David.C: jak już wspomniał BlueDraco, 50m to za dużo dla transmisji TTL.

    piotrva:
    Quote:
    pomocny może być też kwarc USART-friendly, jak np. 11059200Hz

    To jest kolejny absurd propagowany przez szkoły. Np. 0,2% błędu przy zegarze 16Mhz nie stanowi żadnego problemu.
  • #9
    tmf
    Moderator of Microcontroller designs
    W typowych warunkach 50 m to nic dla USART. O RS485 warto by przy tej odległości pomyśleć w warunkach przemysłowych, gdzie poziom zakłóceń może utrudnić transmisję.
    Co do kwarcu USART-frendly, warto też pamiętać, że przy połączeniach AVR-AVR stosujących te same kwarce błąd będzie wynosił zawsze 0%. Dlaczego? Ano dlatego, że podzielenie stałej przez stałą zawsze daje ten sam wynik, niezależnie od egzemplarza użytego AVRa :)
  • #10
    piotrva
    VIP Meritorious for electroda.pl
    Ja akurat tego nie nauczyłem się w żadnej szkole, a owszem, dla 2 procesorów AVR taktowanych takimi samymi kwarcami i z tak samo ustawionym UBRR to nie ma najmniejszego znaczenia.
  • #11
    David.C
    Level 9  
    W nocy udało mi się mniej więcej zrobić tą transmisję. Połączyłem procki kablem 100m i wszystko działało prawidłowo. Użyłem 2 żył, na których mam TxD i GND. Wszystko wydaje się działać prawidłowo, choć nadal mam jakąś niepewność, co do tego. Kabel będzie leżał w temp. minusowej, co dodatkowo utrudnia pracę (rzekomo wzrasta opór kabla na zimnie).
  • #12
    tmf
    Moderator of Microcontroller designs
    A co ma opór do tego? Weź policz sobie o ile wzrośnie, odpowiednie współczynniki masz w necie. USART wykorzystuje sterowanie napięciowe, a nie prądowe, więc pomijając pewne niuanse opór połączenia właściwie nie odgrywa roli, tym bardziej, że mówimy o jakiś pojedynczych omach.
  • #13
    tehaceole

    Level 28  
    tmf wrote:
    Przy RS485 masy układów zawsze muszą być połączone, ze względu na dozwolone napięcie wspólne dla transceivera
    TMF - wszystko zależy tutaj od konstrukcji zasilaczy naszych urządzeń. Jeżeli układy zasilane są z zasilaczy transformatorowych to połączenie może być ale nie musi. W przypadku zasilania urządzeń z wbudowanego zasilacza impulsowego wielokrotnie spotykałem się z połączeniem ujemnego bieguna zasilania z obwodem ochronnym - na wypadek przebicia w zasilaczu. W takiej sytuacji połączenie mas 2 tak zasilanych urządzeń może przynieść katastrofalne skutki. Tu dobrym nawykiem jest zatem separacja galwaniczna magistrali od reszty układu.

    Co jak co TMF, ale z wszelakiej maści urządzeniami wyposażonymi w RS485 mam do czynienia od wielu lat na codzień. Spośród znanych mi rozwiązań TYLKO I WYŁĄCZNIE moduły kontroli dostępu BiBi firmy Micromade umożliwiały połączenie mas - dlatego iż są separowane. W żadnym innym rozwiązaniu czy to dedykowanym dla systemów alarmowych (sterowanie PTZ itp.) czy to dla automatyki przemysłowej (Modbus, Profibus DP) nie spotkałem się z łączeniem mas urządzeń. Co innego, gdy ujemne bieguny zasilania łączone są z przewodem ochronnym. A co innego takie połączenie "wyrównawcze" pomiędzy układami wykonać z użyciem jednej z żył bądź oplotu przewodu sygnałowego.

    Oczywiście, aby uniknąć płonnej dyskusji, wykluczamy przypadek zasilania układu A (slave) przez układ B (master) np. napięciem 12V.

    Jj_Johnys wrote:
    Powiedz to mojemu klientowi, któremu przestała kiedyś działać komunikacja. Zadzwonił i powiedział że "interface is hot". Na miejscu okazało się, że konwerter RS485-USB był prawie spalony. Max485 miał krater na obudowie i był już "przyspawany" do ścieżek. Płytki nie dało się uratować.
    Powód? Różnica potencjałów pomiędzy komputerem a urządzeniami odbiorczymi ponad 30V.
    Wadliwy zasilacz w komputerze, źle wykonane podłączenie zasilacza lub problem z pzrwodem ochronnym instalacji elektrycznej.
    Teraz wyobraź sobie, że łączysz te 2 układy cieniuteńkim przewodem stanowiącym żyłę przewodu sygnałowego. Skąd wiesz jaki prąd będzie przezeń płynąć?
    Jj_Johnys wrote:
    Właśnie izolacja galwaniczna eliminuje problemy różnicy potencjałów.
    To przecież od samego początku o tym piszę. W przytoczonym rozwiązaniu firmy Micromade magistrala wykonana jest w oparciu o skrętkę. Ale zamiast użyć jednej pary, użyte są 2. Po jednej z żył z obu par złączone są do kupy i wpięte pod masę. I jest to wyraźne zalecenie producenta - układy są separowane galwanicznie a połączenie mas (tych separowanych) ma wpływać wg producenta na zmniejszenie podatności na zakłócenia. Ale mowa o masach po separacji a nie o masach układu.

    Proszę spojrzeć na kable do transmisji danych np. z katalogu Bittnera lub LappKabel. Dla 485 mamy DWIE żyły + OPLOT. Oplot podłączany jest do uziemienia szafy. To czy masa układu (np.PLC) połączona będzie z uziemieniem to kwestia wtórna, w żadnym jednak przypaku nie jest to równoznaczne ŁĄCZENIU MAS OBU URZĄDZEŃ.

    Skoro w przypadku RS485 łączenie mas urządzeń jest zdaniem Kolegów obligatoryjne i nie podlegające dyskusji - to czemu u licha 99% producentów uparła się i robi przyłącza magistrali 485 tylko dla 2 przewodów: A i B ? Czemu producenci ślepo ufają w mityczną wszechwiedzę instalatorów wierząc na słowo, że każdy z nich we własnym zakresie dokona odrębnego połączenia mas urządzeń?
  • #14
    BlueDraco
    MCUs specialist
    Kolego, to nie chodzi o rezystancję przewodu, a o zakłócenia indukowane w przewodzie wskutek zupełnie dowolnych czynników. na takie odległości nie transmituje się danych liniami asymetrycznymi, bo zbierają one właśnie wszelkie możliwe zakłócenia. W pokoju być może to zadziała. Przełożysz przewód, pociągniesz go przy jakimś transformatorze czy wzdłuż innego przewodu (głośnik, sieć) i będzie działało jak będzie chciało. Jak nie będzie chciało - to nie będzie działało. Tak się nie projektuje sprzętu.
    Dodatkowo będziesz miał problem z różnicą potencjałów mas obu urządzeń zależną od stu różnych czynników (faza zasilania, konstrukcja obu zasilaczy), o czym kilku moich przedpiszców wspomniało. To nie jest zabawa - w złośliwym przypadku ta różnica może wynieść nawet 300 V.

    Rozwiązanie to RS485, najlepiej z izolacją galwaniczną przynajmniej po jednej stronie.
  • #15
    pepson
    Level 17  
    Jeżeli nie potrzebujesz zbyt dużych prędkości transmisji,
    to transoptor (np. 4N35) i dwa oporniki zapewniają mi bezbłędną
    transmisję na 2km przy prędkości 4800 (dalej nie miałem okazji wypróbować).
    Dla większych prędkości używam 6N135 ,6 ,7.
    Separacja galwaniczna uwalnia od wielu problemów.
  • #16
    David.C
    Level 9  
    Prędkość nie ma za wielkiego znaczenia. uC ma wysyłać tylko liczby z przedziału 1-40. W jaki sposób użyć transoptora? Na jakiej zasadzie ma to działać? Do 4n35 podłączam TxD i zasilanie, które ma być wysyłane? Na odbiorniku jak to będzie wyglądać? Dodam jeszcze, że oba uC zasilane są tymi samymi zasilaczami impulsowymi (dwa takie same zasilacze).
  • #17
    BlueDraco
    MCUs specialist
    Pomiędzy zasilanie i wyjście TxD mikrokontrolera włączasz diodę LED transoptora z rezystorem szeregowym. Do RxD podłączasz kolektor fototranzystora, podciągając wejście do plusa przez rezystor rzędu 4k7. Idealnie byłoby, gdyby transoptor był u odbiorcy - dotyczy to obu systemów, czyli potrzebne 4 przewody. Przy izolowanym RS485 byłyby tylko 2.

    Włącz te zasilacze do gniazdek i zmierz napięcie pomiędzy ich masami.
  • #18
    David.C
    Level 9  
    Napięcie między ich masami wynosi 0.6V. Ten układ muszę mieć gotowy na czwartek. Sklepu pozamykane. Muszę używać tylko części, które mam dostępne pod ręką. Transoptor się znajdzie, ale już fotorezystora nie mam. Same problemy z tą transmisją.
  • #19
    BlueDraco
    MCUs specialist
    To napięcie może być dowolne i zależy np. od tego, w którą stronę włożysz wtyczkę w gniazdko i w które gniazdko. Twoje gniazdka nie będą obok siebie. Co zrobisz, jak będzie 100 albo 300 V? - przypadek bardzo realny. O jakim fotorezystorze piszesz? potrzebny jest transoptor z wyjściem na foototranzystorze albo (lepiej) z wyjściem logicznym.
  • #20
    David.C
    Level 9  
    Hmm mój mały błą (myślałem w ogóle o innej rzeczy). Posiadam obecnie na stanie transoptor 4n35. Przy jego użyciu da się wykonać tą transmisję przy użyciu dwóch przewodów?
  • #21
    tmf
    Moderator of Microcontroller designs
    tehaceole wrote:
    tmf wrote:
    Przy RS485 masy układów zawsze muszą być połączone, ze względu na dozwolone napięcie wspólne dla transceivera
    TMF - wszystko zależy tutaj od konstrukcji zasilaczy naszych urządzeń. Jeżeli układy zasilane są z zasilaczy transformatorowych to połączenie może być ale nie musi. W przypadku zasilania urządzeń z wbudowanego zasilacza impulsowego wielokrotnie spotykałem się z połączeniem ujemnego bieguna zasilania z obwodem ochronnym - na wypadek przebicia w zasilaczu. W takiej sytuacji połączenie mas 2 tak zasilanych urządzeń może przynieść katastrofalne skutki. Tu dobrym nawykiem jest zatem separacja galwaniczna magistrali od reszty układu.

    Co jak co TMF, ale z wszelakiej maści urządzeniami wyposażonymi w RS485 mam do czynienia od wielu lat na codzień. Spośród znanych mi rozwiązań TYLKO I WYŁĄCZNIE moduły kontroli dostępu BiBi firmy Micromade umożliwiały połączenie mas - dlatego iż są separowane. W żadnym innym rozwiązaniu czy to dedykowanym dla systemów alarmowych (sterowanie PTZ itp.) czy to dla automatyki przemysłowej (Modbus, Profibus DP) nie spotkałem się z łączeniem mas urządzeń. Co innego, gdy ujemne bieguny zasilania łączone są z przewodem ochronnym. A co innego takie połączenie "wyrównawcze" pomiędzy układami wykonać z użyciem jednej z żył bądź oplotu przewodu sygnałowego.

    Oczywiście, aby uniknąć płonnej dyskusji, wykluczamy przypadek zasilania układu A (slave) przez układ B (master) np. napięciem 12V.

    Jj_Johnys wrote:
    Powiedz to mojemu klientowi, któremu przestała kiedyś działać komunikacja. Zadzwonił i powiedział że "interface is hot". Na miejscu okazało się, że konwerter RS485-USB był prawie spalony. Max485 miał krater na obudowie i był już "przyspawany" do ścieżek. Płytki nie dało się uratować.
    Powód? Różnica potencjałów pomiędzy komputerem a urządzeniami odbiorczymi ponad 30V.
    Wadliwy zasilacz w komputerze, źle wykonane podłączenie zasilacza lub problem z pzrwodem ochronnym instalacji elektrycznej.
    Teraz wyobraź sobie, że łączysz te 2 układy cieniuteńkim przewodem stanowiącym żyłę przewodu sygnałowego. Skąd wiesz jaki prąd będzie przezeń płynąć?
    Jj_Johnys wrote:
    Właśnie izolacja galwaniczna eliminuje problemy różnicy potencjałów.
    To przecież od samego początku o tym piszę. W przytoczonym rozwiązaniu firmy Micromade magistrala wykonana jest w oparciu o skrętkę. Ale zamiast użyć jednej pary, użyte są 2. Po jednej z żył z obu par złączone są do kupy i wpięte pod masę. I jest to wyraźne zalecenie producenta - układy są separowane galwanicznie a połączenie mas (tych separowanych) ma wpływać wg producenta na zmniejszenie podatności na zakłócenia. Ale mowa o masach po separacji a nie o masach układu.

    Proszę spojrzeć na kable do transmisji danych np. z katalogu Bittnera lub LappKabel. Dla 485 mamy DWIE żyły + OPLOT. Oplot podłączany jest do uziemienia szafy. To czy masa układu (np.PLC) połączona będzie z uziemieniem to kwestia wtórna, w żadnym jednak przypaku nie jest to równoznaczne ŁĄCZENIU MAS OBU URZĄDZEŃ.

    Skoro w przypadku RS485 łączenie mas urządzeń jest zdaniem Kolegów obligatoryjne i nie podlegające dyskusji - to czemu u licha 99% producentów uparła się i robi przyłącza magistrali 485 tylko dla 2 przewodów: A i B ? Czemu producenci ślepo ufają w mityczną wszechwiedzę instalatorów wierząc na słowo, że każdy z nich we własnym zakresie dokona odrębnego połączenia mas urządzeń?


    Może po prostu używasz urządzeń nie rozumiejąc jak są one skonstruowane? Pisząc o masie urządzeń chodzi o masę wspólną dla transceiverów RS485. One muszą pracować na wspólnym potencjale, ze względu na ograniczone do kilku woltów napięcie wspólne. O czym tu chcesz dyskutować? Weź sobie dowolną notę transceivera RS485 i sobie to sprawdź. Jak chcesz w układzie z niepołączoną wspólnie masą zapewnić, aby pomiędzy układami nie było więcej niż np. 7V? Szczegóły masz nawet w zaleceniach projektowych z TI:
    http://www.ti.com/lit/an/slla272b/slla272b.pdf
    Np. na rys. 10 masz obwód z separowanymi masami układów, ale nie transceiverów! Niewykluczone, że w jakiś układach są specjalne transceivery dla których różnice potencjałów mogą sięgać setek woltów, ale to nie są zwykłe transceivery RS485. Jeśli uważasz inaczej to może poprzyj swoje twierdzenia jakąś literaturą lub zaleceniami jakiejś firmy?
    Co do wykorzystania USART - wbrew pozorom to bardzo odporny protokół. W końcu RS232 też został wymyślony jako protokół przemysłowy. Odporność na błędy jest spora bo chyba wszystkie USARTy (a z pewnością te z AVRów) mają zaimplementowane mechanizmy korekcji, np. majority voting. Każdy bit jest samplowany wielokrotnie i za stan jest przyjmowana wartość z większości sampli. Jeśli mamy transmisję 9600 bps, to czas bitu to ok. 0,1 ms, dopólki zakłócenie nie zbliży się do tych wartości najpewniej w ogóle nie wpłynie na transmisję. A jak wpłynie to co? Nic, i dla USARTa i dla RS485 w tych zastosowaniach trzeba zrobić protokół z detekcją błędów. Można też po prostu obniżyć baudrate. Zresztą istnieją różne asymetryczne linie o dużych długościach, wystarczy spojrzeć np. na 1-wire.

    Dodano po 10 [minuty]:

    BTW, połączenia mas. Piszesz, że w MODBUS nie łączysz. To popatrzmy np. na zalecenia konsorcium ABB:
    http://www05.abb.com/global/scot/scot209.nsf/veritydisplay/22a5ebd880a1b64ec125735b004c2707/$file/2gcs212012a0050-rs-485%20installation%20and%20start-up%20guide.pdf
    Proszę, strona 6:
    "In a differential system the voltage produced by the driver appears across a pair of signal lines that transmit only one signal. A differential line driver will produce a voltage from 2 to 6 volts across its A and B output terminals and will have a signal ground (C) connection. Although proper connection to the signal ground is important , it isn't used by a differential line receiver in determining the logic state of the data line."
    Strona 12 - MODBUS RS485 Adapter i co mamy? A, B, GND. Więc coś nas oszukujesz kolego. No oczywiście, ABB to mała firemka, a ich sprzęt jest nieznany ;P więc może nie widzą co robią :)
  • #22
    David.C
    Level 9  
    Mam jeszcze pytanie. Czy jeśli używam USART w ATmega8 to mogę wykorzystywać porty INT0 i INT1 jako wejścia dla przycisków? Coś mi się wydaje, że to ze sobą koliduje i chcę się upewnić, że tak nie jest.
  • #24
    tehaceole

    Level 28  
    tmf wrote:
    MODBUS RS485 Adapter i co mamy? A, B, GND. Więc coś nas oszukujesz kolego. No oczywiście, ABB to mała firemka, a ich sprzęt jest nieznany ;P więc może nie widzą co robią
    TMF, znam oczywiście urządzenia "małej firemki ABB". :) Przytoczone przez Ciebie GND oznacza połączenie z potencjałem ziemi, uziemienie. Dla przykładu falownika: karta modbus lub profibus , np. dla Vacon: Istotnie - w gnieździe oprócz A i B występuje GND. Ale jest to pin połączony POTĘŻNYM POLEM MASY z metalową obudową falownika! (oczywiście w przypadki innych producentów, modeli obudowa może być z tworzywa, wtedy to połączenie występuje do PE).
    Służy ono do podłączenia oplotu kabla sygnałowego i ma niewiele wspólnego z łączeniem mas! Potencjały urządzeń są wymuszone przez podłączenie obudów do przewodu ochronnego instalacji. Owszem, mamy 2 urządzenia zasilane np. w 2 różnych miejscach obiektu. Różne potencjały pomimo połaczenia z uziemieniem. A mimo wszystko GND jak w Twoim opisie występuje. Dlaczego? Czy ja jestem matołem i tego nie rozumiem? Nie Kolego. Połączenie to występuje ponieważ szanujący się producenci robią separację galwaniczną magistrali a połączenie GND służy do połączenia OPLOTU KABLA sygnałowego z potencjałem uziemionej obudowy. Co nie jest równozanczne z tym, że minus zasilania transceivera również z tym potencjałem jest połączony. W przypadku, gdy jedno z urządzeń nie jest uziemione, usterka w jego zasilaczu spowodować może puszczenie pełnego napięcia sieci na kabel (oplot kabla, dodatkową żyłę) sygnałowy. Co innego gdy szlag trafia elementy struktury wewnętrznej transceivera, 99,99% przypadków kończy się odpaleniem połączeń wewnątrz scalaka. Ale jeżeli mamy podłączony oplot z obu stron, i w urządzeniu bez uziemienia dochodzi do przebicia to pełen prąd zwarciowy wali nam na całą magistralę.
    A teraz z grubej rury: w powyższym przypadku pół biedy jeżeli drugie urządzenie ma poprawne uziemienie i prąd zwarciowy znajdzie doń ujście. Trudno, coś sie spali. Wielkie mi halo.
    ALE NIEDOPUSZCZALNE JEST, ŻEBY USZKODZONE URZĄDZENIE ZEWNĘTRZNE WYMUSIŁO JAKIŚ POTENCJAŁ NA URZĄDZENIU DO KTÓREGO AKTUALNIE SIĘ DOBIERAMY W SZAFIE. Przecież nie chcemy nikogo zabić. Chyba...

    Reasumując - w zależności od konstrukcji połączonych urządzeń: osobiście średnio mnie interesuje czy będą one ze sobą gadać. Moim priorytetem jest jak najwyższe bezpieczeństwo. Gdy wiem, że urządzenia / zespół urządzeń są bezpieczne dla obsługi, wtdy dopiero biorę się za dopieszczanie takich niuansików jak np. poprawność komunikacji. Zawsze można wstawić dodatkowy repeater na magistrali itp. Ale tu już mówimy o obszarach automatyki przemysłowej a nie o domorosłym majsterkowaniu.
    Sam też wielokrotnie już wykonałem urządzenia używające 485. TMF - wiem z czym to się ję. Jednak bazuję na rozwiązaniach przemysłowych z którymi pracuję zawodowo a nie na rozwiązaniach z mojego stołu, które nie zawsze muszą być powszechnie akceptowane.



    Tak na marginesie - kiedyś w jednej z jednostek wojskowych niemalże wywołałem red alert, gdy panowie z łączności / krypto wywęszyli, że chcę masę z urządzenia w ich budynku połączyć z masą urządzenia w innym budynku. Nie muszę dodawać, że facet z 25-cio letnim doświadczeniem w łączności wojskowej ma ciut więcej do powiedzenia w tej kwestii niż ja.
  • #25
    tmf
    Moderator of Microcontroller designs
    Przecież gdyby to połączyć tak jak piszesz to natychmiast wywaliłoby różnicówkę. Kolego, zanim napiszesz kolejny post na stronę A4, a może zamiast tego - wskaż jakąkolwiek notę jakiegokolwiek większego producenta, który zaleca łączenie samego A i B, bez łączenia mas transceiverów przy wykorzystaniu zwykłych transceiwerów RS485 o jakich tu piszemy.
    Ja ci pokazałem dwie noty Texas Instruments i ABB w których wyrażnie piszą, że masy muszą być połączone a ty nadal swoje. Więc jeszcze raz - prosze o link do noty a nie własne przemyślenia.
  • #26
    David.C
    Level 9  
    Słuchajcie, transmisja przechodzi PRAWIE prawidłowo. Gdy klikam przycisk uC1 wysyła do uC2 informację o numerze klikniętego przycisku (w tym wypadku "2"). Na odbiorniku zrobiłem sobie coś takiego:

    
    int main()
    {
    	DDRC = 0xff;
    
    	USART_Init(MYUBRR);
    	sei();
    	
    	while(1)
    	{
    		data = USART_Receive();
    
    
    		int amount = 0;
    
    		if(data == "1")
    			amount = 1;
    		else if(data == "2")
    			amount = 2;
    		else if(data == "3")
    			amount = 3;
    		else if(data == "4")
    			amount = 4;
    		else if(data == "5")
    			amount = 5;
    		else if(data == "6")
    			amount = 6;
    		else if(data == "7")
    			amount = 7;
    		else if(data == "8")
    			amount = 8;
    		else if(data == "9")
    			amount = 9;
    		else if(data == "10")
    			amount = 10;
    		else if(data == "11")
    			amount = 11;	
    		else if(data == "12")
    			amount = 12;
    		else if(data == "13")
    			amount = 13;
    		else if(data == "14")
    			amount = 14;
    		else if(data == "15")
    			amount = 15;
    		else if(data == "16")
    			amount = 16;
    			
    		
    		int i;
    		
    		for(i = 0; i < amount; i++)
    		{
    			PORTC = 0xff;
    			
    			_delay_ms(250);
    			
    			PORTC = 0x00;
    			
    			_delay_ms(250);
    		}
    		
    		_delay_ms(2000);
    
    	}
    }
    


    Nadawanie sygnału działa prawidłowo - wysyła sygnał poprzez:

    
    	USART_Transmit("2");
    		
    	_delay_ms(250);
    


    Problem w tym, że dioda na odbiorniku zachowuje się w taki sposób:

    - Mruga 2 razy (prawidłowo)
    - 2s przerwy
    - Mruga 10 razy
    - 2s przerwy
    - Mruga 10 razy
    - 2s przerwy
    - Mruga 10 razy
    - Gaśnie na stałe

    W czym tutaj może być problem? Poniżej kod z funkcjami USART:

    
    #define FOSC 16000000
    #define BAUD 9600
    #define MYUBRR FOSC/16/BAUD-1
    
    void USART_Init(unsigned int ubrr)
    {
    	UBRRH = (unsigned char)(ubrr>>8);
    	UBRRL = (unsigned char)ubrr;
    
    	UCSRB = (1<<RXEN)|(1<<TXEN);
    	UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
    }
    
    
    void USART_Transmit(unsigned char data )
    {
    	while(!( UCSRA & (1<<UDRE)));
    
    	UDR = data;
    }
    
    unsigned char USART_Receive( void )
    {
    	while (!(UCSRA & (1<<RXC)));
    
    	return UDR;
    }
    
  • Helpful post
    #27
    pepson
    Level 17  
    Quote:
    Posiadam obecnie na stanie transoptor 4n35. Przy jego użyciu da się wykonać tą transmisję przy użyciu dwóch przewodów?

    Do transmisji jednokierunkowej z transoptorem ten dwużyłowy przewód
    w zupełności wystarczy.

    Tu jest przykładowe połączenie transpotora:
    http://www.electronics-tutorials.ws/articles/opto5.gif

    Ten transoptor powinien być zamontowany przy odbiorniku (ważne!).
    Z nadajnika wystarczą dwa przewody doprowadzone do diody w transoptorze.
    Ja nie lubię, gdy mam podpięty długi przewód do końcówki mikrokontrolera
    nawet jeżeli to jest wyjście, więc dodaję tranzystor PNP jako bufor.

    Dość ważny jest opornik na kolektorze tranzystora w transoptorze
    Jeżeli będzie miał zbyt dużą wartość, to zbocza impulsów bardzo tracą
    na stromości. Tak wtrąciłem, żebyś nie pomyślał, że wystarczy
    wewnętrzne podciąganie wejścia. (więcej jak 2..3kΩ nie polecam).

    Czasem stosuję podwójną optoseparację po obu stronach
    a sam tor transmisyjny zasilam z osobnego źródła.
    Ale takie fanaberie nie są Ci potrzebne.

    O widzę, że temat zmienia kierunek :)
  • #28
    David.C
    Level 9  
    Co do mojego problemu z tym wysyłaniem danych. Okazuje się, że problem powoduje zbyt długie przytrzymanie przycisku oraz drganie styków. Przed chwilą dodałem po przycisku kon. 10nF i rezystor 10kOhm do masy. Problem niby zniknął tylko jak przytrzymam przycisk to wysyła znowu nie wiadomo co. Jak to kurde rozwiązać. Czy uC ma w jakiś sposób tworzy kolejkę danych do wysłania? Wychodzi na to, że on po prostu wysyła mi coś załóżmy 10 razy (przy trzymaniu przycisku) i potem odbiera to przez kolejne 5 sekund (mruganie diody).
  • #29
    tmf
    Moderator of Microcontroller designs
    Zarówno nadajnik, jak i odbiornik mają swoje bufory, więc istnieje możliwość że nadajnik nada kilka bajtów. Z drugiej strony skoro to jest 50m to niezależnie co zastosujesz nie możesz sobie ot tak nadać bajt licząc, że po stronie odbiornika zostanie poprawnie odebrany. Musisz to opakować w jakąś ramkę danych, chociażby z CRC, żeby odbiornik mógł stwierdzić poprawność odebranych danych. Przy transmisji jednokierunkowej i tak co prawda niewiele możesz zrobić jeśli coś będzie nie tak, ale przynajmniej nie będziesz interpretować szumó jako dane.
  • #30
    David.C
    Level 9  
    Problem jest teraz znowu inny. Po włączeniu uC i kliknięciu przycisku wysyła mi "4". Po ponownym kliknięciu wysyła już prawidłowo "2". Przy trzymaniu przycisku tworzy się kolejka danych i mi didoa mruga co 2 sekundy (2 mrugnięcia). To tak nie może działać. Jak zrobić, aby trzymanie przycisku było równoznaczne tylko z jego kliknięciem? Rozwiązaniem może być stworzenie zmiennej "busy" i po prostu przy pierwszym kliknięciu ustawianie jej na 1. Funkcja wykona się dopiero gdy "busy" jest równe 2. Nie wiem czy to zadziała, ale można spróbować.