Hesap hatası ...

Başlatan . Kağan, 13 Ocak 2015, 13:14:33

. Kağan

Aşağıdaki kodda;
ANA:
    ORTALAMA = 0
    FOR I = 0 TO 24         
      ADCIN 3 , OLCUM  ' KANAL1 DEN ÖLÇÜM AL.
      OLCUM = OLCUM+1   
      ORTALAMA = ORTALAMA + OLCUM
    NEXT I
      SNC1 = ORTALAMA/25       
                'IF SNC1<20 THEN
                'GOTO PART1
     
                 'ELSE
      DEGER1 = (SNC1*/1225)/100 'SNC1 ile 1225'i 32 bit olarak çarp ve 100'böl. 4,9V DEĞERİ 49 olarak gözükecek.
      YUZDE1 = (DEGER1/49)*100  '% OLARAK SONUCU VERECEK
      gosub SONUCEKRAN

go to ana

SONUCEKRAN:   
                    '"1234567890123456"
    lcdout $FE,1,    #YUZDE1
    lcdout $FE,$C0,  dec deger1,
    LCDOUT $FE,$94,  "             "
    LCDOUT $FE,$94,  "             "   
    RETURN



LCD ekranın birinci satırında YUZDE1 değeri görüntülenmiyor. Fakat altındaki DEGER1 değeri görüntüleniyor.

YUZDE1 niçin görüntülenmiyor? :o

Burak

#1
Dec yuzde1 olarak değiştirseniz ?

Burak.
Ω Gens Una Sumus Ω

. Kağan


Burak

Bu durumda bunun tek bir açıklamas var ..

deger1/49 ifadesi 1'den küçük çıkıyor .

deger1 ifadesini önce genişletip sonra bölmeyi deneyin .

örn :

deger1*100 / 49

gibi ..

Burak.
Ω Gens Una Sumus Ω

. Kağan

AN3 den 2,5 volt girdiğinde, DEGER1ekranda 24 çıkıyor.
Fakat YUZDE1 ekranda "0" çıkıyor.

YUZDE1'i 100 ile çarpıp işlemi yapınca ise "4800" gözüküyor. Voltajı oynayınca  200 birim artıp 200 birim azalıyor.(YUZDE1 = ((DEGER1*100)/49)*100)


Burak

YUZDE1 = ((DEGER1*100)/49)*100) ifadesinde tekrar neden 100 ile çarpıyorsunuz ?

Ben sadece önceki 100 çarpanını 49 ile bölme işleminden öne aldım . Tekrar 100 ile çarpmanıza gerek yok .

Burak.
Ω Gens Una Sumus Ω

Burak

Eger YUZDE1 = ((DEGER1*100) işleminin sonucunun 16 bitten büyük olduğunu öngörüyorsanız div32 işlemcisi gerekecektir .

Yani ;

YUZDE1 = DEGER1*100
a = div32 49

Şeklinde bi 16 bit çarpım aşımına meydan vermemiş oluruz .
Ω Gens Una Sumus Ω

. Kağan

10 mv. 2 birim değer oynatıyor. Niçin böyle çıkıyor.

Şimdi istersen beraber baştan yapalım. Daha kolay olacak. Bendeki sensor max. 4.9v veriyor. Ben bu değeri % olarak ekranda göstermek istiyorum. Voltaj olarak hesaplayıp okuyorum ama voltajdan yüzdeye gidemedim. Galiba düşünemiyorum.  :)

Burak

#8
Yani sensör max voltaj çıkışında tam besleme gerilimini görüyor . (besleme geriliminin 5v olduğunu varsayıyorum.) Bu durumda bir okuma yaptık okuma sonucunu olcum denen bir degiskene attık ve örneğin 2.5 volt çıkış verdiğinde %50 (yaklaşık)değerini görmek istiyosun doğru mu anladım ?

Burak.
Ω Gens Una Sumus Ω

. Kağan

Evet. Sanırım. :) Sensörün 0v-4.9v arasındaki değişimini % değer olarak görmek istiyorum.

Burak

#10
0-100 skalasını 0-1023 skalasına çekicez .

işlemleri şöyle yapalım .

100 / 1024 = 0.09765625 gibi bir değer

