avatar_Burak

12F683 ADC

Başlatan Burak, 01 Eylül 2013, 17:14:18

Burak

Merhaba ;

Midrange familyasından olan bu 12F683 isimli mikrodenetleyicinin ADC'sinin irdelenmesi konusunda kafama takılan bir takım sorular var , şöyle başliym .. ;

İlk olarak bu işlemcinin ADC'sinin çalışabilmesini sağlamak için datasheet'te en çok içli dışlı olduğumuz sayfaları sıralarsak (Ben bookmark yaratmıştım bu sayfalar için oradan yazıyorum .)

1.CMCON0 REGISTER (SAYFA 56)
2.ANSEL REGISTER (SAYFA 33)
3.ADCON0 REGISTER (SAYFA 65)

ADC modülünü kullanabilmemiz 9. bölüm'de ANALOG-TO-DIGITAL CONVERTER (ADC) MODULE başlıklı bölümde ihtiyacımız olan ilgili register ve bölümleri bize
• GPIO configuration
• Channel selection
• ADC voltage reference selection
• ADC conversion clock source
• Interrupt control
• Results formatting

şeklinde sunmuş ... GPIO'nun ve TRISIO'nun ilişik çalıştığını biliyoruz ve pinlerin giriş ve çıkış olarak yapılandırdığımı register olarak , Kanal seçimi dediği yerde hangi kanalların karşılaştırıcı hangisinin analog hangisnin dijital olacağını ayarlıyoruz , voltaj referansını Vdd yada harici bir kaynak olarak gerekli register'da ayarlıyoruz , Kesme kontrolü sekmesiyle pek uğraşmadığım için bilmiyorum , Sonuç formatlama olayında ise sonucun sağa bitişik olarak 10 bit yada sola bitişik olarak 10 bit şeklinde stack'de tutulmasını istiyoruz konusunda ayar yapabiliyoruz ..

Şimdi işin içine girdiğimizde , programımızı yazmaya başlıyoruz , öncelikle ben bu işlemci için aşağıdaki şekliyle bir sigorta ayarı yapıp yola koyuldum ...

#config
__config _FCMEN_OFF & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
#ENDCONFIG


Master Clear'ı kapattım en azından bir harici giriş olarak kullanabileyim diye , dahili osilatörü açtım ve saat darbesi çıkışını iptal ederek 2 adet pini daha kullanılabilir hale getirdim ...

Şimdi ilk soruma geliyorum ...

CMCON0=%111
olarak ayarlanırsa datasheet'te dediğine göre "CIN pins are configured as I/O, COUT pin is configured as I/O, Comparator output disabled, Comparator off."

CMCON0=%000
olarak ayarlanırsa "CIN pins are configured as analog, COUT pin configured as I/O, Comparator output turned off" diyor ..

Şimdi ben analog giriş-çıkışları ayarlarken ilk olarak CMCON0=%000 registerinden analog olarak mi ayarlamam gerekiyor ? Ardından da tekrar ANSEL aracılığı ile tekrardan Analog olarak seçmem gerekiyor ? Yoksa CMCON=%111 ayarı ile digital I/O olarak bırakmam mı ?

İkinci sorum ;

ANSEL REGISTER'ına gelince sanırım en can alıcı ayarların yapıldığı zannımca analog selection'ın bir kısaltması olup gerekli kanalları ANALOG giriş olarak atayabileceğimiz kayıtçı birimidir ... Bit'lerini inceleyecek olursak ;

bit 7 Unimplemented: Read as '0'
bit 6-4 ADCS<2:0>:A/D Conversion Clock Select bits
000= FOSC/2
001= FOSC/8
010= FOSC/32
x11= FRC(clock derived from a dedicated internal oscillator = 500 kHz max)
100= FOSC/4
101= FOSC/16
110= FOSC/64
bit 3-0 ANS<3:0>: Analog Select bits
Analog select between analog or digital function on pins AN<3:0>, respectively.
1= Analog input. Pin is assigned as analog input.
0= Digital I/O. Pin is assigned to port or special function.



bit 3-0 ile Analog olarak kullanmak seçmek istediğimiz kanalları seçiyoruz ..  tamam ama bu bit 6-4 ne ola ?
FOSC/2 ler 4'ler 8'ler neye göre hesaplanıp seçilir ... Bundaki seçim mantığı nedir ? 4 MHz'de çalışıyosak FOSC/4'ü mü seçmeliyiz gibi bişiy mi ?

