Cette rubrique PicTrain est assez nouvelle (deux mois) pour que vous puissiez aisément nous rattraper et sauter en marche ! Aujourd´hui à notre menu :
7.
7.1.
7.2.
7.3.
7.4.
 Deuxième APPLICATION : PICTRAIN1
   Résumé des épisodes précédents
   Le projet Pictrain1
   Définitions
   Le programme
7. Deuxième application : Pictrain1
7.1. Résumé des épisodes précédents
7.1.1. Introduction
Avertissement : cette série est la suite de l´introduction aux microP (pages 1 à 6), et ne reprend donc pas tout ce qui a déjà été dit. Il faut donc avoir lu (et si possible a peu près compris ) la première partie.
PTI+   Dans cette première partie, j´ai quelquefois utilisé des termes simplificateurs ou “imagés” pour certaines notions, dans le but de rendre la présentation plus vivante. À partir de maintenant, j´utiliserai les termes consacrés par l´usage, qui sont malheureusement souvent en anglais, mais cela est nécessaire — sinon vous ne comprendrez plus rien si vous allez par exemple vous informer sur Internet.
7.1.2. Les éléments constitutifs d´un microP
L´horloge : le fonctionnement d´un microP est “cadencé” par une horloge, qui dans notre cas est interne au microP et à la fréquence de 4  MHz. Un ‘tic´ d´horloge est appelé un “cycle d´horloge”.
Le programme : suite d´instructions exécutées par le microP et qui réalisent, si tout va bien, le but recherché dans le montage.
Les entrées-sorties : le microP communique avec l´extérieur par l´intermédiaire de “ports” (attention : nouveau terme pour designer les E/S, entrées-sorties).
Les registres : ce sont les mémoires de travail du microP, divisés en “registres spéciaux”, qui contiennent les valeurs de paramétrage du fonctionnement, et les “registres généraux” qui sont à notre disposition comme zone de manœuvre.
Le registre W : registre de travail, passage presque obligé de toute opération, car aucune instruction ne concerne deux registres généraux, mais toujours un registre général et W.
Les interruptions : le cours normal d´un programme peut être interrompu par des événements, qui déclenchent une séquence spécifique d´instructions avant de revenir au programme normal.
Les timers : registres spéciaux qui comptent les cycles d´horloge ; les timers provoquent une interruption lorsqu´ils passent par zéro (débordement).
7.1.3. Les interruptions
Un des concepts importants des microP est l´utilisation des interruptions.
Le déroulement d´un programme est essentiellement “linéaire”, c'est-à-dire que les instructions sont exécutées les unes après les autres dans l´ordre d´écriture, et même si nous disposons d´instructions nous permettant de se déplacer dans le programme (call, return, goto), tout ceci se passe sans en séquence et surtout sans interruption. Cette partie du programme est appelée dans nos projets BouclePrincipale.
Les interruptions sont un dispositif permettant de déclencher un autre traitement en fonction d´événements internes ou externes. Lorsque cet événement survient, la boucle principale est arrêtée, le traitement spécifique est activé et se déroule ; à la fin de ce traitement la boucle principale reprend son cours à l´endroit où elle s´était arrêtée.
Il existe un grand nombre d´interruptions possibles dans un microP, nous n´en utiliserons que deux pour l´instant : les timers.
Les timers sont des compteurs qui comptent les cycles d´horloge, de zéro jusqu´à 255 pour le Timer0 et de zéro jusqu´à 256 x 256, soit 65.536, pour le Timer1. Lorsque le timer arrive à ce maximum, il repasse à 0 et déclenche l´interruption correspondante.
Le traitement réel des interruptions est relativement complexe, mais il est toujours le même ; je l´ai donc “caché” dans notre fichier Param_Std_v1_0.inc ; dans nos programmes on ne retrouve donc que les sous-programmes spécifiques à ces interruptions.
7.1.4. Résumé des instructions rencontrées jusqu´ici :
Instruction Opérande Fonction
goto étiquette Déplace l´exécution du programme vers un autre endroit identifié par étiquette
call étiquette Appelle un sous-programme identifié par étiquette
return pas d´opérande Fin de sous-programme, le programme revient à l´instruction suivant le call
btfsc registre, bit Test du bit bit dans le registre registre. Si le bit est à 0, on saute l´instruction suivante, sinon on l´exécute
btfss registre, bit Test du bit bit dans le registre registre. Si le bit est à 1, on saute l´instruction suivante, sinon on l´exécute
movlw littéral Chargement de la valeur (le littéral) dans W
movwf registre Copie du contenu de W dans le registre registre
bsf registre, bit Met à 1 le bit bit dans le registre registre
bcf registre, bit Met à 0 le bit bit dans le registre registre
xorwf registre, destination OU exclusif entre W et le registre, le résultat est dans W si destination = ‘w´, ou dans le registre si destination=´f
decfsz registre, destination Décrément du registre, le résultat est dans W si destination = ‘w´, ou dans le registre si destination=´f´, et saut de l´instruction suivante si le résultat est zéro
clrf registre Met tous les bits du registre à zéro
7.1.5. Ordre et méthode
Dans tout ce qui concerne le petit train, vous procédez avec ordre et méthode (du moins en principe…).
Ici aussi, les mêmes principes s´appliquent. On a déjà vu l´importance des commentaires (après le ; point-virgule), on va maintenant définir quelques principes s´appliquant au “nommage”. (Oui, je sais, ce terme est horrible, mais son utilisation est consacrée dans l'environnement des programmeurs, de l´anglais naming, et cela consiste à définir des règles pour la construction des noms, ou conventions de nommage – naming rules.)
FAQ   Ah, là, là, marre de l' anglais ! JIDÉ : Oh, ça n'est rien... 30 pour cent de nos mots d'informatique viennent de l'anglais, et alors ? Pour les amateurs d'opéra, c'est 60 pour cent d'italien ; pour les aficionados des corridas, c'est 95 pour cent d'espagnol... Quant aux fans de sushis, les pauvres, n'en parlons même pas. Non, croyez-moi, on n'a pas à se plaindre...
Dans la programmation de nos microP, il n'y a que quelques éléments que nous pouvons nommer comme nous le souhaitons :
Les étiquettes : endroit du programme où l´on saute par un goto ;
Les sous-programmes : appelés par un call ;
Les registres : les registres généraux que nous utilisons dans nos programmes ;
Les entrées/sorties, qui sont les bits du registre GPIO.
PTI+   Naming encore, mais là c'est les programmeurs de chez Microchip qui ont fait le travail pour nous, pour les registres spéciaux, tels GPIO ou T1CON, et les bits de ces registres, tels GIE ou GPIF... Tous ces noms de baptême sont connus de MPLAB uniquement car ils figurent dans le fameux fichier p12F675.inc que nous lui indiquons à chaque début de programme (fichier qu'on peut aller lire sans problème, note pour les curieux, mais pas modifier).
La structure des noms est relativement libre, à condition de ne pas oublier les règles suivantes :
Pas de caractères accentués : nous sommes dans un univers anglo-saxon, ils ne savent pas ce que c´est que àéîöù  ;
Pas de caractères spéciaux : c´est très joli d´avoir des % ou des & dans les noms, mais en général nos machines n´aiment pas beaucoup. Le seul utilisé (utilisable) est le _ (underscore ou espace souligné, celui qui est sous le 8 de votre clavier), à ne pas confondre avec le – (tiret) qui, lui, est interdit. Attention, pas non plus d´apostrophes (’) en forme de virgule, ce que certains traitements de texte ajoutent gentiment sans qu'on leur demande.
Dans nos programmes, pour s´y retrouver un peu plus facilement, nous allons donc définir une règle de construction de ces noms, en identifiant chaque catégorie par un préfixe  :
ET_ pour une étiquette : ET_xxxxxxxxxxxxxxxx
SP_ pour un sous-programme : SP_xxxxxxxxxxxxxxxxxxx
VA_ pour une variable (registre) : VA_xxxxxxxxxxxxxxxxxxxxxx
IO_ pour une entrée-sortie : IO_xxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxx étant le nom que nous avons choisi, dans les règles définies ci-dessus.
PTI+   Noms et adresses. — Il faut bien comprendre que tout cela n´est qu´une “facilité” proposée par le logiciel de programmation (nommé MPLAB). In fine, dans notre microP, il ne reste plus qu´une suite de bits, d´octets, définissant des adresses et des instructions.
C´est MPLAB qui transforme les noms en adresses, par exemple le registre GPIO est à l´adresse 05. Donc quand j´écris dans mon programme “bsf GPIO,2”, qui veut dire “mettre à 1 le bit 2 du registre GPIO”, MPLAB met donc simplement à 1 le bit 2 de l´adresse 05.
Traduit en langage machine dans notre microP, cette instruction devient 0101 010 0000101, qui signifie :
0101 = code pour l´instruction ‘bsf´
010 = 2e bit
0000101 = de l´adresse 05
Heureusement que nous avons MPLAB pour faire ce travail à notre place !
Notre projet de ce jour, testé dans des conditions d'esthétique douteuses
mais ça marche, bien sûr !
7.2 Le projet Pictrain1
7.2.1. Cahier des charges
(On appelle “cahier des charges” la description des fonctions que doit remplir un montage.) On va faire très simple ici, et à la limite cela ne sert à rien de plus que ce que font nos 555, il s´agit juste de faire une révision générale de tout ce que nous avons déjà vu, et aussi de voir comment, pas à pas, on écrit un programme.
Le montage comprendra donc deux boutons poussoirs, reliés à la masse et aux pattes 2 et 3 du microP, une led et une résistance en série de 470 ohms entre la patte 7 du microP et la masse, sans oublier un petit condensateur de 10 µF en parallèle sur l´alimentation du microP, pattes 1 et 8.
Difficile de faire plus simple, et c'est le premier programme de nombreux livres sur les PIC... Que fait le montage ? Pas grand-chose :
Au départ, la led est éteinte ; si on appuie sur le bouton 1 (patte 2, GP5), la led s´allume, et elle clignote.
Par appui sur le bouton 2 (patte 3, GP4), la led s´éteint et on se retrouve au début ; allumé, éteint, allumé...
Ça ne fait donc rien d'extraordinaire, mais c´est si joli !
7.2.2. Les préalables
La démarche que je vous propose est de refaire pas à pas toutes les étapes d´écriture du programme, en partant de zéro. Je ne fournis pas de fichier programme tout prêt, vous allez vous-mêmes rentrer tout ça dans MPLAB.
Il faut donc avoir installé MPLAB sur votre PC, et ouvrir en même temps cette page et MPLAB. Si vous avez un grand écran, ce sera plus simple !
Il est aussi préférable de créer tout de suite quelque part le répertoire qui va contenir notre projet, et d´y copier le fichier Param_Std_12F.inc que nous avons déjà utilisé pour le klaxon, et un “squelette” de fichier de programme appelé Pictrain1.asm
7.2.3. Création du projet
Au départ, si votre écran est assez grand, vous devriez avoir quelque chose comme ceci :
avec MPLAB à gauche, et Ptitrain à droite (vous avez le droit de les changer de côté).
7.2.4. On va donc d´abord créer le projet MPLAB :
1. menu Project, Project wizard… + suivant ;
2. step one : sélection du microP, dans notre cas 12F675 + suivant ;
3. step two : choix des outils, en standard MPASM toolsuite + suivant ;
4. step three : création du projet = choix du répertoire + nom du projet (ici je suppose PICTRAIN1) + enregistrer ;
5. suivant ;
6. step four : inclusion de fichiers, ici, comme vous avez en principe déjà copié les deux fichiers, vous pouvez les inclure dans le projet par double clic sur le nom.

