32 Bit Çarpma

Başlatan canbulut, 05 Nisan 2008, 23:25:11

canbulut

slm ark'lar
32bit carpma nedir.bunun adclerde kullanıldığını gördüm.
mantığı nedir.arkadaslar.

ete

Sayıların büyüklüklerine göre 2 li (binary) sayı sisteminde bitlerle ifade edildiğini biliyoruz. Bunlar genelde 8 bit (0-255 arası) , 16 bit (0-65535 arası) ve 32 bit (0 - 4.294.967.295 arası) sayılardır.
Diğer yandan pic lerde kullanılan değişken tiplerine bakınca bunlarda genellikle 8 bitlik ve 16 bitlik değişkenler olduklarını görüyoruz.
Normalde 2 8 bitlik sayı çarpılarak elde edilecek 16 bitlik sayı bir WORD (16 bit) değişkenine yerleştirilebilir. Ancak 2 adet 16 bitlik sayıyı çarparsanız sonuç 32 bit çıkacağı için hiç bir değişkene yerleştiremezsiniz.
Bunu düşünen derleyici yazılımcıları genelde elde edilen 32 bitlik sonucun bir işlemden daha geçirildiğini düşünerek (en azından bir bölme işlemi) 32 bit çarpma yapılmasını bir komuta vermişler. Sonuç geçici olarak bir sistem değişkeninde tutlmakta siz hiç bir şekilde bu çarpım sonucunu alıpda bir yere eşitleyememektesiniz. Ancak onu bir sonraki işlemde kullanabilmektesiniz.
İşin esası bu şekilde dir. Bir iki örnek de verirsek konu daha iyi anlaşılacaktır.

25475 x 1265  =  32.225.875  ==> hexadesimal karşılığı 01EBBA53 dür.
Bu sayıyı 1000'e bölerseniz sayıyı 16 bit formatına indirmiş olursunuz. Bu andan itibaren sayı herhangi bir 16 bitlik değişkene verilebilir.

Bu işlemin Pic basic matematiğinde karşılığı şöyledir.
Temp=24575 * 1265
Sonuc=DIV 32  1000
Burada SOnuc isimli eşitlik hemen 32 bitlik çarpmanın arkasından gelmelidir. Çünki çarpım sonucu geçici bir adreste tutulmaktadır ve verdiğiniz ikinci işlemde otomatik olarak kullanılır.

ADC işlemlerinde ise daha değişik bir amaçla bu işlemlerden yararlanılır.
Genelde ADC 10 bitlik okuma değerleri 0-1023 arasındadır. Bu okumaların amaca uygun formüllere uygulanabilmesi gerekir. Siz o-5V arasını ADC den 0-1023 olarak okursunuz ama amacınız okuduğunuzu bir digital değer oalrak göstermek ise örneğin okunan bu voltaj bir gerilim bölücü ile 0-30V'a karşılık gelen bir voltaj olsun. Bu durumda siz okuduğunuz ADC değerinin karşılığını displayinizde 0-30V olarak vermek durumundasınızdır.
Böylece hemen bir formül bulmamız gerekir. O da şu şekilde yapılır.
Benim 0-30V luk voltaj aralığıma karşılık 0-1023 ADC değeri okunmaktadır. O halde birim okunan ADC değeri kaç volta tekabül edecektir. Bunu bulmak için ;
30/1024 (0 dahil 1023 e kadar olan 1024 değer vardır)= 0,02929
Bu duurmda ADC olarak ne okursam bunu 0,02929 ile çarparsam bana okunan voltaj değerini verecektir. Örneğin ADC den 512 okursam bununm karşılığı 512 * 0,02929=15V olacaktır.
İşin matematiğine gelince pic 0,02929 gibi bir sayı ile hesap yapamaz (PBP yapamaz). o halde 0,02929 sayısını biraz büyütmemiz gerekecektir.
Şayet bu sayıyı 256 ile çarparsam  7,5 gibi bir sayı elde ederim. Bu sayı hala küçük bir sayı olduğundan onu bu seferde 10 ile çarpıyorumve 75 sayısını elde ediyorum. Bu duurmda ADC değeri ile 75 sayısını çarpıp, sonucu önce 256 ya sonra 10'a bölersem gerçek Volt değerini hesaplamış olacağım demektir. İşte sonuç; Yine 512 örneğini ele alalım
V=(512 x 75)/(256*10)=15 çıkacaktır.
Şimdi bu işlemi pic matematiğine çevirelim.
V=(512*/75)/10 =15 çıkacaktır.
Burada değişik bir işlem işareti gördünüz */  bu işaret sonrasında gelen sayı ile öndeki sayıyı çarpıp ortadaki 16 bitlik kısmını alan bir işlemdir.
Dahaiyi anlamak için işlemi hexadesimal sistemde yapalım.
512 sayısı Hex gösterimde $200 dür.
75 sayısıda Hex gösterimde $46 dır. Ohalde
V=$200 x $46 =$9600 sayısı elde edilir. Bu sayıyı $100 (yani 256) ya bölerseniz $96 sayısını bulursunuz. $96 sayısı ise  desimal 150 rakamının karşılığıdır. Görüldüğü gibi sonuç $9600 çıkmasına rağmen */ komutu bu işlem sonucunda elde edilen $9600 rakamının 16 bilik kısmı olan $96 değerini alıp bize vermiş oldu. Bu ise bizim önceden sayıyı 256 ile yani $100 ile çarpmamızın tersi olan işleme karşılık gelmektedir.
Biraz karışık gibi görünmesine rağmen mantığını anlarsanız hiçde karışık değildir. Bilmeniz gerekenleri aşağıda yazıyorum.
1. 32 btilik işlemlerde sonuç geçici bir sistem değişkenlerinde yada adreslerinde tutulur. Siz işlemin devamında tutulan bu sayıyı küçültüp 16 bitlik hale getirip kullanmanız gerekir.
2. */ işlemi, sonucun 256 ya bölünmüş halini verir.

