avatar_ete

PIC Basic Ders-05 (Analog Digital Çevirici Kullanımı)

Başlatan ete, 28 Ağustos 2011, 16:11:16

ete

Anlamıyorsan hızlı gidiyorsun demektir. Sindire sindire öğrenmen gerekir.
Kod yanında yer alan açıklama ne diyor. 'Çevirme işlemi tamamlanınca Adcon0.2=0 olacak.
Peki ne çevirmesi ondan haberdarmısın? olman gerek elbette.
ADCIN 0,HAM şeklinde bir komut vererek Analog değeri digital değere çevirme işlemini başlattın. Bu işlem bize göre az da olsa zaman alan bir işlemdir. İşlem sonucu çevrilen değeri HAM isimli değişkene yerleşecek. Peki çevirme tamamlanmadan ben HAM değişkenini kullanmaya kalksam yanlış yapmış olmazmıyım? olurum elbette. O halde ne yapmalıyım. Analog dan Digital'e çevirme işlemi tamamlanıncaya kadar programı orada bekletmeliyim!!!!.
Şİmdi IF li komut satırına geri dönelim. IF ADCON0.2=1 then BAK. bu şu anlama geliyor. ADCON0 registerinin 2 nolu biti 1 ise hala çevirme bitmemiş demektir bu nedenle tekrar kontrol etme satırına git ki tekrardan kontrol edebilesin. Bu satırda onu yapıyor. Peki ne zamana kadar ? tabiiki ADCON0.2=0 oluncaya kadar. Bu sağlandığı zaman işlem tamamlanmış oluyor demektir.

Bu aşamada bir konuya açıklık getirmek gerekiyor. Bu kodları yazdığım dönemde ADC işleminin tamamlandığını kontrol etmek amacı ile bu satırları yazmıştım. Ancak sonradan öğrendiğime göre BAsic zaten bunu otomatik yapıyormuş. Yani ADC çevirme işlemi tamamlanmadan o satırı geçmiyormuş O halde artık bu IF ADCON0.2=1 then BAK satırını kullanmak gerekmiyor.
Zaten yeni yazdığım programlarda artık bu komutu kullanmıyorum. Direk ADCIN 0,HAM yazıp geçiyorum.

Binary sistemlerde yalnızca 2 alternatif vardır. Alternatif-1 :Durumun sıfır olma ihtimali, Alternatif -2 : Durumun 1 olma ihtimali.
Bir binary kontrolde şöyle bir sistem kullanılmaz.
IF TAK=1 THEN
   GOTO ARA
ELSE
    GOTO KAPA
ENDIF
Bunun yerine
IF TAK=1 THEN ARA
GOTO KAPA
şeklinde yazmak daha uygun olur. Çünki TAK=1 ise program ARA ya gider ama değilse zaten bir alt satıra geçecek demektir orada da GOTO KAPA yı görüp KAPA ya gider.
Kısaca eşitlik doğru ise emir yerine getirilir değilse program o satır atlar. Başkada alternatif yoktur.
BU işte de ,
IF ADCON0.2=1 THEN
   GOTO BAK
ELSE
   BURDAN DEVAMET
ENDIF
şeklinde bir komut dizisi kullanmak mantıksız olurdu değilmi.
ADCON0.2=1 ise program BAK etiketine gider değilse gitmez ve bir alt satırdan devam eder bukadar basit.

Pek çok arkadaş şöyle uygulamalar yapıyorlar,
...
...
GOTO ETIKET1

ETIKET1:
IF ....
Burada Goto ETIKET1 yazmazsan zaten program satır takip ettiği için ETIKET1 isimli satıra gidecek. Oraya ayrıca Goto ETIKET1 yazmanın bir anlamı yokki!!!.

Ete

. Kağan

Ama şimdi anladım. Bilen birinin anlatması gerekli ETE. Eğer sizler bana ve benim gibi acemilere ustalar anlatmasa nasıl öğrenebiliriz?

Forumda hemen cevap yazıp, bilgilerini esirgemeyen herkese tekrar Teşekkürler.

emrecelik3673

Bir an önce tüm komutları öğrenmek istiyorum. 5. dersteyim hadi hayırlısı inşallah :)

emrecelik3673

Ete hocam & arkadaşlar merhaba,

Bir konuda bilgi almak istiyorum. Basic'te aynı anda birden fazla programı çalıştırabiliyor muyuz? Örneğin porta.0'a bağlı butona basıldığında "calistir" adlı etikete gidecek buradaki işlemi yapacak (led flash yapıyor burada) ve aynı anda "kontrol" adlı etikette başka bir işlem yapacak. Yani porta.0'daki butonla iki ayrı etiketteki programı nasıl çalıştırabilirim? Teşekkürler.

