Bi hatada benden. niye çalışmıyo bu program?

Başlatan vurkacoglu, 23 Aralık 2004, 01:51:41

vurkacoglu

Define  LCD_DREG        PORTB
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTB
Define  LCD_RSBIT       2
Define  LCD_EREG        PORTB
Define  LCD_EBIT        3


Define  ADC_BITS        10       
Define  ADC_SAMPLEUS    20       

ADCON0.7 = 0            'DÖNÜŞÜM SAATİNİ AYARLIYOZ
ADCON0.6 = 1            'F/8
ADCON0.5 = 0            'AN0 seçildi
ADCON0.4 = 0
ADCON0.3 = 0
deger   var word(11)            
i       var byte
a       var word
b       var word
c       var word
d       var word
e       var word
f       var word
g       var word
h       var word
j       var word
sonuc   var word(11)
       TRISB = %00000000
       TRISA = %11111111      
       TRISC = %11111111
       ADCON1 = %10000000      
       
       Low PORTB.0           

       Pause 500             
       LCDOUT  $FE, 1
       LCDOUT  "PIC ADC"
       pause 500
loop:      

       FOR i=0 TO 11
       ADCIN 0, deger(i)
       Pauseus 20                    
       NEXT i

       FOR i=0 TO 11
       j = deger(i) * deger(i)
       sonuc(i) = div32 100
       NEXT i
       a      = sonuc(0) + sonuc(1) + sonuc(2) + sonuc(3) + sonuc(4) + sonuc(5)
       b      = sonuc(6) + sonuc(7) + sonuc(8) + sonuc(9) + sonuc(10) + sonuc(11)
       c      = a + b  
       d      = div32 10
       e      = d / 12
       f      = e * 10        
       g      = sqr f
       h      = g * 10
       Lcdout $fe, 1               
       Lcdout "SONUC= ", dec h
;        pause 500
       Goto loop                   
       End

ete

@Vurkaçoğlu,

Gördüğüm ilk hata dizi değişken tanımlamada oldu.
deger var word(11) , bu komutun anlamı toplam 11 adet değişken tanımlamış oluyorsun. Halbuki sen programda 0-11 arasında 12 adet değişken kullanıyorsun. Bu nedenle 11 rakamını 12 yap. Aynı şekilde  sonuç değişkenindeki 11 i de 12 yap.
Burasını düzelttikten sonra baktım program d nin hesabında hata yapıyor. Tahmin ediyorum. c=a+b ancak 16 biti aşarsa bu hesap doğru olacak. Yani c nin değeri 16 biti aşarsa d=DIV 32 10 , aşmaz ise d=c/10 olmalı.
Bir de adc transfer süresi bana çok kısa geldi. Belki pic bu sürede çevirir ama zorunlu hal yok ise sampling süresini 50 us almaya çalış.
Ayrıca ADC transfer işleminin bittiğinden emin olmak için okuma satırları şöyle olmalı;

       FOR i=0 TO 11
       ADCIN 0, deger(i)
BAK: IF ADCON0.2=1 then BAK
       Pauseus 20
       NEXT i
ADCON0 registerinin 2. biti pic adc işlemi tamamlandıktan sonra sıfıra çekilir. Böylece işlemin tamamlandığını anlarsın.

Dİyeceklerim bu kadar.
Kolay Gelsin

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

vurkacoglu

teşekkürler ete. dediğin şeyleri bi deneyeyim bakalım. çalışır bu sefer inşallah.

c=a+b ancak 16 biti aşarsa bu hesap doğru olacak. Yani c nin değeri 16 biti aşarsa d=DIV 32 10 , aşmaz ise d=c/10 olmalı.

demişsin aşıp aşmadığını nasıl kontrol etcez. çünkü bildiğim kadarı ile div32 komutu işlemin hemen ardından kullanılmak zorunda.

-----------------------------------------------------------------------------
denedim sonuç değişmedi. sorun nerde çıldırcam ya

ete

Değişken tablonda şöyle bir tanımlama daha yap;
C     var word
CL    var C.byte0
CH    var C.byte1

CL ve CH C word değişkeninin 8'er bitlik low ve high baytlarıdır.
Dolayısıyla C=a+b komutundan sonra ;
if CH=255 then  
   D=div32 10:goto atla
else
d=c/10
atla: endif

şeklinde bir bölüm yazarsan olur gibime geliyor. Bir dene istersen.
Bu arada bende daha tutarlı bir yol bulmaya çalışacağım.

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

vurkacoglu

Tamam çözdüm ilham için teşekkürler ete.

olay şu, c=a+b işlemini yapıp aşıp aşmadığını kontrol ediyom aşmıyosa işlem olduğu gibi kalıyo sonraki adıma geçiyo ama aşma varsa tekrar c=a+b işlemini yaptırıyom ve peşine div32 komutunu ekliyom. sanırım bu sorunu çözer. fazladan zaman kaybediyorum ama yinede işe yarar.

tekrar sağol .

-------------------------------------------------------------

CH=255 yerine carry biti kontrol etsek daha doğru olmaz mı? çünkü toplama işlemi aşma yaptığı halde ch=255 olmayabilir gibime geliyo.

