// En sağlıklı Encoder Pulse'nı okumak için bir hayli yol denedim.En sonunda aşağıdaki kodlarda karar kıldım.
// Umarım bu kodlar ilgilenen arkadaşların işine yarar.Ayrıca RS232 ile C# arasındaki (anlık) bağlantıyı da isteyen
// arkadaşlarla paylaşabilirim.İyi çalışmalar.
// Rotary Encoder Pulse Sayimi (Rotary 360 Pulslık)
// Rb4-7 kesmesi
// RS232 Bigisayar Haberleşmesi
unsigned short eski_portbrb7,eski_portbrb6;
int sayac,e_sayac;
char txt[8];
unsigned short i;
void interrupt()
{
if (INTCON.RBIF)
{
if (PORTB.RB7!=eski_portbrb7)
{
if (PORTB.RB6==eski_portbrb7)
{
sayac--; if (sayac< 0)sayac+=360;
}
else
{
sayac++; if (sayac>360)sayac-=360;
}
eski_portbrb7=PORTB.RB7;
eski_portbrb6=PORTB.RB6;
}
INTCON.RBIF = 0; //RB4-7 KESMESİ İÇİN BAĞRAĞI SIFIRLA
}
}
void kurulum()
{
TRISD=0b00000000;
PORTD=0;
TRISB=0b11000000; //PORT B RB4-7 İÇİN (SADECE 6-7)
PORTB=0;
INTCON.GIE=1; //TUM KESMELER AKTİF
INTCON.RBIE=1; //RB4-7 KESMESİ AKTİF
sayac=0;
e_sayac=0;
UART1_Init(115200); //BAUD
Delay_ms(250);
}
void main()
{
kurulum();
UART1_Write_Text("...");
do{
if (UART1_Data_Ready())//RS232 DEN BILGI GELDI ISE
{
i = UART1_Read();
if(i==65) PORTD.RD1=1; //RS232 den 'A' geldi ise
if(i==66) PORTD.RD1=0; //RS232 den 'B' geldi ise
}
if(sayac==1)
PORTD.RD0=1;
else
PORTD.RD0=0;
if(e_sayac!=sayac)
{
IntToStr(sayac,txt);
UART1_Write_Text(txt); //RS232 ILE GONDER
e_sayac=sayac;
}
}while(1);
}