35
Chapitre 4- Architecture et fonctionnement d’un microcontrôleur 1 Dr. M. DJARALLAH 4.1- Introduction Dans ce troisième chapitre nous allons aborder : I- Description matérielle (architecture) d’un μ-contrôleur et son fonctionnement ; II- Programmation du μ-contrôleur, Exemple : Le μ-contrôleur PIC + Moteur Pas à Pas 4.2- Description matérielle (architecture) d’un μ-contrôleur et son fonctionnement Définition Un microcontrôleur est un circuit qui intègre un maximum de fonctions dans un même boitier. L’intégration de ces fonctions dans le même environnement permet de créer des applications plus simplement. 4.2.1- Description matérielle (architecture) d’un μ-contrôleur La structure interne d'un microcontrôleur comporte typiquement (Fig.4.1): i- Une unité de calcul et de commande ii- Mémoire ROM iii- Mémoire RAM iv- Un contrôleur d’interruption v- Un compteur/temporisateur (timer) vi- Des entrées/sorties parallèles (ports) vii- Un UART (port série) viii- Un Watchdog : (surveillance du programme) ix- Une sortie PWM (modulation d’impulsion) x- Un CAN/CNA (Convertisseur analogique numérique) xi- Interfaces I²C, CAN… xii- Etc.. Fig. 4.2 : Les constituants d’un MC

4.1- Introduction Dans ce troisième chapitre nous allons

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

1 Dr. M. DJARALLAH

4.1- Introduction Dans ce troisième chapitre nous allons aborder :

I- Description matérielle (architecture) d’un µ-contrôleur et son fonctionnement ; II- Programmation du µ-contrôleur, Exemple : Le µ-contrôleur PIC + Moteur Pas à Pas

4.2- Description matérielle (architecture) d’un µ-contrôleur et son fonctionnement Définition Un microcontrôleur est un circuit qui intègre un maximum de fonctions dans un même boitier. L’intégration de ces fonctions dans le même environnement permet de créer des applications plus simplement. 4.2.1- Description matérielle (architecture) d’un µ-contrôleur

La structure interne d'un microcontrôleur comporte typiquement (Fig.4.1):

i- Une unité de calcul et de commande ii- Mémoire ROM iii- Mémoire RAM iv- Un contrôleur d’interruption v- Un compteur/temporisateur (timer) vi- Des entrées/sorties parallèles (ports) vii- Un UART (port série) viii- Un Watchdog : (surveillance du programme) ix- Une sortie PWM (modulation d’impulsion) x- Un CAN/CNA (Convertisseur analogique numérique) xi- Interfaces I²C, CAN… xii- Etc..

Fig. 4.2 : Les constituants d’un MC

Page 2: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

2 Dr. M. DJARALLAH

Applications typiques :

L’architecture minimale d’un MC peut être résumée dans la Fig. 4.4a ; où on constate touts les

constitutifs cités déjà arrangés dans un schéma synoptique minimal. Le circuit de la mise en œuvre est donné dans la Fig. 4.4b.

Fig. 4.3 : Configuration de base d’un MC dans une application donnée

Microcontrôleur

N/N et CAN/CNA

RS232 etc..

Fig. 4.4a: Architecture minimale d’1 MC Fig. 4.4b: Circuit de mise en

œuvre d’un MC

Page 3: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

3 Dr. M. DJARALLAH

4.2.2- Fonctionnement (matériel et logiciels) d’un µ-contrôleur

Le fonctionnement des microcontrôleurs et des périphériques qui lui seront interfacés est basé sur la connaissance de leurs architectures et les langages utilisés. Ce fonctionnement est résumé dans :

Bus de données

Un bus de données est constitué de connexions électriques reliant les différents composants du microcontrôleur :

a) Le micro-processeur, b) La mémoire et c) Les périphériques.

Il leur permet d'échanger des mots binaires. Le transfert de données est cadencé par un signal d'horloge : à chaque cycle d'horloge, un octet

est échangé dans le sens imposé par les lignes de contrôle.

Mémoires du microcontrôleur Un microcontrôleur contient trois types de mémoires (voir les cours précédents) :

a) La mémoire programme ; b) La mémoire de données non volatiles, conservée même en cas de rupture de l'alimentation ; c) La mémoire de données volatiles, perdue en cas de coupure d'alimentation

Les informations sont échangées entre la mémoire et les autres composants par un bus de données Langage machine

Un micro-processeur n'est pas capable de comprendre directement un programme écrit en langage Python ou C. Il ne comprend que du langage machine, c'est-à-dire du code écrit en binaire.

En effet, le micro-processeur ne peut exécuter que les instructions "câblées" dans l'UAL, l'unité de calcul du micro-processeur. Sur un ordinateur classique, il existe un peu plus de mille instructions disponibles

Programmer dans le langage interne du micro-processeur, appelé "Assembleur", est possible, mais plutôt fatigant. La programmation se fait donc généralement dans un langage de plus haut niveau (comme Python ou C), proposant des instructions plus élaborées. Ce type de programme doit être traduit en langage machine pour être exécuté : il s'agit de la compilation.

