Vous êtes sur la page 1sur 67

Mini projet Microcontrleur ST7

Mini Projet
Microcontrleur ST7
Eric RICHARD
Fvrier 2006

-1-

Mini projet Microcontrleur ST7

-2-

Mini projet Microcontrleur ST7

SOMMAIRE
Chapitre 1 Introduction ........................................................................................................... 5
Chapitre 2 Dcouverte du C et de l'IDE................................................................................ 6
Chapitre 3 Premiers pas ......................................................................................................... 17
Chapitre 4 La maquette de dveloppement............................................................................ 25
Chapitre 5 Les LEDs .............................................................................................................. 27
Chapitre 6 Les afficheurs 7 segments.................................................................................... 29
Chapitre 7 Les interruptions .................................................................................................. 31
Chapitre 8 Le timer ................................................................................................................ 33
Chapitre 9 Le convertisseur analogique-numrique ............................................................ 36

Annexe 1
Annexe 2
Annexe 3
Annexe 4

ST7LITE2.ASM
SQUELET.ASM
Crer un projet ST7 en 10 leons
Rsum du jeu d'instructions du ST7

-3-

Mini projet Microcontrleur ST7

-4-

Mini projet Microcontrleur ST7

Chapitre 1 Introduction
Les objectifs de ce mini-projet sont les suivants :
tudier le fonctionnement d'un microcontrleur 8 bits, le ST7FLITE20 (rfrence
complte ST7FLITE20F2B6) de la famille ST7 de ST Microelectronics,
tudier un environnement de dveloppement de programmes crits en assembleur.
Cet environnement est un IDE (Integrated Development Environment) et intgre tous
les outils de dveloppement d'un logiciel embarqu (gestionnaire de projet, diteur
avec coloriage syntaxique, assembleur, diteur de lien, dbogueur symbolique, carte
de dveloppement du ST7),
tudier une carte d'apprentissage (Training board) comportant diffrents modules
(LED, afficheur 7 segments, bouton poussoir, moteur, ), grs par le
microcontrleur.
Au cours de ce mini-projet , vous dvelopperez tout d'abord des petits programmes mettant
en uvre les diffrents constituants de la carte. Cela vous familiarisera avec le ST7, sa
programmation et son environnement de dveloppement.
Ensuite, vous raliserez un projet complet mettant en uvre les diffrents programmes que
vous aurez dvelopps dans la premire partie.

-5-

Mini projet Microcontrleur ST7

Chapitre 2

Dcouverte du C et de l'IDE

1) Prsentation du microcontrleur
Un microcontrleur est un microprocesseur autour duquel ont t rajouts des priphriques
et de la mmoire.
Pour le ST7FLITE20, la mmoire prsente est de type :
Flash (8 ko) pour la mmoire programme,
RAM (384 octets) dont 256 octets pour les donnes et 128 octets pour la pile.
Les priphriques sont :
Un watchdog,
Un timer "auto-reload" 12 bits,
Un timer 8 bits (Lite Timer 2),
Un port d'entres/sorties 8 bits (PORT A),
Un port d'entres/sorties 7 bits (PORT B),
Un port srie synchrone (SPI),
Un convertisseur analogique-numrique 10 bits, 7 voies.

Les diffrentes entres/sorties des priphriques du contrleur sont multiplexes (Cf


synoptique ci-dessus). Avec ces ports, il est capable de recevoir des interruptions externes.
-6-

Mini projet Microcontrleur ST7


Le CPU est architectur autour d'un bus interne de donnes de 8 bits et d'un bus interne
d'adresse de 16 bits. II contient 6 registres :
un compteur ordinal PC (16 bits),
un accumulateur A (8 bits),
deux registres d'index X et Y (8 bits),
un registre d'tat CCR (8 bits),
un pointeur de pile SP (16 bits).
L'utilisation de ces registres est explique dans la documentation technique du composant.
La mmoire contient la fois le programme, qui dfinit ce que le CPU doit faire, et les
donnes, qui sont stockes temporairement comme des rsultats intermdiaires de calcul ou
qui contiennent 1'tat gnral du systme.
Dans les systmes contrleur, contrairement aux ordinateurs qui utilisent uniquement de
la RAM, diffrents types de mmoires sont utiliss selon leur fonction : la mmoire non
volatile lecture seule pour le programme (ROM ou Flash), la mmoire volatile lecture
et criture pour les donnes temporaires (RAM). Cependant vue du programmeur, la
mmoire forme un unique espace adressable selon la thorie de Von Neumann, comme le
montre la figure suivante :

On peut voir dans cette structure trois espaces RAM diffrents. Le premier (Short
Addressing RAM) est appel galement page 0 et peut s'adresser uniquement avec 8 bits, ce
qui amliore les temps d'accs cette zone mmoire. Le second (16-bit Addressing RAM)
ncessite des adresses sur 16 bits. Le troisime correspond la pile (Stack).
-7-

Mini projet Microcontrleur ST7

La pile se trouve aux adresses mmoire de $0180 $01FF. L'instruction RSP, au dbut du
programme (voir fichier SQUELET.ASM en annexe 2), permet de remettre le pointeur de
pile sur 1'adresse $01FF. II ne faut pas enlever cette instruction.
Les priphriques sont dsigns par un nom et correspondent en ralit 1'accs des
registres particuliers se trouvant dans les adresses mmoire de $0000 $007F. Le fichier
ST7Lite2.ASM, fourni pour la ralisation de vos programmes (cf Annexe 1), contient la
dclaration des noms des registres, ce qui facilite la programmation.
Les vecteurs d'interruption se trouvent la fin de la mmoire programme. Ils dfinissent
les adresses des sous-programmes excuter lorsqu'une interruption arrive. Par exemple
1'interruption due au Reset du contrleur est lie 1'adresse du dbut du programme
excuter. Ainsi, ds que le contrleur est mis sous tension, 1'interruption du reset est
gnre, et cela force le CPU sauter 1'adresse du dbut du programme pour 1'excuter.
2) Dveloppement
2.1

Squelette de programme

La programmation du contrleur se fait en langage assembleur ST7. L'assembleur comporte


un jeu d'instruction complet et de nombreux modes d'adressage.
Le squelette du programme qui vous est fourni (fichier SQUELET.ASM) a pour but de bien
dfinir la structure d'un programme et les diffrentes zones mmoires ncessaires pour la
construction du code excutable. II servira de base pour 1'criture de vos programmes et
comporte :
Une zone de description
Cette zone est constitue de commentaires et permet de dcrire ce que fait le
programme. II est trs important de commenter les programmes, quel que soit le
langage de programmation, mais c'est particulirement vrai en langage assembleur, car
c'est un langage peu lisible.
La syntaxe des commentaires est la suivante :
; ceci est un commentaire en dbut de ligne
INST ; commentaire d'une instruction

Une zone de dclaration des symboles


Cette zone permet de dclarer des symboles pour simplifier la lecture du code source. Ils
sont dsignes par un nom (on dit galement label) et ne prennent pas de place en mmoire
(contrairement aux constantes).
La syntaxe est la suivante :
nom

EQU

valeur

par exemple :
TEMPO

EQU

$50

-8-

Mini projet Microcontrleur ST7

Remarques :
- Pensez donner des noms clairs afin de simplifier la lecture du code. Cette remarque est
valable pour tous les types de noms que vous dfinirez : symboles, variables, constantes,
sous-programmes.
- Pour la lisibilit de votre code, utilisez la convention suivante :
label[TAB]INST [TAB]oprande[TAB] ; commentaire

o [TAB] dsigne la touche de tabulation.


Une zone de dclaration des variables
Cette zone se trouve dans la RAM0 ou page 0 de la mmoire.
Chaque variable est dclare par un nom (ou label) et une taille en nombre d'octets. On
peut ainsi dclarer galement des tableaux. La syntaxe est la suivante :
var1
var2
var3
var4

DS.B
DS.W
DS.B
DS.W

1
1
10
5

;
;
;
;

variable d'un octet


variable d'un mot (c'est dire 2 octets)
tableau de 10 octets
tableau de 5 mots

Une zone de dclaration des constantes


Cette zone se trouve dans la zone mmoire programme. Chaque constante est dclare
par un nom (ou label) et une taille en nombre d 'octets. On peut ainsi dclarer galement
des tableaux de constantes. La syntaxe est la suivante :
cst1
cst2
cst3

DC.B
DC.W
DC.B

7
$1234
10,4,13,7,90

; constante 7
; constante hexadcimale 1234h
; tableau de 5 constantes (10, 4, 13, 7 et 90)

Une zone de dclaration des sous-programmes


Cette zone se trouve galement dans la mmoire programme. Elle contiendra tous les
sous-programmes que vous dfinirez. La syntaxe d'un sous-programme est la suivante :
nom :

; nom du sous programme


INST1
INST2

RET

; instruction de fin de sous-programme

-9-

Mini projet Microcontrleur ST7


Un programme principal
Ce programme principal se trouve dans la mmoire programme. C'est le point de
dpart du programme. Sa syntaxe est la suivante :
main :

boucl

RSP

JP

; initialisation du pointeur de pile

boucl ; boucle sur une partie du programme

