Rotary Pot'ta sadece yön bilgisini okuma

Başlatan blueboard, 28 Eylül 2022, 14:58:55

blueboard

Ete Hocam, uzunca bir süredir Rotary pottan sadece yön bilgisini okumaya çalışıyorum. Ancak bugüne kadar maalesef sonucunu getirip programda başarılı olamadım. Sizin konu ile ilgili açıklamalarınızı bıkıp usanmadan defalarca tekrar tekrar okudum. Değişik kaynakları da araştırdım. Ortaya bir şeyler çıkarmaya çalıştım. Ancak eksiklik ve hatalarımın olduğunu düşünüyorum. Ekteki dosyada Rotary potun fotolarını ekledim. Potta aynı zamanda bas çek anahtar var. Bu kısım önemli değil. Benim için zorluk potun ne tarafa döndüğünü tespit edebilmek ve dönüş yönüne göre mikrodenetleyiciye işlem yaptırabilmek. Açıklamalarınız doğrultusunda XOR işlemini uygulamaya, kesme oluşturmaya çalıştım ama dosyayı derleyemedim. Bu konuda yardımınızı rica ediyorum. Yazdığım kodları kontrol ederek hatalarımı gidermeme yardımcı olur musunuz.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                              *
'*  Date    :                                                  *
'*  Version :                                                  *
'*  Notes  :                                                  *
'*          :                                                  *
'****************************************************************
define osc 4
PORTA=%00000000 
portb=%00000011
TRISB=%00000011  '
TRISA=%00000000  '
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_OFF                  'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON                'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF          'Kod Koruma kapalı
@ DEVICE pic16F628A, MCLR_off                'MCLR pini kullanılmıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
CMCON=7

ESKI= var byte
YENI= var byte
YON=var bIT
TEMP  VAR BYTE
bayrak=0  

OPTION_REG=%01000000  'Yükselen kenarda INT oluştur

INTCON=%10010000

ON INTERRUPT GOTO KES

PAUSE 200
 
BASLA:
disable
ESKI=PORTB & %00000011  
  IF YENI=ESKI THEN BASLA
    Gosub tekrar

TEKRAR:
YON=ESKI.1 XOR  YENI.0  ' birinin  1.biti ile diğerinin 0.biti XOR yapılır.
IF YON=1 THEN GOSUB LED1
  IF YON=0 THEN GOSUB LED2 
    endif
    
INTCON.1=0  'komutu ile kesme bayrağı sıfırlanır.
RESUME
ENABLE  
goto basla
END
 
                      
      
LED1:
PORTA.2=1
PAUSE 1000
PORTA.2=0
RETURN

LED2:
PORTA.3=1
PAUSE 1000
PORTA.3=0
RETURN


ete

#1
Rotary POT dedğin şey aslında Rotary ENCODER.
Bu elemanın bir bağlantı şekli var öncelikle onu halletmen gerekiyor.
Pot benzeri 3 bacak görülüyor resimde. Kullanacağın bacaklar bunlar.
Ortadaki bacak direk GND ye bağlanacak. He riki uçta yer alan bacaklar ise 10K direnç ile +5V ta bağlanıp Pullup yapılmış olacak. Bu iki bacak aynı zamanda işlemciye girecek ve Kesme ile okumak istersen PORTB değişiklik kesmesi kullanman gerekecek.

POT'u çevirdiğin zaman iki tık aralığında bu encoder aşağıdaki çıkışları verir. Sağ ve soldaki çıkışlara A ve B dersek,
Şayet saat yönünde çevriliyor ise A ve B çıkışları sırası ile %11 - %10 - %00 - %01 - %11
Saat yönünün tersinde çevriliyor ise %11 - %01 - %00 - %10 - %11  şeklinde çıkış verecektir.

