Capture Modu Kullanımı

Başlatan devreci22, 24 Mart 2017, 20:06:40

devreci22

Herkeze merhaba öncelikle iyiki varsınız ete hocam
capture kullanımı nı forumda çok örnekler de inceledim ama bir türlü 16f628a kuramadım
10hz bir sinyalim var bu sinyal in low süresini ve hıgh süresini  TMR1 ile us cinsinden okuyup ekrana yazdımak istiyorum ama  bir türlü captur ile TMR1 i kurup okuyamadım bilen arkadaşlar yarım cı olabilirse şimdiden çok teşekkür ediyorum.
http://etepic.com/index.php/topic,1375.msg14295.html#msg14295
programlar ekte

ete

Yükselen kenarı yakalama mantığın doğru. Ancak düşen kenar için hata yapmışsın.
Düşen kenarı yakalamak için ;
CCP1CON.0=0 'şimdi de düşen kenar için capture registerini ayarladık
şeklinde bir komut vermen gerekirken sen bütün registeri sıfırlamışsın CCP1CON=0 vererek. Buda yakalama işlemini iptal ediyor tabiiki.
Sorun bu yalnızca. Biraz dikkat lütfen.
Ete

devreci22

Teşekkür ediyorum hocam
bilginiz ışığında yürümeye devam;
daha dikkat li olmalıyım.

devreci22

Hocam özür dilerim ben kodu değiştirdim ama TMR1 den alıp lcd ye yazamadım sinyalin hıgh ile low sürelerinii ?
nerede hata yapıyorum;
 define OSC 4
    TRISA=0
    TRISB=%00001000   
    PORTA=0
    PORTB=0
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_on              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Koruma kapalı
@ DEVICE pic16F628A, MCLR_OFF             'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak   
CMCON=7

SURE VAR WORD
PERYOT   VAR WORD


SYMBOL FLAG=PIR1.2
SYMBOL KESME=PIE1.2

DEFINE LCD_DREG     PORTB   'LCD Data bacakları hangi porta bağlı
DEFINE LCD_DBIT     4       'LCD data bacakları hangi bitten başlıyor
DEFINE LCD_EREG     PORTB   'LCD    ENABLE bacağı hangi porta bağlı
DEFINE LCD_EBIT     2       'LCD enable bacağı hangi bite bağlı
DEFINE LCD_RWREG    PORTB   'LCD RW Bacağı hangi bite bapğlı
DEFINE LCD_RWBIT    1       'LCD RW Bacağı hangi bit bağlı
DEFINE LCD_RSREG    PORTB   'LCD RS Bacağı hangi bite bağlı
DEFINE LCD_RSBIT    0       'LCD RS bacağı hangi bite bağlı
DEFINE LCD_BITS     4       'LCD 4 BIT MI 8 BIT MI
DEFINE LCD_LINES    2       'LCD KAÇ sıra yazabiliyor
'******************************************************************
PAuse 500

BASLA:
    LCDOUT $FE,$80,"PERYOT:",#Peryot
    LCDOUT $FE,$C0,"SURE  :",#SURE
    'PAUSE 150
    CCP1CON=%00000101  'capture yükselen kenar için ayarlandı
    T1CON=0
    TMR1L=0
    TMR1H=0             'timer değerini sıfırladık
    T1CON=%00000001     'timer1 aktif
    PIR1.2=0              ' CCP1 kesme bayrağını sıfırladık sıfırlanmaz ise yeniden kesme oluşmaz
    While PIR1.2=0:wend   'kesme oluşmadığı sürece bekle
    Peryot.Byte0=TMR1L
    Peryot.Byte1=TMR1H  'ham süre
    CCP1CON.0=0         'şimdi de düşen kenar için capture registerini ayarladık
    PIR1.2=0            ' bayrağı sıfırladık
    While PIR1.2=0:wend 'kesme oluşuncaya kadar bekle
    Sure.Byte0=TMR1L
    Sure.Byte1=TMR1H
    Flag=0
    KESME=0
GOTO BASLA

ete

Programda bir hata göremiyorum. En azından yanlışda olsa bir değer görmen gerekir.
Yanlışda olsa diyorum çünki HIGH sinyali girişte var iken sen ölçmeye başlarsan gerçek değerinden daha küçük bir değer ölçersin. Bu nedenle iki high yakalamalı birinciyi göz ardı etmelisin. Benzer şekilde iki LOW yakalayıp birinciyi göz ardı edebilirsin.

Ayrıca Sinyali nereden (hangi pinden) giriyorsun?

Ete



devreci22


ete

#6
Aşağıdaki programı dene,
@ __config _BODEN_ON & _BOREN_ON & _CP_ON & _PWRTE_ON & _WDT_ON & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT 

define OSC 4
    TRISA=0
    TRISB=%00001000   
    PORTA=0
    PORTB=0
'@ DEVICE pic16F628A                      'işlemci 16F628                               
'@ DEVICE pic16F628A, WDT_on              'Watch Dog timer açık
'@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
'@ DEVICE pic16F628A, PROTECT_OFF         'Kod Koruma kapalı
'@ DEVICE pic16F628A, MCLR_OFF             'MCLR pini kullanılıyor.
'@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak   
CMCON=7

SURE1  VAR WORD
SURE2  VAR WORD
SURE3  VAR WORD
SURE   VAR WORD
PERYOT VAR WORD


SYMBOL FLAG=PIR1.2
SYMBOL KESME=PIE1.2