ben bu değeri 98'e çekeyim .

o halde ;

a = 98*olcum   ' Ham adc ölçüm değeri olucak bu olcum degişkeninde
yuzde = div32 1000

lcdout $FE,$80,"YUZDE=",DEC3 YUZDE

şeklinde bir denermisin ?

Burak.
Ω Gens Una Sumus Ω

MS_59

bu şekilde dene olacaktır


basla:
DEGER1 = (SNC1*/1225)/100
YUZDE1 = (SNC1*/2500)/100

                 
lcdout $FE,$80, dec YUZDE1
lcdout $FE,$C0, dec deger1
goto basla
mehmet

. Kağan

#12
Evet oldu ustalar. Teşekkürler. Proteus'un dediği şekilde doğru çalıştı. :) Ayrıca Burak kardeş sana da çok teşekkür ederim.

. Kağan

#13
Alıntı Yapa = 98*olcum   ' Ham adc ölçüm değeri olucak bu olcum degişkeninde
yuzde = div32 1000

Burak merhaba. Burada
ORTALAMA = 0
    FOR I = 0 TO 24         
      ADCIN 3 , OLCUM  ' KANAL1 DEN ÖLÇÜM AL.
      OLCUM = OLCUM+1   
      ORTALAMA = ORTALAMA + OLCUM
    NEXT I
      SNC1 = ORTALAMA/25       
      'IF SNC1<20 THEN
      'GOTO PART1
     
      'ELSE
      DEGER1 = (SNC1*/1225)/100 'SNC1 ile 1225'i 32 bit olarak çarp ve 100'böl. 4,9V DEĞERİ 49 olarak gözükecek.
     

        SNC1 = 98*olcum  ' burayı ANLAMADIM BURAK. BURADA ortalama olmalı.
       yuzde1 = div32 1000 '% OLARAK SONUCU VERECEK


      gosub SONUCEKRAN


DEGER1 = (SNC1*/1225)/100 'SNC1 ile 1225'i 32 bit olarak çarp ve 100'böl. 4,9V DEĞERİ 49 olarak gözükecek.
      YUZDE1 = 98*ORTALAMA
      YUZDE1 = div32 1000
  mi diyorsun?

Burak

Alıntı yapılan: kaganayanoglu - 13 Ocak 2015, 14:53:08
Burak merhaba. Burada
ORTALAMA = 0
    FOR I = 0 TO 24         
      ADCIN 3 , OLCUM  ' KANAL1 DEN ÖLÇÜM AL.
      OLCUM = OLCUM+1   
      ORTALAMA = ORTALAMA + OLCUM
    NEXT I
      SNC1 = ORTALAMA/25       
      'IF SNC1<20 THEN
      'GOTO PART1
     
      'ELSE
      DEGER1 = (SNC1*/1225)/100 'SNC1 ile 1225'i 32 bit olarak çarp ve 100'böl. 4,9V DEĞERİ 49 olarak gözükecek.
     

        SNC1 = 98*olcum  ' burayı ANLAMADIM BURAK. BURADA ortalama olmalı.
       yuzde1 = div32 1000 '% OLARAK SONUCU VERECEK


      gosub SONUCEKRAN


DEGER1 = (SNC1*/1225)/100 'SNC1 ile 1225'i 32 bit olarak çarp ve 100'böl. 4,9V DEĞERİ 49 olarak gözükecek.
      YUZDE1 = 98*ORTALAMA
      YUZDE1 = div32 1000
  mi diyorsun?

Ortalama dediğimiz adc ölçümlerinin ortalaması ise ortalama olmalı evet . Ben tek bir ölçüm bazında düşünerek öyle yazdım . Burada yapılan özgürce 16 bit çarpım sonucu aşım kaygısı olmadan çarpım yapıp sonucu 1000'e bölerek bir yüzde hesabı elde etmek .

Biiyorsunuz picbasic tam sayılarda çalışmaya izin veriyor . Bende bu yüzden 0.09765625 sayısını ağırlıklandırıp 98'e yuvarlayarak bu şekilde bir ölçüm çarpanı elde ettim .
Ω Gens Una Sumus Ω

Powered by EzPortal