frekans sayıcı soru?

Başlatan okkan_020, 17 Nisan 2014, 11:37:10

okkan_020

ustalarım abilerim merhaba aranıza yeni katıldım pic te çok iyi degilim bi sorum olacak aracıma örnegin 3 bin deviri geçince çıkış veren bi devre yapmaya çalışıyorum COUNT komutuyla kendim yazdım çalıştı fakat tepkime süresi çok yavaş aynı şekilde ete hocamın bi programını biraz sadeleştirerek denedim o da aynı tepkime süresi çok yavaş kalıyo nasıl bi yol izlemeliyim örnek bi program veya fikir verebilecek bişeyler önerirmisiniz şimdiden çok teşekkürler.
denediğim yazılımlar:
@   device  pic16f628A, protect_off
@   device  pic16f628A, INTRC_OSC_NOCLKOUT
@   device  pic16f628A, mclr_on
@   device  pic16f628A, wdt_off
@   DEVICE  pic16F628A, PWRT_OFF
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_BITS 4 
DEFINE LCD_LINES 2
CMCON=7
PORTB=0

okunan_frekans      var     byte
istenen_frekans     var     byte

symbol  role=portb.1
output  role
SYMBOL  FREKANS_UP=PORTA.0
SYMBOL  FREKANS_DOWN=PORTA.1
SYMBOL  KARE_DALGA_GIRISI=PORTA.3
SYMBOL  START=PORTB.0
INPUT   START
LCDOUT  $FE,1,"  HOS GELDINIZ"
LCDOUT  $FE,$C0,"AYARLARI YAPINIZ"
PAUSE   2000
LOW     ROLE 
BASLA:

WHILE   FREKANS_UP=1
ISTENEN_FREKANS=ISTENEN_FREKANS+1
LCDOUT  $FE,$C0,"K.DALGA=",#ISTENEN_FREKANS," Hz"
WHILE   FREKANS_UP=1
WEND
PAUSE   250
WEND

WHILE   FREKANS_DOWN=1
ISTENEN_FREKANS=ISTENEN_FREKANS-1
LCDOUT  $FE,$C0,"K.DALGA=",#ISTENEN_FREKANS," Hz"
WHILE   FREKANS_DOWN=1
WEND
PAUSE   250
WEND
IF  START=1 THEN
GOTO    OLCMEYE_BASLA
ENDIF
GOTO    BASLA
OLCMEYE_BASLA:
COUNT   KARE_DALGA_GIRISI,1000,OKUNAN_FREKANS
PAUSE   10
LCDOUT  $FE,1,"OKUNAN FREKANS"
LCDOUT  $FE,$C0,#OKUNAN_FREKANS," Hz"
IF  OKUNAN_FREKANS=>ISTENEN_FREKANS  THEN
HIGH    ROLE
else
low role
ENDIF
GOTO    OLCMEYE_BASLA   
END
****************************************************
****************************************************
****************************************************
@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_off
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, PROTECT_OFF
@ DEVICE pic16F628, MCLR_ON
@ DEVICE pic16F628, HS_OSC
DEFINE  OSC  10
DEFINE  LCD_DREG     PORTA
DEFINE  LCD_DBIT     0
DEFINE  LCD_RSREG    PORTB
DEFINE  LCD_RSBIT    2
define  LCD_RWREG    PORTB
DEFINE  LCD_RWBIT    1
DEFINE  LCD_EREG     PORTB
DEFINE  LCD_EBIT     0
DEFINE  LCD_BITS     4
DEFINE  LCD_LINES    2
DEFINE LCD_COMMANDUS 4000   
DEFINE LCD_DATAUS    250


TRISA=0
TRISB=%11111000
low PORTB.1
 
'-------------------------------------------------------------------------------
Frekans     var word
FrekansL    var Frekans.byte0
FrekansH    var Frekans.byte1
sure     VAR WORD
sureL    var SURE.Byte0
sureH    var SURE.Byte1

TOPLAM   var  word
sayac    var  word
counter  var  byte
HAS      VAR  BYTE
I        var  byte

X        var  bit
Z        VAR  BIT
ilk      var  bit
SEC      VAR  PORTB.7
lmb      var portb.1
'------------------------------------------------------------------------------- 
  Z=0     
  CMCON=7
  has=0:ilk=0
  lcdout $FE,1
  lcdout "***XXX***"
  lcdout $FE,$C0,"**dene**":pause 100

'******************************* FREKANSMETRE***********************************
START:   
         gosub olc
         gosub binms
        lcdout $FE,1,"FREKANS:",#frekans
        if frekans>=250   then high lmb
        if frekans< 250   then low lmb
         pause 50:goto start         
     
     
         
   
OLC:
   asm
    movlw   0x01
    movwf   _SureL
   movlw   0x03
   movwf   _SureH
delay_0
    btfss  portb,6
    goto   tamamolc
    decfsz   _SureL, f
    goto   $+3
   decfsz   _SureH, f
   goto   Delay_0
   Goto    son 