ete

Hiç bir mikro işlemci aynı anda iki işlemi birden yürütmez. Yürütemez. Çünki öncelikle işlemlerin ne olduğunu anlamak için o komutları alıp değerlendirmesi gerekir. Aynı anda iki komutu birden alamayacağına göre aynı anda değerlendirme diye bir şey yoktur. Unut bunu. Ancaaaak, çok hızlı değerlendirme vardır. İş paylaşımı vardır. 40 Mhz de çalışan bir işlemcin (1/10=) 0,1 us (yada 1 nano saniye) de bir işlem yapar. Böyle bir işllemcinin 1 saniyede değerlendireceği komut sayısı 10 Milyon adet komut olur. Böylece işlemci bu komutları değerlendirirken san aynı anda ypıyrmuş gibi algılarsın ama o aslında kısa zamanda çok iş yapıp teker teker o komutları değerlendirmiştir.
Şimdi gelelim senin soruna, iki ayrı yerdeki işlemi aynı anda (yada sen öyle san ama aynı anda olmayacak) oluyormuş gibi nasıl yapacağına.
Program önce PORTA da buton basılmışmı bakacak basılmıi ise LED'i yakıp flash yapabilmesi için bir timer çalıştıracak. Flash mantıklı olarak yapılsın diye belkide bir TMR0 kesmesi açılacak ve her kesme olduğunda led konum değiştirecek.
Daha sonra gidip Kontrol isimli etikete bakacak ve oradaki işlemleri yapacak . Sonra tekrar başa dönecek.
Bu esnada led kesme yardımı ile ana programdan bağımsız olarak flash yapmasını sürdürecek. Böylece bütün bu olanları sen aynı anda yapılıyormuş gibi düşüneceksin. 4 Mhz de işlemci 1sn de 1 milyon işlem yapar. Hiç de az değil bence.

Ete


zeynal

Merhab Erol bey.Analog signal okumakla sıkıntım var.Proteus simulasyonunda hiç problem yok.Gerçek devrede okunan değer çok değişiyor.Ayarlarda problemim var diye düşünüyorum,fakat bulamadım.Yardım ederseniz sevinirim.Teşekkürler.

ete

Bu problem zaman zaman benimde başıma gelen bir problem ve sorunun kaynağı biraz ayar birazda referans voltajı meselesidir.
İşlemci ADC kanalından yaptığı okumayı referans voltajına göre yapar. Referans voltajı dışarıdan bir voltaj girişi olabileceği gibi işlemcinin besleme voltajıda referans voltajı olarak kullanılabilmektedir. Senin projende besleme voltajı kullanılmış. Devrende kullandığın besleme voltajı parazit içeriyor ise veya devreye bağlı çevre elemanları nedeni ile voltaj anlık olarak inip çıkıyor ise okunan ADC değeride inişli çıkışlı olacaktır.

Öncelikle programdaki ayarları ilişikte yolladığım programı kullanarak bir dene bakalım düzelme olacakmı.
Olmuyor ise tavsiyem kesinlikle aşağıdaki iki şıktan birisini değerlendirmek olacaktır.
1. Çok stabil bir REF voltajı elde edip onu REF voltajı girişlerine girerek kullanmak.
2. Devrende besleme olarak switching regülatör kullanmak (LM2596-LM2576-LM2575 den birisi öncelik sırasına göre dizdim)

Ete

zeynal

Merhaba Erol bey.Cevabınız için çok teşekkür ederim.Programı yükledim,fakat kararsızlık devam ediyor.Unuttuğum bir şey var.Devre DC-DC konvektör üzerinden besleniyor(9-18vdc giriş,5vdc çıkış).Sebebi bu olabilirmi?Teşekkürler

ete

Dc-dc konverter den olabilir elbette çıkışa biraz frekans basıyorsa bu tür sorunlar olabilir. Skop ile konverter çıkışına ve adc girişlerine bakmak gerekir. Adc girişlerine gnd ile 100 nf bağlamak bazen çöüm getiriyor deneyin isterseniz. Yine olmuyor ise digital filtre uygulamak çözüm getirebilir.
Ete

zeynal

