16F628 Gestion d'un bouton poussoir avec le Timer 0

 

C'est un cours qui explique comment gérer l'anti-rebond d'un bouton poussoir avec le Timer 0 du PIC 16F628.
Pour comprendre ce programme, il faut avoir assimiler la Gestion du temps réel.
On utilise un quartz de 4,096 MHz et l'interruption provoquée par le débordement du Timer.
Une action sur le bouton poussoir change l'état de la LED présente sur RB2.
 

Les documents suivants vous sont proposés, mais ne sont pas nécessaires à la compréhension du sujet :

schéma structurel
typon
schéma d'implantation des composants
programme du PIC en assembleur

Pour ceux qui voudraient faire des modifications, le projet MPLAB
Projet Gestion d'un bouton poussoir

Nomenclature :

Résistances

Condensateur

Circuit Intégré
Diode
LED
Quartz
Bouton poussoir
Picot



R1, R2, R3, R5
R4, R6
C1, C2
C3, C5
U1
D5
D1 à D4
Q1
S1
X2



330
10 k
22 pF
10 µF
16F628 + support 18 broches DIL
5,6 V
Rouge 3 mm
4,096 MHz

Horloge 250 Hz
Programme commenté :
24 NBP1 : 1
C'est une variable qui représente l'état du bouton poussoir. Elle est traitée lors du débordement du Timer 0.
Si le BP est relâché cette variable est remise à 0.
Si le BP est actionné, cette variable est incrémentée :
- si sa valeur est inférieure à 5, le bouton poussoir est considéré comme relâché,
- si sa valeur est égale à 5 le bouton poussoir vient d'être actionné.
- si sa valeur est égale à 6, le bouton poussoir est maintenu actionné.
(Pour que le BP soit considéré comme actionné, il faut 5 x 2 ms = 10 ms d'action permanente).

35
36

movlw
movwf

0x07
CMCON

Le 16F628 intègre des comparateurs. A la mise sous-tension, ces comparateurs sont activés. Pour utiliser les broches du PORTB comme des broches entré/sortie logiques, il faut désactiver le mode comparateur.
42
43
movlw
movwf
B'00000010'
OPTION_REG

Option Register (page 23 doc Microchip)
Le bit 5 = 0, le Timer 0 est commandé par l'horloge interne du PIC.
PS<2:0> = 010, le facteur de prédivision associé au TMR0 est de facteur 8.
Pour résumer :
L'horloge du 16F628 utilise un quartz de 4,096 MHz.
Cette fréquence est divisée par 4 pour cadencer le µC. f1 = 4,096 / 4 = 1,024 MHz.
Le prédiviseur effectue une nouvelle division par 8. f2 = 1 024 000 / 8 = 128 kHz
Un octet est affecté au Timer 0. Le comptage s'effectue donc de 0 à 255.
Il y aura débordement du Timer à une fréquence f3 = 128 000 / 256 = 500 Hz
Une interruption Timer aura lieu toutes les 2 ms si son contenu n'est pas modifié.

On peut remarquer le programme principal lignes 53, 54, 55. C'est une boucle d'attente. Le programme est exécuté intégralement lors de l'interruption. Si on utilise un quartz de 8,192 MHz, l'interruption sera générée toutes les 1 ms.
44
45
movlw
movwf
B'10100000'
INTCON
INTCON (page 24 doc Microchip)
Le programme ne travaille qu'avec l'interruption engendrée par TMR0.
Le bit 7 = 1, autorise toutes les interruptions.
Le bit 5 = 1, autorise l'interruption par débordement du Timer 0.
L'interruption :

Sauvegarde des registres.
60à 62 Sauvegarde des registres internes W et STATUS au déclenchement de l'interruption.
Gestion de l'état du bouton poussoir.
Le bouton poussoir est lu toutes les 2 ms.
72
73
74
75
76
77
78
79
80
btfss
incf
btfsc
bcf
;
movf
sublw
btfsc
decf
BP1
NBP1,W
BP1
SwapLed,0

NBP1 ,W
Antire+2
STATUS,Z
NBP1,F
Lecture du bouton poussoir, on saute l'instruction suivante s'il est relâché.
Le bouton est actionné, on incrémente la variable NBP1.
Lecture du bouton poussoir, on saute l'instruction suivante s'il est actionné.
Le bouton est relâché, le contenu de NBP1 est remis à zéro.

La variable NBP1 est recopiée dans W.
W = 7- W. On ne cherche à savoir que si le résultat de l'opération est nul (NBP1 = 7)
Si NBP1 est différent de 7, on saute l'instruction suivante.
(NBP1 = 7) donc NBP1 = 7 - 1 = 6
Le contenu de NBP1 reste figé à 6 si le bouton est toujours actionné.
Le segment suivant gère l'état de la Led du télérupteur. Lorsque le contenu de la variable NBP1 passe par la valeur 5, l'état logique de la Led est complémenté.
86
87
88
89
90
91
movf
sublw
btfss
goto
movlw
xorwf
NBP1,W
Antire
STATUS,Z
FinBP
Teler1
PORTB,F
La variable NBP1 est recopiée dans W.
W = 5 - W. On ne cherche à savoir que si le résultat de l'opération est nul (NBP1 = 5).
Si NBP1 = 5, on saute l'instruction suivante.
NBP1 <> 5, fin de traitement de l'état du bouton poussoir.
Charge le masque pour la Led du télérupteur.
Complémente l'état de la Led avec un OU Exclusif.
Validation de la prochaine interruption.
94 bcf INTCON,T0IF Lors de l'interruption, le Flag T0IF avait été positionné à l'état 1. Pour que la prochaine interruption du TMR0 soit prise en compte, il faut effacer ce Flag.
Restauration des registres.
97 à 100 L'interruption est terminée. Les deux registres STATUS et W sont restaurés.
Retour d'interruption.
102 retfie
 
L'avantage de cette structure est que le traitement de l'état d'un bouton poussoir ne prend que quelques µs. Il n'y a pas de boucle d'attente et la durée économisée permet d'uliser le temps libérer à d'autres taches.
 
Accueil