tamamolc
    call   zaman
    movlw   0x01
    movwf   _SureL
   movlw   0x01
   movwf   _SureH
Delay_1
   decfsz   _SureL, f
   goto   $+2
   decfsz   _SureH, f
   goto   Delay_1
   goto   $+1
    Goto    son 
zaman
    bcf  STATUS,RP0
    bcf  STATUS,RP1
    clrf TMR1L
    clrf TMR1H
    movlw  7     
    movwf  T1CON
    return
    endasm
Binms:
ASM
    movlw   0x20    ;19 idi
   movwf   _SureL   
   movlw   0x80    ;74 idi
   movwf   _SureH   
   movlw   0x06
   movwf   _Counter 
delay_2
    btfsc   portb,6
    goto tamambin
    decfsz   _SureL, f
   goto   delay_2
   decfsz   _SureH, f
   goto   $+2
   decfsz   _Counter, f
   goto   Delay_2
   goto son
tamambin   
    call    zaman
      movlw   0x19    ;19 idi
   movwf   _SureL   
   movlw   0x74    ;74 idi
   movwf   _SureH   
   movlw   0x06
   movwf   _Counter 
Delay_3
   decfsz   _SureL, f
   goto   $+2
   decfsz   _SureH, f
   goto   $+2
   decfsz   _Counter, f
   goto   Delay_3
    Goto son
    endasm
   
Yuzms:
    ASM
    movlw   0x4e       ;4e idi
   movwf   _SureL
   movlw   0xCa       ;c4 idi
   movwf   _SureH   
Delay_4
    btfsc   portb,6
    goto tamamyuz   
   decfsz   _SureL, f
   goto   delay_4
   decfsz   _SureH, f
   goto   $+2 
    goto son
tamamyuz 
    movlw   0x4f       ;4e idi
   movwf   _SureL
   movlw   0xC4       ;c4 idi
   movwf   _SureH
    call   zaman
       
Delay_5
   decfsz   _SureL, f
   goto   $+2
   decfsz   _SureH, f
   goto   Delay_5
   goto   $+1
    Goto    Son
    endasm
   
Onms:
    asm
    movlw   0x86
   movwf   _SureL 
   movlw   0x20   
   movwf   _SureH 
Delay_6
    btfsc   portb,6
    goto   tamamon
   decfsz   _SureL, f
   goto   delay_6
   decfsz   _SureH, f
   goto   $+2
   goto   son
Tamamon
    movlw   0x87
   movwf   _SureL 
   movlw   0x14   
   movwf   _SureH
    call    zaman
Delay_7
   decfsz   _SureL, f
   goto   $+2
   decfsz   _SureH, f
   goto   Delay_7
   goto   $+1
   goto   son
   endasm
Birms:
    ASM
    movlw   0xf2
    movwf   _SureL
   movlw   0x04
   movwf   _SureH
Delay_8
    btfsc   portb,6
    goto    tamambir   
   decfsz   _SureL, f
   goto   delay_8
   decfsz   _SureH, f
   goto   $+2
   goto   son   
tamambir   
    call     zaman
    movlw   0xf2
    movwf   _SureL
   movlw   0x02
   movwf   _SureH
   
Delay_9
   decfsz   _SureL, f
   goto   $+2
   decfsz   _SureH, f
   goto   Delay_9
   goto   $+1
son 
    nop
    movlw  6   
    movwf  T1CON
    movf TMR1L,0
    movwf _FrekansL
    movf TMR1H,0
    movwf _FrekansH
endasm
RETURN
   
      END


bi hatam varsa affola selamlar.

ete

Zaman tutularak yapılan ölçümler sana hep tepkime süresi yavaş olarak gelir.
Frekans iki türlü ölçülebilir. Birincisi 1 sn içinde gelen puls adedi sayılarak yapılır ki bu zaman tutularak yapılan ölçüm örneğidir.
Diğeri ise frekansın peryodu ölçülerek yapılan ölçüm şeklidir.
1000 ms içinde gelen pulsların sayısı direk frekansı verir.
Peryot (HIGH ve LOW sürelerinin uzunluğu)  ölçülmesi yine frekans değerini verebilir çünki Frekans=1/T yani peryottur.
Bunu Hz cinsinden hesaplamak için F=1.000.000/T (us cinsinden) şeklinde hesap yapmak gerekir.
Yada hesap F=1000/T(Ms cinsinden) yapılabilir. Ölçme işlemi için TMR1 sayacı kullanılabilir. Aşağıdaki işlem sırası ile bu süre ölçülebilir.
1. TMR1 sıfırlanır. (TMR1L=0:TMRH=0)
2. Frekans kaynağından önce LOW beklenir ve LOW şekli bitinceye kadar beklenir.
    WHILE GIRIS=0:WEND  'low bitinceye kadar beklendi
    T1CON.0=1  sayac aktif edildi
   WHILE GIRIS=1:WEND  'high süresi aşıldı
   WHILE GIRIS=0:WEND 'Şimdide low süresi aşıldı
   T1CON.0=0 'sayac durduruldu
   PERYOT.Byte0=TMR1L
   PERYOT.Byte1=TMR1H
   Frekans=(10000/PERYOT)*100
    bu şekilde bulunur.
