16F886 ADC sıkıntı ..

Başlatan Maxim, 01 Nisan 2012, 10:43:00

Maxim

ETE hocam aynı başlığı buradada açmak istedim.

16F886 işlemcide analog veya komparator ayarları ile ilgili bir uyumsuzluk var
çünkü tüm girişler digital olsun dediğim zaman lcd çalışıyor
Declare All_Digital= true

lcd ekran portb ye bağlı ama portb.2 ve portb.3 girişlerini analog olarak kullanmak istemekteyim .
portb tris tanımı şöyle TRISB=%00001100
AN8 ve AN9 analog olacak ama yapınca lcd çalışmıyor

kodlar proton+ fakat sıkıntı eminim ayarlar tanımlar konfiglerle ilgili birşey


kod:


;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

Device = 16F886
Xtal 8
OSCCON=%01110101

Config1 FOSC_INTRC_NOCLKOUT, WDTE_OFF, PWRTE_ON, MCLRE_OFF, CP_ON, CPD_OFF, BOREN_ON, IESO_OFF, FCMEN_OFF, LVP_OFF, DEBUG_OFF
Config2 BOR4V_BOR21V, WRT_OFF

;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------

TRISA=%00111111 :PORTA=0
TRISB=%00001100 :PORTB=0
TRISC=%00000000 :PORTC=0

OPTION_REG.7=1
PCON.5=0

CM1CON0.7=0
CM2CON0.7=0
VRCON.7=0

ANSEL=%00011111
ANSELH=%00000011

ADCON0=%10000011
ADCON1=%00000000

Declare Adin_Res 10
Declare Adin_Tad 32_FOSC
Declare Adin_Stime 50

''Declare All_Digital= true '***

Declare LCD_DTPin PORTB.4
Declare LCD_RSPin PORTB.0
Declare LCD_ENPin PORTB.1
Declare LCD_Interface 4
Declare LCD_Lines 2

DelayMS 250
Cls

LOOP:

Print At 1,1, "maxim"

DelayMS 150
GoTo LOOP


ete

Maksim,
Bu işlemciyi kullanıyorum. Bir kaç işimde sorunsuz kullandım.
Programınada baktım sorun yok gözüküyor. İki satır fazlalık var.
ADCON0=%10000011
ADCON1=%00000000
Bu iki satır yerine ADCON1.7=0 demen yeterli.
ADCON0 eşitliğine ait tanımlamaları
Declare Adin_Tad 32_FOSC  şeklinde vermişsin zaten. 
Bunun dığında başka bir kusur göremiyorum.
Birde B portunda LCD ya bağlı pinler aynı zamanda PWM pinleridir. Acaba onlar açılışta aktif mi geliyorlar.
İstersen birde programa şunları ekle.
CCP1CON=0
CCP2CON=0

Bakalım sonuç ne olacak.
Ete

pwm.c

Sorun ANSELH registerinde. buraya verilen değer analog kanal değeri ile alakalı değil.
ayrıca 10bit ADC dönüşümü için ADCON1=%10000000  yapılmalı.

düzenlendiğim kodlar burada.
;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

Device = 16F886
Xtal 8
OSCCON=%01111000 '8MHZ
'OSCCON=%01110101
@ CONFIG_REQ
@__CONFIG _CONFIG1, FOSC_INTRC_NOCLKOUT & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_OFF & IESO_OFF & FCMEN_OFF & LVP_OFF & DEBUG_OFF
@__CONFIG _CONFIG2, BOR4V_BOR21V & WRT_OFF


;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------

TRISA=%00111111 :PORTA=0
TRISB=%00001100 :PORTB=0
TRISC=%00000000 :PORTC=0

OPTION_REG.7=1
PCON.5=0
CM1CON0 = %00000000 ' Comparator OFF
CM2CON0 = %00000000 ' Comparator OFF

ANSEL=%01111111
ANSELH=%00000000

ADCON1=%10000000

Declare Adin_Res 10
Declare Adin_Tad 32_FOSC
Declare Adin_Stime 50

'Declare All_Digital= true '***

Declare LCD_DTPin PORTB.4
Declare LCD_RSPin PORTB.0
Declare LCD_ENPin PORTB.1
Declare LCD_Interface 4
Declare LCD_Lines 2
Dim ADC0 As Word
DelayMS 250
Cls

LOOP:
ADIn 8,ADC0
Print At 1 , 1 ,"ADC8= ",Dec ADC0,"    "
ADIn 9,ADC0
Print At 2 , 1 ,"ADC9= ",Dec ADC0,"    "

DelayMS 150
GoTo LOOP

End
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

ete

Bence yanlışsın. Data sheet aksini söylüyor.
ANSEL registeri açıklamasında;
ANS5 - ANS6 - ANS7 pinleri için 16F886 ya uygulanmaz diyor. Bu durumda
ANSEL registeri yalnızca 5 adet A portuna ait analog girişleri ayarlamaktadır. (ANS0-ANS4)

