Encoder Okumak

solkirans

Üye
Katılım
10 Kas 2008
Mesajlar
31
Puanları
1
Yaş
39
Merhaba

16f877A kullanarak, aşağıdaki kod ile bir encoder okuyorum, encoder hızlı dönerken ( 1500 2000 rpm) kod çalışıyor fakat encoder yavaşladığında ( 20~30 rpm) hiç bir pulse'ı sayamıyorum. Sorun ne olabilir acaba?

void interrupt(void) {
if(INTCON.INTF == 1)
{
if (PORTB.F1 == 1) // pulse geldiğinde diğer kanal 1 ise artı yonde gidiyoruz
{
pulse++;
}
if (PORTB.F1 == 1) // pulse geldiginde diger kanal 0 ise eksi yonde gidiyoruz
{
pulse--;
}
INTCON.INTF = 0; //You HAVE to clear interrupt flag
}
}
void main()
{
TRISA = 0xFF;
PORTA = 0x00;
TRISE = 0x00;
PORTE = 0x00;
TRISB = 0x0F;
PORTB = 0x0F;
TRISC = 0x00;
PORTC = 0x00;
TRISD = 0x00;
PORTD = 0x00;
PORTB.F7 = 1;
//ADCON1 = 0x00;
INTCON.GIE = 1; //Enable Global Interrupt
INTCON.INTE = 1; //Enable RB0/INT external Interrupt
INTCON.PEIE = 0; //Disable all unmasked peripheral interrupt
OPTION_REG.INTEDG = 1; //Interrupt on rising edge
Lcd_Config(&PORTD, 4, 5, 7, 3, 2, 1, 6);
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
while(1)
{
Lcd_Out(1, 1,"Position:");
yazici(pulse);

}
}
 
if(INTCON.INTF == 1)
{
if (PORTB.F1 == 1) // pulse geldiğinde diğer kanal 1 ise artı yonde gidiyoruz
{
pulse++;
}
if (PORTB.F1 == 1) // pulse geldiginde diger kanal 0 ise eksi yonde gidiyoruz
{
pulse--;
}

İki if koşulu da aynı

şöyle yazın:

Kod:
if(INTCON.INTF)
{
if(PORTB.F1)  pulse++;
else          pulse--;
}
 
Sorun çözüldü, dediğiniz değişiklik ile birlikte sorunsuz çalışıyor. Dikkatsizliğim nedeniyle vaktinizi çaldığım için kusura bakmayın. Teşekkürler.
 
void interrupt(void) {
if(INTCON.INTF)
{
if(PORTB.F1) pulse++;
else pulse--;
}
INTCON.INTF = 0; //You HAVE to clear interrupt flag
}
void main()
{
TRISA = 0xFF;
PORTA = 0x00;
TRISE = 0x00;
PORTE = 0x00;
TRISB = 0x0F;
PORTB = 0x0F;
TRISC = 0x00;
PORTC = 0x00;
TRISD = 0x00;
PORTD = 0x00;
PORTB.F7 = 1;
//ADCON1 = 0x00;
INTCON.GIE = 1; //Enable Global Interrupt
INTCON.INTE = 1; //Enable RB0/INT external Interrupt
INTCON.PEIE = 0; //Disable all unmasked peripheral interrupt
OPTION_REG.INTEDG = 1; //Interrupt on rising edge
Lcd_Config(&PORTD, 4, 5, 7, 3, 2, 1, 6);
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
while(1)
{
Lcd_Out(1, 1,"Position:");
yazici(pulse);

}
}

kodun doğru şekli bu mu acaba.çalışan kodun tamamı ile hex dosyasını ve devre şemasını rica etsek verebilirmisiniz.
 
bende encoderle devir ölçümü yapacagım ama encodern A B ve Z uclarını 16F877A ya nasıl bağlamam gerektiğini bilmiyorum yardımcı olurmusunuz
 
bende encoderle devir ölçümü yapacagım ama encodern A B ve Z uclarını 16F877A ya nasıl bağlamam gerektiğini bilmiyorum yardımcı olurmusunuz

orası sana kalmış dostum. 16f877a da encoder okumak için özel bir port yada giriş yok. pals kaçırmamak için pici 20 mhz kristal ile çalıştırman ve harici kesme kaynaklarını (b4-7 kesmesi) kullanmanı tavsiye ederim.
 

Forum istatistikleri

Konular
128,826
Mesajlar
920,797
Kullanıcılar
450,914
Son üye
tugbag

Yeni konular

Geri
Üst