7. suivant
8. dernière étape : summary : terminer
7.2.5. Voilà, votre projet est créé, même si le programme est vide pour l´instant. Si vous allez dans le répertoire du projet, vous y trouverez déjà trois fichiers supplémentaires.
Votre écran MPLAB se présente maintenant comme ci-contre .
Pour travailler, il suffit d´ouvrir (double-clic) le fichier Pictrain1.asm

On va maintenant écrire notre programme, et au fur et à mesure on va revoir toutes les notions des microprocesseurs que nous avons balayées durant la première partie.
PTI+   Majuscules et minuscules. — En standard, le logiciel MPLAB fait la distinction entre les majuscules et les minuscules, c'est-à-dire que ‘ET_BouclePrincipale´ n´est pas la même chose que ‘et_boucleprincipale´.
Si cette contrainte vous est gênante, il est possible de modifier ce contrôle : il faut aller dans le menu Project, puis Build options… puis Project ; ensuite, dans l´onglet MPASM Assembler, il faut cocher la case Disable case sensitivity. MPLAB ne tiendra plus compte des majuscules et minuscules.
Attention : cela n'est valable que pour un projet, il faudra le refaire pour chaque projet.
Note de Jidé : le plus simple encore sera de ne pas tenter le diable ! N'essayez tout simplement pas d'appeler une variable VitesseDuTrain et une autre, différente, vitesseduTrain et vous verrez comme tout ira bien...
7.3. Définitions
7.3.1. Commentaires et présentation
Tout programme doit comporter le maximum de commentaires, car sinon même vous ne vous y retrouverez plus. Un commentaire est tout ce qui se trouve après le ; (point-virgule) sur une ligne.
On peut donc avoir des commentaires n´importe où, lignes de commentaire “pures” ou commentaires après une instruction.
En général, on commence un programme en donnant quelques informations générales, auteur, date, version… comme par exemple ci-dessous :
J´en profite pour donner une autre recommandation : soyez “esthétique”, c'est-à-dire joli !
Faire joli dans les microP peut sembler curieux, mais regardez ces deux exemples : ceci
et cela
Ils font tous les deux strictement la même chose, mais je préfère nettement le premier. Si vous écrivez dans le style du deuxième exemple, je vous garantis que vous êtes complètement perdu après 15 lignes.
Voila ce que j´appelle “faire joli” !
7.3.2. Définitions générales
Au début du programme, on trouve un certain nombre d´indications sur la manière de programmer et d´utiliser le microP .
Je ne donne pas de détail, car ils n´ont pas d´importance au niveau Pictrain où nous nous trouvons, et ce sont toujours les mêmes lignes.
Attention cependant de ne pas se tromper dans la ligne __CONFIG, elle peut entraîner la destruction du microP.
PTI+   Horloge. — Vous savez déjà que le rythme dans notre microP est donné par une horloge interne, qui fonctionne à 4 MHz, et qu´il faut en général 4 cycles d´horloge pour une instruction.
Cette manière d´utiliser les microP est la plus simple, et sera toujours utilisée dans nos montages. Il faut cependant savoir que ce microP peut fonctionner jusqu´à 20 MHz (5 fois plus vite), avec un oscillateur (à quartz) externe.
Dans l´autre sens, on peut aussi le faire fonctionner plus lentement avec une horloge externe, jusqu´à 4 Hz par exemple, c'est-à-dire une instruction par seconde. Cela ne présente en général aucun intérêt, mais techniquement c´est possible.
Il n´y a que deux cas où cela peut être utile :
• si on fait fonctionner le microP moins vite, il consomme moins de courant, utile pour les systèmes sur piles ;
• la fréquence de 3.276.800 hertz est utilisée pour des systèmes devant donner une heure exacte (“horloge” au sens traditionnel).
7.3.3. Constantes et mnémoniques
Au début du programme, on peut aussi définir des constantes et des mnémoniques, qui seront utilisés plus loin dans le programme.
Pourquoi faire ? uniquement pour des raisons de lisibilité. Par exemple, lorsque nous utilisons dans notre programme Klaxon l´entrée-sortie 5 pour le bouton, nous écrivons GPIO,5. On peut aussi définir, au début du programme, que notre entrée s´appelle IO_Bouton_Declenchement, par :
Dans toute la suite du programme, nous utiliserons IO_Bouton_Declenchement à la place de GPIO,5, par exemple :
Dans cet exemple simpliste, l´intérêt semble minime, mais lorsque vous avez toutes les entrées-sorties utilisées, et que par ailleurs vous utiliserez des bits de registres généraux dans vos instructions, cela va vous simplifier la vie.
De même, on peut définir des constantes par la directive EQU (équivalence), c'est-à-dire que l´on va nommer des valeurs. Par exemple dans notre premier programme, klaxon, pour les valeurs qui nous permettent d´obtenir les bonnes fréquences, on pourrait définir :
Et lorsque l´on charge un registre, on aura :
au lieu de :
Ce ne paraît pas grand-chose mais, lorsque les constantes sont nombreuses, cela facilite aussi la lecture, et permet de regrouper toutes les constantes au même endroit, plutôt que de les disséminer dans le programme,et de faciliter la mise au point (et plus tard la maintenance) du programme.
J´en profite pour introduire une nouvelle norme (voir au début “Ordre et méthode”), les noms de constantes seront de la forme C_xxxxxxxxxxxxxxxx.
#define et EQU sont des directives à destination du logiciel MPLAB, qui dans le fond ne fait que remplacer dans le programme le nom ainsi défini par la valeur donnée au début. Ce ne sont donc pas des instructions, mais des facilités d´écriture.
PTI+   Instructions et directives. — Il faut bien faire la distinction entre “instructions” et “directive”.
Les instructions sont les “vraies” instructions, qui sont traduites en binaire et écrites dans le microP pour être exécutées par celui-ci.
Les directives ne sont que des “ordres” donnés au logiciel MPLAB :
• soit pour indiquer au logiciel ce que nous souhaitons faire ; exemple : la directive LIST p=PIC12F675 qui indique au logiciel que nous utilisons le microP de type 12F675 ;
• soit pour nous faciliter la vie, comme #define ou EQU
Revenons maintenant à notre programme. Nous avons défini au début trois entrées-sorties, les bouton sur les pins 4 et 5 et la led sur la pin 0, ce qui se traduit dans le programme par GPIO,0 GPIO,4 et GPIO,5.
En appliquant les principes ci-dessus, nous aurons donc :
Ainsi chaque entrée-sortie est maintenant identifiée par un nom plus explicite.
7.3.4. Variables
Ce programme très simple ne comporte pas de variable, c'est-à-dire d'utilisation d'un registre général. Cependant, voilà, ci-dessous , les principes de la déclaration :
CBLOCK 0x020 : cette directive signale le début de la définition des variables
VA_CPT_256 : 1 : définition d´une variable nommée VA_CPT_256
ENDC : directive de fin de la définition des variables
En application des conventions définies au début (par nous), le nom d´une variable commence toujours par VA_.
7.3.5. Fin des définitions
A la fin des définitions, nous trouvons l´inclusion du fichier standard
#include est également une directive, qui inclut à cet endroit le contenu du fichier Param_Std_v1_0.inc. Le contenu de ce fichier a été écrit spécialement pour nos applications Pictrain, et ne devrait intéresser que les puristes.
PTI+   Param_Std_v1_0.inc ? Sans rentrer trop dans les détails, ce fichier contient :
— La définition de variables standards. — La définition de BANK0 et BANK1. — Le démarrage du programme. — Le traitement des interruptions. — L´initialisation de l´oscillateur. — L´effacement de la mémoire. — L´initialisation des registres spécifiques.
Il est suffisant pour les projets simples que nous allons développer pour l´instant.
7.3.6. Rappel sur les sous-programmes
Le sous-programme est un élément clé de la structure des programmes, mais son principe en est simple : il s´agit d´une suite d´instructions que l´on veut exécuter plusieurs fois, à partir d´endroits différents de notre programme.
Un sous-programme est défini par son nom, SP_xxxxx (commençant par SP_ selon nos conventions), et se termine par return. Il est appelé par l´instruction call SP_xxxxx.
Dans notre programme Pictrain1, nous n´avons pas de sous-programme particulier, uniquement les deux sous-programmes standards appelés à chaque interruption de Timer0 et Timer1.
Nous n´aurons donc pas d´instructions call, qui se trouvent dans le fichier de paramètres, uniquement les deux étiquettes SP_inttimer0et SP_inttimer1.
7.4. Le programme
7.4.1. Structure du programme
Si vous avez créé le programme au fur et à mesure des étapes ci-dessus, et si vous avez inclu les lignes des deux sous-programmes inttimer0 et inttimer1, vous devez avoir ce résultat :

