avatar_ete

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

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

zeynal


F®T

ete hocam ders 5 te adc örneği hex de sıkıntı var görünüyor.ben yeniden derledim şu an çalışıyor.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Ferit,
Yükledim baktım sorun yok gözüküyor. Çalışıyor. Malum dosyanın orjinalide bende onda da sorun yok.
Her neyse çalıştıramayan senin dosyayı yüklesin.

Ete

F®T

hocam normalde adc değeri 0-5 volt arası değişiyor ama hazırki hex ile çok saçma değerler oluşuyordu.bir üye arkadaş uyardı baktım bendede aynı olay olunca tekrar compiler ettim normal çalıştığını gördüm.belkide proteusetan kaynaklanan bir sorun...
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete


yusuf.ozyer

hocam iyi akşamlar yazdıklarınızdan pek anlamadım ben bir çizgi izleyen robot yapıyorum sensörlerim anologdu eskiden 74hc14 ile dijitale çeviriyordum şimdi ise direk 16f877a kullanıp anolog girişlere sensörleri bağladım picin 74hc14 gibi çalışmasını istiyorum  nasıl bir kod yazmalıyım sizin verdiğiniz örneklerde hep potansiyometre felan kullanmışdınız ben o kadar detaylı olmayacak 3 volt ve üstü  geliyorsa +   , 3 voltun altında geliyorsa - bilgisini versin
şu şekilde bir başlangıç atmışdım ama oldumu olmadımı bilemedim
8 adet sensör kullandım bunlara tek tek isim verdim birde


DEFINE OSC 4
DEFINE ADC_BITS 8
DEFINE ADC_CLOCK 1
DEFINE ADC_SAMPLEUS 100

TRISA=%11111111
TRISB=%00000000
TRISC=%00000000
TRISD=%11111111
TRISE=%111

ADCON1=%0000
CMCON=7

SYMBOL SAGSEN3 = PORTA.0
SYMBOL SAGSEN2 = PORTA.1
SYMBOL SAGSEN1 = PORTA.2
SYMBOL ONSEN1  = PORTA.3
SYMBOL ONSEN2  = PORTA.5
SYMBOL SOLSEN1 = PORTE.0
SYMBOL SOLSEN2 = PORTE.1
SYMBOL SOLSEN3 = PORTE.2
bu şekilde bir başlangıç attım hocam yardımcı olursanız çok sevinirim

ete

Bir sensöre ait örneği yazıyorum diğerlerini sen yapacaksın.
Öncelikle o symbol tanımlamalarını sil.
Sonra herbir sensör için şu tamımlamayı yap
Sagsensor3  Var word
Sagsensor2  var word
....
...


Adcin 0, sagsensor3
If sagsensor3>615 then.    Buraya sensör 1 ise ne yapacaksan onu yazacaksın
Yani okunan adc değeri 615 den büyük ise volt3 volt dan büyüktür demektir değilse 3 voltdan küçüktür.
Diğer sensörleride buna göre ayarlarsın benzer şekilde.
Ete

yusuf.ozyer

Hocam vakit ayırdığını için teşekkür ederim
hocam adcin 0 yazdığınız yerde diğer sensörler için adci1 adcin 2 adcin 3 diye gideceğim sanırım yanlışım yoksa
birde hocam 615 dediğiniz değer ne değeri ? diğer projelerinizde 0-255 kullanmışsınız

birde hocam bu komutlarım doğrumu ?

DEFINE OSC 4
DEFINE ADC_BITS 8
DEFINE ADC_CLOCK 1
DEFINE ADC_SAMPLEUS 100


ete

ADC ben genelde 10 bit kullanırım. Buda 5V karşılığı 1023 okuyacaksın demektir. 3V karşılığı ise 615 'edank gelir yaklaşık olarak.
Yazdığın komutlar yanlış değil ama pek doğruda sayılmaz. 100us lik örnekleme süresi hiç bir işlemcide yok bana kalırsa. Bunları nereden buluyorsunuz pek anlamıyorum.
Data sheetlerde örnekleme süreleri verilmektedir.
ADC okuma komutu ADCIN dir. Kullanım şekli, ADCIN Kanal, Değişken şeklindedir.
10 bitlik okuma yaparsanız Değişken 16 bitlik olmalıdır (word tipi), 8 bitlik ADC okursanız değişken Byte tipi olabilir.
Bu durumda 5V karşılığında 255 okursun. Yazdığın komutlarda
DEFINE ADC_BITS 8  komut satırı kaç bitlik okuma yapılacağını belirliyor.
8 bitlik okuma yaparsan 3V karşılığında ise yaklaşık 153-154 gibi bşr rakam okuyacaksın demektir.
Şayet 8 bşit kullanacak isen 615 yerine 153 yazman gerekecek.

Ete

yusuf.ozyer

