Utilisation des boucles pour creer des retards
Les mots ecrits en vert sont explicités à la fin de la page.
Exemple n°2: clignotement d'une LED en creant des retards dans le PIC
Voici
le schema de cablage, vous pouvez réaliser ce petit montage
sur plaquette d'essais:
Explications
et conseils: C3, C4, et le Quartz 4MHz servent pour l'horloge du
PIC
C2 sert à découpler l'alimentation (alim plus
stable).
N'oubliez pas de relier la patte RESET au
+5V.
Attention l'alimentation doit etre de bonne qualité
et valoir de 4.5V à 5.5V
La norme voudrait qu'on relie
toutes les entrées inutilisées à un potentiel
(masse ou +5V). C'est à faire si vous voulez que le PIC
consomme moins ...
Le
cablage sur plaque d'essais:
(remarque:
le composant que vous voyez en haut à gauche est un
regulateur de tension. Il n'est pas necessaire, dés
l'instant ou votre alim sort du +5V d'une qualité correcte)
Vous pouvez cliquer ici pour telecharger le programme (au format .asm. Il faudra le compiler avec MPASM. Regardez les pages precedentes pour plus d'informations)
list p=16f84,f=inhx8m __config B'11111111110001' #include "p16f84a.inc" temp1 equ H'0C' temp2 equ H'0D' bsf STATUS,RP0 movlw B'11111110' movwf TRISB bcf STATUS,RP0 clrf temp1 Debut movlw D'244' movwf temp2 Boucle nop decfsz temp1,1 goto Boucle decfsz temp2,1 goto Boucle comf PORTB,1 goto Debut end |
Principe de fonctionnement du programme:
Le cycle d'horloge, c'est a dire le temps pour executer une ligne est d'1µs (0.000001s)
Le temps d'attente
entre chaque changement d'etat de la LED est donc:
(1 + 1 +
2)µs * 256 * 244 = 0.2498 secondes = 0.25 secondes.
le
premier "1" est pour le nop
le second "1"
est pour le decfsz temp1,1
le "2" est pour le goto
Boucle, en effet les instructions goto prennent 2µs
ce
retard est executé "256" fois.
toutes les 256
fois, on decremente temp2 qui a ete initialisé à
244.
le retard est donc executé "256 * 244"
fois.
Notez que le calcul est approximatif, mais tout de
meme tres proche de la realité. En effet, toute les 256
fois, le temps de retard n'est pas le meme.
Détaillons la fonction de chaque ligne de ce programme:
list p=16f84,f=inhx8m: permet de dire au compilateur le type de PIC utilisé (16F84), et indique le format de fichier.
__config B'11111111110001': configure le PIC pour que le code ne soit pas protégé, on utilise la temporisation de démarage, on n'utilise pas le chien de garde, et oscillateur à quartz.
#include "p16f84a.inc": Ce fichier qui est fournit avec le compilateur de Microchip contient la définition des instructions que vous écrivez. Grace à ce fichier, le compilateur va pouvoir traduire les insctruction que vous écrivez en chiffres comprehensibles par le PIC.
temp1
equ H'0C':
Définition d'une variable: temp1 est le nom de la variable;
H'0C' est l'adresse de la RAM à laquelle est stockée
cette variable. A chaque fois que le PIC aura a faire avec cette
variable, il modifiera le contenu a l'adresse 0C de la RAM.
Par
exemple lors de l'execution de l'instruction "movwf temp1"
le PIC va mettre le contenu de la variable W à l'adresse
H'0C' de la RAM.
temp2 equ H'0C': Définition d'une variable: temp2 est le nom de la variable; H'0D' est l'adresse de la RAM à laquelle est stockée cette variable. A chaque fois que le PIC aura a faire avec cette variable, il modifiera le contenu a l'adresse 0D de la RAM.
bsf STATUS,RP0: Sert à choisir la zone memoire n°1 (page 1). Cette zone memoire contient un certain nombre de registres de configuration (= variables pour configurer le PIC). En clair, pour pouvoir configurer le PIC, il faut generalement passer dans la zone memoire n°1 (bank 1), car c'est la que se trouvent la majorité des registres de configuration.
movlw
B'11111110': On transfert la valeur
binaire 10000111 dans le registre de travail W.
Je rapelle que
W est une variable "à tout faire". C'est par
exemple elle qui sert à transferer une valeur dans une
variable.
movwf
TRISB: On met W dans TRISB.
Cette
variable permet de définir quelles pattes sont en entrée,
et quelles pattes sont en sortie. Le port B
comporte 8 pattes (n°6 à n°13), Chaque bit de TRISB
à 1 configure une patte en entrée, et chaque bit à
0 configure une patte en sortie. Ici, seul la patte 6 (bit 0 de
port B) est en sortie. C'est sur cette patte qu'on branche la
LED.
Notez que par defaut toutes les pattes du port A et B sont
configurées en entrée (TRISB vaut B'11111111' par
defaut).
bcf STATUS,RP0: Maintenant que toutes les configurations sont finies, on repasse dans le zone memoire n°0, et on va commencer le programme en lui meme.
clrf temp1: met à zero la variable temp1: 0 -> temp1.
Debut:
C'est un label. On pourrait le comparer à une borne
kilometrique qui sert à savoir à quel endroit on est
sur une route.
Dans le cas du PIC, le label sert à
reperer un endroit du programme.
On s'en sert pour executer
directement la partie de programme qui suit, sans executer la
partie concernant les interruptions. S'utilise avec l'instruction
goto Debut
Le nom "Debut" est donné par le
programmeur, on aurait pu mettre "fleur", ou ce que vous
voulez!
movlw
D'244'
movwf
temp2: On met la valeur 244 dans la variable temp2. La
variable temp2 permet d'executer 244 fois un retard de 256 * 4µs
avant de faire changer d'etat la LED. Une fois que la LED a changé
d'etat, il faut donc reinitialiser la variable temp2 à la
valeur 244.
Boucle: C'est un label. Il sert à reperer un endroit du programme.
nop: simgnifie "no operation". C'est une instruction qui ne fait rien. En fait elle permet d'occuper le processeur, donc de creer un retard. Comme le temps de cycle est 1µs, ce retard sera d'1µs.
decfsz
temp1,1
goto
Boucle:
décremente la valeur la variable temp1 (qui vaut 0
la premiere fois). Si apres
la decrementation temp1
n'est pas nulle, le programme execute l'instruction suivante, donc
retourne au label Boucle. Sinon, le "goto Boucle" est
sauté, et c'est la commande qui suit qui est
executée:
remarque, le ",1" a la fin de decfsz
signifie qu'on met le resultat de l'operation dans temp1. Si on
mettait decfsz temp1,0, le resultat serait mis dans W
decfsz
temp2,1
goto
Boucle:
décremente la valeur la variable temp2 (qui vaut 244
la premiere fois). Si apres
la decrementation temp2
n'est pas nulle, le programme execute l'instruction suivante, donc
retourne au label Boucle. Sinon, le "goto Boucle" est
sauté, et c'est la commande qui suit qui est executée:
comf
PORTB,1: permet d'inverser l'etat des
sortie du port B. Toutes les sortie
qui etaient à 0 passent à 1, et toutes les sorties
qui etaient à 1 passent à 0.
Dans notre cas,
seule la patte 6 du PIC changera d'etat.
goto Boucle: retourne au label "Boucle" (voir plus haut). le programme tourne donc en rond.
end: Il est indispensable pour le compilateur.
Pour
bien assimiler le fonctionnement du programme, voici un petit
résumé du fonctionnement:
~
Supposons que la LED soit eteinte.
~ Pendant 0.25 secondes, le
PIC va executer l'instruction goto Boucle, ... .
~ Au bout de
ces 0.25 secondes, la temporisation est finie, et le PIC va allumer
la LED
~ Le PIC va de nouveau executer l'instruction goto Boucle
pendant 0.25 secondes.
~ la LED va s'eteindre.
~ Et ainsi de
suite.
Commentaires:
C'est
une methode simple pour faire une temporisation, mais nous verrons
qu'il y a beaucoup mieux dans l'exemple3.
Quelques définitions:
temporisation de démarage: le PIC attend 72 mS avant d'executer le programme lorsqu'on l'allume. Ceci permet d'attendre la stabilisation de l'oscillateur.
Chien de garde (WDT): C'est une fonction du PIC qui permet de savoir si une instruction dure "trop" longtemps (peut etre désactivé).
Oscillateur à quartz: voir le schema. Pour fonctionner, le PIC a besoin d'une horloge, et là l'horloge est réalisée avec un quartz 4 Mega Hertz et deux condensateurs.
Configurer le PIC: Lorsqu'on configure le PIC, on dit quelles pattes sont en entrée, quelles autres sont en sortie, ....
PORTB: c'est un registre (variable) de 8 bits qui contient les etats des sorties du pic. Par exemple si PORTB = B'00010011', les sorties 1, 2, et 5 (pattes 6, 7 et 10) sont au niveau logique "1", les autres sont à zero.
Ecrivez nous: xizard@enib.fr et rbourdon@enib.fr