C '51 - odczyt DS18B20 z 1 miejscem po przecinku

Jul 22, 2006 4 Replies

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) napisał(a):

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.

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

U¿ytkownik "Kosma" snipped-for-privacy@GO.TO.HELL.op.pl> napisa³ w wiadomo¶ci news:e9svla$nre$ snipped-for-privacy@atlantis.news.tpi.pl...

O i to chyba bêdzie najlepsze. Dziêki za pomys³.

Pozdrawiam.

Kosma napisał(a):

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

Pozdrawiam, Paweł.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required