PBP Mouse Tekerleği Nasıl Adapte Edilir ??

Başlatan imcek, 28 Ekim 2007, 11:47:26

imcek

Selam arkadaşlar.mouse'larda tepede bulunan tekerleği pbp da değer arttırıp azaltma işinde kullanmak istersek bunu nasıl yapabiliriz.Bu tekerlek ileri ve geri ayrı olarak pals üretmektedir.Palsların hızı ise tekerleği çevirme hızımıza bağlı.Bu konuda yardımcı olurmusunuz.Teşk

ete

Madem bu soruyu sordun işin zahmetinede biraz katlanıver istersen.
Maus'u sök ve bu tekerleğin kontak uçlarını kontrol et. Kaç kontak ucu var.
Normal olarak 3 adet kontak ucu olması gerek. Bu bize muhtemelen bu aletin rotary encoder mantığı ile çalıştığını gösterir.

Genelde ucun bir tanesi ortak uçtur. Bu 3 adet uca A- B - C isimlerini verir isek. C ucu ortak uç olmalıdır. Ortak uç, sen tekeri her çevirdiğinde A ile birleşen sonra B ile birleşen uçtur. Bunu deneyerek bulabilirsin.
Sistem şöyle çalışır;
- A ve B uçları işlemciden Pull-Up olacaktır.
- C ucu ise GND ye bağlanacaktır.
Bu şekilde yapılan bağlantıda tekeri ileri çevirdiğinde A ve B uçları aşağıda değerleri sırası ile üretmesi gerekir.
1 1
1 0
0 0
0 1
1 1
..
Geriye çevirdiğinde ise bu sırayı altan başa doğru üretir. Yani
1 1
0 1
0 0
1 1
..
İleri ve geri dönüş arasındaki yön tayini İki farklı okuma arasındaki A biti ile B bitinin XOR yapılması ile bulunur.
İlk listeye bakarsan 1. sıradaki 11 bitlerinde A biti=1 dir. İkinci sırada ise B biti=0 dır. 1 XOR 0 = 0 olduğundan Yön=0 dır.
Şimdi ikinci listeye bakalım.
A=1 ve B=1 olduğundan 1 XOR 1=1 olup Yön=1 olarak bulunur.
Yön=1 ise SAYAC=SAYAC+1
Yön=0 ise SAYAC=SAYAC-1 yapılır (yada tam tersi olabilir)
Bu şekilde işi çözmüş olursunuz.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

imcek

Hallettim ETE sağol senin söylediklerinde mantıklı

Ben şöyle bir program yazdım:Verdiğin bilgiler için teşekkürler.Çok teşekkür ederim

 
DEFINE  LCD_DREG    PORTB
DEFINE  LCD_DBIT    4
DEFINE  LCD_RSREG   PORTB
DEFINE  LCD_RSBIT   2
DEFINE  LCD_EREG    PORTB
DEFINE  LCD_EBIT    3
DEFINE  LCD_LINES   2

'lcd tanimlamalari yapildi

sayi         var     byte

clear       
        
        TRISB=%00000000
        TRISA=%01101
        
        symbol   Y=PORTA.2
        SYMBOL   K=PORTA.3
        SYMBOL   BASLA=PORTA.0  

        CMCON=7
        
        
        
        
        while basla=0 
        if y=0 and K=0 then bak
        if y=1 and k=1 then bak2 
        devam:
        lcdout $fe,2,"SAYIMIZ:",dec3 sayi
          
        wend
 
   bak: 
       while Y=0 and K=0
       wend
       if Y=0 then 
       sayi=sayi+1
       else 
       sayi=sayi-1
       endif
       goto devam
   bak2: 
       while Y=1 and K=1
       wend
       if Y=1 then 
       sayi=sayi+1
       else 
       sayi=sayi-1
       endif
       goto devam                 
              
        
        END 
        
        
        

ete

Programında bazı hatalar var. Nasıl hallettin bilemiyorum ama söylemeden geçemiyeceğim.

1. hata; Basla diye bir tus yada anahtar tanımlamışsın ve o tuşa basılırsa sistem encoderi görüp sayma yapıyor. Tusa basılmış ise BAK etiketinden önceki bölüm işletiliyor ve gerekenler yapılıyor. Peki basılmaz ise ne olacak.
Proram bu kısmı atlayacak elbette ve BAK etiketine gelecek.
Dolayısıyla basla tusuna basmış olsanda olmasanda program zaten bak ve bak2 ye gelecek demektir bu. Bana göre yanlış. Tusa basılmadı ise programı bak etiketinden önce tekrar başa yönlendirmen gerekmezmi?. Yoksa başka bir düşüncenmi varda ben anlamadım?. Program, basla tusuna basılmadan BAK ve BAK2 etiketlerini sırası ile icra edecek ve Y ve K nın durumlarına göre sayacını saydıracak ve Goto devam komutu ile devam etiketine gidecek. Peki bu etiket nerede ortada görülmüyor. Sanırım programı ayıklayarak buraya koydun. Her neyse kendi bileceğin iş.
2. Hata encoder i saydırmak için yalnızca 11 ve 00 konumlarını esas almışssın. Daha doğrusu bu konumları atlatıp sonrasında gelen 01 ve 10 konumlarında sayı saydırıyorsun. Bu demek oluyorki 11 ve 00 konumlarında sayıcın çalışmıyor.  Buda pals atlıyorsun anlamına geliyor. Bilerek yaptı isen sözüm yok tercih meselesidir. Ancak bilmeden yaptı ise ikaz etmek isterim.

