sorgulama rutinini anlamadım

Başlatan armsistem, 04 Ağustos 2012, 10:34:47

armsistem

Arkadaşlar aşağıdaki sorgulama satırını anlamadım.

- msb ile 11110000 sayısını anliyor sonra negative ile yapılıyor

bool negative=false;
if(msb & 0xF0) negative = true;

esensoy

bu if koşulundan true döner mi ki?

if te parantez içinin true dönüp dönmediğine bakar yani
koşul sonucu doğru ise takip eden komutları değil ise else içinde ki komutları koşturur.
burada bildiğim kadarıyla msb & 0xF0 işlemi sonucunun en düşük değerlikli bitinin 1 ya da 0 olduğuna bakacak,
sürekli 0 döndüğünden takip eden negative = true hiç çalışmayacak
En tehlikeli an "zafer" anıdır.

parda

if satırının altında
msb 8 bit ise
msb nin yüksek 4 bitinden (7,6,5,4 bitleri) herhangi biri 1 ise negative = true
yüksek 4 bitin hepsi 0 ise negative = false
olur.

Yazılan kod budur.
Bildiğim tek şey, hiç bir şey bilmediğimdir.

z

Programda kullannı sayıların bit uzunluğu 5+LSB bit.

Durum böyle olunca negatif sayı durumunu anlamak için kendi test rutinini yazmış.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Veli B.

#4
Alıntı yapılan: parda - 04 Ağustos 2012, 11:37:57
...msb nin yüksek 4 bitinden (7,6,5,4 bitleri) herhangi biri 1 ise negative = true
yüksek 4 bitin hepsi 0 ise negative = false olur...


üst nibble(7;6;5;4) bitlerinden herhangi biri 0 olursa sonuç 0 döner.

5 ile 8 bit arasında ki bir değerin MSB kontrolünü yaparak negatif algılamak istemiş sanırım ama mantıklı gelmedi bana. 5 bitlik bir değeri direkt 8 bit kullanarak değerlendirmek yerine, doğrudan negatif algılamanın ne avantajı olabilir ki?
Gerbay' a katılıyorum. 0x80 ile maskelemek daha mantıklı.

Değerin kaç bit olduğunu biliyorsak zaten MSB yi de biliyoruz demektir ve direkt onu kontrol ederiz. Kaç bit olduğunu bilmiyorsak zaten MSB belli olmadığı için sayı pozitif mi negatif mi anlama imkanımız da kalmaz. Mantıklı değil.

z

#5
0x80 ile test etmeyi seçseydi sayıları 3 bit sola kaydırmak zorundaydı. Tercihini kaydırmama yönünde yapmış. Böylece overflow testinde kolaylık sağlamış.
Aslında ne 0xF0 la ne de 0x80 le test yapmalıydı. 0x10 ile yapması yeterliydi fakat sol da kalan bitlerin tamamı sign bit olduğundan programda hata oluşmaz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Veli B.

Alıntı yapılan: z - 04 Ağustos 2012, 12:30:09
0x10 ile yapması yeterliydi fakat sol da kalan bitlerin tamamı sign bit olduğundan programda hata oluşmaz.
Sayı 6/7/8 bit ise ve değerimiz de 0x1x ise negatif görünecektir ve hatalı sonuç çıkar.

z

Hayır. Örneğin LSB 8 bit, MSB de sign bit dahil 5 bit olsaydı en büyük negatif sayı 0x1000 olacaktı.

Bu durumda 0x1000 da 0x3000 da 0x7000 de 0xF000 da aynı sayı demektir. Solda sign guard bitler oluşur.

Durum böyle olunca 0x10 ile test yapmanın sakıncası yok.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Veli B.

Üstadım, MSB nin Sign dahil 5 bit olduğunu varsayıyorsunuz. Bunun kesin böyle olduğuna dair bir ip ucu yok. Bunu anlatmak istiyorum.
@Armsistem;
Kodun berisi, gerisi yok mu?

z

Varsaymıyorum. Öyle.