Erol bey,merhaba.İlginiz için teşekkür ederim.ADC girişlerine  ve GND 100nF bağladım.Fayda etmedi.Osiloscopla baktım,yok denecek kadar az parazit var.DC-DC konverter çıkışına Pİ filtresi bağlarsam faydası olurmu acaba.Teşekkürler

ete

Bu gibi durumlar için Oversampling ADC metodu diy ebir metod olduğu söylenir hep.
Normalde 10 bit olan ADC okumasını bu metodla 11-12-13-14-15-16 bit seviyelerine çıkarmak mümkün olabilmektedir. Bu konuda Darrel Taylor isimli vatandaş bir program geliştirmiş ve serbest kullanıma vermiştir. Kendi ifadesinde 12 bit kullanımın sonucunun gayet iyi olduğunu belirtmektedir. Bu arada Darrel Taylor'un geçtiğimiz Haziran Ayı sonlarında Vefat ettiğini forumda daha önceden belirtmiş idik. Kendisine bri kez daha rahmet diliyorum yüce Allah tan.

Şimdiye kadar bu metodu hiç kullanmadım ama yeri gelmiş iken senin sistemde kullanmak ve sonucu görmek uygun olacak diye düşünüyorum.
İlişikte bu sisteme göre yeniden düzenlediğim programı yolluyorum. Ekran daki değerlere şaşırma 12 bit olarak değerler göreceksin. Burada önemli olan okumanın stabil olup olmadığıdır. Sonucu bildirirsen sevinirim.

Ete

Hattuşa

slm ete hocam;
verdiğiniz dosyayı indirip inceleyeceğim ve eğer oversampling konusunda detaylı bilgi verebilirseniz memnun olurum, zira bir arkadaşım (kendisi C18) de kod yazıyor, benzer bir projede farklı olarak bir çalışma yapmıştık. her ikimizde 18F serisi işlemci kullanmıştık ve ben 18F4520 kullandığım ve PLL yi aktif ederek 40MHz de çalıştığım halde 1 adc okumasını 15uS altına düşerememiştim. ama bu arkadaşım 1 adc okumasını 2-3 uS sürede okuyabildiğini (adc çevrim işlemi esnasında hold cond. değerini bir değişkene atarak) bu işi yapabildiğini söylemişti, bu konunun olabilirliği varmıdır?

ete

Oversampling adı üstünde olarak çözünürlüğü artırmak için birden fazla örnekleme okuması yapılarak gerçekleşen bir okuma işlemidir. Örnek vermek gerekirse 12 bit için en azından 4 defa okuma yapıp bir adet 12 bitlik değer elde etmektedir. Bu nedenle kısa okuma süresi istiyor isen 10 bitlik normal okumadan şaşmayacaksın.
Adc okuma süresi her işlemci için farklı olabilir ve bu data sheetlerde belirtilmiştir. Okumayı 3us de yapan işlemciler olduğu gibi genelde 19,7 us lik sürelerde okuyanlar çoğunluktadır.
Data sheetlerde adc çevrim sürelerine bakınız. Mesela 18F452 için datasheet sayfa 185 de min Acquisition time olarak 12,86 us verilmiş.
Daha kısa sürede de adc okuması yapabilirsiniz. Bunu yapmak için hold kondansatörünü gereğinden daha az şarj ederek ( daha kısa sürede) okuma yaparsınız ancak okuduğunuz değer olması gerekenden daha az bir değer olacaktır. O arkadaşını söyledikleri hiç kafama yatmadı. İşin prensibine aykırı bir teori ucuda açık gerçekten ne yapıldığı belli değil. Bu konudaki fikrim şudur. İşlemci data sheet inde belirtilen min çevrim süresinden daha kısa sürede stabil bir adc okuması yapılamaz.

Oversampling ile ilgili link aşağıdadır.

http://www.darreltaylor.com/DT_Analog/


Ete.

zeynal

Erol bey,merhaba.Gönderdiğiniz hex.i yükledim.Programdakı hesaptan sonra ekranda 4 basamaklı değer okuyorum.Okuma güzelgözüküyor.Sadacede sonuncu rakamlar değişiyor.Fakat programda değişiklik yapmak istersem derleme hata veriyor.Bu dosyayı arıyor   INCLUDE "DT_Analog.pbp".Bu dosyayı nerden yüklerim?Teşekkürler

ete

Önceki mesajımda verdiğim linkte   Sayfanın hemen başında yer alıyor o program linki. Oradan yükleyip derleme yaptığınız klasöre kopyalamanız ve derlemeyide MPASM kullanarak yapmanız gerekiyor.

Ete

Powered by EzPortal