avatar_Bahri Bilir

Pals Sayımını Hassaslaştırmak?

Başlatan Bahri Bilir, 12 Ekim 2015, 11:43:02

Bahri Bilir

Bir projede 10-100 hzlik bir frekansın değerine göre çıkış alınacak bir yazılım yazıyorum.Palsları sayma mantığım 1 saniye boyunca her pals sayılıp bir değişkene ekleniyor.! saniye sonunda palsların eklendiği değişken 2. bir değişkene aktarılıp 1. değişken sıfırlanıyor.Bu şekilde her saniyede güncellenen 2. değişkenimizle frekansı ölçüyoruz.
Ama 50 hz gibi düşük bir frekansı her saniye değil her milisaniyede bir ölçmek gerekiyor.Yani her milisaniye frekansın düşüyor mu yoksa artıyor mu takibini yapabilmemiz gerekiyor.
Bunun için sizce nasıl bir saydırma yöntemi kullanılmalı?
Eğer her milisaniyedeki pals sayısını 1000 çarparsam çok saçma bir değer (1000-0-0-0-1000 gibi) elde edeceğim.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

Hattuşa

#1
usta sanki bir yerde hatamı var yoksa ben mi kavrayamıyorum. zira 50 hz dediğimiz 20mS lik bir peryod siz her mS de ölçerseniz frekansı nasıl hesaplayacaksınız. zira 19 kez ölçüğünüzde 50 hzlik çevrim bitmemiş olacak.
hassas bir ölçüm için bence 1 sn boyunca palsi saydırmak yerine palsin high anını yakalayınca timer1 ile bir sayaç çalıştırıp bir sonraki high anında sayac değerini kontrol ederek hassas bir ölçüm yapabilirsiniz diye düşünüyorum.
açıklama yapacak olursak;
timer1 i (atıyorum) 100 uS a göre ayarlanır. palsin yükselen (veya düşen) kenarında timer1 i aktif edersin ve her timer1 bayrak bitinin set edildiğinde sayac değerini 1 artırırsın ta ki diğer palsi yakalayana kadar, yakaladığında sayac değerini bir değiişkene atıp sayacı sıfırlarsın.

sayac değerinden elde ettiğin değişkeni de 100 le çarparsın frekansı bulursun.
atıyorum. iki int0 kesmesi arasında elde ettiğin sayac değerini sure değerine attın bu değer de 200 çıktı,
200 *100(timer1 in kesme süresi) =20,000uS  oda 20mS yani 50 Hz yapar.
daha hassas için timer1 in süresi ile oynayabilirsin.

Bahri Bilir

#2
Pro-TR Öneriniz için teşekkürler.Palslar arası süreyi saymak çok mantıklı.Ben önerdiğiniz yönteme biraz kafa yorup similasyonda biraz uğraşayım.

Birde şu yol takıldı kafama;
Her mili saniyede pals giriş pini kontrol edilip son 1000 adet kontrollerden high olanların sayısını alsak ve en son alınan pals bilgisini ekleyip 1000. pals bilgisini çıkarsak ne kadar hassas bir bilgi edilebilir? Veya bunu basit bir picle yapmak mümkün mü?

Bu yöntem eğer sağlanabilirse değerdeki düşüşlerin ve çıkışların keskinliği ortadan kaldırılmış ve saniye bazında orantılı bir veri elde edilebilir.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ete

