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.

[atmega16] DS18b20 - zapis ustawień

maly_elektronik 23 Lis 2008 23:24 1888 4
  • #1 23 Lis 2008 23:24
    maly_elektronik
    Poziom 23  

    Witam
    Mam problem z obsługą sensora temperaturowego :(
    Mianowicie po przeczytaniu datasheet'u nie wiem w jakiej kolejności wysyłać dane ustawień do ww czujnika :(
    Chce ustawić tryb 9bitowy i odczytywać temperaturę (nie jest mi potrzeba obsługa alarmów temperaturowych)
    Czy może mi ktoś powiedzieć w jakiej kolejności wysyłać dane:
    convert t[0x44], Read Scratchpad[0xBE], Write Scratchpad[0x4E],Copy
    Scratchpad[0x48], Recall E2[0xB8] :?:
    Chodzi mi jedynie o rozpiskę w jakiej kolejności wysyłać poszczególne ww ustawienia (i ewentualnie jeżeli którychś nie trzeba to po prosu je pominąć)
    Z góry dziękuje za pomoc maly_elektronik

    Poprawiłem tytuł.
    [zumek]

    0 4
  • #3 24 Lis 2008 07:41
    maly_elektronik
    Poziom 23  

    Zbytnio mi ta odpowiedź nie pomogła bo w poście który wymieniłeś piszą o zapisywaniu do eepromu :( a ja jedynie chcę ustawić tryb 9bitowy i odczytywać dane :) Nic więcej ani nic mniej :)
    Bardzo proszę o pomoc jeżeli wiesz w jakiej kolejności to wysłać (i najlepiej gdybyś miał sprawdzoną tą kolejność)
    Pozdrawiam maly_elektronik

    0
  • Pomocny post
    #4 24 Lis 2008 10:48
    zumek
    Poziom 39  

    maly_elektronik napisał:
    Zbytnio mi ta odpowiedź nie pomogła...

    To chyba niezbyt dokładnie przeczytałeś(zrozumiałeś) dokumentację DS18B20 :cry:
    Przypatrz się tabelce i zobacz, gdzie znajduje się rejestr konfiguracyjny, w którym zapisane jest, z jaką rozdzielczością ma "pracować" nasz DS.

    [atmega16] DS18b20 - zapis ustawień

    Zakładając, że nie znamy wartości zapisanych w rejestrach TH Register or User Byte 1, TL Register or User Byte 2, Configuration Register i nie chcemy nic zmieniać prócz rozdzielczości pomiaru temperatury na 9-bitową, to powinniśmy:
    a)Odczytać co najmniej 5 bajtów ze scratchpad'a
    Code:

       1wreset
       1wwrite &HBE                                   'read scratchpad
       Temperature_lsb = 1wread(1)
       Temperature_msb = 1wread(1)
       Th_register_or_user_byte = 1wread(1)
       Tl_register_or_user_byte = 1wread(1)
       Configuration_register = 1wread(1)

    b)Zmienić wartość w bajcie konfiguracyjnym
    Code:

       Configuration_register = Configuration_register And &H9F       'dla 9-bitowej rozdzielczości zerujemy bity R1 i R0

    c)Zapisać 3 bajty do scratchpad'a
    Code:

       1wreset
       1wwrite &HCC
       1wwrite &H4E
       1wwrite Th_register_or_user_byte
       1wwrite Tl_register_or_user_byte
       1wwrite Configuration_register

    I od tej chwili, pomiar temperatury, będzie dokonywany z rozdzielczością 9-bit ale tylko do momentu, kiedy będzie zasilany. Po odłączeniu i ponownym włączeniu zasilania, DS powróci do "starych" ustawień , zapisanych w eepromie.Żeby zapamiętać ustawienia na stałe, musimy skopiować 3-bajty ze scratchpad'a, do eepromu (dwukierunkowe strzałki na rysunku).
    Code:

       1wreset
       1wwrite &HCC
       1wwrite &H48
       Waitms 15       ''zapis do eepromu, chwilkę trwa ;)


    Jeżeli nadal nie rozumiesz, to nie umiem Ci pomóc :|

    Piotrek

    0
  • #5 24 Lis 2008 18:51
    maly_elektronik
    Poziom 23  

    Więc tak zrobiłem tak jak mówisz :)
    Niestety po zapisaniu rejestru konfigurującego gdy odczytam jego wartość to wynosi ona wciąż 0xFF a powinna wynosić albo 0x9F albo 0x1F :(
    Ale może to nie istotne :) Możesz powiedzieć co zrobić następnie po wysłaniu odpowiednich komend (te o których mówiłeś) żeby odczytać temperaturę :?: Kiedy wysłać 0x44 :?:
    Tak wygląda mój cały kod

    Code:

    w1_write(0xCC);
       w1_write(0xBE);                                   
       Temperature_lsb = w1_read();
       Temperature_msb = w1_read();
       Th_register_or_user_byte = w1_read();
       Tl_register_or_user_byte = w1_read();
       Configuration_register = w1_read();
     

       w1_write(0xCC);
       w1_write(0x4E);
       w1_write(Th_register_or_user_byte);
       w1_write(Tl_register_or_user_byte);
       w1_write(Configuration_register & 0x9f);     


    tylko czy dalsza część kodu (odczytującą temperaturę powinna wyglądać tak:

    Code:

     w1_write(0xCC);
     w1_write(0x44);
     w1_write(0xBE);                                   
       Temperature_lsb = w1_read();
       Temperature_msb = w1_read();

    :?:

    Dodano po 1 [godziny] 38 [minuty]:

    Ok
    Problem rozwiązałem :)
    Dla innych zainteresowanych (potencjalnych osób które mogą mieć z tym problemy) powiem na czym polegał problem :)
    Mianowicie na resecie po wysłaniu pierwszej części i drugiej
    Pierwsza część
    Code:

       start:
       if(w1_init()==0) goto start; // prosty warunek sprawdzania czy po resecie ds18b20 odpowie (wystawi stan logicznego 1), jeżeli tak to idzie dalej

       w1_write(0xCC);
       w1_write(0x44);
       delay_ms(750);  // odczekanie na konwersje

       
     

    Druga część:
    Code:


       
       star:
       if(w1_init()==0) goto star;   // prosty warunek jak wyżej

       w1_write(0xCC);
       w1_write(0xBE);                                   

       Temperature_lsb = w1_read();  // odczytywanie interesujących nas danych
       Temperature_msb = w1_read();
       Th_register_or_user_byte = w1_read();
       Tl_register_or_user_byte = w1_read();


    PS Pamiętajcie aby sprawdzać otrzymaną wartość po resecie aż do momentu otrzymania wartości 1 :)

    Temat zamykam

    0
  Szukaj w 5mln produktów