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 ---
Tout ce qui n'a pas de catégorie !
se débarrasser des rebonds des encodeurs chinois
ducran lapoigne
Avatar de l’utilisateur
Débutant
Débutant
Messages : 96
Enregistré en : septembre 2015

#1 Message par ducran lapoigne » jeu. 15 févr. 2018 14:47

bonjour tous,

vous connaissez certainement ceci :

ky-040.jpg


de prime abord, j' ai pensé que c' était un générateur de rebonds.
J' avais un projet arduino à finir et n' ai jamais trouvé sur la toile de sketch ou de
solution hardware me convenant.

la solution: le nettoyage avec 12f629

Code : Tout sélectionner

;--------------------------------------------------------------------------
;
 interface encodeur mécanique (anti rebonds)version 2 
; signaux de sortie: pulse /dir
;--------------------------------------------------------------------------
;
;
 NOM : dec_enc2
; AUTEUR : A.Dassenoy
; DATE : 15/10/2017
; VERSION : 1
;
;--------------------------------------------------------------------------


    LIST      p=12F629            ; Définition de processeur
    
#include <P12F629.INC>        ; Définitions de variables


;     Vss (-)
;
     |                                                     A
;     |   GP0 C1in+ -----------------------<------------------   encodeur
;     |   |                                                 B    chinois
;     |   |   GP1 C1in-  ------------------<------------------   KY-040 
;     |   |   |    
;     |   |   |   GP2 TOCKI INT C.OUT 
;     |   |   |   | 
;     8   7   6   5 
;   -----------------
;
  |                 |                            CW       CCW
;  |                 |                            B A      B A
;   -                |                     click  1 1      1 1
;    |   12F629      |                            0 1      1 0
;   -                |                            0 0      0 0
;  |                 |                            1 0      0 1
;  |                 |                     click  1 1      1 1      
;   -----------------
;
     1   2   3   4   
;     |   |   |   | 
;     |   |   |   GP3 /MCLR (tjr in) 
;     |   |   |    
;     |   |   GP4 /T1G OSC2 CLKOUT ------------->-------------- pulses
;     |   |   
;     |   GP5 T1CKI OSC1 CLK1  ----------------->-------------- dir
;     |   
;     Vdd (+)
;
;


;
 '__CONFIG' précise les paramètres encodés dans le processeur au moment de
; la programmation du processeur. Les définitions sont dans le fichier include.
;
 Voici les valeurs et leurs définitions :
;
    _CP_OFF                 Code protection OFF
;    _PWRTE_ON               Timer reset sur power on en service
;    _WDT_OFF                 Watch-dog pas en service
;    _INTRC_OSC_NOCLKOUT     Oscillateur interne
;    _MCLRE_OFF                Pin GP3/MCLR en Entrée standard

    __CONFIG    _CP_OFF 
& _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT

;--------------------------------------------------------------------------
;
    ASSIGNATIONS
;--------------------------------------------------------------------------

;
CONFIGURATION DU REGISTRE OPTION [config choisie]
;
    b7=0/(/GPPU)    [0]    :    Resistance Pull-Up activées/désactivées
;    b6=0/(INTEGD)    [0]    :    Interruption sur Front-Descendant/Front-Montant
;    b5=0/(TOCS)    [0]    :    Timer0 synchronisé par Horloge-Interne/Horloge-Externe (GP2)
;
    b4=0/(TOSE)    [0]    :    Timer0 sensible sur Front-Montant/Front-Descendant de GP2
;    b3=0/(PSA)    [1]    :    Prédiviseur du Tmr0/Timer-Watchdog
;    b2=0/(PS2)    [1]    :    \
;
    b1=0/(PS1)    [1]    :    | Valeur de prédivision 000 => 1:2   111 => 1:256  Timer0
;    b0=0/(PS0)    [1]    :    /                        000 => 1:1   111 => 1:128  WatchDog

OPTIONVAL    EQU    b
'00000000'


;CONFIGURATION DU REGISTRE INTCON [config choisie]
;
    b7=1/0    (GIE)    [0]    :    Interruptions Activées/Désactivées