Diğer yöntemde ise TMR1 kesmesi kullanılabilir. Kesme aktif edilir.
İlk kesme saymanın başlangıcını belirler. Burada TMR1 sayacı sıfırlanır
İkinci kesme bize T peryodunu verecektir.
Hesaplama benzer şekilde yapılır.

Ete




okkan_020

yorumun için teşekkürler hocam kafamda bir şeyler canlanıyo ama nereden başlicam bulamadım uğraşiyim biraz teşekkürler

okkan_020

hocam affınıza sığınarak uzun süredir bunu üzerinde çalışıyorum yapamadım şöyle basitce 50 hz de çıkış veren örnek bi program varsa verebilirmisiniz lcd ekranını çekme sınırını kendim ayarlarım

ete

#4
Şu anda seyehatteyim ve bir şey verecek durumda değilim. Hafta sonu döneceğim ancak o zaman verebilirim.

Şimdi aklıma geldi aşağıdaki linkte verdiğim örneği incele işini görebilir.

http://etepic.com/index.php/topic,1692.15.html

Ete

okkan_020

çok teşekkürler hocam siz dönene kadar ben biraz uğraşayım cevabı bildiririm hayırlı yolculuklar

okkan_020

hocam ne yazık ki onunda tepki süresi uzun geliyo galiba bu işi ben çözemiyeceğim

ete

Öyle gözüküyor. İşin esaslarını anlattım. Zaten topu topu 2 metod var. 2. metod , Peryod ölçme işi yani, sana tepki süresi açısından uyuyor. Bunu capture (yakalama) yolu ilede yapabilirsin. Sonuç pek değişmeyecek ama işlemci frekansını epeyce artırarak bu sorunu aşarsın gibi geliyor bana. Yoksa komut gecikmeleri aldığın sonucu hep etkileyecektir.

Ete

Mucit23

#8
Hocam capture modülü ile devir okuması yaptığınız bir çalışmanız oldumu hiç?

Timer ile devir okuyorum. Enkoderim 20 delikli, Dolayısıyla düşük devirlerde sıkıntı yaşıyorum. Ayrıca düşük periyotlarda (örneğin 10ms aralıklarla) okuma yapmak istersem farklı problemler çıkıyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Önceden simulasyon bazında çalışmalarım olmuş idi.
Fiziki olarak sistemi hiç yapmadım.
Prensip basit aslında,
- CCP1 pinini giriş yap
- CCP1CON registerini Capture ve her yükselen kenarda kesme oluşturacak şekilde ayarla
- TMR1 sayacının 1/1 bölücü için ayarla: Sayacı sıfırla
- CCP1 kesmesini aktif et.
- İki kesme aralığında sayılan değeri CCPR1L ve CCPR1H registerlerinden al. Hepsi bu.
Basit bir örneği aşağıda veriyorum. Devri ayarı hesabını eklemedim. Sen delik sayına göre gerekli düzeltmeyi yapman lazım. Yani okunan değeri 20 ye bölmen gerekir.
Tek delik yada sensörlü sistemde  bulunan değer direk kullanılıp önce frekans oradan da devir hesabı yapılmalıdır.

@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_Off              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, HS_OSC 'INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
CMCON=7
define OSC 20
PORTA=0:TRISA=%00000000
PORTB=0:TRISB=%00001000

'T1CON=%00110001   '%0000=1/1 , %0001=1/2  , %0010=1/4  , %0011=1/8
CCP1CON=%00000101

SURE VAR WORD 56
DEVIR VAR WORD 58
SURE_LOW   VAR WORD 60
SURE_HIGH  VAR WORD 62
TEMP  VAR WORD 64
FREQ  VAR WORD 66
SYMBOL BAYRAK=PIR1.2
SYMBOL KESME =PIE1.2

PAuse 500

PIR1.0=0
BASLA: 'devir ölçümü     'Timer1 bölücüsü 1/1 olacak bu hali 2000 ile 500 devir arasını ölçebilir.
        PIR1.0=0
        BAYRAK=0
        KESME=1
        T1CON=%00000001
        While BAYRAK=0:Wend   'YÜKSELEN KENAR YAKALANDI
        TMR1L =8:TMR1H = 0  'timer sıfırlandı ancak komut gecikmesi farkı Low byte kısmına eklendi (8)
        BAYRAK = 0                               
        While BAYRAK=0:Wend   'İKİNCİ YÜKSELEN KENAR YAKALANDI
        BAYRAK=0:T1CON=0         
        SURE.BYTE0=CCPR1L
        SURE.BYTE1=CCPR1H
        Kesme=0
       
      pause 100
      goto basla

Powered by EzPortal