Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Układ DS18b20 - czas pomiędzy poleceniami 1Wire [bascom]

monokrysztal12 12 Wrz 2011 19:03 2159 10
  • #1 12 Wrz 2011 19:03
    monokrysztal12
    Poziom 13  

    Witam
    Obsługuję czujnik DS18B20 w Bascomie. Procedura odczytu wygląda tak:

    Code:

    1wreset                       'reset

    1wwrite &H55                 
    1wwrite &HCC

    1wwrite &H44                  'dokonaj konwersji
    Waitms 750                    'przeczekaj czas konwersji
    1wreset                       'reset

    1wwrite &H55                 
    1wwrite &HCC

    1wwrite &HBE                 
    Temperatura(1) = 1wread(2)    'odczytaj dwa pierwsze bajty
    'DALSZA OBRÓBKA DANYCH....


    Czy czas pomiędzy kolejnymi poleceniami, tj. 1wreset , potem 1wwrite &H55 , potem 1wwrite &HCC ... itd. może być dowolnie długi, przykładowo -np 6 minut; 5 godzin; 10godzin czy też 10dni .... ? Oczywiście wysyła 1 polecenie, czeka, wysyła drugie itd. do końca... Czy są ograniczenia? Oczywiście będzie to pracowało w konfiguracji 2-Wire [zasilanie, masa, linia danych], bo 1Wire to kondensator trzymający energię w układzie się rozładuje.
    Dziękuję za odpowiedź.

    0 10
  • #2 12 Wrz 2011 19:24
    Press
    Poziom 22  

    monokrysztal12 napisał:
    Witam
    Oczywiście będzie to pracowało w konfiguracji 2-Wire [zasilanie, masa, linia danych], bo 1Wire to kondensator trzymający energię w układzie się rozładuje.
    Dziękuję za odpowiedź.


    Nie wiem jak z tymi ograniczeniami czasowymi o które pytasz, ale kondensator Ci się nie rozładuje, bo linia danych 1-wire w czasie bezczynności jest utrzymywana w stanie wysokim i cały czas zasila układ slave.

    0
  • #3 12 Wrz 2011 19:27
    monokrysztal12
    Poziom 13  

    No tak, ale i tak będzie konfiguracja z 3 przewodami...

    0
  • #4 15 Wrz 2011 00:49
    monokrysztal12
    Poziom 13  

    Czy ten czas ma jakieś znaczenie, czy jednak nie?

    0
  • Pomocny post
    #5 15 Wrz 2011 07:29
    emarcus
    Poziom 35  

    monokrysztal12 napisał:
    Witam
    Obsługuję czujnik DS18B20 w Bascomie.
    Czy czas pomiędzy kolejnymi poleceniami, tj. 1wreset , potem 1wwrite &H55 , potem 1wwrite &HCC ... itd. może być dowolnie długi, przykładowo -np 6 minut; 5 godzin; 10godzin czy też 10dni .... ? Oczywiście wysyła 1 polecenie, czeka, wysyła drugie itd. do końca... Czy są ograniczenia?


    NIE!
    Te czasy (timingi) są ściśle określone w postaci ' time slots' (okienek czasowych) i wyrażane w µs.
    Zapoznaj się z datasheet począwszy od str.14 i paragrafu "INITIALIZATION PROCEDURE: RESET AND PRESENCE PULSES" i dalsze paragrafy. Dodatkowo, bardzo przejrzyście jest to objaśnione na digramach tam umieszczonych dla każdej operacji.

    Prestudiuj także te dwa przykłady: (1) pełnej komunikacji dla układu z wieloma DS oraz (2)z pojedynczym czujnikiem. Zauważ, że każda nowa transakcja/komenda jest inicjowana przez processor w postaci "Reset", po czym jest odpowiedź gotowości układu DS. Sygnały te muszą mieścić się w tych wyznaczonych przedziałach czasowych (slots). Tu następuje włściwa kommenda wpisu/odczytu, cokolwiek (jest ich tylko kilka), Jeżeli komunikacja nie jest kontynuowana, układ DS przechodzi w 'idle mode'.

    Cytat:

    Oczywiście będzie to pracowało w konfiguracji 2-Wire [zasilanie, masa, linia danych], bo 1Wire to kondensator trzymający energię w układzie się rozładuje.

    Tu należy się mała poprawka:
    Niezależnie jakiego rodzaju wybierzesz zasilanie (parasite czy zewnętrzne) to w dalszym ciągu jest to 1-Wire protocol.
    DS18x20 jest urządzeniem obsługiwanym przez system 1-wire wyłącznie.

    2-Wire jest zupełnie innego rodzaju kommunikacja (linia danych i clk). Tu nie ma linii 'clk' (zegara) dlatego timingi są tak istotne.

    e marcus

    0
  • #6 16 Wrz 2011 22:04
    monokrysztal12
    Poziom 13  

    czyli jak przykładowo dam:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    czyli flaga zmienia stan co ok. 1s, czyli zapytanie [1s] odczyt [1s] itd..
    to powinno odczytywać ok? Powinno się wyrobić przed kolejnym przerwaniem wysłać/odebrać dane, żeby nie przerwało odczytu - ogółem komunikacji 1wire? Bo są to czas jak patrzyłem - rzędu us... oczywiście nie mówię o czasie konwersji, tylko zapis zapytań/odczyt przetw. danych z układu.

    0
  • Pomocny post
    #7 17 Wrz 2011 08:13
    emarcus
    Poziom 35  

    monokrysztal12 napisał:
    czyli jak przykładowo dam:
    ....
    czyli flaga zmienia stan co ok. 1s,.....

    Z przedstawionej informacji wynika że masz w systemie tylko jeden układ DS, więc nie ma potrzeby go adresować (&H55-match ROM). wystarczy 'skip ROM'.
    Jeżeli flaga jest używana tylko do obsługi odczytu temperatury, to nie ma potrzeby aż tylu jej stanów (0/1/2/3; -wystarczy 0/1).
    Jak to w praktyce by wyglądało:
    Jeżeli masz postawioną flagę (1) 'idziesz' do dowolnie nazwanej subrytyny gdzie:
    Zerujesz flagę.
    W zwyczjny sposób nawiązujesz komunikacje z DS.
    Odczytujesz (&HBE) do zadeklarowanej zmiennej pierwsze dwa bajty ze scratchpad.
    Dajesz polecenie konversji temperatury (&H44), którą będziesz czytał w następnej sesji.
    Opuszczasz sesje komunikacji z DS i Return z subrutyny.
    Aby nie nastąpiła przypadkowa korupcja danych , możesz na czas komunikacji "zawiesić" wystąpienie ewntualnych interruptów (zależy co masz dodatkowo w programie).
    Dalszą interpretacje odcztu i wyświetlenie wyniku umieścisz w głównej części programu.
    Licz się z tym że wynik może posiadać pewne błedy - nie jest sprawdzany CRC
    Pełniejszy przykład do przeanalizowania znajdziesz w publikacj AN#111.
    Jest też wiele wątków na ten temat tu na tej grupie - średnio 2x w miesiącu.

    e marcus

    0
  • #8 17 Wrz 2011 10:52
    monokrysztal12
    Poziom 13  

    Przerwań nie mogę wyłączyć, flaga jest bajtowa, albowiem inkrementując ją, aktywuję inne warunki w programie. Może coś takiego ze sprawdzaniem crc? Wtedy po prostu nie wyświetli wyniku, jak nie będzie prawidłowe... Tylko niestety nie może zdarzać się to za często. Przerwania zaś są obecnie tylko od. 1 timera... [0]. Czy ten odczyt 9 bajtów będzie trwał mniej niż 4ms, czy jakoś jeszcze to podzielić?



    Kod: bash
    Zaloguj się, aby zobaczyć kod

    0
  • #9 17 Wrz 2011 22:44
    monokrysztal12
    Poziom 13  

    Czy tak może być?

    0
  • Pomocny post
    #10 18 Wrz 2011 16:49
    emarcus
    Poziom 35  

    monokrysztal12 napisał:
    Czy tak może być?

    Nie.
    Po komendzie:
    "1wwrite &H55"
    Spodziewana jest komenda wpisu adresu adresu device do której odnoszą się dalsze komendy, ponadto:
    Błędem jest stosowanie tejsamej flagi (niby stopniowej) do wielu operacji bez jej kasowania. Zauważ że flaga=1, lub flaga =2 utrzymuje sie przez dłuższy czas, o wiele dłuzszy niż 'przewinięcie 'pętli głównej "Do..Loop", i za każdym razem wszystkie instrukcje powodowane tą flagą są wykonywane.
    Daj oddzielna flage do obsługi odczytów temperatury i gdy wejdziesz w tą obsługę natychmiast ją kasuj, w ten sposów jest pewność że ta operacja będzie wykonana tylko jeden raz.

    e marcus

    0
  • #11 18 Wrz 2011 22:55
    monokrysztal12
    Poziom 13  

    czyli np. tak


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0