bölme işlemi

Başlatan alisumer, 02 Aralık 2021, 07:11:26

alisumer

Değerli hocalarım donanımsal olarak tur başına 100 puls aldığım enkoderin bana ekranda örneğin 13 görünmesini istiyorum çünkü bazen rediktör yada vidalı mil çıkışını görmek istiyorum  doğal olarak tam bölünemediğinden mesela değer=değer*/34 işlemi bir iki turda sıkıntısız  13 26 artıyor olsada belli tur sayısı sonunda elde kalan küsüratlar basamak olup örneğin 10 tur sonra 132 oluyor.bir çözüm yolu varsa matematiği kıt birine anlatır gibi anlatırmısınız teşekkürler
Hep meraktan

ete

32 bit aritmetik ile bu işi aşağıdaki şekilde kolayca halledersin.
13 görülmesi gereken rakam ve tur sayısı 100 ise 13/100=0,13  bu sayıyı 256 ile çarparsak;
0,13 x 256 = 33,28 elde ederiz. Bu sayıyı 100 ile çarpıp 3328 haline getirip sonucu tekrar 100 e bölersek netice değişmeyecektir. İşte basic de kullanacağın formül bu şekilde
SAYI=(TUR */3328)/100  şeklinde olacaktır.
Hemen deneyelim SAYI=(100 *3328/256)/100 (bu normal aritmetik) direk 13 sayısını bize verecektir.

Ete

alisumer

 :o Allah razı olsun hocam şu matematik götürecek beni bir gün elli tane şeyle çarptım 1000 denedim mantığını  işlem şu anda önümde tahlil edemiyorum o kadar yani
Hep meraktan

ete

#3
Biraz daha açıklayayım. 100 ==> 13 gösterecek ise X ne göstermeli diye orantı kurarsan zaten (X*13)/100 şeklinde bir orantı hesabını yapmış olursun. Dikkat edersen 13/100 birim tur başına gösterilecek miktarı (0,13) hesaplıyor. O halde bunu tur sayısı ile çarparsan gereken rakamı bulursun. Biz hassasiyeti artırmak adına */ operatörünü kullanacağımız için önce 0,13 ü 256 ile çarptık. Çünki */ operatörü iki sayıyı çarpıp 256 ya bölünmüş halini bize veriyor. Sonucu 256 ya bölünmüş olarak alacağımız için önceden 256 ile çarparak sonucun bozulmamasını sağlamış olduk. Hepsi bu.

Ete

alisumer

hocam şimdi de şöyle bir problem oldu değer sayım 50 tur sonunda 5000 u geçtiğinde mevcut sistemde 3328 ile çarpıp 256 ya bölünce 65536 ya dayanıyor sayı sonrasında okuma sıfırlanıyor */ operatör kullandığımda onun yerine ** işlemi kullandım 256 ile bölmek yerine 65536 ile bölme yapıyor sayıyı daha fazla büyütebiliyorum sayesinde 3328 yerine de 8520 yazıyorum bölme sonucunda 13,00048828125 sayısı çıkıyor bu da bana çok fazla stabil okuma imkanı sağladı
Hep meraktan

ete

İşin mantığı daha iyi anlaşılsın diye bir açıklama ekleyeyim.
Basic derleyicisi sonuçta 32 bit işlem yapabiliyor ancak sonuçları 32 bit saklayamıyor yada gösteremiyor. Bu nedenle sonuçları 16 bite indirgeyecek sistem geliştirmişler.

*/ operatörü 32 bit çarpma yapar. Sonuç, 32 bit olacağı için 4 adet 8 bitlik yada 4 adet byte dan oluşur. */ çarpanı ortada yer alan 2 byte'ı size sonuç olarak verir. Bu ise sayının desimal 256 ya bölünmüş halidir. Örnek verecek olursak; 5000 * 8520= 42.600.000 dir desimal olarak. Hex olarak ise  $028A0640 ile gösterilir. Bu sayının her bir byte değerimni ayrı ayrı yazacak olursak; $02 8A 06 40 şeklinde yazılır. Ortadaki byte ları alırsak bize $8A06 sayısını verecektir.

** operatörü ise 32 bit çarpma yapar ve bize en solda (en üst) 2 byte'ını verir. Aynı çarpmada elde edilen $02 8A 06 40 şeklindeki sayının $028A kısmını bize verirki buda o sayının 65536 ya bölünmüş halidir.

Şimdi tur hesabında 13/100=0,13 sabit çarpanımız var idi. Bu işlemde */ yerine ** kullanacak olursak bu sayıyı bu sefer 65536 ile çarpmamız gerekecektir. Sonuç 8.519,68 çıkıyor bunuda sayıyı yuvarlatarak 8520 olarak kullanabiliriz. 

Ete
 



Powered by EzPortal