MICROCONTROLEUR - C MPLABX
Transcription
MICROCONTROLEUR - C MPLABX
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 - [email protected] 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 disponible 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 (conditionnement 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 encombrement et son faible poids imposent des contraintes supplémentaires lors de la conception, par exemple pour la dissipation 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 instructions. 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équentiellement 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 technologiques 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, économiques, é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ériphé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 structure 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 plusieurs 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 (système multitâche) ; – maîtrise des contraintes temporelles : système temps réel, qui doit satisfaire des contraintes explicites (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 2.1.2 # define NOM_CONSTANTE 321 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. Quelle place occupe le programme de base ? Combien d’octets sont-ils utilisés en mémoire RAM ? Q.2. 2. 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 correspondent 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 2.1.4 MICROCONTROLEUR - C 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 Ecrire un programme en assembleur qui initialise une variable à une valeur non nulle et qui teste Q.6. 1. 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. 2.3.1 Quels sont les 3 types de boucles itératives que vous connaissez ? Faites leur organigramme. Compteur EXERCICE 1.7 - suite Q.7. 2. action. Ecrire le code assembleur d’une boucle itérative permettant d’exécuter 10 fois un sous-programme – 11 – IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C En langage C, on écrira ceci de cette façon : 1 2 3 4 5 6 7 8 9 10 11 12 13 char a , b ; void a c t i o n ( ) { b = b ∗ 2; } i n t main ( v o i d ) { b = 0; f o r ( a = 0 ; a < 1 0 ; a ++){ action (); } return 0; } 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 Noter l’utilisation ici de variables globales. Cela a-t-il un impact sur le code résultant ? Aurait-on Q.7. 3. 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’instruction decfsz pour obtenir un programme très efficace. Le modèle en C pourrait s’écrire comme ci-dessous : 1 2 3 4 5 6 7 8 9 10 11 12 13 char a , b ; void a c t i o n ( ) { b = b ∗ 2; } i n t main ( v o i d ) { b = 0; f o r ( a = 1 0 ; a > 0 ; a − −){ action (); } return 0; } 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 pouvezvous 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 MPLABXC8-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 fonction ? 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. Comment a été remplacé l’appel à cette fonction dans le code désassemblé ? Est-ce la meilleure Q.8. 3. 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 bibliothè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, commercialisation). 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 microcontrô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 2 char c ; 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 2 char c ; 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 microcontroleur 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 instructions. 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 compatible 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 direction 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. de 1 s. Q.1. 6. Q.1. 7. Faire l’organigramme d’un programme permettant de faire clignoter une des LED avec une période Ecrire ce programme en C et tester-le. 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ésistance. EXERCICE 2.2 - Mise en oeuvre d’un ADC Quels sont les registres associés au convertisseur analogique numérique ? A quoi servent-ils ? Q.2. 1. 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 largeur d’impulsion) est souvent mise en oeuvre pour le réglage proportionnel d’organes présentant une certaine inertie (moteurs par exemple) ou associés à des récepteurs à temps de réponse important (vision humaine 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 LED1 LED2 LED3 LED4 LED5 LED6 broche RC2 RA3 RB4 RB5 RB6 RB7 élément SW1 SW2 broche RC0 RB3 BP1 BP2 BP3 RB0 RB1 RB2 élément Pot Photo Temp broche RA0 RA1 RA2 HP RC1 analog AN0 AN1 AN2 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 composant 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’ensemble 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 Quelles sont les fonctions disponibles pour le module ADC sur le PIC18F2520 ? Donner un bref Q.3. 3. 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 conversion 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 suivant, 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 Quelles sont les fonctions disponibles pour le module USART sur le PIC18F2520 ? Donner un Q.4. 1. 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 obtenir 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. Q.5. 2. Ecrire et tester le programme en C. 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 interruptions 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 interruptions 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 1.3.1 MICROCONTROLEUR - C Programme principal 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 # include # include # include # include < p i c 1 8 . h> < h t c . h> < p l i b / t i m e r s . h> " monPIC . h " # define # define TAST TMONO 10 20 v o i d i n t e r r u p t HighISR ( v o i d ) ; char t _ a s t , t_mono ; i n t main ( v o i d ) { initPIC ( ) ; / / CONFIGURATION DU TIMER0 OpenTimer0 ( TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_16 ) ; INTCONbits . GIE = 1 ; while ( 1 ) { i f ( t _ a s t == 0 ) { // astable t _ a s t = TAST ; / / actions a f a i r e periodiquement } i f ( t_mono == 0 ) { / / monostable / / f i n de l a p e r i o d e m o n o s t a b l e } i f ( BPo1 == 1 ) { t_mono = TMONO; / / 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 } } return 0; } 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 2 3 4 5 6 7 8 v o i d i n t e r r u p t HighISR ( v o i d ) { i f ( INTCONbits . TMR0IF ) { i f ( t _ a s t != 0 ) t _ a s t − −; i f ( t_mono != 0 ) t_mono − −; INTCONbits . TMR0IF = 0 ; } } – 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 variables 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 : fT MR0 = 4· FOS C MODE 2 · PREDIV – 27 – (1) IUT Créteil - GEII - MC-II2 - SYSTEMES EMBARQUES AVANCES MICROCONTROLEUR - C EXERCICE 4.1 - Configuration du timer TMR0 Quelles sont les valeurs minimale et maximale de prédivision disponible pour le timer TMR0 ? Q.1. 1. 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 rectangulaire 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 scintillement 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 ? Quels doivent être alors les paramètres du timer TMR0 ? Q.3. 4. 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 parallè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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 char e t a t = ETAT0 ; while ( 1 ) { i f ( clk = 0){ c l k = M; / / Etats switch ( e t a t ) { c a s e ETAT0 : i f ( e n t r e e == VAL1 ) e t a t = ETAT1 ; i f ( e n t r e e == VAL2 ) e t a t = ETAT3 ; i f ( e n t r e e == VAL3 ) e t a t = ETAT4 ; break ; c a s e ETAT1 : e t c . / / eventuellement default } } / / C a l c u l d e s s o r t i e s ( Moore ) s o r t i e 1 = ( ( e t a t == ETAT1 ) | | ( e t a t == ETAT4 ) ) ; ... } / / 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 synchronisé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 permanence 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’augmente ? – 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 descente. La commande est assurée par un boutonpoussoir unique, BOU qui commande la marche : ouverture lorsque la porte est fermée, fermeture lorsque la porte est ouverte. Deux capteurs de fin de course haut et bas, FH et FB, permettent d’arrêter automatiquement 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 configuration 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 systè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 configuration 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 boutonpoussoir. – 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 2 3 4 5 6 # i n c l u d e <xc . h> i n t main ( v o i d ) { return 0; } 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/production/ 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 suivantes : (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.