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

[Atmega32][C] Termometr Cyfrowy - kiepsko mierzy i/lub kiepsko wyświetla

jasiek89 18 Gru 2011 15:57 2637 26
  • #1 10275105
    jasiek89
    Poziom 17  
    Dzień dobry wszystkim!
    Z góry dziękuję za chęć niesiania pomoc w rozwiązaniu problemu.
    Otóż, w ramach akcji: "Polubić i zrozumieć AVR" którą narzuciłem sobie kilka tygodni temu wpadłem na pomysł obczajenia czujnika temperatury DS18B20 w który wyposażona jest moja płyta ewaluacyjna (EvB microSENSE.pl wyposażona w Mega32)
    W projekcie załączonym poniżej jest komplet plików, tak by nie tworzyć zbędnego listingu.

    Poniżej przedstawiam tylko i wyłącznie listing pliku C.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W czym problem? Otóż wyświetla mi 22, 23 stopnie w pomieszczeniu w którym jest może 16-19 stopni. Rozdzielczość badanej temperatury jest co 1 stopień mimo że producent deklaruje więcej. Po złapaniu układu w ręce dochodzi góra do 29 stopni i ani drgnie, a jak wiadomo przy złapaniu czujnika w paluchy powinniśmy wykrzesać jakieś 35-36 stopni.

    Ja obstawiam błędy w przeliczaniu, lub błędy w wyświetlaniu zbadanej temperaturki.
    [b]//Chyba zły dział, przepraszam, ale nie mogę już zmienić. Proszę przenieść nie kasować[/b]
  • Pomocny post
    #2 10275143
    janbernat
    Poziom 38  
    Ad1.
    Wyłącz żarówkę nagrzewającą czujnik.
    Ad2.
    Weź w palce termometr lekarski (prawdziwy- rtęciowy) i zobacz czy uzyskasz 35 stopni.
  • #3 10275343
    jasiek89
    Poziom 17  
    Jak tylko uda się dopaść taki termometr to migiem sprawdzę. A może udało by się uzyskać większą rozdzielczość np. 0,1 stopnia. Bo wskazuje mi 22.000, potem 23.000 24.000 skok co 1 stopień
  • #4 10275437
    janbernat
    Poziom 38  
    zamiast:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    spróbuj:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nie wiem czy pomoże bo nie pamiętam dokładnie priorytetów.
    A jak nie pamiętam to dodaję nawiasy.
  • #5 10276757
    jasiek89
    Poziom 17  
    No niestety kiszka :( Nawiasy nic nie pomogły, tak jak by może źle liczył?
    Zdecydowałem się wyjść na dwa kiepy na balkon z laptopem i układem (desperacja) Na zewnątrz 2 stopnie powyżej zera, a tu minimum 11. Dodam tylko że się z papieroskiem nie spieszyłem i myślę że 10 min paliłem minimum. Więc nie ma bata żeby nie zmierzył:

    [Atmega32][C] Termometr Cyfrowy - kiepsko mierzy i/lub kiepsko wyświetla
    [Atmega32][C] Termometr Cyfrowy - kiepsko mierzy i/lub kiepsko wyświetla
  • #6 10277077
    janbernat
    Poziom 38  
    A gdzie ten czujnik i co tam tak świeci (czyli grzeje).
    Bo mało widać.
  • #7 10277187
    jasiek89
    Poziom 17  
    janbernat napisał:
    A gdzie ten czujnik i co tam tak świeci (czyli grzeje).
    Bo mało widać.

    Czujnik jest bardzo daleko umieszczony od jakichkolwiek diod czy wyświetlacza.
    Na obrazku zaznaczyłem:
    [Atmega32][C] Termometr Cyfrowy - kiepsko mierzy i/lub kiepsko wyświetla
  • #8 10277219
    Logan
    Poziom 30  
    jasiek89 napisał:
    Otóż, w ramach akcji: "Polubić i zrozumieć AVR" którą narzuciłem sobie kilka tygodni temu wpadłem na pomysł obczajenia czujnika temperatury DS18B20 (...)


    W ten sposób to się Kolega absolutnie nic nie nauczy, jeśli chcesz cokolwiek zrozumieć to musisz programy pisać SAM. Przerabianie nie swoich kodów nic Ci nie da...
  • #11 10279263
    jasiek89
    Poziom 17  
    Powróćmy jednak do kodu który przedstawiłem, gdyż XYZ Hobby niestety używa wyświetlacza z RW a ja na stałe mam podłaczony do masy. Dodatkowo mój wyświetlacz to: WC1602A który nie jest kompatybilny (tak mi się wydaje z przedstawionymi bibliotekami)
    Może jednak ktoś wie jak mi pomóc?
  • Pomocny post
    #12 10280826
    janbernat
    Poziom 38  
    wydaje mi się że powinno być char buf[8] a nie float buf[8].
  • #13 10281104
    jasiek89
    Poziom 17  
    janbernat napisał:
    wydaje mi się że powinno być char buf[8] a nie float buf[8].


    tak, tak, już to poprawiłem, zmieniłem zaś na float temp1 i 2 uzyskując tym samym podziałkę co 0,1 choć ze względu na możliwość pomiaru niskich temperatur ujemnych wolał bym 0,5 stopnia.
    Obecna postać kodu wygląda tak, i w tej pozycji w pokoju pokazuje mi 2056,6 stopnia :) To już chyba problem ze wzorkiem, który nie wiem jak obrócić żeby dobrze interpretowało.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Może wielkość tablicy ma znaczenie? Chodzi mi właśnie o buf[9].
  • Pomocny post
    #14 10281265
    janbernat
    Poziom 38  
    Wydaje mi się że wynik jest podawany w formie "sign x.yyy..."
    Czyli chyba trzeba pogrzebać albo w formacie dtostrf() albo te kropkę(przecinek) umieścić jakoś ręcznie.
    Dawno tego nie robiłem.
    Bo masz 20.566stopnia w pokoju.
    A na balkonie miałeś 1.2 stopnia.
  • #15 10281446
    jasiek89
    Poziom 17  
    janbernat napisał:
    Wydaje mi się że wynik jest podawany w formie "sign x.yyy..."
    Czyli chyba trzeba pogrzebać albo w formacie dtostrf() albo te kropkę(przecinek) umieścić jakoś ręcznie.
    Dawno tego nie robiłem.
    Bo masz 20.566stopnia w pokoju.
    A na balkonie miałeś 1.2 stopnia.

    No niestety teraz 2049 stopni na parapecie zewnętrznym. Coś fatalnie przelicza.
    Bo w domu mam podobną temperaturę, a na balkonie faktycznie -2
  • #16 10282886
    jasiek89
    Poziom 17  
    Witam ponownie!
    Przerobiłem to cudo na opcję wyświetlania danych z czujnika i temp1 i temp2 są podawane osobno na wyświetlaczu bez żadnego mnożenia, dzielenia i sam Pan Bóg wie czego jeszcze po prostu dwa odczyty i... uwaga niespodzianka:
    W pokoju temp1 = 132,0 (pływa wartość jedności) oraz wartość 1 dla temp2. Zdecydowałem się zobaczyć co się stanie jak lekko mocniej podgrzeję czujnik więc nad zapalarką osiągnąłem temp1=110,0 i temp2 = 3,0. Czyli jak by nie patrzeć jeździmy od zakresu 0 do 255. Inaczej wyjść nie może.
    Coś mi się wydaje że sprawa śmierdzi kodem U2 :D
    Na parapecie miałem t1=170 i t2=0

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Może ktoś coś gdzieś jakoś pomoże?
  • #18 10285260
    jasiek89
    Poziom 17  
    No więc!
    Zastosowałem się chyba do wskazówek z artykułu w pokoju 22 stopnie przy pomiarze na parapecie 4 stopnie kiedy w rzeczywistości -5.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    No i może jakiś mocium Pan teraz coś powie?
    Przesunąłem 4 bity z jednego i drugiego wg mnie w dobrą stronę dałem signed char. Jest to po prostu uproszczona do maksimum wersja artykułu.
  • Pomocny post
    #19 10286661
    kchpl
    Poziom 15  
    Witam,
    To 4 co dostałeś to jest -5 w kodzie U2, na blogu (bardzo dobrym zresztą) do którego link podał Dondu masz jak to przeliczyć.
  • #20 10287916
    jasiek89
    Poziom 17  
    Nie ogarniam. Wiem jak działa U2. Ale nie mogę rozkminić jak przedstawić te prawidłowe wartości dodatnie i ujemne
  • #21 10301015
    jasiek89
    Poziom 17  
    Witam! Powoli, ale jednak ogarniam w czym jest problem, otóż moją największą bolączączką jest brak umiejętności wprowadzenia liczby np. 11111001 do tablicy jedno wymiarowej to oczywiście przykład, wiem że muszę najpierw odczytać znak, zanegować i dodać jeden. To już ogarniam, ale jak wstawić ciąg 00000110 do tablicy bit po bicie? Szukałem rozwiązania dla siebie na elce ale nie ma tu konkretnego przypadku mojego problemu.
  • Pomocny post
    #22 10312491
    Konto nie istnieje
    Poziom 1  
  • #23 10313569
    jasiek89
    Poziom 17  
    voytaschec napisał:
    Witam.
    To:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    było prawie dobrze, ale konwersję jawną trzeba wykonać przed operacją, gdzie będzie wykorzystywana, a nie na sam koniec, czyli:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    a najlepiej dodatkowo rozdzielić te obliczenia na kilka linijek, bo czasem GCC ma problem ze skomplikowanymi obliczeniami w jednej linii. Osobiście do odczytu temperatury używam takiej funkcji: (działa zarówno w GCC jak i CVAVR)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A jeśli chodzi o konwersję na wyświetlacz to zamiast używać funkcji itoa (i tym podobnym, co dużo miejsca zajmują) to można napisać własną:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zastosowałem się i wyświetla najprawdopodobniej dobrze, jednak z jednym ale, wyświetla mi: 22,00e,
    Obecny kodzik:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    fotka poniżej, stary termometr rtęciowy pokazuje też w granicach tej temperatury więc wskazanie wydaje się być poprawne. Jednak skok co 1 stopień a deklarowane było że ma być część ułamkowa. Nic nie przesuwałem powinny być wszystkie bity:

    [Atmega32][C] Termometr Cyfrowy - kiepsko mierzy i/lub kiepsko wyświetla

    Już w tej chwili chciałbym koledze bardzo podziękować, za pomoc, ale może uda się rozkminić dlaczego wyświetla bez części po przecinku i to e
  • Pomocny post
    #24 10313849
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #25 10313900
    piotrva
    VIP Zasłużony dla elektroda
    Jak to, przecież w C (avrgcc) można normalnie tworzyć zmienne lokalne deklarowane właśnie wewnątrz funkcji...
  • #26 10314172
    jasiek89
    Poziom 17  
    Mam WinAVR i AVRStudio :D
    Ruszyło elegancko wszystko wymiata. Jak dopiszę kosmetykę zamknę temat i wrzucę pełne rozwiązanie. Wszystkim którzy zabrali głos w dyskusji oczywiście zaklikam "POMÓGŁ" Wszystkim bardzo dziękuję! Jesteście ludziska dobre!
  • Pomocny post
    #27 10315662
    Konto nie istnieje
    Poziom 1  
REKLAMA