Vous êtes sur la page 1sur 35

Institut Universitaire de Technologie de CRETEIL-VITRY

Département de Génie Électrique et Informatique Industrielle

MC-II2 - SYSTEMES EMBARQUES AVANCES

MICROCONTROLEUR - C
MPLABX - XC8

Année universitaire 2013-2014


J. VILLEMEJANE - julien.villemejane@u-pec.fr
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

MC-II2 - SYSTEMES EMBARQUES AVANCES

Ce module d’enseignement se base sur les microcontroleurs PIC16F690 et PIC18F2520 de chez Microchip.
L’environnement de développement utilisé est MPLABX de Microchip dans sa version 1.70. Il est dispo-
nible gratuitement sur le site de Microchip, sur toute plate-forme (Windows, Mac, Linux).
Le compilateur C utilisé est XC8 de Microchip dans sa version 1.12. Il est disponible gratuitement sur le
site de Microchip, sur toute plate-forme (Windows, Mac, Linux).
Les cartes d’étude utilisées ont été réalisés par le département GEII de l’IUT de Créteil. Mais les exemples
donnés peuvent être rapidement portés vers d’autres cartes de développement.

Ce document se base sur les documentations suivantes (disponibles sur le site de Microchip) :
– PIC16F690,
– PIC18F2520,
– MPLAB XC8 C Compiler - User’s Guide,
– PIC18 Peripheral Library - Help Document.

Consignes
– Faites valider chacun des exercices par l’enseignant
– Un compte-rendu est obligatoire pour chaque TP et doit etre rendu à la fin de la
séance. Les réponses aux questions dont le numéro est souligné doivent apparaitre
dans le compte-rendu.

Répartition des séances


– Séance 1 : Introduction aux systèmes embarqués (TP0)
et Découverte de MPLABX
– Séance 2 : Programmation en C des PIC (TP1)
– Séance 3 : Constitution d’un système embarqué à microcontroleur PIC16F (TP2)
– Séance 4 : Migration vers les PIC18F (TP3)
– Séance 5 : TP Test 1
– Séance 6 : Gestion du temps / Timers matériel et logiciel (TP4)
– Séance 7 : Programmation par machine à état (TP5)
– Séance 8 : TP Test 2

–2–
GEII - MC-II2 TP 0
Introduction aux systèmes embarqués

Objectifs
– Comprendre et maîtriser l’organisation fonctionnelle d’une application embarquée
– Connaître les principaux composants d’un système embarqué

1. Les systèmes embarqués


Les systèmes embarqués sont de plus en plus présents dans notre quotidien : téléphone portable, distributeur de billet,
box ADSL, GPS... Et la liste s’allonge chaque jour.
La plupart d’entre eux ont pour but de nous rendre la vie plus simple, souvent en totale autonomie et assigné à une
tâche très précise. Mais de quoi sont-ils constitués et comment sont-ils conçus ?
1.1. Définition
Un système embarqué est le regroupement d’un système matériel et d’un logiciel, développés conjointement.
Il possède une architecture spécifique dédiée à la réalisation d’une tâche très particulière, la plupart du temps en
parfaite autonomie, c’est à dire sans l’intervention de l’être humain. En permanence en contact avec l’environnement,
dans lequel il récupére des informations via des capteurs (température, vitesse de rotation...) et avec lequel il intéragit par
l’intermédiaire d’actionneurs (moteur, écrans, voyants...), il possède des entrées/sorties spécifiques et très réactives.

1.2. Caractéristiques
Un système embarqué est un système principalement numérique, mais il peut intégrer une partie analogique (condi-
tionnement de signaux provenant de capteurs, modulation, filtrage).
Contrairement à un système plus généraliste (PC standard par exemple qui peut exécuter tout type d’applications), un
système embarqué n’exécute qu’une application dédiée. Cependant, l’interface homme-machine (IHM), faisant le lien
entre l’application et l’utilisateur, peut aller d’une simple LED jusqu’à un écran tactile dernière génération.
Son système matériel est simplifié au maximum permettant ainsi de rendre plus fiable le système, de limiter la
consommation électrique et de réduire les couts de fabrication. Le nombre de ressources (mémoires, entrées-sorties) est
alors limité.
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

Un système embarqué est généralement un sous-ensemble d’un système plus complexe dans lequel il remplit une
tache spécifique. Dans l’automobile, par exemple, on peut dénombrer entre 40 et 100 de ces systèmes, qui, regroupés
ensemble, permettent d’assurer la sécurité et le confort des passagers.
1.3. Contraintes
Les systèmes embarqués étant généralement au plus proche des procédés à controler, ils doivent pouvoir fonctionner
dans des conditions environnementales souvent extrêmes (température, humidité...).
Rendre un système autonome nécessite de diminuer au maximum sa consommation électrique. Son faible encom-
brement et son faible poids imposent des contraintes supplémentaires lors de la conception, par exemple pour la dissi-
pation de chaleur.
Certains systèmes nécessitent aussi une gestion du temps très précise et font parfois appel à la notion de temps réel,
intégrant alors des systèmes d’exploitation spécifiques dits temps réels.

Pour résumé, un système embarqué doit être : robuste, simple, fiable, fonctionnel, sûr, tolérant aux fautes, autonome.

2. Constitution
Pour concevoir un système embarqué "intelligent", il existe deux solutions principales :
– des architectures existantes : basées autour d’un processeur ou d’un microcontroleur ;
– des architectures dédiées : basées autour de composants logiques programmables (FPGA 1 ou ASIC 2 ).
2.1. Architecture à processeur / microcontroleur
Les processeurs sont des unités de calculs séquentiels précablées. Ces opérations élémentaires sont appelées ins-
tructions. Une suite séquentielle d’instructions, que l’on appelle programme, est alors écrite afin de pouvoir établir la
liste des calculs à effectuer pour réaliser la (ou les) tache(s) du système.
On utilise plus couramment des microcontroleurs pour les systèmes embarqués, qui intégrent tous les éléments
nécessaires au fonctionnement de l’unité de calculs (mémoires, entrées/sorties...). Ces composants peuvent également
proposer des modules supplémentaires (convertisseurs analogiques-numériques, des gestionnaires de communication...)
permettant de faciliter la mise en oeuvre d’un système embarqué et de sa communication avec l’extérieur.

Ils existent d’ailleurs un grand large choix de composants de ce type et de fabricants qui intégrent généralement un
très (trop) grand nombre de ces modules. Une même entrée-sortie du composants sert alors souvent à plusieurs modules,
ce qui les rend inutilisable en même temps pour une même application.
Les microcontroleurs intègrent également une gestion d’horloge et de plus en plus possèdent leur propre oscillateur
interne. Les fréquences actuelles vont de quelques MHz à quelques centaines de MHz.
L’architecture précablée des microcontroleurs leur confère une facilité de mise en oeuvre gràce à l’utilisation de
modules déjà existants, en particulier pour tout ce qui concerne les communications inter-systèmes (voir section 4). Ils
intègrent également de plus en plus d’entrées et sorties analogiques, permettant la récupération d’informations provenant
de capteurs et la commande de systèmes analogiques.

1. Field Programmable Gate Array


2. Application-Specific Integrated Circuit

–4–
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

2.2. Architecture à composants logiques


Les systèmes à microcontroleurs sont des systèmes basés sur une suite d’instructions qui sont exécutées séquentiel-
lement par l’unité de calculs. Même si les cadences de fonctionnement de ces composants augmentent de plus en plus,
ils restent plus lents que les architectures parallèles que proposent les composants programmables.
Les composants logiques programmables (FPGA ou ASIC) sont constitués d’un ensemble de portes logiques et
de bascules que l’on peut interconnecter pour réaliser des fonctions combinatoires ou/et séquentielles plus complexes,
pouvant aller jusqu’à des machines à état très complexes.

Il est alors possible de concevoir sa propre structure logique et ainsi pouvoir réaliser les fonctions nécessaires
à l’application finale. On parle alors d’architecture dédiée à une application particulière, n’incluant que les modules
indispensables.
L’approche "schématique" au niveau porte logique ou fonctionnalités de base RTL (Register Transfer Logic) est
délaissée pour la conception de ces systèmes complexes au profit d’une approche "textuelle", appelée encore description
comportementale. On utilise, pour cela, des langages de description de matériel comme le VHDL (Very high speed
integrated circuit Hardware Description Language).
Il est également possible de modifier le comportement du système en reconfigurant le FPGA dynamiquement, c’est
à dire en cours d’utilisation. On peut ainsi modifier certaines fonctions au gré de l’évolution du système controlé.
La contrepartie est qu’il n’existe pas de modules préconçus déjà intégrés dans ces composants. Il est alors nécessaire
de les développer soi-même. La phase de développement peut alors en être affectée.
Des bibliothèques de fonctionnalités (interface USB, un contrôleur MAC Ethernet...) ont cependant rapidement
vues le jour. On appelle ces fonctionnalités des blocs IP (Intellectual Property). Un site de référence pour ces IP est
http ://www.opencores.org
2.3. Choix de l’architecture
Le choix d’une architecture à microcontroleur plutôt qu’une architecture à composants logiques programmables, ou
inversement, est souvent difficile et pourtant crucial pour le reste du développement des systèmes embarqués.
Les critères à prendre en compte sont les suivants :
– le nombre de fonctions à réaliser ;
– le nombre d’entrées-sorties nécessaires ;
– la vitesse d’exécution de ces fonctions ;
– la consommation électrique ;
– l’aspect temps réel et multitaches.

