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;
}
}
bunlarla uğraşacağına 18f2431 kullan direk encoder girişine bağla yönü dir flagindan kontrol et.