Pour compiler un programme en langage machine, le logiciel utilisé doit tenir compte des caractéristiques de la machine sur laquelle sera exécuté le programme, en particulier les instructions disponibles et la configuration des registres. S'il existe presque toujours un compilateur C pour n'importe quel microcontrôleur, c'est beaucoup plus rare pour d'autres langages : c'est la raison pour laquelle le langage C est incontournable dans le milieu des microcontrôleurs.

Par ailleurs, le langage machine étant compilé pour un type de microcontrôleur précis, il ne peut pas s'exécuter sur d'autres microcontrôleurs. Par contre un même code C peut être compilé pour différents microcontrôleurs "cibles". L'étape de compilation se fait sur un ordinateur. Le programme est ensuite transféré dans la mémoire du microcontrôleur.

Page 4: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

4 Dr. M. DJARALLAH

Exécution par le micro-processeur

L'exécution du programme est cadencée par le signal d'horloge (signal provenant d'un quartz ou généré par un oscillateur interne au microcontrôleur) de l'ordre de quelques dizaines de méga-hertz. Selon les microcontrôleurs et les instructions à exécuter, il faut entre un et quatre cycles d'horloge pour traiter chaque instruction.

Les calculs sont effectués par l'unité arithmétique et logique (UAL). L'UAL est un circuit

logique dont les entrées sont l'adresse de l'instruction et les valeurs des opérandes. Le mot binaire calculé en sortie est renvoyé dans un registre (zone mémoire). Les registres

Les registres sont des emplacements de mémoire particuliers répartis dans l'ensemble du microcontrôleur permettant la configuration et l'utilisation des composants matériels. Ils sont l'interface entre le logiciel et les matériels.

Les registres les plus simples à configurer sont ceux des ports d'entrée-sortie logiques. Il est

possible de manipuler les registres par leur nom depuis le programme C. Cependant, le plus souvent, la configuration du matériel est confiée à des bibliothèques, par l'intermédiaire de fonctions beaucoup plus simples à manipuler et indépendantes de la cible. Périphériques d'entrées-sorties

Les microcontrôleurs sont conçus pour communiquer avec l'extérieur, traiter de l'information et renvoyer des consignes ou des données. Ils intègrent diverses fonctionnalités qui étaient auparavant implantées dans des circuits périphériques, comme des ports entrée-sorties logiques, des convertisseurs analogiques-numériques, des interfaces série RS232, des sorties PWM. Ces fonctionnalités sont généralement associées à des broches particulières du microcontrôleur. Les entrées-sorties logiques

Bon nombre de broches peuvent être utilisées comme entrée-sortie logique. Ainsi une entrée logique permet de détecter l'état d'un bouton poussoir ou d'un capteur de fin de course et une sortie logique permet de basculer un relais ou allumer une LED.

Les convertisseurs analogiques-numériques

Un convertisseur analogique-numérique (CAN) permet de mesurer une tension analogique (comprise entre 0 V et la tension d'alimentation du microcontrôleur 5 V dans le cadre de la carte EasyPIC5) et convertir la mesure en un entier que le programme pourra utiliser. La caractéristique principale du CAN est sa résolution Les sorties PWM (MLI)

Une sortie en modulation à largeur d'impulsion permet de piloter un actionneur soit par la commande directe d'un hacheur, soit par l'intermédiaire d'une valeur analogique. La sortie PWM oscille entre 0 et la tension d'alimentation du microcontrôleur à une fréquence élevée. Un filtre de type passe-bas permet d'avoir une valeur lissée si nécessaire. Les entrées d'interruption

Une interruption permet d'interrompre le déroulement normal du programme pour traiter une tâche prioritaire et reprendre ensuite un programme normal. Cette fonctionnalité est intéressante pour

Page 5: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

5 Dr. M. DJARALLAH

compter les impulsions d'un codeur incrémental par exemple. Lorsqu'un front est détecté sur la broche reliée au capteur, une interruption est levée, la variable de position est incrémentée ou décrémentée selon le sens puis le programme reprend sa tâche. Etc…….. 4.3- Programmation du µ-contrôleur, Exemple : Le µ-contrôleur PIC 4.3.1- Architecture du système de développement (SD) Un SD sert à écrire le programme d’application, qui sera introduit dans la mémoire de

programme du circuit cible. Ce système (SD) permet de tester le fonctionnement de l’application, tant

au niveau matériel que logiciel, et de corriger les erreurs des programmes.

Le SD qu’on dispose au laboratoire des machines spéciales est celui donné par la figure 4.5. Il

est destiné à la famille de Microchip, à fin de développer des programmes pour une série des familles

des MCs, dont les parties essentielles sont :

• Partie matériel (Kit de développement ‘EasyPIC 5’ qui contient les moyens nécessaires pour

développer une application ELT => touts types d’E/S sauf les LCD, fiches pour différents

MC DIP40, DIP28, etc.., débogueur en circuit ICD, etc..

• Partie logiciel Compilateur MikroC Pro (Editeur de texte, Assembleur, Compilateur, …,

Emulateur logiciel, chargeur d’EPROM par des fichiers Hexa., Simulateur, etc..), logiciel de

débogage logé dans la puce ICD.

Page 6: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

6 Dr. M. DJARALLAH

4.3.2- Programmation des MC 4.3.2.1- Compilateur MikroC et ICD

• L’IDE du MikroC dispose des moyens de développement à savoir (Fig. 4.6):

• L’éditeur où on écrit le programme ; Le manager des projets où on peut consulter les fichiers

constituants n’importe quel projet ;

• Le manager de la bibliothèque des routines ;

• Etc… (voir le TP1 pour plus d’information)

Par le bais de cet environnement (IDE) il est possible de :

1- compiler des programmes (projets) en C, qui peuvent contenir des fragments d’assembleur, en utilisant : project Build (Ctrl+F9). Le résultat de cette compilation est un ensemble de fichiers dont l’un est le machine code ( .hex);

2- Simuler ou charger et exécuter le programme par : a) simulation : project (Build + program ou Ctrl + F11) en cochant : Release et Software

du menu Project Settings ;

Fig.4.6 : IDE du MikroC Pro

Page 7: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

7 Dr. M. DJARALLAH

b) Chargement et exécution du programme : i- sans débogage (en temps réel) en cochant les cases : Release et mikroICD ; ii- avec débogage : en cochant les cases : ICD Debug et mikroICD.

Exemple 1

Fig. 4.7a : Circuit de test

i) Menu projet/ nouveau projet

