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