;    b6=1/0    (PEIE)    [0]    :    Interruption PERIPHERIQUES Activées/Désactivées
;    b5=1/0    (T0IE)    [0]    :    Interruption TMR0 Activées/Désactivées
;    b4=1/0    (INTE)    [0]    :    Interruption GP2 Activées/Désactivées
;    b3=1/0    (GPIE)    [0]    :    Interruption GPIO Activées/Désactivées
;    b2=1/0    (T0IF)    [0]    :    Flag TMR0
;    b1=1/0    (INTF)    [0]    :    Flag RB0
;    b0=1/0    (GPIF)    [0]    :    Flag RB

INTCONVAL     EQU b
'00000000'


;CONFIGURATION DU REGISTRE OSCCAL
;    11111100    :    Frequence maxi
;    10000000    :    Frequence nominale
;    00000000    :    Frequence mini

OSCCALVAL    EQU    b
'10000000'


;CONFIGURATION DU REGISTRE WPU
;    bit 7-6            :    N.U
;    bit    5    (WPU5)    :    Resistance de Pull-up sur GP5
;    bit    4    (WPU4)    :    Resistance de Pull-up sur GP4
;    bit 3                :    N.U
;    bit    2    (WPU2)    :    Resistance de Pull-up sur GP2
;    bit    1    (WPU1)    :    Resistance de Pull-up sur GP1
;    bit    0    (WPU0)    :    Resistance de Pull-up sur GP0
;    - bit a 1 : resistance cablée / bit a 0 : resistance non cablée

WPUVAL    EQU    b
'00110111'


;CONFIGURATION DU REGISTRE TRISIO [config choisie]
;
    bit 7-6    :    N.U
;    bit 5    :    GP5 en Entrée/Sortie (1/0)     [1]
;
    bit 4    :    GP4 en Entrée/Sortie (1/0)     [1]
;
    bit 3    :    GP3 en Entrée (1/1)        [1]
;
    bit 2    :    GP2 en Entrée/Sortie (1/0)    [0]
;
    bit 1    :    GP1 en Entrée/Sortie (1/0)    [0]
;
    bit 0    :    GP0 en Entrée/Sortie (1/0)    [1]

TRISIOVAL    EQU    b'00001011'

;CONFIGURATION DU REGISTRE CMCON (COMPARATEUR)
;
    00000111 : desactivé

CMCONVAL    EQU    b
'00000111'


;--------------------------------------------------------------------------
;
    DEFINITION DES PORTS
;--------------------------------------------------------------------------
#DEFINE    enc_A        GPIO,0        ; encodeur signal A
#DEFINE    enc_B        GPIO,1        ; encodeur signal B      
;#DEFINE            GPIO,2        ; 
;#DEFINE            GPIO,3        ; 
#DEFINE    out_puls        GPIO,4        ; pulses comptage
#DEFINE    out_dir        GPIO,5        ; pulses decomptage


;--------------------------------------------------------------------------
;
    DECLARATIONS DE VARIABLES
;--------------------------------------------------------------------------
    CBLOCK 0x020           ; début de la zone variables
    
; variables pour les compteurs
    cpt1     
: 1    
    cpt2     
: 1    
    cpt3    
: 1
; variables pour interrupt
    w_temp 
:1    
    status_temp 
:1
;variables générales
    inp_img    
:1
    cnt_bcl    
:1    ;compteur pour debounce
    
    ENDC            
; Fin de la zone                        

;--------------------------------------------------------------------------
;
            DEFINITION DES MACROS
;--------------------------------------------------------------------------

BANK0 MACRO
    bcf        STATUS
,    RP0        ; passe en bank 0
    ENDM

BANK1 MACRO
    bsf        STATUS
,    RP0        ; passe en bank 1
    ENDM



;--------------------------------------------------------------------------
;
    DEMARRAGE SUR RESET
;--------------------------------------------------------------------------

    ORG        0x000         ; Adresse de départ après reset
      goto    init        
; Adresse 0: initialiser

;--------------------------------------------------------------------------
;
     TRAITEMENT INTERRUPTION
;--------------------------------------------------------------------------

    ORG     0x004            ; interrupt vector location
    movwf   w_temp           
; save off current W register contents
    movf    STATUS
,w           ; move status register into W register
    movwf    status_temp        
; save off contents of STATUS register

; isr code can go here or be located as a call subroutine elsewhere

    movf    status_temp
,w     ; retrieve copy of STATUS register
    movwf    STATUS              
; restore pre-isr STATUS register contents
    swapf   w_temp
,f
    swapf   w_temp
,w          ; restore pre-isr W register contents
    retfie                    
; return from interrupt