Fig.4.7b : fenêtres du nouveau projet

ii) Nouveau projet directeur

Les objectifs : Identifier quelques éléments de la carte duSD, créer un projet, le compiler et l'exécuter sur la carte,observer les fichiers créés, tracer le programme et des variables.

Manipulation 1 : Suivre les instructions qu’on trouve dans la Fig. 4.7b, avec les recommandations suivantes : Nom du projet : exemple1_cours Chemin du projet : que tu désires . Le type de PIC est PIC16F887. Le programme à saisir est le suivant : void main() { PORTC = 0x00; // Turn OFF LEDs on PORTC TRISC = 0x00; // set direction to be output ANSEL = 0; // Configure AN pins as digital ANSELH = 0; do { PORTC = ~PORTC; // Turn ON LEDs on PORTC Delay_ms(1000); // 1 second delay } while(1); // Endless loop }

Page 8: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

8 Dr. M. DJARALLAH

Manipulation 2 :

Aller dans le dossier de votre projet :

Ouvrir les fichiers .hex, .mcl, asm, .lst. Que contiennent ces fichiers, quelle est leur utilité ?

Par quelles instructions assembleur sont traduites les lignes suivantes ?

PORTC = 0;

et TRISC = 0;

« Réponses de ces questions sont données dans la projection du cours »

Exemple 2 : Pour utiliser le débogueur : Modifier les options du

projet pour activer le débogueur ICD :

-Cocher mikroICD Debug sous Build type,

-Vérifier que mikroICD Debugger est activé .

-Compiler le projet (Build CTRL+F9).

-Programmer la puce PIC16F887 (Program - F11).

-Lancer le débogueur (Start Debugger - F9)

Exploiter le débogueur pour : Suivre en pas-à-pas

l'exécution du programme (Step Into par exemple).

Vérifier l'allumage correct des diodes du port C.

Remplacer la boucle infinie par :

for (k = 0; k < 256; k++) { PORTC = k; }

Ajouter le suivi des variables PORTC et k lorsque vous êtes en mode pas-à-pas. Contrôler la bonne évolution des

valeurs de ces variables.

Expérimenter les autres possibilités du débogueur.

Exercice 1 :

En se guidant par les deux exemples précédents, développer un programme en mikroC qui

manipule en sortie les ports du PIC disponible sur la carte du SD.

Exercice 2: déduire la tâche du programme qui va suivre, bien sûre après avoir fait sa lecture

approfondi.

void main()

{

ANSEL = 0; // Configure AN pins as digital

Page 9: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

9 Dr. M. DJARALLAH

ANSELH = 0;

C1ON_bit = 0; // Disable comparators

C2ON_bit = 0;

TRISA = 0x00; // set direction to be output

TRISB = 0x00; // set direction to be output

TRISC = 0x00; // set direction to be output

TRISD = 0x00; // set direction to be output

while(1){

PORTA = 0x00; // Turn OFF LEDs on PORTA

PORTB = 0x00; // Turn OFF LEDs on PORTB

PORTC = 0x00; // Turn OFF LEDs on PORTC

PORTD = 0x00; // Turn OFF LEDs on PORTD

Delay_ms(1000); // 1 second delay

PORTA = 0xFF; // Turn ON LEDs on PORTA

PORTB = 0xFF; // Turn ON LEDs on PORTB

PORTC = 0xFF; // Turn ON LEDs on PORTC

PORTD = 0xFF; // Turn ON LEDs on PORTD

Delay_ms(1000); // 1 second delay

} // Endless loop

}

Exercice 3 :

Sauvegarder le programme de l’exercice 2 sous un autre nom, bien sûre en créant un autre

projet, puis faites les manipulations suivantes :

a) Alternation des ports allumage des ports A, B et l’éteint des ports C et D. Par la suite

l’allumage et l’éteint en quartiers (0x0f et 0xf0), etc. ;

b) Insertion d’une boucle for (k = 0; k < 256; k++)

{ …………. …………. }

Quelles observations que tu peux donner vis-à-vis les ports d’E/S de ce PIC.

Page 10: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

10 Dr. M. DJARALLAH

4.3.2.2- Configuration et Initialisation des MCs

Généralités

En plus de l’outil de débogage ICD, ce SD (EasyPIC5) nous permet de programmer plusieurs

MC en trois langages : Pascal, C et l’assembleur. On observe dans les programmes précédents, que

pour programmer un MC, il faut le configurer et l’initialiser afin de le faire fonctionner conformément

aux besoins des applications régulation des systèmes industriels. Pour ce faire, il faut voir de près le

MC qu’on va utiliser.

La famille des MCs PICs est subdivisée, à ce moment en 3 grandes familles : La famille Base-Line, qui utilise des mots d’instructions de 12 bits, la famille Mid-Range, qui utilise des mots de 14 bits (et dont font partie les 16F84, 16F876 et 16F887), et la famille High-End, qui utilise des mots de 16 bits. Les tableaux 1.2 et 1.3 montre les caractéristiques de ces familles (F type flash).

Puisque le SD qu’on dispose contient le MC 16F887, qui possède suffisamment de facilités pour manipuler un système industriel (ex. : entraîner une machine électrique, acquisition et restitution de données, etc..), alors on va se baser sur ce PIC Peripheral Interface Controller.

Page 11: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

11 Dr. M. DJARALLAH

Tableau 4.2 :c/cs spécifiques des # familles

Page 12: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

12 Dr. M. DJARALLAH

4.3.2.3- Microcontrôleur PIC16F887 Le brochage de ce PIC est indiqué sur la Fig. 11, 40 broches PDIP40, où on observe que la plupart des broches accomplissent plus d’une fonction multifonctionnelle. Par exemple, le cinquième broche désigné par RA3/AN3/Vref/C1IN+, il a les fonctionnalités suivantes : - RA3 : Troisième broche du Port E/S numérique A ; - AN3 : Troisième broche de l’Entrée analogique ; - Vref : Borne + de la tension de référence ; - C1IN+ : Entrée + du comparateur 1

Cette structure rend le PIC compact, mais très encombré, ce qui nécessite une initialisation/configuration durant la programmation. Le tableau qui va suivre tableau 1.4, explique les fonctionnes de chaque broche. A noter qu’il y a une autre structure de ce PIC Fig. 4.8b.

Fig. 4.8a : DIP40 PIC16F887 Fig. 4.8b : Une autre structure du PIC16F887

Page 13: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

13 Dr. M. DJARALLAH

Le schéma bloc simplifié de ce PIC Fig. 4.8C :

Fig. 4.8c : Schéma bloc simplifié du PIC16F887

Pour réaliser une application comme celle indiquée par la Fig. 4.9, les configurations nécessaires nous obligent d’examiner en bref les blocs de cette figure. CPU : il reconnue 35 instructions. Le temps d’exécution de chaque instruction ne dépasse pas 4 cycles d’horloge, dont la fréquence de programmable est de 4MHz à 20MHz 200ns/instruction 1/200.109 = 5 millions d’instructions par second. Les instructions de saut et de branchement s’exécutent en 2 cycles d’horloge 100ns/instruction 1/100ns = 10 millions d’instructions par second.. Mémoire :

a) ROM ou Flash ROM (8kO) nommée « program memory » car c’est elle qui va contenir, en permanent, les instructions du programme.

Page 14: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

14 Dr. M. DJARALLAH

Tableau 4.3 : Fonctionnes des broches d’un PIC16F887

Page 15: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

15 Dr. M. DJARALLAH

Page 16: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

16 Dr. M. DJARALLAH

b) EEPROM (256 Octets) utilisée, généralement, pour stocker quelques résultats obtenus et générés durant le fonctionnement du PIC. La différence de cette mémoire de ROM, c’est que ces données peuvent être changées durant le fonctionnement.

c) RAM : c’est la mémoire la plus complexe des MCs, elle qui sert à configurer le PIC. Elle est constituée de DEUX parties : SFR special-function registers (registres aux fonctions spéciales) et GPR general-purpose registers (registres aux tâches générales). SFR est une collection de registres utilises par UC pour contrôler les opérations internes et externes (périphériques) configuration des E/S, envoi des données aux ports, chargement du temporisateur, etc., par exemple, le registre ADCONO nous permet de configurer le

Page 17: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

17 Dr. M. DJARALLAH

convertisseur A/D, ce qui facilite la programmation des PICs. Le SFR est utilisé en programmant le PIC par des assembleurs/langages évolués, comme le langage MikroC. Ces deux parties sont subdivisées en 4 banques comme le montre la Fig. 15. Par contre, GPR est utilisé pour stocker les données temporaires obtenues des opérations pendent l’exécution du programme. Cette partie nécessite plus de détail, voyant la dernière partie de la RAM, puis on va revenir aux banques de ce PIC.

d) Pile (Stack): 8 registres de 13 bits de la RAM sont destinés à la pile, où les paramètres du programme vont être stocker avant de ce brancher, avec call/inntertution, vers la routine voulue.

Banques de RAM