Üçüncü soruma gelelim ;

ADCON0 REGISTER'ını inceleyecek olursak ;

bit 7 ADFM: A/D Conversion Result Format Select bit
1= Right justified
0= Left justified
bit 6 VCFG:Voltage Reference bit
1= VREFpin
0= VDD
bit 5-4 Unimplemented: Read as '0'
bit 3-2 CHS<1:0>: Analog Channel Select bits
00= AN0
01= AN1
10= AN2
11= AN3
bit 1 GO/DONE:A/D Conversion Status bit
1= A/D conversion cycle in progress. Setting this bit starts an A/D conversion cycle.
This bit is automatically cleared by hardware when the A/D conversion has completed.
0= A/D conversion completed/not in progress
bit 0 ADON:ADC Enable bit
1= ADC is enabled
0= ADC is disabled and consumes no operating current


Bit 7'nin ne işe yaradığını az çok anlıyorum ... 10 bitlik çevrim sonucunu kayıtçılarında sağa bitişik mi yoksa sola bitişik mi olarak tutmak istediğimizi soruyor .. Bit 6'ya gelincede öyle .. Datasheet'i okuduğumuz kadarıyla Voltaj referans bitini 1 olarak seçtiğimizde beslememiz bizim pozitif referansımız oluyor , GND ise her zaman negatif referansımız bunu değiştiremiyoruz ... 4. ve 5. bitlerin işlevsiz olduğunu görüyoruz .

Anlamadığım bitler ; 2. ve 3. bitler ile Analog kanalın neyini seçiyoruz ? ANSEL ile zaten seçtiğimiz şey kanalın analog olarak kullanılıp kullanılmayacağı değilmiydi ? Buradaki bit'lerin işlevi ne oluyor ?

1. bite gelirsek , sanırım ADCIN komutu ile bağdaşık çalışıyor .. Yani ADCIN komutu ile birlikte 1 oluyor , çevirme tamamlandığında 0 oluyor o yüzden program içinde başlangıçta ADCON0 REGISTER'ı tanımlarken bu biti 0'da tutarak gereksiz enerji kaybını engellemiş oluruz diye düşünüyorum . Yani başlangıç konumunun 0'da yada 1'de olması o kadar önemli değil bu bitin diye düşünüyorum ...

ADCIN 3 , DAT  :   CTRLADC: IF ADCON0.1=1 THEN CTRLADC
şeklinde bir kontrol bloğu ile ADC çevrimin tamamlanmadan program akışının engellenmesini sağlamış oluruz  ...

0. bite gelirsek sanırım bu bitin ADCON0 kayıtçısının tanımlandığı satırda direkt olarak 1 yapılması gerekiyor ki ADC modülünü aktive edelim ... 0 olursa çevrim mevrim olmaz diye düşünüyorum ... Modül devre dışı kalır zannımca ..

Ama işte bu 2. ve 3. bitler ne ola ??? ANSEL kayıtçısının 3-0 arası bitleri kanal seçmemize yardımcı olurken bu bitler ne işe yarar acaba ?

Biliyorum sorular uzun oldu ama ne bildiğimi ne bilmediğimi görün diye uzun uzun yazdım ... Yanlış bildiklerimide düzeltirseniz gerçekten çok mutlu olurum ...

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

ete

Önceklikle 8 bitlik registerler 3 - 4 bitlik değer atama bu yanlış olur. %111 yerine %00000111 şeklinde değer vermelisin.

Soru-1 Cevabı;
Komparatör özelliği de bir analog özelliktir. ADC ile karıştırılmaması gerekir.
CMCON0=0 verirsen komparatörler iptal edilmiş olacaktır. Komparatör pinleri iptal olunca pinler otomatikman ADC pinine dönüşür. Pinlerden birisini ADC pini olarak kullanmayacak isen ADC özelliğinide iptal edip pinleri digital giriş çıkış pini haline getirmelisin.
CMCON0=0  komparatör iptal
ANSEL=0 ADC ler iptal
Bu iki komut sonrası pinler digital giriş çıkış pini haline gelir.

