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 :

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 du temps réel

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é :
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)
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.
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
108
109
110
111
112

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.
 
Accueil
Une question ? Écrivez-moi ...