Bazı şeyleri atlıyorsunuz yine kestirmeden gitme merakı ortaya çıkmış anlaşılan. Frekans nedir? F=1/T dir. Burada T peryotdur. Peryot ise bir kare dalga sinyalin HIGH ile LOW sürelerinin toplamıdır. O halde yalnızca high sayısını alıp frekans adına bir yere varamazsınız.
Yukarıdaki formül bize frekansın peryot hesaplayarak da bulunabileceğini gösteriyor. Hassas bir şekilde ölçülecek ise PORTB.0 kesmesi kullan. Önce sinyalin yükselen kenarında kesme oluştur. Bu kesmede TMR1 sayacını sıfırla ve kesmeyi düşen kenara çevir. ikinci kesme oluştuğunda TMR1 değerini al bir başka değişkene eşitle. Bu senin HIGH süren olacaktır. Kesmeyi yeniden yükselen kenara çevir ve TMR1'i sıfırlayıp kesmeden ayrıl. Yeniden kesme oluştuğunda TMR1 değerini alıp bir değişkene eşitle. Bu senin LOW süren olacaktır. Bu iki süreyi toplarsan mikro_sn cinsinden Peryodu bulursun. Bunu 1000'e bölersen ms cinsinden peryodu bulursun. Onuda 1000 e bölersen frekansı HZ cinsinden bulmuş olursun. Bu işlemlerde TMR1 sayacı 1/1 bölme oranı ile çalışmalıdır.
İşlemci frekansı 4 Mhz olmalıdır.

Ete


Bahri Bilir

#4
ETE hocam dediğiniz mantığı anlamaya çalıştım anlayamadım :). Ve sonra dediklerinizi bir bir uyguladım ama işin mantığını çözemeyince en ufak bir eksikte hiç bir şey yapamıyoruz.

Sonra kendimce ve pro-TR önerisine uyarak palsın yükselen kenarları arasındaki süreyi baz alarak bir ölçüm yapmaya çalıştım.Bir yere kadar ilerledim ama elde edilen high pals arası süre frekans değeriyle ters orantılı.
Bundan dolayı mantık yürüterek eğer iki pals arası süre 100 ms ise 1 sn yi bu değer bölerek frekansa ulaşırım mantığını kurdum.Ve deneme yöntemiyle bu değerleri tutturmaya çalıştım.
Ve tutturdum da.Ama orantı frekans düştükçe veya yükseldikçe bozuluyor.Örneğin 50 hzde doğru gösteriyor ama 60 hz olursa 63 hz gösteriyor,20 hz olursa 28 gösteriyor ???


@ __config _HS_OSC & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF


PortA=0
PortB=0
TrisA=%00000000
TrisB=%00000001
'—————————————————————–
DEFINE LCD_DREG PORTB 'LCD  data bacakları hangi porta baglı?
DEFINE LCD_DBIT 4 'LCD data  bacakları hangi bitten baslıyor?
DEFINE LCD_EREG PORTB 'LCD  Enable Bacagı Hangi Porta baglı?
DEFINE LCD_EBIT 3 'LCD  Enable Bacagı Hangi bite baglı ?
define LCD RWREG PORTB 'LCD  R/W Bacagı Hangi Porta baglı?
define LCD_RWBIT 2 'LCD R/W  Bacagı Hangi bite baglı ?
DEFINE LCD_RSREG PORTB 'LCD  RS Bacagı Hangi Porta baglı ?
DEFINE LCD_RSBIT 1 'LCD RS  bacagı Hangi Bite baglı ?
DEFINE LCD_BITS 4 'LCD 4 bit  mi yoksa 8 bit olarak baglı?
DEFINE LCD_LINES 2 'LCD Kaç  sıra yazabiliyor

'————————————————————————-
ON INTERRUPT GoTo TMR  'kesme oluşursa TMR adlı etikete git.
OPTION_REG=%10001000 'Pull  up dirençleri İPTAL- Bölme oranı 1/1.

OPTION_REG.6=1 'olur ise RB0 da yükselen kenarda kesme oluşur.


INTCON.7=1 'Tüm  Kesmeler aktif ve RB0/INT kesmesi aktif

INTCON.5=1  'TMR kesmesi aktif

INTCON.4=1  'RB0/INT kesmesi aktif
TMR0=0
CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
'—————————————————————————-
SAYAC VAR word
SN VAR word

SY VAR word
SD VAR word