Soru-2 Cevabı: ADC pinlerini ANSEL (anolog select) registeri ayarlıyor. Bu registerin 4-6 bitleri  analogdan digitale çevirimde kullanılan CLK kaynağını ayarlar. CLK olmadan ADC çevrimi yapılamaz. Ya dahili CLK kaynağı seçilir yada Pic in kendi osilatörü bölünerek ADC çevrimi için kullanılır. 4-6 bitleri Kendi osilatörünün (Fosc) nin kaça bölüneceğini veya dahili ADC osilatörünün seçilip seçilmeyeceğini ayarlar. Bölme oranları 2-4-8-16-32-64 olabilmektedir. Ayrıca %x011xxxx şeklinde değer verilirse dahili ADC (FRC) osc si seçilmiş olur. Bölme hızı seçimi tamamen çalışma frekansına bağlıdır. Yüksek frekanlarda düşük bölme hızı düşük frekanslarda yüksek bölme hızı seçilmesi gerekir. Bunların kombinasyonu data sheet Tablo 9-1 de gösterilmiştir.

Analog pinlerin ayarlanmasına gelince toplam 4 adet ADC pini olup bunlar GPIO.0 ile GPIO.3 arasındaki pinlerdir. Dolayısıyla ANSEL registerinin 0-3 nolu bitlerinden hangisi 1 yapılırsa ona karşılık gelen pin ADC pini olur.

Soru-3 Cevabı:  ADC sisteminde bir adet şarj kondansatörü bulunur. Analog kanal seçilerek bu kondansatör seçtiğiniz analog kanala bağlanır. Girilen voltaj bu kondansatörü şarj eder ve sonra boşalması beklenerek ADC ölçümü yapılır. Kanal seçme Data sheet de ADCON0 registeri 3-2 bitleri ile yapıldığı belirtilmiştir. Basic bunu ADCIN Kanal,Değişken  şeklinde otomatik yapar bir kanal seçmeniz ayrıca gerekmez. Ama data sheet özellikle ASM de program yazanlar içinde faydalı bir kaynaktır ve onlar data sheet de belirtildiği şekilde kanal seçmek zorundadırlar.
ASM de bir ADC çevrimi başlatılması için ADCON0 registeri 0 biti "1" yapılır. Sistem ADC çevrimine başlar ve işlem tamamlanıncaya kadar 1 nolu biti HIGH da tutar. Çevrim tamamlanınca 1 nolu bit LOW olur böylece diğer dillerde program yazanlar çevrimin tamamlandığını buradan anlarlar. Basic bunu bize otomatik yapar.

Sorularını sorarken bir sürü bilgi de vermese idin bu kadar uzun bir soru mesajı olmayacak idi. Bir dahaki sefere ne sormak istiyorsan yalnızca onu sor lütfen.

Ete



Burak

#2
Alıntı yapılan: ete - 01 Eylül 2013, 18:42:51
Önceklikle 8 bitlik registerler 3 - 4 bitlik değer atama bu yanlış olur. %111 yerine %00000111 şeklinde değer vermelisin.

Soru-1 Cevabı;
Komparatör özelliği de bir analog özelliktir. ADC ile karıştırılmaması gerekir.
CMCON0=0 verirsen komparatörler iptal edilmiş olacaktır. Komparatör pinleri iptal olunca pinler otomatikman ADC pinine dönüşür. Pinlerden birisini ADC pini olarak kullanmayacak isen ADC özelliğinide iptal edip pinleri digital giriş çıkış pini haline getirmelisin.
CMCON0=0  komparatör iptal
ANSEL=0 ADC ler iptal
Bu iki komut sonrası pinler digital giriş çıkış pini haline gelir.

Soru-2 Cevabı: ADC pinlerini ANSEL (anolog select) registeri ayarlıyor. Bu registerin 4-6 bitleri  analogdan digitale çevirimde kullanılan CLK kaynağını ayarlar. CLK olmadan ADC çevrimi yapılamaz. Ya dahili CLK kaynağı seçilir yada Pic in kendi osilatörü bölünerek ADC çevrimi için kullanılır. 4-6 bitleri Kendi osilatörünün (Fosc) nin kaça bölüneceğini veya dahili ADC osilatörünün seçilip seçilmeyeceğini ayarlar. Bölme oranları 2-4-8-16-32-64 olabilmektedir. Ayrıca %x011xxxx şeklinde değer verilirse dahili ADC (FRC) osc si seçilmiş olur. Bölme hızı seçimi tamamen çalışma frekansına bağlıdır. Yüksek frekanlarda düşük bölme hızı düşük frekanslarda yüksek bölme hızı seçilmesi gerekir. Bunların kombinasyonu data sheet Tablo 9-1 de gösterilmiştir.

