int girişi ve capture

Başlatan F®T, 29 Mayıs 2013, 09:28:45

F®T

Arkadaşlar 18f45k22 ile puls sayiyorum.int0 ve int1 girişini kullaniyorum.
10Khz bir sinyal.fakat programa yapacak zaman kalmiyor.
En uygun cozum veya farkli bir cozum varmi.capture mantigini anlamadigim
icin kullanamadim.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Bu iş için en uygun olanı Gate kontrol'u olan bir Timer kullanarak timer'ı harici girişten tetikleyip pulsları saydırmaktır.
Bu sayede sistem geri planda çalışır sende kendi programınla rahatça uğraşabilirsin.
Kullandığın işlemcinin Data Sheet'ine bakarsan Bölüm 12 de Timer 1/3/5 with Gate Control başlığı altında olay açıklanmış.
Yapılacak iş şöyle,
Timer-1'i dışarıdan tetiklemek üzere ayarlamak. Bunun için  TXCON (T1CON) registerine bakacaksın.
Bit 7-6 CLK kaynağı seçim bitleri oluyor. Bu bitler senin için önemli. BU registerin 3. biti olan TXSOSCEN=0 ise  , 7 ve 6 cı bitlere %10 değerini vererek harici pinden tetikleme sağlayabiliyorsun. TMR1 için harici tetikleme pini PORTB.5 oluyor.
Aynı sistemi TMR3 veya TMR5 sayacı içinde kullanabiliyorsun. Böylece bu işlemci ile harici girişten tetikleme yaparak 2 veya 3 ayrı puls kaynağını saydırabilirsin. TMR3 harici CLK giriş pini, PORTC.0 , TMR5 harici CLK giriş pini, PortB.4 pini olmaktadır.
Biraz uğraş bakalım takılırsan yardımcı olmaya çalışayım.

Ete


F®T

tamam hocam Allah razı olsun.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

F®T

hocam ayarları yaptım txcon ve txgcon bitlerini tanımladım sonra bit ayarlarını yaptım.daha sonra değişkenleri tmrh ve tmrl  değerlerine eşitledim.acaba bu aşamadamı hata yaptım.fakat fazla detaya mı girdim işin içinden çıkamadım.t1gate ile t5gate kullanmaya çalıştım girişler portb.5 ve portb.5 olarak yaptım.
'TXCON AYARLARI İLE TMR giriş ayarları yapıldı

SYMBOL TMR1E=T1CON.0 'TMR1,5 DEVREYE ALAMA ÇIKARMA BİTİ
SYMBOL TMR5E=T5CON.0
SYMBOL TMR1OK=T1CON.1 'TMR1,5 BİT 0 OLURSA TMR 8 BİT 1 OLURSA 16 OKUMA YAZMA YAPAR
SYMBOL TMR5OK=T5CON.1
SYMBOL TMR1SNK=T1CON.2 'TMR1,5 OSC İLE SENKRONMU OLSUN 0 OLMASIN 1
SYMBOL TMR5SNK=T5CON.2
SYMBOL TMR1HRC=T1CON.6 'TMR 1 HARİCİ PULS KAYNAGI YÜKSELEN KENAR   
SYMBOL TMR1EXT=T1CON.7
SYMBOL TMR5HCC=T5CON.6 'TMR 5 HARİCİ PULS KAYNAGI YÜKSELEN KENAR 
SYMBOL TMR5EXX=T5CON.7

'TXGCON BUNUN İLE TMR TETİKLEME GATE AYARLARI OLACAK

SYMBOL T1GATESEC=T1GCON.0 'TMR1 GATE SECİLDİ
SYMBOL T5GATESEC=T5GCON.0 'TMR5 GATE SECİLDİ
SYMBOL T1GATEENB=T1GCON.7 'TMR1 GATE DEVREYE ALIR
SYMBOL T5GATEENB=T5GCON.7 'TMR5 GATE DEVREYE ALIR


TMR1E=1 'TMR1,5 DEVREYE ALAMA ÇIKARMA BİTİ
TMR5E=1
TMR1OK=1 'TMR1,5 BİT 0 OLURSA TMR 8 BİT 1 OLURSA 16 OKUMA YAZMA YAPAR
TMR5OK=1
TMR1SNK=1 'TMR1,5 OSC İLE SENKRONMU OLSUN 0 OLMASIN 1
TMR5SNK=1
TMR1HRC=0 'TMR 1 HARİCİ PULS KAYNAGI YÜKSELEN KENAR   
TMR1EXT=1
TMR5HCC=0 'TMR 5 HARİCİ PULS KAYNAGI YÜKSELEN KENAR 
TMR5EXX=1

