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.

[BASCOM][AVR] DS18B20, prośba o weryfikację kodu.

kbw24 28 Lut 2012 23:23 2157 4
  • #1 28 Lut 2012 23:23
    kbw24
    Poziom 14  

    Witam

    Głowiłem się ostatnio nad obsługą czujnika DS18B20. Trochę mi to zajęło czasu - szukanie, zrozumienie itd... Z kilku źródeł skleiłem poniższy program.
    W docelowym projekcie ma być to termometr do komputera zintegrowany w większym urządzeniu. Sprawdzanie i pomiar temperatury będzie wywoływane przez odpowiednio użyty Timer0, co około 1 sekundę - dlatego to opóźnienie.
    Proszę o sprawdzenie, ponieważ jest to mój pierwszy program dla tego czujnika i nie jestem pewien, czy wszystko ok, i czy przypadkiem nie ma czegoś zbędnego.
    Z góry przepraszam za dziwne opisy. :D Program w listingu i jako załącznik.

    Pozdrawiam.
    kbw24


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0 4
  • #2 29 Lut 2012 09:56
    arktik1
    Poziom 27  

    To chyba jeden z dziwniejszych kodów jakie widziałem do obsługi DS. :D
    Przede wszystkim wywal z tego wszystkie Waitms, Waitus, Wait, no chyba że program ma tylko mierzyć temperaturę i nic więcej, ale i tak jest tego za dużo.
    Cały odczyt i konwersję przenieś do pętli głównej.
    Nie wiem tylko z czego brałeś materiały, na elektrodzie są prawidłowo pisane programy do obsługi temperatury.
    To jeden z nich:
    https://www.elektroda.pl/rtvforum/viewtopic.php?t=2208832&highlight=

    0
  • #3 29 Lut 2012 14:27
    kbw24
    Poziom 14  

    Witam

    Odczyt i konwersja jest w pętli głównej.;)

    Na samym początku("Change Resolution") jest zmiana rozdzielczości czujnika. Do komputera raczej nie jest potrzebna dokładność do trzech czy czterech miejsc po przecinku. Zmianę tą starczy wykonać na samym początku programu, nie ma potrzeby wciskania tego do pętli.
    Źródło stąd: https://www.elektroda.pl/rtvforum/topic1026953.html

    Co do poleceń wait, może być ich tak o dwa za dużo... Pierwsze po zmianie rozdzielczości - "waitus 100" - dałem je bo nie jestem pewien, czy może układ nie ma jakiejś bezwładności :D Drugie to zapewne "waitms 1150", które dałem jako wizualizacja wystąpienia przerwania timera, który w swoim podprogramie będzie odczytywał temperaturę.
    W części oznaczonej "Prepare for read(convert)" są dwa polecenia wait, które podobno są potrzebne - tabela 2. w nocie katalogowej - "Table 2. Thermometer Resolution Configuration". Chociaż podczas zabaw zdarzyło się, iż z mniejszym opóźnieniem również występowała(chyba poprawna) konwersja na 12bit.

    Program ma tylko mierzyć temperaturę, ale będzie zamieszczony w większym, na przerwaniu timera0.

    Źródłami były dla mnie również linki wyszukane na google, a zaczątkiem kod poniższy.

    Dzięki również za linka, tego google mi nie znalazło.:P

    Pozdrawiam
    kbw24

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #4 29 Lut 2012 21:47
    arktik1
    Poziom 27  

    Jeśli termometr będzie w przerwaniu np co 1 sec, to możesz usunąć :
    " Waitms 750 'przeczekaj czas konwersji"
    To opóźnienie będzie tylko spowalniało powrót do pętli głównej.
    Konwersja i tak się dokona bo przecież program będzie tam skakał co sekunda.
    Różnica jest tylko taka, że przy pierwszym włączeniu zasilania do układu termometr pokaże 85 stopni.
    Przy następnym skoku temperatura będzie już prawidłowa.
    No i zamiast "Lowerline" możesz stosować "LOCATE X , Y", działa trochę dokładniej.

    0
  • #5 29 Lut 2012 23:58
    kbw24
    Poziom 14  

    Dzięki :)

    Aktualnie przerzuciłem się na Twój "okrojony" program z linka, który dałeś na początku, jedynie lekko zmieniony.
    Po znalezieniu błędu w programie z timerem, przerwanie występuje co ok. 1sek, tak jak chciałem.
    Opóźnienie usunąłem, działa. :)
    Ostatnio zauważyłem, że 'locate' jest dokładniejsze i powoli odchodzę od 'lowerline'.

    Timer0 liczy sobie w pewnej zmiennej do 75, po osiągnięciu tej wartości przechodzi dalej i sprawdza temperaturę. Dodatkowo, aby ograniczyć odświeżanie LCD, dałem zmienną string jako zawierającą to, co aktualnie wyświetla LCD. Jeżeli nie jest ona równa odczytanej temperaturze, dopiero następuje aktualizacja. To tak jeżeli chodzi o skróconą zasadę działania. ;)

    Dołączam Twój zmodyfikowany kod(główny fragment, bez powyższych udogodnień), może się przyda. Ja używam trybu 8bit dla LCD, Atmegi 32 i w ogóle inaczej wszystko podłączone, więc nie chciał bym nikogo zmylić.


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Jeszcze raz dzięki i pozdrawiam.
    kbw24

    0