Rotary Encoder

Başlatan jaco33, 24 Nisan 2009, 16:55:23

jaco33

merhaba

micro c nin forumundan aldıgım aşağıdaki rotary encoder kodu gayet güzel çalışıyor ama RB0 ve RB1 için set edilmiş.
bunun içinde :
PORTB & 0x03;
kullanılmış.
//////////////////////////////////////////////////////////////////////////////

// Value changes up or down as encoder is turned.
// encoder 2 outputs are PORTB.F1 and PORTB.F0
// logic; if newA == oldB, encoder turned clockwise
// if newA != oldB, encoder turned counterclockwise
// example; (AB) 00 01 11 10 00 01 11 10 00

char value;
char new_encoder;
char last_encoder;

  new_encoder = (PORTB & 0x03);      // keep only 2 bits
  if(new_encoder != last_encoder)      // if encoder has changed
  {
     if(new_encoder.F1 == last_encoder.F0) value++;
     else value--;

     last_encoder = new_encoder;   // save for next time
  }
//////////////////////////////////////////////////////////////////////////////

ben RB4 ve RB5 ile de bir rotary encoder kodu yazmak istiyorum ama bir türlü o bacakları giriş yapamadım.

  new_encoder = (PORTB & 0x03);      // keep only 2 bits
satırında & ifadesi ne işe yarar ve RB4/5 yada RB6/7 uçları için bu satıra kaç yazmam gerekir?

0b11000000 ve 0b00110000 yazdım ve bu ikiside olmadı.

şimdiden teşekkurler.

Tagli

PORTB'deki mevcut değer b'00000011' ile AND'lenerek encoder'ların bağlı olduğu B0 ve B1 bacakları dışındaki bitlerin sıfırlanmaları sağlanmış. Senin yazdığın b'11000000' ifadesi doğru, ancak kodun geriye kalan kısmı, hesaplamaları halen 0. ve 1. bit üzerinde yaptığı için sorun çıkıyor olmalı. PIC C bilmediğim için kesin bir yorum yapamayacağım ama sanırım altta geçen F1 ve F0 değerlerini değiştirmen gerekli, mesela F6 ve F7 olacak şekilde. Veya bu AND'lenmiş sonuçları kaydırma işlemiyle programın geriye kalanıyla uyumlu hale de getirebilirsin. Yapman gereken şey new_encoder değişkenini 6 defa sağa kaydırmak. Ama dikkat et, carry bit içindeki değer diğer taraftan çıkabilir. Kaydırmadan sonra new_encoder = new_encoder & h'03' yazarak geriye kalan kısmın 0 olmasını garantileyebilirsin.
Gökçe Tağlıoğlu

jaco33

çok teşekkür ederim. oh be ne güzel cevap geldi. yanıtını henüz bilmeyip; nasıl gidereceğimi bilmiyor olsam da.

micro c'nin forumunda sabahtan beri advice alıyorum adamın birinden. aradığım bu cevaptan gayrı her gereksiz şeyi söyledi:
"bir sorunu çözmek için adım adım ilerlemelisin" mır mır mır. hııııırrrrrrrr :evil:

tekrar çok teşekkür ederim.

selamlar

jaco33

ŞİMDİ ÇALIŞIYOR(RB4 VE RB5 İÇİN)
// Value changes up or down as encoder is turned.
// encoder 2 outputs are PORTB.F1 and PORTB.F0
// logic; if newA == oldB, encoder turned clockwise
// if newA != oldB, encoder turned counterclockwise
// example; (AB) 00 01 11 10 00 01 11 10 00

char value;
char new_encoder;
char last_encoder;

new_encoder = (PORTB & 0b00110000); // keep only 2 bits
if(new_encoder != last_encoder) // if encoder has changed
{
if(new_encoder.F5 == last_encoder.F4) value++;
else value--;

last_encoder = new_encoder; // save for next time
}

sayın Tagli,
sizi abim olarak ilan ediyorum.

saygılar

jaco33