'TXGCON BUNUN İLE TMR TETİKLEME GATE AYARLARI OLACAK

T1GATESEC=1 'TMR1 GATE SECİLDİ
T5GATESEC=1 'TMR5 GATE SECİLDİ
T1GATEENB=1 'TMR1 GATE DEVREYE ALIR
T5GATEENB=1 'TMR5 GATE DEVREYE ALIR

TMR1H=0
TMR1L=0
TMR5H=0
TMR5L=0
UZATPULSH =TMR1H
UZATPULSL =TMR1L
KILITPULSH=TMR5H
KILITPULSL=TMR5L
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Lüzumsuz bir sürü detaya girmişsin. Hiç gerek yoktu onlara,
T1CON=%10000110:TMR1L=0:TMR1H=0
T5CON=%10000110:TMR5L=0:TMR5H=0
Bu iki satırı yazdıktan sonra
T1CON.0=1:T5CON.0=1 yazıp sayacları aktif hale getireceksin.
Pause 1000 deyip 1 sn bekleyeceksin.
T1CON.0=0:T5CON.0=0 deyip timerları pasif yapıp
Puls_Bir.Byte0=TMR1L
Puls_Bir.Byte1=TMR1H
Puls_Iki.Byte0=TMR5L
Puls_iki.Byte1=TMR5H
demen yeterli idi.
Elbette ben Pause 1000 dedim işi anlayasın diye.
Onun içinde TMR0 kesmesi ile 1000 ms lik bir süre oluşturup bu esnada sen diğer işlere bakabilirsin. Süre dolunca otomatik program hemen yukarıda Pause 1000 komutundan sonrakileri yaparak puls değerlerini alabilir.

Ete

F®T

Hocam fakat benim puls sayısını sürekli arka planda gözlemem gerekiyor istenen adette puls oluştuğunda sistemin durması için.kesmeye girip çıkana kadar puls sayısı istediğim değeri geçebilir?
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Sana miktar lazım ise ve süre bazında değilde toplam değeri görmek istersen değişkenlerinde bir sınırı olduğunu unutmaman gerekiyor. O işe ne gibi bir çare düşünüyorsun?
Mikta lazımsa o zaman zaman tutmazsın. Yada daha kısa bir zaman tutup sürekli gelen miktarı mevcut miktara eklersin olur biter. Ben aklı verdim ,senin gerisini halletmen gerek artık.

Ete

F®T

#7
Hocam miktar önemli aslında motor harekete geçince encoderden aldığım değerleri sayıcam yaklaşık 20.000 puls max deger.değişken 16 bit kurtarıyor.zaten bu arda sistem set noktasında durucak iş biticek değişkenler sıfırlanacak sonraki adıma kadar.ama sayma açık olacakki istem dışı bir hareket olursa uyarı vericem.sadece değişkenleri sıfırlıcam.hocam söylediklerinizden tmr0 kesmesine gerek olmadığı,sadece saymayı istediğim zaman aktif yapıp değişkeni kontrol edeceğimi anlıyorum.doğrumu acaba.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Timer'ı aktif eder etmez timer sayac olarak çalışmaya başlar ve sürekli artar. Ya bu sayac değerini ekrana veya nereye veriyorsan vereceksin yada dediğim gibi arada bir sayac değerini kendi değişkenine aktarıp onu ekrana vereceksin. Kendi değişkenini kullanırsan kesiklik olur saınırım SÜreklilik istiyorsan TMRxL ve TMRxH değerlerini ekrana ver en iyisi.
Ete

F®T

'------------------------INT MOTOR PULS OKUMA,EKRAN,SETLEME--------------------- 
PULSOKU:
UZATPULS.Byte0=TMR1L
UZATPULS.Byte1=TMR1H
KILITPULS.Byte0=TMR5L
KILITPULS.Byte1=TMR5H
RETURN

PULSSIFIRLA:
UZATPULS.Byte0 =0
TMR1L          =0
UZATPULS.Byte1 =0
TMR1H          =0
KILITPULS.Byte0=0
TMR5L          =0
KILITPULS.Byte1=0
TMR5H          =0
RETURN   

PULSEKRANI:
LCDOUT $FE,$80," MOTOR PULS  SAYISI "
LCDOUT $FE,$C0,"                    "
lcdout $FE,$94,"UZAT MOT PLS:",DEC5 UZATPULS
lcdout $FE,$D4,"KILT MOT PLS:",DEC5 KILITPULS
RETURN


