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 .

 

Retour                 Suite