Hola, he mirado el datasheet de tu encoder, y he visto los siguientes valores:
At R = 5kΩ
Chattering: 5ms max.
Bounce: 2ms max.
Por lo pronto las resistencia es de 5 K, yo primero las pondria como están en el datasheet.
Despues y creo que es lo más importante aparece algo relacionado con rebotes, que tienen máximos de 5 ms y 2 ms. No se exactamente a que se referira, pero parece que en tu codigo tienes que tomar lecturas de la entrada A y B con esa separacion de tiempo. Lo que te está pasando es que detectas una señal valida, y una falsa depués, intenta hacer un retardo de 5ms antes volver a leer los pines. Yo me crearia una variable candado que no deje que modifique las variables en la interrupción hasta que no haya pasado ese tiempo. Esta variable puede ser la misma que usas de giro.
Ya nos cuentas algo
void INTRB0(void)
{
if (giro = FALSE) // si se produce un rebote antes de 2ms no modificará variables
{
sentido = ENCB;
giro = TRUE;
}
}
VOID MAIN (VOID)
{
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
ext_int_edge(1,H_TO_L);
do{
if(giro == TRUE)
{
delay_ms (2);
giro = FALSE;
if(sentido == DER){
OUTPUT_HIGH(PIN_B3);
//DELAY_MS(250);
OUTPUT_LOW(PIN_B2);
}
else{ //creo que así quedaria, y si colocas dos if podria entrar en los dos si estan produciendose algun rebote
OUTPUT_HIGH(PIN_B2);
//DELAY_MS(250);
OUTPUT_LOW(PIN_B3);
}
#
#
}
#
}
#
while(TRUE);
#
}