Dolayısıyla 16F886 için ANSEL registeri tüm girişleri aktif etmek için yalnızca  %00011111 şeklinde ayarlanabilir.

Diğer taraftan Yine Data Sheet ANSELH resigteri açıklamasında ise ;
ANS13 ANS12 ANS11 ANS10 ANS9 ANS8  şeklinde açıklama verilmiş. Zaten pin diagramında da AN5-AN7 arası yazılmamış ve PortB de bulunan pinler direk şiöyle adlandırılmış.
PORTB.0= AN12
PORTB.1=AN10
PORTB.2= AN8
PORTB.3= AN9
Bu durumda TRISB registerinde 2 ve 3 nolu bitler giriş olarak ayarlanmalıdır.
Ayrıca ANSELH registerinde ise İlk iki register ANS8 ve ANS9 olarak %11 şeklinde ayarlanmalıdır.
Verdiğim ayarlar doğrudur. Yada data sheet yanlıştır.
ADCON1 registeri 7. biti HIGH olmalı bunda haklısın.

Ben data sheete dayanarak bunları açıkladım. Acaba sen neye dayanarak bu kanıya vardın açıklarsan sevinirim.
Ete

pwm.c

Hocam, bende proteusun yalancısıyım.  :)
ANSEL registerlerinin tamamını sıfırladım ve ADC sonucunu sorunsuz okuyorum. olmassa gerçektede denerim. proteusa herzaman güzenilmez derseniz haklısınız.
dosyalar burada:
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Hattuşa

Alıntı yapılan: pwm.c - 01 Nisan 2012, 23:23:14
Hocam, bende proteusun yalancısıyım.  :)
ANSEL registerlerinin tamamını sıfırladım ve ADC sonucunu sorunsuz okuyorum. olmassa gerçektede denerim. proteusa herzaman güzenilmez derseniz haklısınız.
dosyalar burada:

ustam datasheeti daha güvenilir, zira 10 gündür usart denen işlemi ben isisde çalıştırırken gerçekte çallıştıramıyorum. sözün özü isise çok güvenme

Maxim

bu arada bende deniyorum tabi
ansel i kapatınca lcd çalışıyor ama mantıklı gelmedi banada
realde denemek lazım, yarın denerim

pwm.c

olmassa şöyle bişey dene,
ADC okuduktan sonra ANSEL girişini kapat ve daha sonra LCD çalıştır. örneğin:

ANSELH.0=1
ADIn 8,ADC0
ANSELH.0=0
Print At 1 , 1 ,"ADC8= ",Dec ADC0,"    "

ANSELH.1=1
ADIn 9,ADC0
ANSELH.1=0
Print At 2 , 1 ,"ADC9= ",Dec ADC0,"    "
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Maxim

denedim

anselH kapatılınca adc ve lcd çalışıyor
enteresan

ete

#9
Aynı programı birde PBP da yazacağım. Yarın yazarım sanırım. Akşama da evde denerim bakalım ne oluyor.
Sanki derleyici BUG'ı gibi geliyor bana. Yada data sheet yanlış.

Ete

Not: Programı PBP da yazdım . Sonuç aynı. AnselH registerine %=11000000 değerini vermez isen LCD çalışmıyor maalesef.
Bu şekilde bütün istenen ADC kanallarıda çalışıyor. ANlamadım doğrusu. Bir terslik var ama nerede. Zira;
ANSEL =%00011111
ANSELH=%1100000   şeklinde komut veriyorum AN0-AN4 ve AN8 AN9 analog olarak çalışıyor. Bana kalırsa terslin ANSELH registerinde ama neresinde bilemedim doğrusu.

Ete


pwm.c

#10
PBP ve 16F88 ile ADC testini yaptım. ANSEL=0 olarak kaydettim. dönüşüm gerçekleşiyor ama proteus resimdeki gibi arka arkaya uyarı mesajları veriyor.

ANSEL=1 yapınca bu uyarılar çıkmıyor.
Bu durum sadece A portlarında oluyor. B portlarında uyarı vermiyor.

sonuç olarak ANSEL i B portunda ya hiç kullanmayacağız yada yukarıda gösterdiğim gibi ADC dönüşümünden hemen önce açıp daha sonra tekrar kapatacağız.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Hattuşa

pwm usta o hata bence programın içerisinde protona göre "all_digital true" yazmadan kaynaklı, yazılımda bu komut var ise bu kısmı düzeltmeniz gerekir. CMCON ayarı olarak geçiyor sanırım PBP da...

Maxim

Alıntı yapılan: pro-TR - 03 Nisan 2012, 08:47:26
pwm usta o hata bence programın içerisinde protona göre "all_digital true" yazmadan kaynaklı, yazılımda bu komut var ise bu kısmı düzeltmeniz gerekir. CMCON ayarı olarak geçiyor sanırım PBP da...

yanlış anlamışsın
o komut kullanınca lcd çalışıyor demiştim
tabiki normalde kullanılmıyor

Powered by EzPortal