En appuyant sur la touche clavier F10 dans MPLAB, vous ne devez avoir aucun message d’erreur, le programme fonctionne. Mais pour l’instant, il ne fait rien ; il n’y a en effet aucune instruction réelle de traitement de quoi que ce soit.
Nous allons donc maintenant attaquer le programme proprement dit. Rappelez-vous qu’il y toujours deux parties dans un programme :
L’initialisation, effectuée une seule fois lorsque vous mettez le courant, et qui contient toutes la préparation et l’initialisation des variables ;
La boucle principale, c'est-à-dire la boucle de programme exécutée en permanence par le microP.
Dans nos programmes, nous appellerons toujours cette boucle ET_BouclePrincipale, il nous faut donc ajouter après l’include et avant les sous-programmes Timer les lignes :
Notre programme ne fait toujours rien, mais il s’organise. Nous retrouvons maintenant les trois parties principales :
Initialisation
Boucle principale,
Les sous-programmes, pour l’instant uniquement les sous-programmes des timers, mais vides (=ils ne font rien non plus).
Finalement, la programmation ne commence que maintenant, ce n’était que des préparatifs jusqu’à présent.
7.4.2. Initialisations : timer
Dans notre programme, nous voulons faire clignoter une led à une fréquence qui soit visible à l’œil nu. Nous allons donc bien entendu utiliser un timer, et cette fois-ci le Timer0 qui compte jusqu’à 255.
Vous voyez déjà la difficulté : si l'on a une interruption tous les 255 cycles d’horloge, la fréquence sera de 3.906 Hz, ce qui est loin du but recherché (trop rapide) .
Nous allons donc accompagner ce timer d’une nouvelle fonction : le pré-diviseur qui permet au compteur de ne compter (s’incrémenter) que tous les N cycles d’horloge, N pouvant varier de 2 à 256.
Je m’explique : si par exemple N = 4, le timer ne comptera que tous les 4 cycles d’horloge, et les interruptions se produiront à la fréquence de 1.000.000 / 4 / 256 = 976 Hz. C’est encore un peu élevé, nous allons donc utiliser N = 256, et nous aurons la fréquence de 1.000.000 / 256 / 256 = 15,25 Hz, qui est cette fois-ci compatible avec le but recherché.
Rappel : à chaque interruption, nous allumons (ou éteignons) la led (selon le cas), la fréquence visible sera donc 15,25/2 soit d’environ 8 Hz.
En d’autres termes, cela signifie que notre timer ne va plus s’incrémenter à chaque millionième de seconde (µs), mais toutes les 256 µs, et l’interruption se déclencher tous les 256 incréments, soit tous les 256 x 256  cycles d’horloge.
C’est ce N que l’on appelle la valeur du pré-diviseur. Vous avez suivi ?
Représentez-vous le principe du pré-diviseur comme certaines balances de cuisine, où vous pouvez choisir l’échelle de 0 à 100 g ou de 0 à 1  kg par exemple. Vous mesurez toujours les même carottes mais à des échelles différentes. Ici c’est pareil, on compte soit tous les cycles d’horloge (1 µs), soit dans notre cas par paquet de 256 cycles (256 µs), mais on ne fait que compter le temps à des échelles différentes.
Nous allons maintenant pouvoir initialiser les registres spécifiques à cette interruption :
Attention  BANK ! Rappelez vous que les registres spécifiques ne sont pas tous au même endroit dans le microP, et que pour certains il faut activer BANK1 avant deles utiliser ; c’est le cas ici du registre OPTION_REG, comme des registres TRISIO et WPU plus loin.
On initialise d’abord le pré-diviseur, par des bits dans le registre OPTION_REG selon les valeurs contenues dans ce tableau .
Dans notre cas, pour diviser par 256, il faut mettre à les trois bits (selon la dernière ligne du tableau ci-contre : 111).
Ensuite, on active les interruptions en mettant à le bit GIE du registre de contrôle des interruptions INTCON.
Toutes les autres interruptions sont désactivées (les autres bits de INTCON sont à ).
Attention : ici il ne s’agit que d’une préparation (initialisations), nous n’activons pas encore le Timer0, cela se fera par l’appui sur le bouton poussoir.
7.4.3. Initialisation : entrées-sorties
L’initialisation des entrées/sorties fait en général intervenir trois facteurs :
Le “sens” de fonctionnement, entrée ou sortie,
La présence de résistance de rappel,
L’initialisation (valeur initiale) des sorties.
Chacun de ces paramètres est indiqué dans un registre spécifique :
TRISIO pour le sens : en sortie, en entrée,
WPU pour les résistances : pour l’activation de la résistance (n’a de sens que pour les entrées),
GPIO : registre effectif des entrées-sorties.
Dans ces trois registres, les bits utilisés sont de 0 à 5, correspondant aux entrées GP0 à GP5. — Attention : GP3 est un peu particulière, elle ne fonctionne qu’en entrée (ne peut être utilisée en sortie), mais ne dispose pas de résistance de rappel !
On peut maintenant initialiser les entrées-sorties de notre montage  :
Avec ceci nous en avons terminé avec les initialisations...
7.4.4. Boucle principale
Dans ce montage élémentaire, la boucle principale ne fait que tester les boutons poussoirs, pour déclencher ou arrêter le clignotement de la led.
Si le clignotement est actif, il faut tester le bouton Arrêt, si le clignotement est inactif, il faut tester le bouton Marche.
Le clignotement est donné par l’interruption Timer0, on voit donc tout de suite le fonctionnement du programme :
Au départ, Timer0 est inactif, et on teste le bouton ‘marche’ dans la boucle principale ;
Si le bouton est activé, on met le timer en route (la led clignote) et on passe dans la boucle ET_Boucle_Marche ;
Dans cette boucle, on teste le bouton Arrêt :
— Tant que le bouton est inactif, on continue de tester le bouton Arret ;
— Si le bouton est activé, on arrête le timer, on éteint la led et on revient au tout début.
Remarque : comme dans beaucoup de montages électroniques, en général une entrée est dite active lorsqu’elle est reliée au 0 V (la masse) ; au repos elle est reliée au + 5 V, à cause de la résistance de rappel reliée au +5 V.
Voici le programme résultant  :
Il n’y a rien de neuf dans tout ça, cela devrait commencer à être limpide.
7.4.5. Sous-programme Timer0
Ce sous-programme est appelé à chaque interruption Timer0, c'est-à-dire toues les 65.536 microsecondes, et il ne fait que inverser la valeur de la sortie led. Il est donc tout simple  :
Notre programme est maintenant terminé, il faut l’écrire dans le microP pour le tester.
PTI+   Les instructions “move”. Nous avons maintenant passé en revue toutes les instructions move possibles, est vous avez dû vous rendre compte quemovfw XXXXX et movf XXXXX,w font la même chose, c'est-à-dire copier le contenu du registre XXXXX dans W.
En réalité, l’instruction movfw n’existe pas dans la réalité, ce n’est qu’une facilité de programmation, le logiciel MPLAB ne fait que la traduite en movf ...,w
Nous avons donc les instructions suivantes :
movlw : copie un littéral dans W
movwf : copie le contenu de W dans le registre
movf : copie le contenu du registre dans W (si ,w), ou dans le même registre (si ,f)
movfw : n’est pas une instruction, MPLAB le traduit en movf avec destination W.
Cette “pseudo-instruction” a été créée pour garder un peu de logique : avec movlw, movwf, movfw nous avons ainsi toutes les possibilités de copie, et movf n’est utilisé que pour tester la valeur zéro du registre.

Psi

10/11/07
N.B. — Textes, schémas, programmes © Psi pour Ptitrain. Photos Jidé ou D.R. quand signalé. — Toutes vos remarques et commentaires sont bienvenus, et les pages de Ptitrain ne sont pas statiques : les erreurs sont corrigées sitôt connues, les améliorations, éclaircissements, etc. feront l´objet de mises à jour fréquentes.
Ptitrain, l´e-magazine du train éclectique. — Directeur de la publication : Christophe Franchini.
Rédacteur en chef : Jean-Denis Rondinet