Pytanie:
Półdupleks: jak zapobiec zwarciu?
feklee
2018-04-12 14:58:57 UTC
view on stackexchange narkive permalink

Rozważ dwa Arduino (ATmega328P), z pinami 2 połączonymi w celu komunikacji w trybie półdupleksu (np. przy użyciu SoftwareSerialWithHalfDuplex):

Direct connection of pins 2

Oba Arduino mogą transmitować w tym samym czasie, ze względów logicznych lub jeśli coś jest nie tak.W takim przypadku jeden Arduino może ustawić pin 2 na wysoki, a drugi Arduino może ustawić go na niski.Rezultatem jest zwarcie.Aby ograniczyć prąd do 5mA, mógłbym dodać rezystor 1kΩ:

Connection with resistor

Czy to preferowane rozwiązanie?Czy coś mi brakuje?

Przeczytaj uważnie odpowiedź Pipe.Schemat w jego odpowiedzi nie jest kompletny.Ponieważ nie znasz rozwiązania, podejrzewam, że nie wiesz, czym jest rezystor podciągający.„Rezystor podciągający” Google.I tak, rura jest poprawna: nie komunikuj się, ustawiając pin wysoko i nisko.Komunikuj się, zakodowując pin na stałe w stan niski i ustawiając go jako wejście i wyjście.Gdy jest w trybie wyjściowym, będzie próbował rozładować całe napięcie na linii, dając 0. W trybie wejściowym nie będzie wytwarzać żadnego napięcia, więc rezystor podciągający może swobodnie dostarczać napięcie, dając ci 1. Jeśli oba przesyłają 0 = brak problemu.Oba przesyłają 1 również nie ma problemu
@slebetman Zajrzyj do [sekcji pomocy dotyczącej komentarzy] (https://electronics.stackexchange.com/help/privileges/comment), aby dowiedzieć się, jak używane są komentarze dotyczące wymiany stosów.Jeśli są problemy z moją odpowiedzią, komentarz należy tam.Jeśli chcesz odpowiedzieć na pytanie, opublikuj je jako prawdziwą odpowiedź, na którą można głosować.Odpowiedzi w komentarzach są sprzeczne z modelem Stack Exchange, polegającym na sprawdzaniu odpowiedzi przez społeczność.
Dwa odpowiedzi:
pipe
2018-04-12 15:06:40 UTC
view on stackexchange narkive permalink

To rozsądny sposób rozwiązania problemu z przypadkowymi kolizjami

Inną popularną metodą jest użycie wyjścia otwartego drenu. To jest metoda używany przez I2C, aby zapewnić, że dwa kolidujące ze sobą sterowniki nie będą pobierać zbyt dużego prądu i aby zapewnić, że sygnał będzie albo niski, albo wysoki, a nie coś pomiędzy.

enter image description here

W ten sposób możesz podłączyć tyle wyjść, ile chcesz, ponieważ albo nic nie robią, albo podłączają wyjście do masy. Jeśli dwa lub więcej pinów kieruje ten sam sygnał do masy, nic złego się nie dzieje.

Aby to zadziałało, potrzebny jest pojedynczy rezystor podciągający na magistrali, a ponieważ nikt aktywnie nie napędza wysokiego sygnału, powoduje to niższą maksymalną przepływność.

Ponieważ używasz interfejsu szeregowego opartego na oprogramowaniu, powinno być łatwe do dostosowania do Twoich potrzeb. Zamiast konfigurować porty jako wyjścia push-pull, a następnie ustawiać je jako niskie lub wysokie, ustawiasz je jako wejścia z podciąganiem, gdy mają być wysokie wyjściowe lub input i ustaw je jako output low , gdy mają być output low .

Możesz naśladować otwarty odpływ za pomocą funkcji Arduino.W setup (), ustaw pin nisko za pomocą `digitalWrite (pin, LOW)`.Podczas komunikacji przełączaj między wejściem i wyjściem za pomocą `pinMode (pin, INPUT)` dla wysokiego i `pinMode (pin, OUTPUT)` dla niskiego.Lub użyj bezpośrednio rejestrów IO, ustawiając odpowiedni bit PORT na niski i przełączając odpowiedni bit DDR.
Możesz nawet użyć `pinMode (pin, INPUT_PULLUP)` do wysyłania 'high', używając wewnętrznych rezystorów podciągających AVR.
@JimmyB: To jednak nie chroni przed błędami programistycznymi.
@TomCarpenter Zgrabna sugestia!Jako efekt uboczny i jeśli się nie mylę, technika ta pozwala jednemu Arduino - podczas transmisji - wyczuć, czy drugi również nadaje.Byłoby to bardzo przydatne w przypadku danej aplikacji.
@feklee I2C może wykryć kolizje magistrali, odczytując wartość pinu za każdym razem, gdy zapisuje trochę.Jeśli zapisuje jedynkę, ale odczytuje zero, wie, że ktoś inny używa tej linii, więc poddaje się.
@JimmyB możesz, ale musisz być ostrożny.Jeśli używasz rezystora podciągającego, musisz pamiętać o wyłączeniu podciągania przed zmianą na wyjście.W przeciwnym razie poprowadzisz linię wysoko.
@JimmyB Jak właśnie dowiedziałem się z [odpowiedzi] (https://electronics.stackexchange.com/a/371764/21817) na inne pytanie, trzeba dodać opóźnienie między wyciągnięciem zawleczki a odczytaniem jej: „To wymaga czasudla rezystancyjnego pullup w AVR, aby wyciągnąć pin wysoko. ”Wynikające z tego spowolnienie komunikacji może być niepożądane.
Dave Tweed
2018-04-12 15:07:57 UTC
view on stackexchange narkive permalink

Jest tak samo dobre, jak wszystko inne.Alternatywą byłoby działanie pinów w trybie otwartego drenu, ale wtedy potrzebny byłby zewnętrzny rezystor podciągający.



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...