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 odczytać temperaturę z DS18B20 w C++? Rozdzielczość 12-bitowa

elektryo 21 Sie 2007 14:38 4934 13
REKLAMA
  • #1 4199935
    elektryo
    Poziom 13  
    Posty: 115
    Pomógł: 2
    Witam.
    Mam czujnik temperatury DS18B20. Przeszukałem ½ forum i nie znalazłem tego czego szukałem. Mój problem polega na tym, że nie wiem jak odczytać temperaturę z tego DS-a. Podaję polecenie na 1wire, aby odczytać pamięć SCRATCHPAD, ale co dalej?? Zrobić jakąś pętlę, która będzie zapisywała te 2 bajty temperatury(chodzi o rozdzielczość 12-bitową)??Jak?? Może ktoś ma źródło samego odczytu temperatury z DS18B20.(ale oczywiście w języku C, bo w Bascomie jest ich od groma!!!)
    Mam nadzieję, że ktoś mi pomoże.

    P.S. przepraszam za takie laickie pytania( i pewnie masę błędów w rozumowaniu działania czujnika), ale znam jedynie podstawy języka C, a bardzo bym chciał zrobić sobie taki czujnik temperatury i się czegoś wreszcie nauczyć.
    Dziękuję i proszę o wyrozumiałość,

    elektryo
  • REKLAMA
  • #2 4200084
    cinek810
    Poziom 12  
    Posty: 66
    Ocena: 2
    Cóż zgodnie z dokumentacją odczytanie temperatury z tego czujnika odbywa sie w kilku krokach.
    (Korzystam z publicznego dostepu do internetu w tej chwili- telepunkt, wiec.. nie sa to warunki na wyjasnienie wszystkiego po kolei)

    Jesli masz podstawy z programowania w C++ i przeczytasz dokladnie dokumentacje to wszystko powinno byc ok, jest na prawde dobrze napisana.
    Dużą pomocą mogóby być oscyloskop.. szczególnie, żeby przejrzeć kształt slotów. Czasami ważna jest nawet kolejność poleceń, bo powoduje ona czasem znaczące zmiany w tej kwestii.

    tutaj masz dokumentacje:
    http://www.maxim-ic.com/quick_view2.cfm/qv_pk/2812

    Jak poczytasz pytaj o szczegóły, zwróć uwage na to, że:
    1.Jedeno zdarzenie komunikacyjne to szereg czynnosci (reset, polecenie rom, polecenie).
    2.Czujnik nie wysyla temperatury tylko zawartosc pamieci, wiec.. to nie tylko dwa bajty (chociaz po ich odebraniu mozesz olac reszte- nie polecam)
    3.Kwestia pobierania, tego czy wziac w petle, to juz Twoja wola... Jesli zrobisz sobie np. funkcje odbierajaca bajt. No to ja bym ja odpalil bodaj osiem razy i pobral, ale.. przeciez Twoja funkcja moze pobierac od razu dwa bajty i miec w srodku petle..
  • REKLAMA
  • #3 4201164
    elektryo
    Poziom 13  
    Posty: 115
    Pomógł: 2
    Hm... . W kodzie źródłowym obsługi 1-wire znalazłem coś takiego:
    
    //odczyt bajtu z linii 1W
    unsigned char one_wire_byte_read( void )
    {
    return one_wire_byte_write(0xFF);
    }
    


    a tutaj funkcja (...)byte_write:
    
    unsigned char one_wire_byte_write(unsigned char b)
    {
    unsigned char bit_counter = 8;
    do
    {
    b = b >> 1 | (one_wire_bit_io( b & 1 ) ? 0x80: 0);
    } while(--bit_counter);
    return b;
    }
    


    Czyli mógłybm wykorzystać tą funkcję one_wire_byte_readm aby odebrać pierwszy bajt?? Jeśli tak, to ile należy czekać, aby odebrać drugi bajt??
  • #4 4202176
    firefox_PL
    Poziom 17  
    Posty: 235
    Pomógł: 21
    Ocena: 2
    polecam zainstalowanie środowiska CodeVisionAVR, jest wersja darmowa z ograniczeniem wielkości programu, ale nie to jest najważniejsze bo to co tam jest najlepsze to biblioteki do obsługi 1-wire i osobne funkcje do niektórych urządzeń działających w tym standardzie (między innymi tego czujnika), do tego opisanie stosowania wszystkich funkcji w Help'ie. Tak na prawdę wystarczy skopiować sobie pliki *.h i *.c dotyczące 1-wire i czujnika i można je wykorzystać w innym środowisku, ale sądzę że jak zapoznasz się z CodeVisionAVR to być może zrezygnujesz z innych programów, bo mnogość ułatwień i zautomatyzowanych ustawień naprawdę ułatwia życie i skróca tzw. "Time to market". Dzięki temu odczyt temperatury skraca się do czegoś takiego:
    
    #include <tiny2313.h>
    
      #asm
        .equ __w1_port=0x12 ;PORTD
        .equ __w1_bit=5
      #endasm
    
    #include <1wire.h>
    #include <ds18b20.h>      
    
    ...
    
    void main(void){
    
      int Temp;
    ...
      
      w1_init();
      ds18b20_init(0,0, 250, DS18B20_9BIT_RES);
      Temp = ds18b20_temperature(0);
       
    ...
    
    }
    
  • #5 4203045
    elektryo
    Poziom 13  
    Posty: 115
    Pomógł: 2
    Hmmm. W sumie łatwiej, ale ja chcę napisać program dla AT89S52, więc raczej CodeVisionAVR się nie przyda.. :( A gdyby skopiować obsługę 1-wire do innego środowiska to by chyba nie wypaliło?? bo przecież plik 1wire.h zawiera tylko coś takiego:
    
    #ifndef _W1_INCLUDED_
    #define _W1_INCLUDED_
    
    #pragma used+
    unsigned char w1_init(void);
    unsigned char w1_read(void);
    unsigned char w1_write(unsigned char data);
    unsigned char w1_search(unsigned char cmd,void *p);
    unsigned char w1_dow_crc8(void *p,unsigned char n);
    #pragma used-
    
    #endif
    


    Może się mylę .... .
  • #6 4204432
    firefox_PL
    Poziom 17  
    Posty: 235
    Pomógł: 21
    Ocena: 2
    sorki, odgórnie założyłem że robisz to na AVR, a co do używania plików w innym środowisku to z tego co pamietam to definicje funkcji są w plikach .c, w .h są tylko deklaracje (czyli wszystko tak jak powinno być przy programowaniu)
  • REKLAMA
  • #7 4204782
    aster11
    Poziom 19  
    Posty: 211
    Pomógł: 36
    Ocena: 1
    Ja proponuję przeszukać jeszcze trochę tą pozostałą 1/2 forum i google. Jeżeli chcesz "świadomie" obsługiwać magistralę 1-wire i układy przez nią się komunikujące, a jest to dla Ciebie nowość, to rzeczywiście trzeba dość mocno zakasać rękawy - z własnego doświadczenia wspominam jednak, że o materiały nie trudno, zwłaszcza po angielsku (Maxim-Dallas bardzo ładnie wszystko opisuje), a i po polsku jest dużo podstawowych informacji.

    U Ciebie dochodzi jeszcze, jak zrozumiałem, początkujący poziom znajomości języka C, co może stanowić dodatkowe utrudnienie - ale przecież każdy kiedyś musiał zacząć.

    Piszesz, że większość przykładów jest w Bascomie - w Bascomie obsługa 1-wire (jak i wielu innych wodotrysków) wymaga jedynie umiejętności pisania na klawiaturze :D
    W języku C jest trochę trudniej. Nie sądzę, żeby w C brakowało przykładów dla DS18B20. Problem jest trochę inny - kod w języku C jest przenośny, tzn. raz napisany możne być wykorzystany na wielu platformach (a także na różnych typach mikrokontrolerów). Jednak jego przenoszenie, zwłaszcza pomiędzy mikrokontrolerami, prawie zawsze wymaga pewnych modyfikacji. I tu ujawnia się pole do popisu, bo dla poprawnej modyfikacji trzeba znać architekturę mikrokontrolera, trzeba znać język C i trzeba sie orientować w charakterze zadania, jakie dany program ma realizować. Często portowanie programu, zwłaszcza krótkiego, to zadanie wymagające podobnego wysiłku, co napisanie go od zera.

    W powyżej wspomnianym kontekście możesz pomyśleć o możliwości wykorzystania kodu dla 1-wire spod CodeVisionAVR. Na pewno będzie potrzebne trochę przeróbek, ze względu na przejście pod architekturę '51 (zmiana niskopoziomowych funkcji dostępu do portu i funkcji opóźnień), ale sądzę, że można wiele skorzystać.

    Przepraszam, że tak filozoficznie. Twój temat był dość ogólny. Gdy będą konkretniejsze pytania, postaramy się o konkretniejsze odpowiedzi :D
  • #8 4204921
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    firefox_PL napisał:
    ... a co do używania plików w innym środowisku to z tego co pamietam...
    Pamięć Cię zawodzi :(
    firefox_PL napisał:
    to definicje funkcji są w plikach .c, w .h są tylko deklaracje (czyli wszystko tak jak powinno być przy programowaniu)

    W CVAVR , funkcje wymienione w pliku 1wire.h , nie są dostępne w żadnym pliku.Na dokładkę , napisane są w assemblerze i "zaszyte" w kompilatorze , tak że możemy zapomnieć o ich prostym wykorzystaniu w swoich projektach na AVR-ki , a o przeniesieniu na inną platformę , to już nie wspominam , choć jak by się uprzeć ... :D

    Piotrek

    PS
    Na elektrodzie "leży" wiele gotowców dla 1wire , tylko trzeba się ... bardziej przyłożyć ;)
  • #9 4204957
    aster11
    Poziom 19  
    Posty: 211
    Pomógł: 36
    Ocena: 1
    A to przepraszam, nie pokwapiłem się popatrzeć dokładniej do CodeVisionAVR, a nie używam go na codzień. Myślałem, że kody są "otwarte". Nie będziesz miał więc z tego żadnego użytku, chyba że przejdziesz na AVR.

    Tak jak pisał zumek - jest dużo przykładów i "gotowców", i tak jak ja starałem się zaznaczyć - jest dużo materiałów do nauki od podstaw.
  • #10 4206416
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    Ja tylko chcę dorzucić, że jeśli znasz w średnim stopniu język angielski, to po przeczytaniu PDF'a od DS18B20, zrozumiesz wszystko dokladnie.

    Jest tam wszystko opisane no może poza komendą Search ROM, gdzie pdf odwołuje się do innego PDF'a.

    Jak coś pisz na GG, wytłumaczę Ci jak ta kość działa w telegraficznym skrócie
  • #11 4206892
    elektryo
    Poziom 13  
    Posty: 115
    Pomógł: 2
    Udało mi się znaleźć obsługę 1-wire w kursie EP dla '51 (wiec myślę, że do '52 też się nada, bo podobna struktura uC). Jednak największą trudność sprawiają mi opóźnienia, a dokładniej ich tworzenie. Chciałbym skorzystać z wewn. timera, ale nie wiem jak. Szukałem, ale nie znalazłem tego w języku C. Oczywiście są książki i zaczynam myśleć nad kupnem jakiejś z nich.
    Po przestudiowaniu noty katalogowej DS'a dosyć sporo się dowiedziałem. Doszedłem do odczytu z pamięci Scratchpad i tam .... się zawiesiłem.... . Nie wiem jak odebrać pierwsze dwa bajty, tzn. mam funkcje odczytu bajtu z 1-wire (kod w C podany przy mojej 2-iej wypowiedzi) i teraz czy trzeba odczekać jakiś czas, aby odebrać drugi bajt? czy po prostu odczytuje się je bez żadnych przerw czasowych?
  • #12 4207117
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    Mam nadzieje, że to Ci coś pomoże:

    W prawdzie dla AVR, ale myślę, że chodzi o pojęcie co i jak...
    Załączniki:
    • ds1820.c (3.5 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #13 4207329
    elektryo
    Poziom 13  
    Posty: 115
    Pomógł: 2
    Dzięki Mad Bekon. Przestudiuję to ;)
  • #14 4207404
    Mad Bekon
    Poziom 23  
    Posty: 794
    Pomógł: 31
    Ocena: 36
    Aha, tak mi się przypomniało, że opóźnienie po komendzie Start Conversion jest zdaje sie za małe, bo zawsze miałem pierwszy pomiar 85*C

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy odczytu temperatury z czujnika DS18B20 w języku C/C++ przy rozdzielczości 12-bitowej. Problem polega na właściwym odczytaniu dwóch bajtów temperatury z pamięci Scratchpad po komunikacji 1-wire. Wskazano, że komunikacja 1-wire wymaga sekwencji zdarzeń: reset, polecenie ROM, polecenie urządzenia, a następnie odczyt danych. Czujnik zwraca zawartość pamięci, z której należy wyodrębnić dwa bajty temperatury. Przykładowe funkcje do odczytu bajtu z magistrali 1-wire zostały przedstawione, a pytania dotyczyły konieczności opóźnień między odczytami bajtów. Zwrócono uwagę na dokumentację Maxim/Dallas, która szczegółowo opisuje protokół i sposób interpretacji danych. Polecano środowisko CodeVisionAVR z gotowymi bibliotekami do 1-wire i DS18B20, jednak ich przeniesienie na inne mikrokontrolery (np. AT89S52) jest utrudnione ze względu na implementację w asemblerze i integrację z kompilatorem. Dyskutowano także o problemach z opóźnieniami i wykorzystaniu timerów do ich generowania. Wskazano, że odczyt dwóch bajtów następuje bez przerw czasowych, a opóźnienia są istotne głównie po komendzie Start Conversion, aby pomiar był poprawny. Użytkownikowi zalecano dalszą naukę języka C i protokołu 1-wire oraz korzystanie z dostępnych materiałów i przykładów, zwłaszcza w języku angielskim.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA