logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zarządzać adresami I2C dla 100 slave'ów w Arduino?

m.biruta 29 Gru 2013 13:05 2712 17
REKLAMA
  • #1 13111630
    m.biruta
    Poziom 16  
    Czesc,
    Jestem zalamany poniewaz zaprojektowalem uklad, napisalem program i wszystko bierze w leb, bo nie przewidzialem komunikacji z wiecej jak jednym mikrokontrolerem :-)

    Pisze w srodowisku arduino, komunikacje i2c inicjuje sie poprzez wpisujac nr kontrolera. W master wpisalem sobie 1, a w slave 2. I teraz pytanie jak rozwiazac problem kiedy master ma sie komunikowac z np. 3-4 slave-ami, a ich mam np 100. Czy kazdy musi miec unikalny numer przy inicjalizacji? Jedli tak to jak to rozwiazac? Czy moze kazdy klient ma jakis swoj sprzetowy id ktorym jestem w stanie identyfikowac uklad?[/spoiler]
  • REKLAMA
  • #2 13111741
    tmf
    VIP Zasłużony dla elektroda
    Każdemu musisz przyporządkować unikalny numer ID slave. Trzeba go nadać na etapie produkcji urządzenia slave, bo I2C nie obsługuje tworzenia unikalnych identyfikatorów ad-hoc.
    Z drugiej strony jeśli myślisz, że uda ci się stworzyć magistralę I2C z setką urządzeń to raczej cię rozczaruję. Teoretycznie możliwe, w praktyce niewykonalne, tak jak z jednorożcami :)
  • #3 13111766
    m.biruta
    Poziom 16  
    Nie planuje podłączać na raz tylu slave, maksymalnie 2-4. Z ilu cyfr moze sie skladac adres?
  • #4 13111810
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 13112199
    m.biruta
    Poziom 16  
    Marek_Skalski napisał:
    m.biruta napisał:
    zaprojektowalem uklad, napisalem program

    Trochę to dziwne, że napisałeś program i nie wiesz jak wygląda adresowanie urządzeń na I2C.
    Masz do dyspozycji 7 lub 10 bitów, zależy jaki tryb adresowania wybierzesz.
    Nie rozumiem też Twojego lamentu w kwestii podłączenia dodatkowego slave'a. Przecież właśnie elastyczność I2C pod względem ilości podłączonych/aktywnych urządzeń jest jej największą zaletą.
    Zapoznaj się może ze specyfikacją I2C i życie stanie się łatwiejsze.

    No jakos tak jest ze znam kilka jezykow, a niekoniecznie wszystkie specyfikacje :) Znalazlem juz w opisie biblioteki, ze adres musi byc. 7bitowy, wiec moge zaadresowac jedynie do 127 unikalnych slave-ow :/ Pytanie jak rozwiazac problem gdy mam ich np 500 :) Mozna przy uruchomirniu losowac adres i go nadawac, ale wtedy raz na jakis czas kolizja w adresach sie zdarzy...
  • REKLAMA
  • #6 13112247
    tadzik85
    Poziom 38  
    Raz mówisz o 4 slavach potem o 500set.....
  • REKLAMA
  • #7 13112560
    m.biruta
    Poziom 16  
    tadzik85 napisał:
    Raz mówisz o 4 slavach potem o 500set.....

    Mówię że urządzen bedacych slave-ami ma byc nawet kilkaset, sle na raz podlaczonych moze byc tylko 1-4.
  • #8 13112567
    tadzik85
    Poziom 38  
    Czyli co do układu wstawiasz losowe 4 z 500set?
  • #9 13112675
    jarek_lnx
    Poziom 43  
    Cytat:
    Pytanie jak rozwiazac problem gdy mam ich np 500 :)

    I2C jest proste, ale ma swoje ograniczenia, 10 bitowej przestrzeni adresowej wystarczy, ale nie jest to magistrala którą można ciągnąć na długie dystanse, (ograniczenie na pojemność kabla, brak dopasowania), odporność na zakłócenia jest słaba (linia asymetryczna, brak izolacji galwanicznej), a 500 urządzeń to już większy system, spróbuj znaleźć uszkodzenie jeśli jeden moduł zewrze linię do masy.

    Myślę że niezbędne minimum to ehternet, rozwiązanie popularne i standardowe, nie musisz budować własnych switch'ów, a pojedyncze zwarcie wyeliminuje tylko jeden moduł, zamiast całą sieć, przestrzeni adresowej starczy, nawet jeśli zaraz okaże się że urządzeń ma być nie 500 a 100x więcej.
  • #10 13113216
    tmf
    VIP Zasłużony dla elektroda
    Jak rozumiem są do podłączenia maks 4 układy z 500 możliwych. I masz problem - samo I2C daje tylko 127 identyfikatorów, co prawda jest rozszerzenie standardu umożliwiające adresację 10 bitową, lecz nie jest to wspierane przez kontroler TWI z ATMegi. I jeśli chcesz się trzymać standardu to kaplica. W takim razie musisz wykombinować jak dynamicznie przypisywać adresy I2C. Pytanie pomocnicze, czy urządzenia będą wkładane na bieżąco i usuwane z systemu (hot plug), czy jest to stała konfiguracja, od power up do końca jego działania? Można spróbować arbitrażu - urządzenie wkładane odpytuje sieć, jeśli na jakiś adres urządzenia w sieci nie odpowiadają to sobie ten adres przypisuje, a potem już działa jako slave o tym adresie. Jedyne co trzeba zrobić to zadbać o obsługę kolizji, bo przejściowo w systemie może być kilka masterów, niemniej samo I2C gwarantuje poprawność transmisji w takim układzie.
    Pozostaje tylko potem identyfikacja co to za urządzenie ale to już proste jest - wystarczy im nadać dowolne identyfikatory odczytywane przy okazji normalnych operacji odczytu I2C.
  • #11 13113230
    tadzik85
    Poziom 38  
    Jeśli 4 na stale można użyć kilka pinów adresowych jak to ma miejsce w niektórych eepromach.
  • #12 13113327
    m.biruta
    Poziom 16  
    tmf napisał:
    Jak rozumiem są do podłączenia maks 4 układy z 500 możliwych.

    Zgadza się, mam na stole 500 układów, wpinam do mastera jeden (zaczyna działać), za jakiś czas wpinam drugi, później trzeci, w między czasie wypinam pierwszy itd.

    tmf napisał:
    I masz problem - samo I2C daje tylko 127 identyfikatorów, co prawda jest rozszerzenie standardu umożliwiające adresację 10 bitową, lecz nie jest to wspierane przez kontroler TWI z ATMegi. I jeśli chcesz się trzymać standardu to kaplica.

    To już wiem ;)

    tmf napisał:
    Pytanie pomocnicze, czy urządzenia będą wkładane na bieżąco i usuwane z systemu (hot plug), czy jest to stała konfiguracja, od power up do końca jego działania?

    Slave-y mogą być wpinane i wypinane podczas pracy.

    tmf napisał:
    Można spróbować arbitrażu - urządzenie wkładane odpytuje sieć, jeśli na jakiś adres urządzenia w sieci nie odpowiadają to sobie ten adres przypisuje, a potem już działa jako slave o tym adresie. Jedyne co trzeba zrobić to zadbać o obsługę kolizji, bo przejściowo w systemie może być kilka masterów, niemniej samo I2C gwarantuje poprawność transmisji w takim układzie.
    Pozostaje tylko potem identyfikacja co to za urządzenie ale to już proste jest - wystarczy im nadać dowolne identyfikatory odczytywane przy okazji normalnych operacji odczytu I2C.

    Master może być tylko jeden. Można faktycznie zrobić tak, że przy wpinaniu slave-ów każdy ma adres 127. Z tym adresem odpytuje po kolei: 1, 2, 3… jeśli trafi na wolny to rozłącza się i łączy się ponownie z nowym adresem. Co ty na to?
  • #13 13113356
    tadzik85
    Poziom 38  
    To zaadresuj sloty, nie slavy
  • #14 13113440
    m.biruta
    Poziom 16  
    tadzik85 napisał:
    To zaadresuj sloty, nie slavy

    Nie zrozumiałem chyba o co chodzi :)
  • #15 13113562
    tadzik85
    Poziom 38  
    2 bitu adresu slava będą zależały od numeru slotu.
    pozostałe zawsze te same dla slave.
    Multum problemów rozwiązanych. Ale w slave musisz przeznaczyć 2 dodatkowe piny na odczyt adresu.
  • #16 13113722
    m.biruta
    Poziom 16  
    tadzik85 napisał:
    2 bitu adresu slava będą zależały od numeru slotu.
    pozostałe zawsze te same dla slave.
    Multum problemów rozwiązanych. Ale w slave musisz przeznaczyć 2 dodatkowe piny na odczyt adresu.

    Piszę pod arduino, a biblioteka wire tego raczej nie obsługuje :-/ Dodatkowo slave-ami mają być attiny. Ale pomyślałem żeby zrobić to tak: slave łączy się z adresem 127, a master (który wie kogo ma podłączonego) przydziela wolny adres. Odciąży mi to pamięć slave-a i przyspieszy komunikację (nie trzeba będzie odpytywać po kolei adresów). Może być?
  • Pomocny post
    #17 13113791
    tadzik85
    Poziom 38  
    Kombinujesz jak wól pod górę.
    Czego nie obsługuje?
    Byle EEPROM AT24C działa na podobnej zasadzie.
    Człowieku, przeczytaj coś więcej o I2C zanim kombinować zaczniesz. Jakie 127. Jakie przydzielanie adresów.
    Zrób jak ci mówię i tyle.
    Nie? Zmień interfejs.
  • Pomocny post
    #18 13113983
    tmf
    VIP Zasłużony dla elektroda
    m.biruta napisał:
    tadzik85 napisał:
    2 bitu adresu slava będą zależały od numeru slotu.
    pozostałe zawsze te same dla slave.
    Multum problemów rozwiązanych. Ale w slave musisz przeznaczyć 2 dodatkowe piny na odczyt adresu.

    Piszę pod arduino, a biblioteka wire tego raczej nie obsługuje :-/ Dodatkowo slave-ami mają być attiny. Ale pomyślałem żeby zrobić to tak: slave łączy się z adresem 127, a master (który wie kogo ma podłączonego) przydziela wolny adres. Odciąży mi to pamięć slave-a i przyspieszy komunikację (nie trzeba będzie odpytywać po kolei adresów). Może być?


    Tak, może tak być o ile zagwarantujesz, że do czasu przydziału adresu nie podepniesz drugiego slave.
    Swoją drogą co znaczy, że biblioteka nie obsługuje? To się pisze swoją, I2C to raptem kilkanaście linii kodu...
REKLAMA