Avant d’accès à n’importe quel registre durant le développement du programme (lecture ou changement de son contenu), il faut sélectionner la banque qui contient ce registre. Deux bits d’état (status) du registre sont utilisés pour la sélection d’une banque. La Fig. 4.11 montre le schéma simplifié des 4 banques, où on observe les positions des registres et des adresses correspondantes. La

Fig. 4.10 : Schéma bloc d’un PIC, montrant les 4 banques de la RAM

Page 18: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

18 Dr. M. DJARALLAH

manipulation de ces banques est très facile en langage C, seulement on doit spécifier le nom du registre et le compilateur sélectionne la banque convenable et les instructions appropriées. ATTENTION, ce n’est pas le cas en assembleur !!!!!!!!!!

La Fig. 4.12, montre le schéma détaillé des 4 banques !!!!!!!!, cela ne te fait pas crainte, car on utilise, de ces tables, qu’une petite partie Cela ressemble à une « supermarket » et toi tu est un client, bien sûre tu n’achètes pas touts les produits exposés !!!!!!!!!

Dans le cours précédent on a donné des exemples, où on utilisé des ports du PIC16F877 comme des Sorties ; maintenant, on va voir de près les premières lignes de ces programmes.

Fig. 4.11 : Schéma simplifié des 4 banque d’un PIC16F8xx

Page 19: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4- Architecture et fonctionnement d’un microcontrôleur

19 Dr. M. DJARALLAH

 

Page 20: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

20 Dr. M. DJARALLAH

Page 21: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

21 Dr. M. DJARALLAH

4.3.3- Entrées/Sorties (E/S) 4.3.3.1- Ports d’E/S numériques

Les Ports A, B, C et E sont vus par le MC comme des registres de 8-bits. Chaque Port

possède un registre de commande nommé TRIS registre, comme le montre la Fig. 4.13. La mise à zéro d’un bit de TRIS fait correspondre cette broche à une SORTIE ; pour configurer cette broche comme ENTREE il suffit de mettre le bit correspondant dans TRIS à un (bit=1). 0 = SORTIE et 1 = ENTREE bien sûre dans le registre TRIS (ABSDE).

Un autre groupe de registres de commande intervient dans les configurations des PORTS A, B et E ; il s’agit des registres de commande ANSEL et ANSELH concernant la configuration des

Fig. 4.12 : Schéma simplifié des 4 banques d’un PIC16F8xx

Page 22: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

22 Dr. M. DJARALLAH

broches RA0 RA3 et RA5 du ports A ainsi que RB0 RB5 du port B et RE0 RE1 du port E comme des entrées ANALOGIQUES ou des SORTIES/ENTREES NUMERIQUES.

ANSEL = ANSELH = 0 ; // Touts ces broches sont des NUMERIQUES ANSEL = ANSELH = 1 ; // Touts ces broches sont des ANALOGIQUES

En mikroC, on trouve deux variables : C1ON_bit et C2ON_bit qui permettent l’activation

ou désactivation des 2 comparateurs logés dans ce PIC. La mise à zéro de ces variables permet la désactivation des comparateurs :

C1ON_bit = 0; C2ON_bit = 0; // désactivation des comparateurs. Remarque : Pour manipuler les bits d’un registre dans le mikroC, on utilise le format « 0bxxxxxxxx » Exemple : ANSEL = 0b00000101; // les broches RA0/C12IN0- et RA2/C2IN+ sont analogiques.

Fig. 4.13 : Ports et registres de commande correspondants

Page 23: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

23 Dr. M. DJARALLAH

4.3.3.2- Entrées Analogiques (convertisseur A/D CAN) Le PICF16F877 possède 14 canaux d’entrées analogiques-numériques avec une résolution de 10-bits (210 = 1024 = 3ff). La Fig. 19 montre la caractéristique de ces convertisseurs. On trouve les broches de ces 14 canaux communs avec les ports A, B et E : 5 avec le port A, 7 avec le port b et 2 avec le port E. Le fonctionnement de ce convertisseur est dans les bits des 4 registres de commande : ADRESH contient l’octet fort du résultat de la conversion, ADRESL contient l’octet faible du résultat de la conversion, ADCON0 registre de commande 0 et ADCON1 registre de commande 1. Le résultat de la conversion est une valeur numérique de 10-bits dont l’octet fort est stocké dans ADRESH et l’octet faible est stocké dans ADRESL, comme le montre la Fig. 20. Si la ADFM = 1, le stockage est justifié à droit et si ADFM = 0, il est justifié à gauche. ADFM est le 7eme bit du registre de commande ADCON1 (Fig. 21). A noter que le MikroC possède la fonction, ADC_Read(2), qui permet de lire le contenu des registres ADRESL et ADRESLH.

Exemple : /*Lecture de la valeur analogique d’après le canal 2 (AN2)et le résultat est affiché surr les PORTS B et C comme un nombre de 10-bits.*/ #include <built_in.h> unsigned int adc_rd; void main() {ANSEL = 0x04; // Configure AN2comme un broche analogique

ANSELH = 0; // Configure le reste des broches AN comme des E/S numériques TRISA = 0xFF; // Les broches du PORT A sont configures comme des sortiest TRISC = 0x3F; // Broches RC7 et RC6 sont configures comme des sorties TRISB = 0; // PORT B est configure comme une Sortie as an output

