16F628
Gestion du temps réel |
|||||||
| C'est un cours qui explique comment gérer le temps avec le Timer 0 du PIC 16F628. On utilise un quartz de 4,096 MHz et l'interruption provoquée par le débordement du Timer. La LED connectée à RB0 clignote à une fréquence de 1 Hz ( 0,5 s allumée et 0,5 seconde éteinte). La LED connectée à RB1 clignote à une fréquence de 1 mn( 30s allumée et 30seconde éteinte). Le bouton poussoir n'est pas utilisé dans cette configuration. |
|||||||
![]() |
|
||||||
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é : | |||||||
| 23 | SwapLed : 1 | C'est
une variable qui sera l'image du PORTB. Toutes les modifications qui devront
affecter le PORTB seront réalisées sur cette variable. Une
fois ces opérations terminées, le contenu de SwapLed sera
recopié dans le PORTB. Cette méthode est utilisée
lorsque plusieurs évènements doivent être synchrones. |
|||||
| 34 35 |
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. |
||||
| 41 42 |
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. |
|||||||
| 43 44 |
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. |
|||||||
| 62 à 64 | Sauvegarde des registres internes W et STATUS au déclenchement de l'interruption. | ||||||
| Gestion des Leds et de l'horloge. | |||||||
Ce
segment de programme se trouve en tête de l'interruption. Sa particularité
est que indépendamment des instructions et des tests effectués,
la modification apportée au PORTB sera rigoureusement cyclique
et interviendra toutes les 2 ms. Les opérations se font sur la variable SwapLed qui est l'image du PORTB. Cette image sera recopiée à la fin du traitement. |
|||||||
| 71 72 73 74 75 76 77 78 79 |
movf sublw btfsc bcf ; movf sublw btfsc bsf |
T1s,W 0 STATUS,Z SwapLed,0 T1s,W 5 STATUS,Z SwapLed,0 |
La variable T1s est recopiée
dans le registre W W = 0 - W. On ne cherche à savoir que si le résultat de l'opération est nul. Si le résultat de l'opération est différent de 0, on saute l'instruction suivante. T1s = 0, on éteindra ultérieurement la led des secondes. La variable T1s est recopiée dans le registre W W = 5- W. On ne cherche à savoir que si le résultat de l'opération est nul. Si le résultat de l'opération est différent de 0, on saute l'instruction suivante. T1s = 5, on allumera ultérieurement la led des secondes. |
||||
| On peut remarquer
que quelque soit le résultat des tests, ce segment de programme a
une durée de 8 cycles pour le µC. Le segment de programme suivant ( 84 à 91 ) est identique et assure le traîtement de la variable T1mn. Le segment ci-dessous assure le traîtement de l'horloge 250 Hz. Lors de chaque interruption, le bit est concerné est complémenté. |
|||||||
| 95 96 |
movlw xorwf |
0x20 SwapLed,F |
Seul le bit 5 du registre W
est à l'état 1. Un OU Exclusif est réalisé avec la variable SwapLed. Le bit 5 de SwapLed est donc complémenté, les autres bits sont inchangé. |
||||
Le
segment suivant a pour fonction de recopier les 3 bits associés
aux Leds et à l'horloge sur le PORTB. Les autres bits du PORTB
restent inchangés. |
|||||||
| 100 101 102 103 |
movf andlw iorwf movwf |
PORTB,W B'11011100' SwapLed,W PORTB |
Sauvegarde le contenu du PORTB
dans le registre W Forçage à 0 des bits 0, 1 (Leds) et 5 (Horloge) du registre W. Réalise un OU entre SwapLed et W. Les bits 0,1,5 sont affectés par leurs valeurs. Recopie SwapLED sur le PORTB (Les trois bits changent d'état en même temps). |
||||
| Gestion des variables du Temps. | |||||||
Les
trois variables se traitent de façon identique. Je ne commente
donc que le premier segment de programme. La variable T100ms est incrémentée
de 0 à 49. Comme a chaque passage il s'est écoulé
une durée de 2ms, entre deux remise à 0 de cette variable
il s'est écoulé 100 ms. |
|||||||
107 |
incf movf sublw btfss goto clrf |
T100ms,F T100ms,W 50 STATUS,Z FinT T100ms |
Incrémente
la variable T100ms Recopie le contenu de la variable T100ms dans le registre W W = 50- W. On ne cherche à savoir que si le résultat de l'opération est nul Si le résultat de l'opération est égal à 0, on saute l'instruction suivante Le résultat de l'opération est différent de 0, le traitement du temps est terminé C'est le 50 ème passage, la variable T100ms est forcée à 0. On va exécuter l'intruction suivante qui consiste à incrémenter la vaiable T1s. |
||||
| Validation de la prochaine interruption. | |||||||
| 134 | 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. | |||||||
| 137 à 140 | Le traitement de l'interruption est terminé. Les deux registres STATUS et W sont restaurés. | ||||||
| Retour d'interruption. | |||||||
| 142 | retfie | ||||||
| En gardant cette
structure, on peut donc rajouter les variables heure, jour, semaine sans
problème particulier. Pendant l'interruption de 2 ms, 2000 instructions peuvent être exécutées (hors sauts). Dans un prochain chapitre, je développerai la manière de traiter l'anti-rebond d'un bouton poussoir avec la même interruption. |
|||||||