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 : |
||||||
Nomenclature
: Résistances Condensateur Circuit Intégré Diode LED Quartz Bouton poussoir Picot |
|
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) |
|||
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. |
||||||