Skocz do zawartości

Ekspander portów z wyprowadzeniami UART


gbtbg

Pomocna odpowiedź

20 godzin temu, atMegaTona napisał:

Jeśli chodzi o SPI to faktycznie nie widzę tu problemu, można wszystkie urządzenia spi podłączyć do jednego portu a jedynie cs przez expander. Trzeba mieć tylko na uwadze fakt, że przełączanie CS będzie miało opóźnienie względem prędkości SPI ale nie powinno być to problemem przy niedużej ilości CS.

Jest lepszy sposób niż expander I2C. Lepiej jest zastosować np. 74hc595 podłączony do tego samego SPI, wtedy wystarczy 1 dodatkowy pin na enable dla rejestru 595 i masz tym sposobem 8 CSów kosztem 1 pinu µC.

Z jakiej biblioteki ta funkcja??

no np. RCSwitch funkcja enableReceive przyjmuje nr portu do którego podpięte jest wejście a enableTransmit wyjście.

przy BT też mam podać gdzie jest RX a gdzie TX. Generalnie wszędzie tam gdzie tworzę jakiś obiekt biblioteczny do obsługi modułu i mam podać na którym porcie (pinie) jest we/wy do niego. Co mam podać w przypadku expandera czy multipleksera? Multiplekser ok ale skąd obiekt radiówki ma wiedzieć że jak podaje 5 to ma skorzystać z obiektu expander i na nim wywołać np readDigital. Jest to do zrobienia ale każdą bibliotekę każdego modułu który chcę użyć trzeba przerobić abym mógł wskazać jak ma obsługiwać porty czy bezpośrednio czy przez obiekt.

Mi by się marzyło abym mógł zdefiniować w setup że jak podam np nr portu 80 to znaczy że chcę użyć ekspandera. Generalnie abym mógł podmienić wszystkie funkcje obsługi portów czyli pinMode, digitalRead, digitalWrite, analogRead i analogWrite swoimi które by wiedziały co mają w takiej sytuacji zrobić.

Link do komentarza
Share on other sites

Bo nie wszystko zrobisz na ekspanderze/multiplekserze.

Czytałeś to co napisałem wcześniej? Które piny mają zostać tam gdzie są (bo fizycznie nie ma możliwości "przepięcia" ich w inne miejsce) a którymi można się bawić? Jak sobie wyobrażasz np. działanie funkcji odbierającej jakąś szeregową transmisję, jeśli pin z którego chce czytać jest podpięty akurat do czegoś innego?

@atMegaTona: przede wszystkim polecam korzystanie z rozwiązań, które (oj, masło maślane mi wychodzi) rozwiązują problem. Przy bibliotekach korzystających z SPI w większości przypadków można podać, że nie używa się pinu CS tylko macha się nim ręcznie - no i machać. A nawet jeśli biblioteka takiej możliwości nie ma - można ją dorobić w bardzo prosty sposób (po prostu zakomentować wszystkie linie w kodzie odnoszące się do tego pinu, nawet jeśli się nie bardzo rozumie co one robią).

A przede wszystkim polecam dobieranie komponentów już na etapie wstępnego projektowania. Jeśli Arduino Uno (w domyśle: ATmega328) ma za mało pinów, zastosuję Arduino Mega (w domyśle: ATmega 2560) albo coś podobnego, być może ESP32, być może jakiegoś STM-a...

19 minut temu, gbtbg napisał:

Generalnie abym mógł podmienić wszystkie funkcje obsługi portów czyli pinMode, digitalRead, digitalWrite, analogRead i analogWrite swoimi które by wiedziały co mają w takiej sytuacji zrobić.

Bardzo ładne marzenie, ale z gatunku tych nierealnych. Oczywiście możesz sobie napisać własne funkcje typu pinMode czy digitalCośtam, i wszystkie biblioteki które ich używają zaczną w automagiczny sposób używać Twoich funkcji - tylko zastanów się czy to będzie działać. Pamiętaj, że przełączenie stanu ekspandera nie jest natychmiastowe ale trwa duuuuuuuużo dłużej niż "stockowy" digitalRead. Pamiętaj, że aby przełączyć ekspander musisz uruchomić transmisję I2C, a nie zawsze można to zrobić (np. w przerwaniu). Poza tym w pewnych przypadkach (jak choćby wspomniany I2C) piny są niejako odłączane od właściwego portu i podłączane do zupełnie innego urządzenia (to oczywiście bardzo duże przybliżenie, ale możesz przyjąć że tak to działa) i w takiej sytuacji nikt inny tego pinu już nie użyje.

Poczytaj sobie trochę na forum o ludziach, którzy użyli pinu 0 jako wejścia w jakimś prostym programie a potem byli bardzo zdziwieni, że albo nie działa transmisja serial, albo wejście...

  • Lubię! 1
Link do komentarza
Share on other sites

8 godzin temu, ethanak napisał:

