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

[atmega8][C] One-Wire. Algorytm Search ROM

z3ro 19 Sty 2012 17:12 1914 5
REKLAMA
  • #1 10419428
    z3ro
    Poziom 10  
    Witam, czy ktoś mógłby mi (i pewnie nie tylko mnie) na czym dokładnie polega ten algorytm, znalazłem kilka przykładów w necie ale nawet nie idzie mi dostosowanie go do swoich potrzeb. Zawsze bardziej siedziałem w elektronice i stąd moje problemy z programowaniem.

    Pozdrawiam

    Dodano po 3 [godziny] 42 [minuty]:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Poczyniłem za pomocą kodu z jakiejś strony coś takiego, ale wytłumaczcie mi najpierw co to dokładnie jest bit komplementarny, jest to uzupełnienie do jedynki?
  • REKLAMA
  • #2 10422693
    y0yster
    Poziom 19  
    Sam algorytm jest bardzo prosty.
    W datasheet'cie jest do dość dobrze narysowane. Jeśli chodzi o diagram...

    Zasada jest następująca, jeśli zostanie wysłana komenda 0x55 (Search ROM), to wszystkie czujniki podpięte na linii zaczynają nadawać.

    Najpierw wysyłają bit 0, a późnej jego zanegowaną wartość.
    W tym momencie master (urządzenie nadrzędne) jest w stanie stwierdzić jakie urządzenia znajdują się na linii.
    Załóżmy, że za pierwszym razem otrzymaliśmy 0, a za drugim razem także 0.
    Świadczy to o tym, że obecne są urządzenia, które na tym bicie mają obecne zarówno 0 jak i 1.
    Do nadzorcy należy wybranie drogi identyfikacji czujników.

    Sam algorytm w rozbudowanej wersji (znajdowanie wszystkich urządzeń podpiętych do linii) jest dostępny na stronie producenta.
  • REKLAMA
  • #3 10423465
    z3ro
    Poziom 10  
    A mógłby ktoś sprawdzić algorytm z pierwszego posta? bo niby jest ok, znaczy analizując narazie dla jednego czujnika, a zwraca jakieś dziwne wartości ROM. Nie bardzo potrafię rozgryźć o co w tym chodzi.

    Dodano po 2 [godziny] 58 [minuty]:

    Nie wiem już co zrobić, więc podłączyłem jeden czujnik i okroiłem maksymalnie algorytm search_rom i zostawiłem w takiej formie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Otrzymuję
    0111111111111111
    od najmłodszego do najstarszego bitu.
    Po Read_ROM otrzymuję poprawny family code czyli 28 a ostatni bajt to 09 więc czujnik nie jest uszkodzony i coś musi być nie tak z tym algorytmem. Mógłby ktoś pomóc?
  • REKLAMA
  • #4 10426695
    y0yster
    Poziom 19  
    Kod wygląda poprawnie, aczkolwiek intryguje mnie jedna rzecz.

    Jak wygląda u Ciebie funkcja read(); dzięki, której odczytujesz pojedyncze bity z magistrali?

    Czy w jej definicji inicjalizujesz zmienną samymi zerami i zapisujesz tylko jeden bit na pozycji 0?

    Jeśli nie ustawiasz zmiennej, to będziesz w niej miał najprawdopodobniej jakieś śmieci. Bez edycji procedury read(); możesz zamienić linijkę:



    na

    (bit & 0x01)<<(i%8);
  • REKLAMA
  • #5 10426874
    z3ro
    Poziom 10  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Tak wygląda read() nie wydaje mi się żeby zaśmiecało zmienną.

    Dodano po 5 [godziny] 13 [minuty]:

    Za pomocą read_rom otrzymuję poprawny rom znaczy tak mi się wydaje że poprawny, zaczyna się od 28. a za pomocą search_rom otrzymuję jakieś brednie. Nie mam już pomysłu o co może chodzić.
  • #6 10441025
    y0yster
    Poziom 19  
    Tak jak pisałem wcześniej kod wygląda w porządku.

    Możesz spróbować zrobić jeszcze jedną rzecz. Mianowicie, odczytaj cały kod identyfikacyjny za pomocą komendy READ ROM i wykorzystując polecenie SEARCH ROM zaadresuj czujnik i spróbuj coś z niego odczytać.

    Następnie za pomocą polecenia MATCH ROM zrób to samo i zobacz, która z metod da Ci prawidłowe odczyty.
    Możliwe, że jakaś subtelny szczegół w implementacji algorytmu SEARCH ROM, powoduje, że nie działa on prawidłowo.

    Jeszcze proponuję Ci poczytać notę aplikacyjną standrdu 1-Wire, która jest dostępna na stronie producenta APPLICATION NOTE 937: Book of iButton® Standards

    Pozdrawiam.
REKLAMA