avatar_Hattuşa

ISIS simülasyon sorunu

Başlatan Hattuşa, 14 Ocak 2013, 10:16:41

Hattuşa

slm arkadaşlar malum yazdığımız kodları gerçekte uygulamadan önce isisde simüle ederiz, bu simüle esnasında aşamadığım konu ise
isisin adc okuma süresi hatası, gerçekte çalışan devrenin simülasyonunda dahi hatalı göstermekte, bunu isisde nasıl kapatırız bulamadım, hexi yüklediğimiz kısımdan kapatmayı denesemde sonuç hüsran isisi çalıştırdığım anda hata şişip kalıyor böyle olunca da yazdığımız kodları denetleyemiyoruz, önerisi olan varmıdır?

ete

Hata ya bakılırsa programında bir ADC okuması yapıyorsun ve muhtemelen ard arda sürekli okuma yaptırıyorsun. Ancak ADC okuması pic içinde bulunan bir kondansatörün şarj edilmesi ve deşarj zamanının tespiti yolu ile yapılmaktadır. Şarj süresi programdan seçeneklidir. Daha doğrusu seçtiğin CLK kaynağı bunu belirler. Seçtiğin süreye bakılırsa bir şarj süresi bitmeden yeniden ADC okuma isteğinde bulunuyorsun. Hata bundan dolayı veriliyor.
Bu tür sorunların aşılması için şunu yapabilirsin.
ADC CLK referansı için ADCON0 registerinde 6 ve 7 nolu bitler işlem görür. Bu bitlere %00 - %01 - %10 ve %11 değerleri verilerek referans clk seçimi yapılıyor. Bu seçeneklerden değişik varyasyonlar deneyebilirsin.
Son seçenek olan FRC (%11 ile seçiliyor) Kristal frekansı 1 Mhz in üzerinde ise pek tercih edilmez diyor data sheet.

Kullandığın işlemciye ait data sheet den   "A/D Acquisition Requirements" başlığını okuman gerek. Orada bir ADC işleminde değer alma zamanı hesaplanmaktadır.
Bu süreden daha azını vermemek lazımdır.
Örneğin 16F877 de hesaplanan değer 19,72us olarak bulunmuş O halde ADC define tanımlamalarına buna uygun bir değer vermen gerekir.

DEFINE   ADC_BITS   10       'A/D çevirim sonucu kaç bit olacak
DEFINE   ADC_CLOCK   1       'Clock kaynağı (3=rc)
DEFINE   ADC_SAMPLEUS   20   'Örnekleme zamanı mikro saniye cinsinden.

Diğer taraftan iki okuma arasına mutlaka biraz gecime koymaya çalış. Aksi taktirde hata devam edecektir.

Ete

Mucit23

#2
İsis böyle hatalar veriyorsa yazdığınız kodda problem var demektir.

Verdiği hatadan anladığım kadarıyla ADC dönüşüm işlemi bitmeden kanal değiştirip yeni  bir ADC ölçümü başlatıyorsun. Gerçekte bunu göremeyebilirsin. İsis seni uyarıyor işte

Edit;
Ete Hocam Açıklamış Sorunun sebebini. Süre koymak bir çözüm.

Eğer 18F kullanıyosan ADC dönüşüm kesmeside kullanabilirsin. ADC dönüşüm işlemi bittiğinde kesme oluşur. Bu şekilde ADC dönüştürme işleminin tamalandığını anlar bir sonraki ADC dönüştürme işlemini başlatırsın
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Hattuşa

Alıntı yapılan: Mucit23 - 14 Ocak 2013, 11:52:19
İsis böyle hatalar veriyorsa yazdığınız kodda problem var demektir.

Verdiği hatadan anladığım kadarıyla ADC dönüşüm işlemi bitmeden kanal değiştirip yeni  bir ADC ölçümü başlatıyorsun. Gerçekte bunu göremeyebilirsin. İsis seni uyarıyor işte

Edit;
Ete Hocam Açıklamış Sorunun sebebini. Süre koymak bir çözüm.