Veri VAR word
V VAR word
'—————————————————————–

SYMBOL TUS=PORTB.0
SYMBOL LED=PORTA.0
'—————————————————————————–

LCDOUT $FE,1
LOW PORTB.2
pause 200
'****************************************************

BASLA:


goto basla




DISABLE
TMR:

     if  INTCON.2=1 then
        SN=SN+1
        SAYAC=SAYAC+1 'kesme sayacı 1 sn= 61(sayac) x 256 (Tmr0) x 64  (bölme)
        IF SAYAC=256 then '61 adet  kesme olunca 1 sn. süre geçiyor.(999424 us)
        SAYAC=0 'sayaç sıfırlanıyor
        endif
        INTCON.2=0 'TMR0 Kesme bayragı sıfırlanıyor 
     endif
     

     if INTCON.1=1 then
       
        if OPTION_REG.6=1 then
        veri=3360/sn
        LCDOUT $FE,$84,"Pals: ",dec3 veri
        SY=SN
        SN=0
        endif

        INTCON.1=0 'RB0/INT Bayragı (flag) silindi.
     endif


RESUME
ENABLE
end

İsis Ve Kod Dosyaları Ekte;
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ete

#5
Anlattığım yöntem ile yaptıkların örtüşmüyor. Yanlış yoldasın yine.

Bir kare dalgayı gözünde canlandır.
        _________                 ________ 
____|                |________|
1     2                3              4

1 Noktasında Yalnızca RB0 kesmesini yükselen kenar için açıp programı başlatıyoruz.
2 noktasında ilk yükselen kenar kesmesi oluşuyor. Hemen ALCAK=TMR1 , OPTION_REG.6=0 , TMR1=0 ve T1CON=1 şeklinde TMR1 sayacını aktive ediyoruz bölme oranı 1/1 ve kesmede düşen kenar için ayarlanıyor.  Burada frekans hesabı yapmak gerek ama bunu daha sonraki adımda yapacağız.
3 noktasında düşen kenar kesmesi oluşuyor. YUKSEK=TMR1 diyoruz ve OPTION_REG.6=1 diyerek kesmeyi yükselen kenara çeviriyoruz
   Ardından TMR1=0 deyip çıkıyoruz kesmeden
4 Noktasında yükselen kenar kesmesi oluşuyor. ALCAK=TMR1 diyoruz (Bu eşitliği lowbyte ve high byte ayrı eşitleyerek yapmak gerek.)
   OPTION_REG.6=0 TMR1=0 . Burada gerekirse tamam=1 diyerek hesabın hazır olduğunu da ana programa söyleyebiliriz. Kesmeden çıkıyoruz.
Şimdi Ana programa bakalım,
BASLA:
IF Tamam=1 then
   Frekans=1000/((Alcak/1000)+(Yuksek/1000))
   Tamam=0
   Buraya Ekrana frekans değerini yazdırma eklenebilir.
Endif
Goto BASLA
şeklinde frekansı hesaplamak mümkün olacaktır. Gerek TMR1 değerini başka değişkene eşitleme ve gerekse TMR1 değerini sıfırlama konusunda usule uygun davranılması gerekir. ALCAK.Byte0=TMR1L ve ALCAK.Byte1=TMR1H şeklinde eşitlenmeli ve TMR1L=0 TMR1H=0 şeklinde sıfırlanmalıdır.

Gördüğün gibi Kesme olarak yalnızca RB0 kesmesi kullandık. TMR kesmesi hiç kullanmadık gerek yok çünki.
Bu yöntem ile maksimum T=(65+65=)130 ms olan (7 Hz) sinyallerin frekansı ölçülebilir. Daha düşükleri ölçmek mümkün değil gözüküyor.
Belki bölücüleri devreye alarak daha düşük sinyalleride ölçmek mümkün olabilir.

Ete


Bahri Bilir

