Encoder okuma yardım

Başlatan topuz, 10 Temmuz 2017, 10:18:05

topuz

Selam arkadaşlar. Kaç gündür 12v beslemeli rotary  encoderle uğraşıyorum  sonunda okutmayı başardım ama bir sorunum var. Yön tayini yapamıyorum. Encoderin A pinini  16f877a nın CCP capture özelliğini kullanarak pic e girdim. Sonra kesme oluştuğunda encoderin B pinini kesmenin içinde kontrol ettim ama yine birşey farketmedi. encoderi ne tarafa çevirirsem çevireyim artıyor(yani tek yöne dönüyormuş gibi algılıyor). Kodlar da aşağıdaki gibi nerede yanlış yapıyorum anlamadım.
int sayac=0,onlar=0,birler=0;
int sayi[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void interrupt(){
if(portc.f0==1)
sayac=sayac+1;
else
sayac=sayac-1;
PIR1.CCP1IF=0;
}
void init(){
T1CON.T1CKPS1=0; // Timer1 prescaler değeri 1:1 olarak ayarlandı.
T1CON.T1CKPS0=0; //
T1CON.T1OSCEN=0; // Timer1 harici osilatör pasif edildi.
T1CON.TMR1CS=0;  // Dahili saat kaynağı seçildi.
CCP1CON.CCP1M3=0; // Capture Her yükselen kenarda kesme oluşturacak.
CCP1CON.CCP1M2=1;
CCP1CON.CCP1M1=0;
CCP1CON.CCP1M0=1;
INTCON.PEIE=1; // Çevresel kesmelere izin verildi.
INTCON.GIE=1; // Bütün kesmelere izin verildi.
PIE1.CCP1IE=1; // Capture kesmesine izin verildi.
PIR1.CCP1IF=0; // Kesme bayrağı temizlendi.
TRISC=0x05;
ADCON1=0X06;
TRISA=0;
TRISB=0;
PORTB=0;
PORTC=0;
TMR1H=0; //16 bitlik Timer1 sayaç registeri temizlendi.
TMR1L=0;

T1CON.TMR1ON=1; //timer1 çalışmaya başladı.
}

void main() {
  init();
  delay_ms(10);
  while(1){
 
  if(sayac==100)
sayac=0;
if(sayac<0)
sayac=99;

   onlar=sayac/10;
   birler=sayac%10;
   porta.f1=1;
    portb=sayi[birler];
    delay_ms(10);
    porta.f1=0;
    porta.f0=1;
    portb=sayi[onlar];
   delay_ms(10);
    porta.f0=0;
  
  }
}



skara1214

bunlarla uğraşacağına 18f2431 kullan direk encoder girişine bağla yönü dir flagindan kontrol et.
Herkes ölür ama herkes gerçekten yaşamaz