do { temp_res = ADC_Read(2); // lecture des 10-bits de la conversion A/D par la fonction ADC_Read(2) PORTB = temp_res; // Envoi de l’octet faible vers le PORT B PORTC = temp_res >> 2; // Envoi de 2-bits les plus signifiants vers RC7, RC6

} while(1); // rester dans la boucle une boucle infinie }

Page 24: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

24 Dr. M. DJARALLAH

4.3.4- Programmation en langages C 4.3.4.1- Programmation en C Un peu d’histoire Avant tout, quelles relations existent en les différents langages, y inclus ceux qu’on utilise couramment ? La figure suivante nous montre les différences. Aussi, la figure 4.16, nous résume les différents langages de programmations évolués dans un arbre généalogique, dès le premier compilateur intégré aux ordinateurs numériques.

Remarque : Ces langages sont de type procédural ou impératif. On trouve d’autres catégories les langages fonctionnels (ex. : LISP.), les langages logiques (ex. : PROLOG) et les langages objets (ex. : SMALLTALK et SIMULA) ) et les langages de spécification (ex. : LPG). Initiation au langage C Comme a été montré dans l’arbre généalogique, le langage C a été créé en 1973 par Denis Ritchie avec un objectif relativement limité : écrire un système d’exploitation (UNIX). Mais ses qualités opérationnelles l’ont très vite fait adopté par une large communauté de programmeurs. Par la suite, un langage hybride, nommé C++, créer du C et du SIMULA pour la programmation orientée objet. Donc, la programmation en C++ est destinée aux techniques avancées. De plus, la

Fig. 4.15: classification sur un axe d’abstraction : de la machine à l’homme

Scientifique-IBM]

Fig. 4.16 : Arbre généalogique des différents langages de programmations évolués

Page 25: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

25 Dr. M. DJARALLAH

programmation des systèmes microprogrammés ne nécessite pas ces techniques du tout. D’où, cette initiation est limitée aux instructions de C seulement. Structure d’un programme en C La structure là-dessous est générale, valable pour tout type de programmation, y’inclus les problèmes des systèmes microprogrammés. #include <****.h> // <stdio.h> ----- ----- #include <****.h> //" 16F877A.h " #use delay (clock = 1000000) // Horloge MCU = 1 MHz ------ ------ void Initialize_AD(void) / *Cette fonction initialise A/D pour recevoir de AN0 du microcontrôleur*/ {

ADCON1 = 0x8E; /* Configure AN0 for +5V reference */ ADCON0 = 0x41; /* Select A/D converter clock */

} ------ ------- void interrupt_ISR(void) /* Fonction du Service d’Interruption (routine de service d’interruption). */ { ----------- -----------

if(time_now == 10) {

--------- ---------

else -------- --------

} T0IF = 0; /* Re-enable timer interrupts */ } int main(void) { ----- ----- ----- ----- }

Déclaration des variables, ex. int i ; float x ; float racx ;

Actions voulues, ex. appelé des fonctions : 1- Initialize_AD() 2- ------------------ 3- ------------------ 4- interrupt_ISR() 5- ------------------

Calculs plus autres------

Directives au compilateur pour inclure des programmes externes

Inclure des programmes externes pour le PIC16F877

Fonctions

Programm

e principal

Page 26: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

26 Dr. M. DJARALLAH

4.3.4.2- Compilateur MikroC pour MC (PIC)

C’est un compilateur "MikroC PRO " mono-poste pour microcontrôleurs PIC. Il bénéficie d'une

prise en main très intuitive. Il possède des nombreux outils intégrés :

1- Mode simulateur ;

2- Terminal de communication Ethernet ;

3- Terminal de communication USB ;

4- Gestionnaire pour afficheurs 7 segments ;

5- Analyseur statistique ;

6- Correcteur d'erreur ;

7- Explorateur de code, mode Débug ICD, etc...

Associé à cela, il peut gérer la plupart des périphériques rencontrés dans l'industrie :

1-Bus I2C™,

2-1Wire™,

3- SPI™,

4-RS485,

5- Bus CAN™,

6- USB,

7- gestion de cartes compact Flash,

8- SD™/MMC™,

9- génération de signaux PWM,

10- afficheurs LCD alphanumériques et graphiques,

11- 7 à Leds segments, etc...)

a) Explorateur de code

Comme on vient de voir le suivi des variables est très

utile pour éviter les bogues de syntaxe, ce compilateur

dispose d’un explorateur de code (View, code explorer

ou fenêtre à gauche en bas du ‘project setting’) (Fig.

4.17)

C’est une fonction intégrée au compilateur nous

permettra de surveiller et de retrouver rapidement nos

variables et fonctions à l'intérieur de notre programme.

Pour ce faire, il vous suffira simplement de cliquer sur un

élément pour que l'explorateur nous positionne directement

Page 27: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

27 Dr. M. DJARALLAH

dessus (idéal lorsque vous travaillez sur de "gros" projets).

L’explorateur nous permet également de nous donner la liste complète des instructions ou

des touches de raccourci permettant d'activer les différentes fonctions du programme.

b) Outils intégrés

