16f688 analog okuma sorunu

Başlatan muyat, 29 Eylül 2020, 23:23:02

muyat

16f688 in 3 numaralı pinine 1k direnç baglayıp direncin bir ucunu +5volta çektim.
Değişken direnç degerleriyle aynı pine gerilimi bölerek analog giriş yaparak 5 farklı çıkışı kontrol etmek istiyorum.Üstte yazdıgım gibi 10k değil 1k kullandım bu sefer.10k kullanırsam degerler 0-1024 arasında 0'a biraz daha yakın oluyor.O nedenle 1k kullandım.Ve derlerken aşagıdaki hataları alıyorum.
Programda sigorta ayarlarında bir yanlışlık var.Yardım eder misiniz?






@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF

CMCON=7                               'komparatörler kapalı  16F688
DEFINE OSC 4 

DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50 
ANSEL  = %00001000  ' AN3 ANALOG, DİĞERLERİ DİJİTAL, 
OPTION_REG.7=0
ADCON1=%10000000
ADCON0 = %11101101  ' internal A/D module RC oscillator          
OSCCON=%01101110        'İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
TRISA=%00010000         'A4 YANİ AN3 GİRİŞ
TRISC=%00000000 

SYMBOL CIKIS1=PORTC.1
SYMBOL CIKIS2=PORTC.2 
symbol CIKIS3=PORTA.1
SYMBOL CIKIS4=PORTA.0
Symbol CIKIS5=PORTA.2
PORTB=0
PORTA=0

SONUC VAR WORD
TOPLAM VAR WORD
DEGER VAR WORD
SAY VAR BYTE
CLEAR
PAUSE 200

BASLA:
GOSUB OKU

IF (SONUC >0) AND (SONUC <= 250) Then
CIKIS1=1
ELSE 
CIKIS1=0
ENDIF

IF (SONUC >350) AND (SONUC <= 450) Then
CIKIS2=1
ELSE 
CIKIS2=0
ENDIF


IF (SONUC >500) AND (SONUC <= 575) Then
CIKIS3=1
ELSE 
CIKIS3=0
ENDIF


IF (SONUC >600) AND (SONUC <= 650) Then
CIKIS4=1
ELSE 
CIKIS4=0
ENDIF

IF (SONUC >670) AND (SONUC <= 750) Then
CIKIS5=1
ELSE 
CIKIS5=0
ENDIF
GOTO BASLA





OKU:
TOPLAM=0
for say=1 to 10
ADCIN 2,DEGER
TOPLAM=TOPLAM+DEGER
pauseus 20
NEXT SAY
SONUC=TOPLAM/10 
RETURN
END

ete

BU işlemcide yer alan komparatör registeri 2 tane olduğu için birisine CMCON0 diğerine CMCON1 şeklinde isim verilmiş. Dolayısıyla CMCON diye bir register yok. CMCON=7 yerine CMCON0=7 şeklinde değiştirin.

Ete

muyat

ete hocam kodları aşagıdaki gibi yaptım..Kolaydan zora dogru gitmek için ve varsa hatayı bulabilmek için biraz kısalttım ama çalışmıyor.
11 nolu pinden çıkış alamıyorum...

picin 3 numaralı girişine 1k  direnç ve 245 ohm dirençle gerilim bölünerek baglantı yaptım..bu şekilde girişteki voltaj 0.98-1.12volt  civarı oluyor...O da analog olarak hesap yapıldıgında 201 degerıne karşılık geliyor.Hata nerde olabilir.

@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF

CMCON0=7                              'komparatörler kapalı  16F688
DEFINE OSC 4 

DEFINE ADC_BITS 10 
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50 
ANSEL  = %00001000  ' AN3 ANALOG, DİĞERLERİ DİJİTAL, 
OPTION_REG.7=0
ADCON1=%10000000
ADCON0 = %11101101  ' internal A/D module RC oscillator          
OSCCON=%01101110        'İNTERNAL OSİLATÖRÜ 4mhz' E AYARLA
TRISA=%00010000        'A4 YANİ AN3 GİRİŞ
TRISC=%00000000 

SYMBOL ILERIARAMA=PORTC.1
SYMBOL GERIARAMA=PORTC.2 
symbol SESARTIR=PORTA.1
SYMBOL TELEFON=PORTA.0
Symbol SESAZALT=PORTA.2
PORTC=0
PORTA=0

SONUC VAR WORD
TOPLAM VAR WORD
DEGER VAR WORD
SAY VAR BYTE
CLEAR
PAUSE 200

BASLA:
GOSUB OKU

IF (SONUC >0) AND (SONUC <= 250) Then    '11 NOLU PİN
SESAZALT=1
PAUSE 4000
ELSE 
SESAZALT=0
ENDIF


GOTO BASLA
OKU:

ADCIN 3,SONUC
 
RETURN
END



ete

Daha önce hiç kullanmadığım bir işlemci. Hata nerede bilemiyorum. O pin aynı zamanda komparatör çıkışı , Sonra analog pin. Bu durumda Komparatör önce iptal edilmeli ardından o pin ile ilgili Analog özellikte iptal edilmeli sonrasında pin digital I/O pinine döner. Biraz data sheet incele istersen.

Ete

muyat

Ama hocam zaten sigorta ayarlarında
CMCON0=7 komutu ile komparatörleri kapattık.
ANSEL  = %00001000  komutu ile de sadece an3 ü analog yaptık sigorta ayarlarında.Bu durumda çalışması gerekmez mi yine


ete

Şayet ADC okuması için harici bir REF voltajı kullanmıyor isen ADCON0 register ayarların yanlış gözüküyor.
ADCON0 = %10000000 şeklinde kullanmalısın.

Ete

muyat

Hocam dediginiz gibi yaptigimda sorun duzeldi.Tesekkurler
Peki harici bir referans voltaji kullanimina ornek verir misiniz?

ete

Örnek çok gereklimi bilemiyorum. Ama prosedür şöyle. ADCON0 registerinden harici ref seçilir. İşlemcinin bu amaçla ayırdığı bir pin olması gerekir. Bunu data sheete bakarak bulabilirsin. O pine ref voltajını bağlarsın. Böylece ADC okumalarında bu harici voltaj ref voltajı olarak kullanılır. Okuma vs işlemlerinde bir farklılık yok yanlızca ref voltajının seçimi değişmiş oluyor.

Ete

Powered by EzPortal