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] - Błędny odczyt temperatury z DS1820

chomiczekOKP 13 Lis 2014 14:03 1224 17
  • #1 13 Lis 2014 14:03
    chomiczekOKP
    Poziom 12  

    Wiem, że jest kilka podobnych tematów, które niby wskazują że problemy wynikają z różnic pomiędzy DS1820 a DS18B20, czy ewentualnie błędnej konfiguracji, ale u mnie wydaje się, że w programie jest wszystko ok, a mimo to, moim zdaniem temperatura jest zawyżana o kilka stopni (pomiar w temperaturze pokojowej) pokazuje około 24-26 st C, gdy tymczasem temperatura jest o kilka stopni niższa.

    Poniżej kod, którego używam:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    W jaki sposób mogę w 100% zweryfikować prawidłowość pomiarów?

    0 17
  • #2 13 Lis 2014 14:38
    witoldwitoldowicz
    Poziom 28  

    Z tego co przeczytałem w pdf to wystarczy

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    W msb jest tylko 0 lub 255.

    0
  • #3 13 Lis 2014 14:50
    chomiczekOKP
    Poziom 12  

    Hmm.. nie wiem o jakim PDFie mówisz, ale ok :)

    Rozumie, że to co podesłałeś to fragment kodu, który powinien u siebie podmienić, czyli ten fragment:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    na ten?
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #5 13 Lis 2014 15:32
    chomiczekOKP
    Poziom 12  

    Tak, czytałem tego PDFa, jak zobaczysz to kod jest właśnie stamtąd, ale tak jak mówię, wg mnie termometr przekłamuje.

    Będę dzisiaj testował na DS18B20 zobaczymy czy również będą przekłamania.

    Tak g'woli uściślenia, ja mam DS1820, nie DS18B20 (tzn teraz mam oba, ale problem dot. tego pierwszego).

    0
  • #6 13 Lis 2014 15:46
    witoldwitoldowicz
    Poziom 28  

    Jeżeli urzywasz DS1820 to czemu dzielisz przez 16 tracisz 4bity czyli 8 stopni.

    Dodano po 5 [minuty]:

    Teraz to już tego nie rozumiem jak Ci to wogóle działa.

    0
  • #7 13 Lis 2014 15:55
    chomiczekOKP
    Poziom 12  

    tak jak pisałem wcześniej kod jest z PDFa, którego podałeś (albo na nim wzorowany, już nie pamiętam) ale czytając o różnicach pomiędzy DS1820 i DS18B20 szukałem przykładu dla tego pierwszego.. stąd moje pytanie..

    Czyli przez ile powinienem dzielić?

    0
  • #8 13 Lis 2014 17:32
    witoldwitoldowicz
    Poziom 28  

    Przez 2 bo rozdzielczość jest 0.5 stopnia.

    Dodano po 1 [godziny] 33 [minuty]:

    Z tego co widze to najprościej będzie tak

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    jeżeli MAKEINT działa tak jak myśle.
    http://avrhelp.mcselec.com/index.html?makeint.htm

    0
  • #9 13 Lis 2014 18:35
    chomiczekOKP
    Poziom 12  

    Wychodzi z tego, że zastosowany u mnie układ to DS18B20 (wg dokumentacji płytki jest DS1820), ale przy podzieleniu T/2 otrzymuje wynik +/- 195C, przy podzieleniu na 16 mam +/- 24C.. Czyli rozumie, że powinienem zmienić/dostosować program do DS18B20.. spróbuje i dam znać.

    0
  • #10 14 Lis 2014 14:30
    chomiczekOKP
    Poziom 12  

    Program działa, chociaż wydaje mi się, że temperatura jest ciut zawyżona, no ale może i faktycznie taka jest.

    Mam jeszcze inny problem, a właściwie póki co za małą wiedze w temacie, żeby wiedzieć jak ten temat ugryź, a mianowicie:

    Mam tak zdefiniowane zmienne:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Wg tego co znalazłem w innym temacie to zmienna string zostanie 'przepisana' do tablicy, żeby potem mieć dostęp do elementów tablicy muszę je wywoływać np.
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    I niby wszystko jest ok, ale przy takiej próbie porównania
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    otrzymuje komunikat o błędzie:
    Code:

    ( or ) missing [IF(CHR(S2(1)) = 4 THEN]
    Assigment error [IF(CHR(S2(1))):0 THEN:0]


    Przypuszczam, że coś nie tak z typem zmiennej, ale czy na pewno..

    A może w ogóle źle podszedłem do tematu?
    W sumie niekoniecznie muszę stosować OVERLAY, założenie jest takie, że na zmiennej typu string będę mógł pracować jak na tablicy, tzn chce móc pobierać dowolny elementy tablicy, etc.

    String, o którym mowa będzie zawierał tak naprawdę tylko cyfry.
    Może zamiast string zastosować inny typ zmiennej? Integer jest za mała, ale Long już jest ok, pytanie jak to się ma do zajętości pamięci? No i czy w ogole to coś zmieni?

    EDT: Czy w Bascomie jest coś takiego jak rzutowanie typu zmiennych?

    0
  • #11 14 Lis 2014 19:55
    witoldwitoldowicz
    Poziom 28  

    If(chr(S2(1)) = 2 Then
    Brak nawiasu )

    0
  • #12 14 Lis 2014 20:47
    emarcus
    Poziom 35  

    chomiczekOKP napisał:
    Program działa, chociaż wydaje mi się, że temperatura jest ciut zawyżona, no ale może i faktycznie taka jest.

    Mam jeszcze inny problem, a właściwie póki co za małą wiedze w temacie, żeby wiedzieć jak ten temat ugryź, a mianowicie:

    Mam tak zdefiniowane zmienne:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    ..................

    otrzymuje komunikat o błędzie:
    Code:

    ( or ) missing [IF(CHR(S2(1)) = 4 THEN]
    Assigment error [IF(CHR(S2(1))):0 THEN:0]


    Przypuszczam, że coś nie tak z typem zmiennej, ale czy na pewno..



    String, o którym mowa będzie zawierał tak naprawdę tylko cyfry.
    Może zamiast string zastosować inny typ zmiennej? Integer jest za mała, ale Long już jest ok, pytanie jak to się ma do zajętości pamięci? No i czy w ogole to coś zmieni



    Nie możesz kłaśc 'overlay' zmiennych numerycznych (byte) na zmienne textowe (string), nawet jeżeli zawierają "cyfry". Tylko dla nas (ludzi), cyfry kojarzą się z pewną relatywną, specyficzną do objektu wartością; dla processora są to tylko znaki (ogólnie 'characters') nie posiadające wartości, to znaczy nie możesz na nich prowadzic działań matematycznych.

    Cytat:

    A może w ogóle źle podszedłem do tematu?
    W sumie niekoniecznie muszę stosować OVERLAY, założenie jest takie, że na zmiennej typu string będę mógł pracować jak na tablicy, tzn chce móc pobierać dowolny elementy tablicy, etc.


    Możesz oczywiście utworzyc tablicę zawierającą elementy typu 'string', podobną do każdej innej tablicy, w której kazdy element ("x") ma przydzielony w/g kolejności (0 do n) index i wg. tego indeksu wywołujesz swoją zmienną textową.
    Index oczywiście będzie zmienną numeryczną wskazujący na pozycję szukanego znaku w tablicy.

    e marcus

    0
  • #13 15 Lis 2014 10:02
    chomiczekOKP
    Poziom 12  

    witoldwitoldowicz napisał:
    If(chr(S2(1)) = 2 Then
    Brak nawiasu )


    niestety, ale dodanie nawiasu nie rozwiązuje problemu, cały czas ten sam komunikat.

    @emarcus - więc jak powinienem to zrobić?

    0
  • #14 15 Lis 2014 10:06
    witoldwitoldowicz
    Poziom 28  

    If chr(S2(1)) = "2" Then

    0
  • #15 15 Lis 2014 10:08
    chomiczekOKP
    Poziom 12  

    aaaa.. no tak.. przecież to nie jest liczba.. człowiek patrzy, wie i nie widzi :)

    edt: albo i nie, ciągle to samo

    0
  • #16 16 Lis 2014 01:06
    emarcus
    Poziom 35  

    chomiczekOKP napisał:


    niestety, ale dodanie nawiasu nie rozwiązuje problemu, cały czas ten sam komunikat.

    @emarcus - więc jak powinienem to zrobić?


    Nie jest wiadomo co chcesz docelowo osiągnąć.
    Napisz jaki jest cel tej procedury.
    Wracając do poprzedniego twojego postu i fragmentu:
    Cytat:

    Mam tak zdefiniowane zmienne:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod




    W sytuacji jak powyżej, mając string zawierający tylko cyfry i zechcesz z nich utworzyć x-elementowy array numeryczny to zamiast 'ovrelay' skorzystaj z Str2digits (czyt. String-to-digits); w ten sposób będziesz miał oddzielny dostęp do kazdej cyfry zawartej w string.
    Szczegóły znajdziesz w Basom Help.

    e marcus

    0
  • #17 17 Lis 2014 13:11
    chomiczekOKP
    Poziom 12  

    emarcus napisał:
    W sytuacji jak powyżej, mając string zawierający tylko cyfry i zechcesz z nich utworzyć x-elementowy array numeryczny to zamiast 'ovrelay' skorzystaj z Str2digits (czyt. String-to-digits); w ten sposób będziesz miał oddzielny dostęp do kazdej cyfry zawartej w string.
    Szczegóły znajdziesz w Basom Help.


    hmm.. no nie do końca to działa.

    Zrobiłem tak jak w manualu i niestety kicha:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Ostatnia pętla powinna mi pokazać 12345678 (natomiast nic nie zwraca)..
    Źle używam Str2digits?

    0
  • #18 17 Lis 2014 16:42
    emarcus
    Poziom 35  

    chomiczekOKP napisał:

    hmm.. no nie do końca to działa.

    Zrobiłem tak jak w manualu i niestety kicha:
    ...
    Ostatnia pętla powinna mi pokazać 12345678 (natomiast nic nie zwraca)..
    Źle używam Str2digits?

    Widocznie nie zrobiłeś zgonie z instrukcją.
    Funkcja "Str2digits" jest trochę 'tricky' - przestudiuj ją jeszcze raz i porównaj z tym przykładem:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Hint: pierwszy element w utworzonej numerycznej array (S2) mówi ile characters zawierała string (S).

    e marcus

    0
  Szukaj w 5mln produktów