Initiation électronique 31
Création d' un programme
Nous allons faire un premier exercice que l' on trouve sur de nombreux sites , faire clignoter une led .Je sais ce n' est pas nouveau mais cela permet de voir plusieurs commandes et de débuter avec la programmation .
Il faut ce forcer à le faire et que cela fonctionne car cela servira de base sur plusieurs pages .
Tout d' abord je vais reprendre comme répertoire de travail c:\progpic
, vous allez créer un sous répertoire led01
.
Il sera possible de télécharger cette exercice en fin de page sous
forme de
fichier zip .
Fonctionnement
Ce montage va nous permettre de faire clignoter une led rouge 5 mm allumé pendant 1 seconde et éteinte pendant 0.5 seconde .Nous allons utiliser la sortie RB0 , broche 6 pour alimenter la led avec du +5v , une résistance de 330 Ohms sera en série avec la led pour limiter le courant et la cathode de la led sera relié au moins du circuit .
Pour l' alimentation du montage nous devons utiliser la tension d'
alimentation du Pic 16F84 qui est de 5V ( 4V à 6V ) ,
seul le Pic 16LF84 peut utiliser une tension de 2V à 6V ,
voir Datasheet Microchip page 76 .
Pour ne pas avoir de surprises nous allons utiliser un régulateur 5V positif ( 7805 ).Et pour avoir une alimentation stabilisé continu nous ajoutons C1 et C2 .
Schéma du montage
Implantation
Programme
Le plus simple est fait , maintenant nous allons voir le programme en détail .
Vous avez créer un répertoire led01
dans c:\progpic
et nous allons créer un projet pour MPLAB appelé : led01.pjt
.
Je vous redonne encore la marche à suivre pour la configuration de
MPLAB :
Ouvrez MPLAB , dans le menu File cliquez sur New , une fenêtre s' ouvre
cliquez
dans File puis Save as et changez de répertoire en c:\progpic\led01
mettez comme nom de fichier " led01.asm
" et OK .Ensuite dans le menu Project " new project
" en file name mettez " led01.pjt
" .La fenêtre Edit Project s' ouvre sélectionnez le modèle de
Pic : 16F84A avec editor only .Puis cliquez sur Add Node ,
la fenêtre
s' ouvre et cliquez sur " led01.asm
" et OK et vous avez dans la fenêtre Edit project , project files les
deux
fichiers attachés au projet .Cliquez sur OK pour fermer la
fenêtre
.
Dans votre fenêtre c:\progpic\led01\led01.asm vous allez entrer votre premier programme .Ce programme est réduit au minimum et il servira de base pour les prochains .
Tout d' abord placez un commentaire pour indiquez le Nom ,Date et Auteur ainsi que le fonctionnement .
;********************************************************************
;
Nom:
led01
*
; Date:
09/04/2002
*
; Version:
1.0
*
; Circuit: led01 sur RB0 ,elle reste allumé 1s et éteinte
0,5s
*
; Auteur: Entrez votre nom adresse email
:
xxxx@xxxx
*
;********************************************************************
Ensuite vous utilisez l' instruction
List pour définir quel type de processeur ( Pic ) .
LIST
p=16F84a
; Définition de processeur
#include
<p16F84a.inc>
; Définitions de variables
l' instruction INCLUDE
indique à MPLAB
ou se
trouve les variables en fonction du pic utilisé .
Vous pouvez allez voir ce qui ce passe dedans en l' ouvrant avec MPLAB
( le
fichier 16f84.inc et 16f84a.inc sont identiques ). Une autre façon de
l' écrire
est : include " P16F84a.inc" .
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
; '__CONFIG' précise les paramètres encodés dans
le processeur au
;moment de la programmation du processeur. Les définitions sont dans
;le fichier include.
; Voici les valeurs et leurs définitions :
; _CP_ON Code protection ON : impossible de relire
; _CP_OFF Code protection OFF
; _PWRTE_ON Timer reset sur power on en service
; _PWRTE_OFF Timer reset hors-service
; _WDT_ON Watch-dog en service
; _WDT_OFF Watch-dog hors service
; _LP_OSC Oscillateur quartz basse vitesse
; _XT_OSC Oscillateur quartz moyenne vitesse
; _HS_OSC Oscillateur quartz grande vitesse
; _RC_OSC Oscillateur à réseau RC
Pour la configuration automatique d' ICPROG nous utilisons la
commande Config
. Si votre programme pour piloter le programmateur met un message d'
erreur il
suffit de mettre un point virgule devant pour annuler cette commande .
Une autre façon de l' écrire est : __config H'3FF2'
ou
__config B'11111111110010' , pour plus de détails voir le Datasheet du
Pic
16F84 page 39 .
Ensuite nous avons la zone Define
ou Définitions ,
nous n' avons rien dedans pour ce programme .
;********************************************************************
;
DEFINE
*
;********************************************************************
Voici maintenant la déclaration des variables à placer dans la RAM .
La
zone de variable commence à l' adresse 0C pour un Pic 16F84A et
contient 68
emplacements mémoire. Pour ne pas avoir à chercher des emplacements
libres ou
à faire des superpositions lors de modifications une autre méthode sera
utilisé dans l' exemple led02 .
L' instruction EQU ( égal à ) suivi de la valeur en Hexadécimale
de l'
adresse est attribué à la variable cmpt1 .
;********************************************************************
; DECLARATIONS DE
VARIABLES
*
;********************************************************************
cmpt1
equ
0x0c
; compteur de boucles 1
cmpt2
equ
0x0d
; compteur de boucles 2
cmpt3
equ
0x0e
; compteur de boucles 3
Après un reset ou une mise sous tension , le Pic démarre toujours
à l'
adresse 0 ou en Hexa 0x00 = 0x000 .
La directive ORG 0 précise que les instructions du programme
commencerons
à partir de l' adresse 0 .
;********************************************************************
;
DEMARRAGE SUR
RESET
*
;********************************************************************
org
0x000
; Adresse de départ après reset
La séquence d' initialisation est la plus importante car elle va
déterminer
comment les entrées et sorties vont être programmé dans le Pic .Un Pic
16F84A
a 12 entrées / sorties , mais elles ne sont pas toutes identiques . Je
ne rentre
pas encore dans le détails mais pour notre exemple nous allons prendre
comme
sorties TOUT le port B soit : RB0,RB1,RB2,RB3,RB4,RB5,RB6,RB7.
Nous commençons par initialiser le Port A et le Port B , c'est à dire
nous
utilisons l' instruction CLRF ( Clear F
) qui met
à 0 l' emplacement mémoire donc CLRF
PORTA
met tout le PortA à 0 et idem pour PortB .
Maintenant si vous voulez que certains Ports soit des entrées et
d'
autres des sortie il faut mettre des 0 et des 1 pour définir sont choix
;
chaque bit positionné à 1 configure la broche du circuit en entrée ; et
donc
un 0 pour une sortie .
;********************************************************************
;
INITIALISATIONS
*
;********************************************************************
clrf
PORTA
; Sorties portA à 0
clrf
PORTB
; sorties portB à 0
nous reviendrons plus loin sur les instructions suivantes .
bsf
STATUS,RP0 ; sélectionner banque 1
movlw
b'00000000' ; configure le
portB en SORTIES
movwf TRISB
bcf
STATUS,RP0 ; repasser banque 0
goto
start
; sauter au programme principal
Une fois la séquence d' initialisation fini nous avons l'
instruction Goto
( aller à ) start . Start est une étiquette qui ce trouve
dans la
1er colonne de votre programme et un goto permet de sauter jusqu' a une
étiquette en avant ou en arrière dans votre programme . Ce qui fait que
lors
du déroulement du programme il va y avoir un saut jusqu' a start et le
chapitre
ci dessous temporisation sera sauté .
;********************************************************************
;
TEMPORISATION de 0,5
Secondes
*
;********************************************************************
Nous reviendrons aussi plus tard sur le mécanisme de tempo .
tempo
movlw
2
; pour 2 boucles
movwf
cmpt3
; initialiser compteur3
boucle3
clrf
cmpt2
; effacer compteur2
boucle2
clrf
cmpt1
; effacer compteur1
boucle1
nop
; perdre 1 cycle
decfsz
cmpt1 , f
; décrémenter compteur1
goto
boucle1
; si pas 0, boucler
decfsz
cmpt2 ,
f
; si 0, décrémenter compteur 2
goto
boucle2
; si cmpt2 pas 0, recommencer boucle1
decfsz
cmpt3 , f
; si 0, décrémenter compteur 3
goto
boucle3
; si cmpt3 pas 0, recommencer boucle2
return
; retour de la sous-routine
;********************************************************************
; PROGRAMME PRINCIPAL *
;********************************************************************
Nous somme arrivé à start que j' aurai pu appelé aussi DEBUT
ou
debut voir dfre021 .
start
movlw b'00000001'
; mettre la valeur 1 dans W
movwf
PORTB
; mettre w dans le portB, allume la led
call
tempo
; appeler la tempo de 0.5s
call
tempo
; appeler la tempo de 0.5s
clrf
PORTB
; mettre à zero le portB
call
tempo
; appeler la tempo de 0.5s
goto
start
; boucler
end
Le programme principale va nous permettre d' expliquer les
instructions que nous n' avons pas vu dans la procédure d'
initialisation MOVLW
( Move Literal to W ) b'00000001' ou place la
valeur
b'00000001' dans W , W est un registre qui sert pour les calculs
, c' est
le registre de travail est de nombreuses instructions l' utilise .
Une fois placé la valeur 1 dans W , nous avons l' instruction MOVWF
( Move W to File ) PORTB ou place W dans un emplacement mémoire ,
ici
PORTB .
Le fait de placer la valeur 00000001 sur le PORTB donne sur les broches
du Pic
un 1 sur RBO ; en effet il faut partir de la droite vers la gauche et
nous avons
RB0 = 1 , RB1 = 0 , RB2= 0 .... RB7 = 0 . Donc la led reçoit du
+5v et s'
allume .
Ensuite viens l' instruction CALL ( CALL
subroutine
) TEMPO ou SAUT inconditionnel vers un
sous
programme , le sous programme ici tempo
doit
ce terminer par RETURN . Un call appelle
un sous
programme et une fois fini l' instruction return fait revenir le
programme
à la ligne suivante du call , cela permet d' avoir un programme
principale
et d' appeler plusieurs fois des sous programmes .
CLRF PORTB fait une remise à zéro du PortB donc toutes les sorties
repassent
à zéro et la led qui se trouve sur RB0 s' éteint . Goto
Start
fait sauter le programme à Start et ainsi nous avons une boucle
sans fin
.
L' instruction END indique la fin du
programme pour
MPLAB .
Vous pouvez maintenant faire une tentative de compilation de
votre
programme dans le menu Project et Built
all
ou CTRL + F10 .
Et bien voici les fichiers led01
zip à extraire en c:\ ; ils ce placent alors dans
c:\progpic\led01 .
Dernière mise à jour le 12/04/2002 .