ondalıklı işlemler

Başlatan imcek, 13 Eylül 2008, 18:02:36

imcek

selam forumda araştırdım malesef sonuca ulaşamadım.pic basic pro da ondalıklı işlemleri nasıl yapabiliriz?mesela sabitleri direk olarak yazabilirmiyiz.örneğin 127.2 değerini bir formülde sabit olarak kullanmak istiyorum.bunu pic basicde yapma şansımız varmıdır.şimdiden teşekkürler ilgilenen arkadaşlar...

aslan_korhan

127.2 rakamını 10 ile çarp. Örneğin LCD ekranda bunu DIG komutunu kullanarak tekrar 127.2 şeklinde göstertebilirsin. Birebir işlemlerde virgüllü rakamları kullanamazsın maalesef...
Dünyada 10 çeşit insan vardır. Binary bilen ve bilmeyenler.

imcek

teşekkürler.yalnız ben virgülle beraber formülde kullanmak zorundayım.yani lcd de göstermek istediğim değerin formülü diyelim 127.2*72.4 bunu yaparken ondalıklarla ayrı ayrı işlem mi yapmam gerekiyor.yardım pls  :(

askuzucu

proton basic ile yapabilirsin.
ama eproma yazdırmalı bir işlem varsa proton kullanma.böyle bir işlem yaparsan hataya neden olabiliyor.eproma kayıt kullanarak yazdığım bir programda shout komutu saçmaladı ve beni bir gün uğraştırdı...
eğer pic basic ile yapacağım diyorsan zorlamalı hesap yapmalısın.
ETE hocanın sht11 ile ilgili kodlarını incele, belki bir fikir verir...
kolay gelsin...

imcek

Alıntı yapılan: "askuzucu"proton basic ile yapabilirsin.
ama eproma yazdırmalı bir işlem varsa proton kullanma.böyle bir işlem yaparsan hataya neden olabiliyor.eproma kayıt kullanarak yazdığım bir programda shout komutu saçmaladı ve beni bir gün uğraştırdı...
eğer pic basic ile yapacağım diyorsan zorlamalı hesap yapmalısın.
ETE hocanın sht11 ile ilgili kodlarını incele, belki bir fikir verir...
kolay gelsin...

ÇOK TEŞEKKÜR EDERİM KARDEŞ Bİ BAKAYIM SHT11 E SAOL

ete

imcek demişki;
Alıntı Yap
teşekkürler.yalnız ben virgülle beraber formülde kullanmak zorundayım.yani lcd de göstermek istediğim değerin formülü diyelim 127.2*72.4 bunu yaparken ondalıklarla ayrı ayrı işlem mi yapmam gerekiyor.yardım pls Sad

Öncelikle PBP da ondaılklı işlemlerin kesin olarak yapılamadığı bilmen gerekir. Bu nedenle kafayı biraz çalıştırıp rakamları ondalıktan kurtarmaktan başka çaren yok. Senin örneğini ele alır isek;
A=127,2 x 72,4  gibi bir formülün olsun.
Bu formülü şöylede yazabiliriz sonuç değişmez;
A*10*10= (127,2 *10)*(72,4*10)
A=(1272 * 724)/100
işte sana değerlerin odalıktan kurtulmuş hali. Bunu hesaplamayı PBP rahatlıkla yapabilir. Sende öyle yap.
Ekranda gösterim şekline gelince;
1272 sayısını ekranda 127,2 şeklinde göstermek için,
(diyelimki SAYI=1272 olsun)
LCDOUT $fe,$02,DEC SAYI/10,",",DEC SAYI//10
DEC SAYI/10  komutu sayının 10'a bölünmüş halini yani 127 sayısını ekrana yazacaktır.
DEC SAYI//10 komutu ise sayının 10'a bölündükten sonra kalan sayıyı yani 2 sayısını ekrana yazacaktır. Buna matematikte MOD alma yada MODULUS işlemi denmektedir. Arayada birde virgülü tırnak içinde yazdırırsan oldu bitti bu iş.
MOD işlemini windows un hesap makinesinde deneyebilirsiniz. Orda bir MOD butonu vardır. ekrana 1272 yazıp MOD butonuna basın ve sonra  10 yazıp eşittir tuşuna basarsanız size 2 sayısını verecektir.
Kolay Gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

imcek

hocam teşekkür ederim.ben sayısal kısıtlamaların olduğunu düşündüm.yani word byte vs yetmeyebilir diye.yani dediğiniz gibi 1272*724 çarpımı çok büyük bir sayı ediyor.bu sabit sayıların büyüklüğünün bi önemi yokmu.yani con 1273 diye yazınca sabit olarak hata veriyor basamak saysı fazla oluyor.direkt olarak sayının kendisini yazmamız yeterli oluyor değil mi ?.

ete

Değişkenler konusunu yeniden incelemeni öneriyorum. Ayrıca 32 bit işlemleride yeniden incelemende yarar var.
Sabit sayılar bir değişkene verilir. Sayi con 1273 gibi.
İşlemi (1272 * 724)/100 şeklinde yaparsan sayı 16 bit sınırları içinde olacaktır. 16 bitten büyük çıkacak işlemleri için 32 bit çarpma yapmanda yarar var.
PBP da iki sayının çarpım sonucu 32 bit çıkabilir. 32 bitlik bu sonuca ulaşman normalde mğmkün değildir. Ancak bu sayıyı 32 bit işlemle bir başka sayıya bölerek sonucu 16 bite indirgeyip alabilirsin.
A=1272 x 724
b=div32 100  
Bu işlemlerde A sonucu 32 bitlik bir sayıyı tutuyor gözükmekle birlikte gerçekte 32 bitlik sonuç bir ara hafızada tutulur. Bu işlemden hemen sonra gelmek kaydı ile verilen b=div32 100 işlemi ara hafızada tutulan 32 bitlik sayıyı 100'e böler ve sonucu 16 bit olarak b değişkenine atar.
PBP da pek çok zor matematiksel işlem bu ve buna benzer özellikler kullanılarak yapılmaktadır.
Örnek olarak;
1275 */340   işleminde 1275 sayısı 340 ile çarpılıp 32 bitlik bir sayı elde edilir ve ortada bulunan 16 bitlik kısmı alınır (yani 256 ya bölünerek)
ADC çevirim işlerinde çok fazlaca kullanılır bu yöntem.
Diyelimki 10 bitlik ADC çeviriminde elde edilen en büyük değer 0-1023 arasındaki sayılar olarak 1024 adet basamak dır. Bu sonucu ekranda 0-10V olarak göstermek istersek 1024 değeri 10V ta 0 değeri ise 0 V ta tekabül edecek şekilde bir formül oluşturmak gerekir.
10V/1024 = 0,009765625    değeri birim ADC değeri başına volt değerini verir.
Ancak sayı çok küçük olduğu için pic bu sayı ile işlem yapamaz. Ohalde bu sayıyı 256 ile çarparsam
0,009765625 * 256 = 2,5 sayısını bulurum. Bu hala küçük bir sayı olduğundan 10 ile çarparak 25 sayısını bulurum.
O halde okunan ADC değerini 32 bit olarak 25 sayısı ile çarparsam (*/) işlemi ile orta 16 bitlik değeri alacağımdan sayının 256 ya bölünmüş  halini elde ederim. Çıkan sayıyı tekrar 10 a bölersem tam sonucu bulmuş olurum.
(ADC */25)/10  formülü bze tam sonucu verecektir. Diyelimki ADC=512 okundu o halde; (512 */25)/10=5 değerini bulmuş oluruz.

Aynı şekilde 1275**724 işleminde ise sonucun 65536'ya bölünmüş halini elde edersiniz.

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

OG

Alıntı yapılan: "ete"
İşlemi (1272 * 724)/100 şeklinde yaparsan sayı 16 bit sınırları içinde olacaktır.
İyi soru. Hocam işlemin ilk ayağında yani (1272 * 724) anında 16 bit geçiliyor. Bu problem çıkarmazmı?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ete

Çıkarmaz çünki PBP tarafından 32 btilik bir tampon (dummy)hafızada sonuç tutulur. Ancak bu hafızaya ulaşılamıyor (sebebini bilemiyorum).
Yalnızca 16 bitlik alt kısım  T=1275 x 724 şeklinde T değişkenine yerleşir.
Yada T=1275 ** 724  denildiği zaman  T değişkenine 16 bitlik üst kısım yerleşir.
Yada T=1275*/724 denildiği zaman da T değişkenine ortadaki 16 bitlik kısım yerleşir. Örnekdeki sonucu HEX formatına çevirir isek sonuç 000E15DC dir.
16 bitlik Alt kısım=15DC , 16 bitlik üst kısım 000E dir.
16 bitlik orta kısım ise  0E15 dir.

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

imcek

Bayağı emek verdiniz.bu tip konularda bizi aydınlatarak planladığımız şeye daha hızlı ulaşmamızı sağlıyorsunuz.Çok teşekkür ederim