bandeau

Gestion d'un encodeur rotatif en ASM PIC

N'ayant pas trouvé grand chose sur le sujet sur le net j'ai réinventé la roue.


Pour cet essai j'ai utilisé un encodeur bas de gamme chinois, çà doit fonctionner avec n'importe quel autre encodeur à partir du moment ou le chronogramme de fonctionnement est identique.
Pour gérer le fonctionnement il faut mémoriser le "coup d'avant", cad l'état des pins A et B au dernier pas et les comparer à l'état au pas suivant, cette comparaison nous donnera le sens de rotation. En obervant le chronogramme on s'aperçoit que si on tourne dans le sens anti-horaire la pin A est toujours égale à la pin B_old, et à l'inverse que si on tourne dans le sens horaire la pin A est toujours différente de la pin B_old.


Le résultat est stocké dans la variable "Sens", qui vaudra 0 si rotation sens anti-horaire, 1 si sens horaire et 2 si l'encodeur n'a pas été manipulé.


Encodeur

A partir de ce constat on a tout ce qu'il nous faut pour pondre notre algorithme. J'y ai rajouté le schéma de câblage de l'encodeur.


Encodeur

Le code .asm.


J'ai volontairement utilisé les mnémoniques de la famille PIC16F pour que le code soit portable aussi bien en 16F qu'en 18F, les BRA ont été changés en GOTO. La routine Gestion_Encodeur se suffit à elle-même il suffit de ne pas oublier de déclarer les variables EncA_old, EncB_old et Sens, toutes sur 1 octet, c'est indiqué dans les commentaires. Il suffit ensuite de l'invoquer à partir du main.
Dans l'exemple ci-dessous j'incrémente ou décrémente simplement la variable "Valeur" créée pour la circonstance.
J'ai choisi ici de gérer les deux pins de l'encodeur sur PORTD,0 et PORTD,1 mais on peut changer en modifiant le code en conséquence, dans ce cas ne pas oublier de modifier les comparaisons (andlw) et le décalage (rrncf).


Cette partie concerne uniquement les initialisations du PIC, variable pour chaque PIC utilisé.




La routine de gestion de l'encodeur.
Cette routine se suffit à elle-même pour être appelée par n'importe quel programme à partir du moment ou l'initialisation du PORT et la déclaration des variables auront été faites correctement.
Tout est commenté dans ce code.




La partie main qui appelle la routine, cette partie sera personnelle suivant votre programme. Ici j'incrémente ou décrémente simplement la variable "Valeur" initalisée à d'127' à titre d'exemple.











retour