Bu encoderin dönüş yönünü bulmak için öncelikle bir başlangıç okuması yapılır. Buna ilk diyelim.
Okunan değer ILK=%00 olsun
Hemen ardından ikinci bir okuma daha yapılır bunda SON diyelim .
Şayet okun SON değeri %01 şeklinde okunmuş ise encoder saat yönünde, %10 şeklinde okunmuş ise Saatin tersi yönde dönüyor şeklinde yön bilgisi oluşturulacaktır.
Genelde bu işi yapmanın yolu ILK=%XY  ve SON=%WZ şeklinde ise YON=X XOR Z şeklinde belirlenir.
Çıkan YON bilgisi 0 ise tersi yönde 1 ise saat yönünde anlamına gelecektir. Zira,
YON= %0 XOR %1=1  veya YON=%0 XOR %0=0 (iki bit bir birinin aynısı ise sonuç sıfır farklı ise sonuç 1 dir.)
Bir şey daha ekleyeyim. İlk okunan değer ile son okunan bir birinin aynısı ise encoder dönmüyordur ve belkide bunuda ayrıca değerlendirmek gerekebilecektir.

Umarım anlaşılmıştır. Ayrıca aşağıdaki linke de baksan fena olmaz.

https://etepic.com/index.php/topic,1967.0.html

Bu arada simulasyonda bu elemana en yakın malzeme MOTOR-ENCODER isimli malzemedir. Bir motora bağlı encoder gibi düşünülebilir. Çevirmek için motora röleler yardımı ile düz ve ters yönde voltaj verilerek motorun dolayısıyla encoderin dönmesi sağlanır.

Ete

blueboard

#2
Ete hocam, öncelikle açıklamalarınız için teşekkür ederim. Simulasyon dosyasında encoder bağlantısında ortadaki bacağı direkt şaseye, yandaki bacakları da 10 k direnç ile pull up olacak şekilde bağlamıştım. Sizin verdiğiniz kodlardan esinlenerek programda rb0 kesmesi kullanmaya çalışmıştım. Rb0 kesme kodlarımda sorun var mı? Yön bulma konusundaki açıklamalarınıza göre kodda yön bulma konusunu tekrar ele alacağım. Saygılarımla.

ete

RB0 kesmesi tek bir pine bakar. Halbuki yön tayini için iki pine birden bakmalısın bu nedenle kesme olarak PORTB değişiklik kesmesi uygundur. RB0 kesmesi değil.

Ete

blueboard

Ete Hocam, kodları kesmeye göre tekrar düzenledim. Hatalarım var mı? Uyarılarınızı bekliyorum.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    :                                                   *
'*  Version :                                                   *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
define osc 4
PORTA=%00000000 
portb=%00110000
TRISB=%00110000  'DEĞİŞİKLİK KESMESİ UYGULANACAĞI İÇİN ENCODER UÇLARI BB4 VE B5'E BAĞLANACAK.
TRISA=%00000000   '
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_OFF              	'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON             	'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF          'Kod Koruma kapalı
@ DEVICE pic16F628A, MCLR_off           	 'MCLR pini kullanılmıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
CMCON=7

ESKI= var byte
YENI= var byte
YON=var bIT
TEMP   VAR BYTE
bayrak=0   

INTCON=%10001000
ON INTERRUPT GOTO TEKRAR'KESME OLUŞUNCA TEKRAR ADLI ETİKETE  GİDİLECEK
PAUSE 200
 
BASLA:

ESKI=PORTB & %00110000  
YENI=PORTB & %00110000
  IF YENI=ESKI THEN BASLA
     Gosub tekrar
DISABLE  ' DEĞİŞİKLİK KESMESİ İÇİN GEREKLİ
TEKRAR:
TEMP=PORTB
YON=ESKI.4 XOR  YENI.5  ' birinin  4.biti ile diğerinin 5.biti XOR yapılır.
IF YON=1 THEN GOSUB LED1
  IF YON=0 THEN GOSUB LED2 
    endif
 INTCON.0=0 'KESME BAYRAĞINI SIFIRLADIK
RESUME
ENABLE    
   
goto basla
END
 
                      
      
LED1:
PORTA.2=1
PAUSE 1000
PORTA.2=0
RETURN

LED2:
PORTA.3=1
PAUSE 1000
PORTA.3=0
RETURN


ete

Bu programda doğru bir şey yok. Neler oluyor. ????
Hiçmi dersleri okumadın? Bu konuda yani değişiklik kesmesi konusunda ders notları var. Okuman gerek.
Ayrıca Basic de değişken nasıl tanımlanır bilmiyorsun öğrenmen gerek.
Kesme özel bir alt programdır. İşlemci bu alt programa kesme şartı yerine geldiği zaman gider. Program içinde kesme alt programına GOSUB yada GOTO ile gidilmez!!!!!.

