float, Pic16f877 i C



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
From: "DrGreen" <Drgrin_at_nospam_acn.waw.pl>
Subject: float, Pic16f877 i C
Date: Sat, 29 Jan 2005 03:02:08 +0100



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 :)

--
Pozdrawiam
DrGrin



Poprzedni Następny
Wiadomość
Spis treści
From: "józek" <rk68_at_nospam_vp.pl>
Subject: Re: float, Pic16f877 i C
Date: Sat, 29 Jan 2005 09:55:37 +0100


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" <Drgrin_at_nospam_acn.waw.pl> napisał w wiadomości
news:cteqjj$2gbg$1_at_nospam_mamut1.aster.pl...

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 :)

--
> Pozdrawiam
> DrGrin
>
>



Poprzedni Następny
Wiadomość
Spis treści
From: Krzysztof Rudnik <rudnik_at_nospam_kki.net.pl>
Subject: Re: float, Pic16f877 i C
Date: Sat, 29 Jan 2005 10:58:44 +0100


józek wrote:

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;

Dodac rzutowanie i nie bedzie ostrzezenia.

for(i=0;i<sizeof(moja_zmienna);++i) { tablica[i]= *wskaznik;
++wskaznik; }

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


Poprzedni Następny
Wiadomość
Spis treści
From: "józek" <rk68_at_nospam_vp.pl>
Subject: Re: float, Pic16f877 i C
Date: Sat, 29 Jan 2005 15:10:27 +0100



Nie prosciej memcpy(&moja_zmienna, tablica, sizeof(moja_zmienna));

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



Poprzedni Następny
Wiadomość
Spis treści
From: Gregor <pij_at_nospam_wiecej.piwa.a.nie.spamuj.pl>
Subject: Re: float, Pic16f877 i C
Date: Sat, 29 Jan 2005 18:34:29 GMT



Nie prosciej memcpy(&moja_zmienna, tablica, sizeof(moja_zmienna));

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

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 !!!

argumentach typu unsigned char? Drugi argument memcpy() jest definiowany
jako const.

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

GRG

--
Tutaj sygnatura Grzegorza Domagały - jeśli chcesz wysłać do niego wiadomość
pisz pod adres grzegorz.domagata_at_nospam_chello.at i nie zapomnij dodać
"kielbaska dla cerbera" w treści albo Cerber zeżre twój list...
Strona domowa: http://members.chello.at/grzegorz.domagata/


Poprzedni Następny
Wiadomość
Spis treści
From: "DrGreen" <Drgrin_at_nospam_acn.waw.pl>
Subject: Re: float, Pic16f877 i C
Date: Sun, 30 Jan 2005 00:53:41 +0100



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


--
Pozdrawiam
DrGrin