Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

16 bit değişken

Başlatan bbs2006, 08 Temmuz 2010, 22:35:21

bbs2006

merhaba
16 bit bir degişkenin msb ve lsb sine nasıl bilgi girebilirim. ccs c nasıl olabilir.

esensoy

16 bitlik değişkeninin a olduğunu kabul edelim,
void main(void){
int16 a=0;
int *b=&a;

*b=4;     // bu satırda a değeri 4 olur( msb=0, lsb=4, a=0x0004)
*(b+1)=1; // burada da a 260 olur (msb=1, lsb=4, a=0x0104)
while(1);
}

En tehlikeli an "zafer" anıdır.

mufitsozen

*(b+1) = 1;

satiri a nin msbsini 1 yapmaz, bnin arkasindaki baska bir variable bozar. Cunki C int *b dediginiz icin *(b+1) bdeki adrese 2 ekleyerek bulur.

int degere iki byte degeri koymak icin ya union tanimlayip ayni bolgeyi hem int, hemde iki byte olarak tanimlarsiniz, ki bu tavsiye edilmez, kafa karistiran bir cozumdur yada

a= msb<<8 | lsb; diyebilirsiniz
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

muhittin_kaplan

Yanlız Bence Yukardaki Kod Doğru Hocam
void main(void){
int16 a=0;    //a değişkeni 16bit tamsayı
int *b=&a;   //a nın adresini b pointerine al
*b=4;          //b pointerinin gösterdiği adresteki değeri 4 yap
*(b+1)=1;   //pointeri ile gösterilen adresin başlangıç adresine (16bit olduğu için)1 ekle 
                   //adres 8bit 8 bit olduğu için ilk 8 bit LowByte, ikinci 8 bit HighByte dır.
                  //ve Bir Sonraki Adrese (yani HighByte) a 1 yaz(Dolaylı Adresleme Metodu
while(1);
}

JKramer

Evet, doğru. Derlemede hata vermemesi için küçük bir düzeltme yapmak gerekiyor:
void main(void){
int16 a=0; //a değişkeni 16bit tamsayı
int *b;   
b=&a; //a nın adresini b pointerine al
*b=4;          //b pointerinin gösterdiği adresteki değeri 4 yap
*(b+1)=1;   //pointeri ile gösterilen adresin başlangıç adresine (16bit olduğu için)1 ekle 
                   //adres 8bit 8 bit olduğu için ilk 8 bit LowByte, ikinci 8 bit HighByte dır.
                  //ve Bir Sonraki Adrese (yani HighByte) a 1 yaz(Dolaylı Adresleme Metodu
while(1);
}


Adres:    25     26
              LSB  MSB
              -----a-----
(Little-endian order)

muhittin_kaplan

point=&degisken;
*point=0x02;//lsb 02h yapıyor
++point;
*point=0x01;//msb 01h yapıyor

denedim çalışıyor.(değişkenin içeriğini 0102h olarak değiştiriyor.)

JKramer

union örneği:

   struct dec{
      unsigned int8 a_LSB;
      unsigned int8 a_MSB;
   };

   union {
      unsigned int16 a;
      struct dec b;
   }value;

   value.b.a_LSB=0x04;
   value.b.a_MSB=0x01;


16 bit'lik değişkene değer girmek için:  value.a=260;
LSB'ına değer girmek için:                     value.b.a_LSB=0x04;
MSB'ına değer girmek için:                    value.b.a_MSB=0x01;

bbs2006

ben 8 bitlik ii degişeni birlşeitirp 16 bit elde ettim. bunuda make 16 komutu ile yaptım.Denamedim

radres

Alıntı yapılan: bbs2006 - 09 Temmuz 2010, 19:05:14
ben 8 bitlik ii degişeni birlşeitirp 16 bit elde ettim. bunuda make 16 komutu ile yaptım.Denamedim

Mantıklı.

esensoy

Alıntı yapılan: mufitsozen - 09 Temmuz 2010, 12:17:08
*(b+1) = 1;

satiri a nin msbsini 1 yapmaz, bnin arkasindaki baska bir variable bozar. Cunki C int *b dediginiz icin *(b+1) bdeki adrese 2 ekleyerek bulur.

int degere iki byte degeri koymak icin ya union tanimlayip ayni bolgeyi hem int, hemde iki byte olarak tanimlarsiniz, ki bu tavsiye edilmez, kafa karistiran bir cozumdur yada

a= msb<<8 | lsb; diyebilirsiniz
ben deneyip te yazdım, sen yapmaz diyorsun?
En tehlikeli an "zafer" anıdır.

ErsinErce

Bir çözüm yoluda benden olsun, ister fonksiyon olarak kullanın ister içeriğini alın =)

uint16 make16(uint8 x,uint8 y){
	uint16 z;
	*(((uint8 *)&z)+0)=x;
	*(((uint8 *)&z)+1)=y;
	return z;
}