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 ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Gestion encodeur V4
F6FCO
Avatar de l’utilisateur
Expert
Expert
Messages : 2860
Âge : 99
Enregistré en : décembre 2017
Localisation : Banlieue sud de Klyntar
Contact :

#1 Message par F6FCO » mar. 3 mars 2026 14:38

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.

V4.jpg


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.
Une porte nand prend 2 bits en entrée... :eek:

Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 6 invités