USART i wiele odbiorników

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?

Reply to
TRS
Loading thread data ...

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?

Reply to
Pszemol

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...

Reply to
TRS

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.

Reply to
Pszemol

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!

Reply to
dziadek Ben

Powitanko,

A na jakiej kosci?

Pozdroofka, Pawel Chorzempa

Reply to
Pawel "O'Pajak

MAX3075

Reply to
dziadek Ben

Powitanko,

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

Pozdroofka, Pawel Chorzempa

Reply to
Pawel "O'Pajak

Pszemol napisał(a):

Raczej OR, chyba że nadajesz w logice odwrotnej.

pozdr

Radek

Reply to
invalid unparseable

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...

Reply to
Pszemol

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.