L'instruction RSP ne doit pas tre enleve et doit tre la premire instruction du
programme principal. Elle sert initialiser le pointeur de pile.
L'instruction JP boucl effectue un saut dans le programme principal. Celui-ci boucle donc
1'infini. Ceci doit toujours tre le cas. En effet un contrleur est en gnral embarqu
dans un systme qui fonctionne en permanence tant qu'il est sous tension. Le programme
principal doit donc faire en sorte qu'il ne s'arrte jamais, par une boucle infinie.
Deux cas de figure se rencontrent :
- soit un saut au dbut du programme,
- soit un saut vers une position qui se trouve aprs la phase d'initialisation.
Une zone de dclaration des sous-programmes d'interruption
Cette zone se trouve dans la mmoire programme. Elle contiendra tous les sousprogrammes d'interruption que vous dfinirez.
Ces sous-programmes d'interruption sont les sous-programmes excuter lorsqu'une
interruption provenant d'un priphrique ou d'un port du contrleur survient.
La syntaxe d'un sous-programme d'interruption est la suivante :
nom :

; nom du sous-programme d'IT


INST1
INST2

IRET

; instruction de fin de sous-programme d' IT

Une zone de dclaration des vecteurs d'interruption


Cette zone se trouve dans la mmoire programme. Les vecteurs d'interruption sont en fait
les liens entre 1'interruption elle-mme et le sous-programme d'interruption correspondant.
Par dfaut, dans le fichier SQUELET.ASM, toutes les interruptions sont lies avec le sousprogramme d'interruption "dummy_rt" qui ne fait rien, sauf 1'interruption de reset qui
est lie au programme principal "main", afin que le contrleur dmarre au dbut du
programme lorsqu'on fait un reset ou une mise sous tension.

- 10 -

Mini projet Microcontrleur ST7


2.2

Instructions du ST7

Cette section ne sera pas dveloppe car 1'environnement de dveloppement du ST7 contient
une trs bonne aide en ligne sur les instructions du langage assembleur pour ST7. Ouvrez
cette page d'aide et laissez-la en permanence ouverte, cela vous fera gagner du temps.
L'annexe 4 contient le rsum des instructions du ST7.
2.3

Modes d'adressage du ST7

La famille ST7 possde de nombreux modes d'adressage, classiques ou plus spcifiques.


Toutes les instructions n'acceptent pas forcment tous les modes d'adressage, il faut donc
vrifier dans 1'aide quel mode convient.
Le mode immdiat
Pour charger un registre avec une valeur fixe, cette valeur peut tre incorpore
1'instruction. Dans ce cas, la valeur suit immdiatement le code opration dans la
mmoire et il n'y a pas besoin de donner l'adresse de la donne lire.
Par exemple :
Ndoigts
Hexa
Mask

EQU
EQU
EQU

10
$10
%10100011

LD
LD
LD

A,#Ndoigts
A,#Hexa
A,#Mask

; A est charg avec la valeur 10


; A est charg avec la valeur hexadcimale 10h
; A est charg avec la valeur binaire 1010 0011 soit
; A3h

Le mode direct court


II y a deux modes directs : court et long (ou tendu). Ils sont presque identiques, seul
diffre le nombre d'octets servant donner 1'adresse de 1'oprande. Dans le mode direct
court, 1'adresse est code sur 1 octet afin d'accder la page 0 (adresse comprise entre 0
et 255).
Par exemple :
LD

A,$10

; A est charg avec la valeur de l'octet situ


; l'adresse 10h

Le mode direct long


II est identique au prcdent, sauf que l'adresse de 1'oprande est code sur 2 octets. Cette
adresse permet d'accder la totalit de 1'espace adressable.

- 11 -

Mini projet Microcontrleur ST7

Par exemple :
LD

A,$123

; A est charg avec la valeur de l'octet situ


; l'adresse 0123h

ATTENTION : ne pas confondre l'adressage immdiat et l'adressage direct. C'est souvent


une cause d'erreur dans vos programmes.
Le mode index
Dans ce mode, I'adresse de 1'oprande est fournie par le registre d'index X ou Y selon le
prfixe. Cette adresse ne permet d'accder qu' la page 0, puisque les registres X et Y
n'ont que 8 bits.
Par exemple :
LD

A,(X)

; A est charg avec la valeur de l'octet


; dont l'adresse est dans X.

Ce mode est utilis lorsque l'adresse de 1'oprande n'est pas connu au moment de
l'criture du programme et est donc calcule pendant 1'excution.
Le mode index avec dcalage court
Ce mode est semblable au mode index, mais le code opration est suivi d'un octet
contenant un dplacement, qui est ajout la valeur de l'index avant de faire l'accs la
mmoire. Cette adresse permet d'accder seulement l'intervalle 0 1FEh (0FFh + 0FFh).
Par exemple, pour accder au caractre n4 d'une chane de caractres (nota : c'est le
cinquime caractre !), on excute 1es instructions suivantes :
Phrase

DS.B 50

LD
LD

; rservation de 50 caractres l'adresse logique Phrase

X,#4
; on charge la valeur 4 dans X
A,(Phrase,X) ; A est charg avec la valeur de l'octet situ l'adresse
; qui est la somme de Phrase et de la valeur contenue
; dans X

Ce mode est utilis pour les accs des lments de tableaux ou de chanes de caractres.
Attention : Les espaces ne sont pas autoriss de part et d'autre de la virgule.
Le mode index avec dcalage long
Ce mode est semblable au mode index avec dcalage court, mais le code opration est
suivi d'un dplacement sur 2 octets, qui est ajout la valeur de 1'index avant de faire
1'accs la mmoire. Cette adresse permet d'accder tout l'espace adressable.

- 12 -

Mini projet Microcontrleur ST7


Par exemple, on dsire transfrer dans l'accumulateur le caractre n 64h d'une chane de
caractres situe l'adresse 4523h. Pour cela, on charge d'abord 64h dans X puis on
excute 1'instruction suivante :
LD

A,($4523,X)

; A est charg avec la valeur de l'octet situ l'adresse


; qui est la somme de 4523h et de la valeur contenue
; dans X

Remarque : Si la somme de X et du dcalage dpasse 65535, le rsultat est donn modulo


65536. Par exemple, si X contient 83h et que le dcalage est FFC2h, l'adresse rsultante
est 45h.
Le mode indirect court
Dans ce mode, l'adresse qui suit le code opration est celle d'un octet en mmoire qui
contient l'adresse de la variable laquelle on dsire accder. Cet emplacement qui
contient une adresse s'appelle un pointeur. Ce pointeur est toujours plac en page 0.
Par exemple, si le pointeur l'adresse 23h contient la valeur 79h et que 1'octet l'adresse
79h contient la valeur 12h, 1'instruction suivante charge 12h dans A :
LD

A,[$23]

Le mode indirect long


Ce mode est similaire au mode indirect court, mais le pointeur, toujours plac en page 0,
est une valeur sur 2 octets successifs.
Par exemple, si le pointeur l'adresse 23h contient la valeur 7954h et que 1'octet
l'adresse 7954h contient la valeur 12h, 1'instruction suivante charge 12h dans A :
LD

A,[$23.w]

C'est 1'utilisation du ".w" qui spcifie que le pointeur est sur 16 bits.
Le mode index avec dcalage indirect court
Ce mode est semblable au mode index avec dcalage, cependant 1'octet qui suit le
code opration n'est pas le dcalage lui-mme, mais 1'adresse d'un octet en
mmoire qui contient ce dcalage.
Par exemple, si le pointeur 1'adresse 23h contient 79h, que le registre X contient 5,
et que 1'octet 1'adresse 7Eh (79h + 05h) contient 22h, 1'instruction suivante
charge 22h dans A :
LD

A,([$23],X)

- 13 -

Mini projet Microcontrleur ST7


Le mode index avec dcalage indirect long
Ce mode est semblable au mode index avec dcalage indirect court, mais le
pointeur est une adresse sur 2 octets successifs.
Par exemple, si le pointeur 1'adresse 23h contient 7945h, que le registre X
contient 5, et que 1'octet 1'adresse 794Ah (7945h + 0005h) contient 22h,
1'instruction suivante charge 22h dans A :
LD

A,([$23.w],X)

Exemples d'utilisation
1. Lecture d'une variable
ma_variable

ds.b

LD

1
A,ma_variable

; direct court

2. Ecriture d'une valeur dans une variable


ma_valeur
ma_variable

dc.b

ds.b

LD
LD

$56
1
A,#ma_valeur
ma_variable,A

; immdiat
; direct court

3. Lecture d'une valeur d'un tableau de variables (ou de constantes)


mon_tableau

ds.b

LD
LD

10
X,#5
; immdiat
A,(mon-tableau,X) ; index avec dcalage court

- 14 -

Mini projet Microcontrleur ST7

2.4

Cration d'un projet

Un document d'aide la cration d'un projet ST7 a t rdig. Rfrez-vous ce document


pour chaque nouveau programme. Vous le trouverez en annexe 3.
Vous trouverez, en ligne, dans le campus numrique, sous N3/Electronique numrique, tous les
documents utiles pour votre mini-projet.
2.5

Ensemble de dveloppement

