Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

enkoder yönü bulma?

Başlatan bulut_01, 19 Nisan 2018, 21:47:22

bulut_01

Alıntı yapılan: M_B - 20 Nisan 2018, 14:06:23Merhaba, altaki kodu kendine göre uyarlayabilirsin.
Kolay gelsin
Mehmet
hardware.h icerigi.
// Rotary encoder
#define RE_A RB6
#define RE_B RB7

#define SWITCH0 RA2


// The following setting sets the speed of the timer0
// interrupt
#define TMR0_SPEED 0x00


// Overall hardware state
struct hardwareState {
 // Internal counters
 unsigned char pwmCounter;
 int dimCounter;

 // Rotary Encoder position
 int encoderPosition;
 unsigned char encoderState;
 unsigned char encoderPreviousState;
 int encoderDirection;

 // Push button
 unsigned char buttonState;
 unsigned char buttonDebounce;

} hardware;

main icindeki kullanımı.
// High priority interrupt procedure
void interrupt()
{
        if (RBIF)
        {
                // Rotary encoder -------------------------------------------------------------------------
                hardware.encoderState = RB6 | RB7 << 1;
                if(hardware.encoderPreviousState != 0xFF) // Check for first time check
                {
                        if(hardware.encoderPreviousState == 0b00 && hardware.encoderState == 0b01)
                        {
                                // Going counter-clockwise
                                hardware.encoderDirection = -1;
                                hardware.encoderPosition--;
                        }

                        else if(hardware.encoderPreviousState == 0b01 && hardware.encoderState == 0b00)
                        {
                                // Going clockwise
                                hardware.encoderDirection = 1;
                                hardware.encoderPosition++;
                        }
                }
                // Save the current state
                hardware.encoderPreviousState = hardware.encoderState;

                // Our encoder has 24 ticks per rotation
                if (hardware.encoderPosition > 23) hardware.encoderPosition = 0;
                if (hardware.encoderPosition < 0) hardware.encoderPosition = 23;

                RBIF_bit=0;                        // Clear the portB interrupt flag

        } // if (RBIF)
}

bu kodda yön ile ilgi kısım neresi üstad?
YENİLMEZ..

ete

Kesme kullanıyorsan kodu biraz daha hızlandırabilirsin. Mantıken düşünürsen en son kesme oluştuğunda almış olduğun YENI değerin bir sonraki kesmenin ESKI değeri olabilir ki öyledir zaten.
Kullandığın mantık kesme olmayan işler için iki defa okuma yaptırıyorsun.
rb kesmesi neye karşılık geliyor pek anlamadım ama muhtemelen PortB değişiklik kesmesidir. Zira INT kesmesi ile bu iş olmaz. İki pin bağlı ve iki pinden herhangi birisi kesme oluşturabilmelidir.
Sana Eski okumanın Eski_a sı ve Yeni okumanın da Yeni_b si lazım aslında diğerleri ile uğraşma.
Bu durumda ben olsam şöyle yapardım;
Kod Seç
rb_kesmesi
yenia=input(port_b4)
yenib=input(port_b5)
yön=yenia^eskib
Burada sayc değerini yöne bağlı artır yada eksil ve kesmeden çıkmadan önce de,
Eskia=Yenia
Eksib=Yenib
şeklinde yazıp kesmeden çık. Böylece bir sonraki kesmede encoder mutlaka konum değiştirmiş olacaktır. Konum değiştirmez ise zaten kesme olmayacaktır.
Çıkışta yeni alınmış değerler eskilere eşitlenir. Birsonraki kesmede okunan yeni değer yeni olarak kabul edilmiş olur.
Ancak hala ne tür bir encoder kullandığını açıklamamışsın. POT tipi mi yoksa motor tipi encodermidir.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

bulut_01

#17
Alıntı yapılan: ete - 20 Nisan 2018, 14:20:24Kesme kullanıyorsan kodu biraz daha hızlandırabilirsin. Mantıken düşünürsen en son kesme oluştuğunda almış olduğun YENI değerin bir sonraki kesmenin ESKI değeri olabilir ki öyledir zaten.
Kullandığın mantık kesme olmayan işler için iki defa okuma yaptırıyorsun.
rb kesmesi neye karşılık geliyor pek anlamadım ama muhtemelen PortB değişiklik kesmesidir. Zira INT kesmesi ile bu iş olmaz. İki pin bağlı ve iki pinden herhangi birisi kesme oluşturabilmelidir.
Sana Eski okumanın Eski_a sı ve Yeni okumanın da Yeni_b si lazım aslında diğerleri ile uğraşma.
Bu durumda ben olsam şöyle yapardım;
Kod Seç
rb_kesmesi
yenia=input(port_b4)
yenib=input(port_b5)
yön=yenia^eskib
Burada sayc değerini yöne bağlı artır yada eksil ve kesmeden çıkmadan önce de,
Eskia=Yenia
Eksib=Yenib
şeklinde yazıp kesmeden çık. Böylece bir sonraki kesmede encoder mutlaka konum değiştirmiş olacaktır. Konum değiştirmez ise zaten kesme olmayacaktır.
Çıkışta yeni alınmış değerler eskilere eşitlenir. Birsonraki kesmede okunan yeni değer yeni olarak kabul edilmiş olur.
Ancak hala ne tür bir encoder kullandığını açıklamamışsın. POT tipi mi yoksa motor tipi encodermidir.
Ete

portb değişiklik kesmesi erol abi enkoder motora baglı hall sensorlü enkoder sayac artıyorum motor saga dönerken sola dönerkende azaltıyorum burda sorun yok sorun yön değişkeni stabil deil motordan a ve b sinyalleri gelirken yön 0 ile 1 arasında değişiyor motor saga dönerken örnek yön değişkeni 1 olması gerekirken 0 ile 1 arasında devamlı değişiyor sabit kalmıyor.
YENİLMEZ..

M_B

Alıntı yapılan: bulut_01 - 20 Nisan 2018, 14:14:30bu kodda yön ile ilgi kısım neresi üstad?

encoderDirection

// Going counter-clockwise
                                hardware.encoderDirection = -1;
ve
// Going clockwise
                                hardware.encoderDirection = 1;
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

bulut_01

Alıntı yapılan: M_B - 20 Nisan 2018, 14:32:44encoderDirection

// Going counter-clockwise
                                hardware.encoderDirection = -1;
ve
// Going clockwise
                                hardware.encoderDirection = 1;

bu koddan bişey anlamadım üstad.
YENİLMEZ..

bulut_01

sorunu çözdüm bütün yardımcı olan arkadaslara tşk ederim saolun
problem enkoder b fazının yolu çatlakmıs iletmemesinden kaynaklanıyormus.
YENİLMEZ..