Le compilateur "MikroC PRO" pour PIC intègre différents petits outils très pratiques qui

nous simplifieront la programmation lors du développement.

1- Mini terminal USART

Le "MikroC PRO" intègre un petit terminal de communication USART RS-232 (Universal

Synchronous Asynchronous

Receiver), qu’on trouve sous

l’option « Tools » pour lequel tu

peux configurer le débit, les

commandes RTS et DTR.... Fig.

4.18.

2- Mini gestionnaire 7

segments

Le "MikroC PRO" intègre

un petit utilitaire qui vous

permettra de sélectionner la

valeur décimale ou

hexadécimale à fournir pour piloter un afficheur 7 segments.

Remarque :

Tu peux avoir des informations sur le reste des outils intégrés dans ce compilateur en consultant

son manuel. Il est conseillé de voir :

a) Terminal de communication "MikroBootloader" ;

b) Terminal et générateur de descripteur USB ;

c) Terminal de communication pour carte MMC ;

d) Terminal de communication Ethernet (UDP)

Page 28: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

28 Dr. M. DJARALLAH

Spécificités de mikroC

Ce langage possède, en plus des dissemblances, les règles qu’on trouve dans la norme

ANSI, que la majorité des langages C dispose. Donc, les règles déjà prises restent valables pour

ce compilateur. Voici quelques spécificités de ce langage :

1- Le mikroC possède des mots clés additionnels qui n’appartiennent pas aux normes de C standard (ANSI) Extensions :

- code ; - data; - rx; - at; - sbit; - bit; - sfr

2- Variables Globales et constants prédéfinies Pour faciliter la programmation en mikroC un nombre de variables globales et de constantes

sont prédéfinies Tous les registres SFR et leurs bits (constantes associées) sont déclarés implicitement comme des variables globaux. 3- Ce langage permet l’accès aux bits des registres ou des variables avec deux méthodes :

a) soit par le mot clé bit (bien sûre, tu dois être familier avec l’architecture du MC utilisée)

Exemples :

// Clear Global Interrupt Bit (GIE) GIE_bit = 0;

……..

…….

C1ON_bit = 0; // Disable comparators

C2ON_bit = 0;

GIE est 7eme bit de INTRCON

C1ON et C2ON des bits de CM1CON0 CM2CON0

b) Ou bien par le sélecteur (.) suivi par les identificateurs B0, B1, …., B7 ou F0, …, F7, où B ou

F sont les bits d’un variable/registre exemples :

// Mise à zero le bit 0 du registre INTCON INTCON.B0 = 0;

Page 29: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

29 Dr. M. DJARALLAH

// Mise à 1 le bit 5 du registre ADCON0 ADCON0.F5 = 1;

Remarque:

Ce genre de sélection ne nécessite pas de déclaration dans un programme en microC, car c’est une spécificité intrinsèque, qui peut être utilisé n’import où dans le code du programme. De plus, le majuscule ou le minuscule est acceptable. (not case sensitive)

Types élémentaires

Si on ajoutant les qualificateurs

Toute déclaration de variable doit éviter l’utilisation des mots clés suivants :

Page 30: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

30 Dr. M. DJARALLAH

Fonctions de bibliothèque de mikroC

Rappel :

Un fonction protype Une fonction on C doit être déclarer au début du programme principal

(PP)[ avant le mot clé main( ) ] et le code de cette fonction vient après le PP voir le TP2 : #include <stdio.h> /***** le programme principal (fonction main) *****/ main() { float fexple (float, int, int) ; /* déclaration de fonction fexple */ float x = 1.5 ; float y, z ; int n = 3, p = 5, q = 10 ; /* appel de fexple avec les arguments x, n et p */ y = fexple (x, n, p) ; printf ("valeur de y : %e\n", y) ; /* appel de fexple avec les arguments x+0.5, q et n-1 */ z = fexple (x+0.5, q, n-1) ; printf ("valeur de z : %e\n", z) ; } /*************** la fonction fexple ****************/

Page 31: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

31 Dr. M. DJARALLAH

float fexple (float x, int b, int c) { float val ; /* déclaration d’une variable "locale" à fexple val = x * x + b * x + c ; return val ; }

Remarques :

1- Ce n’est pas obligatoire que la fonction possède des ‘paramètres arguments’ voir : le les

fonctions du, programme de la ‘Commande PI d’une charge Moteur-pompe’

2- Le nom de la fonction est arbitraire, mais il est conseillé de l’assigner en prenant en

considération la tâche de cette dernière : ex : interruption interrupt( ) ;

3- La fonction doit envoyer un résultat cela par : return exemple : return val

4- Le type de la fonction qui n’envoi pas de valeur se déclare par void et la déclaration par

défaut est integer (entier) exemple

void Initialize_AD(void) {

ADCON1 = 0x8E; /* Configure AN0 for +5V reference */ ADCON0 = 0x41; /* Select A/D converter clock */

}

Fonctions intrinsèques ou de bibliothèques

Les fonctions de bibliothèques accompagnées à un compilateur de C sont logées dans un fichier nommé « headrer ». Avant d’utiliser n’importe quelle fonction il faut associer le fichier « header » correspondant par #include exemple (Hi TECH C) :

#include <pic.h> #define DA_Write RC0

