Rotary enkoder sorunu

Başlatan entegre46, 24 Şubat 2015, 21:51:28

entegre46

Arkadaşlar LCD de değişkeni artırıp azaltmak için yazdığım bir kod.Gerçek uygulamada bir adımda değişken 2 veya 3 artırıyor yardımlarınız için şimdiden teşekkürler

#define RotaryEncoder portb   

char Encoder, oldEncoder;     
unsigned sayac, tmp;           
char txt[5];                   

// LCD module bağlantıları
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module bağlantıları

void init()
{
   ADCON1 |= 0x0F;             // AN pinleri dijital I/O yapılandırıldı
   CMCON  |= 7;                // Comparators (karşılaştırıcılar) pasif edildi
   LCD_Init();                 // LCD display yapılandırıldı
   LCD_Cmd(_LCD_CURSOR_OFF);   // imleci gizle
   RotaryEncoder = 0;          // Portun ilk durumu sıfırlanıyor.
   trisb = 0x03;               // Rotary Encoder portu giriş yapıldı
   Encoder = 0x03;             // Rotary encoder'in değerini tutan değişkene ilk değer veriliyor.
   sayac = 0;                  // sayac değeri sıfırlanıyor.
   Lcd_Out(1, 1, "Sayac:");
}

void main()
{
     init();
     while(1)
     {
          oldEncoder = Encoder;     // yeni değer eski değere yükleniyor
          tmp = sayac;              // 2 byte'lık sayac desimale dönüştürülüyor
          WordToStr(tmp, txt);      // decimale dönüştürülün değer text'e çevriliyor
          Lcd_Out(2, 1, txt);       // sayac değeri LCD'de görüntüleniyor
          if (Encoder == oldEncoder) Encoder = RotaryEncoder & 0x03;
          if (oldEncoder.F1 != Encoder.F0)
          {
              if (oldEncoder.F0 == Encoder.F1) if (sayac < 9999) sayac++;
          }
          if (oldEncoder.F0 != Encoder.F1)
          {
              if (oldEncoder.F1 == Encoder.F0 ) if (sayac > 0) sayac--;
          }
     }
}

ahmetbudak

kullandığınız encoderin bağlantısını nasıl yaptınız kondansatör kullandınız mı?

mehmet

#2
Kullanmadığınız bir timer ile RE pinlerini
okuyunuz. Önceki değeri ile karşılaştırma yapınız.
Ana döngü içerisinde de artık RE ile ilgili sadece
ilgili değişkenin artma/eksilme hesabı yapılır.

Buradaki en büyük sıkıntılardan biri debounce.
Bu nedenle programın yapısını bozmadan
bir timer ile (Örneğin: 10ms. aralıklarla) veri okumak.

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr