Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

CCS C ROTARY ENCODER PROBLEMİ

Başlatan ahmetbudak, 16 Kasım 2014, 21:32:27

ahmetbudak

herkese iyi akşamlar aşağıda portb değişiklik kesmesi ile yazdığım kodda
rotary encoder'i bir tık çevirdiğimde i sayacı 1 değerden fazla (mesela 50 veya 35 gibi ) artıyor
rb0 kesmesi kullandığımda birer birer artıyor  bu durumu yaşayıp çözüm bilen oldumu acaba?
#include <16f628A.h>

#fuses INTRC_IO,NOWDT,NOBROWNOUT,NOLVP,NOPUT,NOCPD

#use delay(clock=4000000)
#include<flexy_lcd.c>
#include"ds18b20.c"
#define cmcon=0x07
int8 i=0;
void lcd_yaz()
{
   printf(lcd_putc,"\%u",i);
}
   
#int_rb
void ext_rot ()
{
   if (~input(pin_b4))
   //delay_ms(5);
   i++;
   
  
}

void main()
{
   
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   //set_tris_a(0b00100000);
   set_tris_b(0b11110000);
  
   
   lcd_init();
   lcd_gotoxy(1,1);
   delay_ms(5);
  
  enable_interrupts(INT_RB);
  enable_interrupts(GLOBAL);
  
   
   
   
   while(true)
   {
 lcd_gotoxy(1,1);
   lcd_yaz();
   }
 
   
}

ete

#1
Tespitin pek doğru değil. Her tık da 4 sayı sayması gerekir. Zira iki tık arasında encoder 4 konum değiştirir.
A ve B uçları %BA şeklinde bağlı ise ,iki tık arasında sırası ile %00 , %01 , %11 , %10 konumlarını üretir buda yazdığınız koda göre encodern her tık da 4 sayı artmasına sebep olur.
Çözüm için encoderin yalnızca %00 veya %11 gibi konumlarda saymasını sağlayabilirsiniz.  Yada başak bir sayaç saydırarak sayac=4 olduğunda sizin kendi sayacınızı bir artırırsnız.

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

Kabil ATICI

 int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;

void setup() {
   pinMode (encoder0PinA,INPUT); //Encoder A bacağını girişi olarak ata
   pinMode (encoder0PinB,INPUT);//encoder B bacağını giriş olarak ata
   Serial.begin (9600);//seriport başlangıç
}

void loop() { //main çevrimi
   n = digitalRead(encoder0PinA);  //encoder A bacağını bir değişkene al
   if ((encoder0PinALast == LOW) && (n == HIGH)) // A bacağın son hali lojik0 ve bacak lojik 1 ise
{
     if (digitalRead(encoder0PinB) == LOW) // B bacağı lojik 0 ise
{
       encoder0Pos--;// sayacı 1 artır
     } else {
       encoder0Pos++;// sayacı 1 azalt
     }
     Serial.print (encoder0Pos);//seri port üzerindenbilgisayara veri gönderiyor.
     Serial.print ("/"); //seri portla ilgili...
   }
   encoder0PinALast = n; //A bacağı son halini al...
}

bu arduino kodu bunu kullanarak çözdüm. Sadece encoder bacaklarına 10nF kondansatör ekledim.
ambar7