–5–
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

De plus en plus de plateformes de développement proposent les deux types de composants sur une même carte. On
parle alors de co-design : une partie est developpée sur microcontroleur (communication avec l’extérieur par exemple) et
l’autre partie sur FPGA (traitement de données rapide).

3. Exemples d’applications
Les domaines dans lesquels on trouve des systèmes embarqués sont de plus en plus nombreux. La liste suivante n’est
pas exhaustive.
– Automate programmable industriel, contrôle-commande
– Electroménager : télévision, four à micro-ondes
– Distributeur automatique bancaire
– Métrologie
– Applications militaires : drones, missiles
– Télécommunication : box, routeur, pare-feu, serveur de temps, téléphone portable...
– Transport : automobile, aéronautique...
– Astronautique : fusée, satellite artificiel, sonde spatiale, etc.

4. Communications
Les systèmes embarqués sont souvent des sous-ensembles d’un système plus important. Il est alors essentiel de les
faire communiquer entre eux pour obtenir le fonctionnement global souhaité.
Selon le nombre de systèmes embarqués (ou noeuds) communicants sur une même application, plusieurs choix tech-
nologiques de communication peuvent exister :
– Liaison point à point, lorsque le nombre de noeuds est très faible ;
– Utilisation d’un réseau de terrain.
Dans tous les cas, il est nécessaire de mettre en place :
– un bus de communication : moyen matériel pour transmettre des informations numériques ;
– un protocole de communication : ensemble de règles permettant de régir des communications sur un réseau (prise
de parole d’un noeud, arbitrage, gestion des erreurs...).
La mise en place d’un réseau de terrain ainsi que des protocoles associés n’est pas l’objet de ce module. Tout ceci
sera étudié dans un module annexe.

–6–
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

4.1. Communication inter-systèmes


Il existe plusieurs protocoles de communication pour faire discuter plusieurs systèmes entre eux. On peut citer par
exemple :
– I2C : "Inter Integrated Circuit", développé par Philips ;
– CAN : "Controller Area Network", développé par Bosch, devenu un standard dans l’automobile ;
– SPI : "Serial Peripheral Interface", développé par Motorola ;
– ...
4.2. Communication avec un ordinateur
On peut également vouloir faire communiquer un ordinateur avec des systèmes embarqués, pour récupérer et traiter
des données par exemple plus rapidement ou envoyer des ordres.
Là encore, plusieurs possibilités s’offrent aux développeurs :
– Communication sans fil : WiFi, BlueTooth...
– Communication filaire : USB (Universal Serial Bus), RS232...

5. Exemple : Contrôle de processus


Soit le système ci-dessous qui permet de contrôler le moteur d’un procédé de fabrication. Ce système est équipé d’une
LED de visualisation, d’un interrupteur et d’un bouton d’arrêt d’urgence.
5.1. Scrutation des entrées
On souhaite piloter ce système à l’aide d’un microcontroleur contenant le programme suivant :

1 INITIALISATION DU COMPOSANT
2
3 BOUCLEINFINIE
4 S I (URGENCE = 1 )
5 LED = 1 ;
6 MOTEUR = 0 ;
7 SINON
8 S I (MARCHE = 1 )
9 LED = !LED ;
10 MOTEUR = 1 ;
11 SINON / / on s t o p p e t o u t
12 LED = 0 ;
13 MOTEUR = 0 ;
14 temporisation (1);
15 FINBOUCLE

Cette solution n’est pas satisfaisante. Certains évènements peuvent avoir des répercussions graves (humaines, éco-
nomiques, écologiques) s’ils ne sont pas pris en compte au plus vite. Ici, le bouton d’arrêt d’urgence n’est scruté que
toutes les secondes...
5.2. Entrées sur interruption
L’autre possibilité pour gérer des évènements extérieurs est d’utiliser un mode dit par interruption. Chaque péri-
phérique souhaitant interagir avec le microcontroleur sera relié à une broche spécifique dite entrée d’interruption et sa
demande sera alors prise en compte instantanément. Le programme principal sera interrompu pour exécuter une fonction
courte et spécifique au périphérique demandeur (lecture d’une touche sur le clavier, mise en sécurité du systèmes après
appui sur le bouton d’arrêt d’urgence...)

–7–
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

Cette gestion plus précise des évènements nécessite cependant une struc-
ture matérielle spécifique. Tous les microcontroleurs ne sont pas capables
de gèrer des interruptions. Au contraire, d’autres sont capables de gérer plu-
sieurs niveaux de priorité dans les interruptions et proposent un grand nombre
d’entrée spécifique d’interruption.
5.3. Systèmes, tâches et évènements
Un système est caractérisé par :
– sa relation entrées-sorties
– son temps de réponse

Tout système embarqué pourra être découpé en un certains nombres de tâches spécifiques à exécuter selon un ordre
particulier. Certains évènements doivent également être pris en compte dès qu’ils arrivent (arrêt d’urgence par exemple)
et doivent exécuter des tâches plus prioritaires que d’autres.
Gestion de tâches :
– priorité
– ordonnancement
Gestion d’évènements (indiquant l’évolution d’un système) :
– synchrones
– asynchrones (non prédictibles) - interruptions

Selon la complexité du systèmes, on peut voir apparaitre un certains nombres de tâches et d’évènements extérieurs
susceptibles d’interrompre le programme initial. Si ce nombre de taches devient trop important, il est difficile de prévoir
leur ordonnancement et les interactions possibles entre elles et les évènements.
Il peut également arriver que certaines tâches doivent s’exécuter en parallèle.
5.4. Vers des systèmes d’exploitation temps réels et multitaches
Les systèmes embarqués devenant de plus en plus complexes à programmer, il est souvent difficile de concevoir la
partie logicielle sur la base d’une boucle infinie et d’une gestion des interruptions. De plus en plus de concepteurs adoptent
alors un système d’exploitation, offrant différents services permettant une meilleure gestion de la complexité du logiciel
embarqué.

Un système d’exploitation offre ainsi différents services


pour mieux appréhender cette complexité :
– apport du multitâche : une application monolithique
est divisée en une somme de tâches coopératives (sys-
tème multitâche) ;
– maîtrise des contraintes temporelles : système
temps réel, qui doit satisfaire des contraintes expli-
cites (bornées) de temps de réponse ;
– développement de pilotes de périphérique (driver)
simplifié pour pouvoir avoir accès aux accélérateurs
matériels ;
– système de fichiers.

–8–
GEII - MC-II2 TP 1
Programmation en C des PIC

Objectifs
– Comprendre les mécanismes de compilation et de gestion des variables sur un système embarqué
– Savoir utiliser des bibliothèques de fonctions
– Savoir créer et utiliser ses propres bibliothèques de fonctions

1. Architecture des PIC16F


IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

2. Du C vers l’assembleur - la compilation


L’utilisation d’un compilateur C facilite la production de code pour les applications embarquées. L’écriture de ce
type d’applications reste cependant très différente de l’écriture d’un programme pour station de travail (module II1), en
raison notamment :
– de la faible quantité de mémoire de programme disponible ;
– de la faible quantité de mémoire de données disponible ;
– des ressources limitées (vitesse d’exécution entre autre).
Mais les systèmes embarqués sont cependant connus pour avoir une très grande réactivité aux sollicitations et évè-
nements extérieurs.
EXERCICE 1.1
Q.1. 1. Créer un projet TP1 en sélectionnant un microcontroleur du type PIC16F690. Créer un code
source exo1.c
Q.1. 2. Compiler le code.
Q.1. 3. A quoi correspond l’espace mémoire RAM ? A quoi correspond l’espace mémoire Flash ? Quelle
place occupe le programme de base ?

2.1. Les variables et les constantes


2.1.1 Constantes
Il est possible de définir des données constantes par l’utilisation de la directive de pré-processeur suivante :
1 # define NOM_CONSTANTE 321

2.1.2 Variable entière