Analog pinlerin ayarlanmasına gelince toplam 4 adet ADC pini olup bunlar GPIO.0 ile GPIO.3 arasındaki pinlerdir. Dolayısıyla ANSEL registerinin 0-3 nolu bitlerinden hangisi 1 yapılırsa ona karşılık gelen pin ADC pini olur.

Soru-3 Cevabı:  ADC sisteminde bir adet şarj kondansatörü bulunur. Analog kanal seçilerek bu kondansatör seçtiğiniz analog kanala bağlanır. Girilen voltaj bu kondansatörü şarj eder ve sonra boşalması beklenerek ADC ölçümü yapılır. Kanal seçme Data sheet de ADCON0 registeri 3-2 bitleri ile yapıldığı belirtilmiştir. Basic bunu ADCIN Kanal,Değişken  şeklinde otomatik yapar bir kanal seçmeniz ayrıca gerekmez. Ama data sheet özellikle ASM de program yazanlar içinde faydalı bir kaynaktır ve onlar data sheet de belirtildiği şekilde kanal seçmek zorundadırlar.
ASM de bir ADC çevrimi başlatılması için ADCON0 registeri 0 biti "1" yapılır. Sistem ADC çevrimine başlar ve işlem tamamlanıncaya kadar 1 nolu biti HIGH da tutar. Çevrim tamamlanınca 1 nolu bit LOW olur böylece diğer dillerde program yazanlar çevrimin tamamlandığını buradan anlarlar. Basic bunu bize otomatik yapar.

Sorularını sorarken bir sürü bilgi de vermese idin bu kadar uzun bir soru mesajı olmayacak idi. Bir dahaki sefere ne sormak istiyorsan yalnızca onu sor lütfen.

Ete


Hocam , teşekkürler verdiğiniz cevaplar için .

Fakat ;


CMCON0=%00000111
olarak ayarlanırsa datasheet'te dediğine göre "CIN pins are configured as I/O, COUT pin is configured as I/O, Comparator output disabled, Comparator off."


CMCON0=%00000000
olarak ayarlanırsa "CIN pins are configured as analog, COUT pin configured as I/O, Comparator output turned off" diyor ..

Açıklaması yapılmış , anlamadığım her ikisi içinde Komparatör çıkışı devre dışı diyor ama sadece CMCON0=%00000111 için komparatör kapalı diyor , ama siz CMCON0=%00000000 olarak ayarlayıp komparatörü kapat diyorsunuz . ,

Sizin dediğiniz gibi ayarladıktan sonra analog olarak bırakılmış CIN pinlerini ANSEL'den tekrar analog olarak ayarlamaya gerek kalmasın diye mi öyle yapıyoruz . ? Yoksa başka bir sebepten mi ? Neden CMCON0=%00000111 şeklinde kullanmıyoruz da CMCON0=%00000000 şeklinde uyguluyoruz ?
Ω Gens Una Sumus Ω

ete

Pinleri analog kullanacaksan cmcon registerine sıfır vermelisin. Pinleri digital hiriş çıkış kullanacak isen cmcon registerine 7 vereceksin.
Ete

pwm3434

ete hocmız  gereken  cevabı  vermiş.

bildiğim  kadarıyla
sen,   analog  kanalları  kullanman için  ansel  register ayarını   ve  beraberinde   komparatör ayarını da ayarlamalısın.  çünkü üreticiler tarafından komparatörlü pıc ler,  defult  olarak  komparatör ön  seçimli olarak ayarlıdır.   yanlışlığım  varsa düzeltin

Burak

#5
Alıntı yapılan: ete - 01 Eylül 2013, 22:22:06
Pinleri analog kullanacaksan cmcon registerine sıfır vermelisin. Pinleri digital hiriş çıkış kullanacak isen cmcon registerine 7 vereceksin.
Ete

Hocam peki bu deşarj sığacının bağlanacağı pin'i seçen ADCON0 kayıtçısının 2. ve 3. bitlerinin yapacağı işi ADCIN komutuyla belirttiğimiz kanala otomatik zaten bağlıyor olması durumu var ise bu bitlerin durumunu ADCON0 kayıtçısını ayarlarken hangi durumda bırakalım , set mi edelim clear' mı edelim ?
Ω Gens Una Sumus Ω

ete

Hiç bir şey farketmez. Nasıl olsa komut onu kendi isteğine göre ayarlayacak. Bu nedenle başlangıç değeri önemli değil.
Ben genelde "00" yaparım.
Ete

Powered by EzPortal