tmr0 ile devir ölçme (soru)

Başlatan burak1000, 31 Temmuz 2008, 13:24:59

burak1000

Alıntı yapılan: "karbal656"
IF PORTB.0=1 THEN 
ON INTERRUPT GOTO KESME
OPTION_REG=%10000101
INTCON=%10100000
TMR0=0
ENDIF
..............
DISABLE
KESME:
SAYI=SAYI+1
INTCON.2=0
IF PORTB.0=1 THEN
INTCON=%00000000
DEGER=SAYI
SAYI=0
ENDIF
RESUME
ENABLE

Buradaki mantık şu portb.0 'a bir sinyal gediğinde TMR0 çalışıyor
ve değişkeni bir artırıyor .devir tamamlanıp ikinci defa sinyal gelince saymayı bitiriyor. DEGER adlı değişkeni okuyarak bir sonuç alabilirsin .
Başarılar.







çok teşekkürler aradığım cevap kesinlikle buydu
diğer fikirler de iyi ama çekilen akım (akım sınırlayıcı olsa bile)dinamo yu etkileyecektir (ve etkiliyor tecrübeler ile sabittir)
fakat ben birinci kesmenin oluşmasını tmr0 sayacını nasıl tetikleyeceğini bir türlü bulamamıştım gerçekten çok teşekkür ediyorum
konu çözümlendi en yakın zamanda proje yii full bir şekilde yayınlayacağım

burak1000

yaa ben bunu yapmaya çalışıyorum sabahtan beri ama hala sonuç vermiyor deger değişkeni sıfır gösteriyor acaba kesme mi yapmıyor ne


bitecek az kaldı:D
yapınca herkeze dağıtacam
baskı devreleri ile beraber



Maxim

meraba ,
neden normal rutin içerisinde " count " komutunu kullanmıyorsunuz ?
çok hızlı ve hassas bir ölçüm gerekmiyor benim anladığım ,

count portx.x ,500 , deger

burak1000

Alıntı yapılan: "maxiboost"meraba ,
neden normal rutin içerisinde " count " komutunu kullanmıyorsunuz ?
çok hızlı ve hassas bir ölçüm gerekmiyor benim anladığım ,

count portx.x ,500 , deger

öncelikle arkadaşıma yardımda bulunduğu için teşekkür ediyorum

ama ben bu fikre kesinlikle katılmıyorum. çünki:

1:
count, komutu bir pinden (belirlenen süre içresinde) kaç kere sinyal geldiğini sayar bizim amacımız ise gelen sinyal sayısını bulmak değil iki sinyal arasındaki zamanı ölçmek yani yaptığımızın tam tersidri bu söylediğin
2:
count, komutunu bir şekilde kullansak bile (düşündüm ama bulamadım) count kendi işlemini bitirene kadar programda duraklama yapar bu yüzden diğer komutlar çalışamaz ve rutin  programımızın rutinliği kalmaz ve program felç olur :D
[/b][/color]

burak1000

Alıntı yapılan: "stlg"Yada kafanı karıstırmayalım ,en kolayı analog girislerden bir tanesini kullan ,pic ile algılayıcı arasıma f/v cevirici yap en basiti LM2907-LM2917
kullanman


aslında f/v çeviricide kullanmak mantıkı
[/size]
:P

Maxim

Alıntı yapılan: "burak1000"
Alıntı yapılan: "maxiboost"meraba ,
neden normal rutin içerisinde " count " komutunu kullanmıyorsunuz ?
çok hızlı ve hassas bir ölçüm gerekmiyor benim anladığım ,

count portx.x ,500 , deger

öncelikle arkadaşıma yardımda bulunduğu için teşekkür ediyorum

ama ben bu fikre kesinlikle katılmıyorum. çünki:

1:
count, komutu bir pinden (belirlenen süre içresinde) kaç kere sinyal geldiğini sayar bizim amacımız ise gelen sinyal sayısını bulmak değil iki sinyal arasındaki zamanı ölçmek yani yaptığımızın tam tersidri bu söylediğin
2:
count, komutunu bir şekilde kullansak bile (düşündüm ama bulamadım) count kendi işlemini bitirene kadar programda duraklama yapar bu yüzden diğer komutlar çalışamaz ve rutin  programımızın rutinliği kalmaz ve program felç olur :D
[/b][/color]

meraba ,
eğer çok hızlı işlem yapılacaksa ki konsept olarak yapmaya çalıştığınız devre 1 saniye veya yarım saniyelik gecikmelerde etkilenecek bir devre değil (bana göre),
dolayısı ile count komutu kullanılarak yarım saniyelik bir gecikme sorun çıkarmaz diye düşünmüştüm ,tabi karar sizin .

count komutu ile devir ölçümü yapılabilir .
ilk mesajınızı okudum ve pervanenin devrini görmek istiyorum yazmışsınız ,eğer daha sonra başka şeyler çıkmadıysa ,count komutu ile

count portx.x ,1000 , deger
deger = (deger / 4) * 10

yazarak veya uygun başka bir formulle pervanenin dakikadaki devri hesaplanır .

yanlız, interrupt veya count komutu kullanılsa bile daha hassas bir ölçüm yakalayabilmek için ,tek mıknatıs yerine 4 tane mıknatıs kullanılması hassasiyeti 4 e katlayacak ve daha detaylı bir ölçüm sunacaktır .

not:genel olarak yapmaya çalıştığınız şey çok güzel bir proje ,
hatta her eve lazım cinsinden.

karbal656

IF PORTB.0=1 THEN 
WHILE PORTB.0=1
WEND
ON INTERRUPT GOTO KESME 
OPTION_REG=%10000101 
INTCON=%10100000 
TMR0=0 
ENDIF 
.............. 
DISABLE 
KESME: 
SAYI=SAYI+1 
INTCON.2=0 
LCDOUT $fe,1, DEC DEGER
PAUSE 10
IF PORTB.0=1 THEN 
INTCON=%00000000 
DEGER=SAYI 
SAYI=0 
ENDIF 
RESUME 
ENABLE

Birde böyle dene proteus'ta çalışıyor .

burak1000

bütün dosyaları paylaşacağımı söylemiştim ancak bir çok aksilikler çıktı ve projeyi yarım bırakmak zorunda kaldım 2 yıl oldu sanırım. bu yazıları okuyunca şaşırdım kendime ne kadar cahilmişim diye hepinize tekrar teşekkür ediyorum ve son olarak moderatorumuzun dediği gibi 4 tane mıknatıs koyma olayı tün problemleri çözüyor.
projemi çok daha gelişmiş bir şekilde yakında tekrar hayata geçirmeyi düşünüyorum eğer bu sefer sonuna gelebilir isem mutlaka paylaşacağım.