Telechargé par mohamed.brahem166

compte-rendu-1-converti

publicité
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
Téléchargement