Ecole Nationale d’Ingénieurs à Tunis TP N°1 : Microprocesseurs et Microcontrôleurs Elaboré par les élèves ingénieurs en 1AGE2: JELLALI Amal KALLELA Ichrak I.INTRODUCTION: 1. Présentation de ST Visual Develop: ST Visual Develop (STVD) fournit un environnement efficace et facile à utiliser pour le contrôle de bout en bout du développement d'applications: de la création et du débogage du code d'application à la programmation du microcontrôleur. STVD est fourni dans le cadre du jeu d'outils gratuit ST MCU, qui comprend également l'interface de programmation ST Visual Programmer et ST Assembler Linker. 2. Objectif de TP : Afin de se familiariser avec la programmation en assembleur d’un microcontrôleur de la famille STM8 à travers la réalisation d’un programme qui a pour but de faire clignoter une diode LED connectée à l’un des ports de microcontrôleur. II. Développement et exécution du code assembleur : Avant de pouvoir exécuter le code assembleur, il faut tout d’abord créer un workspace dans l’environnement STVD en suivant des étapes consécutives différentes. Remarque : avant d’écrire le programme en assembleur de clignotement de diode, on va tout d’abord tester l’assembleur ainsi que toute la chaine logicielle permettant d’obtenir le fichier binaire qui sera chargé dans la mémoire du microcontrôleur puis exécuter. 1 1. Test de l’assembleur [8]: ✓ Ouvrir le fichier main.asm ✓ Effacer son contenu et le remplacer par les lignes de code suivantes : 1 stm 8/ 2 3 segment ‘rom’ 4 5 boucle_infinie 6 nop 7 jra boucle _infinie 8 9 end 10 - stm8/ indique à l’assembleur qu’il s’agit d’instructions pour le processeur STM8. - le segment rom : adresses suivantes sur16 bits ; c’est une Mémoire programme. - boucle_infinie : un label représentant l’adresse de l’instruction qui suit. - nop : saut vers l’instruction suivante sans réaliser d’opérations. - jra : sauts inconditionnels dans la même section de la mémoire, vers une adresse appartenant à autre section de la mémoire. - la fin de programme doit être indique par la directive end. Toute ligne de code suivant cette directive est ignorée par l’assembleur. ✓ ✓ ✓ ✓ ✓ Dans le menu Build, cliquons sur Build Le message 0 error, 0 warning(s) s’affiche Connection de la carte STM8 Discovery à un port USB du PC Dans le menu Debug, cliquons sur Start Debugging Une fenêtre nommée Diassembly, reflétant le contenu de la mémoire programme à partir de l’adresse 0x6000 apparait ✓ Plaçons le curseur de la souris sur l’instruction nop, puis sur le menu Debug cliquons sur Set PC. ✓ On clique sur Ok à propos le message d’avertissement. 2 ✓ Une flèche jaune apparait devant l’instruction nop, tandis que la même flèche apparait dans la fenêtre Diassembly devant l’adresse où se trouve cette instruction. C’est en fait l’assembleur [8] a traduit le code source en code machine. ✓ Appuyons plusieurs fois de suite sur les touches Alt-F11 ; on observe alors l’exécution de la boucle infinie. 2. Allumage d’une diode LED : D’après le schéma de la carte STM8 Discovery, On a : ✓ Après avoir cliqué sur Stop Debugging dans le menu Debug, modifiant le code source précédant permettant de configure la ligne PD0 en sortie avant de rentrer dans la boucle infinie. 3 1 stm8/ 2 3 segment ‘rom’ 4 5 bset $5011,#0 6 7 boucle_infinie 8 nop 9 jra boucle_infinie 10 11 end - bset : permet de configurer la ligne PD0 en sortie avant de rentrer dans la boucle infinie. Il n’est pas nécessaire d’écrire la valeur 0 dans le bit du registre PD_ODR correspondant à cette ligne puisque ce bit contient déjà la valeur 0 lors de l’initialisation du MC. - $ : précédant l’adresse signifie que celle-ci est codée en hexadécimal. - # : indique une valeur immédiate. ✓ Cliquons sur Rebuild All puis Start Debugging. ✓ Plaçons le curseur sur l’instruction bset, cliquons sur Set PC. ✓ Appuyons plusieurs fois sur les touches Alt-F11. //vérifions que la LED s’allume. 3. Clignotement de la LED : Pour faire clignoter la LED, il faut insérer dans la boucle infinie permettant à chaque itération de complémenter l’état de la ligne PD0 du port D ; il s’agit de l’instruction bcpl (Bit Complement). 4 1 stm8/ 2 3 segment ‘rom’ 4 5 bset $5011,#0 6 7 boucle_infinie 8 nop 9 bcpl $500F,#0 10 jra boucle_infinie 11 12 end 13 L’instruction bcpl prend pour valeur 0 comme elle va donner son complément. ✓ Rebuild All puis Start Debugging ✓ Plaçons le curseur sur bset, puis cliquons sur Set PC. ✓ Appuyons sur les touches Alt-F11 //vérifier que la LED change d’état. 4. Exécution autonome du programme : Au lieu d’exécuter le programme en mode pas à pas, nous allons le laisser s’exécuter de manière autonome. C’est pour cela il faut ajouter le vecteur Reset à l’adresse 0x8000 de la mémoire flash du MC. ✓ Modifions le code source : 1 stm8/ 2 3 segment ‘rom’ 4 5 debut 6 bset $5011,#0 5 7 8 boucle_infinie 9 bcpl $500F,#0 10 jra boucle_infinie 11 12 segment ‘vectit’ 13 dc.1 {$82000000+debut} 14 15 end 16 - debut : label représentant l’adresse de début de programme utilisateur à l’adresse 0x8080. - {$82000000+debut} : directive permettant d’écrire le vecteur de RESET au début de segment vectit. - vectit : Table de vecteurs d’interruption. ✓ ✓ ✓ ✓ Quitter le mode débogage. Rebuild All. Revenir en mode débogage. Cliquons sur Run. //Vérifier que la LED semble alors constamment allumée EXPLIQUER POURQUOI ? - L’allumage constamment du LED est expliqué par l’élimination de l’instruction nop. 5. Temporisation d’allumage de la LED : ✓ ✓ ✓ ✓ ✓ ✓ Modifier le programme selon le listing suivant. Rebuild All. Start Debugging. Plaçons le curseur sur Bset. Set PC. Run. 6 1 stm8/ 2 3 segment ‘rom’ 4 5 debut 6 bset $5011, #0 7 8 boucle_infinie 9 Idw X,#$FFFF 10 boucle_temporisation 11 nop 12 decw X 13 jrne boucle_temporisation 14 bcpl $500F,#0 15 jra boucle_infinie 16 17 segment ‘vectit’ 18 dc.l {$82000000+debut} 19 20 end 21 - ldw : instruction permettant de charger la valeur initiale 0XFFFF dans le registre X du processeur. - decw : le registre X est décrémenté d’une unité à travers cette instruction. - jrne : instruction permettant de tester si le registre atteint sa valeur 0. - Si ce n’est pas le cas, un saut est effectué à l’adresse désignée par le label boucle_temporisation et l’instruction nop est à nouveau exécutée. //cette boucle prend fin lorsque le contenu du registre X prend la valeur. Exécution de l’instruction nop 0xFFFF = 65535 fois ; consommation autant de cycles d’horloge, ce qui permet de faire le retard souhaité. 7 III. Partie Questions : - Noter, en testant à nouveau le programme avec d’autres valeurs initiales pour le registre X, la plus petites valeur pour laquelle on a encore clignotement perceptible ? 3000 est la plus petite valeur pour laquelle on a clignotement perceptible de la LED. - Charger la valeur 0x004 dans le registre X. Après avoir assemblé le programme et être entre en mode débogage, afficher le registres du processeur en cliquant sur Core Register dans le menu View puis éxécuter le programme en mode pas à pas .Noter l’évolution de registre X ainsi celle du flag Z ? 8