<< The Fribotte Homepage >>
Un club de passionnés en robotique participant à la coupe de France E=M6.
[Accueil] [Qui sommes-nous ?] [Robots] [Coupe e=m6] [BD Technique] [Forum] [Reportages] [Liens] [WiKiFri]

Fribotte

 

La Programmation des pics
par Bigonoff
Premiere partie - pic 16f84 - Révision 4

Téléchargement des fichiers originels ici
Publié le 26/10/2001

8. La simulation d’un programme (Suite)

Index coursIndex du cours
Chapitre précédent8. La simulation d’un programme
Chapitre suivant9. Le jeu d’instructions

 

8. La simulation d’un programme (Suite)
8.3 Lancement de la simulation

Et voilà, vous connaissez maintenant 4 des registres. Nous allons pouvoir commencer à simuler notre programme.

Sélectionner l’éditeur, par exemple, en cliquant une fois n’importe où dans notre fichier " essai1.asm ". Pressez <F6>, La ligne ...

  goto start ; Adresse 0: initialiser

... est maintenant sélectionnée. Vous avez en fait provoqué un Reset de votre programme. Rappelez-vous que cela provoque le démarrage à l’adresse 0x00. Vérifions donc :

  • Au dessus de la ligne sélectionnée, vous trouvez la directive " ORG 0x00 " qui précise que la ligne suivante est à l’adressse 0x00 : premier bon signe.
  • Ensuite, examinons PCL et PCLATH, tous deux à 0 : Donc, la prochaine instruction exécutée sera celle située à l’adresse 0x00. C’est tout bon.

Examinons la ligne en question. Elle nous dit que la prochaine instruction, après son exécution, sera celle située à l’adresse " start ". A ce stade, rappelez-vous que les commandes du simulateur ne sont actives que si la fenêtre de l’éditeur est active. Si vous cliquez hors de cette fenêtre dans les manipulations, n’oubliez pas de cliquer de nouveau à l’intérieur avant de lancer une commande. Pressez maintenant <F7>.

Votre programme est maintenant positionné sur la ligne qui suit l’étiquette " start ". Il a donc effectué un SAUT, ou encore, rupture de séquence.

start      
  clrf mavariable ; effacer mavariable

Rappelez-vous qu’à ce stade, l’instruction n’est pas encore exécutée.

Le PCL vaut maintenant :

PCL 33 51 00110011

soit 0x33, ou 51 décimal, ou encore B’00110011’

MPASM a donc calculé tout seul à quel emplacement se situe l’étiquette " start ". Si vous aviez voulu indiquer l’adresse vous-même, vous auriez dû compter toutes les lignes précédentes pour voir où vous en étiez. De plus, à chaque modification du programme, vous devriez recalculer toutes les adresses. Heureusement, MPASM le fait pour vous.

Pressez de nouveau <F7> pour exécuter cette instruction : Effacer mavariable. Comme mavariable vaut déjà 0, il ne se passe rien au niveau de celle-ci.

ATTENTION : à la mise sous tension, les cases mémoires (RAM) de la pic se trouvent à une valeur quelconque. Or, MPLAB ne peut savoir quelle est cette valeur. Il met donc par défaut 0. Si vous voulez qu’une case RAM de la PIC contienne effectivement 0, VOUS ETES OBLIGE DE LE FAIRE VOUS-MEME, sinon, le programme fonctionnera correctement sur simultateur, mais pas sur circuit réel. Et oui, une simultation, ça reste une simulation.

La ligne pointée alors est :

  incf mavariable,f ; incrémenter mavariable

Le PCL pointe alors sur :

PCL 34 52 00110100

C’est donc bien l’adresse suivante : pas de saut signifie pas de rupture de séquence, donc fonctionnement séquentiel du programme.

Profitons-en pour jeter un œil sur la fenêtre " Watch_1 ". Vous voyez votre variable " mavariable ". Sa valeur est 0x00 (ou H’00’), et son adresse est 0x0E. Pourquoi ?

Examinons la zone de déclaration des variables :

  CBLOCK 0x00C ; début de la zone variables
    w_temp :1 ; zone de 1 byte
    status_temp : 1 ; zone de 1 byte
    mavariable : 1 ; je déclare ma variable

La zone commence en 0x0C. La variable w_temp se trouve donc à cette adresse et comprend un octet. Status_temp est donc en 0x0D, et mavariable en 0x0E. C’est tout simple.

Pressons encore <F7>. La variable " mavariable " vaut maintenant " 0x01 ", car l’opération d’incrémentation a été exécutée. Vous l’avez déjà compris, l’exécution suivante va vous renvoyer à la ligne qui suit l’étiquette " boucle ". Amusez-vous à presser plusieurs fois la touche <F7> pour observer l’évolution de votre variable.

A ce stade, vous vous demandez ce qui va se passer lorsque votre variable atteindra la valeur 0xFF ? Bien entendu, vous n’avez pas envie de presser encore 500 fois la touche <F7>. On va donc accélérer le processus.

Allez dans le menu " windows " et sélectionnez " modify … ". Une fenêtre s’ouvre. Sélectionnez l’emplacement mémoire à modifier (mavariable). Cela peut être aussi un registre spécial, ou une case programme, etc. Sélectionnez " radix hexa " pour hexadécimal, Data pour " memory area " pour emplacement RAM et inscrivez " FF " dans la zone Data/Opcode. Remarquez qu’avec " End Address ", vous pouvez également remplir des tableaux. Pressez " Write ". et rangez cette fenêtre en dessous des 2 fenêtres de droite.

