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
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.
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.
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(http://img151.imageshack.us/img151/9500/dilimdilim2ge7ak5.jpg) (http://imageshack.us) 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.