;--------------------------------------------------------------------------
;
    INITIALISATIONS
;--------------------------------------------------------------------------

init
;--------------------------------------------------------------------------
;
              calibrating the internal oscillator
;--------------------------------------------------------------------------
;
    goto jmp             ;pour le debugging
    BANK1
    call    0x3ff        
;get the calibration value
    movwf    OSCCAL        
;calibrate oscillator
    BANK0                 
;bank 0
;--------------------------------------------------------------------------
;
jmp                    ;pour le debugging    
    clrf    GPIO        
; Sorties à 0
    BANK1    
; sélectionner banque 1

    movlw    OPTIONVAL    
; charger masque
    movwf    OPTION_REG    
; initialiser registre option

    movlw    INTCONVAL    
; charger masque
    movwf    INTCON        
; initialiser registre interruption

    movlw    WPUVAL        
; charger masque
    movwf    WPU            
; initialiser registre resistances pull-up

;--------------------------------------------------------------------------
;
 définition pins
;--------------------------------------------------------------------------
    movlw    TRISIOVAL    ; charger masque
    movwf    TRISIO        
; initialiser registre TRISIO
    BANK0                
; repasser banque 0
;--------------------------------------------------------------------------
;
 usage des comparateurs
;--------------------------------------------------------------------------
    movlw    CMCONVAL    ; charger masque
    movwf    CMCON        
; initialiser registre comparateur
;--------------------------------------------------------------------------
;
 fin de l'initialisation
;--------------------------------------------------------------------------
    goto    start            ; sauter au programme principal
;--------------------------------------------------------------------------
;    PROGRAMME PRINCIPAL
;--------------------------------------------------------------------------

start
    call read
    movf inp_img,w 
    xorlw b'
00000011'
    btfss STATUS,Z
    goto start            ; l'
encodeur n'est pas sur pos depart
;--------------------------------------------------------------------------
;    arrivé ici, l'
 encodeur est dans la position "click" = repos
;   attente 01 (incr) ou 10 (decr)
;--------------------------------------------------------------------------
pos_dep    
    call read
    movf inp_img
,
    xorlw b
'00000001'    ; test si 01
    btfss STATUS
,Z
    goto not_01
    call dir_cw
    call att_00            
; attente retour a 00 avant d'envoyer la pulse
    call cnt_puls
    goto start

not_01
    movf inp_img,w 
    xorlw b'
00000010'    ; test si 10
    btfss STATUS,Z
    goto not_10
    call dir_ccw
    call att_00            ; attente retour a 00 avant d'
envoyer la pulse
    call cnt_puls 
    goto start

not_10
    movf inp_img
,
    xorlw b
'00000011'    ; test si 11
    btfss STATUS
,Z
    goto start            
; ca ne peut etre que 00: erreur
    goto pos_dep        
; c'est toujours 11 attente chgt
;--------------------------------------------------------------------------
; impulsion de comptage (gpio4)
;--------------------------------------------------------------------------
cnt_puls
    bsf out_puls
    nop
    nop
    nop
    nop
    nop
    bcf out_puls
    goto start    
;--------------------------------------------------------------------------
; niveau dir cw (gpio5)
;--------------------------------------------------------------------------
dir_cw
    bsf out_dir
    nop
    nop
    nop
    nop
    nop
    retlw 00
;--------------------------------------------------------------------------
; niveau dir ccw (gpio5)
;--------------------------------------------------------------------------
dir_ccw
    bcf out_dir
    nop
    nop
    nop
    nop
    nop
    nop
    retlw 00
;--------------------------------------------------------------------------
; attente lecture stable
;--------------------------------------------------------------------------    
read    
    movlw D'
06'            ; initialiser compteur boucles debounce
    movwf cnt_bcl        ;
    movf GPIO,w            ; lire entrées
    andlw b'
00000011'    ; masquer bits inutiles
    movwf inp_img        ; stocker resultat
dec_cnt
    call del            ; attendre 100 us
    decfsz cnt_bcl,f    ;
    goto relire            ;
    goto fin_lec        ; la lecture est stable,on peut traiter
relire
    movf GPIO,w            ; relire entrées
    andlw b'
00000011'    ; masquer bits inutiles
    xorwf inp_img,w        ;
    btfss STATUS,Z        ; test egalite
    goto read            ; pas egal on recommence
    goto dec_cnt        ; c'
est =
fin_lec    
    retlw 00