Eğer 18F kullanıyosan ADC dönüşüm kesmeside kullanabilirsin. ADC dönüşüm işlemi bittiğinde kesme oluşur. Bu şekilde ADC dönüştürme işleminin tamalandığını anlar bir sonraki ADC dönüştürme işlemini başlatırsın

mucid hocam adc kesmesi ile ilgili basit bir örnek verebilirmisiniz? zira sizde proton kullanıyorsunuz.
while adcon0.1 ==0 :wend komutu kesmemidir? sağlıklımıdır?

Mucit23

İlk Önce hangi işlemciyi kullanıyorsun onu söyle bakalım. Her işlemcide bulunmuyor.  18F de ve 16F lerin yenilerinde bulunuyor.

Senin yaptığın kesmeyle alakası yok. Sağlıklıda değildir. Senin orada yaptığın ADC dönüşümü bitene kadar programı orada durdurmaktır.

Kesme öyle değildir. Sen herhangi bir yerde ADC dönüşümü başlatırsın. Dönüşüm işlemi bittiğinde Gidip ADC değerini okursun.

Seçenek çok.Mesela Bildiğim kadarıyla ADC yi otomatiğede bağlayabiliyorsun. ADC yi configre edip, ADC kanalını seçip, ADC yi çalıştırdığın zaman Donanım sürekli ADC ölçümü yapıyor, Her ölçüm bittiğinde kesme oluşturuyor. Sende program her kesmeye gittiğinde hali hazırda bulunan ADC değerini alıyorsun.

Aklıma daha gelmiyor ama dediğim gibi seçenek çok..
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Hattuşa

s.a.
mucid usta 18f4520 kullanıyorum, PLL yi aktif edip 10 mhz kristalle 40 mhz de çalışıyorum, enazından öyle çalıştığımı sanıyorum.
bu işlemciye uygun bir adc kesmesi kod örneği verebilirseniz memnun olurum. yukarıdaki hata mesajına gelince;
bir döngü içerisinde 16 adet aynı pinden adc okutup buble short yaptırıyorum. buna uygun bir adc kesmesi ne olabilir?
ayrıca burda yerimidir bilmiyorum ama Circle ve line komutları ile glcd ye print yaptığımda süre çok fazla çıkıyor yani basit bir daire çizimi 110mS çıkıyor bu süreyi kısaltma yolu yokmudur?  ;D

ete

Bence kesmeden önce denemen gereken bir başka yol var.
ADCON0 registeri 1 nolu bit  GO/DONE bitidir. Bu bit 1 ise ADC işlemi devam ediyordur. Yeni bir işlem başlatılmamalıdır.
Bu bit sıfır ise işlem tamamlanmıştır yeni bir işlem başlatılabilir.
O halde her adc okumasından önce ;
GOSUB ADC_BAK diye bir komut yerleştir. ADC_BAK etiketinede aşağıdakileri yaz.

ADC_BAK:
WHILE  ADCON0.1=1 : WEND
RETURN

böylece ancak bir önceki ADC işlemi sona erdikten sonra bir sonrakine geçmiş olursun . İsis de o hatayı vermez diye düşünüyorum. Denemesi kolay ve çabuk olan bir yöntem. Dene ve sonucu buraya yaz lütfen.
Ete

Hattuşa

ete hocam verdiğiniz kod sanki hatalı, yani hata 2 yönlü
1. isisde bu koda geldiğimizde program başa geri dönüyor yani reset atıyor
2. adcon0.1 biti adc çevriminin başlangıç ve bitişini belirlemiyor mu? yani adc çevrimi başlamadan 0 da kalıp çevrim süresince 1 olmuyor mu? yada ben hatalı mı anlıyorum

ete

Bir adc işlemi ADCIN 0,HAM şeklind ebir komut ile başlatılır.
Program bu komutu görür görmez Go/Done bitini HIGH yapar.
Bu komutun peşine;
WHILE ADCON0,1=1:WEND yazarsan
ADC işlemi bitinceye kadar program orada bekler.
Bu nu demek istiyorum.
Ete

Powered by EzPortal