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.

[atmega8,C] DS18B20 błędna temperatura

skoczo 16 Sie 2010 23:12 3198 17
  • #1 16 Sie 2010 23:12
    skoczo
    Poziom 9  

    Witam. Postanowiłem zrobić stację pogodową. Miała by ona podawać temperaturę na zewnątrz i w pomieszczeniu (2 czujniki). Całość postanowiłem zrobić na atmega8 ponieważ taką posiadałem (z zajęć szkolnych) oraz czujnikach DS18B20 (takie były w sklepie). Do wyświetlania temperatury służą dwa mniej więcej takie wyświetlacze
    [atmega8,C] DS18B20 błędna temperatura

    Docelowo ma być inny wyświetlacz więc ich obsługą nie zajmowałem się szczegółowo. Bardziej zależy mi na czujnikach.

    Obsługę czujnika znalazłem w internecie w [url="tym"]http://dl.dropbox.com/u/3283435/ds18b20.pdf[/url] pdf`ie.

    Niby wszystko jest dobrze, gdy wezmę czujnik w rękę i chwilę potrzymam to wyświetlacz wskazuje temperaturę 34. Więc mniej więcej dobrze. Jednak gdy puszczę czujnik temperatura spada. Przy 32 spada od razu do 15 i tak dalej do 9. Jest ona mierzona w pokoju więc nie jest możliwe żebym miał w pokoju 9 stopni. Co może być nie tak?
    Kod programu "http://dl.dropbox.com/u/3283435/main.c">

    Dodatkowo pliki umieściłem w załącznikach.

    0 17
    Załączniki:
  • #2 17 Sie 2010 16:36
    528649
    Użytkownik usunął konto  
  • #3 17 Sie 2010 18:40
    skoczo
    Poziom 9  

    Dzieki za odpowiedź. Użyłem przeliczania temperatury z twojego kodu

    Code:

    int calk = (lsb & 0b11110000)/16 + (msb & 0b00000111)*16;

    I teraz wygląda to dobrze. Ile powinien wskazywać wyświetlacz gdy czujnik trzymany jest w ręce? U mnie pokazuje 34. Czy dalej gubi bit?

    Druga sprawa to jeszcze taktowanie.
    Ja używałem takiej dyrektywy
    Code:

    #define F_CPU 8000000

    Jednak z nia i bez nie ma różnicy w pokazywanej temperaturze. Czy trzeba zmienić taktowanie? Czytałem również gdzieś na forum że jeśli zmieni się taktowanie to obliczenia temperatury też się zmieniają. Czy to prawa?

    0
  • #4 17 Sie 2010 18:58
    528649
    Użytkownik usunął konto  
  • #5 17 Sie 2010 19:22
    skoczo
    Poziom 9  

    Dziękuję za wyczerpującą odpowiedź. Wygląda więc że z moim programem jest już wszystko w porządku. Temperatura w pokoju to 24 stopnie (nie jestem pewien co do poprawności tego pomiaru i będę musiał to sprawdzić ).
    Poprawiłem trochę kod. Dodałem opisy i inaczej rozwiązałem wyświetlanie temperatury (dużo mniej kodu).
    tutaj jest kod http://dl.dropbox.com/u/3283435/main.c

    0
  • #6 17 Sie 2010 19:53
    528649
    Użytkownik usunął konto  
  • #7 17 Sie 2010 20:46
    skoczo
    Poziom 9  

    A więc tak. Jeśli chodzi o wyświetlanie to docelowo ma to być wyświetlacz 2 lub 3 liniowy po 8 lub 16 znaków dlatego teraz nie zajmuje się tym szczegółowo i nie wyświetlam części ułamkowej. Na razie używam tego co mam. Chodzi mi na razie o uruchomienie tego czujnika tak aby działał dobrze. Wyświetlacza innego nie mam bo w sklepie brakło a do innego nie mam czasu jechać. Jeśli chodzi o czekanie 750 ms to miałem to w kodzie ale usunąłem żeby zobaczyć jakie będą wyniki i zapomniałem wstawić ponownie. Wiem że funkcja _delay_ms ma ograniczenie do 262.14 ms. Więc jak wykonam 3X po 250 to będzie dobrze?

    Nie powiedziałem tego na początku ale jest to mój pierwszy program na mikrokontrolery od 3 lat więc jestem wdzięczny za wszystkie uwagi.

    0
  • #8 17 Sie 2010 20:51
    tmf
    Moderator Mikrokontrolery Projektowanie

    Ludzie, czytajcie dokumentację, po coś ona istnieje - _delay_me wcale nie ma ograniczenia do 262ms.

    0
  • #10 17 Sie 2010 20:59
    tmf
    Moderator Mikrokontrolery Projektowanie

    Co do czekania to oczywiście po convert powinieneś te 750ms odczekać (ale to wartość przybliżona, bo przecież ten termometr nie jest taktowany kwarcem), więc może okazać się za krótka. Można zrobić pooling i sprawdzać kiedy konwersja jest gotowa. Można też to całe czekanie olać - wtedy dopóki konwersja trwa odczytujesz poprzednią wartość. Co dla ciebie jest akurat bez znaczenia.
    technics6 - mylisz dokładność z rozdzielczością. Dokłądność tych termometrów akurat jest taka sobie.

    Dodano po 1 [minuty]:

    skoczo napisał:


    Więc bzdury piszą. Zawsze szukaj u żródła - http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

    0
  • #11 17 Sie 2010 21:09
    528649
    Użytkownik usunął konto  
  • #13 17 Sie 2010 21:26
    528649
    Użytkownik usunął konto  
  • #14 17 Sie 2010 22:11
    tmf
    Moderator Mikrokontrolery Projektowanie

    To, że makro (bo to nie jest funkcja), jako argument ma float nie ma znaczenia, przy podawaniu opóźnienia jako stałej. Jeśli tam wstawisz zmienną to boleśnie się przekonasz, że tak nie należy robić. Ułamek się zapewne bierze stąd, że jeden krok iteracji trwa ileśtam taktów zegara, a nie setnych ms (a takt dla 16MHz trwa 62,5ns.

    skoczo - jeszcze jedna darmowa rada - nie tylko czytać u źródła, ale także całość a nie wyrwane zdania :)

    0
  • #15 17 Sie 2010 23:30
    gaskoin
    Poziom 38  

    tmf napisał:

    skoczo - jeszcze jedna darmowa rada - nie tylko czytać u źródła, ale także całość a nie wyrwane zdania :)


    W zeszłym tygodniu było chyba trylion tematów o tym termometrze i też ten sam błąd został popełniony...

    Wniosek? Wywalić przycisk "szukaj"

    -1
  • #16 18 Sie 2010 07:53
    528649
    Użytkownik usunął konto  
  • #17 18 Sie 2010 08:21
    tmf
    Moderator Mikrokontrolery Projektowanie

    Na AVR nie ma double, double==float. A jeśli podajesz argument jako stałą to wszystkie obliczenia są przeprowadzane na etapie kompilacji, stąd też niepotrzebne jest libm. Jeśli tam wstawisz zmienną to trzeba dołączyć całe libm i robi się lekka masakra.

    0
  • #18 18 Sie 2010 08:58
    528649
    Użytkownik usunął konto  
  Szukaj w 5mln produktów