DEFINE LCD_DREG     PORTB   'LCD Data bacakları hangi porta bağlı
DEFINE LCD_DBIT     4       'LCD data bacakları hangi bitten başlıyor
DEFINE LCD_EREG     PORTB   'LCD    ENABLE bacağı hangi porta bağlı
DEFINE LCD_EBIT     2       'LCD enable bacağı hangi bite bağlı
DEFINE LCD_RWREG    PORTB   'LCD RW Bacağı hangi bite bapğlı
DEFINE LCD_RWBIT    1       'LCD RW Bacağı hangi bit bağlı
DEFINE LCD_RSREG    PORTB   'LCD RS Bacağı hangi bite bağlı
DEFINE LCD_RSBIT    0       'LCD RS bacağı hangi bite bağlı
DEFINE LCD_BITS     4       'LCD 4 BIT MI 8 BIT MI
DEFINE LCD_LINES    2       'LCD KAÇ sıra yazabiliyor
'******************************************************************
PAuse 500

BASLA:
           
      TMR1L=1:TMR1H=0:FLAG=0
      CCP1CON=%00000101:PIR1.0=0:kesme=1
      T1CON=1:CCPR1L=0:CCPR1H=0:FLAG=0
      WHILE FLAG=0:WEND
      peryot.BYTE0=CCPR1L
      peryot.BYTE1=CCPR1H
      SURE1=PERYOT
      FLAG=0   
      CCP1CON=%00000100
      FLAG=0
      WHILE FLAG=0:WEND
      SURE.BYTE0=CCPR1L
      SURE.BYTE1=CCPR1H
      SURE2=SURE
      SURE=SURE2-SURE1 'LOW SÜRESİ 
     
      CCP1CON=%00000101
      FLAG=0
      WHILE FLAG=0:WEND
      peryot.BYTE0=CCPR1L
      peryot.BYTE1=CCPR1H
      SURE3=PERYOT
      PERYOT=SURE3-SURE2  'HIGH SÜRESİ
     
      LCDOUT $FE,$80,"PERYOT:",#Peryot
      LCDOUT $FE,$C0,"SURE  :",#SURE
      T1CON=0
     
      GOTO BASLA

Aşağıdaki linkte kayıtlı microchip dokümanında Tip# 4'ü oku istersen

http://ww1.microchip.com/downloads/en/DeviceDoc/41214a.pdf

Ete


devreci22

Hocam merhaba
Yazdığımız programı denedim low süre sini  ekrana yazmadı.   datashet inceledim yazılan prg da terslik yok duruyor ama bir şeyi görmezden geliyorum ki bir türlü süre değişken mini ekrana verdiremedim ?

ete

#8
İlişikte verdiğim program hem high hemde low süresini ekrana vermektedir.
Bu işlem 3 aşamada yapılıyor. Pek çok kişi neden 3 aşama diye sorabilir.
Öncelikle Yükselen kenarı yakalıyoruz. Ancak sinyal zaten yükselen kenarda ise ölçmeye baştan başlamadığınız için ilk ölçüm yanlış çıkacaktır. Bunu önlemek ve kendimize doğru referans alabilmek için öncelikle yükselen kenardan başlıyoruz. Ardında düşen kenarı yakalıyoruz. Bu ikisinin süre olarak farkı bize LOW süresini veriyor. Daha sonra tekrar yükselen kenarı yakalıyoruz. Bu ikisinin farkıda bize HIGH süresini veriyor. Program bu mantığa göre çalışmaktadır.

Ete

NOT: Programı değiştirdim. Peryot gösterimi ile frekans hesabınıda ekledim. Güzel bir frekansmetre olur bundan.

onurinci

hocam konu benimde ilgimi çekti..
eğer yanlış anlamadıysam  15625hz 64uS eder bunu 32 olarak gördüm..

ete

Program bir peryodun HIGH ve LOW sürelerini ölçüyor.
15625 Hz için peryot 64us dir. %50 duty değeri ile bu 32us+32us=64 us dir ki programda bunu doğru ölçüyor.
Ete

Maxim

Ete usta, programi giriste sinyal yokken calisabilir hale nasil cevirebiliriz?
Su an while wend yuzunden eger sinyal gelmiyorsa bekliyor.

ete

Tabiiki programı yazarken var olan sinyalleri ölçme mantığı üzerine algoritma kurduk.
Sinyali olmayan bir yere bağlandığında program sinyal bekleme yerinde bloke olabilir.
Bunu önlemenin yolu while - wend döngüleri içine birer sayac yerleştirmek olur.
Değişken tanımlama kısmına bir SAYAC VAR WORD tanımlaması ekleyin.
Ilk while wend döngüsüne bu dediğimizi uyarlarsak;
Döngüden önce;
SAYAC=0 ile başlıyoruz. Ardından
WHILE FLAG=0
SAYAC=SAYAC+1
IF SAYAC=30000 THEN SINYAL_YOK
WEND
..
..
..
SINYAL_YOK:
T1CON=0:CCP1CON=0:PIR1.0=0
GOTO BASLA
şeklinde yapılabilir.
Ancak unutmayın, düşük frekanslarda SAYAC=30000 aşılabilecek bir süredir. Yani normal peryot sayarken bu süreyi geçebilir program bu nedenle frekans çalışma aralığına uygun bir değer kullanmanızda yarar var.

Burada temel amaç ölçülecek sinyalin varlığını sorgulamaktır. Sinyal yok ise işlemi yeni baştan yapmak yada başka işler yapmak üzere programı başka yere göndermek gerekir. Aklıma gelen tespit şekli bu. Belirli bir süre içinde sinyal değişmemiş ise sinyal yok demektir.

Ete

Powered by EzPortal