Shift Right ve Shift Left İşlemi

Başlatan alikilavuz, 03 Aralık 2011, 16:38:51

alikilavuz

Merhaba ,

Yanlış bilmiyorsam Hitech C de Shift Left (<<) ve Shift Right (>>) işleminde MSB'ye ve LSB'ye hep 0 biti geliyor. Assembly de Carry biti değişimi ile istenilen bit en sona veya başa getirilebiliyordu.

Mesela b'11111110'  byte ını sola bir kaydırdığımda b'11111101' olmasını Hitech C deki << operatörü ile nasıl sağlayabilirim. Bunu sağlamak için ilave bir tersleme mi yapmak gerekiyor ? (LSB bitini)

Saygılar,

EMG81

#1
Carry ye dokanmadığın sürece Byte ın bozulmadan kayması lazım.
Bit kaydırmaların da(<<,>>) Carry ye dokanacağını sanmıyorum.
Hi tech compiler kullanmıyorum. O yüzden kesin birşeyde söyleyemiyorum ama işini şöyle halletmeyi dene.

#asm
RRF kaydir,F
#endasm

Not1: kaydır Kaydırmak istediğin register, değişken ne ise. #asm ve #endasm komutları çalışıyormu onuda incelemelisin.
Not2: RRF kaydir,F kaydır değişkenini 1 bit sağa kaydırır.

emosamca

sonuc=deger << 1 | 0x01;   yazarak veya sonuc=deger>>1 | 0x80 yazarak kullanabilirsin.

equ

Merhaba,

Aşağıdaki kod "data" değişkeninin en sağdaki bitinden başlayarak gönderiyor.

        
for(i=0;i<8;i++)
{       
         TX_MOSI=((data>>i) & 0x01);	
 }


Ben en sol bitinden başlayarak göndermesini istiyorum ve aşağıdaki kodu kullanıyorum ama çalışmıyor, hep sıfır yolluyor, Sorun nerde olabilir?


for(i=0;i<8;i++)
{       
         TX_MOSI=((data<<i) & 0x80);
}

z

for(i=0;i<8;i++)  TX_MOSI=(((data<<i) & 0x80))>>7;


yada i int olmak sartiyla

for(i=7;i>-1;i--)  TX_MOSI=((data>>i) & 0x01);
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

equ

Saatlerdir uğraşıyordum, çok teşekkür ederim  :)

z

Hatanin nedenini anlaman onemli. Senin kodunda neden hep 0 gittigini anladinmi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

equ

Merhaba

Sağdaki biti ilk önce göndermeyle ilgili sormak istediğim birşey var,

Örneğin data=5 olsun, yani, 00000101

i=0 iken
00000101 & 00000001 --> 1 yolluyor
i=1 iken
00000010 & 00000001 --> 0 yolluyor
i=2 iken
00000001 & 00000001 --> 1 yolluyor
i=3 iken
00000000 & 00000001 --> 0 yolluyor
i=4 iken
00000000 & 00000001 --> 0 yolluyor
i=5 iken
00000000 & 00000001 --> 0 yolluyor
i=6 iken
00000000 & 00000001 --> 0 yolluyor
i=7 iken
00000000 & 00000001 --> 0 yolluyor

Mantığı bu mudur?

Sol biti ilk önce gönderirken yaptığımız şeyden anladığım şu;

datayı i kadar sola kaydırdıktan sonra 10000000 ile AND liyoruz. sonra bunu sağa 7 kaydırarak elte ettiğimiz biti en sağa yolluyoruz.

diyelimki data=128 olsun, yani, 10000000, i=0 iken hiç kaydırma yapmayacak, 10000000 ile 10000000 AND leyince 1000000 sonucunu elde edeceğiz. bunu 7 birim sağa kadırınca 00000001 olacak. buda 1 e eşit, yani çıkışa 1 verecek, bu da zaten göndermek istediğimiz verinin en soldaki biti.

Bilmiyorum doğru mu anladım?

z

Evet mantik bu. En sol bite bakmak icin maskeleme ve AND islemleri sonucunda ya 0x00 yada 0x80 verisini elde ediyorsun. Halbuki send edilecek veri 0 yada 1 olmali. Bu durumda 0x80 verisini 0x01 e donusturmek gerekiyor.

Bunu da cok cesitli yollardan yapabilirsin.

Mesela bir baska yontem;
for(i=0;i<8;i++) if ((data<<i) & 0x80)) TX_MOSI=0x01 ; else TX_MOSI=0x00; 

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