#6
Alıntı yapılan: ete - 13 Ekim 2015, 08:33:45
T1CON=1 şeklinde TMR1 sayacını aktive ediyoruz bölme oranı 1/1 ve kesmede düşen kenar için ayarlanıyor.  Burada frekans hesabı yapmak gerek ama bunu daha sonraki adımda yapacağız.

Ete



Hocam bu kısmı yine anlayamadım.Timer sayacı T1CON ile değilde INTCON.5=1 aktif edilmiyormuydu.Birde mesajınızın sonunda sadece b0 kesmesini kullandık timer kullanmadık demişsiniz.Timer kullanmadan ben sizin mesajlarınızda kullandığınız TMR1 değişkenini nerede saydırmam gerekiyor?
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

Bahri Bilir

Hocam kusura bakmayın galiba gine atladım...
Ne demek istediğinizi anladım ben hala timer0 kesmesindeyim.Oysa siz tmr1 kesmesi kullanmamı söylüyorsunuz.Hemden deniyorum.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

Bahri Bilir

picmulticalc programında timer helper kısmının "İnterpurt/Frekans" bölümüne kaç yazmalıyım?
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ete

Çok merak ediyorum bu son soruyu neden sordun acaba?
Sen yine anlamamışsın. Daha ne kadar açık yazabilirimki? Daha açığı programı yazmam olurdu herhalde.
Bu sistemde TMR1 sayacını zaman saymak için kullanacağız. Yükselen kenarda timer sıfırlanacak düşen kenarda timer değeri alınıp bir başka değişkene verilecek. Çünki 4Mhz frekansda o timer her bir sayımı 1us ye ye tekabül eder. Dolayısıyla Sinyalin HIGH olması ile LOW olması arasında geçen zamanı mikro sn cisninden ancak bu şekilde hassas bir şekilde alabiliriz. Aynı şekilde düşen kenarda kesme yaratıp yine Timer'ı sıfırlarsak sinyalin yükseldiği anda bu seferde LOW süresini aynı timer ile us cinsinden ölçmüş oluruz. Bunu yapıyoruz.
TMR1 için bölme oranımız 1/1 olacak ve bu sayac T1CON.0=1 verilince saymaya başlar.

Ete

Bahri Bilir

Ete hocam önerileriniz için teşekkürler.

16-150 Hz arası frekans ölçebilen her pals girişinde frekans değerini güncelleyen çok hassas olmasa da değişimleri en kısa sürede algılayabileceğiniz bir frekans metre olarak şuanda kod çalışıyor.İhtiyacı olan arkadaşların işini görmesi umuduyla.
Pic:16f628 Harici 4 Mhz Kristal kullanıldı.


@ __config _HS_OSC & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF

PortA=0
PortB=0
TrisA=%00000000
TrisB=%00000001
'—————————————————————–
DEFINE LCD_DREG PORTB 'LCD  data bacakları hangi porta baglı?
DEFINE LCD_DBIT 4 'LCD data  bacakları hangi bitten baslıyor?
DEFINE LCD_EREG PORTB 'LCD  Enable Bacagı Hangi Porta baglı?
DEFINE LCD_EBIT 3 'LCD  Enable Bacagı Hangi bite baglı ?
define LCD RWREG PORTB 'LCD  R/W Bacagı Hangi Porta baglı?
define LCD_RWBIT 2 'LCD R/W  Bacagı Hangi bite baglı ?
DEFINE LCD_RSREG PORTB 'LCD  RS Bacagı Hangi Porta baglı ?
DEFINE LCD_RSBIT 1 'LCD RS  bacagı Hangi Bite baglı ?
DEFINE LCD_BITS 4 'LCD 4 bit  mi yoksa 8 bit olarak baglı?
DEFINE LCD_LINES 2 'LCD Kaç  sıra yazabiliyor

'————————————————————————-
ON INTERRUPT GoTo TMR  'kesme oluşursa TMR adlı etikete git.