Examinez votre variable dans la fenêtre " watch_1 ". Elle est maintenant passée à 0xFF. Sélectionnez l’éditeur et pressez <F7> jusqu’à ce que la ligne suivante soit exécutée :

  incf mavariable,f ; incrémenter mavariable

La ligne suivante est maintenant sélectionnée :

  goto boucle ; boucler

Examinons ce qui s’est passé :

La variable " mavariable " est passée à 0. Logique, car 0xFF + 1 = 0x100. Or, 0x100 nécessite 9 bits (256). On obtiens donc 00 (et on reporte le bit 8).

Examinons maintenant le registre STATUS : que constate-t-on. ?

Les bits 2, 3 et 4 sont à 1, les autres sont à 0. Les bit 3 et 4 sont actifs à l’état bas (0). Comme ils sont à 1, ils sont donc inactifs.

Reste le bit2. Un coup d’œil sur le tableau 4-3 nous informe qu’il s’agit du bit Z (pour 0). Logique, car le résultat de l’opération est 0.

Si à ce niveau, vous vous demandez pourquoi le bit C (carry) n’est pas positionné, bravo, car vous vous posez les bonnes questions, puisque le résultat de la dernière incrémentation est B’00000000’ et on reporte B’1’. Mais alors, chapeau pour ceux qui ont pensé à vérifier le fonctionnement de l’instruction " incf " page 62. En effet, vous constaterez en vérifiant que le seul bit affecté (modifié) par cette instruction est le bit Z, à l’exclusion du bit C : " Status affected : Z ".

Nous allons clôturer par les autres méthodes d’exécution du programme par le simulateur. Pressez <F6> pour ramener le PC à 0. Dans le menu " Debug->run " vous trouvez toutes les méthodes possibles : essayez ceci :

  • Pressez <F9> pour lancer rapidement le programme sans visualisation. Pressez <F5> pour l’arrêter là où il est arrivé.
  • La même procédure avec <Ctrl><F9> vous donne une exécution animée, plus lente à l’exécution, mais qui vous permet de suivre l’exécution du programme.
  • L’avancée en pas à pas avec <F8> vous permet d’effectuer la même chose qu’avec <F7>, à la différence qu’une sous-routine, que nous verrons plus tard, est exécutée en une seule fois, comme si c’était une seule instruction. La touche <F7> entrera dans la sous-routine pour exécuter les instructions une à une.
  • Encore une autre méthode : Allez sur la ligne de votre petit programme :
  goto boucle ; boucler


Positionnez votre souris en début de ligne et cliquez avec le bouton de droite. Un menu apparaît. Vous pouvez mettre des points d’arrêt dans votre programme ou des points d’arrêt conditionnels (trace ou trigger). Vous pouvez également demander à votre programme de démarrer jusqu’au point spécifié (run to here).

Les différents paramètres et réglages se trouvent dans le menu " debug ". Avec le bouton de droite, donc, choisissez " break point ". Vous constaterez que votre ligne passe en rouge. Pressez <F6>, puis <F9>, le programme va s’exécuter jusque la ligne rouge, puis passer en stop. Voilà encore une nouvelle méthode pratique pour debugger les longs programmes.

Allez dans le menu " Debug " et sélectionnez " clear all points ". Répondez " OK " à la question. Le break point est maintenant supprimé. La ligne est repassée en noir. Notez que vous pouviez supprimer ce " break point " en choisissant une seconde fois l’option " break point " avec le bouton de droite (toggle).

Un dernier petit essai. Allez dans le menu " debug ", sélectionnez " clear all point " pour être sûr qu’il ne reste pas de points d’arrêt dans votre programme

Dans le même menu, choisissez alors " trace settings ". Une fenêtre s’ouvre :

La première case vous donne le nom de votre point d’arrêt de type " trace " Laissez le nom par défaut. Dans la seconde case, choisissez l’adresse de la zone à " tracer ". Indiquez ici votre étiquette " boucle ". Cliquez sur <Add>. Vous obtenez ceci :

 

Cliquez ensuite sur la ligne de la grande fenêtre pour la sélectionner. Le menu complémentaire " Address is Qualifier " en grisé est alors actif.Sélectionnez cette option, puis entrez " 50 " dans le compteur de passage " Pass Count ". Pressez ensuite le bouton <Set>.

Terminez en fermant la fenêtre avec <Close>. Vous venez de créer un compteur de passages avec arrêt automatique. Pressez <F6> puis <F9>. Le programme va alors tourner jusqu’à ce qu’il ait exécuté 50 fois la ligne qui suit l’étiquette " boucle ". Examinez alors votre variable. Elle vaut maintenant 0x32, c’est à dire 50. Enlevez tous les points d’arrêts (debug->clear all points.). Quittez MPLAB en répondant " Yes " à la demande de sauvegarde. Vous connaissez maintenant les principales commandes du simulateur (nous en verrons d’autre en temps utile).

 

Index cours
Index du cours
Chapitre précédent
8. La simulation d’un programme
Chapitre suivant
9. Le jeu d’instructions

 


Complétez cette page, posez vos questions et remarques ici : WiKiFri

Page http://fribotte.free.fr/bdtech/cours/pic16f84/PART1_cours08b.html modifiée le 14/10/2002.
Copyright fribotte@free.fr, libre de droit pour toute utilisation non commerciale.
Reproduction autorisée par simple mail