La carte "ST5-ST7 Training board", dveloppe par l'ISEN Toulon, est destine
l'apprentissage de la programmation des contrleurs ST Microelectronics des familles ST5
et ST7. Elle inclut un contrleur ST7 rfrence ST7Lite20 et un contrleur ST5 rfrence
ST52F513.
Le kit, qui vous est fourni, comprend :
Une carte "ST5-ST7 Training board",
Un bloc d'alimentation se branchant sur le secteur (220V-50Hz ).
Vous devez galement disposer de :
Une carte inDart STX, vendue par Softec (cf site www.softecmicro.com). Cette carte
est fournie avec un cordon USB et un cble plat ISP,
Un PC muni d'un port USB dans lequel vous avez install les logiciels de
dveloppement fournis gratuitement par ST (tlchargeables sur le site
www.stmcu.com) et Softec (tlchargeables sur le site www.softecmicro.com).
Attention : les utilisations en mode ST7 et ST5 sont exclusives.
La mise en service s'effectue comme suit :
Relier le bloc d'alimentation la carte "ST5-ST7 Training board" et brancher le au
secteur,
Relier votre PC la carte InDart par le cordon USB puis celle-ci la carte "ST5-ST7
Training board" par le cble plat ISP. Selon que vous voulez travailler avec le ST7 ou
le ST5, vous brancherez le cble ISP sur le connecteur en haut gauche (ST7) ou
droite (ST5) et vous positionnerez correctement l'interrupteur d'alimentation (sur le
bord gauche de la carte). Pour le mini-projet, vous travaillerez avec le ST7.
Vous obtenez le montage suivant :

- 15 -

Mini projet Microcontrleur ST7

PC de dveloppement

Cble ISP

Cordon USB
ST5-ST7 Training board
Carte InDart

L'criture du code assembleur se fait sur le PC avec un diteur coloriage syntaxique. La


compilation et l'dition de lien se font dans le mme environnement ainsi que la simulation et
le debug.
2.6

Utilisation du dbogueur

Cette section ne sera pas dveloppe car l'environnement de dveloppement du ST7 contient
une aide en ligne trs dtaille sur 1'utilisation du dbogueur qui est par ailleurs trs facile
utiliser. L'enseignant prsent avec vous est galement l pour vous aider prendre en main
cet environnement, donc n'hsitez pas poser des questions.

- 16 -

Mini projet Microcontrleur ST7

Chapitre 3

Premiers pas

1) Introduction
Dans tous les exercices qui vont suivre, pensez crer un sous-rpertoire correspondant
1'exercice, y copier les fichiers ncessaires la compilation, c'est dire ST7Lite2.asm,
ST7Lite2.inc, MAX7219.asm, MAX7219.inc, et SQUELET.asm puis travailler dans ce
sous-rpertoire.
Vous trouverez en ligne, dans le campus numrique, tous ces fichiers.

- 17 -

Mini projet Microcontrleur ST7


2) Ralisation d'un compteur modulo 10
Cet exercice consiste raliser un programme qui compte de 0 9 puis recommence 0. Ce
programme boucle indfiniment.
Le compteur sera mmoris dans une variable nomme "compte" que vous devrez dfinir
dans la zone des variables.
Tester le programme avec le dbogueur en mode pas pas afin de vrifier son bon
fonctionnement.
L'organigramme suivant illustre l'architecture de ce programme :

Dbut

compte = 0

OUI

compte > 9 ?

NON

compte =
compte + 1

3) Comment faire une boucle "for" ?


Cet exercice consiste raliser, en assembleur, une boucle "for", connue dans les langages
volus. Pour cela, on vous demande de calculer la somme des 20 premiers entiers.
La somme sera mmorise dans une variable nomme "somme" que vous devrez dfinir dans la
zone des variables. Par contre, 1'indice de la boucle "i" ne sera pas dclar comme une variable :
on utilisera le registre X du contrleur.
Tester le programme avec le dbogueur en mode pas pas afin de vrifier son bon
fonctionnement.
L'organigramme suivant illustre l'architecture de ce programme :

- 18 -

Mini projet Microcontrleur ST7

Dbut

somme = 0
X=20

OUI

X=0?

NON

somme = somme + X
X=X-1

4) Crer et appeler des sous-programmes


Comme dans les langages volus, l'assembleur permet de faire des appels des sousprogrammes (procdures ou fonctions), permettant de rendre plus lisible et plus efficace un
programme.
Cet exercice consiste reprendre 1'exercice prcdent de calcul de la somme des 20 premiers
entiers (dans un nouveau rpertoire), et de crer le sous-programme "calcule_somme", qui
prendra en entre, dans le registre A, le nombre d'entiers ajouter (on ne se limite plus 20)
et calculera la somme qu'il retournera dans la variable "somme".
Le programme principal effectuera les oprations suivantes :
- mettre un nombre dans A (nombre d'entiers que l'on veut ajouter),
- appeler ucalcule_somme" avec 1'instruction CALL.
Tester le programme avec le dbogueur en mode pas pas afin de vrifier son bon
fonctionnement.
Remarque : un retour de sous-programme se fait avec 1'instruction RET. L'organigramme
suivant illustre 1'architecture de ce programme :

- 19 -

Mini projet Microcontrleur ST7

Dbut

Dbut
calcule_somme

A = 23

somme = 0
X=A

OUI

Appel
calcule_somme

X=0?

NON

somme = somme + X
X=X-1

Fin
calcule_somme

5) A quoi sert la pile ?


Cet exercice consiste reprendre l'exercice prcdent pour illustrer l'utilisation de la pile
(en anglais stack). Pour cela, dans le programme principal, ajouter la ligne suivante avant
1'appel de "calcule_somme":
LD

X,#$88

Cela met la valeur hexadcimale 88h dans le registre X.


Avec le dbogueur, vrifier la valeur de X avant et aprs 1'appel de "calcule_somme".
Que faut-il faire pour conserver la valeur de X lors de 1'appel d'un sous-programme qui
modifie X?
Remarque : les modifications apportes pour sauvegarder les registres dsirs ne doivent
toucher que les sous-programmes appels et pas le programme appelant.
Tester le programme modifi avec le dbogueur en mode pas pas afin de vrifier son bon
fonctionnement. Regarder l'volution des contenus de PC, SP et de la mmoire RAM des
adresses $1F0 $1FF.
Dans la suite, dans chaque sous-programme, vous veillerez sauvegarder tous les registres
utiliss.

- 20 -

Mini projet Microcontrleur ST7


6) Utilisation des tableaux
Dans les langages volus, les tableaux sont trs utiliss pour rsoudre de nombreux
problmes. Nous allons donc voir comment utiliser les tableaux en assembleur avec la famille
ST7.
Cet exercice consiste raliser un programme d'extraction de minimum et maximum sur un
tableau. Pour cela, vous allez dclarer un tableau de 8 octets, que vous nommerez "tableau",
dans la zone de dclaration des variables.
Remarque : dclarer un tableau de 8 octets en assembleur signifie juste rserver un
emplacement de 8 octets successifs pour une variable. C'est le programmeur qui utilisera
cette variable en tant que tableau.
Vous crerez ensuite un sous-programme "initialise_tableau" qui initialise le tableau avec
les valeurs suivantes :
tableau[0]

25

tableau[l]

tableau[2]

tableau[3]

15

tableau[4]

16

tableau[5]

101

tableau[6]

33

tableau[7]

Vous crerez alors un sous-programme "min-max" qui effectue la recherche des valeurs
minimales et maximales dans le tableau, et met les rsultats dans les variables "minimum" et
"maximum" dclarer.
Le programme principal devra alors appeler la procdure "initialise_ST7" puis
"initialise_tableau" et la procdure "min_max".
L'organigramme suivant illustre l'architecture du programme principal :
Dbut

Appel
initialise_tableau

Appel
min_max
- 21 -

Mini projet Microcontrleur ST7


Dtailler l'organigramme du sous-programme "min_max" puis crire et tester le programme
avec le dbogueur en mode pas pas afin de vrifier son bon fonctionnement.
Remarque : tester un programme implique de tester toutes les branches du programme et des
sous-programmes. A cet effet, aprs le test avec le tableau prcdent de 8 octets, vous retesterez le programme avec un tableau de 11 octets, les valeurs tant : 25, 4, 55, 222, 15, 2,
131, 99, 45, 9, 2.
7) Ports d'entres/sorties
Comme cela a dj t dit auparavant, un contrleur possde des ports d'entres/sorties afin
de dialoguer avec le monde extrieur.
Cet exercice consiste comprendre comment utiliser ces ports, c'est dire comment lire sur
un port d'entre et comment crire sur un port de sortie.
Nous allons ici utiliser le port A qui est un port 8 bits. Dans la famille ST7, le port A (comme
les autres ports d'entres/sorties) est contrl par 3 registres :
le registre de direction

PADDR

le registre d'options

PAOR

le registre de donnes

PADR

Le registre de direction PADDR contrle la direction de chaque bit du port : soit en entre
(bit correspondant 0), soit en sortie (bit correspondant 1).
Par exemple, on veut que les bits 0, 3 et 6 du port A soient en sortie et les bits 1, 2, 4, 5 et 7
en entre. II faut alors mettre la valeur suivante dans le registre PADDR :
Port A

bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

Direction

entre

sortie

entre

entre

sortie

entre

entre

sortie

Registre PADDR 0

Cela se fera par les instructions suivantes :


Init_PADDR

EQU

LD
LD

%01001001
A,#Init_PADDR
PADDR,A

car on ne peut pas charger directement un registre autre que A, X et Y (voir dtail des
instructions).

- 22 -

Mini projet Microcontrleur ST7


Cela peut galement se faire par 1'ensemble des instructions suivantes (beaucoup moins lisible
et moins rapide) :
BSET
BRES
BRES
BSET
BRES
BRES
BSET
BRES