merhaba,
aşagıdaki devreyi yapıyorum ama 3 ay sonra rotary encoder'ler sagırlaşmaya algılamamaya başlıyorlar.

devrede 4 adet rotary encoder var.

ilk taktıgımda çok güzel çalışıyorlar ama bir süre sonra çevirirken her palsı yakalayamıyorlar.

rotary encoderler arasına bir kondansatör mü atmalıyım yoksa? kaç nano olmalı?

internette yardımcı olacak bir kaynak da bulamadım.

rotary encoder'leri daha önce kullanmış uzmanların yardımını istirham ederim.

arslan74

Merhaba,

Microchip'in sitesinde rotary encoder ile yapılmış örnek uygulamalar var onları incele.

Daha hassas birşeyler istiyorsan Motor control özellikli PICleri kullan onların doğrudan rotary encoder okuma bacağı özelliği var.


Selamlar

jaco33

teşekkürler.

bir link tasaydınız sevinirdim. site çok karışık ve elimde de sadece 16f628 var.

jaco33

2 resim buldum. galiba direnç degerlerini arttırmalıyım.



arslan74

Merhaba,

Aşağıdaki pdf iyice oku bu devreyi yap.

http://ww1.microchip.com/downloads/en/AppNotes/00718a.pdf

Selamlar

jaco33

74HC74 bağla diyo pdf.

direnç mi kondansatör mü derken hadise nereye geldi.

neyse. vakit ayırıp cevap verdiğiniz için teşekkürler.

bu haliyle ne yapalım. 3 ayda bir sağırlaştırdıkça degiştircez artık.

z

Muhtemelen kullandığın enkoderlar mekanik kontaklı tipten.
Bir süre sonra kontaklarda pislenme, metal kusması, temassızlık gibi sorunlar çıkar.

Buda encoderın yalan yanlış çalışmasına neden olur.

Sağırlaşma dediğin olayın sebebi budur.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

jaco33

teşekkürler yanıtınız için abi diyeceğim size.

evet mekanik kontaklı.

abi şimdi bu encoderler 3 ayda sağırlaşıyosa...

ototeyplerindekiler niye sağırlaşmıyo? niye pislenmiyo?
bu yaptıgım 3.tur değişim. 9 ayda...

ürün uydurukda değil. taiwan malı iyi bişey. çin işi değil.

gerçi araştırdım. cts288 diye bi mekanik enkoder var. o çok iyi. ama o da memlekette yok.

devredeki seçimimde bi hata var ama bilemiyorum nerde. o kadar bu işten anlayamıyorum maalesef.

bıktım bu arada 3 ayda bir 3 ayda bir.

satıcı bıkmadı ama :lol:

KAZIMUGUR

x-750 farenin içerisinde var.
Çok kullanırım.3-5 ayda bir tırtlar.Ya aldırmaz ya da çok çevrilmiş gibi sıçrar.
Tabanı ve fırçaları temizleyip azıcık eğip büküyorum.
Duracağı konumu kesinleştirmek için arkasında minik çıkıntılar ve tırnak var.Tırnağıda azıcık gıdıklayıp devam ediyorum.
Optiklerde bu dert yoktu...

jaco33

bendeki aldırmayanı  :)

ama şemadan mı kendinden mi emin olamadıgım için bu foruma yazmıştım.

siz encoder'den diyorsunuz yani. içini açamıyorum ben ama onun.

cevabınız için teşekkürler.

jaco33

o zaman elektroniğin daha yalın yoluna çevireyim benim sorunumu ki bu encoder'la ugraşmamış olanlar da bana yardımcı olabilsin:

şimdi bunun orta bacagı (-)'ye bağlı. düğmesini çevirdikçe 10K dirençler üzerinden (+)alıyor.

bu her bir buluşmada muhakkak bir ark oluyor. bu arkı engellemeli miyim?
yoksa encoderlerin kontakları bu arklamalardan ötürü mü bozuluyor.

ve asıl soru :lol:

nasıl engelleyeceğim? orta bacakla diğer bacaga 1 nano baglasam olur mu?
hangi uçlara ve kaç değerde...