avatar_inventor

TMR1 deki veriyi almak

Başlatan inventor, 27 Aralık 2012, 13:29:39

inventor

Bir proje için TMR1 kullanmam gerekiyor. Dil olarak proton kullanıldı. Portb.0 kesmesi oluşunca TMR1 saymaya başlıyor ve ikinci kesme oluştuğunda duruyor. Daha sonra TMR1 deki sayılan değerin alınması gerekiyor. PBP için ;

SURE.Byte0=TMR1L
SURE.Byte1=TMR1H
       TMR1L=0
       TMR1H=0

komutları yeterli olmalı diye düşünüyorum.
Proton için;

Dim TIMER1  As TMR1L.Word

SURE=TIMER1
TIMER1=0

Yeterli olmalıydı ya da ben öyle düşündüm.

Sorun şu;  Her iki şekilde de yazdığımda TMR1 1059 dan daha fazla saymıyor. Amacımız iki kesme arasındaki zamanı hesaplamak. Osilatör 4 MHz. Portb.0 daki sinyalimiz 4000 Hz. Portb.0 da her 4 mS de bir kesme oluşuyor. Biz sinyali 1000 Hz e indirsekte TMR1 yine aynı değere kadar sayıyor.

Sorun hakkında görüşleriniz nedir?
Selam
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

Mucit23

Yerinizde olsaydım 20Mhz de çalışırdım. 4000 hz hatrı sayılır bir rakam. Program içerisindeki en ufak bir gecikme RB0 kesmesini sekteye uğratabilir. 4Mhz de RB0 için 1Khz bile yüksek bir rakam olabilir.

Bence İlk önce Timer0  ve RB0 kesmesini kurun. Her RB0 kesmesinde bir değişkeni değerini arttırın. Timer 0 kesmesiylede 1 sn aralıklarla Rb0 kesmesiyle arttırılan değişkenin değerini okuyun. Ardından RB0 clock frekansının değerini arttırın ve güvenli olarak en fazla 1 sn içerisinde kaç defa RB0 kesmesi oluştuğunu bulun.

4Mhz için Saniyede 4000 tane RB0 kesmesi oluşabileceğini sanmıyorum. Dediğim gibi Belki işlemci yetişemiyordur. Sen RB0 kesmesine 1Khz uygulasan bile ancak saniyede 500 kesme oluşuyordur. Sorunun bu olacağını düşünüyorum.


Simülasyonda watch window aracılığıyla bunu çok güzel takip edersin.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

inventor

Sanırım haklısınız. RB0 yetişemiyor. Frekansı çok düşürürsem (50 Hz )  sayma işlemi gerçekleşiyor.
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

ete

4Khz lik bir sinyalin peryodunu hesaplamak için için bir sürü kod yazmak gerekir. Sinyali incelersen peryodu 250us dir. Birde ortadan ikiye bölünecek her 125us de bir kesme olması anlamına gelir bu. Yazdığın kodların gecikmesi neredeyse bu kadar tutar. Bu nedenle 4 Mhzde çalışmak akıllıca olmayacak anlaşılan.
Ya frekansı artıracaksın yada daha kısa komut olarak Pulsin kullanacaksın. Frekans 4000Hz dolayında ise sorun çıkarmaz diye tahmin ediyorum.
Bu işi devir ölçmek için yaptığını biliyorum. Direk devir pulslarını saydırmayı denesen olmazmı?

Ete

inventor

Sonuçta devir ölçme işlemini bir kaç şekilde yapabiliyoruz. Bu sistem sadece devir ölçmeyecek, bu devire göre bazı PWM işlemleri de yapacak.
Bu nedenle en kararlı ve sağlıklı yöntem ne ise onu kullanmak istiyorum. Daha önce yüksek hız devir ölçümü veya yüksek frekans sayımı gibi bir uygulamam olmamıştı. Bu ilk olacak. O nedenle en iyi yöntem ne ise onu yapmak istiyorum.

min. frekans 1850 Hz
max. frekans 4000 hz
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

Mucit23