PADDR,#0
PADDR,#1
PADDR,#2
PADDR,#3
PADDR,#4
PADDR,#5
PADDR,#6
PADDR,#7

Le registre d'options PAOR contrle le mode de fonctionnement en entre ou sortie de


chaque bit du port. Le tableau suivant donne la signification de ce registre pour le port A :
Entre
OR= 0
PA7:0

Flottant

Sortie
OR= 1

OR= 0

OR= 1

Pull-up

Open drain

Push-pull

avec ou sans IT
Les dtails sur les modes de fonctionnement des entres/sorties sont donns dans le manuel
technique du ST7Lite2.
Le registre de donne PADR est le registre dans lequel :
- il faut crire pour envoyer des donnes en sortie,
- il faut lire pour recevoir des donnes en entre.
Remarque : Tous les programmes qui utilisent les ports d'entres/sorties doivent comporter
un sous-programme d'initialisation des registres contrlant les ports du contrleur.
Votre travail :
Vous raliserez un programme qui va :
- paramtrer le port A en entres flottantes sur les bits 0 3 et en sorties symtriques sur les bits
4 7,
- crire une valeur dans la variable "portA_TX" que vous aurez pralablement dclare,
- crire la valeur de "portA_TX" sur le port A.
- lire le port A et mettre la valeur lue dans une variable "portA_RX" que vous aurez dclare,
Pour cela, vous allez crire le sous-programme "initialise_ST7" qui ralise
l'initialisation du port A dans le mode demand.
Vous crerez ensuite deux sous-programmes, un qui s'appelle "lit_portA", qui doit lire la
valeur du port A puis 1'crire dans la variable "portA_RX" et un qui s'appelle
"ecrit_portA", qui doit crire sur le port A la valeur qui est dans la variable "portA_TX".
Le programme principal appellera "initialise_ST7". Vous vrifierez la configuration du
port avec le dbogueur en mode pas pas et en affichant la fentre "Peripheral registers"
(du menu "View").
- 23 -

Mini projet Microcontrleur ST7

Puis il positionnera la valeur $55 dans la variable "portA_TX" et appellera "ecrit_portA".


Vous vrifierez la valeur de PADR avec le dbogueur.
Enfin le programme principal appellera "lit_portA". Vous vrifierez la valeur de "portA__RX"
avec le dbogueur toujours en mode pas pas, en ouvrant la fentre "Watch" (du menu
"View").
Remarque : lorsque vous ne voulez modifier qu'un seul bit du port A en criture ou ne lire
qu'un seul bit du port A, vous devez manipuler les registres avec des OU et des ET logiques
pour ne conserver que les informations voulues. Par exemple, pour envoyer un 1 uniquement
sur le bit 3 du port A configur en sortie sur tous les bits, il faut crire :
LD
OR
LD

A,PADR
A,#$08
PADR,A

; lecture du port A et mmorisation dans le registre A


; on force 1 le bit 3 du registre A
; on crit la valeur envoyer sur le port A

En faisant cela, on a juste modifi le bit 3 du port PADR.

- 24 -

Mini projet Microcontrleur ST7

Chapitre 4 La maquette de dveloppement


Maintenant que vous avez ralis les exercices prcdents, vous avez acquis les bases de la
programmation en assembleur sur la famille ST7, et vous tes capables de crer un
programme et de le dboguer avec 1'environnement de dveloppement de chez ST
Microelectronics.
Nous allons prsent vous prsenter la maquette de dveloppement de 1'ISEN qui vous
servira pour les exercices suivants et pour le projet. Elle permet d'utiliser les diffrents
composants et fonctionnalits du contrleur.
Les priphriques, disponibles sur la carte, sont :
8 LEDs,
un moteur pilotable par PWM,
un buzzer pilotable par PWM,
un potentiomtre, permettant de gnrer une tension continue entre 0 et 5V, pour
acquisition par un port ADC,
4 afficheurs 7 segments, grs par le composant MAX 7219, reli aux ST5 et ST7 par
une liaison SPI et un signal de LOAD,
2 poussoirs, mettant 0V, les entres correspondantes quand ils sont activs,
2 boutons poussoirs de Reset (un par contrleur),
un picot de masse et 2 picots In1 et In2 pour connecter 2 signaux analogiques
externes. Remarque : l'entre In2 n'est pas utilisable avec le ST5.
Le tableau ci-dessous prcise les connections entre les ports du contrleur ST7, les
priphriques et le connecteur JP2.

ST7Lite20
Nom de la pin

Priphrique connect

PA0/LTIC
PA1/ATIC
PA2/ATPWM0
PA3/ATPWM1
PA4/ATPWM2
PA5/ATPWM3/ICCDATA
PA6/MCO/ICCCLK/BREAK
PA7
PB0/SS'/AIN0
PB1/SCK/AIN1
PB2/MISO/AIN2
PB3/MOSI/AIN3
PB4/CLKIN/AIN4
PB5/AIN5
PB6/AIN6
RESET

LED1
LED2
Moteur
LED3/Buzzer/Poussoir1
LED4
Rserv ISP
Rserv ISP
LED5
Potentiomtre/Poussoir2/In1
Gestion Afficheurs :CK SPI
Gestion Afficheurs : Load Max
Gestion Afficheurs :MOSI
LED6/In2
LED7
LED8
Poussoir RESET

- 25 -

N pin
ST7
13
12
11
10
9
8
7
6
19
20
1
2
3
4
5
18

N pin JP2
6
7
4
13
14
15
16
17
5
3
1
2
10
11
12

Mini projet Microcontrleur ST7


Les configurations possibles de la carte sont les suivantes (la photo ci-aprs permet de
prciser la position des lments cits) :
choix ST5/ST7 : positionner l'interrupteur d'alimentation (IA1), connecter le cble
ISP sur le connecteur J0 (ST7) ou J1 (ST5),
Tension d'alimentation du ST5 : 5V ou 3.3V (cavaliers W1 et W2). Avec le
composant livr, connecter W1, ne pas connecter W2,
Activation des 8 LEDs par barrette de 8 interrupteurs (B1),
Activation du moteur (cavalier W3),
Activation du buzzer (cavalier W4),
Activation du poussoir 1 rfrenc S4 (cavalier W5),
Activation du poussoir 2 rfrenc S5 (cavalier W7),
Activation du potentiomtre (cavalier W6),
Reset du ST7,
Reset du ST5.
Remarques importantes :
1. ne jamais positionner simultanment les cavaliers W1 et W2 d'alimentation du ST5,
2. si vous positionnez le cavalier W5 (poussoir 1), dsactiver la LED n3,
3. si vous utilisez l'entre analogique In1, dconnectez le potentiomtre (cavalier W6) et
le poussoir 2 (cavalier W7),
4. si vous utilisez l'entre analogique In2, dsactiver la LED n6.

ISP ST7 (J0)

B1

ISP ST5 (J1)

Reset ST5

Reset ST7

IA1
JP2

W7
Poussoir 2
W1 W2

W3

W4

- 26 -

W5

Poussoir 1

W6

Mini projet Microcontrleur ST7

Chapitre 5 Les LEDs


Dans ce chapitre, nous allons utiliser les ports d'entres/sorties du contrleur ST7Lite2 pour
commander 1'allumage ou 1'extinction de LEDs.
Remarque : comme dans le chapitre Premiers pas, vous partirez, pour chaque exercice, du
fichier SQUELET.ASM.
1) Allumage d'une LED
Cet exercice consiste allumer la LED n1. Elle est commande par le bit 0 du port A (PA0).
Vous devrez donc crire un sous-programme "init_ports" afin d'initialiser le port A comme
il faut (bit 0 en sortie push-pull).
La figure suivante indique le cblage de la sortie en push-pull :

S=0 -> teint,

S=l -> allum

Puis vous crirez un sous-programme "allume_LED" qui allume la LED voulue sans
allumer les autres.
Votre programme principal devra donc appeler "init_ports" puis "allume__LED" et boucler
1'infini pour ne pas s'arrter (s'il s'arrte, l'tat des ports n'est plus garanti et la LED peut
s'teindre).
L'organigramme suivant illustre 1'architecture de ce programme :

Dbut

Dbut
In it_ports

Appel
In it_ports

In itial isation des


re gistres D DR et OR
du port

Appel
allume_ LE D

Fin
In it_ports

- 27 -

Mini projet Microcontrleur ST7

2) Allumage de plusieurs LEDs