EXERCICE 1.2
Q.2. 1. Ajouter la définition et l’initialisation (non nulle) d’une variable de type int au programme précé-
dent. Compiler le code.
Q.2. 2. Quelle place occupe le programme de base ? Combien d’octets sont-ils utilisés en mémoire RAM ?
Q.2. 3. Ajouter une seconde variable de type int. Combien d’octets sont-ils utilisés en mémoire RAM à
présent ? Que pouvez-vous en conclure sur la place occupée par une variable de type int en RAM ?
Q.2. 4. Réécrire cet exemple en langage assembleur.
Q.2. 5. Il est possible d’accèder au code compilé par XC8 en allant dans le menu Window / Output /
Disassembly Listing File. Le code obtenu est-il cohérent par rapport à celui que vous avez écrit ? A quoi corres-
pondent les valeurs de la première colonne au niveau des instructions du code obtenu ?
Q.2. 6. Que pouvez-vous dire du code obtenu par rapport au code écrit précédemment en assembleur ?

2.1.3 Variable caractère

EXERCICE 1.3
Q.3. 1. Remplacer la définition et l’initialisation (non nulle) de la variable de type int par une variable du
type char dans le programme précédent. Compiler le code.
Q.3. 2. Quelle place occupe le programme de base ? Combien d’octets sont-ils utilisés en mémoire RAM ?
Q.3. 3. Le programme assembleur obtenu est-il différent de celui de l’exercice précédent ?
Q.3. 4. Ajouter une seconde variable de type char. Combien d’octets sont-ils utilisés en mémoire RAM
à présent ? Que pouvez-vous en conclure sur la place occupée par une variable de type char en RAM ?
Q.3. 5. Comment écrire la même définition en binaire ? en hexadécimal ? Cela a-t-il un impact sur le code
source résultant ?

– 10 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

2.1.4 Variable réelle

EXERCICE 1.4
Q.4. 1. Remplacer la définition et l’initialisation (non nulle) de la variable de type char par une variable
du type double dans le programme précédent. Compiler le code.
Q.4. 2. Quelle place occupe le programme de base ? Combien d’octets sont-ils utilisés en mémoire RAM ?
Q.4. 3. Le programme assembleur obtenu est-il différent de celui de l’exercice précédent ?
Q.4. 4. Ajouter une seconde variable de type double. Combien d’octets sont-ils utilisés en mémoire RAM
à présent ? Que pouvez-vous en conclure sur la place occupée par une variable de type double en RAM ?

2.1.5 Résumé sur les variables

EXERCICE 1.5
Q.5. 1. Recopier et remplir le tableau suivant (on suppose que l’on travaille en entier non signé) :
Type de variable Taille en bits Taille en octets Valeur min Valeur max
char
int
double
Q.5. 2. Quel est le format initial des données sur les microcontroleurs PIC16F ou 18F ? Quel est alors le
type de données en C le plus proche des données du microcontroleur ?

2.2. Les conditions logiques


Il est également possible de faire des tests sur certaines variables pour modifier l’ordre et la séquence des instructions
à exécuter et ainsi pouvoir prendre certaines décisions en fonction de la valeur de certaines entrées du micro-controleur.

EXERCICE 1.6
Q.6. 1. Ecrire un programme en assembleur qui initialise une variable à une valeur non nulle et qui teste
si cette variable vaut une certaine valeur. Si cette variable est égale à la valeur testée, alors elle réinitialise cette
variable à 0, sinon il ne se passe rien. Combien de place prendrait ce programme en mémoire ?
Q.6. 2. Ecrire ce même programme en C et compilez-le. Le code assembleur obtenu est-il similaire à celui
que vous avez écrit à la question précédente ? Quelle place prend-il en mémoire ?
Q.6. 3. Toutes les lignes du code désassemblé sont-elles utiles ? Que pouvez-vous en conclure quand à
l’utilisation du langage C pour l’écriture de programme sur microcontroleur ?

2.3. Les boucles itératives


Il peut également être nécessaire de répéter un certains nombres de fois une certaine action ou suite d’instructions.
Pour cela, on utilise des boucles itératives.
EXERCICE 1.7
Q.7. 1. Quels sont les 3 types de boucles itératives que vous connaissez ? Faites leur organigramme.

2.3.1 Compteur

EXERCICE 1.7 - suite


Q.7. 2. Ecrire le code assembleur d’une boucle itérative permettant d’exécuter 10 fois un sous-programme
action.

– 11 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

En langage C, on écrira ceci de cette façon :


1 char a , b ;
2 void a c t i o n ( ) {
3 b = b ∗ 2;
4 }
5 i n t main ( v o i d ) {
6 b = 0;
7
8 f o r ( a = 0 ; a < 1 0 ; a ++){
9 action ();
10 }
11
12 return 0;
13 }

Dans cette boucle, la variable a joue le rôle d’un compteur variant de 0 à 9, ce qui donne 10 itérations de action().

EXERCICE 1.7 - suite


Q.7. 3. Noter l’utilisation ici de variables globales. Cela a-t-il un impact sur le code résultant ? Aurait-on
pu faire autrement ?
Q.7. 4. Quelle place utilise ce programme en mémoire ?

2.3.2 Décompteur
Cependant, le jeu d’instruction du PIC incite à coder ces boucles sous forme descendante, en mettant à profit l’ins-
truction decfsz pour obtenir un programme très efficace. Le modèle en C pourrait s’écrire comme ci-dessous :
1 char a , b ;
2 void a c t i o n ( ) {
3 b = b ∗ 2;
4 }
5 i n t main ( v o i d ) {
6 b = 0;
7
8 f o r ( a = 1 0 ; a > 0 ; a − −){
9 action ();
10 }
11
12 return 0;
13 }

EXERCICE 1.7 - suite


Q.7. 5. Le code désassemblé de ce programme utilise-t-il l’instruction decfsz ?
Q.7. 6. Quelle place utilise ce programme en mémoire ? Est-il moins long que le précédent ? Que pouvez-
vous en conclure quand à l’utilisation du langage C pour l’écriture de programme sur microcontroleur dans le cas
de boucles itératives ?

– 12 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

3. Utilisation de bibliothèques
XC8 est accompagné de bibliothèques de fonctions précompilées dont les définitions sont réparties dans divers fichiers
d’en-tête .h. La documentation de ces fonctions se trouve dans le fichier MPLAB-XC8-UserGuide.pdf.
Une seconde documentation est également disponible pour les bibliothèques des PIC18F dans le fichier MPLAB-
XC8-P18-Librairies.pdf.
3.1. Bibliothèque de base - xc.h
La bibliothèque <xc.h> est incluse dans chaque source en langage C que vous écrirez à l’aide du compilateur XC8,
quelque soit le microcontroleur ciblé. C’est une bibliothèque générique qui inclue l’ensemble des définitions et des macros
utilisables sur la cible microcontroleur choisi en début de projet.

EXERCICE 1.8
Q.8. 1. Quel est le prototype de la fonction __delay_ms ? A quoi sert le paramètre attendu par cette fonc-
tion ? Quelles sont les autres fonctions du même type ? A quoi sert l’instruction de pré-processeur _XTAL_FREQ ?
Q.8. 2. Ecrire un programme qui fait appel à cette fonction et compilez-le.
Q.8. 3. Comment a été remplacé l’appel à cette fonction dans le code désassemblé ? Est-ce la meilleure
façon de réaliser une temporisation ? Quelle est l’autre possibilité ? Que fait-elle intervenir ?
Q.8. 4. Quelle place occupe le programme de base ? Combien d’octets sont-ils utilisés en mémoire RAM ?

3.2. Bibliothèque standard - stdlib.h


Le compilateur XC8 permet également d’utiliser des bibliothèques standard, redéfinies pour les microcontroleurs.
Ainsi les bibliothèques stdio et stdlib sont disponibles et utilisables.

EXERCICE 1.8 - suite


Q.8. 8. Donner le prototype de la fonction permettant de convertir un entier vers une chaine de caractère
itoa.
Q.8. 9. Ecrire un programme qui fait appel à cette fonction et compilez-le.
Q.8. 10. Comment a été remplacé l’appel à cette fonction dans le code désassemblé ? Quelle place occupe
le programme de base ? Combien d’octets sont-ils utilisés en mémoire RAM ?

3.3. Bibliothèque de math - math.h


Il est également possible d’importer d’autres bibliothèques comme par exemple la bibliothèque de math.

EXERCICE 1.8 - suite


Q.8. 5. Quels types de fonctions retrouve-t-on dans cette bibliothèque ? Donner le prototype de la fonction
permettant de calculer le sinus d’un nombre.
Q.8. 6. Ecrire un programme qui fait appel à cette fonction et compilez-le.
Q.8. 7. Comment a été remplacé l’appel à cette fonction dans le code désassemblé ? Quelle place occupe
le programme de base ? Combien d’octets sont-ils utilisés en mémoire RAM ?

3.4. Conclusion
EXERCICE 1.8 - suite
Q.8. 11. Que pouvez-vous conclure quant aux avantages et inconvénients de l’utilisation de bibliothèque
dans un programme pour système embarqué ?

– 13 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

4. Création de ses propres bibliothèques


L’utilisation du langage C pour la programmation de systèmes embarqués permet également la création de biblio-
thèques propres à l’application développée. Il est alors possible de structurer l’organisation des fonctions dans diffé-
rents sous-ensembles de fichiers afin d’une part alléger le code principal de l’application et d’autre part permettre une
réutilisation rapide pour les applications futures.
Pour cela, il faut créer deux types de fichiers :
– un fichier d’en-tête (extension *.h) ;
– un fichier source (extension *.c).
4.1. Fichiers header (*.h)
Dans le fichier dit d’en-tête ou header en anglais, qui porte l’extension *.h, on retrouve :
– la définition des différentes constantes ;
– les prototypes des fonctions (type de retour, nom de la fonction et paramètres d’entrée).
Pour pouvoir utiliser une bibliothèque, ce fichier doit impérativement être fourni. Il permet à l’utilisateur de connaitre
les paramètres d’entrée attendus par les fonctions ainsi que leur type de retour.
4.2. Fichier source (*.c) / fichiers objet (*.o)
En plus d’être déclarées dans le fichier header, les fonctions doivent être définies. La définition d’une fonction
consiste en l’écriture du code permettant d’obtenir le résultat souhaité. Celle-ci est faite dans un fichier source portant
l’extension *.c et portant le même nom que le fichier header associé.
Il est souvent préférable de ne pas divulguer ce fichier source, soit pour éviter que des utilisateurs modifient ces
codes et endommagent le matériel associé, soit pour des raisons de confidentialité du code (propriété intellectuelle, com-
mercialisation).
L’étape de compilation génère un fichier objet (extension *.o) à partir de ce fichier source. Ce type de fichier est
compilé et ne permet alors pas d’accéder à la source des fonctions tout en garantissant l’utilisation de la bibliothèque ainsi
créée.

– 14 –
GEII - MC-II2 TP 2
Constitution d’un système embarqué (PIC16F)

Objectifs
– Configurer et utiliser les modules du PIC16F690 en langage C
– Réaliser des programmes simples pour système embarqué
– Chercher les informations dans une documentation technique

Il est rappelé ici le fonctionnement de la carte d’étude basée sur un PIC16F690.


La carte est alimentée via le dispositif PICKIT2 de Microchip, à partir du connecteur USB. Elle comporte un micro-
contrôleur PIC16F690, 8 LEDs, 2 boutons poussoirs, deux interrupteurs, un potentiomètre et une photorésistance. Elle
est prévue pour fonctionner jusqu’à une cadence de 8 MHz.
Les composants sont affectés aux ports d’entrées/sorties de la façon suivante :
– LED0 à LED7 : RC0 à RC7 ;
– K1, K2 : RB6, RB7 (interrupteurs) ;
– BP1, BP2 : RB4, RB5 (boutons poussoirs) ;
– potentiomètre : RA4 (entrée analogique AN3) ;
– photorésistance : RA2 (entrée analogique AN2).

1. Utilisation des registres


Les registres sont des espaces mémoire de 8 bits chacun permettant la gestion de certains modules du microcontroleur
(ADC, PWM, Timers...) ou l’interaction avec l’environnement extérieur (port d’entrées-sorties).
Pour pouvoir modifier la valeur d’un registre, il existe deux possibilités :
– le chargement ou la récupération de l’ensemble du registre ;
– le changement bit à bit.
Gràce à la bibliothèque du compilateur XC8, tous les registres sont accessibles via leur nom, tel qu’il apparait dans la
documentation constructeur du composant.
Pour pouvoir écrire sur le port A par exemple, il suffira d’écrire :
1 PORTA = 0 b00101001 ; / / en b i n a i r e
2 PORTA = 0 x29 ; / / en h e x a d e c i m a l

Pour pouvoir récupérer la valeur du registre STATUS par exemple, il suffira d’écrire :
1 char c ;
2 c = STATUS ;

Il est également possible d’affecter une valeur à un seul bit. Pour cela, il faut ajouter le terme "bits" à la fin du nom
du registre auquel on souhaite accèder, et ajouter le nom du bit souhaité séparé par un point.
Pour pouvoir mettre à un le bit 2 du port A par exemple, il suffira d’écrire :
1 PORTAbits . RA2 = 1 ;

Pour pouvoir récupérer la valeur du bit Z du registre STATUS par exemple, il suffira d’écrire :
1 char c ;
2 c = STATUSbits . Z ;
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

2. Configuration du microcontroleur
2.1. Registre de configuration
Afin de garantir la parfaite compatibilité du microcontroleur avec l’application développée, ces composants intègrent
un registre de configuration spécifique. L’état de ces registres est pris en compte uniquement au démarrage du micro-
controleur et ne peut être modifié en cours de programme. Ces registres déterminent les modes de fonctionnement du
composant.

Parmi les modes de fonctionnement possible, on retrouve :


– le choix de l’horloge principale (oscillateur interne, oscillateur RC, oscillateur rapide, quartz) ;
– l’utilisation du Watchdog ;
– l’utilisation de la broche de réinitialisation (MCLR) ;
– la possibilité de protéger les codes...

Pour plus de détails, référez-vous à la section "Configuration Bits" du chapitre "Special Features of the CPU" de la
documentation technique du composant.

Sous MPLABX, pour accèder à la configuration de ces bits, il faut aller dans Window / PIC Memory Views /
Configuration Bits. Une fenêtre s’ouvre alors et vous propose de modifier la valeur de chacun des paramètres énoncés
précédemment.

2.2. Choix de l’horloge


Sur certains microcontroleurs, il est également possible de choisir la fréquence de l’horloge d’exécution des instruc-
tions.

Il est possible de choisir :


– un oscillateur externe (OSC1 - OSC2) ;
– l’oscillateur interne (dont la fréquence initiale est sélectionnée à l’aide des registres de configuration précédents).

Il est parfois possible de choisir plus précisément la fréquence de sortie de l’oscillateur interne (voir schéma suivant).
Il arrive également que le microcontroleur soit équipé de deux oscillateurs internes :
– un oscillateur rapide (de l’ordre de la dizaine de MHz), pour pouvoir exécuter des instructions à un rythme com-
patible avec l’application ;
– un oscillateur lent (de l’ordre de la dizaine de kHz), moins gourmand en énergie, réservé en particulier au phase de
mise en veille de l’application.

La configuration de l’horloge se fait via le registre OSCCON.

– 16 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

3. Utilisation des entrées / sorties numériques


EXERCICE 2.1
Q.1. 1. Quels sont les registres liés à l’utilisation des ports d’entrée/sortie ? A quoi servent-ils ? A quelle
valeur faut-il les initialiser par rapport à la carte d’étude ?

3.1. Programme simple


On souhaite afficher une valeur de 8 bits sur les 8 LED disponibles sur la carte. La valeur sera définie comme une
constante.
On rappelle que le programme d’un système embarqué ne doit jamais s’arrêter.
EXERCICE 2.1 - suite
Q.1. 2. Ecrire et tester ce programme sur la carte d’étude.

3.2. Mise en place de fonctions


Afin de simplifier l’écriture du programme principale, nous allons créer plusieurs fonctions, toutes regroupées dans
une bibliothèque monPIC
EXERCICE 2.1 - suite
Q.1. 3. Ecrire une fonction initPIC() dans une bibliothèque monPIC qui permet d’initialiser la direc-
tion des entrées-sorties de la carte.
Q.1. 4. Ecrire des fonctions toutAllumer() et toutEteindre() qui permettent d’allumer ou d’éteindre
toutes les LED.

3.3. Clignotement des LED


EXERCICE 2.1 - suite
Q.1. 5. Faire l’organigramme d’un programme permettant de faire clignoter une des LED avec une période
de 1 s.
Q.1. 6. Ecrire ce programme en C et tester-le.
Q.1. 7. Ajouter la possibilité de bloquer le clignotement à l’aide de l’interrupteur K1.

– 17 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

4. Utilisation des entrées analogiques


Le PIC16F690 dispose d’un ADC (Analogic Digital Converter) à 12 voies, convertissant sur 10 bits. Sur la carte
d’étude, seules les entrées AN2 et AN3 sont utilisées et connectées respectivement à un potentiomètre et une photorésis-
tance.

EXERCICE 2.2 - Mise en oeuvre d’un ADC


Q.2. 1. Quels sont les registres associés au convertisseur analogique numérique ? A quoi servent-ils ?
Q.2. 2. Faire l’organigramme d’un programme qui initialise l’ADC sur la voie AN2, permet de faire une
acquisition sur cette voie et affiche les poids forts du résultat sur les LED.
Q.2. 3. Ecrire le programme en C et tester-le.
Q.2. 4. Modifier le programme précédent pour que l’utilisateur puisse choisir la voie d’entrée à l’aide de
l’interrupteur K1. Tester votre programme.

– 18 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

5. Utilisation d’une sortie modulée (PWM ou MLI)


La fonction PWM (Pulse Width Modulation = modulateur de lar-
geur d’impulsion) est souvent mise en oeuvre pour le réglage propor-
tionnel d’organes présentant une certaine inertie (moteurs par exemple)
ou associés à des récepteurs à temps de réponse important (vision hu-
maine par exemple).

Un signal rectangulaire de période fixée est produit avec un rapport


cyclique pouvant être réglé.

La fonction PWM des PIC 16F690 est la combinaison de 2 périphériques :


– le timer TMR2 (commandé par l’horloge interne) ;
– le comparateur CCP1 (Capture Compare PWM module).

Le timer va servir à générer un signal de modulation de forme triangulaire (compteur binaire) qui fixe la fréquence
(ou période) du signal de sortie.
Le comparateur va en permanence comparer ce signal de modulation à un valeur de référence permettant de fixer le
rapport cyclique du signal de sortie.

EXERCICE 2.3 - Mise en oeuvre d’un PWM


Q.2. 1. Sur quelle broche du composant se trouve la sortie CCP1 du comparateur ? Quel composant de la
carte est associé à cette broche ?
Q.2. 2. Quelles sont les valeurs que peut prendre le prédiviseur du TMR2 ? Quel registre et quels bits dans
ce registre permettent de configurer la valeur du prédiviseur du TMR2 ? Le post-diviseur est-il utilisé dans le mode
PWM ?
Q.2. 3. Comment peut-t-on règler la période du signal de sortie ? Donner la formule permettant d’obtenir
la période du signal de sortie. Quelles sont les valeurs minimale et maximale de période que l’on peut atteindre avec
ce microcontroleur si on utilise une fréquence d’oscillation de 8 MHz ? Avec une fréquence de 31 kHz ?
Q.2. 4. Quels registres et quels bits dans ces registres permettent de règler le rapport cyclique ? Donner la
formule permettant d’obtenir le rapport cyclique du signal de sortie.
Q.2. 5. Faire l’organigramme de la configuration du module PWM.
On souhaite à présent pouvoir mettre en oeuvre un PWM pour alimenter une LED et en faire varier sa luminosité.
Le rapport cyclique sera controlé par le potentiomètre.
Q.2. 6. Comment doit être choisie la fréquence du signal à appliquer sur la LED ? Qu’est-ce qui impose
ces différentes contraintes ?
Q.2. 7. Ecrire et tester le programme en C.

– 19 –
GEII - MC-II2 TP 3
Migration vers les PIC18F

Objectifs
– Découvrir une nouvelle architecture de microcontroleur
– Utiliser certains modules des PIC18F

1. PIC18F - un microcontroleur dédié au C


1.1. Architecture du PIC18F2520
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

Il n’y a pas une grande différence dans l’architecture globale des microcontroleurs de la famille 18F par rapport à
celle des 16F. On retrouve les mêmes types d’espace mémoire, d’entrées-sorties et de modules.
Par contre, les PIC18F possèdent un jeu d’instructions plus étendu que les PIC16F : 75 instructions pour le PIC18F
contre 35 seulement pour les PIC16F. Ce nouveau jeu d’instructions permet un passage vers l’assembleur plus optimisé
que dans le cas des PIC16F, certaines fonctions étant alors déjà précablées dans l’unité de calcul.
Par exemple, sur les PIC16F, seule l’instruction DECFSZ existe pour décrémenter et tester si une variable vaut 0.
Dans la version PIC18F, trois autres fonctions ont vu leur apparition : DECFSNZ (décrémente et teste si une variable
n’est pas nulle), INCFSZ (incrémente et teste si une variable est nulle) et INCFSNZ (incrémente et teste si une variable
est non nulle).
1.2. Carte d’étude basée sur un PIC18F2520
Il est rappelé ici le fonctionnement de la carte d’étude basée sur un PIC18F2520.
La carte est alimentée via le port USB. Elle comporte un micro-contrôleur PIC18F2520, 6 LEDs, 3 boutons poussoirs,
2 interrupteurs, un potentiomètre, une photorésistance et un capteur de température. Elle est prévue pour fonctionner
jusqu’à une cadence de 8 MHz (oscillateur interne) mais peut monter à 32 MHz par utilisation d’une PLL interne.
La communication avec la carte et la programmation du PIC se font par l’intermédiaire d’une liaison série (RS-232).
Pour cela, un programme nommé bootloader est déjà présent dans le PIC. Il permet d’établir la communication série avec
un logiciel de communication (type Tiny Bootloader).
Les composants sont affectés aux ports d’entrées/sorties de la façon suivante :

élément broche élément broche élément broche analog


LED1 RC2 SW1 RC0 Pot RA0 AN0
LED2 RA3 SW2 RB3 Photo RA1 AN1
LED3 RB4 Temp RA2 AN2
LED4 RB5 BP1 RB0
LED5 RB6 BP2 RB1 HP RC1
LED6 RB7 BP3 RB2

2. Utilisation des entrées / sorties numériques

EXERCICE 3.1 - Clignotement d’une LED


Q.1. 1. Créer un nouveau projet TP3 et créer un nouveau fichier source exo1.c. Vous choisirez un com-
posant de type PIC18F2520 et le simulateur comme outil de débuggage.
Q.1. 2. Quel est l’espace mémoire disponible pour le programme et pour les données sur le PIC18F2520 ?
Q.1. 3. Ecrire une bibliothèque monPIC, contenant un fichier monPIC.h et monPIC.c regroupant l’en-
semble des définitions associées à la carte d’étude. Ecrire une fonction initPIC() dans cette bibliothèque qui
permet d’initialiser la direction des entrées-sorties de la carte.
Q.1. 4. Reprendre le code en C de l’exercice 2.1 du TP2 sur le clignotement d’une LED. Compiler ce
programme et tester-le.
Q.1. 5. Constatez-vous un changement sur le code désassemblé obtenu par rapport à l’exercice 2.1 du
TP2 ?

EXERCICE 3.2 - Boucle itérative / compteur


Q.2. 1. Reprendre le code en C de l’exercice 1.7 du TP1 sur l’utilisation de boucle itérative. Compiler ce
programme et tester-le.
Q.2. 2. Constatez-vous un changement sur le code désassemblé obtenu par rapport à l’exercice 1.7 du
TP1 ?

– 21 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

3. Utilisation des entrées analogiques


Le PIC18F2520 dispose d’un ADC (Analogic Digital Converter) à 10 voies, convertissant sur 10 bits. Sur la carte
d’étude,
– la voie AN0 est connectée à un potentiomètre ;
– la voie AN1 à une photodiode ;
– la voie AN2 à un capteur de température.

L’utilisation de l’ADC sur les PIC18F est, comme sur la famille 16F, associée à des registres permettant de controler
les opérations effectuées par le module ADC (ADCON0), de configurer les broches utilisées (ADCON1) et de configurer
l’horloge utilisée par le convertisseur et la justification du résultat (ADCON2).
Le résultat est ensuite obtenu dans les registres ADRESL et ADRESH.

EXERCICE 3.3 - ADC


Q.3. 1. Pourquoi a-t-on besoin de deux registres pour stocker le résultat de la conversion ? Comment sera
représenté le résultat sur ces registres selon que l’on justifie à droite ou à gauche le résultat ?
Q.3. 2. Quelles sont les étapes à suivre pour configurer l’ADC sur le PIC18F2520 ?

3.1. Utilisation de la bibliothèque adc.h


On peut également s’affranchir de l’utilisation de ces registres en passant par la bibliothèque de fonctions associées à
l’ADC fournie par le compilateur. Cette bibliothèque se nomme adc.h. Il suffit alors d’ajouter la ligne suivante dans le
code C.
1 # i n c l u d e < p l i b / a d c . h>

– 22 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

EXERCICE 3.3 - ADC - suite


Q.3. 3. Quelles sont les fonctions disponibles pour le module ADC sur le PIC18F2520 ? Donner un bref
descriptif de chacune d’entre elles.
Q.3. 4. Quel type de variable doit-on utiliser pour stocker le résultat complet de la conversion ? Comment
peut-on faire pour ne garder que les 6 bits de poids fort ? Quel type de variable peut-on alors utiliser pour stocker
cette information ?
Q.3. 5. D’après l’exemple donné d’utilisation de l’ADC, quelles sont les étapes pour pouvoir obtenir un
résultat de conversion ? Dans quel ordre doit-on utiliser les fonctions précédemment trouvées ?

3.2. Temps d’acquisition


La conversion d’une valeur analogique vers une valeur numérique se déroule en 2 étapes sur les microcontroleurs
PIC : l’acquisition de la tension à convertir (échantillonneur-bloqueur) et la conversion de cette valeur (convertisseur).

Le temps d’acquisition total doit alors tenir compte de ces deux étapes. Il est paramétré à l’aide des différents registres
associés à l’ADC. En particulier, il est nécessaire de fixer le paramètres suivants :
– le temps de conversion par bits (T AD - typiquement de 1 µs),
– le temps d’acquisition (T ACQ ).

EXERCICE 3.3 - ADC - suite


Q.3. 6. Quelle valeur faut-il donner aux bits ADCS du registre ADCON2 pour obtenir le temps de conver-
sion souhaité à partir d’une fréquence interne de 8 MHz ?
Q.3. 7. Donner la formule permettant de calculer le temps d’acquisition. Dans le cas de l’entrée AN0
(potentiomètre de 5 kΩ), quelles sont les valeurs minimale et maximale du temps de charge de C HOLD ? Quelle
valeur faut-il alors donner aux bits ACQT du registre ADCON2 ?

3.3. Récupération et affichage de données converties


On souhaite à présent réaliser un système qui affiche sur les LED les 6 bits de poids fort de la valeur convertie du
potentiomètre.

EXERCICE 3.3 - ADC - suite


Q.3. 8. A partir de toutes les questions précédentes, indiquer les valeurs à placer dans chacun des registres
de configuration de l’ADC. En déduire les mots de configuration à placer dans la fonction OpenADC().
Q.3. 9. Ecrire et tester le programme en C. Vous ferez une fonction permettant l’affichage de la donnée
convertie.
Q.3. 10. Ajouter la possibilité de changer de voie par l’intermédiaire de SW1 afin de pouvoir sélectionner
soit le potentiomètre, soit la photoresistance.

– 23 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

4. Utilisation d’un bus de communication série - USART


La plupart des microcontroleurs sont équipés de liaison série de toute sorte pour pouvoir échanger des inforamtions
avec d’autres systèmes (I2C, CAN, SPI...). L’USART (Universal Asynchronous/Synchronous Receiver Transmitter) est
une liaison série universelle.
Nous allons mettre en place une liaison série de type RS232 entre le PC et la carte d’étude afin de pouvoir échanger
des messages au format ASCII entre ces deux systèmes. Cette liaison est full-duplex et asynchrone. Dans l’exemple sui-
vant, la vitesse sera de 115 200 bauds, les données seront de 8 bits et la réception continue sans utilisation d’interruptions.
4.1. Utilisation de la bibliothèque usart.h
Tout comme le module ADC, il est possible de configurer les paramètres de la liaison USART via les registres
associés. Mais il existe également une bibliothèque de fonctions fournie par le compilateur. Cette bibliothèque se nomme
usart.h. Il suffit alors d’ajouter la ligne suivante dans le code C.
1 # i n c l u d e < p l i b / u s a r t . h>

EXERCICE 3.4 - USART


Q.4. 1. Quelles sont les fonctions disponibles pour le module USART sur le PIC18F2520 ? Donner un
bref descriptif de chacune d’entre elles.
Q.4. 2. Quelles sont les étapes à suivre pour configurer l’USART sur le PIC18F2520 ?
Q.4. 3. A quoi servent les registres SPBRGH et SPBRG ? Donner la formule de calcul du BRG (Baud
Rate Generator). Que doit valoir cette valeur pour obtenir le taux de transfert souhaité à partir d’une fréquence
interne de 8 MHz ?
Q.4. 4. Indiquer les valeurs à placer dans chacun des registres de configuration de l’USART pour ob-
tenir le fonctionnement énoncé précédemment. En déduire les mots de configuration à placer dans la fonction
OpenUSART().

4.2. Envoi et réception de données via l’USART


On souhaite à présent faire un système qui envoie un message d’accueil par la liaison RS232 puis renvoie indéfiniment
en écho sur la liaison RS232 les données reçues par celle-ci.

EXERCICE 3.4 - USART - suite


Q.4. 5. Ecrire et tester le programme en C.

4.3. Controle d’un système par un PC via RS232


On souhaite maintenant faire un système qui envoie un message d’accueil par la liaison RS232 puis en fonction de la
donnée reçue (0, 1 ou 2), renvoie la valeur convertie sur la voie 0, 1 ou 2 de l’ADC.

EXERCICE 3.5 - Communication série


Q.5. 1. Ecrire et tester le programme en C.
Q.5. 2. Ajouter la possibilité d’allumer la LED1 par la donnée ’a’, la LED2 par la donnée ’b’...

On rappelle que les données envoyées et reçues sur l’USART ne peuvent être que du type caractère (char).

– 24 –
GEII - MC-II2 TP 4
Gestion du temps / Timers matériel et logiciel

Objectifs
– Mettre en oeuvre des interruptions en langage C sur microcontroleur
– Faire la différence entre timer matériel et timer logiciel
– Mettre en oeuvre un timer matériel pour la gestion du temps
– Mettre en oeuvre un timer logiciel pour la gestion de taches particulières

1. Système d’interruption sur les PIC18


1.1. Rappel sur les interruptions sur les PIC16F
– GIE Global Interrupt Enable
– EEIE EEprom write complete IE
– T0IE Timer0 IE
– INTE INTerrupt pin Enable (RB0)
– RBIE RB port change IE
– T0IF Timer0 Interrupt Flag
– INTF INTerrupt pin Flag
– RBIF RB port change IF
Le vecteur d’interruption dans la mémoire programme est à l’adresse 0x04.
1.2. Interruptions sur les PIC18F
La famille des PIC18F gère les interruptions sur le même principe que la famille des PIC16F, mais comme ces PIC18F
intègrent plus de périphériques, il y a un plus grand nombre d’évènements qui peuvent entrainer une interruption. De plus,
il est possible de gérer deux niveaux de priorité, alors qu’il n’en existe qu’un sur les PIC16F.
Des registres d’extension sont apparus dans les versions PIC18F. Il existe alors 10 registres de contrôle des inter-
ruptions sur les PIC18F2520/4520.
– INTCON contient GIE et PIE (contrôle des périphériques)
– INTCON2 complément pour les sources INT, RB et TMR0
– INTCON3 triplets IE/IF/IP de INT1 et INT2
– PIR1,PIR2 registres des bits de requête des périphériques
– PIE1,PIE2 registres des bits d’autorisation des périphériques
– IPR1,IPR2 registres des bits de priorité des périphériques
– RCON contient le bit d’activation des priorités (IPEN)
Lorsque les niveaux de priorité sont activés, deux bits d’activation globale se rajoutent : GIEL et GIEH. Les interrup-
tions de haute priorité sont vectorisées vers l’adresse 0x0008 et les interruptions de basse priorité vers l’adresse 0x0018.
1.3. Codage des interruptions en C
Dans la majorité des cas, les bits spécifiques d’autorisation (IE) sont positionnés lors des appels aux fonctions de
type Open... (comme OpenTimer0() par exemple).
Les bits généraux d’autorisation (GIE, IPEN, GIEH ou GIEL) doivent être traités par des affectations telles que
INTCONbits.GIE = 1.
De même, les bits de signalisation (IF) devront être remis explicitement à zéro dans les routines d’interruption.
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

1.3.1 Programme principal

1 # include < p i c 1 8 . h>


2 # include < h t c . h>
3 # include < p l i b / t i m e r s . h>
4 # include " monPIC . h "
5
6 # define TAST 10
7 # define TMONO 20
8
9 v o i d i n t e r r u p t HighISR ( v o i d ) ;
10
11 char t _ a s t , t_mono ;
12
13 i n t main ( v o i d ) {
14 initPIC ( ) ;
15
16 / / CONFIGURATION DU TIMER0
17 OpenTimer0 ( TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_16 ) ;
18 INTCONbits . GIE = 1 ;
19
20 while ( 1 )
21 {
22 i f ( t _ a s t == 0 ) { // astable
23 t _ a s t = TAST ;
24 / / actions a f a i r e periodiquement
25 }
26
27 i f ( t_mono == 0 ) { / / monostable
28 / / f i n de l a p e r i o d e m o n o s t a b l e
29 }
30 i f ( BPo1 == 1 ) {
31 t_mono = TMONO;
32 / / d e b u t de l a p e r i o d e m o n o s t a b l e
33 }
34 }
35 return 0;
36 }

Le réglage du timer TMR0 et de son mode d’interruption se fait par la fonction préprogrammée OpenTimer0(...).

1.3.2 Gestion des interruptions

1 v o i d i n t e r r u p t HighISR ( v o i d )
2 {
3 i f ( INTCONbits . TMR0IF ) {
4 i f ( t _ a s t != 0 ) t _ a s t − −;
5 i f ( t_mono != 0 ) t_mono − −;
6 INTCONbits . TMR0IF = 0 ;
7 }
8 }

– 26 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

2. Gestion du temps dans les systèmes embarqués


Dans les systèmes embarqués, les diverses taches qu’accomplit le microcontrôleur
doivent souvent respecter une chronologie précise : instant de démarrage, périodes
de fonctionnement...
La temporisation "classique", au moyen d’une boucle, monopolise le processeur,
ne permettant pas alors d’autres traitements. L’utilisation de timers matériels est
alors préconisée. Ces fonctions spéciales des microcontroleurs permettent de générer
des interruptions à des instants précis.
Cependant, ces timers matériels ne sont jamais en nombre suffisant pour faire
face à toutes les situations. Il faut alors faire appel à des timers logiciels.

3. Principe des timers logiciels


– Un timer matériel du microcontrôleur est configuré pour qu’il produise une interruption périodique avec une
période assez petite, constituant le "quantum de temps". Ce choix est fonction de l’application.
– On définit ensuite autant de variables entières que de temporisations nécessaires.
– On initialise chacune des variables à une valeur de départ.
– Chaque interruption du timer est un événement ("tick") traité par un sous-programme d’interruption. Les va-
riables de temporisation sont alors décrémentées si elles ne sont pas nulles.
– Lorsqu’une de ces variables atteint ’0’, le temps programmé est écoulé. Le traitement de cette temporisation est
alors actif.

4. Utilisation du timer matériel TMR0

Le timer TMR0 est un compteur paramétrable en mode 8 bits ou en mode 16 bits. Dans tous les cas, le timer TMR0
compte à chaque front montant de l’horloge d’entrée et produit un débordement lorsqu’il repasse de sa valeur maximale
à 0. Il génére alors une interruption détectable sur TMR0IF du registre INTCON.
L’horloge d’entrée de ce compteur est également paramétrable : on peut ainsi choisir l’oscillateur interne ou une entrée
extérieure. On peut également utiliser un pré-diviseur pour réduire la fréquence en entrée du compteur TMR0.
La relation qu’il existe entre la fréquence des interruptions sur le timer TMR0 et la fréquence d’oscillation (dans le
cas du choix de l’oscillateur interne) est la suivante :

FOS C
fT MR0 = MODE
(1)
4· 2 · PREDIV

– 27 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

EXERCICE 4.1 - Configuration du timer TMR0


Q.1. 1. Quelles sont les valeurs minimale et maximale de prédivision disponible pour le timer TMR0 ?
Q.1. 2. Pour une fréquence d’oscillation de 2 MHz, quelles sont les fréquences minimale et maximale
atteignable en mode 8 bits ? En mode 16 bits ? Calculer également les périodes équivalentes.
Q.1. 3. On choisit pour le TMR0 : un mode de 8 bits, la source interne d’horloge à une cadence de 2 Mhz
et une prédivision de 16. Quelle sera alors la fréquence des interruptions sur le timer TMR0 ? Quel registre faut-il
modifier pour obtenir une fréquence d’oscillation interne de 2 MHz ?

4.1. Application de base : astable / monostable


Nous allons à présent mettre en oeuvre ce timer en réalisant l’équivalent de montages monostables et astables.
On souhaite réaliser :
– un astable d’une période d’environ 1 seconde (sortie sur la LED1) ;
– un monostable déclenché sur l’appui sur BP2 allumant la LED2 pendant environ 2 secondes.

EXERCICE 4.2 - Astable et monostable


Q.2. 1. A partir de l’oscillateur interne à 2 MHz, quel mode et quelle valeur de prédivision faut-il utiliser
pour obtenir le bon fonctionnement de l’astable ? Quelle est l’erreur commise sur la fréquence obtenue par rapport
à celle souhaitée dans l’énoncé ?
Q.2. 2. A partir de l’oscillateur interne à 2 MHz, quel mode et quelle valeur de prédivision faut-il utiliser
pour obtenir le bon fonctionnement du monostable ? Les deux applications (astable et monostable) pourront-elles
fonctionner en même temps ?

On reprend la configuration précédente pour le TMR0 : un mode de 8 bits, la source interne d’horloge à une cadence
de 2 Mhz et une prédivision de 16.
Il faut à présent mettre en place des timers logiciels basés sur la référence de temps du timer TMR0 : un pour l’astable
et un pour le monostable.

EXERCICE 4.2 - Astable et monostable - suite


Q.2. 3. Quelles sont les valeurs de préchargement à utiliser pour obtenir les périodes d’astable et de
monostable souhaitées ? Quelle est alors l’erreur commise sur la fréquence finalement obtenue pour l’astable ?
Q.2. 4. Ecrire et tester le programme en C.

– 28 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

4.2. Gradateur de LED


Basé sur les principes de l’astable et du monostable, il est possible de mettre en place un modulateur de largeur
d’impulsion (ou PWM - signal rectangulaire de rapport cyclique variable). Il sera utilisé pour faire varier l’éclat apparent
(ou luminosité) d’une LED.
Pour produire un tel signal, on utilisera un premier timer logiciel (timer_total) pour la période du signal rectangu-
laire et un second pour la durée à l’état haut (timer_on).
Le timer_total se relance automatiquement à chaque expiration.
Le timer_on n’est lancé qu’au début de la période timer_total et si sa durée est inférieure à timer_total. La
durée de l’état haut sera contrôlé par le potentiomètre.

EXERCICE 4.3
Q.3. 1. Sur quel principe (vu précédemment) sera basé le timer_total ? Le timer_on ?
Q.3. 2. Quelle fréquence minimale doit avoir le signal de sortie de ce système pour ne pas voir le scin-
tillement de la LED ?
Q.3. 3. Quelle est la valeur maximale que pourra prendre timer_on si on utilise la valeur convertie du
potentiomètre ? Que vaut le rapport cyclique en fonction de timer_on et timer_total ? Quelle sera alors la valeur
de préchargement à associer au timer_total pour que le rapport cyclique maximal soit de 1 ?
Q.3. 4. Quels doivent être alors les paramètres du timer TMR0 ?
Q.2. 5. Ecrire et tester le programme en C qui permet de commander la LED1.
Q.2. 6. Ajouter un second PWM logiciel pour la LED2. Les deux systèmes doivent fonctionner en paral-
lèle.

4.3. Clignotants anarchiques


On souhaite faire clignoter indépendamment les 6 LEDs disponibles sur la maquette.
La durée d’allumage et la durée d’extinction seront identiques pour chaque diode (rapport cyclique de 0,5).
La période de clignotement (somme des temps d’allumage et d’extinction) est définie avec précision pour chaque
diode :
LED1 = 1s, LED2 = 3,7s, LED3 = 0,54s,
LED4 = 0,22s, LED5 = 1,7s et LED6 = 4,78s.
EXERCICE 4.4
Ecrire et tester le programme en C

– 29 –
GEII - MC-II2 TP 5
Programmation par machine à état

Objectifs
– Programmer une machine à état sur un microcontroleur.

1. La machine à états dans les systèmes numériques


Elle constitue un modèle simple et efficace pour construire des programmes multi-tâches de faible ou moyenne
complexité. Les programmes ainsi obtenus sont : prévisibles, compréhensibles et compacts.
Un programme embarqué pourra contenir plusieurs machines à état indépendantes ou interconnectées, synchronisées
entre elles ou non.
Une des limitations des machines à état est le nombre de cas maximal à envisager. En effet, pour une machine à NE
états et NI entrées de NB bits, le nombre de cas à envisager est NE · NI · 2NB .
Si ce nombre est trop grand, il vaut mieux s’orienter vers des solutions plus puissantes : les systèmes d’exploitation
multi-tâches.

2. Machine de MOORE et modèle logiciel


L’une des machines les plus utilisées dans les systèmes séquentiels est la machine dite de Moore. La structure de cette
machine est la suivante :

Dans une telle machine, la sortie ne dépend que de l’état de la machine : elle ne change que lors d’un changement
d’état. Les sorties sont synchrones avec les transitions d’état et les fronts d’horloge.
Une représentation possible des machines de Moore est le diagramme d’états. Un exemple est donné ci-après.
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

Chaque cercle représente un état possible de la machine. Les sorties étant fonction exclusivement de l’état, leurs
valeurs sont indiquées dans les cercles.
On passe d’un état à un autre s’il existe une transition entre ces états, représentée par une flèche. Dans le cas d’une
machine de Moore (système séquentiel synchrone), le passage d’une transition ne peut se faire que lorsque la condition
logique associée est vérifiée et en présence d’un front montant.

