enkoderdan palse kaçırmadan okuma yapma ?

Başlatan bulut_01, 14 Ocak 2019, 00:28:52

bulut_01

iyi aksamlar picproje ailesi enkoder ile bir uygulama yapıyorum takıldıgım bir konu var kullandıgım mcu 18f45k22 enkoder okuma ve yön bilgisini elde ediyorum palse kaçırması oluyor. Devrede rda kesmesi kullandıgım için devamlı rda  kesmesine girdiği için kod timer1 harici girişinden okudugum enkoder bilgisi palse kaçırma olayı oluyor hem timer0 ve rda kesmeleri kullanırken ana döngüdede farklı işler yürüyor palse kaçırmamam için nasıl çözüm bulabilirim ? (not tmr0 ve rda kesmesi kullanılıyor)

#INT_TMR1G
void  TMR1G_isr(void) 
{
set_timer1(65535);
yenia=input(pin_b1);
yenib=input(pin_b5);
yon=yenia ^ eskib;
if(yon==1){
konum++;}
else{
konum--;}
Eskia=Yenia;
Eskib=Yenib;}
YENİLMEZ..

Tagli

Ben burada timer'ın ne iş yaptığını anlayamadım. Sanki her seferinde en uca kurup, gelen ilk pulse ile kesmeye sokuyor gibisin. Bu durumda timer'ın sana bir faydası yok ki zaten.

Yön bilgisi gerekmeseydi, timer'ı 0'dan başlayacak şekilde ayarlardın ve böylece her pulse için kesme gelmesi gerekmezdi.

Ama anladığım kadarıyla sana yön bilgisi de gerekiyor. Bu durumda bir veya iki tane harici kesme kanalı kullanmalısın. Gerçi sonuçta senin yaptığından çok da farklı olmayacak, sadece gereksiz bir şekilde kullandığın timer'ı boşa çıkarmış olacaksın.

İlgili kesmeyi yüksek öncelikli, diğerlerini düşük öncelikli ayarlayarak şansını deneyebilirsin. Ama yine de yüksek frekanslı sinyallerde sorun çıkma ihtimali var. Böyle bir durumda quadrature encoder modülü olan bir işlemci kullanman gerekir.
Gökçe Tağlıoğlu

bulut_01

tagli hocam tşk ederim enkoder hızım 100 hz yüksek hızlı sayılmaz bu dediğim uygulamayı yapan var mcu tarafında quadenkoder modülü yok yazılım tarafı nasıl bilmiyorum o uygulamada bende fikir danışıyorum nasıl palse kaçırmadan yapılabilir diye.
YENİLMEZ..

FeelYourMind

Pulse sayımını pic'in capture özelliği ile hassas bir şekilde yapabilirsiniz.

Tagli

Capture özelliği dışarıdan gelen bir sinyale göre timer değerinin kaydedilmesi mantığına dayanır ve genel olarak pulse süresi ölçümü için kullanılır. Capture modunun encoder okumak için kullanılabileceğini sanmıyorum.
Gökçe Tağlıoğlu

bulut_01

bu işin bir oluru vardır tagli hocam fikirlerinizi dinlemek isterim.
YENİLMEZ..

Tagli

Frekans düşük gözüküyor. Girişlerden birini INTn harici kesme bacaklarından birine bağla. Bu kesmeyi yüksek öncelikli tanımla. Programındaki diğer kesmeler düşük öncelikli olsun. Kesme içinde de senin TMR kesmesi içinde kullandığın mantığı kullanacaksın. Yani kabaca, kesme geldiğinde diğer bacağı da okuyup, önceki durumlarına da bakarak ne yöne döndüğünü anlayacaksın. Ama bu 2x denen mod olur. Daha hassas sonuç alabileceğin 4x modu için, hem A hem de B ucunu kesme bacaklarına bağlaman gerekir.
Gökçe Tağlıoğlu

bulut_01

unsigned int16 olan değişkeni volatile unsigned int16 olarak değiştirip deyicegim belki sonuç değişebilir.
YENİLMEZ..

10f200.h

ccs c kullanıyorsan example klasörü içindeki ex_freqc.c örneğini inceleyebilirsin.

z

Eger bosta iki tane timer/Counterin varsa ve bunlari external clk ile saydirabiliyorsan disarida bir basit bir lojik devre kur. Encoder 1 yone donerken counterlardan birisi, diger yone donerken de digerisi saysin.

Bu durumda senin clk la falan isin olmaz. Iki counter arasindaki fark gercek konum olur.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

RaMu

En güzeli boşa uğraşmayıp encoder modülü olan mcu kullanmak o da 18F serisinde pek yok hatta microchip bu konuda zayıf kalıyor.
Bir stm103 ile çok kolay yaparsın.
Neyse.

Aslında 100Hz ise yapılır yinede işlemciye çok yük oluyor, yapacak bir şey yok.

Sana lazım olan timer kesmesi değil,
timer mantığıyla rda kesmesi olmasaydı dahi pals kaçırırdın.
Sana lazım olan External interrupt RB0 varsa RBO ve RB1 veya PORTB değişimi kesmesi.
Aynen şuan yazdığın kesmedeki kodu bu kesmeler ile yapacaksın ve
varsa diğer kesmelerde 100Hz in izin vereceği
10ms aralığından daha fazla zaman geçirilmeyeceğini
kod yazarken garanti edeceksin.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

MB_77


bulut_01

örnekdeki kodu pek anlamadım beni ugrastıran rda kesmesi onun sebebide havadaki parazitler 433 modülden dolayı. pulse kaçırmamak için farklı yollar denemek lazım fikir danışıyorum sizlere.
YENİLMEZ..

Murat Mert

Donanımsal pinleri kullan hatan hiç olmaz yada daha da azalır.
mert07

OptimusPrime

rda ya 433 modulunun bagli oldugunu bastan soyleyeydinya.  ;D Gecmis olsun. Hicbir rutinini zamaninda servis edemiyorsun. Yapacak birsey yokmus gibi duruyor.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||