Ufak bir düzeltme gerekse yapardım ama neredeyse tüm program değişmesi gerekiyor.

Ete

blueboard

#6
Ete hocam, inanın hatalarım bilerek yaptığım bir şey değil. Sizin bir önceki mesajınızda değişiklik kesmesi gerektiğini yazmıştınız. Hemen kesmeler adlı dersinizi açtım ve değişiklik kesmesi yapmaya çalıştım. Şu an benim asıl sorunum rotary encoder'in dönüş yönünü belirlemede hatamın nerede olduğunu bilmememden kaynaklanıyor. Burada konuyu bilen sizin gibi bir ustadan yardım istiyorum. Siz eski konum ile yeni konumu önce okumamı, ardından bu iki değişkeni xor ile karşılaştırmam gerektiğini belirtmişyiniz.Ben de bunu yapmaya çalıştım ama acemilik işte. Elimden bu kadar geldi. Kasıtlı yapılmış bir şey yok.

blueboard

#7
Ete Hocam, aşama aşama bana yardımcı olabilir misiniz. Şu an mantığıma göre kesme olmadan yön tayin etmek için kodları düzenledim.Affınıza sığınarak belirtiyorum,  https://etepic.com/index.php/topic,1967.0.html linkindeki Rotary Encoder okuma dersinizde ilk mesajınızda ilişikteki dosyadan söz ediyorsunuz. Ancak ilişikte dosya yok. Dosya olsaydı dosyayı da inceler belki sizi bu kadar yormazdım.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    :                                                   *
'*  Version :                                                   *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
define osc 4
PORTA=%00000000 
portb=%00110000
TRISB=%00110000  'ENCODER UÇLARI B4 VE B5'E BAĞLANACAK.
TRISA=%00000000   '
'-----------------------------------------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628                                
@ DEVICE pic16F628A, WDT_OFF              	'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON             	'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF          'Kod Koruma kapalı
@ DEVICE pic16F628A, MCLR_off           	 'MCLR pini kullanılmıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
CMCON=7    'dahili pull up iptal

ESKI= var byte
YENI= var byte
YON=var byte
 

PAUSE 300
 
BASLA:

ESKI=PORTB & %00110000  
YENI=PORTB & %00110000
  IF YENI=ESKI THEN BASLA
    else Gosub tekrar
 
TEKRAR:
  
YON=ESKI.4 ^  YENI.5  ' birinin  4.biti ile diğerinin 5.biti XOR yapılır.
IF YON=1 THEN GOSUB LED1
  IF YON=0 THEN GOSUB LED2 
    endif
    return  
   
goto basla
END
 
                      
      
LED1:
PORTA.2=1
PAUSE 1000
PORTA.2=0
RETURN

LED2:
PORTA.3=1
PAUSE 1000
PORTA.3=0
RETURN


ete

Encoder okumanın en hızlı ve doğru yolu aşağıdaki şekilde oluyor.

      
YENI=PORTB & %00110000 
IF YENI=ESKI THEN CIK  'Pot dönmemiş yada dönmüyor ise bir şey yapmadan geri dön
YON=ESKI.5 ^ YENI.4  ' YÖNÜ BELİRLE      
ESKI=YENI 'Bu eşitlik bize bir sonraki okuma için Eski okuma değerini vermiş olacak.
CIK:
'Burada encoder okuma alt programından çıkıyoruz ve çıkarken elimizde YON isimli bilgi net şekilde 1 vya 0 olarak bulunmuş oluyor.
 

Ete

blueboard

Ete hocam, çok teşekkür ederim. Siz olmasanız başarabileceğime inanmıyordum. Sağlığınıza duacıyım.

ete

Dosyaların tamamını vereyim de hiç olmazsa bakarak öğren.
Simulasyon şemasına özellikle dikkat et. Versiyon uyuşmazlığı olursa pdf olarak da verdim şemayı aynısını kurmaya çalış ve dene bence.

Ete

elektro77

