avatar_inventor

proton-float ve eprom

Başlatan inventor, 20 Ocak 2013, 15:08:33

inventor

Merhaba arkadaşlar,

proton kullanarak float tipi bir değişkeni eproma aktarmak ve tekrar okumak istiyorum.

ARTTIR:
        While UP=0
            ORAN=ORAN + 0.01
            Print At 2,1,"Oran : ",Dec2 ORAN,"            "
            I=0
            For I=0 To 250
                DelayMS 1
            Next
        Wend
        If ENTER=0 Then
            EWrite 10,[ORAN]
            DelayMS 5
            Print  $fe,$0c
            GoTo SERVIS
        EndIf
        If DOWN=0 Then AZALT
        GoTo ARTTIR


Şeklinde butona bastıkça ORAN isimli değişkeni 0,01 lik basamaklar halinde arttırmak istiyorum. Bu kısımda sorun yok. Sonra enter tuşuna basarak eproma kaydediyorum. İşte sorun burada başlıyor. Benim ayarladığım ve ekranda gördüğüm değeri eprom 0,01 kadar arttırarak kaydediyor. Hesaplarda da kendi kaydettiği sayıyı kullanıyor. Resimde görebilirsiniz. Menüye girip çıkıyorum, simülasyonu durdurup tekrar başlatıyorum. Ekrandaki değer benim ayarladığım değer oluyor ancak eprom hep 0,01 kadar fazla görünüyor. Programın ilk başında ;

ORAN=ERead 10
If ORAN=$ff Then ORAN=1

şeklinde bir komutum var. Yani ilk okuma epromdan yapılıyor. Epromdaki veri 1,22 iken, ekranda 1,21 görüyorum. Aslında ben 1,21 e ayarlamıştım. Neden olabilir?

İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

inventor

Sorunun kaynağı belli oldu

  Print At 2,1,"Oran : ",Dec2 ORAN,"            "

burada Dec2 ORAN yazarak 2 hane gösterim sağlamıştım. Meğer 3. hanedeki sayıdan kaynaklanıyormuş. Sayıyı 1,20 olarak ekrana taşırken gerçekte 1,209 imiş. hal böyle olunca epromda bunu 1,21 olarak görüyorum.

Şimdi sorunun şekli değişti. Ben protonda float sayıları kullanırken virgülden sonra kaç hane olacağına nasıl kara verebilirim. Yani;

1,2034 gibi bir sayıyı 1,20 olarak nasıl kullanırım ya da 1,203 olarak?
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

F®T

hocam DEC2  DEC3  DEC4 Yanlış hatırlamıyorsam bunu belirliyor.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

inventor

dec2 oran

Bu şekilde yazdığımda ekranda 2 basamak olarak çıkıyor ancak işlemleri yine virgülden sonra kaç hane varsa hepsini kullanarak yapıyor.
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

F®T

#4
If MENU=1 Then
While MENU=1 :Wend
GoSub BUZER
GoSub DELAY
While MENU=0
Print $FE,$80," GOSTERGE    KAT"
Print $FE,$C0," SAYISI:",DEC7 KAT      'AKU ADETİ GİR
If ASAGI=1 And YUKARI=1  Then KAT=0.139471   'AKIM VE VOLT GÖSTERGE ÇARPANI
If ASAGI =1     Then KAT=KAT-0.000001
If YUKARI=1    Then KAT=KAT+0.000001
Wend
EWrite 4,[KAT]   'GÖSTERGE KATSAYISI
EndIf


hocam bir çalışmamda bu şekil kullandım istediğim kadar virgülden sonra gösteriyordu.fakat matematiksel işlemde kaç hane kullanılıp işlem yapılacağı olayını bilemiyorum.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

inventor


If ASAGI=1 And YUKARI=1  Then KAT=0.139471   satırından sonra şöyle bir işlem yapmak istesek;

SONUC= VERI*KAT   ' Burada kat olarak girilen sayının sadece 0,13 olan kısmı ile işlem yapmak istesek ne yapmalıyız. Mesela;

VERI=10  olsun
KAT=0,139471  olsun

SONUC=VERI*KAT    :  SONUC=10*0,139471  olarak işlem yapacaktır. Ben ise;

SONUC=10*0,13  işlemini yapmalıyım