Hocam dediğiniz gibi yaptım fakat b.4 b.5 girişlerine puls veriyorum saymadı.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Gözden kaçan bir şey var demekki.  Bu işlemci ile hiç çalışmadım. Sanırım o pinlerin ek görevleri var. Onların bir şekilde ekarte edilmeleri gerekir. Yarın bakarım yeniden.

Ete

ete

#11
Ferit,
Sanırım CLK giriş pinlerini yanlış belirttim. Pin açıklamalarından bakıp söylemiştim ama sanırım ya yanlış işlemciye baktım yada dalgınlığa geldi. Giriş pinleri , TMR1 için =PORTC.0  (T1CKI) ve TMR5 için =PORTC.2 (T5CKI).

Üşenmedim kısa bir program yazdım. Yazdığım program yalnızca TMR1 ve TMR5 sayaçlarını harici pinden tetiklemeli olarak aktif edip oradan gelen pulsları sayıyor.
Hemen sonuç alayım diye LCD bile bağlamadım. Gayet güzel çalışıyor sistem. Sen neden çalıştıramadın bilemedim. Programın tamamını vermediğin için yorum yapmakda mümkün olmuyor. Çünki o pinleri etkileyen bir sürü sigorta ayarı olduğu gibi register ayarıda mevcut. Hepsini yazdığım programda görebilirsin. 

Sayaçların çalıştığını "Watch Window" dan izledim. Progamı simulasyonda çalıştırınca Watch Wİndow ekrana gelirse mesele yok oradan izleyebilirsin. Ama ,Muhtemelen bu pencere otomatik açılmayacaktır.
Açmak için sırası ile aşağıdakileri yapıver lütfen,

- İsisde programı çalıştır ve Pause butonuna bas.
- Yukarıda yer alan Debug butonuna tıkla
- Aşağıda seçenekler arasında olan "Watch Window" seçeneğine tıkla
- Açılan pencere üzerine git ve sağ tıkla
- Açılan yeni pencerede " Add Items By Name" seçeneği yani en üsttekini seç
- Yeni açılan pencerede sağa kaydırarak TMR1L seçeneğini bul ve üzerine çift sağ tıkla
- AYnı şekilde TMR1H seçeneğini bul ve yine üzerine çift sağ tıkla
- Benzer şekilde TMR5L ve TMR5H seçeneklerinide çift tıklayarak ekrana getir.
Sonra pause butonuna basarak sistemi çalıştır.
Ekranda her bir timer'giriş pinine bağlı bir CLK kaynağı göreceksin. TMR1 , 1000Hz lik kaynakla sayıyor, TMR5 ise 10 Hz lik kaynakla saymaktadır. Her birini bir Jumper ile pine bağladım. Gerekirse jumperı açıp clk gelişini engelleyebiliyorsun.
Böylece sistemin çalıştığını oradan görebilirsin.

Ete

Not: LCD li versiyonunuda ekledim.

Bu işlemci kaç paradır ve nerede satılıyor? Bir işde kullanmak istiyorum. DIP kılıf olarak bulunuyormu?

F®T

Hocam Allah razı olsun çok emeğiniz geçiyor.Hakkınızı helal edin.programları indirip deniyorum.Teşekkür ediyorum.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

F®T

hocam programları denedim.şuanda tam istediğim gibi çalışıyor.elinize sağlık.

dip not: benim laptopumun simülasyonda cpu su %100 lere çıkıyor.bundan dolayıda takılma oluyor.ayrıca değişik durumlarda yanıltıcı bir durum oluşturuyor.programda farklı sorunlar var gibi algılama oluyor.

Hocam,motorlar pwm modülü tarafından kontrollü çalışıcak.çalışırken aynı anda puls girişleri ve  3 adet adc de çalışıyor olacak.hocam bu senaryoda bir aksilik olma şansı varmı.tecrübelerinize dayanarak fikriniz nedir.sıkıntılı bir durum olacaksa yolun başında iken farklı bir şeyler düşünmem lazım.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Sayma işlemi tamamen geri planda yapılıyor. Ana programı etkilemez. Ancak ekrana verme işlemini sen yapmalısın.
Tek gecikme yaratacak kısmı bu ki oda bir şey tutmaz diye düşünüyorum. Bence sakınca yok gözüküyor.

Benim makinada takılma falan olmadan epeyce hızlı bir şekilde sayabilmetedir.

Ete

Powered by EzPortal