ADC okumasını açmak ve okuma bitti bayrağı

Başlatan F®T, 20 Ocak 2012, 15:07:38

F®T

selamlar.
arkadaşlar adc yi istediğim zaman okumak istediğim zaman kapatmak istiyorum.ayrıca adc nin okunduğunu bittiğini anlamak istiyorum.bunun için işlemcilerde ne gibi  ayarlar gerekiyor.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

F®T

#1
ETE hocam

ADCIN 0,SAYIA
        If ADCON0.2=1 Then BASLA
        GoSub AYARLA_SAYIA
        PAUSEUS 50

bir çalışmanızda adcon0.2=1 olarak kullandığınız komut adc nin okunduğunumu kontrol ediyor.eger adcon0.2 biti 1 ise adc okuması devam ediyor 0 ise okuma bitti anlamına mı geliyor.ayrıca adc okuması devam ederken tmro kesmesi veya rb.0 kesmesi oluşunca okuma bitmeden kesmeye gidermi?
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

İşlemciden işlemciye değişebilecek ayarlamalar mevcut bu işte. 16F877 işlemcisine göre açıklamaya çalışayım.
ADCON0 registeri 3-5 nolu bitleri kullanarak hangi ADC kanalını kullanacağını belirleyeceksin.

ADC işlemini başlatmak için ; ADCON.2 bitini set edeceksin. Bu bit'e 1 yerleştirirsen ADC işlemi başlayacaktır. Ancak aynı biti LOW yapamazsın artık. İşlem bitince kendisi LOW olacaktır. Dolayısıyla ADC işleminin bitip bitmediğini bu bitden anlayabilirsin.

1 ise hala işlem devam ediyordur. Sıfır olmuş ise işlem tamamlanmıştır.
Bu arada ADCON0.0 bitine 1 yerleştirerek ADC işlemini açmış olman gerekiyor. Bu bitin LOW yapılması sonucunda ADC işlemi kapatılmış olur.

Bir ADC işleminide fiziksel işlem sırası şöyledir.;
- ADCON1 registerinden hangi pin analog olarak kullanılacak ise ayarlanır.
- ADCON0 registerinden kanal seçilir.
- ADCON0 registerinden ADC çevrim CLK değeri seçilir.
- ADCON.0 biti set edlerek ADC açılır.
- ADCON.2=1 yapılarak işlem başlatılır
- Aynı bit LOW oluncaya kadar beklenir.
- AdresH ve AdresL registerlerinden ADC değeri okunur.

Ete

F®T

hocam teşekkürler her zamanki gibi güzel izah etmişsiniz.bendeki sorun şu.kesme oluşunca ısıste adc çevirim hatası oluşuyor.hem adc.hem 18b20 okuması.hem tmr0 ,rb0 kesmesi ve kesmede 7 segment sürme olayı gerçekleştirmeye çalışıyorum ama çok sorunlar oluşuyor.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Normalde Kesme oluşunca ADC çevrimi bozulmaması gerekir. geri planda yapılan bir işlemdir.
Sorun oluşuyor ise ADC ye başlarken Kesmeyi kapat sonuçta çok kısa sürede yapılan bir işlem ADC okuması.

Birazda işlemcinin Suyuna gitmeye çalışın.

Ete

F®T

Anladım hocam çalışma yapayım.teşekkürler.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Hattuşa

Alıntı yapılan: ete - 20 Ocak 2012, 16:22:23
Normalde Kesme oluşunca ADC çevrimi bozulmaması gerekir. geri planda yapılan bir işlemdir.
Sorun oluşuyor ise ADC ye başlarken Kesmeyi kapat sonuçta çok kısa sürede yapılan bir işlem ADC okuması.

Birazda işlemcinin Suyuna gitmeye çalışın.

Ete

slm hocam ben şu son ifadeyi anlamadım

ete

İllaki kesme oluşunca ADC bozuluyorsa o zaman ADC okurken kesmeyi kapatmak gerekir bunu demek istedim.
Ete

Burak

Hocam peki diyelim ki ;

Ben 6 ayrı analog kanaldan okuma yapacağım , Bu durumda birinci okuma bittiğinde adcon0.2 biti clear edildikten sonra ardından kullanacağım adcin komutu ile tekrar adcon0.2 bitini set mi etmiş oluyorum ?

Yani örnek bir kodla açıklarsak :



MAIN:

ADCIN 0 , RAW1
CTRL1: IF ADCON0.2=1 THEN CTRL1

ADCIN 1 , RAW2
CTRL2: IF ADCON0.2=1 THEN CTRL2

ADCIN 2 , RAW3
CTRL3: IF ADCON0.2=1 THEN CTRL3

ADCIN 3 , RAW4
CTRL4: IF ADCON0.2=1 THEN CTRL4

ADCIN 4 , RAW5
CTRL5: IF ADCON0.2=1 THEN CTRL5

ADCIN 5 , RAW6
CTRL6: IF ADCON0.2=1 THEN CTRL6

goto main



şeklinde mi yapmalıyım yoksa



ADCIN 0 , RAW1

ADCIN 1 , RAW2

ADCIN 2 , RAW3

ADCIN 3 , RAW4

ADCIN 4 , RAW5

ADCIN 5 , RAW6

CTRL: IF ADCON0.2=1 THEN CTRL

goto main



şeklinde mi ?

Şimdiden teşekkürler .
Ω Gens Una Sumus Ω

ete

Her iki kod da çalışır. Alttaki daha doğru. Çünki bildiğim kafarı ile adc okuma tamamlandı bit kontrolunu basic kendisi yapıyor ( bildiğim kafarı ile) bu nedenle ayrıca senin kontrol etmen gerekmiyor.
Ete