Voici un modèle possible de représentation d’une machine à états en langage C. La boucle principale doit être exécutée
avec une fréquence de répétition suffisante pour prendre en compte les changements des entrées (ici entree).
1 char e t a t = ETAT0 ;
2 while ( 1 )
3 {
4 i f ( clk = 0){
5 c l k = M;
6
7 / / Etats
8 switch ( e t a t )
9 {
10 c a s e ETAT0 :
11 i f ( e n t r e e == VAL1 ) e t a t = ETAT1 ;
12 i f ( e n t r e e == VAL2 ) e t a t = ETAT3 ;
13 i f ( e n t r e e == VAL3 ) e t a t = ETAT4 ;
14 break ;
15 c a s e ETAT1 : e t c .
16 / / eventuellement default
17 }
18 }
19 / / C a l c u l d e s s o r t i e s ( Moore )
20 s o r t i e 1 = ( ( e t a t == ETAT1 ) | | ( e t a t == ETAT4 ) ) ;
21 ...
22 } / / fin boucle p r i n c i p a l e

3. Application à la détection de fronts montants


On considère un signal E (représenté par le bouton poussoir BP1) susceptible
de changer d’état n’importe quand. On désire construire une machine d’état syn-
chronisée par une horloge qui fournisse une (et une seule) impulsion sur sa sortie
(S ) de détection après apparition d’un front montant sur E.
L’horloge associée à la détection de transition sera choisie de manière à éviter
les détections de rebonds (période d’environ 20 ms réalisée par un timer logiciel
et un timer matériel fournissant une période d’environ 100 µs). Afin de pouvoir
tester ce système, on incrémentera un compteur à chaque front montant sur BP1. La valeur du compteur sera en perma-
nence affichée sur les LED.
EXERCICE 5.1 - Détection de fronts montants
Q.1. 1. Faire le diagramme d’état de la machine décrite ci-dessus.
Q.1. 2. Quelle est la configuration à donner au timer TMR0 pour obtenir l’horloge souhaitée dans
l’énoncé ? Quelle est la valeur de préchargement à donner au timer logiciel pour pouvoir remplir le cahier des
charges ?
Q.1. 3. Ecrire et tester le programme en C.
Q.1. 4. Que se passe-t-il si on diminue la valeur de préchargement précédemment calculée ? Si on l’aug-
mente ?

– 31 –
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

4. Automatisme de porte de garage


4.1. Description du système
Une porte de garage motorisée comporte
un moteur électrique réversible à 2 sens de
marche correspondant à la montée ou à la des-
cente.
La commande est assurée par un bouton-
poussoir unique, BOU qui commande la marche :
ouverture lorsque la porte est fermée, ferme-
ture lorsque la porte est ouverte.
Deux capteurs de fin de course haut et
bas, FH et FB, permettent d’arrêter automati-
quement le mécanisme. Ils seront simulés par
les interrupteurs SW1 et SW2.
Deux sorties permettront de commander le moteur :
– ON_OFF représente l’activité : marche si ON_OFF = ’1’, arrêt sinon ;
– SENS représente le sens de marche : montée si SENS = ’1’, descente sinon.
Lorsqu’une commande est en cours d’exécution, le bouton BOU est inopérant.
Une LED (ON_LED), clignotant avec une période de 0,5 s, indiquera que la porte est en cours d’ouverture ou de
fermeture.
4.2. Système sans sécurité
EXERCICE 5.2 - Automate
Q.2. 1. Faire le diagramme d’état de la machine décrite ci-dessus. 3 états A, M et D sont suffisants.
Q.2. 2. Décrire le choix de la période de l’horloge principale de votre système. Donner alors la configu-
ration du timer TMR0.
Q.2. 3. Ecrire et tester le programme en C.

4.3. Système simple


Un bouton d’arrêt d’urgence, URG, permet d’arrêter immédiatement le fonctionnement, quel que soit l’état du sys-
tème, à la position où il se trouve ; dans ce cas, après élimination du défaut (URG =0 00 ), un appui sur BOU permet de
reprendre le mouvement dans le sens précédent.

EXERCICE 5.2 - Automate - suite


Q.2. 4. Modifier le diagramme d’état précédent pour prendre en compte cette nouvelle possibilité.
Q.2. 5. Décrire le choix de la période de l’horloge principale de votre système. Donner alors la configu-
ration du timer TMR0.
Q.2. 6. Modifier le programme en C précédent. Le bouton d’arrêt d’urgence sera simulé par un bouton-
poussoir.

– 32 –
GEII - MC-II2 Annexe A
Création d’un projet sous MPLABX - Compilateur XC8

La description qui suit est basée sur les versions 1.70 de MPLABX et 1.12 de XC8, sur n’importe quelle plateforme (Mac, Linux ou Windows).

MPLABX - l’interface

Création d’un projet


Vous devez au préalable lancer MPLABX IDE.
1. Lancez ensuite l’assistant de création de projet (File =⇒ New Project).
2. A la première page, il faut choisir la catégorie Microchip Embedded et un projet du type Standalone project.
Puis cliquez sur Next.
3. Choisissez ensuite le micro-controleur sur lequel vous voulez travailler dans Device (PIC16F690 pour les TP 1 et 2
et le PIC18F2520 pour les TP 3, 4 et 5). Puis cliquez sur Next.
4. Laissez l’option None dans la page suivante. Puis cliquez sur Next.
5. A la page Select Tool, sélectionnez l’option Simulator, si vous n’avez pas de carte d’étude, ou l’option PicKit2 ou
PicKit3 si une carte d’étude est connectée au PC. Puis cliquez sur Next.
6. A la page Select Compiler, sélectionnez l’option XC8, pour développer en C ou l’option mpasm, pour développer
en assembleur. Puis cliquez sur Next.
7. A la page Select Project Name and Folder, donnez un nom à votre projet (TPx par exemple) et entrez le répertoire
de travail communiqué par l’enseignant. Puis cliquez sur Finish.
IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C

Création d’un code source


A ce stade, le projet ne contient pas encore de fichier source.
1. Faites un clic droit sur le dossier Source Files. Sélectionnez ensuite New et Others.
2. Choisissez ensuite la catégorie Microchip Embedded / XC8 Compiler et le type de fichier main.c (si vous avez
choisi de développer votre application en langage C). Puis cliquez sur Next.
3. Donnez un nom à votre fichier source et cliquez sur Finish.
Vous devriez obtenir un fichier *.c ressemblant à ceci :
1 # i n c l u d e <xc . h>
2
3 i n t main ( v o i d )
4 {
5 return 0;
6 }

Compilation
La compilation se fait en cliquant sur l’icone suivante de l’interface .
Si la compilation ne retourne pas d’erreurs, un fichier *.hex est alors généré dans le répertoire /dist/default/produc-
tion/ du répertoire de travail.

Implémentation sur un microcontroleur


Implémentation à l’aide de PicKit 2 ou 3

L’implémentation dans le composant se fait en cliquant sur l’icone suivante de l’interface


Implémentation à l’aide d’un bootloader
1. Connectez la carte d’exercice à l’ordinateur : l’alimentation via une liaison USB et la programmation via une liaison
série RS232 à 9 broches.
2. Lancez l’application "Tiny Bootloader" (fichier "tinybldWin.exe). Dans la fenetre, suivez alors les consignes sui-
vantes :
(a) Vérifiez que le groupe "COMM" contient 115200 et COM1.
(b) Vérifiez que sous l’onglet "Options", les cases "Reset PIC using RTS line" et "Switch to Terminal after
Write" sont cochées.
(c) Appuyez sur le bouton "CheckPIC" et vérifier que le compte-rendu "Searching for PIC ... Found :18F2520/4520"
soit apparu. Cela valide les connexions et les réglages.
(d) Sélectionnez le fichier binaire chargeable "TP1.hex" précédemment produit.
(e) Appuyez sur "Write Flash". Au bout de quelques secondes, le composant est programmé.

– 34 –
GEII - MC-II2 Annexe B
Rebonds mécaniques

Phénomène
Les boutons-poussoirs possèdent trois bornes. La borne centrale repérée par C est la borne commune en contact avec
la borne NC lorsque le bouton est au repos (bouton relâché). En appuyant sur le bouton, la borne C est en contact avec
la borne NO. Ce type de bouton est particulièrement adapté pour générer des impulsions de commande, de durée plus ou
moins longue.
En pratique, le bouton-poussoir n’est pas un dispositif mécanique parfait et les contacts métalliques rebondissent
plusieurs fois l’un sur l’autre à la fermeture (du à un ressort de renvoi). Pratiquement, la tension à ses bornes varie
comme indiqué ci-dessous. L’amplitude, la durée et le nombre des rebonds engendrés dépendent des caractéristiques des
boutons-poussoirs et du circuit auquel ils se rattachent.
Ces impulsions de tension créées à la fermeture des contacts C-NO et C-NC sont très généralement indésirables pour
les circuits électroniques. Pour éviter cet inconvénient.

Système anti-rebond en logique séquentielle


Comme il l’a été vu dans le module d’ENSL1, une des principales applications des bascules RS est la réalisation de
systèmes anti-rebond.