Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : mazertoc
Gestion encodeur V4
- F6FCO

Expert- Messages : 2860
- Âge : 99
- Enregistré en : décembre 2017
- Localisation : Banlieue sud de Klyntar
- Contact :
Encore une autre façon de gérer un encodeur en asm.
Cette fois avec le principe du tableau 4x4 , tous les états précalculés inscrits dans le tableau, 1 pour sens H, 0xff pour le sens AH, 0 pour immo et 0 pour erreur (rebond). C'est le principe utilisé en industrie pour l'asservissement des gros servomoteurs entre-autres.
Pas d'équations cette fois, tout est pré-calculé, T et T-1 servent d'adresse et on travaille directement en lisant le tableau.
En abscisse les états au moment T, en ordonnée les états T-1, on fait un ou entre l'état T-1 et l''état T et on s'en sert comme offset pour aller lire dans le tableau.
Exemple en sens AH:
Etat logique T-1=10 -> bits_old=xxxx10xx, état logique T-1=11 -> bits_new=xxxxxx11
ou logique avec les deux valeurs: xxxx10xx or xxxxxx11= xxxx1011
On obtient en scrutant le tableau xxxx1011 (11 décimal), la valeur 0xff
On additionne 0xff à ptr codé sur 1 octet, ce qui revient à faire ptr-1.
La gestion d'une erreur:
Le tableau reflète la table de vérité de l'encodeur, si par exemple en sens AH (anti-horaire) on est T-1=11, le tableau attend T=01, si c'est la valeur 11 lue sur les pins de l'encodeur çà signifie qu'on est immobile, si c'est une autre valeur que 11 ou 01 on est en erreur, un rebond ou parasite, dans ces deux cas ptr n'est pas incrémenté ou décrémenté.
Ca ne fonctionne que pour le premier rebond mais c'est déjà çà, les autres riquent d'être lus comme bons ou erreurs, d'ou la nécessité de bien filtrer les pins encodeur.
Pour que la routine soit portable j'ai placé toutes les variables et le transfert des datas en ram à n'utiliser qu'une fois en initialisation dans un fichier.inc, la routine à appeler pour piloter l'encodeur dans un fichier asm séparé. Je vais d'ailleurs reprendre ce principe dans les précédentes versions que j'ai postées.
Pour le transfert des datas en ram je n'ai pas utilisé la panoplie TBLPTR volontairement, je trouve ces instructions moches dans le code.
Le fichier .inc à placer au début du main à un endroit ou il ne sera lu qu'une fois.
La routine .asm à appeler pour lire l'encodeur, elle retourne les bits H (sens horaire), AH (sens anti-horaire) et immo (immobile), ainsi que la variable ptr qui contient le nombre de ticks générés.
Cette fois avec le principe du tableau 4x4 , tous les états précalculés inscrits dans le tableau, 1 pour sens H, 0xff pour le sens AH, 0 pour immo et 0 pour erreur (rebond). C'est le principe utilisé en industrie pour l'asservissement des gros servomoteurs entre-autres.
Pas d'équations cette fois, tout est pré-calculé, T et T-1 servent d'adresse et on travaille directement en lisant le tableau.
En abscisse les états au moment T, en ordonnée les états T-1, on fait un ou entre l'état T-1 et l''état T et on s'en sert comme offset pour aller lire dans le tableau.
Exemple en sens AH:
Etat logique T-1=10 -> bits_old=xxxx10xx, état logique T-1=11 -> bits_new=xxxxxx11
ou logique avec les deux valeurs: xxxx10xx or xxxxxx11= xxxx1011
On obtient en scrutant le tableau xxxx1011 (11 décimal), la valeur 0xff
On additionne 0xff à ptr codé sur 1 octet, ce qui revient à faire ptr-1.
La gestion d'une erreur:
Le tableau reflète la table de vérité de l'encodeur, si par exemple en sens AH (anti-horaire) on est T-1=11, le tableau attend T=01, si c'est la valeur 11 lue sur les pins de l'encodeur çà signifie qu'on est immobile, si c'est une autre valeur que 11 ou 01 on est en erreur, un rebond ou parasite, dans ces deux cas ptr n'est pas incrémenté ou décrémenté.
Ca ne fonctionne que pour le premier rebond mais c'est déjà çà, les autres riquent d'être lus comme bons ou erreurs, d'ou la nécessité de bien filtrer les pins encodeur.
Pour que la routine soit portable j'ai placé toutes les variables et le transfert des datas en ram à n'utiliser qu'une fois en initialisation dans un fichier.inc, la routine à appeler pour piloter l'encodeur dans un fichier asm séparé. Je vais d'ailleurs reprendre ce principe dans les précédentes versions que j'ai postées.
Pour le transfert des datas en ram je n'ai pas utilisé la panoplie TBLPTR volontairement, je trouve ces instructions moches dans le code.
Le fichier .inc à placer au début du main à un endroit ou il ne sera lu qu'une fois.
Code : Tout sélectionner
;******************************************************************************
; F6FCO - février 2026
;
; Placer de fichier.inc en début de main
;
;******************************************************************************
#define PORT_encodeur PORTB ; PORT du PIC ou sont connectés les pins (0,1)
#define newA bits_new,0
#define newB bits_new,1
#define oldA bits_old,2
#define oldB bits_old,3
#define H bits_gestion,1
#define AH bits_gestion,2
#define immo bits_gestion,3
flash_vers_ram macro valeur
movlw valeur
movwf POSTINC0
endm
CBLOCK 0x0045 ; variables gestion encodeur
table_ram :16
ptr :1 ; ticks générés
bits_new :1 ; bits de gestion
; <0> newA
; <1> newB
; <2>
; <3>
; <4>
; <5>
; <6>
; <7>
bits_old :1
; <0>
; <1>
; <2> oldA
; <3> oldB
; <4>
; <5>
; <6>
; <7>
bits_gestion :1
; <0>
; <1> H
; <2> AH
; <3> immo
; <4>
; <5>
; <6>
; <7>
offset_table :1
ENDC
; - initialisation encodeur
clrf bits_gestion
clrf bits_new
clrf bits_old
clrf offset_table
movlw d'128'
movwf ptr
movff PORT_encodeur,bits_new
andlw b'00000011'
; on a maintenant ici l'état de départ de l'encodeur
; dans oldA et oldB
lfsr FSR0,0
init_table
lfsr FSR0, table_ram
flash_vers_ram 0
flash_vers_ram 1
flash_vers_ram 0xff
flash_vers_ram 0
flash_vers_ram 0xff
flash_vers_ram 0
flash_vers_ram 0
flash_vers_ram 1
flash_vers_ram 1
flash_vers_ram 0
flash_vers_ram 0
flash_vers_ram 0xff
flash_vers_ram 0
flash_vers_ram 0xff
flash_vers_ram 1
flash_vers_ram 0
La routine .asm à appeler pour lire l'encodeur, elle retourne les bits H (sens horaire), AH (sens anti-horaire) et immo (immobile), ainsi que la variable ptr qui contient le nombre de ticks générés.
Code : Tout sélectionner
;******************************************************************************
; F6FCO - mars 2026
;
; gestion d'un encodeur en quadrature V4
;
;
; horloge 8Mhz interne
;
; IMPORTANT, A SAVOIR !!!
; Les encodeurs mécaniques chinois bon marché d'Aliexpress génèrent 4 ticks
; par cran
; 1 tour = 20 crans (pas) = 80 ticks
;
;******************************************************************************
gestion_encodeur:
; -------------------
; mémorise état précédent dans oldA et oldB
rlncf bits_new
rlncf bits_new
clrf bits_old
movff bits_new,bits_old
; -------------------
; lecture pins encodeur et stockage dans newA et newB
movff PORT_encodeur,bits_new
movlw b'00000011'
andwf bits_new ; isole proprement newA et newB
; -------------------
; calcul l'offset de la table
movf bits_new,w
iorwf bits_old,w
movff WREG,offset_table
; ------------------
lfsr FSR0,table_ram ; adr début table
movf offset_table,W
movf PLUSW0,W
addwf ptr ; comptage nb ticks
movwf PRODL ; variable tem^poraire pour tests suivants
; on teste si mouvement anti-horaire (PRODL=0xff)
movlw 0xff
cpfseq PRODL
bra x0
bcf H
bsf AH
bcf immo
bra x3
x0 ; on teste si mouvement horaire (PRODL=1)
movlw 0x01
cpfseq PRODL
bra x1
bcf AH
bsf H
bcf immo
bra x3
x1 ; immobile ou erreur (rebond)
bcf H
bcf AH
bsf immo
x3 return
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 6 invités