Cet exercice consiste allumer une LED sur deux (LEDs de n impair). Vous allumerez donc
celles qui sont commandes par les bits 0, 3 et 7 du port A (sorties push-pull) et par le bit 5
du port B (sortie push-pull).
Vous devrez donc complter le sous-programme "init_ports" pour initialiser les ports A et
B comme il faut (bits correspondants en sorties push-pull).
Puis vous crirez un sous-programme "allume_impair" qui allume l'ensemble des LEDs
impaires.
Votre programme principal devra donc appeler "init_ports ", puis "allume__impair" et
boucler l'infini pour ne pas s'arrter.
L'organigramme de ce programme est sensiblement identique celui de 1'exercice sur
l'allumage d'une LED.
2) Clignotement des LEDs
Cet exercice consiste allumer les LEDs impaires (les LEDs paires tant teintes), attendre
0,5 secondes, puis 1es teindre et allumer les LEDs paires, attendre nouveau 0,5
secondes et recommencer.
Vous devrez donc complter le sous-programme "init_ports" pour initialiser les ports A et
B comme il faut .
Puis vous crirez deux sous-programmes "allume_impair" et "allume_pair" qui allument
les LEDs voulues sans allumer les autres et un sous-programme "attend_500ms" qui
effectue une temporisation de 0,5 secondes.
Votre programme principal devra donc appeler "init_ports", puis successivement
"allume_impair", "attend_500ms", " allume_pair ", "attend_500ms" et boucler sur
"allume_impair" pour recommencer.
Remarque : Un sous-programme de temporisation est un sous-programme qui excute des
oprations "inutiles" pendant le temps dsir, soit par des boucles (parfois imbriques) soit
par d'autres mthodes. La dure de temporisation se trouve en calculant le nombre de cycles du
sous-programme (la documentation des instructions donne le nombre de cycles de chaque
instruction), sachant que le contrleur ST7Lite2 effectue 1.000.000 cycles par seconde
lorsqu'il est cadenc par son oscillateur RC interne. A noter qu'en programmant les bits
d'options, cette frquence peut tre multiplie par 4 ou 8 par une PLL interne.
Dans votre rapport, vous indiquerez le calcul du nombre de cycles de votre sous-programme
de temporisation.

- 28 -

Mini projet Microcontrleur ST7

Chapitre 6 Les afficheurs 7 segments


Dans ce chapitre, nous allons utiliser les ports d'entres/sorties du contrleur ST7Lite2
pour commander l'affichage de chiffres et de lettres sur les afficheurs 7 segments.
Nous utiliserons pour cela une bibliothque de fonctions permettant de commander le
composant MAX7219 de la maquette, qui permet de grer 4 afficheurs simultanment
(mmorisation et affichage des valeurs).
Dans chacun des exercices suivants, il faudra donc inclure au projet les fichiers
MAX7219.ASM et MAX7219. INC qui dfinissent cette bibliothque.
L'utilisation de la bibliothque d'affichage se fait de la faon suivante :
1. Modification du sous-programme "init_ports" :
- configuration du port SPI (liaison srie synchrone) pour le dialogue avec le
MAX7219. La configuration de ce port se fait par les registres SPI Control/Status
Register (SPISR) et SPI Control Register (SPICR). Leur signification est explique en
dtail dans la documentation technique du ST7.
Le registre SPISR est un registre de 8 bits initialiser la valeur $03.
Le registre SPICR est un registre de 8 bits dfini comme suit :
bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

SPIE

SPE

SPR2

MSTR

CPOL

CPHA

SPR1

SPRO

- SPIE indique le mode de fonctionnement avec ou sans interruption du SPI; ce bit doit
tre positionn 0 (interrupt disabled).
- SPE indique 1'utilisation ou non du port SPI sur les sorties correspondantes du ST7, ce
bit doit tre positionn 1 (SPI connected to external pins).
- SPR[2 :0] indique la frquence utilise pour la liaison SPI; la frquence doit tre fcpu/8.
Ces bits doivent tre positionns 0.
- MSTR indique le mode matre / esclave; ce bit doit tre positionn 1 (mode matre).
- CPOL indique la polarit de 1'horloge utilise; ce bit doit tre positionn 1.
- CHPA indique la phase de 1'horloge utilise; ce bit doit tre positionn 1.
Il faut aussi configurer le port PB2 en mode sortie Push-pull.
2. Appel du sous-programme "MAX7219_Init" pour initialiser le MAX7219.
3. Appel du sous-programme "MAX7219_Clear" pour effacer les 4 afficheurs.
- 29 -

Mini projet Microcontrleur ST7


4. Appel du sous-programme "MAX7219_DisplayChar" pour afficher une valeur :
- 1'afficheur slectionn (de 1 4) doit tre prcis dans la variable "DisplayChar_Digit",
- la valeur afficher doit tre prcise dans la variable "DisplayChar_Character",
- ces deux variables doivent tre positionnes avant 1'appel du sous-programme.
1) Affichage d'une valeur sur un afficheur
Cet exercice consiste afficher une valeur tenant sur un chiffre sur l'afficheur de droite. La
valeur afficher sera positionne dans une variable "valeurAffiche" dclarer dans la zone
des variables et initialiser au dbut du programme principal.
2) Ralisation d'un compteur modulo 100 (en dcimal)
Cet exercice consiste raliser un compteur de 0 99 en base 10, avec affichage de la valeur
sur deux afficheurs et temporisation de 500 ms entre chaque incrmentation. La valeur du
compteur sera mmorise dans une variable "compteur" dclarer dans la zone des variables.
Arriv 99, le compteur repart 0.

- 30 -

Mini projet Microcontrleur ST7

Chapitre 7 Les interruptions


1) Compteur modulo 100 avec arrt
Cet exercice consiste reprendre 1'exercice 2 du chapitre 6 et y ajouter la gestion de
1'appui sur les boutons poussoirs 1 et 2 avec les interruptions :
- lorsque le compteur est arrt, 1'appui sur le bouton 1 dmarre le compteur,
- lorsque le compteur tourne, 1'appui sur le bouton 2 arrte le compteur.
L'appui sur un bouton poussoir provoque un tat bas (0V) sur 1'entre du ST7 correspondante.
Sinon, cette entre est l'tat haut (5V).
Le bouton poussoir 1 est connect PA3 et le bouton poussoir 2 PB0 mais n'oubliez pas de
configurer correctement les cavaliers (cf. chapitre 4).
Le ST7 admet 4 interruptions externes diffrentes, dnommes ei3, ei2, ei1 et ei0. Au niveau
logiciel, la prise en compte de ces interruptions est gre par 2 registres : External Interrupt
Control Register (EICR) et External Interrupt Selection Register (EISR).
Le EICR est un registre de 8 bits, dfini comme suit :
bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

IS31

IS30

IS21

IS20

IS11

IS10

IS01

IS00

Les bits ISx1 et ISx0 dfinissent la sensibilit de l'interruption eix (cf tableau ci-dessous) :
ISx1
0
0
1
1

ISx0
0
1
0
1

Sensibilit
Front descendant et tat bas
Front montant seul
Front descendant seul
Front montant et descendant

Le EISR est un registre de 8 bits, dfini comme suit :


bit 7

bit 6

bit 5

bit 4

bit 3

bit 2

bit 1

bit 0

ei31

ei30

ei21

ei20

ei11

ei10

ei01

ei00

Les bits eix1 et eix0 dfinissent la pin du ST7 utilise pour gnrer l'interruption (cf. les 4
tableaux suivants) :
ei31
0
0
1
1

ei30
0
1
0
1

I/O pin
PB0
PB1
PB2
Not used

- 31 -

Mini projet Microcontrleur ST7

ei21
0
0
1
1

ei20
0
1
0
1

I/O pin
PB3
PB4
PB5
PB6

ei11
0
0
1
1

ei10
0
1
0
1

I/O pin
PA4
PA5
PA6
PA7

ei01
0
0
1
1

ei00
0
1
0
1

I/O pin
PA0
PA1
PA2
PA3

Vous devez donc :


initialiser le ST7 avec autorisation des interruptions externes correspondant aux
ports relis aux boutons poussoirs. Pour cela, il faut modifier le sous-programme
"init_ports" de la faon suivante :
(a) programmation correcte des registres EICR et EISR,
(b) excution de 1'instruction RIM qui autorise les interruptions.
initialiser les ports du ST7 correspondant aux boutons poussoirs en entres pull-up
avec interruption.
crer, dans la zone de dclaration des sous-programmes d'interruption, les 2 sousprogrammes de gestion des interruptions. Ces sous-programmes seront appels
chaque nouvelle interruption, c'est dire chaque nouvel appui sur un des deux
boutons poussoirs. Ces sous-programmes doivent :
(a) modifier 1'tat du compteur (arrt ou marche, selon le sous-programme).
Pour cela, le mieux est de dfinir une variable qui va indiquer 1'tat du
compteur : marche ou arrt et qui est mise jour dans le sous-programme,
(b) revenir au programme avec l'instruction IRET.
modifier la zone de dclaration des vecteurs d'interruption pour associer les sousprogrammes crs avec les vecteurs d'interruption "extx_it". Par dfaut, ces derniers
(comme la plupart des autres vecteurs d'interruption) sont associs au sousprogramme "dummy_rt" qui ne fait rien.
modifier le programme principal pour prendre en compte 1'tat du compteur :
- si le compteur est en marche, on compte, on temporise et on affiche,
- si le compteur est arrt, on temporise et on affiche uniquement.

- 32 -

Mini projet Microcontrleur ST7

Chapitre 8 Le timer
1) Compteur modulo 100 avec timer
Cet exercice consiste reprendre 1'exercice 2 du chapitre 6 sur la ralisation d'un
compteur modulo 100 avec affichage sur 2 afficheurs 7 segments, en remplaant le sousprogramme de temporisation par 1'utilisation du timer "Lite Timer 2" du ST7.
Le Lite Timer 2 est un timer 8 bits, dont le synoptique est donn ci-dessous. Il permet :
De compter en permanence, la frquence Fosc/32, de 0 249 (counter 1). Une
interruption peut tre gnre chaque transition de 249 0,
De compter en permanence, la frquence Fosc/32, de la valeur contenue dans le
registre LTCARR 255 (counter 2). Une interruption peut tre gnre chaque
transition de 255 (LTCARR),
De mesurer l'intervalle de temps entre 2 fronts (montants ou descendant) d'un signal
externe connect au port PA0/LTIC (fonction dnomme : Input Capture).
LTCNTR
8 bits

LTARR

FOSC

8 bit Autoreload
Register

8 bit TIME
BASE
Counter2

MSB

When LTCNTR reach LTARR

TB2IE

TB2F

LSB

Flag Interrupt

To 12- Bit Auto reload


Timer

Div. = 32
Div by 2

8-Bit UP- Counter 1

LTIC

LTTB2
Interrupt request

LTCSR2

8-Bit
Input Capture Register = LTICR
LTCSR1

MSB

ICE

ICF

TB

TB1IE

LSB

TB1F

LTTB Interrupt Req

LTIC Interrupt Request

Pour votre besoin, vous allez utiliser le "counter 1" avec gnration d'interruption. La
frquence CPU (Fosc) tant de 1 MHz, le compteur effectue une transition de 249 0 toutes
les 8 ms. Pour cela, il faut initialiser correctement le registre LTCSR1 :
- 33 -

Mini projet Microcontrleur ST7


ICE = ICF = 0 (fonction "Input capture" non utilise),
TB = 0 (une IT toutes les 8 ms),
TB1IE = 1 (IT autorise),
TB1F = x (bit en lecture seule),
Bits 2-0 = 000
Pour attendre 500 ms, vous devez donc compter environ 62 interruptions. Vous rcrirez
donc, comme suit, le sous-programme "attend_500ms" :
Initialiser 0 une variable "compte_IT",
Lancer le timer 2 (autorisation de l'IT : TB1IE = 1),
Attendre que compte_IT = 62,
Arrter le timer (inhibition de l'IT : TB1IE = 0),
Sortir du sous-programme.
Le sous-programme d'interruption doit incrmenter compte_IT.
2) Pilotage d'un moteur
Le moteur de la carte se commande via un signal PWM (Pulse Width Modulation). Ce signal
est un crneau priodique, dont le rapport cyclique (Dure tat haut/Priode) donne la valeur
de contrle.
Pour cela, il faut utiliser le timer 12 bits Autoreload et sa sortie PA2/ATPWM0 relier par
cavalier au moteur (cf chapitre 4).
Ce timer permet de gnrer 4 sorties PWM et a galement une fonction d'Input Capture. Ces
registres internes sont sur 12 bits. Son synoptique est le suivant :

Interrupt
Input Capture

OVF
Interrupt
Request

ATCSR
O

ICF

ICIE

CK1

CKO

OVF

OVFIE

CMPIE

F Ltimer
CNTR
F Counter

DCRO
Preload

32 MHz
DCRO
F CPU
Preload

CMPFO

CMP
Interrupt
Request

12-Bit UP Counter

12-Bit AUTO Reload


Counter

On OVF Event IF OE0=1

ATR

12-Bit Duty Cycle Value


CMPF0 bit

OP0 Bit

OE0 Bit

Polarity

Output
Control

Compare

To ICF bit
ATCSR

PWM
Generation

F PWM

12-bit Input Capture

- 34 -

PWM

Mini projet Microcontrleur ST7


Le signal gnr dpend de l'initialisation des registres DCRx et ATR :

Counter
4096
DCR
ATR

PWM
OE =1
OPx=0
OE =1
OPx=1
Vous devez programmer comme suit les registres du timer :
ATCSR = $10 (horloge timer = horloge CPU),
ATRH : 4 MSB de la valeur de ATR,
ATRL : 8 LSB de la valeur de ATR,
PWMCR = $01 (sortie PWM0 slectionne),
PWM0CSR = $00 (si OP0 = 0) ou $02 (si OP0 = 1),
DCR0H : 4 MSB de la valeur de DCR,
DCR0L : 8 LSB de la valeur de DCR.
Pour plus de dtails, vous pouvez consulter la data sheet du ST7Lite2.
Sachant que FCPU = 1 MHz, vous gnrerez :
1. un signal PWM de priode 4 ms et de rapport cyclique 50%,
2. puis un signal PWM de frquence 20 kHz et de rapport cyclique 25 %.
Vous vrifierez vos signaux PWM l'oscilloscope.

- 35 -

Mini projet Microcontrleur ST7

Chapitre 9 Le convertisseur analogique-numrique


Pilotage du moteur par le potentiomtre
Vous reliez le potentiomtre l'entre analogique PB0/SS'/AIN0 du ST7, en positionnant
convenablement les cavaliers (cf. chapitre 4).
Ce potentiomtre permet de dlivrer une tension continue, comprise entre 0V et 5V, l'entre
du CAN, canal 0.
Le CAN du ST7 peut acqurir jusqu' 7 canaux multiplexs (AIN0 AIN6) et ralise la
conversion analogique-numrique sur 10 bits. Son synoptique est donn ci-dessous :

EOC

SPEED

ADON

CH2 CH1 CH0

(ADC Control Status Register) ADCCSR

AIN
AIN
ANALOG
MUX
AIN

SAMPLE
&
HOLD

ANALOG TO DIGITAL
CONVERTER

AIN

(Data Register High) ADC DRH

D9 D8 D7 D6 D5 D4 D3 D2

(Data Register Low) ADC DRL

D0 D1

Pour utiliser le CAN, il faut :


choisir le canal d'acquisition (programmation des bits CH2-CH1-CH0 du registre
ADCCSR),
lancer la conversion (mise 1 du bit ADON du registre ADCCSR),
attendre que la conversion soit acheve (le bit EOC du registre ADCCSR passe 1),
lire le rsultat de la conversion. Les 8 MSB sont lus dans le registre ADCDRH et les 2
LSB dans le registre ADCDRL. Remarque : l'action de lire le registre ADCDRH
remet 0 le bit EOC.
Vous devez crire un programme qui acquiert, continment, sur 8 bits, la tension dlivre par
le potentiomtre et gnre un signal PWM de rapport cyclique proportionnel celle-ci (0V
=> 0%, 5V=> 100%). Vous dterminerez, en consquence, la frquence du signal PWM.
Puis vous complterez l'exercice ci-dessus, en affichant sur les 7segments, la valeur de la
tension acquise avec une prcision d'environ 0,3 V.

- 36 -

Mini projet Microcontrleur ST7

ANNEXE 1
ST7LITE2.ASM

Mini projet Microcontrleur ST7


st7/
;************************************************************************
; TITLE:
ST7FLite2.ASM
; AUTHOR:
CMG Microcontroller Application Team
; DESCRIPTION:
ST7FLite2 Registers and memory mapping
;
; Define here the micro ROM Size according to the sales type:
;
#define ST7FLite20
1
;=> no Data EEPROM
; #define ST7FLite25
1
;=> no Data EEPROM
; #define ST7FLite29
1
;=> Data EEPROM
;
;************************************************************************

;+------------------------------------------------------------------------+
;|
HARDAWRE REGISTERS
|
;+------------------------------------------------------------------------+
BYTES

; following addresses are 8 bit length

;********************************************************************
segment byte at 0-7F 'periph'
;********************************************************************
;**********************************************************************
;
I/O Ports Registers
;**********************************************************************
.PADR
.PADDR
.PAOR

DS.B
DS.B
DS.B

1
1
1

; port A data register


; port A data direction register
; port A option register

.PBDR
.PBDDR
.PBOR

DS.B
DS.B
DS.B

1
1
1

; port B data register


; port B data direction register
; port B option register

reserved0
DS.B

; unused

;**********************************************************************
;
Lite Timer Registers
;**********************************************************************
.LTCSR2
.LTCARR
.LTCNTR
.LTCSR1
.LTICR

DS.B
DS.B
DS.B
DS.B
DS.B

1
1
1
1
1

;
;
;
;
;

lite
lite
lite
lite
lite

timer
timer
timer
timer
timer

control/status register 2
auto reload register
counter register
control/status register 1
input capture register

;**********************************************************************
;
Auto reload timer registers
;**********************************************************************
.ATCSR
.CNTRH
.CNTRL
.ATRH
.ATRL
.PWMCR

DS.B
DS.B
DS.B
DS.B
DS.B
DS.B

1
1
1
1
1
1

;
;
;
;
;
;

Timer Control/Status register 1


Counter Register High
Counter Register Low
Auto-Reload Register High
Auto-Reload Register Low
PWM Output Control Register

Mini projet Microcontrleur ST7


.PWM0CSR
.PWM1CSR
.PWM2CSR
.PWM3CSR
.DCR0H
.DCR0L
.DCR1H
.DCR1L
.DCR2H
.DCR2L
.DCR3H
.DCR3L
.ATICRH
.ATICRL
.TRANCR
.BREAKCR

DS.B
DS.B
DS.B
DS.B
DS.B
DS.B
DS.B
DS.B
DS.B
DS.B
DS.B
DS.B
DS.B
DS.B
DS.B
DS.B

1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

PWM 0 Control/Status Register


PWM 1 Control/Status Register
PWM 2 Control/Status Register
PWM 3 Control/Status Register
PWM 0 Duty Cycle Register High
PWM 0 Duty Cycle Register Low
PWM 1 Duty Cycle Register High
PWM 1 Duty Cycle Register Low
PWM 2 Duty Cycle Register High
PWM 2 Duty Cycle Register Low
PWM 3 Duty Cycle Register High
PWM 3 Duty Cycle Register Low
Input Capture Register High
Input Capture Register Low
Transfer Control Register
Break Control Register