tamam hocam sağolun 100 us lik yapmamın sebebi sizin yazınızda bir örnekde bu şekilde açıklama yapmışdınız o yüzden öyle yazdım hocam
"DEFINE
ADC_SAMPLEUS
100
komutunu inceleyelim.
ADC çevirim işleminin dahili bir kondansatörün önce şarj edilip sonra deşarj olma süresinin
ölçüldüğünü söylemiş idik. Belirtilen ADC_SAMPLEUS süresi ADC işleminin başlatılmasını
müteakip yani ADON bit inin set edilmesini müteakip uygulanan bir gecikme süresidir ve bir yerde
kondansatörün şarj süresi olarak açıklanır. Genelde 50-100 us dolayındaki süreler çevirim için
uygun gelmektedir."
Data sheetide pek anlamıyorum hocam o yüzden sizin verdiğiniz örnekdeki gibi yapayım dedim

ete

Açıklama yanlış değil sadece biraz düzeltilmesi gerekiyor. Örnekleme süresi 100us verilirse sistem yine çalışıyor. Ancak bu süre genelde 11-21us lik sürelerde gerçekleşiyor. Bu yüzden Data Sheet ne diyorsa onu vermek en doğrusu.

DEFINE ADC_CLOCK 1
komut satırı ADC işleminde kullanılacak CLK kaynağını ve şeklini tespit etmek için kullanılır. Bu seçim de işlemci frekansına bağlı olarak yapılması gereken bir işlem. Yine Data Sheet de hangi frekanslarda hangi CLK seçeneğinin kullanılacağı belirtilmiş. Ona göre seçmek en doğrusu.

Her zaman söylerim PicMultiCalc isimli kısacık bir program bu işde de yardımcı oluyor. A/D Calc seçeneğini seçerseniz önce frekansı giriyor ardından source impedans yani kaynağın empedansını giriyorsunuz. Bilmiyorsanız 10K alabilirsiniz. Hemen size basic komutlarını veriyor. Mesela 4Mhz için verdiği komut dizisi;
DEFINE ADC_BITS  8     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 11 ' ADC sampling time (uSec)
şeklinde. Doğrusuda budur. Ama işlemci data sheet'ine yinede bakmakta yarar var zira bu program işlemciye göre değil genel anlamda bu seçimi yapıyor.

Ete

Hattuşa

slm ete hocam;  ;D

tmr0 ile kurduğum bir kesme de her peryodda ADC okuması yapıyorum. adc okumasını


for x =0 to 20
adc[x] =adin 0
while adcon0.2 =1 :wend
next


şeklinde yaptığımda okuduğum adc değerleri çok sağlıklı değil, ancak her TMR0 kesmesinde bir kez okuttuğumda daha sağlıklı bir adc okuması oluyor.
hocam bunun sebebi ne olabilir?

ete

Bu konuda hiç bir fikrim yok. Olası sebepler arasında dahili kondansatörün yeterince şarj edilemiyor olması muhtemel. Tmr0 kesmesi bunu ortadan kaldırıyordur. Normalde böyle bir sorun olmaması gerekir. Adc ayarların doğru ise aralarında fark olmaması gerekiyor.

Ete

karadanadam

merhabalar, ben yeni üyeyim.

pic basic pro ile 16f88 kullanarak toprak direncini(nemi için bir fikir almak amacıyla) 0-999 aralığında oransal olarak ölçmek istiyorum. 3 basamaklı 7 segment display de de bunu görmek.

adc girişinde okuyacağım değerden diyelimki  639,8567 gibi değer geldi. bunun ondalık kısmını atıp; birler, onlar ve yüzler basamaklarını nasıl elde ederim ki 7 segmente aktarayım?

umarım soru anlaşılır olmuştur,
şimdiden teşekkürler. :-\

ete

Ananlog kanaldan okuyacağın değer kullandığınd erleyiciye bağlı olarak onadalıklı yada tamsayı şeklinde olacaktır.
İşin bu kısmını bir kenara bırakırsak teorik olarak ADC den okuyacağın değer 10 bitlik bir sayı olacak ve maksimum değeri 1023 olacaktır.
Bu sayı normal şartlarda 4 digitten oluşmaktadır. Basic de DIG şeklinde bir komut vardır.  Diyelimki ADC den okunan değer ADC=1023 şeklinde olsun
BIRLER=ADC DIG 0  şeklindeki komut sana BIRLER=3değerini vereektir.
ONLAR=ADC DIG 1 şeklindeki komut ise sana onlar basamağını verecektir.
YUZLER=ADC DIG 2 , sana yüzler basamağını
BINLER=ADC DIG 3 ise sana binler basamağını verecektir.

Bu sistemin haricinde 10 tabanına göre sayı sisteminin özelliklerinden yararlanarak da kolaylıkla bu değerleri bulman mümkündür.
1023 sayısını 10'a bölersen 102 kalacaktır. 102*10=1020 ve 1023-1020=3 şeklinde sana birler basamağını verir.
Aynı işlemi MOD alarak da yapabilirsin. ADC//10=3 şeklinde hesaplanabilir.
ADC/100=10 ve 10*100=1000 ve 1023-1000=23 ondan birler basamağını çıkartırsan 20 bulıursun bunuda 10a bölersen 2 sayısını elde edersin.
Yada ADC // 100=23 ve 23/10=2 sayısını kolaylıkla hesaplayabilrsin.
Diğerlerinide yapmaya gerek yok sanırım.

Ete

Powered by EzPortal