Support Cours Microcontroleurs
Support Cours Microcontroleurs
Support Cours Microcontroleurs
DE LUBUMBASHI
« ISTA-LU »
MICROCONTROLEUR
SUPPORT DE COURS
2
Avant-propos
3
4
Support de cours Microcontrôleur
INTRODUCTION
Microcontrôleur :
Circuit programmable capable d’exécuter un programme et qui possède des circuits d’interface
intégrés avec le monde extérieur.
⇒ Quand on a su les fabriquer, c.à.d. quand les technologies d’intégrations ont suffisamment
progressées
⇒ Quand dans les applications domestiques ou industrielles ont avait besoin de systèmes «
intelligents » ou tout au moins programmables.
Exemple
La machine à laver qui doit commander différents organes avec des cycles bien définis mais
variables en fonction du programme choisi.
Toutes les solutions à base de composants programmables ont pour but de réduire le nombre de
composants sur le circuit électronique et donc fiabiliser le circuit.
Logique câblée
o très rapide, fonctions réalisées par une voie matérielle
o non programmable, peu économique quand l’application est
complexe peu de souplesse : durée d’étude prohibitif et
circuit difficilement modifiable
Les μprocesseurs
o grande souplesse : fonctions sont réalisées par voie logicielle
puissance de calcul, langage évolué
o nombre important de composant à réunir, solution onéreuse
5
Support de cours Microcontrôleur
A retenir
Si la fonction à réaliser est simple ⇒ une logique câblée
Si le nombre d'unités à réaliser est très important ⇒ circuits intégrés dédié en logique câblée
pour les fonctions simples
Une réalisation logicielle est toujours plus lente qu'une réalisation en logique câblée : le
microprocesseur exécute une instruction à la fois
Les μcontrôleurs = avantage des μprocesseurs mais limités aux applications ne nécessitant pas
trop de puissance de calcul, nombre de composant très réduit, mais souvent
surdimensionnement devant les besoins de l’application)
Défaut relatif car il existe maintenant systématique des version OTPROM un peu plus chère.
6
Support de cours Microcontrôleur
En conclusion :
un peu de
calcul
Beaucoup d’entrées des sorties variées
Communication
Le microcontrôleur présente l’avantage des μprocesseurs mais limités aux applications ne nécessitant
pas trop de puissance de calcul (architecture courante 8bits)
Il existe plusieurs architecture de microcontrôleurs de 4 à 128 bits pour les applications demandant
une certaine puissance de calcul (injecteurs automobile)
7
Support de cours Microcontrôleur
I. Microprocesseur
D’un point de vue matériel, un système info minimal est constitué d’un processeur, d’une
mémoire, et d’entrées sorties (figure 1)
a) Le processeur (CPU)
Il a pour mission de rechercher les instructions qui sont en mémoire, de les décoder et de les
exécuter. il composée de plusieurs éléments internes :
1 unité arithmétique et logique (UAL) : chargée des calculs +,-,*,/, AND, OR, NOT
8
Support de cours Microcontrôleur
Cœurr
Les registres de données (X, Y, D0, Dx,..) permettent de stocker les opérandes
nécessaires aux instructions de calcul ainsi que les résultats lors d’opérations
logiques et arithmétiques.
Les registres d’adresses (A, A0, Ax,..) permettent de stocker les adresses
d’opérandes qui se trouvent en mémoire.
9
Support de cours Microcontrôleur
b) la mémoire
la mémoire est utilisée pour le stockage d’instructions, de données et de la pile (la pile est une
portion mémoire réservée pour sauvegarder le contexte d’exécution d’une procédure .
La mémoire est constituée de cellule de mémorisation binaire, groupées en mots de 8, 16, 32 ou
64 bits.
La mémoire est adressée par mots de 8 bits, c.à.d. par octets (bytes).
Une position mémoire est spécifiée par l’adresse d’un octet.
10
Support de cours Microcontrôleur
c) Le bus système
Il comporte les lignes permettant de relier entre eux le processeur, la mémoire, et les entrées
sorties.
Il comprend les lignes d’adresses provenant du microprocesseur, les lignes de données
bidirectionnelles et les lignes de contrôle.
Le cœur d’un système informatique est formé par l’interaction entre le processeur et sa
mémoire.
d) Une horloge
(Un circuit oscillateur délivrant des impulsions à une certaine fréquence) sera nécessaire pour
exécuter les opérations séquentiellement).
11
Support de cours Microcontrôleur
Plus la fréquence sera grande, plus l’unité centrale travaillera vite. (8MHZ veut dire 8 millions
d’impulsions par secondes)
e) Les entrées-sorties
1) Les instructions et les données sont dans une mémoire unique, banalisée,
accessible en lecture/écriture
Le programme est une suite de nombres qui code les instructions du langage de
programmation. Les données sont d’une part ce qui est traité sous le contrôle des instructions
et d’autre part les résultats du calcul.
12
Support de cours Microcontrôleur
Exemple :
13
Support de cours Microcontrôleur
Dans le cas de notre processeur simple, après activation de la ligne de remise à zéro (reset) le
compteur ordinal (PC) est remis à zéro.
La première action entreprise par le processeur consiste à effectuer un cycle d’accès mémoire
afin de lire le code de la première instruction à l’adresse 0 en mémoire.
Le processeur mémorise ce code (H’103C) dans son registre d’instruction, le décode et
l’interprète. Le compteur ordinal (PC) est ensuite mis à jour afin de pointer à la prochaine
instruction.
14
Support de cours Microcontrôleur
le diagramme temporel suivant donne la succession des cycles d’accès mémoire et entrées
sorties lors de l’exécution du programme Bruit HP.
c) Architectures de microprocesseurs
L'architecture CISC
15
Support de cours Microcontrôleur
Exemple
REP MOVSB = déplacement de plusieurs octets d’une adresse A vers une adresse B
L'architecture CISC (Complex Instruction Set Computer, ce qui signifie "ordinateur avec jeu
d'instructions complexes") est utilisée par tous les processeurs de type x86, c'est-à-dire les
processeurs fabriqués par Intel, AMD, Cyrix, ...
Les processeurs basés sur l'architecture CISC peuvent traiter des instructions complexes, qui
sont directement câblées sur leurs circuits électroniques, c'est-à-dire que certaines instructions
difficiles à créer à partir des instructions de base sont directement imprimées sur le silicium de
la puce afin de gagner en rapidité d'exécution sur ces commandes.
L'architecture RISC
è 1975 David Patterson = 80 % des instructions d’un programme n’utilisent que 20 % des
instructions du CPU
La création du RISC vient d'une critique des compilateurs, et non pas des processeurs CISC.
Les compilateurs n'étaient pas capables de bien d'utiliser le jeu d'instructions d'un CISC.
Faire un bon compilateur RISC est plus simple qu'on bon compilateur CISC.
16
Support de cours Microcontrôleur
Pipelining
objectif : faire en sorte que l’UAL n’ait pas à attendre de données, temps d’exécution / k,
problèmes liés aux dépendances.
A1 A2 A3 A4 A1 A2 A3 A4
A1 A1 A1 A1 A2 A2 A2 A2
Fetch A1 A2 A3
Decode A1 A2 A3
Execute A1 A2 A3
Write A1 A2 A3
è exploiter le parallélisme au niveau des instructions è traiter
plusieurs instructions par cycle è dupliquer le nombre d’unités
de traitement (2 UAL, 2 UVF) è limite atteinte pour 5 à 6
instructions à exécuter en parallèle Processeurs Vectoriels
17
Support de cours Microcontrôleur
MMX = Multimedia
Les unités MMX sont intégrées au CPU et sont de type SIMD (Single
Instruction Multiple Data).
è Les données sont stockées sur 64 bits (2x32,4x16,8x8) et peuvent être traitées
en même temps
è L’unité MMX permet de traiter les données vidéo et audio beaucoup plus
rapidement que l’UAL
è SSE = Internet Streaming SIMD (opération d ’imagerie 3D, accélération du
téléchargement de fichiers audio et vidéo)
d) Le concept de Pile
18
Support de cours Microcontrôleur
En résumé, le pointeur de pile est initialisé à la valeur max : quand on empile on décrémente le
compteur de pile et quand on dépile on incrémente le compteur de pile.
La pile croit en direction de positions mémoire d’adresses décroissantes.
1.3. Les Interruptions
a) Principes
Afin d’agir en réponse à un événement extérieur sans nécessiter de scrutation continue, les
processeur possèdent un mécanisme d’interruption.
Celui-ci offre la possibilité de modifier le déroulement du programme lors de l’occurrence de
l’événement extérieur.
L’adjonction au processeur d’une ligne d’interruption permet, lorsque cette ligne devient
active, d’engendrer une requête d’interruption.
Le processeur appelle alors automatiquement une procédure appelée routine d’interruption
qui se trouve à une position prédéfinie indiquée via le vecteur d’IT..
Tout se passe comme si une instruction CALL était insérée juste après l’instruction en cours au
moment où la requête d’interruption devient active.
La routine d’interruption doit s’effectuer de manière transparente: après retour au programme
interrompu l’état du processeur doit être exactement le même qu’avant l’interruption.
Ceci implique que la routine d’interruption doit sauver au début de son exécution tous les
registres internes y compris le registre d’état contenant les fanions (flags).
Cette opération est appelée sauvegarde du contexte.
b) gestion des IT
Le mécanisme de prise en compte des interruptions qui se trouve dans le processeur empêche
une nouvelle interruption de niveau identique à celui de l’interruption précédente de venir
interrompre l’exécution de la routine d’interruption.
20
Support de cours Microcontrôleur
Schématiquement, les principaux registres internes associés au contrôle des interruptions sont le
registre de mémorisation de requête d’interruption
le registre de masquage d’interruption (Interrupt Mask Register) qui permet d’autoriser ou
d’inhiber de manière sélective une ligne de requête d’interruption.
le registre de service d’interruption qui mémorise les vecteurs d’interruption associées aux
différentes sources d’interruption et qui indique l’interruption actuellement en service.
c) conclusion
21
Support de cours Microcontrôleur
II. Microcontrôleurs
En plus de cette configuration minimale, les microcontrôleurs sont dotés d'un ou plusieurs
systèmes de comptage (TIMER).
Quelques-uns sont dotés d'un convertisseur analogique/numérique (CAN) intégré.
Ces atouts supplémentaires permettent de nombreuses applications telles que :
- acquisition et traitement de données analogiques (CAN)
- comptage d'événements (TIMER)
- mesure de fréquence ou de période (TIMER)
- génération d'impulsions (TIMER)
• les programmes peuvent être différents (gestion d’un thermostat intelligent, d’une
photocopieuse..)
• les programmes ont en commun peut de calculs complexes contrairement à un système
informatique)
ROM Timer 1
Contrôleur
UVPROM
d’interruptions RAM EEPROM
OTPROM Timer 0
BUS Interface
CPU
spécifique
Quartz externe ou
interne Monde extérieur
TXD RXD
22
Support de cours Microcontrôleur
Il suffit de choisir le microcontrôleur le mieux adapté à l’application que l’on doit réaliser. !
On les appelle comme ça de façon impropre LES ROM sont aussi a accès aléatoire
Ces mémoires perdent l’information lorsqu’elles ne sont plus alimentées.
Pour pouvoir travailler normalement le μcontrôleur doit pouvoir a souvent besoin de stocker
des données temporaire quelque part et c’est là qu’intervient la RAM.
23
Support de cours Microcontrôleur
Les circuits d’interfaces peuvent piloter des matériels très différents, (moteur pas à as,
afficheur LCD, thermistance, communication avec des pc ou d’autres μcontrôleurs, etc…)
Le bus système
L’unité centrale doit pouvoir communiquer avec les mémoires et les périphériques.
Exemple : pour écrire une donnée en mémoire, l’UC doit d’abord spécifier l’adresse de la
mémoire, puis envoyer la donnée, et en dernier lieu, envoyer un signal qui validera la
mémorisation de la donnée.
Tous ces signaux seront véhiculés par les « bus », ensembles de « conducteurs », sur lesquels
viennent se brancher les mémoires, les interfaces des périphériques.
Outre les différents périphériques possibles, les différents types de mémoire constituent les
différentes gammes de microcontrôleurs de même architecture.
24
Support de cours Microcontrôleur
3. Autres
25
Support de cours Microcontrôleur
Exemple
D[k]=C[j]+B[i] ;
LD X,i
LD A,([B],X)
LD X,j
ADD A,([C],X)
LD X,k
LD ([D],X),A
26
Support de cours Microcontrôleur
La pile est une zone de mémoire vive utilisée par les instructions CALL, RET et PUSH ,
POP
Quand une valeur est empilée, SP est décrémenté et la valeur est écrite à l’adresse située
immédiatement en dessous de la dernière valeur empilée.
1 1 1 H I N Z C
Le bit C
C’est le bit de retenu (addition ou soustraction)
Exemple : addition 16 bit
27
Support de cours Microcontrôleur
1200 + 6230
4B0 + 1856 = 1D06
B0 + 56 = 106 (hexa) 1 est la retenu
4 + 18 = 1C, 1C+1=1D
pour cela la première instruction utilise ADD, et toutes les autres ADC
IDEM pour la soustraction avec SUB et SUBC
Le bit Z
Il permet de savoir si le dernier résultat était zero ou non
Le bit N
Il permet de savoir si le dernier résultat était négatif ou non
Le bit I
C’est le masque global d’interruptions. Quand il est à 1 toutes les demandes
d’interruption sont ignorées.
Si une demande est en attente son passage à 0 déclenche l’interruption.
Le bit H
Il reflète la retenu entre le 4ème et le 5ème bit d’un octet.
Utilisé en arithmétique décimale codée binaire (BCD) chaque groupe de 4 bits
contient un digit décimal, mais le groupe suivant à une valeur seulement 10 fois
plus grande au lieu de 16. chaque groupe peut prendre les valeurs 0 à 9 , les
valeur 10 à 15 étant interdites.
Utilité de l’arithmétique BCD : évite les conversions décimale en binaire et vice
versa.
ST7 : Architecture de type Von Neumann, donc une seule espace adressable continu.
28
Support de cours Microcontrôleur
Avantage :
Accès à n’importe quel octet par les mêmes instructions
Microcontrôleur 8 bits , bus d’adresses 16 bits et peu donc adresser 65536 octets.
Utiliser la page zéro est avantageux car le s instructions qui en décou lent sont plus courtes et
plus rapides.
Le jeu d’instruction
c) Le jeux d’instruction
8 bits
29
Support de cours Microcontrôleur
Le cœur du ST7 est cadencé par une horloge interne qui provient de la division de la fréquence
de l’oscillateur.
Le rapport de division est programmable, ce qui permet de sélectionner le meilleur compromis
entre vitesse et consommation d’énergie.
30
Support de cours Microcontrôleur
Et niveau 0 Pf0=E/S
bas 0 0 1 Pf0=fcpu
seul 0 1 Oscilateur
/2 0 0
seul 1 0
fcpu /4 0 1
ou 1 1 /2
/8 1 0
/16 1 1
Pf0
31
Support de cours Microcontrôleur
Une fois le programme au point, on peut fixer la valeur du compteur à la moitié du max et
ensuite approcher par la valeur optimale par dichotomie.
Si le chien de garde déclenche trop tôt on double la valeur, si le reboot n’est pas gênant pour
l’appli, on prend la moyenne etc,..de façon à trouver la plus petite valeur qui permet à l’appli
de fonctionner.
Une fois cette valeur trouvée, il est de bon ton de la multiplier par un coefficient de sécurité
(gestion des imprévus) !
Le st7 dispose de 2 circuits Timer 16 bits (Timer A et Timer B) indépendants et proposant les
mêmes fonctionnalités.
L‘intérêt d’un tel périphérique est qu’il traite ces opérations sans l’intervention du cœur !!
Horloge du temporisateur
2 sources possibles :
- horloge interne
- horloge externe (sur une broche spécifique d’un port parallèle)
TACR1
32
Support de cours Microcontrôleur
TACR2
OC1E OC2E OPM PWM CC1 CC0 IEDG2 EXEDG
0 0 /4
0 1 /2 ftimer=fcpu/prediv
fcpu
1 0 /8
1 1 External
Horloge du
temporisateur
TASR
TACR est composé de 2 mots de 8bits chacun notés TACHR (HIGH : 8 bits de
poids fort) et TACLR (LOW : 8 bits de poids faible) qui s’incrémente
automatiquement à la fréquence du temporisateur.
33
Support de cours Microcontrôleur
Flag de débordement
Le bit TOF du registre de status TASR indique le débordement de FFFF à 0000
soit 4 impulsions après l’initialisation du compteur.
Le bit TOF passe à 1 si débordement il y a eu.
Pour remettre le bit TOF à 0 il faut lire TASR et lire ou écrire dans TACLR
Mécanisme qui produit un événement quand la valeur courante du compteur est égale à
la valeur d’1 des 2 registres de comparaison TAOC1HR TAOC1LR ou TAOC2HR
TAOC2LR.
34
Support de cours Microcontrôleur
Si OC1E est à 1 la valeur du bit OLVL1 est copiée sur la broche au moment de
l’évènement de comparaison..
Le flag OCF1 est mis à 0 par lecture de TASR puis lecture ou écriture de TAOC1LR
La transition de signal déclenchant la capture est définie par le bit IEDG1 : front
montant (IEDG1=1) ou descendant (IEDG1=0) :
Pour chaque Timer il existe 2 captures possibles (2 broches dédiées, input capture
1 et input capture 2)
L’interruption de la capture
35
Support de cours Microcontrôleur
d) Le mode PWM
36
Support de cours Microcontrôleur
Description :
37
Support de cours Microcontrôleur
Toute écriture dans le registre de control/statuts ADCCSR (un seul registre) stop la
conversion en cours.
Les ports d’entrée/sortie AIN0 à AIN7 doivent être configurées en entrée (PADDR=0)
et sans interruptions (PAOR=0) pour être en haute impédance afin d’éviter toute
interférence.
38
Support de cours Microcontrôleur
Configuré en sortie
De nombreux microcontrôleurs proposent des ports qui peuvent servir d'entrée et de sortie par
souci d'économie de place.
On par exemple commander un afficheur à LED est scruter un clavier sur un unique port.
La lecture du clavier peut être faite pendant des temps morts aménagés entre deux commandes
d'affichage.
L’affichage
39
Support de cours Microcontrôleur
LED (Sortie fort courant (High sink) ) : utilisation d’une résistance de limitation
+5 V
Pb0
R = 220 à 330 Ohms
+5 V
RLIM
4.7 kOhms
Pb0
2 N222A
40
Support de cours Microcontrôleur
Commande de puissance
Transistor MJ 3001
Montage Relais
la résistance de tirage au 0 volt (push pull) permet d’imposer un 0 logique sur l’entrée
du circuit TTL.
la résistance de tirage au 5 volt (pull up) permet d’imposer un 1 logique sur l’entrée du
circuit TTL.
41
Support de cours Microcontrôleur
Les claviers
Lorsqu'il s'agit de n'utiliser que quelques boutons poussoirs, il suffit de les connecter
aux lignes d'entrées (un par ligne).
Cependant, il est souvent indispensable de mettre en place un clavier ; il n'est alors plus
possible de réserver une ligne par bouton.
Une solution consiste à faire appel a un encodeur de clavier externe qui recevra N
touches en entrées et fournira un code sur P bits en sortie avec N= 2^P.
Ainsi, 16 touches peuvent être codées sur 4 bits.
Une autre solution, celle du clavier en matrice n'utilise pas de circuit externe.
Comme le montre la figure, les touches sont placées à l'intersection des lignes et des
colonnes du quadrillage réalisé par les deux groupes de quatre fils.
Il suffit alors de localiser le court-circuit entre une ligne et une colonne lorsqu'une
touche est enfoncée.
Cette localisation se fait en deux temps (logiciel).
Les lignes sont mises au niveau logique bas et les colonnes au niveau haut ; on connaît
la colonne se trouve la touche utilisée.
On inverse le rôle des lignes et des colonnes pour trouver la ligne.
Connaissant la ligne et la colonne, on retrouve la touche enfoncée.
Cette dernière solution est la plus intéressante puisqu'elle ne nécessite qu'une dizaine
de ligne en assembleur, elle ne nécessite pas de circuit supplémentaire et réalise une
économie de lignes d'entrées/sorties.
42
Support de cours Microcontrôleur
Que ce soit pour utiliser des microcontrôleurs sans ROM interne, pour ajouter de la
RAM ou un circuit d'interface, il est parfois utile se faire sortir le bus interne.
Exemple du MC68HC11A8 où le bus de données est multiplexé avec les 8 bits de poids faible
du bus d'adressage sur le port C du microcontrôleur alors que les bits de poids fort du dus
d'adressage sont disponibles sur le port B. =
43
Support de cours Microcontrôleur
Remarque :
un seul vecteur d’interruption pour plusieurs événements possibles
Cas du timer : au niveau logiciel pour connaître l’origine précise de l’événement il faudra tester
les différents fanions ou flag.
c’est au moyen du fichier du type prm que au moment de l’édition le compilateur fait le lien
entre le vecteur d’interruption et le nom de la routine d’interruption associée à l’événement et
déclarée dans le programme.
le vecteur d’interruption contiendra alors l’adresse du début de la routine (adresse codée sur 16
bits)
44
Support de cours Microcontrôleur
L’intérêt principal :
Nécessité de dvper en langage évolué ; l’assembleur proche du langage machine est trop peu
lisible est mal adaptés à une architecture complexe de programme.
C’est le cas du C.
Avantages :
• le C reste proche du matériel (mise à 1 ou 0 d’un bit d’un port d’entrée sortie)
• le C est structuré (prog. Facilement divisible en bloc = fonctions,..)
• 1 seule ligne de C peut produire plusieurs centaines d’instructions assembleur =
simplification du code source, et fiabilité.
• Souplesse de travail de part la portabilité globale d’un programme en C (hors gestion
entée/sortie)
• Portabilité entre différents types de microcontrôleurs de la même famille
Inconvénients :
• Le C destiné à l’origine pour de gros ordinateurs à mémoire centrale. Une même mémoire
pour le programme, les données.
Dans un microcontrôleur le programme dans une mémoire à lecture seule, les données
dans une mémoire en lecture écriture mais volatile (modifiable par événement extérieur
autre que programme).
Le C n’a pas d’outils standard pour gérer ces différences.
• Les interruptions doivent et peuvent être écrites en C. les interruptions ne sont pas des
concepts du langage C.
• Différentiation des propriétés des RAM et ROM pour intégrer la notion d’entrée/sortie
Exemple :
Le modificateur volatile permet à une donnée de pouvoir être modifiée par le programme, mais
aussi par un évènement extérieur.
45
Support de cours Microcontrôleur
C’est le cas des registres d’entrées, des registres d’état d’un périphérique, etc..
Exemple :
La directive #pragma TRAP_PROC qui permet de déclarer les routines d’interruptions.
Les pointeurs near et far dans la définition des pointeurs pour optimiser l’adressage.
Pour optimiser les accès mémoire, le compilateur Hiware propose 4 modèles d’organisation de
la mémoire.
Adressage direct :
les variables sont stockées en page zéro (Short Addressing) 0080h – 00FFh c’est un adressage
court sur un octet (avantage longueur du code généré et rapidité d’exécution)
Adressage étendu :
Les variables sont situées à des adresses ≥ 0100h
46
Support de cours Microcontrôleur
Large Adressage direct Adressage étendu Mode par defaut, bien adapté au
ST7
//ANSI C
#define VAR (*(char *) (0x0010)) //L’Adresse de VAR est fixée à 0x0010
//ST7
#pragma DATA_SEG MY_RAM //défini dans le fichier LINK (*.prm) char
VAR ;
le linker alloue la mémoire séquentiellement dans l’ordre des déclaration et optimise l’espace
mémoire quand une variable n’est pas utilisée.
Attention à la déclaration des registres matériels : dans le fichier de LMINK on doit rajouter + à
chaque fichier objet
FILE.C
47
Support de cours Microcontrôleur
FILE.PRM
NAMES
FILE.O+
….
PLACEMENT
REG_AREA in NO_INIT 0x0070 TO 0x0072
Les segments sont définis dans un fichier de paramétrage utilisé par le link et d’extension prm.
On peut revenir à tout moment au segment par défaut des variables par :
#pragma DATA_SEG DEFAULT
Ce modificateur génère un message d’erreur lors d’une tentative d’écriture sur cette constante.
Exemple :
const char HEXADECIMAL[] = {‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘A’, ‘B’, ‘C’,
‘D’, ‘E’, ‘F’} ; l’attribut const associé à l’option de compilation –Cc permet de ne pas
encombrer la RAM avec ses 16 valeurs.
Permet de conserver certains paramètres lorsque le composant est mis hors tension.
Les données sont accessibles en lecture/écriture
Afin que ces données soient stockées aux addresses de L’EEPROM, un segment particulmier est
créé par l’intermédiaire d’une pragma :
49
Support de cours Microcontrôleur
en mode LARGE (-Mi ou –Mx option) pour accéder à une donnée en page 0 via un pointeur
utiliser préférentiellement le mot clé near
en mode SMALL (-Ms option) pour accéder à une donnée en dehors de la page 0 via un
pointeur utiliser préférentiellement le mot clé far
Les registres des périphériques sont des variables localisées dans la mémoire de données en
page zéro.
A l’inverse des variables utilisateur ces registres sont situés à des adresses fixes prédéfinies par
construction dans le μcontrôleur.
Première méthode :
Cette méthode crée un pointeur absolu sur le registre au moyen d’une macro
Seconde méthode :
Elle consiste à attribuer un segment pour chaque périphérique à l’intérieur duquel les
registres sont définis comme une suite de variables du type unsigned char.
Cette suite est ordonnée selon la position physique des registres dans la memory map
de la RAM du composant.
50
Support de cours Microcontrôleur
tous les registres d’un modèle de la famille ST7 seront regroupés dans un fichier source : ici
map72311.c
Le segment DATA_SEG SHORT SPI est défini entre les adresses 21h et 23h au moment du link
par le fichier de paramétrage utilisé : *.prm (Linker Parameter File)
PLACEMENT
// some declarations…
SPI INTO ASPI;
// more declarations…
ATTENTION : l’édition de lien optimise le code en éliminant, dans chacun des segments les
registres non utilisés par le programme et remplit les addresses laissées vides en décalant les
adresses des registres suivants.
Pour l’interdire d’optimisation on rajoute le signe + dans la partie NAMES du fichier de
paramétrage.7
NAMES prog1.o
map72311.o+
start07.o
ansi.lib END
51
Support de cours Microcontrôleur
dans map72311.h
// Timers A&B Control Register 1 bit definition
Exercice
BitSet, BitClr set/clear a defined bit in the hardware register map BitVal
return the logic value of a defined bit.
Comments :
- VAR : Name of the character variable where the bit is located.
- Place : Bit position in the variable (7 6 5 4 3 2 1 0)
- Value : Can be 0 (reset bit) or not 0 (set bit)
The "ValBit" command returns the value of a bit in a char variable:
the bit is reseted if it returns 0 else the bit is set.
53
Support de cours Microcontrôleur
des pragma spécifiques pour la gestion des interruptions du ST7 ont été rajoutées.
#pragma TRAP_PROC
void InterruptFct (void) {…}
Note : pour sécuriser les vecteurs d’interruption inutilisés il vaut mieux les diriger vers un bout
de code vide (dummy_rt)
sauvegarde du contexte
par défaut le compilateur utilise 3 variables de stockage pour des opérations étendues.
Ces variables sont _SEX (stockage indirect), _LEX (pour chargement indirect) et RZ (pour
stockage temporaire) et sont stockées en page 0.
Ces variables peuvent être utilisées à n’importe quel moment et ne sont pas contrôlées par le
programmeur,
dans un premier temps on doit avant l’utilisation d’une routine sauvegarder le contexte de ces
registres logiciel.
dans un second temps après avoir vérifié si le code généré de la routine d’interruption utilise ces
variables, on peut supprimer ou non la pragma SAVE_REGS
54
Support de cours Microcontrôleur
Initialement créer pour les systèmes UNIX, maintenant largement utilisé dans les systèmes
embarqués.
Le choix d’utiliser le C dans les applis micro :
Langage structuré basé sur les types de données et des structure de contrôle évoluée. Ca
portabilité sur différents cibles micro
normalement les variables locales et les paramètres sont stockés dans la pile.
Pour générer un code plus optimisé, le compilateur Hiware utilise une zone ram dédiée
appelée OVERLAP (chevauchement) les instructions ST7 ne permettent pas un accès simple
aux données de la pile (LD A,[SP,#n]).
La solution requiert deux instructions assembleur (LD X,S puis LD A,[#0x10100+n,X] avec
0x0100 bas de la pile et n l’offset de position de la donnée)
en assembleur on a :
RET
Création d’une fonction lorsqu’un groupe d’instructions est répété plusieurs fois
exemple
for ( p1 = string1, p2 = string2 ; ( *p2 = *p1) ; p1++ ,p2++) ; une
seule ligne d’écriture pour une tache puissante.
cette ligne de code copie une chaîne de caractère dans une autre, en recopiant chaque octet d’un
emplacement mémoire vers un autre.
Si l’on doit répéter cette ligne plusieurs fois dans le programme il est avantageux d’en faire une
fonction
Les multiplications ou les divisions sont des gros consommateurs de temps machine.
Quand le multiplicateur ou le diviseur a pour valeur une puissance de 2 , il faux réaliser un
decalage.
Exemple :
A = B / 16 ;
Sera remplacé par :
A = B >> 4 ;
Dans ce cas le compilateur créé un code optimisé de manipulation des bits.
56
Support de cours Microcontrôleur
Une architecture 8 bit est par construction plus efficace pour une manipulation de données de
type char.
Prévoir des tables de valeurs pré calculées, par exemple stockées en EEPROM
MOD_FILE.c
char Mod_cVar ;
int MOD_iFct(void)
{…}
préférer les fns génériques aux macros. Sauf si macro très courtes et optimisées
Note : tous les bloques d’instructions répétés doivent être remplacés par une fonction si possible.
Variables Statiques
le qualificateur volatile doit être ajouté devant chaque déclaration de registre hardware pouvant
être modifié par le matériel.
Cela permet au compilateur de désactiver l’optimisation de la mémoire.
pour certaines instruction très spécifique au ST7, le langage C peut ne pas être approprié.
Pour cela le compilateur permet d’insérer des lignes de code HLI (high level inline
assembleur) par exemple pour gérer de timings spécifiques….
tous les type de données du programme en C sont accessible dans avec l’assembleur en ligne.
#define CST 10
struct {char field1 ; caher field2 ;} str ;
char var, array[10] ;
..
asm
{
LD A, 0x0xA100 acces direct à la mémoire LD A, 0xA100
CP A, #CST CP A, #0x0A
Note : le caractère # est utilisation pour concaténer des chaînes de caractères, et comme les
instructions du ST7 utilise # poyr les valeures immédiates, le compilateur HIWARE C permet
d’utilser la pragma NO_STRING_CONSTR qui désactive les ordre au preprocesseur.
Exemple :
#pragma NO_STRING_CONSTR
#define LDA10LDA,#10 asm
LDA10;
59
Support de cours Microcontrôleur
l’alimentation
Régulateur type 7805
Vcc Horloge
(+5v)
c
le circuit de reset 1
(sensible à un niveau bas) +V
Quartz c
2
R
Alimentation et horloge
Le microcontrôleur doit être choisi en fonction de la façon dont est alimentée l'application
(secteur ou pile) et de la tension d'alimentation des autres éléments du circuit.
Dans la plupart des cas, les microcontrôleur utilisant la technologie CMOS et HCMOS sont les
plus adaptés.
Sur tous les microcontrôleurs actuels, le générateur d'horloge est intégré.
Il ne reste plus qu'à placer un composant externe pour en fixer la fréquence d'utilisation.
Il faut donc se reporter à la documentation technique du constructeur pour connaître la plage
d'utilisation du circuit.
Selon les fabricants et les familles, l'horloge interne est configurée à partir d'un quartz, d'un
résonateur céramique ou d'un générateur de signaux carrés.
Le résonateur céramique est moins précis que le quartz mais coûte moins cher.
Il permet cependant de rythmer précisément des opérations sur de courtes périodes.
Le générateur de signaux carrés externe est utilisé assez rarement.
60
Support de cours Microcontrôleur
61
Support de cours Microcontrôleur
Assembleur et compilateur
Le compilateur, quant à lui, traduit les instructions écrites en langage évolué en code binaire
exécutable.
L'ensemble de ces instructions constitue aussi un listing ou code source et le code binaire est
appelé code objet.
Les systèmes de développement pour microcontrôleur s'apparentent ainsi à ceux qui existent
sur les ordinateurs.
Assembleur et compilateur doivent cohabiter sans heurt.
Cela est d'autant plus vrai pour les microcontrôleurs que les entrées/sorties performantes et
rapides se conçoivent en assembleur.
Un compilateur bien interface avec le langage machine permet de pouvoir écrire des sous
programmes directement en langage machine au sein du programme en langage évolué.
Emulateur et simulateur
62
Support de cours Microcontrôleur
Dans certains cas, un simulateur suffit à tester la plupart des fonctionnalités d'un
programme.
L'émulateur est en fait un programme sur une machine qui reproduit le fonctionnement
de l'unité centrale.
Les entrés/sorties y sont représentées par des octets qu'on présente ou qu'on lit.
On ne pourra pas non plus tester l'application en temps réel.
Un simulateur n'apporte donc pas toutes les possibilités qu'un émulateur, mais élimine un
grand nombre d'erreurs et suffit pour des applications sans entrées/sorties particulières et sans
notion de temps.
Une fois la mise au point du programme achevée, on peut faire les derniers tests selon deux
cas. Si on désire utiliser des versions OTP, on programmera des EEPROM ou UVPROM
équivalentes.
Cela permet d’opérer d'ultimes modifications.
Si par contre, on désire utiliser des versions programmées par masque, il faudra envoyer le
programme au fabricant qui produira en retour une pré-série et attendra l'accord pour
commencer la production en série.
63
Support de cours Microcontrôleur
Test de l'application
Envoi du programme
au fabricant
Accord au fabricant
pour la série
64
Support de cours Microcontrôleur
Organigramme de développement
4.3. La chaîne de développement ST7
LINK prog1.abs
NAMES
prog1.o
map72311.o+
start07.o // Tout programme en C Hiware doit être lié au fichier start07.o ansi.lib
END
SECTIONS
65
Support de cours Microcontrôleur
PLACEMENT
PORTS INTO APORTS;
TIMERA INTO ATIMERA;
SPI INTO ASPI;
END
(si un segment est de taille supérieure à la section qui lui est attribuée, l’édition de lien
échouerait et le fichier .abs ne serait pas généré)
• La taille de la pile
STACKSIZE = 0x40 ;
• La liste des vecteurs d’interruption et de démarrage. Les vecteurs sont caractérisés par
un nom de fonction auquel le programme d’interruption doit se brancher. Pour chaque
type d’interruption la localisation mémoire est reportée.
! l’éditeur de lien produit, en plus du fichier .abs, un fichier .map qui résume les adresses
des segments, des variables, ainsi que des informations utiles pour le débogage.
66
Support de cours Microcontrôleur
enviro.prm : fichier de link qui sert à définir les zone mémoires des périphériques et des
variables du programme en fonction du maping mémoire du microcontrôleur. Définition
également des vecteurs d’interruption et des nom des routines d’interruption que l’on retrouve
dans le programme principal.
defaut.env : fichier d’environnement qui contient les options de compilations ainsi que les
différents path du projet. (Chemin du compilateur et du linker)
#include <hidef.h>
#include "map72334.h" // ST72334 memory and registers mapping
#include "lib_bits.h" // Predifined libraries working at bit level
void main(void)
{
DisableInterrupts;
MISCR1=(0<<SMS)| // mode normal fCpu=fosc/2=8Mhz
(1<<CP0)| // inoperant pour SMS=0
(1<<CP1)| // inoperant pour SMS=0
(0<<IS20)|
(0<<IS21)|
(0<<MC0)| // pas de clock ext
(0<<IS10)| // pour que l'interruption ei3 sur le port B soit
(1<<IS11); // en front descendant
init();
init_timer();
EnableInterrupts;
67
Support de cours Microcontrôleur
while(1)
{
}
}
void init(void)
{
//entree
ClrBit(PBDDR,3); //pb3 (interrupteur) en entrée interruption
SetBit(PBOR,3);
//sortie
SetBit(PBDDR,2); //config LED
SetBit(PBOR,2);
}
void init_timer(void)
{
TACR1=(0<<ICIE)|
(1<<OCIE)| //output compare
(0<<TOIE)|
(0<<FOLV2)|
(0<<FOLV1)|
(0<<OLVL2)|
(0<<IEDG1)|
(0<<OLVL1);
TACR2=(0<<OC1E)|
(0<<OC2E)|
(0<<OPM)|
(0<<PWM)|
(1<<CC1)| //ftimer=fcpu/8
(0<<CC0)| //ftimer=1Mhz
(0<<IEDG2)|
(0<<EXEDG);
ChgBit(PBDR,2); asm
{ ld a,TASR
ld a,TAOC1LR
}
//mise à 0 du timer perpétuel TACR
TACLR=0;
}
}
LINK led_i.abs
STACKTOP 0x1FF
SECTIONS
ZRAM = READ_WRITE 0x0080 TO 0x00FF;
RAM = READ_WRITE 0x01FF TO 0x0200; /* pour le J4 */
ROM = READ_ONLY 0xE000 TO 0xFFFF;
PLACEMENT
PORT INTO NO_INIT 0X0000 TO 0X0016;
MISC1 INTO NO_INIT 0X0020 TO 0X0020;
MISC2 INTO NO_INIT 0X0040 TO 0X0040;
SPI INTO NO_INIT 0X0021 TO 0X0023;
ITC MCC INTO NO_INIT 0X0024 TO 0X0027;
INTO NO_INIT 0X0029 TO 0X0029;
WDG INTO NO_INIT 0X002A TO 0X002B;
EEPROM INTO NO_INIT 0X002C TO 0X002C;
Timer_A INTO NO_INIT 0X0031 TO 0X003F;
Timer_B INTO NO_INIT 0X0041 TO 0X004F;
SCI ADC INTO NO_INIT 0X0050 TO 0X0057;
INTO NO_INIT 0X0070 TO 0X0071;
DEFAULT_ROM, ROM_VAR, STRINGS INTO ROM;
DEFAULT_RAM INTO RAM;
_ZEROPAGE, _OVERLAP INTO ZRAM;
END
69
Support de cours Microcontrôleur
/*
VECTOR ADDRESS 0XFFF2 eit2_rt
VECTOR ADDRESS 0XFFF6 eit0_rt VECTOR ADDRESS
0XFFF0 eit3_rt
VECTOR ADDRESS 0XFFE0 dummy_rt
VECTOR ADDRESS 0XFFE2 dummy_rt
VECTOR ADDRESS 0XFFE4 eeprom_rt
VECTOR ADDRESS 0XFFE6 sci_rt
VECTOR ADDRESS 0XFFE8 timb_rt
VECTOR ADDRESS 0XFFEA tima_rt
VECTOR ADDRESS 0XFFEC spi_rt
VECTOR ADDRESS 0XFFEE dummy_rt
VECTOR ADDRESS 0XFFF0 eit3_rt VECTOR
ADDRESS 0XFFF2 eit2_rt VECTOR
ADDRESS 0XFFF4 eit1_rt VECTOR
ADDRESS 0XFFF6 eit0_rt
VECTOR ADDRESS 0XFFF8 mcc_rt
VECTOR ADDRESS 0XFFFA dummy_rt
*/
LIBPATH=C:\HIWARE\LIB\ST7C\include
GENPATH=*C:\HIWARE\LIB\ST7C;*C:\Projets\Active vision\Asservissement\ST7-232\led334
OBJPATH=C:\Projets\Active vision\Asservissement\ST7-232\led334
ABSPATH=C:\Projets\Active vision\Asservissement\ST7-232\led334
TEXTPATH=C:\Projets\Active vision\Asservissement\ST7-232\led334
COMP=C:\HIWARE\PROG\CST7.EXE
LINK=C:\HIWARE\PROG\linker.EXE
FLAGS=-ml
ERRORFILE=
RESETSTACK=0x3FF
70
Support de cours Microcontrôleur
main.o : $(ENV) lib_bits.h map72334.h hidef.h ansi.lib start07.h main.c $(CC) main.c
71
Support de cours Microcontrôleur
Figure 4.5.1. : Environnement d’une centrale domotique à base d’une carte Arduino
Figure 4.5. 5 : Câblage d’une entrée (A0) commandant une sortie (D11)
74
Support de cours Microcontrôleur
Figure 4.5. 6 : Câblage d’une entrée (D1) commandant une sortie (D12)
75
Support de cours Microcontrôleur
76
Support de cours Microcontrôleur
Nous avons vu par exemple que les diodes lumineuses et les boutons-poussoir
nécessitaient des résistances, mais différentes.
Le programme :
Essayer de décrire sur le papier, sous forme de logigramme ou d'algorithme les
grandes lignes du programme.
Transposer les lignes du programme sur un logiciel
Nommez les variables éventuelles (« Température » par exemple).
Passez sur Blockly@rduino et construisez votre programme, sans connecter la
carte.
Après validation du programme, enregistrez-le.
Les connexions : reliez les composants de la carte Arduino suivant le schéma de
câblage et connecter le système à l’environnement de votre bâtiment
77
Support de cours Microcontrôleur
5.4.Exemple de programme des entrées/sorties sur une carte Arduino) partir du logiciel en
ligne Blockly@rduino
79
Support de cours Microcontrôleur
Bibliographie
[1] J-M Bernard, J Hugon, De la logique câblée aux microprocesseurs Tome 3: Méthodes de
conception de systèmes. Edité par Eyrolles (1984)
[2] R. Zakset A.Wolfe. Du composant au système – Introduction aux microprocesseurs. Sybex,
Paris, 1988.
[3] C. Tavernier, Les microcontrôleurs PIC Recueil d’applications. Dunod , Paris, 2005.
[4] C. Tavernier, Programmation en C des PIC. Dunod , Paris, 2005
[5] C. Tavernier, Les microcontrôleurs PIC Description et mise en œuvre. Dunod, Paris, 2000
[6] C. Tavernier, Les microcontrôleurs PIC 10, 12, 16 Description et mise en œuvre. Dunod ,
Paris, 2007
[7] B.Van Dam, 50 nouvelles applications des microcontrôleurs PIC. Elector, 2010
[8] P. Letenneur, Langage C (CCS Info pour les PICs), 2003
80