OPTION_REG=%11000000  '7.Bit PullUp direçlerini iptal eder.6.bit ise BO yükselen kenarında kesme oluşmasını sağlar.Eğer 0 olsaydı düşen kenarda kesme oluşacaktı.


INTCON.7=1 'Tüm  Kesmeler aktif
INTCON.6=0
INTCON.5=0 'TMR0 Pasif
INTCON.4=1 'RB0/INT kesmesi aktif
INTCON.3=0
INTCON.2=0
INTCON.1=0
INTCON.0=0

T1CON.0 = 1  'TMR1 Aktif

PIE1.0=1           
PIR1.0=0

CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
'—————————————————
SAYAC VAR word
SN VAR word

YUKSEK VAR word
ALCAK VAR word

Veri VAR word
FREKANS VAR word
TAMAM VAR bit
K VAR bit
'——————————————————
SYMBOL TUS=PORTB.0
SYMBOL LED=PORTA.0
'——————————————————
LCDOUT $FE,1
LOW PORTB.2
pause 200
'**************************

BASLA:
     
   if Tamam=1 then
   Frekans=50000/(veri/20)
   LCDOUT $FE,$84,"F : ",dec5 FREKANS
   Tamam=0
   endif
   
   if TMR1=1000 then
   Frekans=0
   LCDOUT $FE,$84,"F : ",dec5 FREKANS
   endif

goto basla




DISABLE
TMR:

if PIR1.0=1 then
PIR1.0=0        'TMR1 Bayrağı Silindi.
endif

if INTCON.1=1 then 
Tamam=1
veri=TMR1
TMR1=0       
INTCON.1=0  'B0 Bayragı silindi.
endif

RESUME
ENABLE
end
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ete

Fazlalıklar var. PIE1=1 lüzumsuz bu kesmeyi kullanmıyoruzki neden aktif ediyorsun. Intcon.6 low olduğu sürece sen aktif etsende çalışmayacak nasıl olsa.

Kesme kısmında PIR1 bayrağınıda test etmen gerekmiyor. Zaten test edip bir şeyde yapmamışsın. Oraya direk PIR1=0 yazsan daha iyi olurdu. Aslında PIR1 in set edilmiş olması frekansın peryotdu oluşturan low yada high konumlardan birinin süresinin 65 ms ned fazla olduğunu gösteriyor.
Bu durumda bir ikaz verdirilebilir.

Ete

Bahri Bilir

#12
Ete hocamızın önerileri üzerine programın son hali;

@ __config _HS_OSC & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF

PortA=0
PortB=0
TrisA=%00000000
TrisB=%00000001
'—————————————————————–
DEFINE LCD_DREG PORTB 'LCD  data bacakları hangi porta baglı?
DEFINE LCD_DBIT 4 'LCD data  bacakları hangi bitten baslıyor?
DEFINE LCD_EREG PORTB 'LCD  Enable Bacagı Hangi Porta baglı?
DEFINE LCD_EBIT 3 'LCD  Enable Bacagı Hangi bite baglı ?
define LCD RWREG PORTB 'LCD  R/W Bacagı Hangi Porta baglı?
define LCD_RWBIT 2 'LCD R/W  Bacagı Hangi bite baglı ?
DEFINE LCD_RSREG PORTB 'LCD  RS Bacagı Hangi Porta baglı ?
DEFINE LCD_RSBIT 1 'LCD RS  bacagı Hangi Bite baglı ?
DEFINE LCD_BITS 4 'LCD 4 bit  mi yoksa 8 bit olarak baglı?
DEFINE LCD_LINES 2 'LCD Kaç  sıra yazabiliyor

'————————————————————————-
ON INTERRUPT GoTo TMR  'kesme oluşursa TMR adlı etikete git.

OPTION_REG=%11000000  '7.Bit PullUp direçlerini iptal eder.6.bit ise BO yükselen kenarında kesme oluşmasını sağlar.Eğer 0 olsaydı düşen kenarda kesme oluşacaktı.


