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

[atmega16] DS18b20 - zapis ustawień

maly_elektronik 23 Lis 2008 23:24 2212 4
  • #1 5776049
    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]
  • #3 5776388
    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
  • Pomocny post
    #4 5776743
    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
    
       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
    
       Configuration_register = Configuration_register And &H9F       'dla 9-bitowej rozdzielczości zerujemy bity R1 i R0
    

    c)Zapisać 3 bajty do scratchpad'a
    
       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).
    
       1wreset
       1wwrite &HCC
       1wwrite &H48
       Waitms 15       ''zapis do eepromu, chwilkę trwa ;)
    


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

    Piotrek
  • #5 5777911
    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
    
    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:

    
     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ęść
    
       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ęść:
    
    
       
       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
REKLAMA