Hola,
Para usar un encoder comercial (a, b, indice) para determinar posicion, se utiliza la siguiente logica:
A uno de los canales lo designas como reloj, el otro seria dato. Por ejemplo el
A puede ser Reloj y el B puede ser Dato. De esta forma se lee la linea Reloj y al detectar un cambio (flanco ascendente o descendente) se lee la linea de Datos y se incrementa o decrementa, segun la secuencia, un contador.
si ((A=1) y (B=1)) o ((A=0) y (B=0)), entonces //Giro hacia la derecha.
incrementar contador
fin_si
si ((A=1) y (B=0)) o ((A=0) y (B=1)), entonces //Giro hacia la izquierda.
decrementar contador
fin_si
Este contador contendra la posicion del eje. Para tener la posicion en grados se convierte segun la cantidad de pulsos por revolucion del encoder.
Para detectar el cambio en la señal de reloj, se puede hacer polling, guardando el estado anterior y el estado actual del pin. Otra forma es utilizar las interrupciones por cambio de estado en RB7:RB4. Otra forma es utilizar la interrupcion RB0/INT, cada vez que se recibe un flanco, se configura para interrupcion en el flanco inverso (si se recibe flanco descendente, se reconfigura para interrupcion en flanco ascendente, al llegar el flanco ascendente, se reconfigura para interrupcion en flanco descendente, y asi sucesivamente), otra forma, si el micro lo soporta, es utilizar un modulo CCP configurado en modo captura, utilizando un criterio similar al anterior, reconfigurando el flanco.
Para mayores detalles fijate esta nota de aplicacion de microchip:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011010y esta otra:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011782Si en cambio quieres usar el encoder para medir las RPMs de un motor, por ejemplo, se utiliza un timer para determinar el tiempo entre dos flancos sucesivos, en este caso solo se usa un canal.
Espero te sirva.
Saludos.
Tec. Claudio J. Perez
Ciberar-Sistemas & Desarrollos
Jujuy-Argentina