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.

Termometr z użyciem 18B20 i wyświetlacza LCD

Radziasss 12 Maj 2013 20:51 2439 7
  • #1 12 Maj 2013 20:51
    Radziasss
    Poziom 9  

    Witam,
    niedawno zainteresowałem się programowaniem mikrokontrolerów AVR i elektroniką w ogóle. Od kilku dni próbuję zrobić prosty termometr w oparciu o czujnik Dallas 18B20, wyświetlacz LCD 2x16 ze sterownikiem HD44780 i mikrokontroler Atmega8. Korzystam z biblioteki pana mirkka do obsługi LCD, natomiast do obsługi czujnika temperatury korzystam z tej strony:

    Link

    Podłączenie czujnika na płytce stykowej wygląda następująco:

    Termometr z użyciem 18B20 i wyświetlacza LCD

    Na wyświetlaczu otrzymuję niestety jedynie znak zapytania jako wartość odczytu temperatury:

    Termometr z użyciem 18B20 i wyświetlacza LCD

    Czy możliwe jest, że błąd tkwi w miejscu wyświetlania danych na LCD? Lub w momencie przetwarzania odebranych danych? Nie widzę nigdzie błędu w podłączeniu...
    Próbowałem skorzystać z innej biblioteki do 18b20 - rezultat podobny (nie udało mi się pobrać wartości temperatury). Wymiana czujnika nie przyniosła żadnej zmiany.

    Fragmenty mojego kodu:

    main.c

    Kod: c
    Zaloguj się, aby zobaczyć kod


    d18b20.h
    Kod: c
    Zaloguj się, aby zobaczyć kod


    hd44780.c - funkcja wyświetlania tekstu:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Będę wdzięczny za wszystkie sugestie i podpowiedzi.

    0 7
  • #2 13 Maj 2013 07:04
    sgt_ding
    Poziom 15  

    Witam,
    wg mnie błąd leży po stronie konwersji temperatury, czyli w tym fragmencie kodu:

    Code:
    [syntax=c]temp = ((ds18b20_pad[1] << 8) + ds18b20_pad[0]) / 16.0 ;[/syntax]

    Musisz zerknąć do datasheet'u ds18b20 i zobaczyć jak zapisana jest temperatura w dwóch najmniej znaczących bajtach, czyli Twoich ds18b20_pad[0] i ds18b20_pad[1].
    ds18b20_pad[0] zawiera część całkowitą i część ułamkową, a poza tym w ds18b20_pad[1] zawartych jest 5 bitów odpowiedzialnych za znak temperatury.

    0
  • #4 13 Maj 2013 10:21
    Radziasss
    Poziom 9  

    Odwiedziłem już chyba wszystkie strony, które mają "18b20" w treści :) na tej też byłem, ale być może coś przeoczyłem, więc przeczytam raz jeszcze. Dzięki bardzo za wskazówki, będę informował czy coś udało mi się ruszyć.

    0
  • #5 14 Maj 2013 18:01
    Radziasss
    Poziom 9  

    Udało mi się znaleźć rozwiązanie w innym temacie:

    Link

    Kolega korzystał tam z tej samej biblioteki do 18b20 co ja, ale użył innej metody do utworzenia stringa na LCD. W skrócie - zastąpiłem polecenie:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    następującym:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    sgt_ding napisał:
    wg mnie błąd leży po stronie konwersji temperatury, czyli w tym fragmencie kodu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ten fragment okazał się jednak poprawny.

    Teraz śmiga. Dzięki za Wasze podpowiedzi.

    0
  • #6 14 Maj 2013 19:16
    tmf
    Moderator Mikrokontrolery Projektowanie

    Problemem jest używanie na siłę typu double, tam gdzie nie jest to potrzebne. Normalna wersja sprintf z AVRlibc jest okrojona i float/double nie wspiera. Aby to działało trzeba zlikować program z biblioteką lipprintf. Ale po co, skoro float jest niepotrzebny?

    0
  • #8 14 Maj 2013 20:56
    Radziasss
    Poziom 9  

    tmf napisał:
    Problemem jest używanie na siłę typu double, tam gdzie nie jest to potrzebne.

    To nie tak, że ja za wszelką cenę staram się używać double - po prostu skorzystałem z czegoś co jakaś dobra duszyczka udostępniła, a sam jeszcze nie znam się na tyle, żeby wprowadzić swoje modyfikacje.

    dondu napisał:
    A ja zapytam ile po kompilacji zajmuje Twój program?

    I dodam drugi link: https://www.elektroda.pl/rtvforum/viewtopic.php?p=10789430#10789430
    czytaj ostatni post.


    Oczywiście dondu masz rację - zajmował 3398 bajtów, po pozbyciu się doubli - 1956 bajtów. Czyli tak jak ktoś mądrze wyliczył, prawie 1,5kB do przodu. Wstawię jeszcze kawałek swojego kodu po modyfikacji, może komuś się przyda:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Piwko dla Was. Wyrozumiałości! :)

    0