Adam negatif testi için 0xF0 ile  and işlemi yapmış. Sonuç sıfırdan farklı ise sayı negatiftir demiş. Bunun anlamı MSB nin 4 bitinin sign bit olduğu.
Bu durumda işaret biti de dahil olmak üzere toplam bit uzunluğu 5 + LSB bit uzunluğu.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

parda

Alıntı yapılan: katana - 04 Ağustos 2012, 12:22:53
üst nibble(7;6;5;4) bitlerinden herhangi biri 0 olursa sonuç 0 döner.
Yanıldığınızı düşünüyorum.
Herhangi biri değil, hepsi 0 olursa ..
Bildiğim tek şey, hiç bir şey bilmediğimdir.

armsistem

bool negative=false;
bool limited=false;


void Read_DS18B20 (unsigned char *tam_adr, unsigned int *ondalik_adr)
{
	unsigned char msb,lsb,temp;
	*tam_adr = 0;
	*ondalik_adr = 0;
 
		while(Ow_Reset());
		Ow_WriteByte(0xCC);
		Ow_WriteByte(0x44);
		__delay_cycles(120);
 
		while(Ow_Reset());
		Ow_WriteByte(0xCC);
		Ow_WriteByte(0xBE);
		__delay_cycles(800000);
 
		lsb = Ow_ReadByte();
		msb = Ow_ReadByte();
 
		if(msb & 0xF0) negative = true;
 
		*tam_adr=(msb<<4)+(lsb>>4);
		if(*tam_adr>99) limited = true;
 
		temp = lsb & 0x0F;
		if(temp & 0x01) *ondalik_adr += 625;
		if(temp & 0x02) *ondalik_adr += 1250;
		if(temp & 0x04) *ondalik_adr += 2500;
		if(temp & 0x08) *ondalik_adr += 5000;
 
}




  Read_DS18B20(&TAM_KISIM,&ONDALIK_KISIM);
	  if(limited==false && negative==false)
	  {
	   lcd_clear();
	   lcd_goto(1,1);

armsistem

Gerbay hocam yanıt için çok teşekkürler ,  ds18b20 ile bir devre yapmam lazım fakat ne kadar netten ne kadar program bulduysam çalıştıramadım lpc21xx ile proteus ile simule edip lpc2368 ile gerçekten yapmak istiyorum bu konuda yardımcı olabilirmisiniz.

BULDUKLARIM.

http://www.mcu-turkey.com/?p=17146#more-17146  ---- (msp430 için)
DS18B20 and LPC21XX-----(sürekli -00 değeri okuyorum)

armsistem

#13
Arkadaşlar merhaba ,DS18b20 ile lpc2138 proteus simulasyonunu bir türlü yapamadım. Expkits aldığım lpc1769 kit var onun içerisinden ds18b20 ile yaptıkları program var ,programı devşirerek lpc2138 uyarladım fakat istediğim sonuca ulaşamadım , anladım ki ARM öğrenirken işi üstünkörü değil tam anlamıyla anlayarak yani yutarak yapmak lazım. Çünkü adamlar sıfırdan driver yazıyor ben mevcut olanlarını bile çalıştıramıyorum. program içerisinde active_pll ve zamanlama ile ilgili __delay_cycles içerisinde hata olabileceğini düşünüyorum.

active_pll : Osc:12 Mhz M=1;P=24 === pllclk=288 Mhz:Pclk=12 Mhz yapmaya çalıştım. - Bunun nedeni örnek programın frekanlsarına uydurmaya çalıştım.
__delay_cycles : 1us yapmaya çalıştım , hatta yaptığımada inanıyorum proteus osilaskop ile baktığımda 1 us gördüm.

Nerede bir eksiklik nerede bir hata yapıyorum bulamadım. Proteus + Code dosyaları aşağıdaki linktedir.Konu hakkında yardımcı olan arkadaşlara şimdiden teşekkür ederim.


http://s3.dosya.tc/server2/Tnevc0/mcu_turkey_ds18b20.rar.html