RTV forum PL | NewsGroups PL

C51 - Jak zaimplementować odczyt temperatury DS18B20 z dokładnością do 1 miejsca po przecinku?

C '51 - odczyt DS18B20 z 1 miejscem po przecinku

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - C51 - Jak zaimplementować odczyt temperatury DS18B20 z dokładnością do 1 miejsca po przecinku?

Henry(k)
Guest

Sat Jul 22, 2006 9:39 am   



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.

Paweł Hadam
Guest

Sat Jul 22, 2006 10:02 am   



Henry(k) napisał(a):

Quote:
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.

Kosma
Guest

Sat Jul 22, 2006 10:45 am   



Paweł Hadam wrote:
Quote:
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

Henry(k)
Guest

Sat Jul 22, 2006 11:58 am   



Użytkownik "Kosma" <kosmam.SPAMMERS@GO.TO.HELL.op.pl> napisał w wiadomości
news:e9svla$nre$1@atlantis.news.tpi.pl...
Quote:
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

Paweł Hadam
Guest

Sun Jul 23, 2006 10:21 am   



Kosma napisał(a):

Quote:

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ł.

elektroda NewsGroups Forum Index - Elektronika Polska - C51 - Jak zaimplementować odczyt temperatury DS18B20 z dokładnością do 1 miejsca po przecinku?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map