niye çalışmıyo bu program.

Başlatan vurkacoglu, 08 Ocak 2005, 14:53:46

vurkacoglu

Include "PROTON_4.INC"
         ADIN_RES   10               
         ADIN_STIME   50                 
      
      Dim dz[9]      as Word         
      Dim a           as DWord
      Dim b         as DWord
      Dim c         as DWord
      Dim d         as DWord
         Dim e           as DWord
      Dim f         as DWord
      Dim g         as DWord
      Dim h         as DWord
         Dim j           as DWord
      Dim k         as Dword
      Dim v          as Word
      Dim volt      as word
      Dim i          as BYTE   
         DIM sonuc      as a.WORD0      
       
      Delayms 500                  
      Cls                          
      TRISA.0 = 1                  
         ADCON1 = %10000101            
      ADCON0 = %01000000            
      
Tekrar:   For i = 0 to 8
      dz = ADIN 0
      Next i                        
      
       a = dz[0]*dz[0]
      b = dz[1]*dz[1]
      c = dz[2]*dz[2]
      d = dz[3]*dz[3]
      e = dz[4]*dz[4]
      f = dz[5]*dz[5]
      g = dz[6]*dz[6]
      h = dz[7]*dz[7]
      j = dz[8]*dz[8]
'      k = dz[9]*dz[9]
      
      k = a+b+c
      a = d+e+f
      b = g+h+j
      
      c = k+a+b
      
      d = c/9
      a = d/4
      
      v = SQR sonuc
      volt = v*2
      
      Print at 1,1,dec volt
      Print at 2,1,bin volt
      Print at 3,1,bin dz[0]
      Print at 4,1,bin sonuc
      
      Goto Tekrar

mmengi

Değerler 0 mı çıkıyor dostum?

adcon1 register ini kurarken +vref i porta.3 e göre vermişsin oraya referans voltajını uyguluyormusun?

Program en azından çalışıyor referans voltajı verdiğinde.

vurkacoglu

Ya pardon sinirden açıklama yapmayı unutmuşum. Program çalışıyor ama yanlış sonuç üretiyor. biraz açıklama yapalım bakalım.
şimdi giriş 5v yani dz nin bütün terimleri 1023 oluyo.
d=c/9 satırına kadar ve bu satırda ki işlemler de sorun yok gibi.

a=c/4 satırı iki defa sağa kaydırma işlemi için yapılıyo. böylece maksimum 20 bit olan yukarıdaki işlemlerin sonucunu 16 bite çekmesi gerekiyodu ama farkettimki doğrusu a=c/16 olması gerekiyomuş. 4 bit kaydırma yapmam gerekiyodu. bunu yapıyorum çünki SQR komutu 32 bit işlem yapamıyo. sonra sonuc 32 bitlik a nın ilk 16 bitini alıyo. çünkü üst kısım her zaman 0 oluyo. karakök alınıyo ve iki bit sola kaydırma yapılarak sağa kaydırma işleminin tersi yapılıyo. şüphesiz buşekilde olaya hata giriyo ama hatanın ufak olması gerekiyo. yani olayı hesap makinesinde yapınca herşey doğru ama işleri pic yapınca sapıyıyo deli olacam arkadaşlar.

alın size örnek çıkışlar.

Print at 1,1,"volt = ",dec volt
Print at 2,1,"volt = ",bin volt
Print at 3,1,"dz   = ",bin dz[0]
Print at 4,1,"a16=",bin sonuc

giriş 2.5v iken
volt = 764
volt = 1011111100
dz   = 1011111111
a16 = 1000111110100000

sorun a/d dönüşümde gibi görünüyo siz ne dersiniz.

vurkacoglu

evet sorunu buldum. a/d çevrim hatalı. ben referans gerilimini 5 volt olduğunu düşünüyodum (vcc den almıştım referans voltajını) ama değilmiş 5v luk ref uygulayınca düzeldi. sağol un.

hehehe ya şimdide zamanlama sorunum var. 50 hz lik şebeke gerilimini her periyod da 10 örnek (yukarıdaki programa bir örnek daha ekledim)alarak örnekliyorum. şimdi bir örnek almak yaptığım hesaplara göre yaklaşık 12*Tad= 24usn şarj için 50usn toplam 74usn. elde edilen değerlerin registerlara yazılması bir kaç mikro saniyede ona ayırırsak toplam 80usn diyelim. 50hz lik sinyal için her örnekleme aralıkları (10 örnek için) 2msn=2000usn olmalı. yani benim extradan 1920usn(değil 1845usn olacak) bekleme süresine ihtiyacım var. hesapta bi hata yok gibi görünüyo ama evet yokmuş tekrar yazınca düzeldi.

ya arkadaşlar kusura bakmayın burayı böle şeylerle dolduruyorum ama böle yazarak yapınca sorunları daha çabuk buluyorum. neyse ilerde birine lazım olursa başvuru kaynağı olsun.
bu arada yukarıdaki program bi işaretin etkin değerini hesaplıyo.
herkese sabırları ve desteği için teşekkürler.