INTCON.7=1 'Tüm  Kesmeler aktif
INTCON.6=0
INTCON.5=0 'TMR0 Pasif
INTCON.4=1 'RB0/INT kesmesi aktif
INTCON.3=0
INTCON.2=0
INTCON.1=0
INTCON.0=0

T1CON.0 = 1  'TMR1 Aktif

CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
'—————————————————
Veri VAR word
FREKANS VAR word
TAMAM VAR bit
'——————————————————
LCDOUT $FE,1
LOW PORTB.2
pause 200
'**************************

BASLA:
     
   if Tamam=1 then
   Frekans=50000/(veri/20)
   LCDOUT $FE,$84,"F : ",dec5 FREKANS
   Tamam=0
   endif
   
   if TMR1=1000 then
   Frekans=0
   LCDOUT $FE,$84,"F : ",dec5 FREKANS
   endif

goto basla




DISABLE
TMR:
if INTCON.1=1 then 
Tamam=1
veri=TMR1
TMR1=0       
INTCON.1=0  'B0 Bayragı silindi.
endif

RESUME
ENABLE
end
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ete

#13
Yine olmadı. Söylemiştim. Tmr1 16 bltlik blr sayac ama 8 blt bazinda kullanilabilir. Tmr1=0 diyemezsin. Yerlne Tmr1L=0:Tmr1H=0 demen gerekir.
Ayrıca Veri=Tmr1 de diyemezsin. Veri.byte0=Tmr1L ve Veri.Byte1=Tmr1H demen gerekiyor.
İşin prensibini bir kaç kez anlattım ama hala tutarlı bir program ortaya koyamadığını görüyorum.
İşin temelinde gelen kare dalga sinyalin önce HIGH süresini daha sonrada LOW süresini us cinsinden ölçmek ve low sürsi ölçüldükten sonra iki veriyi toplayıp 1000'e bölmek gerekirdi. Sonrada buradan F=1000ms/T(ms) formülünden frekansı hz olarak hesaplamak gerekirdi. Kafan bir türlü bu sisteme yatmadı anlaşılan.
Kesme kısmının nasıl olması gerektiğini buraya son kez yazıyorum. Buna bakarak geri kalanı tamamlarsın umarım.

DISABLE
TMR:
IF OPTION_REG.6=1 THEN
  OPTION_REG.6=0
  TALCAK.BYTE0=TMR1L:TALCAK.BYTE1=TMR1H
  GOTO CIK
ENDIF
OPTION_REG.6=1
  TYUKSEK.BYTE0=TMR1L:TYUKSEK.BYTE1=TMR1H 
  Tamam=1
 
CIK:
    TMR1L=0:TMR1H=0
    INTCON.1=0  'B0 Bayragı silindi.
    RESUME
    ENABLE

Programın başında OPTION_REG.6=1 ile açılmalı. Böylece ilk kesme yükselen kenar için oluşturulmalıdır.
Ana program kısmında ;
IF TAMAM=1 then
  Veri=(TALCAK+TYUKSEK)/1000  'değerleri us den ms ye çeviriyoruz.
  Frekans=1000/Veri
şeklinde frekans hesabı yapılabilir. Senin kullandığın formülde anlamsız neye göre düzenledin bilemiyorum.

Ete

Bahri Bilir

#14
Hocam daha öncede söylediğim gibi eğer yazılan kodun mantığını anlayamamışsak sizin gönderdiğiniz yönergeleri uygulamak haricinde yapabileceğimiz hiçbirşey kalmıyor.
Yani sizin dediklerinizi anlayabildiğim kadar bir bir uyguluyorum.Sonra programı deniyorum çalışmıyor.İşte bu noktada "hocam yaptım çalışmadı" demekten başka yapabileceğim hiç bir şey kalmıyor.Ki siz elinizden geldiğince açık anlattığınızı söylediniz.Çok zorlamamak lazım diye düşünmüştüm.
Hocam madem anlatma konusunda bu kadar sabırlısınız bende anlayacağım Allah'ın izniyle :).


