Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

ADC Hatası

Başlatan yusufburak, 10 Kasım 2012, 10:44:46

yusufburak

Arkadaşlar merhaba.
flyback converter yapcam ve anahtarlama devresinde ise 16F877A kullancam.
Kodları aşağıdaki gibi yazdım ancak ADC işlemini yapmıyo :S simülasyonda ise süre ile ilgili hata veriyo.
Bi bakar mısınız nerde hata yapmış olabilirim? kaç gündür göremedim hiç bişey :S

list P=16F877A
include <P16F877A.inc>

ORG 0X00
GOTO BASLA
ORG 0X04
GOTO KESME
SAYAC EQU 0X21
SAYAC1 EQU 0X22
SAYAC2 EQU 0X23


KESME:
RETFIE

GECİKME:
MOVLW 0XFF
MOVWF SAYAC
MOVWF SAYAC1
MOVLW 0X1F
MOVWF SAYAC2
MOVLW 0X00
DON:
DECFSZ SAYAC,1
DECFSZ SAYAC1,1
ADDLW 1
SUBLW SAYAC2
BTFSS STATUS,2
GOTO DON
RETURN

BASLA:
BANKSEL TRISA
MOVLW 0X3F
MOVWF TRISA  ;A PORTU GİRİŞ SEÇİLDİ
MOVLW 0x00
MOVWF PIE1
MOVLW 0X4F
MOVWF PR2    ;PR2 KAYDEDİCİSİNE 19 DEĞERİ ATANDI
MOVLW 0X42
MOVWF ADCON1  ;ADRESH ADRESL VE CLOCK SEÇİMİ YAPILDI
MOVLW 0X00
MOVWF INTCON  ;KESMELER PASİF EDİLDİ
BCF TRISC,2   ;C PORTU 2. BİTİ ÇIKIŞ
BANKSEL PORTC
CLRF PORTC
MOVLW 0XC1
MOVWF ADCON0  ;ADC AKTİF EDİLDİ
MOVLW 0X0C
MOVWF CCP1CON  ;PWM MODU AYARLANDI
MOVLW 0X04
MOVWF T2CON   ;TIMER2 AKTİF EDİLDİ
GOTO DONGU


DONGU:
BSF ADCON0,2 ;ADC ÇEVRİMİ BAŞLADI
CALL GECİKME
DEVAM:
BTFSC ADCON0,2 ; DÖNÜŞÜM BİTTİ Mİ ?
GOTO DEVAM
MOVLW ADRESH
BANKSEL CCPR1L
MOVWF CCPR1L 
GOTO DONGU


END
Öğretici aranıyor :)

Tagli

ADC işleminin yapılmadığını nereden biliyorsun? Belki PWM modülüyle ilgili bir sorun vardır. Ayarladığın frekansta 10 bit PWM çıkışı vermen mümkün mü?

"Acquisition Time" beklemesi yapılmamış. Bunun kanal seçimiyle dönüşüm işleminin başlanması arasında yapılması gerekir. Koddaki GECİKME ne kadarlık bir bekleme yapıyor? Dönüşüm başlattıktan sonra kullanımı gereksiz. Dönüşümü başlatmadan önce 20 us kadar bekleme yap.
Gökçe Tağlıoğlu

yusufburak

PWM çıkışımı 8 bit yapmayı düşünüyorum zaten.
watch'tan ADRESH'ı kontrol ediyorum ve dönüşüm bittiği zaman bile  bu registerda bi değişim oluşmuyor.Ve dediğiniz gibi dönüşüm başlamadan önce bi gecikme yaptım ve yine olmadı :S sıfırdan kod yazcam muhtemelen.
Öğretici aranıyor :)

Tagli

PWM çözünürlüğünü sormamın nedeni şuydu: 10 bitlik sayının büyük 8 biti CCPR1L'de saklanırken küçük 2 biti ayar register'ında bir yerde oluyor (yerini tam hatırlamıyorum). ADRESH'daki değeri doğrudan CCPR1L'e aktarabilmen için, seçtiğin frekansta 10 bit çözünürlüğün desteklenmesi gerekiyor. Genelde frekans yükseldikçe çözünürlük düşüyor. Bu durumda (mesela 8 bit çözünürlüğü destekleyen bir frekanstayken) ADC'den gelen 63'ten büyük bir değer, PWM'in sürekli 1'de (Yoksa 0 mıydı? Bunu da tam hatırlamıyorum) kalmasına sebep olabilir.

Gerçi PicKit ile debug yapıyor ve ADRESH'yı doğrudan gözlemleyebiliyorsan, sorun muhtemelen yukarıda bahsettiğim şeyle ilgili değil. Ayar değerlerini tekrardan bir kontrol et. Ben şöyle bir bakınca bir hata göremedim ama malum ASM'de hataları gözden kaçırmak çok kolay.

Sorunun donanımsal olma ihtimalini de düşünerek okuma yaptığın bacağa sabit bir gerilim ver. Mesela 5 volt bağla. Bu durumda ADRESH'da 255 civarında birşey görmen gerekecek. Bacağa gerilim gelip gelmediğini önce bir multimetre ile kontrol et.
Gökçe Tağlıoğlu

sadogan

Asm de yazdıgım zamanlar kullandıgım rutin
umarım işinize yarar
ADC_OKU
   BANK1
   MOVLW   B'10000101'        ;portlari analog giris olarak konfigüre etmek için gerekli
      MOVWF   ADCON1         ;bu sekilde ra0 ve ra1 analog giris ve ra3 ise arti referans ucu olur.
AN0_OKU               
   BANK0               ;(makro)
   movlw   B'11000001'      ;A/D enabled (analog cevrim için clock belirlernir
   movwf   ADCON0      ;internal rc osc kullaniliyor RA1 analog girisi bu sekilde seçilir)
   CALL   ADBEKLE
   bsf      ADCON0,GO      ;Start A/D conversion(analog cevrim baslatilir
Wait
   btfsc   ADCON0,GO      ;A/D çevrim bitene kadar bekle
   goto   Wait         ;"go" biti analog cevrim durum bitidir.
   movf   ADRESH,W      ;A/D degeri oku
   movwf   AN0_H         ;A/D yaz
   BANK1               ;(makro)
   movf   ADRESL,W
   BANK0               ;(makro)
   movwf   AN0_L
   RETURN               ;Bye   

ADBEKLE               ;(analog cevrim için gerekli süre)
   MOVLW   D'9'
   MOVWF   SAY1
   DECFSZ   SAY1,F
   GOTO   $-1
   RETURN

yusufburak

Birazdan ev taşicazda :S akşam incelicem ve uygulicam kodları çok sağolun. yine sorarım zaten takılırsam :S :(
Öğretici aranıyor :)