3. hata While Y=0 and K=0 : wend satırları programını kitler. Başka iş yaptırmaz. Halbuki buraları kontrol edip geçmen ve başka işlere devam edebilmen lazım. Dİyelimki tekeri 00 konumunda yada 11 konumunda bıraktın. Ne olacak. Program bu konumları geçinceye kadar bekleyecektir. Bu bir nevi kilitlenme demektir.

Encoder in iki girişini okumak için bir sürü if kullanman gerekmez.
Giris=PORTA & %01100
Giris=Giris>>2
dedinmi elinde giriş değerleri hazırdır.
Giriş 0 ise Y ve K,  00 dır.
Giriş 1 ise Y=0 K=1 dir
Giriş 2 ise Y=1 K=0 dır
Giriş 3 ise Y=1 ve K=1 dir.

Örnek kod veriyorum dene istersen;
X=0
Eski=(PortA & %01100)>>2
Tekrar:

Yeni=(PortA & %01100)>>2
If Yeni=eski then
   x=x+1
   if X=100 then RETURN (Programın en başına dön çünki encoder durmuş)
   Goto tekrar
   endif
Yon=Eski.0  ^ Yeni.1
If Yon=1 then
  SAYAC=SAYAC+1
  ELSE
  SAYAC=SAYAC-1
ENDIF
RETURN  'en başa dön.

Gördüğün gibi encoderin durup durmadığı 100 defa kontrol ediliyor ve durmuş ise iş yapmadan başa dönülüyor diğer işlere devam edebilmek için.

Ete




Kolay Gelsin
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

imcek

Bazı eksiklerim var.Ancak sayarken hız haricinde bir anormallik yok.yani yavaş ve hızlı çevirme ile sayıların aynı oranda hızlanması gerekti.o konuda sıkıntım var.Bizleri dinlediğin ve cevap verdiğin için teşekkürler.

imcek

Verdiğin kodları denedim Ancak çalıştıramadım.giriş yaptığımız bir portu kaydırmak yada mantıksal işlemlere tabi tutmak mümkünmü?kodları
aynen aldım sadece 0 dan 255 e geçiyo ve tekrar 255 ten 0 a geçiyor.Tekrar deneyeceğim sağolasın

ete

Yapılacak tek iş,
Üst üste okuma yapıp iki okumada Y veya K nın değiştiğini tespit etmek ve sonra birinci okumanın Y si ile ikinci okumanın K sını XOR yapmak.
Normalde kodun çalışması gerek. Ancak bu kodu anlayasınız diye yazdım. Denemedim. Ancak mantığı önceden denedim ve kullanıyorum.
Ben şöyle yaparım.

ESKI=PORTA & %01100
TEKRAR:
YENI=PORTA & %01100
IF YENI=ESKI THEN
   X=X+1
   IF X=100 THEN RETURN
   GOTO TEKRAR
ENDIF
ESKI=ESKI>>2
ESKI=ESKI & %00001 'ilk biti almış olduk
YENI=YENI>>3           'ikinci biti ilk bit haline getirdik
YON=(ESKI) ^ (YENI)  
IF YON=1 then
   SAYI=SAYI+1
   ELSE
   SAYI=SAYI-1
ENDIF
RETURN

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

imcek

Benim takıldığım nokta şu.Portları sola veya sağa doğru kaydırıyoruz.Ancak şöyle bir durum var.Benim devrede a portuna diğer elemanlar bağlı.Kaydırma işlemi yapınca portun diğer bölümlerine bağlı olan elemanlar bundan etkilenir mi?

Yani Portu kaydırma işlemini sanal olarak mı gerçekleştiriyor.Yada çıkış veya giriş olan portlarda   bu işlem  nasıl gerçekleşiyor?.Teşekkürler Saol

ete

Portu değil porttan aldığımız bilgiyi bir değişkene (ESKI ve YENI) yerleştirip değişken değerlerini kaydırıyoruz. Port bundan hiç bir şekilde etkilenmez.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

imcek

Yine ben.Abi problemi bir türlü bulamıyorum.Bu kodları denedim.Ancak olmuyo.eski ve yeni değerleri nasıl okuyo pic onu anlayamadım.komut saykılı çok düşükken eski ve yeni dediğimiz iki değişken nasıl farklı değere sahip olabilirler.Varsayalım ki ben encoderi çok yavaş çeviriyorum. komutlar alt alta verilmiş ve ikisi nasıl farklı değerler alabiliyorlar.İşimi ezbere yapmak istemiyorum ama işin mantığıda çıkmıyor.Epeydir uğraşıyorum.Peki verdiğin kodda giriş olarak hangi 2 portu kullanıyoruz porta.2 ve porta.3 mü ben öyle yaptım ve ortak ucuda +5v a bağladım.Bu ayrıntıları daha açık yazarsanız kavrama zamanımız kısalır.Yardımlarınızı bekliyorum.

imcek  :?:  :?: