float, Pic16f877 i C

Jan 29, 2005 5 Replies

Witam!



mam nastêpuj±cy problem: urzdzenie z którym siê komunikuje przesy³a mi dane w postaci zmiwennoprzecinkowej. klopot w tym, ze float'a dostaje w formie 4 bajtow, ktore trzeba jakos z³o¿yæ do kupy zeby dostac floata. potem tego floata chce wyswietlic na lcd, a to nastêpny problem bo oczxywiscie moge wyswietlac tylko pojedyncze bajty.



podejrzewam ze jak mi siê uda to "z³o¿yc" to dam rade funkcja printf wyswietlic dane, ale za cholere nie wiem jak tego dokonac. float nie pozwala na opercaje bitowe.



pomozcie :)


Witaj U¿ywam do tego prostej sztuczki. Kompilator, co prawda generuje ostrze¿enie o niedozwolonej konwersji typu, ale sobie z tym radzi i program dzia³a poprawnie. Napisa³em krótki programik, który to zobrazuje. W pierwszej czê¶ci dokonuje rozdzia³u liczby float na elementy typu unsigned char i umieszcza je w tablicy. W drugiej czê¶ci odwrotnie: obiekty typu char z tablicy, konwertuje na float.

#include <pic1687x.h>

char i; float moja_zmienna; unsigned char tablica[sizeof(float)]; unsigned char *wskaznik=0;

main(void) {

//------------------------------------------zapis typu float do tablicy typu unsigned char-----------------------

moja_zmienna=1.234; //do testu wskaznik=&moja_zmienna; for(i=0;i<sizeof(moja_zmienna);++i) { tablica[i]= *wskaznik;

++wskaznik; }

//-------------------------------------------odczyt obiektów unsigned char z tablicy i przekszta³cenie do float---

moja_zmienna=0; // do testu wskaznik=&moja_zmienna; for(i=0;i<sizeof(float);++i) { *wskaznik = tablica[i]; ++wskaznik; }

for(;;); }

//---------------------------------------------end------------------------------------------------------------

pozdrawiam: rjk "józek" Department of Electrical and Computer Engineering

U¿ytkownik "DrGreen" snipped-for-privacy@acn.waw.pl> napisa³ w wiadomo¶ci news:cteqjj$2gbg$ snipped-for-privacy@mamut1.aster.pl...

Dodac rzutowanie i nie bedzie ostrzezenia.

Nie prosciej memcpy(&moja_zmienna, tablica, sizeof(moja_zmienna)); Petla moze byc wskazana jesli np. nie zgadza sie kolejnosc bajtow.

Tyle to zadziala o ile format tego transmitowanego floata zgadza sie z formatem stosowanym w bibliotece. Sa jakies standardy wiec spora szansza ze zadziala.

Krzysiek Rudnik

Tak jest prostszy zapis, ale jak wykorzystaæ t± funkcjê w drug± stronê, bez zbêdnych przekszta³ceñ - tzn.zmienn± typu float za³adowaæ do tablicy o argumentach typu unsigned char? Drugi argument memcpy() jest definiowany jako const.

pozdr

Najprosciej float bufor = x; // przypisanie wartosci unsigned char *ptr = (unsigned char *)&bufor; ptr[0...3] - poszczegolne bajty float

Inna metoda - przez unie (nie gwarantuje poprawnosci) union zbiorek { float float_value; unsigned char char_value[sizeof(float)]; };

i deklaracja union zbiorek test

test.float_value = 14.47; // przypisanie wartosci flaot test.char_value[1...3] - wartosci poszczegolnych bajtow flaot.

Na wszelki wypadek zaznacze (nie jestem pewny co chcesz uzyskac) - w ten sposob nie uzyskasz "czytelnej dla czlowieka" wartosci !!!

W tym przypadku oznacza to tylko tyle ze memcopy gwarantuje ze nie zmieni zawartosci drugiego argumentu.

GRG

Dziêki, w poniedzialek sie okaze czy dziala jak nalezy :)

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required