ADC Çevrimi DataW.HighByte ve DataW.LowByte şekline çevirme

Başlatan blueboard, 30 Temmuz 2018, 10:17:25

blueboard

Ete Hocam, internette gezinirken PBP ile yazılmış bir kodda ADC çevrim yapıldığını, çevrim sonunda elde edilen sonucun DataW.HighByte=ADRESH ve DataW.LowByte şeklinde ayrıldığını gördüm.Son olarak da DataW değişken değerine göre şart komutu( şunu yap gibi) oluşturulmuş. Bunun mantığı nedir? Örneğin 10 bit ADC çevrim sonunda 825 elde edilmiş olsa bunun DataW.HighByte=ADRESH ve DataW.LowByte işlemi ve son olarak DataW karşılığı nasıl hesaplanır? Bulduğum kodun ilgili kısmını aşağıya yazıyorum.Teşekkür ederim.


ADCON0.1=1          ' Start the A/D conversion
@ SLEEP                 ' Sleep until A/D conversion finished
    WHILE ADCON0.1      ' A/D complete?
    WEND                 
    PIR1.6=0         ' Clear A/D int flag
   DataW.HighByte=ADRESH      
   DataW.LowByte=ADRESL

pauseus 100
if DataW < 820 then
    IF DataW >  10 AND DataW < 80 THEN b_level=1

Hattuşa

slm bu kod ADC kesmesi olarak kullanılmış, ADC kesmeleri ne için kullanılır bilmem ama ben eğer bana çok hızlı olmak lazımsa özellikle ADC okumalarında o zaman ADC kesmesini kullanırım. mesela 18f4520 de datasheette adc çevrim süresi 4uS civarında (yanlış hatırlamıyorsam), klasik okuma yöntemlerinde 12-14uS un altında okuma yapamazsın ama ADC kesmesi kullanırsanız bu okuma datashette yazan sürede biter

ete

Adc okuması 10 bit üzerinden yapılıyor. Bu kodu yazan arkadaş Basic kodları yerine İşlemci Register lerini kullanarak ADC okuması yapmış. Sonuçtta okunan bilgi ADRESH ve ADRESL registerlerine yerleştiriliyor ve sen onu 16bitlik bir değişkene (DataW) aktarırken DATAW.Byte0=ADRESL ve DataW:Byte1=ADRESH şeklinde aktarman gerekiyor. Yada DataW.Lowbyte=ADRESL ve DataW.Highbyte=ADRESH şeklinde.
Bu iş için data sheetlerde detaylı açıklama mevcut. Mesela 16F877A için şu bilgiler verilmiş.
1. 1. Configure the A/D module:   A/D modülünü ADC okuması yapacak şekilde ayarla
• Configure analog pins/voltage reference and   (Referans voltajlarını ve analog okuma pinini seç
digital I/O (ADCON1)
• Select A/D input channel (ADCON0)  Analog kanalı seç
• Select A/D conversion clock (ADCON0)  Clk seçimini yap
• Turn on A/D module (ADCON0)  'adc kanalını aktive at.

2. Configure A/D interrupt (if desired):  Kesme kullanılacak ise aktive et.
• Clear ADIF bit
• Set ADIE bit
• Set PEIE bit
• Set GIE bit

3. Wait the required acquisition time.  'ADC şarj süresi kadar bekle
4. Start conversion:  'çevirmeye başla
• Set GO/DONE bit (ADCON0)  'GO/DONE bitini set et
5. Wait for A/D conversion to complete, by either:  'çevrim süresi kadar bekle
• Polling for the GO/DONE bit to be cleared           'go/done biti low oluncaya kadar bekle
(with interrupts enabled); OR                                'veya adc kesmesi oluşuncaya kadar bekle
• Waiting for the A/D interrupt
6. Read A/D result register pair                             'sonucu almak için Sonuç registerlerinden (ADRSL ve ADRESH) bilgileri oku
(ADRESH:ADRESL), clear bit ADIF, if required.
7. For the next conversion, go to step 1 or step 2,
as required. The A/D conversion time per bit is
defined as TAD

Ete

blueboard

Ete Hocam, yazan kişi kodları 16f1827 için yazmış.

ete

Açıkladığım durum genelde bütün işlemciler için aynıdır.
1827 içinde şöyle söylenmiş,
1. Configure Port:
2. Configure the ADC module:
3. Configure ADC interrupt (optional):
4. Wait the required acquisition time(2)
5. Start conversion by setting the GO/DONE bit
6. Wait for ADC conversion to complete by one of
the following:
7. Read ADC Result
8. Clear the ADC interrupt flag (required if interrupt
is enabled)
1-4 arası bizim programlarda başlangıçta ayarlanıyor zaten.
Programda sadece  ADCON0.1 biti yani Go/Done biti set edilerek ADC işlemi başlatılır.
Aynı bit işlemci tarafından ADC işlemi tamamlandığında otomatikman sıfırlanır. Böylece kullanıcı ADC işleminin bittiğini ve sonucun ADRES isimli registerlerden alınacağını bilir. Yapılan işlemde budur.
Ete

blueboard

Ete Hocam, son bir sorum olacak. Bir önceki mesajınızdaki ifadenizde şunu yazmışsınız: ''Sonuçtta okunan bilgi ADRESH ve ADRESL registerlerine yerleştiriliyor ve sen onu 16bitlik bir değişkene (DataW) aktarırken DATAW.Byte0=ADRESL ve DataW:Byte1=ADRESH şeklinde aktarman gerekiyor. ''

Kodları yazan kişi de şu şartı yazmıştı: ''if DataW < 820 then
    IF DataW >  10 AND DataW < 80 THEN b_level=1''

Pic'in ADC girişine bağlı bir potansiyometre değerine göre elde edilen DataW değerine göre Pic'deki çıkış olarak ayarlanmış istenen bir pini lojik1 konumuna almak istediğimizi kabul edelim. Örneğin 1K'lık potansiyometrenin tam orta konumda bulunduğu varsayılsın. Klasik 10 bit okuma yaparken okunacak ADC değerinin 1023/2= yaklaşık 512 olması gerektiğini biliyoruz. Peki bu  yöntemde ADC girişine gelen gerilime göre DataW değerini nasıl hesaplayarak benzer şartları oluşturabiliriz?
IF DataW >  10 AND DataW < 80 THEN port.b1=1
IF DataW >  100 AND DataW < 150 THEN portb.2=1   gibi.

MB_77

bu mesaj tarafımdan silinmiştir.


Powered by EzPortal