;--------------------------------------------------------------------------
;
 delai environ 100 microsecondes
;--------------------------------------------------------------------------    
del
 movlw D
'32'                ; +/- 100 us
 movwf cpt1
dloop
 decfsz cpt1
,f
 goto dloop
 retlw 00  
;--------------------------------------------------------------------------
;
 attente lecture stable de l' etat 00
;--------------------------------------------------------------------------    
att_00    
    call read            ; attente 00
    movf inp_img,w 
    xorlw b'
00000000'    ; test si 00 ?
    btfss STATUS,Z        ; test egalite
    goto att_00
    retlw 00            ; c'
est 00

    end
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

se débarrasser des rebonds des encodeurs chinois
F6FCO
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 633
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#2 Message par F6FCO » jeu. 15 févr. 2018 15:45

Hello Antoine,
On en avait déjà parlé mais je ne voyais pas comment tu avais pu faire, c'est une bonne idée d'attendre un zéro stable, il fallait y penser.
Une porte nand prend 2 bits en entrée... cochonne va !!!

se débarrasser des rebonds des encodeurs chinois
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1010
Enregistré en : juillet 2016
Localisation : Terre

#3 Message par Temps-x » ven. 16 févr. 2018 02:15

Bonsoir ducran lapoigne, F6FCO, et tout le forum

F6FCO a écrit :
Source du message Hello Antoine,
On en avait déjà parlé mais je ne voyais pas comment tu avais pu faire, c'est une bonne idée d'attendre un zéro stable, il fallait y penser.


:+1: pour ducran lapoigne oui, il faut attendre qu'il repasse à zéro, mets il y a une autre solution plus simple, voici
un bout de code sur un appareille que j'ai réalisé

Code : Tout sélectionner


encodeur
      btfsc cranx                         
; si le bit RB0 est à 1 on va à la ligne 1 
      return                              
; encodeur pas sollicité, on sort
      btfss cranx                         
; si le bit RB0 est à 0 on va à la ligne 1
      goto 
$+D'2'
      goto $+D'7'                         ; cran de l'encodeur ralaché
      call affiche_digits                 ; gestion anti rebond, et permet d'
avoir l'affichage des digits
      btfss power                         ; si le bit RB3 est à 0 on va à la ligne 1 
      return                              ; mise en fonction demandé, on sort
      btfss calibre                       ; si le bit RA5 est à 0 on va à la ligne 1 
      return                              ; calibrage demandé, on sort 
      goto $-D'
8'

      btfsc crany                         ; si le bit RB1 est à 1 on va à la ligne 1 
      goto augmente_temperature           ; auguement le nombre du digit de plus 1
      btfss crany                         ; si le bit RB1 est à 0 on va à la ligne 1
      goto $+D'
2'
      goto diminue_temperature            ; diminue le nombre du digit de moins 1
      call affiche_digits                 ; gestion anti rebond, et permet d'
avoir l'affichage des digits
      btfss power                         ; si le bit RB3 est à 0 on va à la ligne 1 
      return                              ; mise en fonction demandé, on sort
      btfss calibre                       ; si le bit RA5 est à 0 on va à la ligne 1 
      return                              ; calibrage demandé, on sort 
      goto $-D'
8'


Voir la vidéo que j'ai faite ICI mais faut pas exagéré, il faut que l'encodeur
soit assez dur quand vous tourner les crans, Je précise que l'encodeur est chinois.

Sinon il existe des encodeurs optiques, là plus de problèmes. :wink:

==> A+
Modifié en dernier par Temps-x le ven. 16 févr. 2018 19:52, modifié 1 fois.
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

se débarrasser des rebonds des encodeurs chinois
F6FCO
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 633
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#4 Message par F6FCO » ven. 16 févr. 2018 11:23

Ou en fabriquer un avec un moteur pas à pas: http://f6fco.pagesperso-orange.fr/Encodeur.htm
Une porte nand prend 2 bits en entrée... cochonne va !!!

se débarrasser des rebonds des encodeurs chinois
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1010
Enregistré en : juillet 2016
Localisation : Terre

#5 Message par Temps-x » ven. 16 févr. 2018 19:51

Bonsoir ducran lapoigne, F6FCO, et tout le forum

J'avais vu sur ton site, ou je me suis régalé à le parcourir,
inconvénient : ça fait chère l'encodeur rotatif, un comparateur à mettre en plus sur PCB ce qui augmente la taille.

