Travaux Pratiques - Microprocesseurs Microcontrôleurs
Transcription
Travaux Pratiques - Microprocesseurs Microcontrôleurs
Université de Savoie Module ETRS-604 Travaux Pratiques Microprocesseurs & Microcontrôleurs Sylvain MONTAGNY [email protected] Bâtiment chablais, bureau 13 04 79 75 86 86 TP1 : Programmation sur microcontrôleur PIC (1) TP2 : Programmation sur microcontrôleur PIC (2) TP2 : Programmation sur microcontrôleur PIC (3) Retrouver tous les documents nécessaires au TP sur le site www.master-electronique.com Université de Savoie Module ETRS-604 Microprocesseurs et microcontrôleurs TP1 Programmation sur microcontrôleur PIC Objectifs : Mise en œuvre des fonctions d’un microcontrôleur PIC en langage C I. Présentation Ces microcontrôleurs sont à la base d’un grand nombre d’applications industrielles et leur fonctionnement peut être transposé à la plupart des familles de microcontrôleurs. On se propose de découvrir la totalité d’une chaîne de développement des microcontrôleurs PIC. Ces microcontrôleurs développés par la société Microchip sont extrêmement répandu dans le milieu industriel grâce à leur simplicité et leur coût réduit. Le microcontrôleur utilisé sera le 16F877. II. Prise en main de l’environnement 1. La carte de développement 1.1. Alimentation et communication avec la carte La connexion de la carte avec le PC se fait avec la connexion USB (le port USB de gauche sur la carte). Cette communication par USB est aussi utilisée pour l’alimentation de la carte. 1.2. La suite logiciel et matériel de Mikroelektronika Nous utiliserons l’environnement développé par Mikroelektronika qui rassemble : La carte de développement EasyPIC L’outil de développement logiciel : mikroC (éditeur de texte, compilateur et éditeur de liens) Le chargeur du programme exécutable en mémoire : PicFlash . Le debugger : MikroICD Debugger L’ensemble des ports d’E/S du composant installé sur son support peut être relié au choix par des Leds, des boutons poussoirs, ou simplement déportés pour être visualisé sur l’oscilloscope. Les connexions de ces différents éléments se font par des cavaliers et des interrupteurs. La documentation explique très bien les différentes options disponibles. 1.3. Utilité d’une carte de développement Celles-ci permettent de faire des tests d’application avant la mise en production d’un produit. La carte de développement permet donc d’avoir une connexion directe entre le PC et le microcontrôleur afin de connaître en temps réel les valeurs des registres ou de n’importe quel emplacement mémoire du microcontrôleur. Cette liaison de DEBUG (connexion entre PC et microcontrôleur) n’est pas définitive mais seulement temporaire à la durée de développement et de test du programme. Celle-ci à l’inconvénient de prendre 2 broches d’entrée sortie du PIC (Pins 6 et 7 du port B). Une autre forme de test, moins puissante mais qui ne prend aucune ressource au microcontrôleur est la simulation. Le code n’est alors pas chargé dans la cible (microcontrôleur) et le code s’exécute sur le PC en simulation. 1.4. Les modes de compilation Lors de la compilation, deux configurations peuvent être envisagées : Le mode Release : Le code généré est débarrassé de toutes les informations de debugage (ex : numéro de ligne, communication avec le PC, etc…). Le code pourra être simulé sur ordinateur mais en aucun cas avec le débuggeur. Le mode Debug : Les informations de debugage sont liées au fichier exécutable. Le fichier est donc plus important et permet une utilisation du débuggeur. Les broches 6 et 7 du port B seront utilisées. 2. Développement d’une application Avant de lancer l’environnement de développement créez un répertoire de travail sur votre compte. Tous vos fichiers seront rassemblés dans ce répertoire. Pour tous projets, les étapes suivantes doivent être réalisées : Création d’un nouveau projet. File>New>New Project Paramétrage du projet (choix du composant cible, emplacement du projet…) Ajout de fichiers (sources, librairies…) au projet Votre fonction main ( ) pour ce projet sera constitué de la fonction suivante : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. void main (void) { TRISB=0xF0; while(1){ PORTB=0x0F; delay_ms(500); PORTB=0x00; delay_ms(500); } } Compilation du projet qui génèrera les fichiers suivants : fichier.asm : Un fichier en langage assembleur avec les codes machines correspondant à chaque instruction et les adresses mémoire du code. fichier.lst : Même information que le fichier.asm avec en plus la résolution des adresses pour les variables utilisées. fichier.hex : Un fichier en langage machine qui peut être transféré en mémoire programme du microcontrôleur à l’aide d’un chargeur. 3. Chargement du programme en mémoire Ceci est réalisé avec PicFlash qui est intégré à l’interface de développement. Il va servir à transférer le fichier exécutable (clignotement.hex) dans la mémoire du microcontrôleur. L’icône correspondante au chargeur est située à droite ( ou F11). Le code compilé auparavant sera directement chargé en mémoire du composant spécifié. 4. Lancement du programme En mode release, le programme est lancée automatiquement après son chargement en mémoire. (Aucun debugage possible) 5. Configuration de la carte Vous devez vous référer systématiquement à la documentation de la carte lorsque vous souhaitez réaliser une application. Q1. Faite fonctionner votre application et valider son fonctionnement. III. Applications 1. Mesure du temps de cycle du processeur En reprenant l’exemple du TD, mettez en place une application permettant de mesurer le temps de cycle instruction du processeur. N’oublier pas de bien faire la configuration de la carte afin de pouvoir visualiser les données du PORTB sur les broches d’extension. Q2. Quelle est la fréquence de cadencement du microcontrôleur de votre platine ? Q3. Modifier le programme précédent afin de réaliser cette mesure de temps de cycle. Justifiez ce que vous visualisez à l’oscilloscope. Est-ce cohérent avec la fréquence de cadencement du microcontrôleur ? 2. Détermination de la persistance rétinienne La persistance rétinienne est la sensation d’avoir une image fixe due au changement trop rapide d’état de la led. Nous allons essayer de déterminer la persistance rétinienne de nos yeux en utilisant les fonctions de temporisation à notre disposition. Les temporisations sont très pratiques et très souvent utilisées en programmation industrielle. Vous pouvez retrouver ces fonctions de temporisation en tapant le mot clé « delay » dans l’aide. Pour le calcul de la persistance rétinienne, on se propose de réaliser un programme qui ajuste la durée à l’état haut et à l’état bas d’un signal carré sur la broche 0 du PORTB. Cette durée sera sélectionnable suivant le bouton poussoir appuyé sur le PORTC comme préciser cidessous. PORTC, bit 0 : 2 ms PORTC, bit 1 : 5 ms PORTC, bit 2 : 10 ms PORTC, bit 3 : 13 ms PORTC, bit 4 : 15 ms PORTC, bit 5 : 18 ms PORTC, bit 6: 20 ms PORTC, bit 7: 22 ms Q4. Dessiner sur votre feuille le schéma du montage que vous voulez réaliser. Expliquer les configurations des interrupteurs que vous faites sur la platine. Q5. Ecrivez et tester le programme en précisant la persistance rétinienne que vous avez trouvez. 3. Appareil photographique On désire utiliser le PIC16F877A pour réaliser une partie de la gestion d’un appareil photographique. L’objectif du logiciel implanté sur cette architecture de microcontrôleur est de permettre de déterminer la vitesse d’obturation, de gérer le flash, et de préciser le nombre de photos utilisées. Commande de prise de vue (bouton déclencheur) : 1 bit. Mesure de l’intensité lumineuse de la scène à photographiée : 1 bits Nombre de photos réalisées (16 poses au maximum) : 4 bits Sélection de la commande manuelle ou automatique du flash : 1 bit Commande du Flash : 1bit 3.1. Incrémentation du nombre de photos On propose d’interconnecter les ports A et B aux divers signaux d’entrées et de sortie du système de la manière suivante : Déclenchement de la prise de vue : Bit 0 du Port A en entrée. Si le bit est au niveau 1 alors le déclencheur est pressé. Cela sera réalisé par un bouton poussoir. Nombre de photos : Bits 0 à 3 du Port B en sortie. Affichage en binaire sur les leds. Rappel : La PORTA est un port Multiplexé, cela signifie qu’il est utilisé pour deux choses différentes. Il peut être utilisé en mode Analogique (pour le convertisseur AN) ou en mode numérique (pour les ports d’entrée sortie numérique). Vous devez régler le registre ADCON1 afin de configurer ce port en mode numérique. Q6. Réaliser un programme qui, à chaque appui sur le déclencheur, incrémente le nombre de photos prises. 3.2. Commande du flash On rajoute à notre application une commande d’un flash pour améliorer la luminosité de certaines scènes. Le flash sera soit inactif, soit utilisé en mode automatique. C'est-à-dire qu’il se déclenchera lorsque la mesure d’éclairage est inférieure à un seuil donné par un capteur d’intensité. Ce capteur est symbolisé par un bouton poussoir sur le bit 2 du Port A. Le flash sera commandé de la manière suivante : Déclencheur t Flash 600ms t Figure 1 : Chronogramme de la commande du flash Les connexions utilisées seront les suivantes : Mode de fonctionnement du flash : Bit 1 du Port A en entrée. Si le bit A1 est au niveau 1 le mode du flash est automatique sinon il est inactif. Q7. Mesure de l’intensité lumineuse pour l’ouverture du diaphragme : Bits 2 du Port A en entrée. Cela sera réalisé par un bouton poussoir. Si le bit est à 1, la scène est sombre, sinon l’intensité lumineuse est suffisante (pas besoin du flash). Commande du flash : Bit 4 du Port B. Une LED symbolisera le flash. Modifiez votre programme C afin de faire fonctionner la commande du flash Université de Savoie Module ETRS-604 Microprocesseur & Microcontrôleur TP2 Programmation sur microcontrôleur PIC Objectifs : WatchDog TIMER & Gestion des interruptions sur un microcontrôleur en C I. Etude du WatchDog Q1. Expliquer le rôle du WatchDog dans un système à microcontrôleur. 1. Mise en évidence du fonctionnement du WatchDog Pour illustrer le fonctionnement du WatchDog, éditez le programme principal de chien_garde.c suivant dans un nouveau projet : 1. void main( void) 2. { 3. PORTB.F0 = 0; 4. TRISB.F0 = 0; /* PORTB.F0 en Sortie */ 5. PORTB.F0 = 1; /* Allumage de la led */ 6. Delay_ms(100); 7. while (1) { 8. PORTB.F0 = 0; 9. } 10. } Transférer ce fichier HEX dans le PIC une fois en validant le WatchDog et une autre fois sans sélectionner l’option WatchDog. Le changement des « fusibles » ou « device flags » du WatchDog se font dans Project>Edit Project. Q2. Valider les différences de fonctionnement avec et sans WatchDog. 2. Développement d’une application avec le WatchDog Pour illustrer totalement le fonctionnement du WatchDog on se propose de coder une simulation de plantage d’un logiciel. Le plantage du logiciel sera simulé par une boucle infinie. L’organigramme du programme est le suivant: Allumer PORTB.F0 TEMPO 100 ms Eteindre PORTB.F0 PORTA.F0 appuyé ? Non Oui Allumer PORTB.F0 Plantage : Boucle infinie >> while(1) ; Q3. Mettre en place l’application ci-dessus sans la gestion du WatchDog. Vérifier que le plantage du logiciel est bien effectif. Q4. Mettre en place l’application ci-dessus avec gestion du WatchDog. Vérifier que le RESET du microcontrôleur s’effectue bien lorsque celui-ci plante (rentre dans la boucle infinie). Q5. Expliquer quelle instruction il faut utiliser périodiquement pour éviter le RESET du microcontrôleur lorsque le programme fonctionne normalement. Que fait cette instruction exactement? II. Etude des interruptions 1. Présentation des interruptions Ce microcontrôleur peut être interrompu par des sources multiples. En revanche il ne dispose que d’un seul vecteur d’interruption. Ce vecteur est en fait l’adresse 0x0004 de l’espace programme. Après une interruption il est donc nécessaire que le sous-programme d’interruption identifie l’interruption qui a été activée. Il remontera à la source de l’interruption à l’aide des bits d’état associés aux interruptions (exemple : Flag T0IF=1 pour un overflow du Timer 1). 2. Exemple de gestion des interruptions Le programme gestion_IT.c propose une illustration du fonctionnement de ces interruptions. Vous pouvez récupérer ce fichier sur l’espace étudiant du site www.master-electronique.com Analyser le contenu de ce programme d’exemple. Q6. Parmi ces 3 interruptions, laquelle est la plus prioritaire dans le cas où deux sources d’interruption deviennent actives en même temps ? Q7. Comment peut-on modifier les priorités relatives de ces 3 interruptions ? Q8. Faire un schéma du microcontrôleur avec les Leds et les boutons poussoir qui permettront de valider le fonctionnement de ce programme. Configurer votre carte correctement. Tester et expliquer son fonctionnement. 3. Interruption timer On désire générer une note proche du La (fréquence 440Hz) Ce signal carré périodique doit être disponible sur le Bit1 du port A et sera visualisé sur l’oscilloscope. Ce fonctionnement est analogue à celui du clignotement étudié lors du TP précédent. La principale différence réside dans le fait que l’on utilisera l’interruption du timer pour générer les durées à l’état haut et à l’état bas du signal périodique et non la procédure delay_ms(…). Q9. Modifier le programme gestion_IT.C pour réaliser la génération de cette note en utilisant l’interruption Timer. III. Accordeur de guitare Dans cette partie on se propose d’utiliser le microcontrôleur défini précédemment pour réaliser un accordeur de guitare. 4. Génération d’une note L’accord d’une guitare peut être réalisé à l’aide d’un diapason. La note émise par le diapason est un LA (440 Hz). Elle correspond à la 5ème corde d’une guitare jouée à vide. Q10. Proposer un programme qui génère la note « LA », lorsque l’on appuie sur un bouton poussoir. 5. Modification de la corde à accorder. A l’aide des 2 boutons « Suivante » et « Précédente » on souhaite pouvoir modifier la note générée par l’accordeur. Il sera alors possible d’accorder une nouvelle corde de la guitare. Lorsque l’on appuie sur le bouton « Suivante » on passe à l’accord de la corde suivante et lorsque c’est le bouton « Précédente » c’est l’accord de la corde précédente. Par exemple une fois la 5ème corde accordée on peut générer la note qui correspond à la 4ème corde si l’on a appuyé une fois sur la touche « Précédente ». Les notes et les fréquences associées à chaque corde jouée à vide sont : 6ème corde : Mi 3= 330Hz 5ème corde : La 3 = 440Hz 4ème corde : Ré 4 = 588Hz 3ème corde : Sol 4 = 830Hz ème ère 2 corde : Si 4 = 988Hz 1 corde : Mi 5 = 1320Hz Q11. Proposer un programme C intégrant les interruptions permettant de générer les 6 notes de chaque corde d’une guitare. Les détections des appuis des touches « notes suivantes » et « note précédente » seront scrutées dans le main(). Q12. Proposer le même programme en intégrant cette fois seulement la fonction « note suivante » dont la détection de l’appui de la touche est gérée par une interruption externe. Université de Savoie Module ETRS-604 Microprocesseurs et microcontrôleurs TP3 Programmation sur microcontrôleur PIC Objectifs : Mise en œuvre et utilisation des afficheurs 7 segments, multiplexage à l’affichage, gestion de l’affichage par interruption. I. Présentation Les microcontrôleurs doivent souvent rendre compte de certaines informations au monde extérieur au moyen d’afficheurs (en général des afficheurs 7 segments). Pour Piloter les 7 segments et le point d’un afficheur, il est nécessaire de disposer de 8 signaux logiques (et un autre supplémentaire pour activer l’afficheur) comme par exemple ceux d’un port d’un microcontrôleur. Lorsque qu’un seul afficheur est à commander, un port du microcontrôleur lui sera dédié (plus un signal logique supplémentaire issu d’un autre port pour activer l’afficheur). En revanche, si 4 afficheurs sont à piloter, il devient rédhibitoire d’utiliser autant de port du microcontrôleur que d’afficheurs : il faut alors utiliser la technique du multiplexage à l’affichage où un seul port pilotera chaque afficheur mais seulement à un moment donné. II. Mise en œuvre d’un afficheur Nous souhaitons réaliser un compteur allant de 0 à 9 chaque fois que l’on appuie sur un bouton poussoir. Un autre bouton poussoir permettra le décomptage de 9 à 0. On gérera aussi le dépassement : si on est à 9 et que le BP comptage est de nouveau appuyé, on repasse à 0 (même principe pour le décomptage : si on est à 0 on repasse à 9). On prévoira aussi un autre bouton poussoir pour effectuer une remise à zéro à tout moment. Q1. Afficher le chiffre 0 sur l’afficheur DIS0. Note : Pensez à utiliser l’outil dédié AFFICHEUR 7 SEGMENTS dans le menu : Tools --> Seven Segment Convertor Q2. Ecrire et tester le code d’une fonction C «Affiche_Chiffre » qui prend un nombre entier N comme argument et renvoie un nombre non signé sur 8 bits (unsigned char). Ces 8 bits permettront de délivrer les bons niveaux logiques à affecter au port D pour afficher le nombre N sur l’afficheur DIS0. Q3. Ecrire l’application finale. III. Multiplexage et persistance rétinienne Q4. Réaliser un programme cyclique (qui tourne en permanence) qui utilisera les 4 afficheurs en faisant apparaître successivement pendant 500 ms : d’abord un « S » sur l’afficheur DIS3, puis un « T » sur l’afficheur DIS2, ensuite un « I » sur l’afficheur DIS1 et enfin un « C » sur l’afficheur DIS0. Note : Pour obtenir une TEMPO de 500 ms, on pourra utiliser la fonction : delay_ms (Nb de milliseconde) Q5. Modifiez votre programme afin que l’on puisse observer le sigle « STIC » en entier sans effet d’intermittence. IV. Application : minuteur Q6. Ecrire le code d’une fonction C « Separe_DU » (séparation des Dizaines et des Unités) qui prend un nombre entier N (inférieur ou égal à 59) comme argument et qui sépare alors les dizaines et les unités en plaçant ces deux nombres dans deux variables différentes de type entier. Q7. Concevez un programme qui permet de réaliser les fonctionnalités d’un minuteur pouvant au maximum donné un temps jusqu'à 10 minutes avec une précision égale à la seconde. Note 1 : Les afficheurs DIS0 et DIS1 afficheront les secondes précises de 0 à 59, l’afficheur DIS2 affichera en permanence un point et enfin l’afficheur DIS3 affichera les minutes précises de 0 à 9. Note 2: Un BP démarrera le comptage, un BP l’arrêtera et enfin un BP permettra la RAZ du minuteur. Nota 3: Pensez à utiliser l’interruption timer0 (qu’il faudra paramétrer comme dans le TP2) pour un rafraîchissement correct des afficheurs afin que notre œil n’ait pas la sensation d’intermittence ou de scintillement. V. Application Convertisseur A/N Réaliser une conversion analogique / numérique d’une valeur comprise entre 0V et 5V réglable à l’aide du potentiomètre de votre platine. Q8. Dans un premier temps, afficher les 8 bits de poids fort sur les leds du PORTB. Q9. Dans un deuxième temps, affiché les valeurs en décimal (de 0 à 1023 ) sur les afficheurs 7 segments.
Documents pareils
Etape1 : Configuration logiciel Etape2 : Placement des composants
Le programme fonctionnant correctement il faut maintenant créer le
fichier permettant d’être envoyé dans la puce.nom_fichier.HEX.
Sous le menu PUCE, sélectionner l’option compiler->HEX
TP 1 Prise en main
Les ports A, B, C, D et E sont des ports d'entrée/sortie dont chaque bit peut être utilisé soit en entrée
soit en sortie, de façon indépendante. Ainsi chaque bit possède un satellite : TRISA, TRISB...