#11
Bu konu ile bende daha önce ilgilenmiştim.
Hocam ekteki encoder okuma devresinde ekranda sadece 4 değişik değer görebiliyorum. Bunun sebebi nedir?
aşağıdaki açıklamanıza göre 5 değişik değer görmeli değil miyim?
"A ve B çıkışları sırası ile
Saat yönünde çevriliyor ise              = %11 - %10 - %00 - %01 - %11
Saat yönünün tersinde çevriliyor ise= %11 - %01 - %00 - %10 - %11 
şeklinde çıkış verecektir."
Bir de benim devremdeki encoder, opto tipi encoder yani gnd ucu yok. 2 adet çatal tipi optik okuyucu 90 derece okuma açısı oluşturacak şekilde  yanyana özenle yerleştirilip içinden 50 delikli bir disk geçişi sağlanmış. Bunu aşağıda yaptığım devredeki encoder açısından nasıl değerlendirmeliyim.

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

%XY şeklinde iki bitlik bir sayının kaç adet farklı değer verebileceğine bakman lazım.
1- %00
2- %01
3- %10
4- %11
bunların dışında bir başka farklı sayı üretebilirmisin.? bence üretilemez. O ndenle 4 farklı değer görmen gerekiyor.

Senin devrene gelince. Şemana baktım ve bu şekilde bir encoderin çalışması bana göre imkansız.
Encoderden iki adet gelip işlemciye giriyor ve bunlar pullup yani HIGH da bekliyor. O girişlerin bir farkı anlayabilmesi için o girşlerden birinin mekanik olarak arada bir LOW a çekilmesi gerekir ki bu bağlantı şeklinde bu imkansız. Bu bir encoder değil fiziksel 2 pinden giriş pullupda bekliyor ve o girişlerden birini yada ikisini LOW yapabiliyorsan girişten bir şey okunabilir. Değilse sistem çalışmaz.
Diğer taraftan encoderin en önemli özelliklerinden birisi iki girişten gelen sinyallerin birisinin diğerine göre 90 derece faz farkına sahip olmasıdır. Buda olmaz ise zaten yukarıda bahsettiğimiz 4 farklı durum oluşmaz zaten.
Ete

alisumer

asm kodu iyi çalışıyor pic basice monte edebilirsiniz 
KESME:
        
 asm

        BCF    INTCON  ,7 
        BANKSEL PORTB                                    
        MOVLW  0XC0          ;portb 6-7 bitlerinden okuma yapılıyor                                                    
        ANDWF  PORTB  ,W    ;bu yüzden 11000000 ile and işlemi        
        MOVWF  _YENI          ;filtreleniyor      
        RRF    _YENI  ,W    ;yeni okuma ile eski okuma yeni okuma bir sağa kaydırılarak          
        XORWF  _ESKI  ,W    ;yön bilgisi için xor işlemi ile karşılaştırılıyor            
        MOVWF  _YON                        
        BTFSS  _YON    ,6    ; bit 6 test ediliyor 1 ise art 0 ise eks e dallanıyor              
        GOTO    EKS                              
ART:                              
        INCFSZ  _KONUM  ,F      ; konum 1 arttırılır  
        GOTO    $+2              ; alt byte de taşma oldupunda  
        INCF    _KONUM+1  ,F    ;üst byte 1 arttırılır                        
        GOTO    CIK                    
EKS:    
        MOVLW  .1                ;
        SUBWF  _KONUM  ,F        ;decfsz 0 da kontrol edildiğinden kullanılmaz                  
        BTFSC  STATUS  ,C        ;çıkıarma işlemi ile konum bir azaltılır  
        GOTO    $+2              ;status taşma kontrolu ile konum ff olduğunda üst byte 1 azaltılır      
        DECFSZ  _KONUM+1  ,F                
CIK:
        MOVLW  .3                ;konum 1024 ile sınırlandırılıyor.
        ANDWF  _KONUM+1 ,F      ;00000011 ile üst byte filtrelenerek
        CLRF    _I                ;programa özeldir şart değil 65535  sınır
        MOVF    _YENI  ,W        ;eski okumayı yenisi ile güncelle  
        MOVWF  _ESKI            ;    
        MOVF    PORTB  ,W          
        MOVWF  _TEMP        
        BCF    INTCON  ,0 
        BANKSEL PORTA            
        RETFIE
    ENDASM
Hep meraktan

Powered by EzPortal