Après si c'est que du bonheur par rapport au encodeur classique, ok pour cette méthode.

Merci ! pour ce partage :wink:

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

se débarrasser des rebonds des encodeurs chinois
ducran lapoigne
Avatar de l’utilisateur
Débutant
Débutant
Messages : 96
Enregistré en : septembre 2015

#6 Message par ducran lapoigne » sam. 17 févr. 2018 00:01

bonsoir temps-x

merci pour le partage du code

une question que je me pose (mais qui ne me tracasse pas outre mesure):

exemple: goto $-D'8' je trouve cela curieux, pourquoi pas utiliser une étiquette ?
pas pratique si on veut intercaler des instructions

Je suppose que le programme qui génère ce genre de saut vient d' un compilateur ou d'un désassembleur

bonne soirée ou ce qu'il en reste

Antoine

se débarrasser des rebonds des encodeurs chinois
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1010
Enregistré en : juillet 2016
Localisation : Terre

#7 Message par Temps-x » sam. 17 févr. 2018 01:21

Bonsoir ducran lapoigne, et tout le forum,


ducran lapoigne a écrit :
Source du message pourquoi pas utiliser une étiquette ?


C'est vrai ça serait mieux, mais j'aime pas les étiquettes quand sa correspond pas à ce que sa reflète, (je suis comme ça).

Mais tu as raison, il faudrait que j'arrive à modifier tous cela, tu es pas le premier à me le dire.

ducran lapoigne a écrit :
Source du message Je suppose que le programme qui génère ce genre de saut vient d' un compilateur ou d'un désassembleur


Non ça vient de moi, regarde les autres source que j'écris et tu comprendras que c'est ma façon de faire.

J'ai vu une personne écrire en ASM sans déclarer aucune variable, c'est en lisant le code que j'ai compris comment il
stocker les données, en direct.

Code : Tout sélectionner


      movlw D
'25'                    ; valeur 
      movwf H
'3C'                    ; valeur copier directement en Ram



Le code était super bien fait, mais dur à relire pour moi, mais surement pas pour lui.

humour!! on peut dire qu'il était très près du compilateur

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

se débarrasser des rebonds des encodeurs chinois
ducran lapoigne
Avatar de l’utilisateur
Débutant
Débutant
Messages : 96
Enregistré en : septembre 2015

#8 Message par ducran lapoigne » sam. 17 févr. 2018 09:28

bonjour le forum,

pour temps-x:

ne pas voir une critique, juste un point de vue par exemple:

si on écrit:

.....
100 goto $+D'04'
101 ...
102 ...
103 call machin
104 call truc ;< le goto va arriver ici à la ligne 104

maintenant, j' insère une instruction

100 goto $+D'4
101...
102 bsf PORTB, 2;<instruction insérée pour une raison quelconque
103 ...
104 call machin;< le goto va toujours arriver ici à la ligne 104
105 call truc
106 ...

ici l' exemple est très simple mais si on fait des goto $+D'123' on peut vite arriver a se perdre
alors qu' avec des étiquettes, pas de problème: l' assembleur recalcule tout

.... ou bien je deviens trop vieux :-D

se débarrasser des rebonds des encodeurs chinois
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1010
Enregistré en : juillet 2016
Localisation : Terre

#9 Message par Temps-x » sam. 17 févr. 2018 10:24

Bonsoir ducran lapoigne, F6FCO, et tout le forum

ducran lapoigne a écrit :
Source du message ne pas voir une critique, juste un point de vue par exemple


Les critiques ou point de vue permettes d'avancé, et j'encourage les personnes à le faire, on essayant de ne pas offensé la
personne qui est en face, pas toujours facile. :wink:

ducran lapoigne a écrit :
Source du message ici l' exemple est très simple mais si on fait des goto $+D'123'


humour!! Ne t’inquiète pas je dépasse jamais D'10', je connais mon code de la route :wink:

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

se débarrasser des rebonds des encodeurs chinois
F6FCO
Avatar de l’utilisateur
Confirmé
Confirmé
Messages : 633
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#10 Message par F6FCO » sam. 17 févr. 2018 13:52

Pfffttt Antoine, du coup moi aussi je deviens trop vieux :roll:, je vais continuer avec mes étiquettes.
Une porte nand prend 2 bits en entrée... cochonne va !!!


Retourner vers « Coin Fourre-tout »

Qui est en ligne

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