Aynı şeyi tekrarlayıp durdum ama kısaca sıkıntım bu

Selam 
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

F®T

#6
evet.hocam anladım dediğinizi ama protonda yuvarlama nasıl oluyor onu tam bilmiyorum.acaba çıkan sayıyı kaç basamak yuvarlıcaksak o basamak kadar sayı ile çarpsak.mesela 3 basamak ise 0.001 ile çarpsak.nasıl olur.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

#7
BAsit ,
Bir integer değişken tanımla (word) Diyelimki SAYI olsun

SAYI=Kat*100   (SAYI=13 olur)
Sonra KAT=SAYI/100
bu işlemin sonucunda Kat=0,13 olur.

Ete

Mucit23

Hocam konuya biraz baktımda. Kat değerini kendiniz veriyorsanız neden 0.13 vermiyorsunuz. Yada bunu ayrı olarak tanımlasanız olmuyormu?
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

F®T

#9
yanlış anlaşılma olmasın ben verdiğim örnekte bu şekil bir uygulama yapmıştım ve lcd de istediğim basamağı göstermiştim.kat olayındada voltaj ve akım kalibrasyonu için çarpan ihtiyacım olduğundan bu şekil kullanmıştım.

fakat yanlış anlamadı isem  inventor hocam diyorki bir matematiksel işlem yapıyorum ve float olarak tanımladığım değişken işlem sonucunda  örneğin  virgülden sonra 5 basamak ve sonraki işlemi yapınca bu 5 basamak ile işlem yapıyor ama bana virgülden sonra 2 basamak yapsın.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

inventor

#10
F.T olayı doğru anlamış.

Şu rutine dikkatle bakın;

HESAP:
    METRE=(BILGIAL/10)*ORAN             ' cm cinsinden hesapladik.Oran katsayisi ile carpip duzeltme yaptik
    '******************  DUZ ALANIN TONAJ HESABI  *******************************
    If METRE <=1297 Then
        DUZNET= DUZBRUT - METRE        ' Silodaki urun yuksekligini bulduk
        DUZTON= (DUZNET/10)*4 'Duz bolgedeki her 10 cm yukseklik 4 ton geliyor. Dolu kismi 10 cm lik dilimlere bulduk ve 4 ile carptik
        DTON= DUZTON + 106           ' Konik kisim 106 ton aliyor. Bunu duz kismin tonajina ekliyoruz
        DYUZDE= (DTON * 100)/625
        DOLUALAN= (1727 - METRE)
        BTON= 625 - DTON
        BYUZDE= 100 - DYUZDE
        GoTo BASLA
     EndIf

Burada metre dediğimiz bir bilgi var. Bu bilgi bize uzaktaki bir encoder tarafından gönderiliyor. Enkoder kaplin vb. bir şeyle bağlı değil. Encoder miline bağlı bir makara var ve bu makaranın üzerinde bir ip hareket ediyor. İp encodera hareket veriyor. Bu makaranın çapı direk olarak bizim puls sayısını etkiliyor. ORAN isimli katsayı bu makaranın çapından kaynaklanacak olan hataları giderecek.

Ben zaten ORAN sayısını belirlerken virgülden sonra 2 hane olarak belirlemek istiyorum. Yani 0,98  veya 1,23 gibi bir rakam yetecek bana. Ancak ben ekrandan bu rakamı ayarladığımda ki hemen satırları ekleyelim ;

ARTTIR:
        While UP=0
            ORAN=ORAN + 0.01
            Print At 2,1,"Oran : ",Dec2 ORAN,"            "
            I=0
            For I=0 To 250
                DelayMS 1
            Next
        Wend
        If ENTER=0 Then
            EWrite 10,[ORAN]
            DelayMS 5
            Print  $fe,$0c
            GoTo SERVIS
        EndIf
        If DOWN=0 Then AZALT
        GoTo ARTTIR

görüldüğü gibi 0,01 lik adımlarla arttırıp azaltıyorum. Ekranda aynen bu şekilde artıp düşüyor. 0,98 - 0,99 - 1,00 - 1,01 ...... gibi ayarlanıyor. Ama gerçekte ( İşlem yaparken ) 0,98 olarak görünene sayıyı 0,9824 gibi kullanıyor.

Kısaca şunu yapmak istiyorum;

Oran isimli etikette nasıl bir sayı olursa olsun virgülden sonra sadece iki basamağı kullansın. 1,213568 ise 1,21 i kullansın. Diğer rakamları işleme dahil etmesin.

İlginiz için teşekkür ederim
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

inventor

#11
Alıntı yapılan: ete - 20 Ocak 2013, 22:14:53
BAsit ,
Bir integer değişken tanımla (word) Diyelimki SAYI olsun

SAYI=Kat*100   (SAYI=13 olur)
Sonra KAT=SAYI/100
bu işlemin sonucunda Kat=0,13 olur.

Ete


Oran için karşıma çıkan rakamlar değişken oluyor. Mesela ben 0,13 ayarladım diyelim. Registerdan baktığımda bu sayı 0,1306 olabiliyor. Veya 1,32 ayrladığımda bu sayı 1,32 olabiliyor. Yani virgülden sonrası için bir standart yok. Kesin olan şey virgül sonrasındaki ilk iki sayı benim sayılarım.

Sayı=Kat*100  = 0,1306*100 = 13,06
Kat=sayı/100 =13,06/100 = 0,1306

İşlemi bu şekilde yapıyor. Kat demiş olduğunuz değişkeni word olarak tanımlarsam virgüllü rakamları kullanamıyorum. Float olarak tanımlarsam yukarıdaki işlemi yapabiliyorum ama virgülden sonra ne kadar hane gerekli ise o kadar haneyi kullanıyor.
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

inventor

Aynı konuyu picproje de tartışmışlar;

"Floating point hatası biraz derleyici , biraz kullanılan kütüphane , biraz da kaç bit floating point kullanıldığı ile ilgili.
Sonsuz bit kullanılamadığı için  bir yerde yuvarlama yapılmak zorunda kalınıyor. Birbirini takip eden işlemlerde , her yuvarlama hatası diğerinin sonucunu değiştiriyor. 
Buher zaman derleyici hatası ya da yuvarlama hatası olmayabiliyor. Belki sayı doğru oluyor ama sayıyı göstermekte kullandığınız kütüphanenin de hatası veya kodu hafifletmek için bırakılmış hata payı olabiliyor.
IAR C derleyicide CLIB kütüphanesini kullandığınızda
float x= 637.0
printf("%f",x) sonucu
637.00000000 şeklinde görünmesi gerekirken 637.00000984 görünebiliyor. (değer uydurma. Gerçek değerleri hatırlamıyorum. ama son 3 hane çok saçmaydı)
ama aynı operasyon DLIB kütüphanesi kullandığınızda 637.00000000 şeklinde görünüyor.
Ama DLIB kütüphanesi CLIB kütüphanesine göre daha fazla kod alanı kaplıyor."

Programlama dili farklı ama sorun aynı.
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

ete

Benim önerimi iyi anlamamışsın sanırım.
Elinde KAT isimli bir değişkenin var cinsi Float
Elinde ayrıca birde SAYI isimli değişkenin var oda WORD (Integer)

KAT değişkenini 100 ile çarpıp SAYI değişkenine aktarıyorsun. Bu durumda KAT değişkeni float halden 2 basamaklı bir tam sayıya dönüşecektir. >Dolayısıyla fazladan olan küsüratlar otomatikman atılacaktır.
BU sayıyı tekrar Kat değişkenine 100 e bölerek aktarırsan sayı yalnızca 2 basamaklı ondalık hanesi olan bir sayıya dönüşür.

İstediğinde bu sanırım. Yada tam olarak ne istediğini anlamadım.
Ete


inventor

Eline sağlık ETE hocam.

Aslında bu yöntemi PBP da kullanıyordum ama protonun kendisinden bekledim sanırım. Nasıl olsa flout işlemleri hallediyor bunu da bir şekilde yapar diye düşündüm.  Protonun kendi sitesinde de bu konuyu tartışmışlar ve önce virgülden kurtar sonra tekrar ondalık yap şeklinde tavsiye vermişler.

Anlaşılan protonda bu işi doğrudan yapmanın bir yolu yok. Konu şu şekilde çözülmüştür;

dim ORAN     as FLOUT
dim ORANAL as WORD

ORANAL=ORAN * 100
ORAN=ORANAL / 100

Herkese tekrar teşekkür ederim
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

Powered by EzPortal