vurkacoglu

yine olmadı bi yerde takıldım kaldım. offfffffff offfffffffffff.

picman

arkadaşlar ben pic basic pro 2.45 i bilgisayarıma kurdum dos ortamında edıt editoru ile yazdığım basit flip flop programını derlemeyi denedim derleme sonunda üç tane dosya üretildi bas uzantılı asm uzantılı ve yanlış hatırlamıyor isem mac uzan tılıydı herhalde fakat hex uzantılı dosya oluşmadı derleme bittikten sonra hiçbir hata mesajı da vermedi sizce neden hex uzantıluı dıosya oluşmadı bu konuda bilgisi olan atrkadaşlardan yardım beklitırum ben derleme işlemini dos ortamonda yaptım edıt editotunde yazdığım program kodlarını pbp yüklediğim yere kaydettim daha sonra komt satırına c:\cd pbp yazrak pbp ye giriş yaptım daka sonra yakson.bas olarak kaydettiğim programa ulaşmak ve derleme işlemini başlatmak için komut satırına c:\pbp>pbp yakson yazıp derlemeyi başlattım hiçbir hata mesajı vermedi derleme sonunda oluşturulan dosyalara ulaşmak için yine konut satırına c:\pcp>dir yakson.* yazıp entere bastığımda oluşturulan dostyalar arassında hex uzantılı dosyayı göremiyorum bu konuda bilgisi lan arkadaşalrdan yardım bekliyorum :cry:
Bilgi paylaştıkça artar..

Veli B.

Hoşgeldin,

Mesajı gönderene ve Adminlere özel bir imkan var.Mesajın sağ üst köşesinden istemediğin mesajı silebilirsin.Sen iki mesaj(bir hatalı, birde özür)gönderdiğin için önce özür mesajını sonra hatalı mesajı silebilirsin.

Şu an dosyan PBP klasörünün içinde olmalı.PBP.EXE  ile beraber.HEX dosyanı bumazsan win ile arattır.

Editör olarak MCS(Micro Code Studio) programını kullanırsan rahat edersen.Pekçok avantajı vardır.Bord içerisinde bir arattır.Download içinse soldaki bölümde "SEÇME DOSYALAR" adı altında bulabilirsin.
Sevgiler...

aster

sağol katana, sen yazarken ben silmişim
picman bu gün sana çalışıyorum mesajlarını 2 defa yolluyorsun hep

picman

arkadaşlar internet kafeden bağlanıyorum alimdeki bilgisayar biraz yavaş gönder butonuna bastığımda mesaj gitmedi zannediyorum karışıklık o ara iki defa basmışım  :cry: o yüzden tekrar özür dilerim
Bilgi paylaştıkça artar..

picman

arkadaşlar kafama takıldı birşeydaha sormaktan kendimi alı koyamıyorum peki pbp nun  bu olaydan sonra mademki hex dosyası oluşmadı o zaman bende pbp oluşturduğu asm uzantılı dosyayı mplab içine kaydedim olnunla hex dosyasınuı oluştururun diye düşündüm dosyayı mplab içine kaydedip derlemeye kalktım fakat hata mesajı verdi bu neden kaynaklanmış olabilir asm dosyasında hata olduğu için mi pbp hex dosyasını oluşturamıyor fakat  öyle olsa bile pbp derleme esnasında hata vermesi gerekmezmi neden hata vermiyor? :cry:
Bilgi paylaştıkça artar..

ete

@vurkaçoğlu,

Bizim konu yine başka bir yöne doğru gidiyor. İyisimi tekrar döndüreyim dedim.
Sorun üzerine biraz çalıştım. ANcak gördümki PBP yalnızca çarpma ve bölme işlemlerini 32 bit yapabiliyor. Toplama ve çıkartmada 32 bit çalışamıyor. Sorunun ana kaynağı bu. Bu nedenle sana tavsiyem. C=a+b hesabını biraz daha küçültebilirsen işin olur. Şöyleki;
a= Sonuc(0)+Sonuc(1): b=sonuc(2)+Sonuc(3):c=sonuc(4)+Sonuc(5)... gibi
SOnra 10'a bölme işlemini bulduğun bu a-b-c-d... ye ayrı ayrı uygula ve en sonda neticeleri topla. Yani kısaca toplama işlemini 32 bit seviyesinden kurtarman gerekiyor.

Dene bakalım.
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

vurkacoglu

Bende 11 tane mesaj görünce şaşırmıştım neler oluyo diye meğer konu farklıymış :)

@ete

Bu dediğinide bi deneyeyim olmadı proton a geçicem, sanırım onda float değişken tanımlanabiliyo en 32 bitinden. Teşekkürler.

vurkacoglu

pic basic pro dan vazgeçtim proton kullanayım dedim onda da çalışmadı.
bende şimdi pic c ye geçicem. herşey için çok sağol un..

Ersin

CCS i tavsiye ederim 1 aydan beri CCS teyim ve PBP ne kadar ise yaramaz bir compiler oldugunu anladim.Diger C compiler lari bilmiyom ama ccs guzel .