Saludos, antes de nada quiero pedir disculpas por si meto la pata en alguna de las normas del foro soy nuevo en el y aún no controlo todo. He intentado buscar la información por medio del buscador, pero hay tanta que me pierdo y llevo así ya tres días. Me urge un poco solucionar este problema y por eso es que he abierto un nuevo tema.
En primer lugar me gustaría saber si hay usuarios de este foro que usen mikro C para pic´s? y que opinión tienen.
La duda más importante que quiero resolver es la siguiente:
Estoy realizando un dispositivo para leer varios encoder rotatorios tipo alps de esos que vienen con interruptor. Concretamente el que uso tiene 24 pulsos por vuelta.
Los avances realizados hasta ahora son los siguientes:
Mediante RA0 y RA1 leo los pulsos que envía el encoder. La conexión al pic es por medio de dos puertas trigger schmitt y dos condensadores de 1 uF a gnd para evitar los rebotes.
Se limitan los valores a 0 como valor mínimo y 127 máximo.
Los saco por el PORTB mediante leds conectados a las patillas RB0 a RB6.
Utilizo RB7 para saber si incrementa o decrementa.
Hasta aquí todo bien...
El problema surge cuando quiero hacer incrementos o decrementos dependientes de la velocidad de giro.
Ejemplo: Si el valor inicial de la variable asociada al encoder es 0 y quiero poner su valor al máximo (DEC'127') al tener 24 pulsos por vuelta debo dar casi 6 vueltas al encoder para lograr dicho valor. La utilidad para la que estoy haciendo esto necesita que si se gira el encoder de forma muy rápida hacia la derecha por ejemplo. pase de valor 0 a 127 en solo 10 o 12 pulsos (aproximadamente la mitad de pulsos de resolución). Por otro lado se necesita también tener la capacidad de incrementar pulso a pulso, incluso dos velocidades intermedias.
He intentado varios métodos sin éxito.
Solo se me ocurren dos posibilidades más, pero no tengo claro como implementarlas. Las dos se basan en contar el tiempo.
La primera es mediante las interrupciones. Este sistema no me gusta mucho porque el procesador debe dejar de hacer otras cosas para atender dicha interrupción.
La otra es mediante dos variables que se cargan, una en el momento de lectura del primer patrón AB de las patitas del pic. Y la otra en la segunda lectura AB que se realiza para saber si avanza o retrocede. Los valores de estas variables deberían estar asociadas al tiempo para poder medir este mediante una simple instrucción de tipo:
if(tiempo2 - tiempo1 >= 1ms) avanza_lento();
if(tiempo2 - tiempo1 < 1ms) avanza_rapido();
Utilizo un pic 16F84A. He provado con el registro PCL, incrementando una variable y algo más que no recuerdo. Todo sin éxito.
Si alguien puede ayudarme le estaré muy agradecido.
No se si he planteado bien el problema y espero que sirva también para otras personas.
Muchas gracias y felicidades por el foro.