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 ---
se débarrasser des rebonds des encodeurs chinois
- ducran lapoigne
Débutant- Messages : 96
- Enregistré en : septembre 2015
bonjour tous,
vous connaissez certainement ceci :
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
vous connaissez certainement ceci :
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/1 (/GPPU) [0] : Resistance Pull-Up activées/désactivées
; b6=0/1 (INTEGD) [0] : Interruption sur Front-Descendant/Front-Montant
; b5=0/1 (TOCS) [0] : Timer0 synchronisé par Horloge-Interne/Horloge-Externe (GP2)
; b4=0/1 (TOSE) [0] : Timer0 sensible sur Front-Montant/Front-Descendant de GP2
; b3=0/1 (PSA) [1] : Prédiviseur du Tmr0/Timer-Watchdog
; b2=0/1 (PS2) [1] : \
; b1=0/1 (PS1) [1] : | Valeur de prédivision 000 => 1:2 111 => 1:256 Timer0
; b0=0/1 (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,w
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,w
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
se débarrasser des rebonds des encodeurs chinois
Bonsoir ducran lapoigne, F6FCO, et tout le forum
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é
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.
A+
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.
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.
A+
Modifié en dernier par Temps-x le ven. 16 févr. 2018 19:52, modifié 1 fois.
se débarrasser des rebonds des encodeurs chinois
- F6FCO
Expert- Messages : 1420
- Âge : 70
- Enregistré en : décembre 2017
- Localisation : Furtif je suis.
- Contact :
Ou en fabriquer un avec un moteur pas à pas: http://f6fco.pagesperso-orange.fr/Encodeur.htm
se débarrasser des rebonds des encodeurs chinois
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.
pour ce partage
A+
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.
pour ce partage
A+
se débarrasser des rebonds des encodeurs chinois
- ducran lapoigne
Débutant- Messages : 96
- Enregistré en : septembre 2015
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
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
Bonsoir ducran lapoigne, et tout le forum,
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.
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.
Le code était super bien fait, mais dur à relire pour moi, mais surement pas pour lui.
on peut dire qu'il était très près du compilateur
A+
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.
on peut dire qu'il était très près du compilateur
A+
se débarrasser des rebonds des encodeurs chinois
- ducran lapoigne
Débutant- Messages : 96
- Enregistré en : septembre 2015
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
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
se débarrasser des rebonds des encodeurs chinois
Bonsoir ducran lapoigne, F6FCO, et tout le forum
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.
Ne t’inquiète pas je dépasse jamais D'10', je connais mon code de la route
A+
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.
ducran lapoigne a écrit :
Source du message ici l' exemple est très simple mais si on fait des goto $+D'123'
Ne t’inquiète pas je dépasse jamais D'10', je connais mon code de la route
A+
se débarrasser des rebonds des encodeurs chinois
Retourner vers « Coin Fourre-tout »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 118 invités