ADC sorunu [Çözüldü]

Başlatan wsxwsx, 23 Aralık 2009, 13:34:54

wsxwsx

pbpde  Hardware interrupt YOK diye bir şey vardı galiba  durumun aslı nedir? timer interrupt elde edip kullanılamaz mı yani? Olmuyorsa uğraşmayayım.

Logan

Bildiğim kadarıyla PBP'de donanımsal kesme yapmak için ASM olarak birkaç satır yazmak gerekiyordu. Status,W ve PCLATH registerlerinin değerleri başka değişkenlere kaydediliyor diye hatırlıyorum.
İmza.

bymrz

Alıntı yapılan: "wsxwsx"pbpde  Hardware interrupt YOK diye bir şey vardı galiba  durumun aslı nedir? timer interrupt elde edip kullanılamaz mı yani? Olmuyorsa uğraşmayayım.


10dk sonra:
------------------

Tamam varmış. örneklerin içinde gördüm


' Set TMR0 to interrupt every 16.384 milliseconds
        OPTION_REG = $d5	' Set TMR0 configuration
        INTCON = $a0	' Enable TMR0 interrupts
        On Interrupt Goto tickint



hiç uğraşma protona geç... Bu şekilde PBP her basic komutunun arasına cal XX gibi bir komut ekleyerek(yani kesme var mı yok mu kontrol et) programı kapasitesini de şişiriyor. Hal böyle olunca da bi işlemcinin RB0 kesme özelliğinin olmasının bir anlamı kalmıyor.

Yani ha her bi komuttan sonra portb.0'ı kontrol et demişssin, ha RB0 kesmesini kullanmışsın (pbp de) farkı yok...

O yüzden Proton u öneririm. Protonun da şimdiye kadar gördüğüm eksik yanı bit dizi tanımlama özelliği olmaması.

wsxwsx

protonda yaptığım bir uygulamada bilime aykırı şeyler oluyor  Acaba bunu pbp ile denesem aynı sorun olur mu onu deniyecektim

Sorun şu:
ADC ile bir gerilimi okuyorum  picin okuduğu değerleri usb den bana gönderiyor. basit bir osiloskop yapacam.

Değerler baştan düzgün geliyor. arada sırada ortasında anormal bir değer geliyor. zamanı belirsiz. referans olarak beslemeyi seçtim. adc ucunu da direk beslemeye bağladım. 8 bit okuyorum. normalde hep 255 görmem lazım .3-5 10 dakika kadar görüyorum. sonra ortada farklı bir değer. 64 gibi. ne alaka anlamadım. harici parazit  diye düşündüm bobin vb hepsini  denedim. pic bunu kendi uyduruyor diye düşünmeye başladım.

Logan

alone_lover, evet PBP o dediğini yapıyor fakat soft kesme kullanırsan. Yukarıda bahsettiğim gibi ASM satırları ile, ilgili registerleri saklayıp, gerekli satırları eklersen her hangi bir problem kalmıyor.
İmza.

bymrz

Anolog girişe uyguladığın voltajın empedansı nedir.Ona da bak. Datasheette yazar kaç Kohm olduğu felan.

Bir de programı yazarken bazı şeylere dikkat et. Mesela Gosub komutu tehlikelidir. İç içe call stack deposunun alacağı miktardan fazla gosub komutu kullanırsan, işlemcin sapıtabilir.

Ama senin sorununun bu olduğunu sanmıyorum.
Parazitlere iyi dikkat et. Gerekirse sönümlendirme amaçlı seri direnç ve ardından paralel kapasitör kullan derim.

wsxwsx

empedans filan yok direk beslemeye bağlıyorum. sıfır empedans. ozaman bile oluyor. 5-10 bin adet normal okumadan sonra bunu yapıyor.

yani stack sorunu olsa bu zamana kadar olurdu diye düşünüyorum. bazen 100 bin okumadan sadece 1-2  tanesinde oluyor. Acaba usb işinde bir karışıklık oluyorda gelecek bilgi değişiyor mu .

en iyisi picin içinde bunu kontrol ettireyim anolrmal değer  oluşunca led yansın.

bymrz

USB haberleşme için FT kullanıyorsun herhalde.
FT232 kullanıyorsan, sorunu biraz da onun beslemesinde ara istersen.Çünkü yakınında bir prze herhangi bir alet takılsa anında etkileniyor.

Bir de şunu sorayım ADC okumaları arasında geçişlerde yeterli beklemeyi sağlıyor musun?

Kolay gelsin...

wsxwsx

usb için picin kendisini Hid aygıt olarak kullanıyorum.

ADC okumaları esnasında aralardaki beklemeyi itinayla sağlıyorum. değişik varyasyonlar denedim süreyi uzalttım kısalttım. ADC süreleriyle  oynadım işe yaramadı.  5 dakika çalışmasa daha ciddi bir sorun var diyeceğim ama bazen 20 dakika çalıştırıyorum sadece 3-5 tane aykırı ölçüm geliyor. buarada binlerce ölçüm yapılmış. grafik çizilmiş. beslemeye seri bobin de bağladım. Sonrasında kondansatör taktım. çeşitli yerlere 100n taktım yine olmadı besleme pinine  çok yakın taktım.

ADC giriş ucunu toprağa bağlayıp birde öyle deneyiyim. eğer bu şekilde de çıkarsa kesin bilime aykırı bir durum var.

wsxwsx

toprağa bağlayıp denedim ozaman bu kanalda sorun çıkmadı. diğer adc  kanallarında pislik görünüyor. resimdeki kanal VDDye bağlı değil. fakat VDDye bağlı olsa da benzer sorun  oluyor.  Aralarda  1 yerde aykırı bir değer alınıyor.  Bu yanlış değer sadece 1 örnekte oluyor. sonrakilerde bir süre olmuyor.

teknikelektronikci

Alıntı yapılan: "Logan"alone_lover, evet PBP o dediğini yapıyor fakat soft kesme kullanırsan. Yukarıda bahsettiğim gibi ASM satırları ile, ilgili registerleri saklayıp, gerekli satırları eklersen her hangi bir problem kalmıyor.

hocam protonda donanımsal ve yazılımsal olamk üzere 2 çeşit kesme var
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

wsxwsx

Sorun ADC ile ilgili sürelerin yeteri kadar uzun olmamasından kaynaklanıyormuş. Proton ile devam ediyorum.

Maxim

Alıntı yapılan: "wsxwsx"Sorun ADC ile ilgili sürelerin yeteri kadar uzun olmamasından kaynaklanıyormuş. Proton ile devam ediyorum.

adc bekleme sürelerimi ?
siz kaç us kullandınız acaba ?

wsxwsx

Adcon2 ile ayarlanan süre var. (A/D Acquisition time select bits.). Ayrıca  iki örnek arasındaki süreyi olmasını istediğim değerden baya uzaklaştırdım.  Biraz çalıştırdım hata çıkmadı. Daha uzun çalıştırınca sorunun düzelmediğini gördüm.

muhittin_kaplan

USB yi eğer easyhid ile yaptıysan poll time ile ADC çevrim süresi çakışabilir. yani USB nin hattan düşmemesi için belli aralıklarla alışveriş yapması gerekir. biz bunu UsbPoll diye komutla yaparız ama easyhid wizard da bunu soruyor 10ms default değer olarak geliyor. eğer bu polling zamanı adc çevrimini kesiyorsa bunu yapabilir diye düşünüyorum.