Mucit23

Konu üzerinden biraz vakit geçmiş ama yeni konu açmayada gerek yok sanırım. Basit bir soru

Assembly ile ADC ölçümü yapıp Display'de göstermem gerekiyor. Kullandığım mcu 16F877

Kesme ve display Tarama işlemlerini hallettim. 8bit  ADC okuması yapıp hanelerine ayırmam gerekiyor. Anlamadığım nokta şudur. datasheete 8 bit adc için hiçbirşeye değinilmemiş. Bu iş ile ilgili sadece ADCON0'ın ADFM biti var. Oda sonucun sağamı yoksa solamı dayalı olacağını ayarlıyor.


jpg upload

Acaba pic basic gibi derleyicilerde ADC çözünürlüğünü 8 bit yaptığımız zaman, ADFM bitini 0 yapıp sadece ADRESH değerinimi bize veriyor? ADRESL nin son iki bitini işleme almıyor? Bendemi böyle yapacağım.

Birde şunu sorayım.

okuduğum 8 bitlik adc değerini hanelerine ayırmam gerekiyor okuduğum değer 128 ise, tanımladığım 3 adet değişkenin 1. sine "8" değerini 2. sine "2" değerini,  sonuncusuna ise "1" değerini yükelemem gerekiyor.

Basic veya CCS de mod alıp yapıyorduk. Assembly ile nasıl yapacağız?
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Aslında 8 bit okuma diye bir şey yok. Basic 10 bitlik değeri 4e bölerek 8 bit olarak sana veriyor.
Sende aynısını yapmak zorundasın.

Bir sayının hanelerini bulmak için matematik yapman gerek. Elinde 123 şeklinde bir sayı var ise bunun hane değerleri

Yuzler=Sayı/100
Onlar=(Sayı-yüzler*100)/10
Birler=Sayı-yuzler*100-onlar*10
Başka yolu varmıdır bilemiyorum.

>Ete


Hattuşa

bu konuda bende bir soru sorsam ete hocam;
şimdi 18F4520 de 40mhz de bir adc okuma süresi datasheete göre 2,4 ortalama 3uS sürüyor ancak çevrim işlemi ile birlikte 15uS u buluyor, acaba ben adc okuma işlemini basic değilde asm de yapsam süreye etkisi olur mu?
yani sözün özü adc okutma işlemini asm de yapmanın bize süre olarak zaman kazandırır mı?

Mucit23

#13
Alıntı yapılan: ete - 01 Nisan 2014, 13:45:58
Aslında 8 bit okuma diye bir şey yok. Basic 10 bitlik değeri 4e bölerek 8 bit olarak sana veriyor.
Sende aynısını yapmak zorundasın.

Bir sayının hanelerini bulmak için matematik yapman gerek. Elinde 123 şeklinde bir sayı var ise bunun hane değerleri

Yuzler=Sayı/100
Onlar=(Sayı-yüzler*100)/10
Birler=Sayı-yuzler*100-onlar*10
Başka yolu varmıdır bilemiyorum.

>Ete



Basic'in gözüne kurban, Bu dediklerinizi Assembly ile yapabilmek için roman yazmam gerekir herhalde :D

internette bulduğum bir örnekteki kodlardan devşirme aşağıdaki kodları yazdım.
;*************************Sayıyı hanelerine ayırma*********************
DECIMAL_TO_DIJITS   
  MOVWF SAYI          ;W deki Değer SAYI değişkenine kopyalanıyor.
  CLRF BIRLER         ;Birler Değişkeni Sıfırlanıyor
  CLRF ONLAR          ;Onlar Değişkeni Sıfırlanıyor
  CLRF YUZLER         ;Yuzler Değişkeni Sıfırlanıyor
ASAMA1
  MOVLW D'100'        ;W'ye 100 değeri yükleniyor
  SUBWF SAYI,W        ;Sayıdan W çıkartılıyor.
  BTFSS STATUS,C      ;Elde biti kontrol ediliyor
  GOTO ASAMA2         ;Aşama2 ye geç
  MOVLW D'100'        ;W'ye 100 değeri yükleniyor
  SUBWF SAYI,F        ;Sayıdan W çıkartılıyor
  INCF YUZLER,F       ;Yüzler Değişkenini 1 arttır.
  GOTO ASAMA1         
ASAMA2
  MOVLW D'10'         ;W'ye 10 değeri yükleniyor
  SUBWF SAYI,W        ;Sayıdan W çıkartılıyor.
  BTFSS STATUS,C      ;Elde biti kontrol ediliyor
  GOTO ASAMA3         ;Aşama3 ye geç
  MOVLW D'10'         ;W'ye 10 değeri yükleniyor
  SUBWF SAYI,F        ;Sayıdan W çıkartılıyor
  INCF ONLAR,F        ;Onlar Değişkenini 1 arttır.
  GOTO ASAMA2
ASAMA3
  MOVLW D'1'          ;W'ye 1 değeri yükleniyor
  SUBWF SAYI,W        ;Sayıdan W çıkartılıyor.
  BTFSS STATUS,C      ;Elde biti kontrol ediliyor
  GOTO FINISH         ;Finish 'e geç
  MOVLW D'1'          ;W'ye 1 değeri yükleniyor
  SUBWF SAYI,F        ;Sayıdan W çıkartılıyor
  INCF BIRLER,F       ;Birler Değişkenini 1 arttır.
  GOTO ASAMA3
FINISH
RETURN


W deki değeri hanelerin ayırıyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal