16F877 de ADC sorunu

  • Konbuyu başlatan kudretuzuner
  • Başlangıç tarihi

kudretuzuner

Paylaşımcı üye
Katılım
28 Tem 2009
Mesajlar
902
Puanları
133
Merhaba
Arkadaşlar Altaş yayınlarından PIC 16F877A adlı kitaptaki ADC ile ilgili bir çalışmayı hazırladım ama sorunu çözemedim.Yazılım hata veriyordu değişiklerle programı çalışır hale getirdim ama pot ile ADC okuyamıyorum.Nerede hata yapıyorum?
Teşekkürler.
 

Ekli dosyalar

  • PWM_DENEME.rar
    32.9 KB · Görüntüleme: 1

MAIN_LOOP

Onursal Üye
Onursal Üye
Katılım
28 Ara 2011
Mesajlar
2,174
Puanları
937
Yaş
41
Konum
ANKARA
adcon0 ve adcon1 registerlarını set ettinizmi?
birde şemada pota bağlı yukarı çekilmiş 10k var. bu durumda potunuz en üst seviyedeyken bile 2.5v üstü okuyamazsınız. 10k yı çıkarıp direk bağlarsanız o ucu range daha geniş olur.
 
Konu Sah
kudretuzuner

kudretuzuner

Paylaşımcı üye
Katılım
28 Tem 2009
Mesajlar
902
Puanları
133
Merhaba
Çalışmayı bu safhaya kadar getirdim.
1-azılımın hangi satırında RA1'in giriş olarak kullanıldığını bulamadım.
2-10 bit okuma yerine 8 bit okunuyor neden.
3-Ayrıca da gelen bilgilerin nasıl değerlendirileceğini çözemedim. Teşekkürler.

https://www.kontrolkalemi.com/forum/attachments/pwm_deneme-rar.24144/
 

GüvTek

Üye
Katılım
7 Mar 2012
Mesajlar
190
Puanları
3
Yaş
31
Hocam burdaki yazılımın amacı ne, tam anlamadım açıkçası.. Anladığım kadarıyla 5V luk referansta 10 bit ölçüp 2 MSB bitini sallıyor.. Kalan 8 LSB biti de PORTB ye atıyor ilk yazılım.. Yani adc aslında 10 bit ölçüm yaptığı halde 5V referansta 1,25 V a kadar doğru ölçüyor, 2,5V a kadar 1,25V eksiğini, 3,75V a kadar 2,5V eksiğini, 5V a kadar da 3.75V eksiğini gösteriyor PORTB de..

LIST P=16F877
INCLUDE "P16F877.INC"
__CONFIG H'3F31'
KANALNO EQU 0X70
SONUCBYTE EQU 0X71

ORG 0
CLRF PCLATH

;BSF STATUS,5
;MOVLW H'FF'
;MOVWF TRISA
;MOVLW H'00'
;MOVWF TRISB
;MOVLW H'00'
;MOVWF TRISC
;MOVLW H'00'
;MOVWF TRISD
;MOVLW H'00'
;MOVWF TRISE
;CLRF PORTA
;CLRF PORTB
;CLRF PORTC
;CLRF PORTD
;CLRF PORTE

GOTO ANA_PROGRAM
ORG 4
KESME
RETFIE

ADC_OKU
BCF STATUS,C
RLF KANALNO,F
RLF KANALNO,W

IORLW B'01000001'

BANKSEL ADCON0
MOVWF ADCON0
BSF ADCON0,2

ADC_J1
BTFSC ADCON0,2
GOTO ADC_J1
MOVF SONUCBYTE,F
BTFSS STATUS,Z
GOTO ADC_J2
BSF STATUS,RP0
MOVF ADRESL,W
RETURN


ADC_J2
BCF STATUS,RP0
MOVF ADRESH,W
RETURN


ANA_PROGRAM
MOVLW D'255'
BANKSEL TRISA
MOVWF TRISA
CLRF TRISB
BCF STATUS,RP0
CLRF PORTB
CLRF PORTE
MOVLW 0X41
MOVWF ADCON0
MOVLW 0X80
BSF STATUS,RP0
MOVWF ADCON1

ANA_J1
MOVLW 0X02
MOVWF KANALNO

CLRF SONUCBYTE
CALL ADC_OKU
BANKSEL PORTB
MOVWF PORTB
;*********
MOVWF PORTE
;********
GOTO ANA_J1

END

Hocam alttaki satırda kanal no RA1(AN1) olarak kullanılmış.. Kalın yazılı komutlarda.. KANALNO registeri seçeceğiniz kanalın 2 katı olmalı.. Mesela 3 nolu kanal için 6 girilmeli o registere..

10 bit okuduğu halde 8 bit LSB bitini portb ye atıyor..

Gelen bilgiler aslında 2 registerde veriliyor.. ADRESH ve ADRESL.. Bu programa göre adcon0, 2MSB bitini ADRESH'ta kalan düşük değerlikli 8 biti de ADRESL de veriyor ve programda SONUCBYTE daima sıfır olduğu için sadece ADRESL satırını PORTB ye atıyor.. Altı çizili komutlar işleniyor yani..
 
Son düzenleme:

zenginal

Üye
Katılım
17 Ağu 2011
Mesajlar
36
Puanları
3
Konum
bursa
c dilinde yzılmış olsa idi size yardımcı olurdum ama bu dili bilmiyorum
 
Konu Sah
kudretuzuner

kudretuzuner

Paylaşımcı üye
Katılım
28 Tem 2009
Mesajlar
902
Puanları
133
Merhaba
Evet yazılımı ben de tam olarak analiz edemediğim için sordum.Yapacağım işlerin yazılımlarını ekseriyetle kendim yazarım.ADC konusuna yeni başladım sistemi tam olarak çözemedim(neyin ne olduğunu ve nasıl çalıştığını)özellikle ADRESL ve ADRESH saklayıcılarını anladım da oluşan bilgilerin nasıl registerlere atıldığını tam kavrayamadım.Teoriye biraz daha kafa yorayım bakalım.
 

GüvTek

Üye
Katılım
7 Mar 2012
Mesajlar
190
Puanları
3
Yaş
31
Abi pdfsinde detaylıca anlatılmış.. Çok büyütülecek bişey yok aslında adc de.. Sanırım bazı pdflerde 3-5 bilgi eksik oluyor o yüzden soru işareti kalmıştır aklınızda.. Yine asmde adc ile ilgili sormak istediğiniz bişey olursa özelden yazabilirsiniz.. Çoğu şeyi anlatabilirim..
 

ULAGA

Üye
Katılım
9 Ocak 2012
Mesajlar
592
Puanları
3
Hocam burdaki yazılımın amacı ne, tam anlamadım açıkçası.. Anladığım kadarıyla 5V luk referansta 10 bit ölçüp 2 MSB bitini sallıyor.. Kalan 8 LSB biti de PORTB ye atıyor ilk yazılım.. Yani adc aslında 10 bit ölçüm yaptığı halde 5V referansta 1,25 V a kadar doğru ölçüyor, 2,5V a kadar 1,25V eksiğini, 3,75V a kadar 2,5V eksiğini, 5V a kadar da 3.75V eksiğini gösteriyor PORTB de..

Hocam alttaki satırda kanal no RA1(AN1) olarak kullanılmış.. Kalın yazılı komutlarda.. KANALNO registeri seçeceğiniz kanalın 2 katı olmalı.. Mesela 3 nolu kanal için 6 girilmeli o registere..

10 bit okuduğu halde 8 bit LSB bitini portb ye atıyor..

Gelen bilgiler aslında 2 registerde veriliyor.. ADRESH ve ADRESL.. Bu programa göre adcon0, 2MSB bitini ADRESH'ta kalan düşük değerlikli 8 biti de ADRESL de veriyor ve programda SONUCBYTE daima sıfır olduğu için sadece ADRESL satırını PORTB ye atıyor.. Altı çizili komutlar işleniyor yani..

Yorumlamana hayranım. :)
 

Forum istatistikleri

Konular
114,775
Mesajlar
807,899
Kullanıcılar
419,991
Son üye
Bybeykozlu

Yeni konular

Üst