przede wszystkim polecam korzystanie z rozwiązań, które (oj, masło maślane mi wychodzi) rozwiązują problem. Przy bibliotekach korzystających z SPI w większości przypadków można podać, że nie używa się pinu CS tylko macha się nim ręcznie - no i machać. A nawet jeśli biblioteka takiej możliwości nie ma - można ją dorobić w bardzo prosty sposób (po prostu zakomentować wszystkie linie w kodzie odnoszące się do tego pinu, nawet jeśli się nie bardzo rozumie co one robią).

Pełna  zgoda, różnica polega jedynie na wysłaniu bajta przez SPI do rejestru zamiast machania pinem co jest do zrobienia w każdym przypadku. Różnica prędkości o której mówiłem ma znaczenie z tego tylko względu, że 1 bajt przez SPI zdąży się przesłać w każdym przypadku bez względu na bibliotekę której ktoś używa a z I2C może być różnie.

Kolega@gbtbg chyba nie zrozumiał o co nam tu idzie. Otóż nie chodzi o to, żeby expander robił za port SPI tylko żeby obsługiwał piny CS. Do jednego portu SPI czy I2C można podłączyć równolegle bardzo wiele urządzeń jednak przy SPI każde z nich musi mieć własną linie CS więc zamiast marnować piny µC można zastosować np. rejestr przesuwny 74HC595 który się tym zajmie. Wysyłasz przez SPI bajt z ustawioną linią urządzenia z którego chcesz korzystać klikasz mu jednym pinem ENABLE i inicjujesz transmisję do tego urządzenia. Jeden taki rejestr ma 8 wyjść więc kosztem jednego pinu możesz obsługiwać 8 linii CS urządzeń podłączonych do jednego portu SPI.

Tym sposobem da się zrealizować Twoje założenia @gbtbg 

Link do komentarza
Share on other sites

Ja już swoje argumenty wyczerpałem. Wczoraj mi się przysiadł do stolika jakiś płaskoziemca, na szczęście w barze nie ma ppf-ów i można go było wysłać niedelikatnie na drzewo (obraził się i powiedział że więcej nie przyjdzie, trzymam za słowo).

W każdym razie naprawianie świata należy zacząć od zrozumienia, jak ten świat działa. Bez tego można sobie gdybać, teoretyzować, twierdzić że znasz genialny sposób na to żeby świat był piękny (czyt.: taki jaki chcesz), a potem przylezie jakiś ethanak i powie, że ziemia jest okrągła i masz wypadać bo barman więcej piwa nie poda...

  • Lubię! 2
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

15 godzin temu, ethanak napisał:

 Wczoraj mi się przysiadł do stolika jakiś płaskoziemca, na szczęście w barze nie ma ppf-ów i można go było wysłać niedelikatnie na drzewo (obraził się i powiedział że więcej nie przyjdzie, trzymam za słowo).

Cześć  @ethanak,

ja w takiej sytuacji mówię nieodmienie: "Zamiast realizować wyprawy do krawędzi spróbujcie przekopać się przez ten naleśnik". Wtedy płaskoziemca zaczyna analizować ten pomysł, a że nie grzeszy inteligencją zajmuje mu to trochę czasu, a ja mam spokój 😉

Pozdrawiam

  • Lubię! 2
Link do komentarza
Share on other sites

Sobie jaja robicie a problem jest trywialny. Zdaje się kolega wątkotwórca postrzega problem od drugiej strony naleśnika czyli od obiektu modułu.. Pisząc już zupełnie w prost:

Przypisz sobie normalny port spi i fizycznie podłącz do niego wszystkie moduły spi a do wybierania urządzeń napisz własną funkcję jeśli chcesz do tego korzystać z rejestru/expandera. Nie próbuj robić portu komunikacyjnego na expanderze ( choć to możliwe ale mało wydajne) tylko podłącz do niego csy urządeń SPI aby oszczędzić piny µC.

Już się chyba prościej nie da.

Najlepiej byłoby jednak dokładnie zrozumieć zagadnienie jak to @ethanak obrazowo opisał. Trudno będzie doradzić coś więcej w tej materii aby sens miało.

Link do komentarza
Share on other sites

Nikt tu nie robi jaj, a jeśli żartujemy to akurat nie z kolegi wątkotwórcy. Forum jest po to aby pomagać, a informacja "się nie da" jest wybitnie pomocna, bo ktoś pytający o rozwiązanie nie będzie tracił czasu na poszukiwania świętego Graala u ciotki w piwnicy.

A to, że czasem podchodzimy z uśmiechem do problemu? Poważnie to się w trumnie wygląda; a czasem takie porównania szybciej przemawiają do pytającego niż argumenty o datasheetach, wybranych aspektach konstrukcji AVR-ów czy ogólnie o Wielkiej Trudnej Informatyce...

Przemyśl to zanim znów zaczniesz stawiać zarzuty komuś, kto robi dokładnie to samo co Ty, ale nie w ten Jedyny Słuszny Sposób zgodny z Twoimi Poglądami.

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.