reserved1
DS.B

11

unused

;**********************************************************************
;
Watchdog Control register
;**********************************************************************
.WDGCR

DS.B

; Watchdog Control Register

;**********************************************************************
;
Flash Register
;**********************************************************************
.FCSR

DS.B

; flash control/satus register

;**********************************************************************
;
EEPROM Register
;**********************************************************************
.EECSR

DS.B

; data EEPROM control status register

;**********************************************************************
;
SPI Registers
;**********************************************************************
.SPIDR
.SPICR
.SPISR

DS.B
DS.B
DS.B

1
1
1

; SPI data I/O register


; SPI control register
; SPI status register

;**********************************************************************
;
ADC Registers
;**********************************************************************
.ADCCSR
.ADCDRH
.ADCDRL
Register

DS.B
DS.B
DS.B

1
1
1

; A/D control/status register


; ADC Data register
; ADC Amplifier Control register and Data Low

Mini projet Microcontrleur ST7


;**********************************************************************
;
ITC Registers
;**********************************************************************
.EICR

DS.B

; external interrupt control register

;**********************************************************************
;
MCC Registers
;**********************************************************************
.MCCSR

DS.B

; main clock control/status register

;**********************************************************************
;
Clock & Reset Registers
;**********************************************************************
.RCCR
.SICSR

DS.B
DS.B

1
1

; RC oscillator control register


; system integrity control/status register

reserved2
DS.B
.EISR

DS.B

1
1

unused

External Interrupt Selection Register

reserved3
DS.B

; 3 bytes unused

3Dh to 3Fh

;**********************************************************************
;
Dali Registers
;**********************************************************************

.DCMCLK
.DCMFA
.DCMFD
.DCMBD
.DCMCR
.DCMCSR

DS.B
DS.B
DS.B
DS.B
DS.B
DS.B

1
1
1
1
1
1

;
;
;
;
;
;

DALI
DALI
DALI
DALI
DALI
DALI

Clock Register
Forward Address Register
Forward Data Register
Backward Data Register
Control Register
Control/Status Register

reserved4
DS.B

; 3 bytes unused 46h to 48h

;**********************************************************************
;
AWU Registers
;**********************************************************************
.AWUPR
.AWUCSR

DS.B
DS.B

1
1

; AWU Prescaler Register


; AWU Control/Status Register

;**********************************************************************
;
DM Registers
;**********************************************************************
.DMCR
.DMSR
.DMBK1H
.DMBK1L
.DMBK2H
.DMBK2L

DS.B
DS.B
DS.B
DS.B
DS.B
DS.B

1
1
1
1
1
1

;
;
;
;
;
;

DM
DM
DM
DM
DM
DM

Control Register
Status Register
Breakpoint Register
Breakpoint Register
Breakpoint Register
Breakpoint Register

1
1
2
2

High
Low
High
Low

Mini projet Microcontrleur ST7

;**********************************************************************
segment byte at 80-17F 'ram0' ;Zero Page
;**********************************************************************
WORDS

; following addresses are 16 bit length

;**********************************************************************
segment byte at 180-1FF 'stack'
;**********************************************************************
;**********************************************************************
#ifdef ST7FLite29
segment byte at 1000-107F 'data eeprom'
#endif
;**********************************************************************
;**********************************************************************
segment byte at E000-FFDF 'rom'
;**********************************************************************
;**********************************************************************
segment byte at FFE0-FFFF 'vectit'
;**********************************************************************
end

Mini projet Microcontrleur ST7

ANNEXE 2
SQUELET.ASM

Mini projet Microcontrleur ST7


ST7/
;************************************************************************
; TITLE:
; AUTHOR:
; DESCRIPTION:
;************************************************************************
TITLE "SQUELET.ASM"
MOTOROLA
#include "ST7Lite2.INC"

; Enlever le commentaire si vous utilisez les afficheurs


#include "MAX7219.INC"

;************************************************************************
;
; ZONE DE DECLARATION DES SYMBOLES
;
;************************************************************************

;************************************************************************
;
; FIN DE LA ZONE DE DECLARATION DES SYMBOLES
;
;************************************************************************

BYTES
segment byte 'ram0'
;************************************************************************
;
; ZONE DE DECLARATION DES VARIABLES
;
;************************************************************************

;************************************************************************
;
; FIN DE LA ZONE DE DECLARATION DES VARIABLES
;
;************************************************************************

Mini projet Microcontrleur ST7


WORDS
segment byte 'rom'
;************************************************************************
;
; ZONE DE DECLARATION DES CONSTANTES
;
;************************************************************************

;************************************************************************
;
; FIN DE LA ZONE DE DECLARATION DES CONSTANTES
;
;************************************************************************
;************************************************************************
;
; ZONE DE DECLARATION DES SOUS-PROGRAMMES
;
;************************************************************************

;************************************************************************
;
; FIN DE LA ZONE DE DECLARATION DES SOUS-PROGRAMMES
;
;************************************************************************

;************************************************************************
;
; PROGRAMME PRINCIPAL
;
;************************************************************************
main:

boucl
JP

boucl

;************************************************************************
;
; ZONE DE DECLARATION DES SOUS-PROGRAMMES D'INTERRUPTION
;
;************************************************************************

dummy_rt:

IRET

; Procdure vide : retour au programme principal.

Mini projet Microcontrleur ST7


;************************************************************************
;
; ZONE DE DECLARATION DES VECTEURS D'INTERRUPTION
;
;************************************************************************

segment 'vectit'

SPI_it
lt_RTC1_it
lt_IC_it
at_timerover_it
at_timerOC_it
AVD_it
lt_RTC2_it
ext3_it
ext2_it
ext1_it
ext0_it
AWU_it
softit
reset

DC.W
DC.W
DC.W
DC.W
DC.W
DC.W
DC.W
DC.W
DC.W
DC.W
DC.W
DC.W
DC.W
DC.W
DC.W
DC.W

dummy_rt
dummy_rt
dummy_rt
dummy_rt
dummy_rt
dummy_rt
dummy_rt
dummy_rt
dummy_rt
dummy_rt
dummy_rt
dummy_rt
dummy_rt
dummy_rt
dummy_rt
main

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

Adresse
Adresse
Adresse
Adresse
Adresse
Adresse
Adresse
Adresse
Adresse
Adresse
Adresse
Adresse
Adresse
Adresse
Adresse
Adresse

FFE0-FFE1h
FFE2-FFE3h
FFE4-FFE5h
FFE6-FFE7h
FFE8-FFE9h
FFEA-FFEBh
FFEC-FFEDh
FFEE-FFEFh
FFF0-FFF1h
FFF2-FFF3h
FFF4-FFF5h
FFF6-FFF7h
FFF8-FFF9h
FFFA-FFFBh
FFFC-FFFDh
FFFE-FFFFh

END
;************************************************************************

ANNEXE 3
Crer un projet ST7 en 10 leons

Introduction
Le kit de dveloppement de ST Microelectronics ddi aux microcontrleurs de la
famille ST7, permet de crer trs simplement des projets avec un environnement
graphique du mme style que Microsoft Visual Basic.
Ce livret vous guidera pas pas dans la cration dun tel projet.
Chaque tape sera dtaille et illustre de captures dcran afin de faciliter votre
lecture.
Aprs avoir lu ce petit guide, vous serez capable de crer votre premier projet.

Etape 1 : Prliminaires
La premire tape consiste crer le rpertoire dans lequel se trouvera votre projet.
Dans le cadre du mini-projet de microcontrleur, on pourrait par exemple crer
larborescence de rpertoires suivante :
Z:\Microcontroleur\ Exo_1\
Exo_2\

Exo_N\
Projet\
o chaque sous-rpertoire Exo_i du rpertoire Microcontroleur contient la
ralisation dun exercice du mini-projet, et le sous-rpertoire Projet contient le
projet final.
Remarque :

ceci est bien entendu un exemple ; vous avez libre choix dans la
cration de votre arborescence de fichiers. Cependant, essayez de
donner des noms de moins de 8 caractres.

Chaque fois que vous commencerez un nouveau projet ou un nouvel exercice, il


faudra donc crer le rpertoire associ.
Puis, il faudra copier dans ce rpertoire les fichiers constituant le point de dpart de
votre projet ; vous ne partirez pas de zro chaque nouveau projet (il est inutile de
rinventer la roue).
Ces fichiers sont les suivants :
ST7Lite2.asm
ST7Lite2.inc
MAX7219.asm
MAX7219.inc
Squelet.asm

dfinit le modle de microcontrleur


fichier inclure dans votre programme (si votre projet
concerne un modle ST7Lite2)
dfinit ce qui concerne le gestionnaire dafficheurs 7
segments
fichier inclure dans votre programme (si votre projet
doit faire de laffichage sur les afficheurs 7 segments)
point de dpart de votre programme. Il faudra
renommer ce fichier avec le nom de votre projet.

Etape 2 : Dmarrage du logiciel


Le logiciel se lance partir du menu suivant de Windows :
Dmarrer
Programmes
Softec Microsystems
InDART-STX ST7
STVD7 for InDART-STX
La fentre principale de lenvironnement de dveloppement est la suivante :

zone
de
projet

zone daffichage des fichiers sources

zone daffichage des messages dinformation

