Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: armsistem - 04 Ağustos 2012, 10:34:47

Başlık: sorgulama rutinini anlamadım
Gönderen: armsistem - 04 Ağustos 2012, 10:34:47
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;
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: esensoy - 04 Ağustos 2012, 11:27:58
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
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: parda - 04 Ağustos 2012, 11:37:57
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.
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: z - 04 Ağustos 2012, 12:04:33
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ış.
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: Veli B. - 04 Ağustos 2012, 12:22:53
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.
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: z - 04 Ağustos 2012, 12:30:09
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.
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: Veli B. - 04 Ağustos 2012, 12:35:22
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.
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: z - 04 Ağustos 2012, 12:39:04
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.

Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: Veli B. - 04 Ağustos 2012, 12:46:00
Ü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?
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: z - 04 Ağustos 2012, 14:14:28
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.
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: parda - 04 Ağustos 2012, 16:54:30
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 ..
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: armsistem - 05 Ağustos 2012, 01:33:36
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);
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: armsistem - 05 Ağustos 2012, 02:57:35
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 (http://www.mcu-turkey.com/?p=17146#more-17146)  ---- (msp430 için)
DS18B20 and LPC21XX (http://www.scribd.com/doc/28699533/DS18B20-and-LPC21XX#)-----(sürekli -00 değeri okuyorum)
Başlık: Ynt: sorgulama rutinini anlamadım
Gönderen: armsistem - 05 Ağustos 2012, 15:40:34
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 (http://s3.dosya.tc/server2/Tnevc0/mcu_turkey_ds18b20.rar.html)