C '51 - odczyt DS18B20 z 1 miejscem po przecinku



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "Henry\(k\)" <he1nr2ic5o8_at_nospam_op.pl>
Subject: C '51 - odczyt DS18B20 z 1 miejscem po przecinku
Date: Sat, 22 Jul 2006 11:39:11 +0200


Witam.

Męczę mój pierwszy program w C i utknęłem przy DS18B20 a nie mogę znaleźć w
sieci jakichś przykładów.
Odczytuję temp. w 12 bitach do tablicy 2 bajtowej ale chciałbym mieć
wyświetlaną na LCD wartość z dokładnością do 1 miejsca po przecinku.
Najpierw wpisaną wartość w tabele Bd[n] sprawdzam czy jest temp ujemna:

n= Bd[1] ;MSB byte (w Bd[0] mam LSB)
n >> 4 ; przesuwam w prawo
if (n==0x0F).... jesli tak to jest minus, jeśli nie to plus; proste o ile w
najstarsze wpisze się 0 przy przesuwaniu ;-)

ok.. teraz reszta to 4 najmłodsze bity z temp po przecinku w Bd[0] i dalej 8
bitów liczby całkowitej.
I jakoś mnie tak zamroczyło jak napisać kod aby uzyskać do wyświetlenia
temperaturkę z jednym miejscem po przecinku.
Te 4 bity to jakieś dziwne, bo 0001 odpowiada 0.0625 stopnia, 0010 to 2x
0.0625 itd... czyli najpierw trzeba przemnożyć a potem zaokrąglić
Ta temperatura mnie dobija ;-)

Pozdrawiam.

--
Henry(k)
Odpowiadajac na majla usun cyfre z adresu.


Poprzedni Następny
Wiadomość
Spis treści
Date: Sat, 22 Jul 2006 12:02:56 +0200
From: =?ISO-8859-2?Q?Pawe=B3_Hadam?= <hdmp_at_nospam_spam.go2.pl>
Subject: Re: C '51 - odczyt DS18B20 z 1 miejscem po przecinku


Henry(k) napisał(a):

Ta temperatura mnie dobija ;-)



Ja to zrobiłem tak:

temperatura=(temp_tmp>>4)*10 +
( ((temp_tmp&1)?625:0) +
((temp_tmp&0x0002)?1250:0) +
((temp_tmp&0x0004)?2500:0) )/1000 +
((temp_tmp&0x0008)?5:0);

temp-tmp to zmienna trzymająca odczyt z DS'a, temperatura to zmienna
trzymająca temperaturę w jednostkach 0,1 stopnia (tzn. np. wartość 10
oznacza temperaturę 1,0 stopnia, 11 oznacza 1,1 stopnia, itd.)
TRzebba by to ewentuanie przerobić również na temperatury ujemne - mit o
nie było potrzebne i od razu liczę zakładając ze temperatura jest dodatnia.

Poprzedni Następny
Wiadomość
Spis treści
From: Kosma <kosmam.SPAMMERS_at_nospam_GO.TO.HELL.op.pl>
Subject: Re: C '51 - odczyt DS18B20 z 1 miejscem po przecinku
Date: Sat, 22 Jul 2006 12:45:37 +0200


Paweł Hadam wrote:
Ja to zrobiłem tak:

temperatura=(temp_tmp>>4)*10 +
( ((temp_tmp&1)?625:0) +
((temp_tmp&0x0002)?1250:0) +
((temp_tmp&0x0004)?2500:0) )/1000 +
((temp_tmp&0x0008)?5:0);

A ja inaczej:

code char suffix_long[16][4] = {
"0000", "0625", "1250", "1875",
"2500", "3125", "3750", "4375",
"5000", "5625", "6250", "6875",
"7500", "8125", "8750", "9375",
};

Potem indeksowałem tą tablicę wartością powstałą z czterech bitów "po
przecinku", czyli 0..15. Moim zdaniem taka metoda jest dobra, bo
dzielenie liczb przez procek typu 8051 to raczej kiepska sprawa. Do
Twojego zastosowania wystarczy kod w stylu:

code char suffix_short[16] = "0112334456678899";

Potem tylko indeksujesz tą tablicę wartością czterech bitów "po
przecinku". Zwróć uwagę na to, że podane przeze mnie wartości w tablicy
suffix_short zostały zaokrąglone - nie jest to po prostu pierwsza cyfra.
W ten sposób ma się nieco lepszą dokładność...

Kosma

Poprzedni Następny
Wiadomość
Spis treści
From: "Henry\(k\)" <uraevpb_at_nospam_bc.cy>
Subject: Re: C '51 - odczyt DS18B20 z 1 miejscem po przecinku
Date: Sat, 22 Jul 2006 13:58:11 +0200


Użytkownik "Kosma" <kosmam.SPAMMERS_at_nospam_GO.TO.HELL.op.pl> napisał w wiadomości
news:e9svla$nre$1_at_nospam_atlantis.news.tpi.pl...
A ja inaczej:

code char suffix_long[16][4] = {
"0000", "0625", "1250", "1875",
"2500", "3125", "3750", "4375",
"5000", "5625", "6250", "6875",
"7500", "8125", "8750", "9375",
};

Potem indeksowałem tą tablicę wartością powstałą z czterech bitów "po
przecinku", czyli 0..15. Moim zdaniem taka metoda jest dobra, bo dzielenie
liczb przez procek typu 8051 to raczej kiepska sprawa. Do Twojego
zastosowania wystarczy kod w stylu:

code char suffix_short[16] = "0112334456678899";

Potem tylko indeksujesz tą tablicę wartością czterech bitów "po
przecinku". Zwróć uwagę na to, że podane przeze mnie wartości w tablicy
suffix_short zostały zaokrąglone - nie jest to po prostu pierwsza cyfra. W
ten sposób ma się nieco lepszą dokładność...


O i to chyba będzie najlepsze.
Dzięki za pomysł.

Pozdrawiam.

--
Henry(k)
email to Rot13.com


Poprzedni Następny
Wiadomość
Spis treści
Date: Sun, 23 Jul 2006 12:21:20 +0200
From: =?ISO-8859-2?Q?Pawe=B3_Hadam?= <hdmp_at_nospam_spam.go2.pl>
Subject: Re: C '51 - odczyt DS18B20 z 1 miejscem po przecinku


Kosma napisał(a):


A ja inaczej:

code char suffix_long[16][4] = {
"0000", "0625", "1250", "1875",
"2500", "3125", "3750", "4375",
"5000", "5625", "6250", "6875",
"7500", "8125", "8750", "9375",
};

Potem indeksowałem tą tablicę wartością powstałą z czterech bitów "po
przecinku", czyli 0..15. Moim zdaniem taka metoda jest dobra, bo
dzielenie liczb przez procek typu 8051 to raczej kiepska sprawa. Do
Twojego zastosowania wystarczy kod w stylu:


Sprytnie, zapamiętam na przyszłość. :)

Pozdrawiam,
Paweł.