@ __config _HS_OSC & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF

PortA=0
PortB=0
TrisA=%00000000
TrisB=%00000001
'—————————————————————–
DEFINE LCD_DREG PORTB 'LCD  data bacakları hangi porta baglı?
DEFINE LCD_DBIT 4 'LCD data  bacakları hangi bitten baslıyor?
DEFINE LCD_EREG PORTB 'LCD  Enable Bacagı Hangi Porta baglı?
DEFINE LCD_EBIT 3 'LCD  Enable Bacagı Hangi bite baglı ?
define LCD RWREG PORTB 'LCD  R/W Bacagı Hangi Porta baglı?
define LCD_RWBIT 2 'LCD R/W  Bacagı Hangi bite baglı ?
DEFINE LCD_RSREG PORTB 'LCD  RS Bacagı Hangi Porta baglı ?
DEFINE LCD_RSBIT 1 'LCD RS  bacagı Hangi Bite baglı ?
DEFINE LCD_BITS 4 'LCD 4 bit  mi yoksa 8 bit olarak baglı?
DEFINE LCD_LINES 2 'LCD Kaç  sıra yazabiliyor

'————————————————————————-
ON INTERRUPT GoTo TMR  'kesme oluşursa TMR adlı etikete git.

OPTION_REG=%11000000  '7.Bit PullUp direçlerini iptal eder.6.bit ise BO yükselen kenarında kesme oluşmasını sağlar.Eğer 0 olsaydı düşen kenarda kesme oluşacaktı.


INTCON.7=1 'Tüm  Kesmeler aktif
INTCON.6=0
INTCON.5=0 'TMR0 Pasif
INTCON.4=1 'RB0/INT kesmesi aktif
INTCON.3=0
INTCON.2=0
INTCON.1=0
INTCON.0=0

T1CON.0 = 1  'TMR1 Aktif

CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
'—————————————————
Veri VAR word
TALCAK VAR word
TYUKSEK VAR word
FREKANS VAR word
TAMAM VAR bit
'——————————————————
SYMBOL TUS=PORTB.0
SYMBOL LED=PORTA.0
'——————————————————
LCDOUT $FE,1
LOW PORTB.2
pause 200
'**************************

BASLA:
     
IF TAMAM=1 then
   Veri=(TALCAK+TYUKSEK)/1000  'değerleri us den ms ye çeviriyoruz.
   Frekans=1000/Veri
   LCDOUT $FE,$84,"F : ",dec5 FREKANS
   Tamam=0
endif
   
   if TMR1=1000 then
   Frekans=0
   LCDOUT $FE,$84,"F : ",dec5 FREKANS
   endif

goto basla




DISABLE
TMR:
IF OPTION_REG.6=1 THEN
  OPTION_REG.6=0
  TALCAK.BYTE0=TMR1L:TALCAK.BYTE1=TMR1H
  GOTO CIK
ENDIF
OPTION_REG.6=1
  TYUKSEK.BYTE0=TMR1L:TYUKSEK.BYTE1=TMR1H 
  Tamam=1
 
CIK:
    TMR1L=0:TMR1H=0
    INTCON.1=0  'B0 Bayragı silindi.
    RESUME
    ENABLE
end


Hocam bu şekilde düzenledim.Ama ölçüm stabil değil.Yani 56 hz yi çok net ölçüyorken,63 hz de 62 ve 66 hz değeri arasında zıplayıp duruyor.Ve hz 100 de yine 100 ile 111 arası zıplıyor.Birde 100 ün üzerindeki hz değerlerinde daha yüksek değerler veriyor.
Galiba yine anlamadığım bir nokta var.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

Powered by EzPortal