24 bitlik float sayıyı 3 byte olarak ayırmak

Başlatan Kazım, 05 Mart 2013, 15:15:54

Kazım

Arkadaşlar float olarak belirttiğim akım değişkenini RF ile 3 byte halinde karşıya göndermem gerekiyor VEYA 32 bitlik 4 byte da toplayabilirim yöntem buysa.(TX FIFO 1byte olduğu için ).Hi-Tech c 'de Float değişkeni 24bit sanıyorum.Yani 24 bitlik değeri 3 er bytına ayırıp. Alıcıda da tekrar ;

float result=((float) (byte1 + byte2 + byte3 )) gibi birşey yapmam lazım da sanırım böyle, bölme yada toplama ile olmaz.bu iki işlemi yapabileceğim formulasyon nedir? Hatta bunları anlatan herhangi bir kaynak varsa mantığını da öğrenmek istiyorum.

Ancak birşey de var ki doğru sonuç için yani 24 bitlik değerin önüne sıfır yazınca sonuç yanlış - arkasına yazınca doğru çıkıyor.calculatörde.Ancak arkasına 0 olarak  bir yazıncada sonuç 32 bit oluyor.Nedir yani durum.Önceden yapan varsa açıklarsa sevinir.

fatih6761

Eğer virgülden sonra çok ayrıntı lazım değilse fixed-point'e çevirip karşı tarafa yollayıp tekra floating-point'e çevirebilirsiniz.
Diğer bir seçenek ise HiTech'in kullandığı floating-point yapısını inceleyerek float değişkenin bellekteki adresini almak. Böylece atıyorum float 24-bit ise float değişkenin adresinden itibaren 3 baytı işaretçi ile karşı tarafa yollayıp, aynı şekilde pointer ile karşı tarafta float'a yazılacak. Zaten PIC'lerde dahili floating point birimi olmadığından sorun olamaycaktır...

Kazım

#2
fatih bey teşekkürler :

unsigned char *chptr;
chptr = (unsigned char *) &floatvalue;
Tx(*chptr++);Tx(*chptr++);Tx(*chptr++);Tx(*chptr);
 

BenC

TX FIFO 1 byte ta olsa 10 byte ta olsa değişen bişey yok. Adı üstünde FIFO. (tampon bellek) Siz float değişkeninizi atof() veya sprintf() ile string yapın karşıya gönderin karşıda da tam tersini atof() ile float yapın. 

atof() fonksiyonu ile ascii yapabilirsin. Veya sprintf() kullanabilirsin ama çok yer kaplar.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

Kazım

#4
BenC , teşekkür ederim. evet string olursa FIFO 8bit olması sorun değil tabii.. zaten değeri remotede LCD yazdıracağım string olması daha da iyi . Ancak ana mantığı anlamak açısınıdan pointer kullanıp, alıcıda adreslere yazdırdıktan sonra değerlerini alacağım.Zaten amacım mümkün olduğunca projeyi zorlaştırmak ki mümkün olduğunca çok şey öğreneyim.. Yoksa senin önerin benim işimin direk çözümü

FIFO da 10byte olsa değişen çok şey olurdu. Yazının bu tarafına katılmıyorum.32biti tek seferde gönderebilirdim.

BenC

#5
Alıntı yapılan: graski - 06 Mart 2013, 15:31:23
FIFO da 10byte olsa değişen çok şey olurdu. Yazının bu tarafına katılmıyorum.32biti tek seferde gönderebilirdim.


Siz veriyi RF üzerinden nasıl göndereceksiniz? (Bit-bit mi, yani bağımsız size ait bir protokolle mi? yoksa seri port protokolü ile mi? ) )Ben sizin verinizi seri port protokolü ile RF üzerinden göndereceğinizi düşünmüştüm. O nedenle 10Byte olsa da fark etmez demiştim. Eğer seri protokol ile gönderecekseniz 3 byte 'ı nasıl bir anda gönderecekseniz? Protokol gereği byte byte gitmiyor mu ? Seri de çok hızlı veri alışverişi (full modem) yapıyorsanız tabi ki FIFO önemli.     
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

Kazım

#6
BenC Evet evet haklisin.cihazin fifosu 64byte ve tek seferde doldurabiliyorsun  .bu kafami karistirdi.tabii ki 64 byte ta olsa sonucta byte byte gondermek sart.ki zatn islemcinin tamponu da 8 bit.Bilmeyerek saygisizlik ettiysem kusuruma bakma .

BenC

Hocam estağfurullah ne saygısızlığı. Birbirimize yardımcı olamak amaç.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

kenan_re

ufak bi örnkete benden  :)
unsigned char data[3];
float data_convert(void)
{
	unsigned short long reg=0;
	float temp;
	reg =(reg | data[2])<< 8;
	reg =(reg | data[1])<< 8;
	reg =(reg | data[0]);
	temp = reg;
	temp = (temp / 10066329) * 10;

	return temp;
	}