Les trois zones principales de ce logiciel sont les suivantes :


Zone de projet

Cest la fentre o se trouve larborescence du projet.


Cest galement la zone qui affiche la liste des fichiers
sources du projet.
Zone des sources
Cest la fentre dans laquelle sont visualiss et dits les
fichiers sources.
Zone dinformation Cest la fentre dans laquelle sont affichs les messages
dinformation concernant la compilation, le debug

Etape 3 : Cration du Workspace


Pour crer un nouveau projet, il faut crer ce qui sappelle un Workspace. Pour cela,
cliquer dans le menu File / New workspace puis choisir Create workspace and
project, ce qui ouvre la fentre suivante :

Saisissez alors le nom que vous voulez donner au Workspace dans le champ
Workspace filename, par exemple Exo_1, puis le rpertoire de destination du projet
dans le champ Workspace location (soit en le tapant, soit avec le bouton parcourir ),
par exemple Z:\Microcontroleur\Exo_1.
Remarque :

le rpertoire est celui que vous avez normalement cr lors de la premire


tape. (Si vous indiquez un nom de rpertoire qui nexiste pas, il vous sera
propos de le crer.)

Cliquez sur le bouton OK. La fentre suivante est affiche :

- Dans Project filename, entrez par dfaut le mme nom que celui donn au
Workspace. (Un Workspace peut contenir plusieurs Projects, dans ce cas les noms
pourraient tre diffrents.)
- Dans Project location, laissez le rpertoire propos, qui est celui que vous avez
indiqu dans la fentre prcdente.
- Dans Toolchain et Toolchain root, ne modifiez rien.
Cliquez sur le bouton OK. Dans la fentre suivante, indiquez la rfrence du
microcontrleur que vous allez utiliser (ST7FLITE20).

Vous devez alors obtenir ceci (mis part les noms du Workspace et du Project qui
dpendent bien sr de ce que vous avez indiqu prcdemment):

Etape 4 : Ajout des fichiers sources


Faire apparatre sous le nom du Projet, les rpertoires Source Files, Include Files, et
External Dependencies :

1 clic gauche

2 clic droit puis


Add Files to Folder

Par un clic droit suivi de Add Files to Folder, ajouter dans Source Files les fichiers
Exo_1.asm (par exemple, si cest le nom que vous avez choisi), max7219.asm (si vous
devez utiliser lafficheur 7 segments), et st7lite2.asm, puis ajouter dans Include
Files les fichiers max7219.inc (mme remarque que prcdemment), et st7lite2.inc.

La liste des fichiers du projet apparat alors comme dans la fentre suivante :

Il suffit ds lors de double cliquer sur le nom dun fichier pour lditer dans la fentre
daffichage des fichiers sources.

Etape 5 : Cration du programme


Cest ltape o il y a le plus de travail fournir mais o il y a peu daide dans ce
document.
En effet, il sagit de construire le programme partir du fichier Squelet.asm que vous
aurez bien entendu renomm (par exemple en Exo_1.asm).

Etape 6 : Utilisation de laide


Pour le dveloppement de vos programmes, vous aurez besoin de connatre le
langage assembleur des microcontrleurs ST7 avec ses mots cls et ses modes
dadressage. Vous avez bien entendu votre disposition la documentation papier,
mais aussi laide en ligne. Cette dernire est accessible partir du menu :
Help / ST7 Instruction Set Contents
Cette documentation est assez complte, avec des exemples, et permet de trouver
coup sr la rponse sa question.

Etape 7 : Compilation du projet


Une fois que vous pensez avoir fini votre programme, ou juste une partie que vous
voulez tester, il faut passer ltape de compilation. Cest une tape que vous
connaissez pour lavoir pratique dans dautres langages de programmation comme
le C.
En assembleur comme en C, la compilation sert transformer les fichiers sources
en fichiers objets. Elle est immdiatement suivie dune phase ddition de lien pour
crer le fichier excutable.
Compiler votre projet (en fait le terme plus appropri est construire car il sagit
de compiler puis de faire ldition de liens) se fait trs simplement partir du menu
Build / Build.
Le rsultat de la compilation est affich dans la fentre dinformation, dans la partie
basse du logiciel, sous longlet Build.
Attention :

Pensez systmatiquement vrifier les messages derreur avant de


passer ltape suivante, afin de corriger les ventuelles erreurs de
programmation.

Etape 8 : Configuration du debug


Si aucune erreur ne sest produite lors de la compilation du projet, vous allez pouvoir
passer ltape suivante : le test ou debug du programme.
Remarque :

Pour effectuer l'tape suivante, le cble USB doit tre branch entre le
PC et la carte InDART ainsi que le cble ISP entre la carte inDART et
la carte d'apprentissage. Cette dernire doit galement tre alimente.

Pour lancer le debuggeur, cliquez sur le bouton "Start Debugging" (bouton circulaire
bleu avec D l'intrieur). Vous pouvez galement effectuer cette opration par le menu
Debug / Start Debugging. Ceci ouvre la fentre suivante :

Aprs confirmation, la fentre ci-dessous saffiche :

Cliquer sur le bouton Set Option Bytes pour configurer le mode de fonctionnement
du microcontrleur (type doscillateur utilis, utilisation ou non de la PLL, utilisation
ou non du chien de garde, etc).

Remarque :

cette tape de configuration nest effectuer quune seule fois par


projet, lors de la premire simulation.

Dans la fentre qui souvre alors, certains champs sont modifier avant de poursuivre.
Vous devez avoir la configuration indique ci-dessous :

modifier
(impratif)

modifier
(facultatif)

Les champs 32MHz PLL et PLL doivent tre modifis. (Sinon, la frquence de
lhorloge est multiplie en interne. Ceci nest pas prjudiciable au bon
fonctionnement du micro-contrleur, mais va seulement modifier la vitesse
denchanement des instructions.)
Le champ Watchdog Activation doit imprativement tre positionn sur
Software. (Ceci permet de dsactiver le chien de garde. Si ce nest pas fait, vous
ne pourrez pas tester vos programmes.)

Etape 9 : Debug du programme


A prsent, vous tes dans le debuggeur intgr lenvironnement de dveloppement.
Vous pouvez alors placer des points darrt (ou breakpoint, 2 au maximum) o vous
voulez, excuter votre programme en mode pas pas, visualiser les registres du ST7 ou
des variables, comme dans tout bon debuggeur.
Remarque :

ce document nest pas un manuel du debuggeur donc si vous voulez


plus dinformation, rfrez-vous au manuel intgr au logiciel.

Cette tape permet de vrifier que le programme marche comme prvu. Si ce nest pas
le cas, il faut revenir ltape 5 pour effectuer les modifications ncessaires avant de
retester

Etape 10 : Cest fini !


Vous avez cr votre projet. Il reste maintenant le faire fonctionner correctement, en
rptant les tapes 5, 7 et 9 jusqu obtenir le rsultat demand.
Bon courage et de la persvrance !

ANNEXE 4
Rsum du jeu d'instructions du ST7

Clear and Load Instructions:

Arithmetic Instructions:

CLR

Clear

ADC Addition with Carry

LD

Load

ADD Addition
MUL Multiply

Stack Operations:

SBC

Subtraction with Carry

POP

SUB

Subtraction

from Stack

PUSH Push into the Stack


RSP

Reset Stack Pointer

Shift and Rotate Instructions:


RLC

Rotate Left Through Carry

Increment/Decrement Instructions:

RRC Rotate Right Through Carry

DEC Decrement

SLA/SLL Shift Left Arithmetic

INC

SRA

Shift Right Arithmetic

SRL

Shift Right Logical

Increment

Compare and Test Instructions:

SWAP Nibbles

BCP

Logical Bit Compare

CP

Compare

Unconditional Jump or Call Instructions:

TNZ

Test for Negative or Zero

CALL Subroutine Absolute


CALLR Subroutine Relative

Logical Operations:

JP

Jump Absolute

AND

Logical And

JRA

Jump Relative Always

CPL

Logical 1-Complement

NOP No Operation

NEG Negate
OR

Logical Or

XOR Logical Exclusive Or

RET

Return from Subroutine

Conditional Jump Instructions:


JRC

Jump Relative if Carry

Bit Operations:

JREQ Jump Relative if Equal

BRES Bit Reset

JRF

Jump Relative if False

BSET Bit Set

JRH

Jump Relative if Half-Carry

BTJF Bit Test and Jump if False

JRIH Jump Relative if Interrupt High

BTJT Bit Test and Jump if True

JRIL Jump Relative if Interrupt Low


JRM Jump Relative if Interrupt Mask

Interrupt Management:

JRMI Jump Relative if Negative

HALT

JRNC Jump Relative if No Carry

IRET Interrupt Return

JRNE Jump Relative if Not Equal

TRAP Software Interrupt

JRNH Jump Relative if No Half-Carry

WFI

JRNM Jump Relative if No Interrupt Mask

Wait for Interrupt

JRPL Jump Relative if Positive or Zero


Condition Code Register Management:

JRT

Jump Relative if True

RCF

Reset Carry Flag

JRUGE Jump Relative if Unsigned Greater or Equal

RIM

Reset Interrupt Mask

JRUGT Jump Relative if Greater Than

SCF

Set Carry Flag

JRULE Jump Relative if Lower or Equal

SIM

Set Interrupt Mask

JRULT Jump Relative if Lower Than