Bu işlemler size çarpım sonuçlarının sıhhatli bir şekilde alınmasını sağlayacaktır.
Çünki yalnızca tam sayılarla işlem yapan birişlemcide tam sayı ne kadar büyük olursa işlem de o kadar sıhhatli olur.
0,29 sayısını 255 ile çarparken onu direk çarparsanız sıfır elde edersiniz. Çünki pic 0,29'u 0 olarak alır ve sıfırın bir sayı ile çarpımı sıfır olduğundan sonuç sıfır çıkar. Ancak 0,29 'u önce 100 ile çarpıp sayıyı 29 haline getirirseniz ve onu 255 ile çarpıp sonra 100 e bölerseniz sonucu 73 olarak bulursunuz. İşin temelinde bu mantık yatmaktadır.

Umarım anlatabilmişimdir.,
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

cache

Hocam çok güzel anlatmışsınız elinize sağlık. Sizin PBP derslerinizde ADC bölümünde okumuş fakat tam anlayamamıştım. Ders notlarınız ve bu güzel açıklamanız için çok teşekkürler.


Saygılar.

canbulut

teşekkür ete hocam
peki 4-20mA'lik bir değişimi göstermek istersek mesela bunuda voltaja dönüstürme işlemini kullanarak adcden böyle yararlanabiliriz deilmi.
tekrar tekrar teşekkürler...
kolay gelsin...

ete

Uygun bir çevirici ile 4-20ma çıkışını 0-5V ta çevirip onuda istediğiniz bir göstergeye yukarıdaki yöntem ile dönüştürebilirsiniz.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

_md_

4-20mA çok güzel bir örnek ekteki dosyada var 4-20mA çıkış veren basınç sensörünün nasıl 0 - 5V'a çevirileceği ve mcu'ya nasıl bağlanacağı gözğknmektedir.

____________________________________________________________
R=U/I=5V/0.02A=250Ω

For 250Ω resistor we'll get 5V for 20mA and 1V for 4mA. 20mA is unofficial standard for many different sensors, so it is very common to use 250Ω resistor.
Note that if measured output is less than 1V (=4mA) sensor is not connected. This useful feature allows you to detect broken wires or hardware problems.
For other values of reference voltage different resistor have to be used. For example for 2.56V (AVR internal reference voltage): R=2.56V/0.02A=128Ω. But there is no 128Ω resistor on the market, nearest available (but less then 128Ω) value must be chosen. In this example it is 120Ω.
____________________________________________________________