USART i wiele odbiorników

May 02, 2006 9 Replies

Właśnie próbuję stworzyć jakiś system komunikacji w pewnym systemie. Będzie się on opierał na centralnym mikrokontrolerze ATmega 128 i różnych układach peryferyjnych. Teraz powstaje kwestia komunikacji między tym wszystkim. Wymyśliłem sobie że najłatwiej będzie mi oprzeć się na wbudowanym układzie USART. Idea jest taka:



- ATmega pracuje jako centralny procesor i w razie potrzeby odpytuje sobie poszczególne układy o jakieś informacje.



- układy peryferyjne sobie tylko słuchają Układ taki ma tą zaletę (tak mi sie wydaje) że odpadają kolizje nadawania a wszystkie układy mogę sobie równolegle podpinać prawie do woli. Tylko teraz mam pytania do ludzi bardziej doświadczonych w takiej materii. Ma to prawo wogóle działać? Czy potrzebne będą mi jakieś układy pośredniczące? Czy mogę sobie po prostu bezpośrednio pospinać wszystkie URATy z peryferiów (działać to będzie na niewielkiej odległosći rzędu metra, może dwóch i zasilane będzie z tego samego źródła zasilania)? Mam się spodziewać jakichś sporych niespodzianek przy próbie uruchomienia takiego systemu?


Możesz tak zrobić tylko wtedy, gdy nadajnik pracuje w trybie open-drain a nie w trybie push-pull. Nie znam tych Twoich "peryferiów, ale zgaduję że nadajnik pracuje w trybie push-pull, czyli masz dwa tranzystory w stopniu wyjściowym i dla stanu H linię masz zwartą jednym tranzystorem z Vcc a dla stanu L linia jest zwarta z GND drugim tranzystorem. W obu przypadkach drugi tranzystor jest wyłączony, czyli nie przewodzi. Teraz jeśli podłączysz dwa takie nadajniki do wspólnej linii to w stanie idle oba będą dawać na linii Vcc bo górny tranzystor będą miały przewodzący. Jak jeden z nich zacznie nadawać to zacznie zwierać Vcc do masy GND przez swój otwarty dolny tranzystor i otwarty górny tranzystor kolegi. W zależności od szybkości transmisji i długości trwania znaku (9x bit 0 w 0x00) możesz po prostu spalić sobie nieodwracalnie wyjścia albo dostać stany nieustalone (ani H ani L).

Jeśli w układzie masz tylko jednego mastera i reszta to slaves to rozwiązanie jest następujące: podłączasz nadajnik ATmegi do wszystkich odbiorników Twoich peryferiów a nadajniki tych peryferiów podłączasz do wielowejściowej bramki AND której wyście będzie sterować wejściem ATmegi. W rozwiązaniu tańszym mógłbyś zastosować po prostu tranzystory w układzie open-drain podłączone do wyjść nadajników peryferiów zamiast bramki AND i zrealizować taką funkcję AND na tranzystorach open-drain.

Teraz już software musi zapewnić że nie zdarzy się sytuacja, że któryś z peryferiów odezwie się wtedy, gdy gada inny...

A ta ATmega nie ma przypadkiem interfejsu I2C lub OneWire?

Pszemol napisał(a):

Najczęściej będą to inne AVRy ze sprzętowym UARTem...

Czyli jednak zachodzi potrzeba stosowania "pośrednika" :) Nie zagłębiałem się aż tak w budowę stopni wyjściowych pinów na których wisi UART w AVRach... Ale chyba będzie trzeba pogrzebać...

Ma, ale chciałbym to uczynić jak najbardziej uniwersalnym rozwiązaniem a w momencie gdy do któreś urządzenie końcowe będzie popędzane np. z '2051 to musiał bym w nim implementowć programowo I2C czy 1wire. A UARTa mam w większości popularnych procesorów dostępnego w formie sprzętowej. IMHO duża wygoda...

No to pozostaje Ci jedna duża bramka AND lub te tranzystorki. Ale rozwiązanie z tranzystorkami jest gorsze... Przy tranzystorkach nie zapomnij też o tym, że jeden stopień odwraca polaryzację sygnału, więc po tych kilku open drain daj tuż przed wejściem RX ATmegi jeszcze jeden tranzystor odwracający spowrotem polaryzację sygnału tak, aby w stanie "idle" poziom napięcia na wejściu TTL uarta był wysoki... Dobierając oporniki nie zapomnij też o stałej RC wpływającej na szybkość przełączania jeśli masz duże prędkości transmisji. Najbezpieczniej będzie jednak dodać wielowejściową brameczkę AND i będzie z głowy. Najlepiej kup taką co ma kilka zapasowych wejść na wypadek gdybyś kiedyś rozbudował swój układ i te niewykorzystane wejścia bramki podciągnij rezystorem do Vcc.

Nie znam ATmegi: w moim układzie z 51-kami, gdzie centralny procek odpytuje pozostałe 128 procków przeszedłem po prostu na RS-485 - zero problemów!

Powitanko,

A na jakiej kosci?

Pozdroofka, Pawel Chorzempa

Powitanko,

Dzieki, up to 256 receivers, niezla kostka:-)

Pozdroofka, Pawel Chorzempa

Pszemol napisał(a):

Raczej OR, chyba że nadajesz w logice odwrotnej.

pozdr

Radek

UART wychodzący z CPU czyli posiadający poziomy TTL (Gnd/Vcc) ma polaryzację taką, że w stanie idle daje Vdd, bit stopu to Gnd potem bity danych odpowiadają wprost poziomom napięcia: leci po kolei D0, D1.... D7, bit parzystości i bit stopu równy jest stanowi Idle, czyli Vdd. Bramka AND działa tak, że jej wyjście jest w stanie H gdy WSZYSTKIE wejścia sa w stanie H. A więc UART ATmegi będzie w stanie idle gdy wszystkie uarty peryferiów bedą w stanie idle. Jeśli choć jeden uart zacznie nadawać to zmieni stan wejścia bramki AND i uart ATmegi zobaczy to jako bit startu i bity danych...

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required