Hocam benim en çok kullandığım en iyi sonuç aldığım yöntem şudur.

Motor dan gelen pals ları timer1 in harici clock girişine ver. Timer1 otomatikmen saysın. Sen Timer0 kesmesini kurup 1 sn aralıklarla timer1 değerini al. Ardından timer1 değerini sıfırlayıp çık. Aldığın değer direk saniyedeki motor devridir zaten. 
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

umiter

#6
Kısaca Ön Bilgi;

Timer1 modülü 16-bit zamanlayıcı / okunabilir ve yazılabilir iki adet 8-bitlik yazmaç (TMR1H ve TMR1L) oluşan sayacıdır. TMR1 kayıt çifti (TMR1H: TMR1L) 0000h den FFFFh artışlarla ve 0000h yanına alır. TMR1 kesme, etkinleştirilmişse, kesme bayrak biti, TMR1IF (PIR1) olarak kilitlenmiş olduğundan taşma oluşturulur. Bu kesme etkin / ayar / TMR1 kesme bit TMR1IE (PIE1) etkinleştirmek temizleyerek devre dışı bırakılabilir.

Timer1 iki moddan birinde çalışabilir:

• Bir Timer olarak
• Sayaç olarak

Işletim modu saati seçme biti, TMR1CS (T1CON) tarafından belirlenir. Timer modunda, Timer1 artışlarla her komut döngüsü. Harici saat girişi her yükselen kenarında Sayaç modunda, artışlarla.

Temelde TMR1 bir 2 bit ön-ölçekler, ve 16bit kayıt harici saati artırmak için konfigüre edilebilir veya dahili FOSC (OSC / 4).


Örnek bir kod aşağıda:
#DİKKAT! Proton+ Basic Kodudur.

Device = 16F877
Xtal = 4

Dim mikroSny as Word
Dim miliSny as Word
Dim Sny as Word

Symbol GIE = INTCON.7
Symbol TMR1_Val = 64536
Symbol TMR1_mikroSny = 1
Symbol Timer1 = TMR1L.WORD
Symbol TMR1_Enable = PIE1.0
Symbol TMR1_Overflow = PIR1.0
Symbol TMR1_On = T1CON.0 
ON_INTERRUPT Int_Sub

Goto Basla

Int_Sub:

GIE = 0

If TMR1_Overflow = 1 And TMR1_Enable = 1 Then
TMR1_Enable = 0
Timer1 = Timer1 + TMR1_Val
TMR1_Enable = 1
TMR1_Overflow = 0
mikroSny = mikroSny + TMR1_mikroSny
If mikroSny >= 1000 Then
mikroSny = mikroSny - 1000
Sny = Sny + 1
EndIf
EndIf

GIE = 1

Context Restore

Basla:

TMR1_Enable = 0

INTCON.6 = 1 
T1CON.1 = 0
T1CON.4 = 0

TMR1_Enable = 1
TMR1_On = 1
GIE = 1


Govde:

Repeat 
Until Sny = 60
Sny = 0
Goto Govde

#KODUN Sonu

Ekte TMR1 hesaplamasında kullanılan küçük bir program var, umarım işine yarar.

Bilgi elde edilmesi zor,  tüketilmesi kolay bir bulamaçtır.

inventor

Alıntı yapılan: ete - 27 Aralık 2012, 15:46:29
Bu işi devir ölçmek için yaptığını biliyorum. Direk devir pulslarını saydırmayı denesen olmazmı?

Ete

Alıntı yapılan: Mucit23 - 27 Aralık 2012, 16:18:56
Hocam benim en çok kullandığım en iyi sonuç aldığım yöntem şudur.

Motor dan gelen pals ları timer1 in harici clock girişine ver. Timer1 otomatikmen saysın. Sen Timer0 kesmesini kurup 1 sn aralıklarla timer1 değerini al. Ardından timer1 değerini sıfırlayıp çık. Aldığın değer direk saniyedeki motor devridir zaten. 


Haklısınız. TMR1 e puls saydırmak daha mantıklı görünüyor. Yardımlar için teşekkür ederim.
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

Powered by EzPortal