a) Fonctions ANSI

Généralement tous les compilateurs, y inclus le mikroC, sont fournis avec une bibliothèque qui

contient ces fonctions 24 fonctions :

Ces 24 fonctions peuvent être classées selon leurs tâches

Page 32: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

32 Dr. M. DJARALLAH

b) Fonctions spécifiques au mikroC Un ensemble de fonctions est fourni avec le compilateur mikroC, pour faciliter l’exploitation des matériels de la firme MikroElektronika. Cet ensemble de fonctions peut être subdivisé en deux groupes de fonctions: 1- Routines attachées au compilateur Ces routines ne nécessitent par d’être déclarées ou associées aux programmes par #include. L’appelle est « online » de ces routines ex : delay_ms( ) ou delay_us( ), .. voici la liste :

-) Delay_us -) Delay_ms -) Vdelay_ms -) Delay_Cyc -) Clock_Khz -) Clock_Mhz -) Get_Fosc_kHz

Exemples : void Delay_ms(const time_in_ms) ; delay_us(10); /* une pause de 10 microcondes*/ void Delay_ms(const time_in_ms); delay_ms(10); /* une pause de 10 millisecondes */ 2- Fonctions spécifiques a) spécifiques aux applications voir les tableaux en bas petit tableau Exemples 1: unsigned short Button(unsigned short *port, unsigned short pin, unsigned short time, unsigned short active_state); …….

do { if (Button(&PORTB, 0, 1, 1)) oldstate = 1; if (oldstate && Button(&PORTB, 0, 1, 0)) { PORTD = ~PORTD; oldstate = 0; } } while(1);

Exemples 2:

unsigned short current_duty, old_duty; // Define variables

Page 33: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

33 Dr. M. DJARALLAH

// current_duty and old_duty void initMain() { ANSEL = 0; // All I/O pins are configured as digital ANSELH = 0; PORTA = 255; // Port A initial state TRISA = 255; // All port A pins are configured as inputs PORTB = 0; // Initial state of port B TRISB = 0; // All port B pins are configured as outputs PORTC = 0; // Port C initial state TRISC = 0; // All port C pins are configured as outputs PWM1_Init(5000); // PWM module initialization (5KHz) } void main() { initMain(); current_duty = 16; // Initial value of variable current_duty old_duty = 0; // Reset variable old_duty PWM1_Start(); // Start PWM1 module while (1) { // Endless loop if (Button(&PORTA, 0,1,1)) // If the button connected to RA0 is pressed current_duty++ ; // increment variable current_duty if (Button(&PORTA, 1,1,1)) // If the pressed button is connected to RA1 current_duty-- ; // decrement value current_duty if (old_duty != current_duty) { // If current_duty and old_duty are not PWM1_Set_Duty(current_duty); // equal set PWM to a new value, old_duty = current_duty; // save the new value PORTB = old_duty; // and show it on port B }

Delay_ms(200); // 200mS delay } } b) spécifiques aux matériels voir les tableaux en bas la grande partie du grand tableau

Page 34: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

34 Dr. M. DJARALLAH

Exemple 1 :

Syntaxe unsigned ADC_Read(unsigned short channel);

unsigned tmp; // un mot de 16 bits ... tmp = ADC_Read(2); // Lecture du résultat de la conversion du canal 2 Exemple 2 :

unsigned int temp_res; void main() { ANSEL = 0x04; // Configure AN2 pin as analog TRISA = 0xFF; // PORTA is input ANSELH = 0; // Configure other AN pins as digital I/O TRISC = 0x3F; // Pins RC7, RC6 are outputs TRISB = 0; // PORTB is output do { temp_res = ADC_Read(2); // Get 10-bit results of AD conversion PORTB = temp_res; // Send lower 8 bits to PORTB PORTC = temp_res >> 2; // Send 2 most significant bits to RC7, RC6 } while(1); }

4.4- Entraînement d’un moteur pas à pas par un µ-contrôleur Deux connections, pour un moteur unipolaire l’une en utilisant le circuit d’entraînement ULN2003D et l’autre le circuit L290D sont données associées avec deux programme en Mikro C pour deux types de séquences d’entraînement.

Page 35: 4.1- Introduction Dans ce troisième chapitre nous allons

Chapitre 4: Architecture et fonctionnement d’un microcontrôleur

35 Dr. M. DJARALLAH

Programming Full step Sequence void main() {

ANSEL = 0; ANSELH = 0; PORTD = 0; TRISD = 0; while(1){ PORTD=0x09; Delay_ms(500); PORTD=0x0C; Delay_ms(500); PORTD=0x06; Delay_ms(500); PORTD=0x03; Delay_ms(500); }

}

Programming Half step Sequence void main() {

ANSEL = 0; ANSELH = 0; PORTD = 0;TRISD = 0; while(1)

{ PORTD=0x08; Delay_ms(500); PORTD=0x0C; Delay_ms(500); PORTD=0x04; Delay_ms(500); PORTD=0x06; Delay_ms(500); PORTD=0x02; Delay_ms(500); PORTD=0x03; Delay_ms(500); PORTD=0x01; Delay_ms(500); PORTD=0x09; Delay_ms(500);

} }