14
Denis Rabasté IUFM Aix Marseille programmation des microcontrôleurs PIC 1/14 Présentation de la gamme « Mid-range » des microcontrôleurs PIC La société Microchip propose une large gamme de microcontrôleurs, appelés PIC ; ils peuvent être répartis en plusieurs familles différenciées par la largeur respective de leur bus : - Base-line avec des mots d’instruction de 12 bits (gamme 12FXX), données de 8 bits; - Mid-range, avec des mots d’instruction de 14 bits (gamme 16FXX comme le 16F84 et le 16F877), données de 8 bits ; - End-range avec des mots d’instructions de 16 bits (gamme 18FXXX), données de 8 bits ; - Les PIC 16 bits de données (gamme PIC24 et dsPIC) ; - Les PIC 32 bits de données (gamme PIC32). Le succès de cette famille microcontrôleurs est en partie dû à la diversité des composants proposés, allant d’un petit microcontrôleur dans un boîtier DIL 6 broches à un composant dédié au traitement du signal (dsPIC) avec 40 broches. A titre d’exemple, voici deux composants classiques de la gamme Mid-range : PIC16F84 ; - 1 Ko de ROM, - 68 octets de RAM, - 64 octets de ROM, - 13 entrées sorties, - 10 MHz, - un timer, - 4 sources d’interruption PIC16F877A : - 14,3 Ko de ROM, - 368 octets de RAM, - 256 octets d’EEPROM, - 33 entrées sorties, un CAN, - 20 MHz - 3 timers, - 15 sources d’interruptions - une USART, - un MSSP, - 2 comparateurs, - 2 modules comparateur et PWM

Présentation de la gamme « Mid-range » des …denis.rabaste.free.fr/ressources/microC/1bis_presentation... · 2011-09-20 · PIC16F84 ; - 1 Ko de ROM, - 68 octets de RAM, ... et

Embed Size (px)

Citation preview

Denis Rabasté IUFM Aix Marseille

programmation des microcontrôleurs PIC 1/14

Présentation de la gamme « Mid-range » des microcontrôleurs PIC

La société Microchip propose une large gamme de microcontrôleurs, appelés PIC ; ils peuvent être répartis en plusieurs familles différenciées par la largeur respective de leur bus :

- Base-line avec des mots d’instruction de 12 bits (gamme 12FXX), données de 8 bits; - Mid-range, avec des mots d’instruction de 14 bits (gamme 16FXX comme le 16F84 et le

16F877), données de 8 bits ; - End-range avec des mots d’instructions de 16 bits (gamme 18FXXX), données de 8 bits ; - Les PIC 16 bits de données (gamme PIC24 et dsPIC) ; - Les PIC 32 bits de données (gamme PIC32).

Le succès de cette famille microcontrôleurs est en partie dû à la diversité des composants proposés, allant d’un petit microcontrôleur dans un boîtier DIL 6 broches à un composant dédié au traitement du signal (dsPIC) avec 40 broches. A titre d’exemple, voici deux composants classiques de la gamme Mid-range : PIC16F84 ;

- 1 Ko de ROM, - 68 octets de RAM, - 64 octets de ROM, - 13 entrées sorties, - 10 MHz, - un timer, - 4 sources d’interruption

PIC16F877A : - 14,3 Ko de ROM, - 368 octets de RAM, - 256 octets d’EEPROM, - 33 entrées sorties, un CAN, - 20 MHz - 3 timers, - 15 sources d’interruptions - une USART, - un MSSP, - 2 comparateurs, - 2 modules comparateur et PWM

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 2/14

On trouvera d’autre part une littérature abondante et de nombreux exemples d’applications sur le site du constructeur : http://www.microchip.com/ Malgré leur diversité, ils présentent de nombreuses caractéristiques communes, qui rendent assez aisé le passage d’un composant à l’autre. Nous nous intéresserons ici plus particulièrement à la gamme « Mid-range ».

1 Architecture de base

Ces microcontrôleurs sont construits autour d’une architecture de type « Harvard » où bus de données (pour la « mémoire vive » ou « mémoire de données ») et bus d’instructions (pour la « mémoire morte » ou « mémoire programme ») sont séparés.

Cette solution permet d’avoir un bus d’avoir un nombre de bit plus important sur le bus d’instruction –14 pour la gamme « mid-range »- que sur le bus de données –8 pour la gamme « mid-range ».

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 3/14

2 Structure en Pipe Line et séquencement

Mis à part les sauts, toutes les instructions du programme peuvent alors être codées sur un seul mot -instruction proprement dite et opérande- ce qui rend l’accès aux instructions possible en un cycle machine. La structure en Pipe Line permet alors d’exécuter une instruction sur un cycle machine –soit 4 coups d’horloge-.

3 Processeur RISC et structure orthogonale

Ces processeurs disposent d’un jeu d’instruction réduit (RISC : Reduced Instructions Set Computer) : 35 pour les gammes « Base line » et « Mid-range », 58 ou 77 en « High end ». Toutes les instructions s’exécutent dans tous les registres et modes d’adressage, comme on peut le voir sur la figure suivante, où les instructions sortant de l’unité arithmétique et logique (ALU) sont orientées vers le registre de travail W, ou vers la zone « RAM et Registre à fonction spéciales –SFR-).

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 4/14

La programmation est alors facilitée, on parle de structure orthogonale.

4 Organisation générale

Sur la figure suivante représentant l’organisation générale du contrôleur (ici un PIC16F877A), on peut constater la séparation des deux bus, instructions à gauche, données, registres et périphériques à droite.

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 5/14

5 La mémoire programme

La mémoire programme est constituée de 8 K mots (dans le cas d’un 16F877A) de 14 bits en EEPROM flash (si lettre F dans la référence). On peut lire en effet sur la figure suivante que le plan mémoire va de 0000h à 1FFFh. Le constructeur donne généralement la taille de la mémoire en K octets, ce qui donne donc 14 K octets si on considère qu’un kilo octets fait 1000 octets et 14,3 K octets si on considère qu’un kilo octets fait 1024 octets. On notera que :

- la remise à 0 du µC remet le programme à l’adresse 0000h ; - le vecteur d’interruption à l’adresse 0004h ; - la pile, hors du plan mémoire accessible au programmateur ; - l’adressage de la mémoire par le compteur programme, constitué de 13 bits, - le découpage du plan mémoire en pages (ici 4 dans le cas d’un 16F877A) de 2 Ko ;

6 La mémoire données et registres à fonctions spéci ales (SFR)

Dans le cas d’un 16F877A, cette mémoire comprend les différents registres (SFR), ainsi que 368 octets de 8 bits (soit 368 bytes) de RAM statique (SRAM). On notera :

- le découpage de la mémoire en banques (attention à ne pas confondre avec les pages de la mémoire programme) ; dans le cas du 16F877A, on trouve 4 banques de 128 emplacements de 8 bits, soit au total 512 octets ;

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 6/14

- l’accès possible à certains registres, comme PCL et STATUS dans toutes les banques ; - la non nécessité d’un rafraîchissement de la mémoire SRAM (contrairement à la RAM

dynamique ou DRAM) qui n’impose donc aucune fréquence minimale à l’horloge.

Les PIC disposent également de mémoire données EEPROM, non localisée dans le plan mémoire précédent, mais adressable indirectement via certains registres.

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 7/14

7 Le jeu d’instructions

Comme nous l’avons vu, il s’agit d’un jeu réduit à 35 instructions codées sur 14 bits (la mémoire programme est constitué de mots de 14 bits). Elles sont exécutées en un cycle machine, soit quatre périodes du quartz, excepté les instructions de saut qui durent deux cycles machine. On distingue 4 types d’instructions :

7.1.1 Instructions générales

Manipulent les données : - 6 bits pour l’instruction ; - 8 bits d’adressage littéral.

ex ADDLW k (W) + k ----> (W) additionne le contenu du registre W avec k et place le résultat dans W

7.1.2 Instructions orientées bit

Manipule 1 bit dans un registre (ou un emplacement RAM) : - 4 bits pour l’instruction ; - 3 bit de numéro de bit au sein du registre (8 bits possibles); - 7 bits pour l’opérande (adresse du registre ou de l’emplacement RAM) ;

ex BCF f, b ; met à 0 le bit b du registre f Si on prend l’exemple du 16F877A qui comprend 4 banques de128 octets de RAM (soit 512 octets), il manque donc 2 bits pour adresser l’ensemble du plan mémoire RAM ; les 7 bits de l’opérande seront donc complétés par les 2 bits, RP0 et RP1 du registre STATUS . Ceux-ci seront donc positionnés correctement avant de pouvoir accéder à la banque où est situé le registre adressé.

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 8/14

7.1.3 Instruction orientées octets

Effectue des opérations au sein des registres : - 6 bits pour l’instruction ; - 1 bit de destination ; - 7 bits pour l’opérande ;

ex ADDLWF F,d (W) + (F)----> (W) ou (F) suivant la valeur de d (1 ou 0) Additionne le contenu de W et le contenu du registre F et place le résultat dans W (d=0 ou d=W) ou dans le registre F (d=1 ou d=F) ; dans le premier cas, le contenu de F n’a pas changé. La valeur de « d » est 1 par défaut ; si elle n’est pas précisée, le résultat de l’opération sera donc envoyé dans le registre F Si on prend l’exemple du 16F877A qui comprend 4 banques de128 octets de RAM (soit 512 octets), il manque de nouveau 2 bits pour adresser l’ensemble du plan mémoire RAM ; les 7 bits de l’opérande seront une fois encore complétés par les 2 bits, RP0 et RP1 du registre STATUS .

7.1.4 Sauts et appels de sous routines

7.1.4.1 Les sauts Un saut dans le programme modifie la valeur du « compteur programme » PC pour sauter à l’adresse correspondant à l’étiquette (l’adresse pointée par l’instruction « GOTO »). 7.1.4.2 Les appels de sous routines Un appel de sous programme permet d’exécuter des lignes de programmes qui risquent d’être nécessaire plusieurs fois dans le programme principal (une temporisation par exemple), sans avoir à surcharger la mémoire programme plusieurs fois avec des lignes identiques. Le sous programme est appelé par un « CALL », la sortie du sous programme se faisant par un « RETURN » ou « RETLW k » (cette dernière instruction retourne l’octet k dans le registre W). De nombreuses erreurs sont dues à une opération effectuée dans la mauvaise banque, il est donc conseillé de faire en sorte de se placer systématiquement dans une banque (0 par exemple) lors de l’appel d’un sous programme, et de se replacer dans cette même banque juste avant le retour au programme principal. Attention de ne pas confondre « sous programme » et « macro », cette dernière allégeant l’écriture du programme mais pas la place occupée en mémoire programme. La macro diminue le temps d’exécution en évitant l’appel et le retour du sous programme (instruction en deux cycles). 7.1.4.3 instructions Les instructions de sauts et appels de sous programmes sont constituées de :

- 3 bits pour l’instruction ; - 11 bits de destination ;

ex GOTO etiquette effectue un saut à la ligne repérée « etiquette » ‘ Les 11 bits de destination doivent pouvoir pointer n’importe quel emplacement dans la mémoire programme qui comprend dans le cas d’un 16F877A quatre pages de 2 Ko, ce qui fait 8 Ko ; il manque donc 2 bits pour adresser l’ensemble de la mémoire programme (le compteur programme est un compteur 13 bits). Les 11 bits de destination seront complétés par les bits 4 et 3 du registre PCLATH qu’il faudra donc positionner avant le saut (nous allons voir que le compteur programme est composé de l’association d’un registre 8 bits, PCL, et 5 bits du registre PCLATH).

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 9/14

8 L’adressage

8.1.1 Adressage littéral

La valeur littérale est directement placée dans le registre W qui est le seul concerné par ce type d’adressage : MVLW 0x55 55---->w (il faut lire « la valeur 55, exprimée en hexadécimal, est placée dans W »)

8.1.2 Adressage direct

Le contenu d’un registre est modifié et/ou placé dans un autre MOVF 0x10,w (0x10)---->W (il faut lire « le contenu du registre d’adresse hexadécimal 10 est placé dans le registre W ») Remarque : l’instruction s’écrit « MOVF, f,d », « f » représentant l’adresse du registre source et « d » la direction du résultat ; si d=0, (on peut aussi écrire w), le résultat est mis dans W, si d=1 (on peut aussi écrire f), le résultat est placé dans le registre de départ. ce type d’instructions, sur 14 bits, comprend :

- 6 bits pour l’instruction ; - 1 bit de destination ; - 7 bits pour l’opérande ;

Comme nous l’avons vu, il manque donc 2 bits pour adresser l’ensemble du plan mémoire RAM dans le cas d’un PIC16F877 ; les 7 bits de l’opérande seront donc complétés par les 2 bits, RP0 et RP1 du registre STATUS . Le choix d’une banque se fait par « BCF » ou « BSF » STATUS RPx (mise à 0 ou à 1 du bit RPx du registre STATUS). Comparaison des deux modes d’adressage : comparer « MOVLW, k » et « MOVWF, f », comparer « ADDLW » et « ADDWF, f d », comparer « ANDLW, k » et « ANDWF, f d ».

8.1.3 Adressage indirect

L’adresse souhaitée est placée dans le registre FSR (registre 8 bits dans les 4 banques du PIC16F877A) et lue dans le registre IND (registre 8 bits dans les 4 banques du PIC16F877A). Exemples : MOVWF FSR ; le contenu de W (qui contient l’adresse à pointer) est mis dans FSR MOVF INDF, W , le contenu de l’adresse pointée par IND (donc mise dans FSR) est mis dans W. Dans le cas d’un PIC16F877A, il manque donc un bit au registre FSR pour adresser les 4 banques de 128 emplacements ; c’est le bit IRP du registre STATUS qui donnera le poids fort de l’adresse.

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 10/14

9 Les registres importants

9.1.1 Registre W

C’est le registre de travail. Il ne se trouve pas dans le plan mémoire SFR, il est directement accessible par adressage littéral.

9.1.2 Registre PC et PCLATH

Le compteur programme PC est constitué de 13 bits sur les PIC de la gamme « Mid range », ce qui est suffisant pour adresser les 4 pages de 2 Ko de mémoire programme (soit 8 K mots de 14 bits en tout) dans le cas d’un PIC16F877 , et d’une manière générale tous les composants de cette gamme. Les 8 bits de poids faible sont accessibles dans les 4 banques par le registre PCL, et les 5 bits de poids fort correspondent aux 5 bits de poids faible de PCLATCH, un registre accessible dans les 4 banques. La figure suivante montre comment s’effectue l’écriture dans PC lors d’une instruction :

- où le registre PCL est la destination ( exemple ADDWF PCL ,1), sur la figure du haut ; - dans le cas d’un saut par les instructions CALL ou GOTO sur la figure du bas ; l’opérande est

alors comme nous l’avons vu sur 11 bits, qui seront complétés par les bits 3 et 4 de PCLATH.

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 11/14

Attention : PC pointe toujours l’instruction suivant celle qui est en train d’être exécuté.

9.1.3 Registre STATUS

C’est le registre d’état (résultat nul d’une opération, dépassement….) ; il inclut aussi RP0 et RP1 pour sélectionner la banque RAM, ainsi que IRP utilisé dans l’adressage indirect.

9.1.4 Registres PORTX et TRISX

Suivant le composant choisi, un nombre plus ou moins important de ports d’entrées sorties est disponible, sous la dénomination PORTA, PORTB etc…Chacun de ces ports est associé à un registre TRISA, TRISB etc… qui permet de configurer individuellement en entrée ou sortie chaque bits du port.

9.1.5 Registre de configuration

Registre de configurations diverses comme : - le choix de la structure de l’oscillateur (RC, quartz etc…) ; - la mise en fonction du chien de garde ; - autorisation du mode débogage etc...

Ce registre n’est pas dans le plan mémoire SFR. On y écrit au moment de la programmation du composant (il définit une partie de sa structure matérielle) et n’est plus accessible ensuite. De nombreuses erreurs de fonctionnement sont dues à une mauvaise programmation de ce registre (mauvais choix pour l’oscillateur par exemple) ; on consultera donc attentivement la documentation associée au composant utilisé (chapitre « Spécial Features of the CPU »). Pour une meilleure lisibilité, il est fortement conseillé de programmer ce registre à partir du code source (par la directive « __CONFIG ») et non par les menus de MPLAB.

9.1.6 La pile

Elle comprend 8 niveaux et n’est pas gérée par l’utilisateur qui doit donc vérifier que son programme ne comporte pas plus de 8 imbrications, interruptions diverses comprises.

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 12/14

10 Les périphériques

Suivant les références un nombre plus ou moins importants de périphériques est intégré dans le circuit :

- port d’entrées sorties, en nombre plus ou moins grand, éventuellement en drain ouvert avec possibilité de mettre en service une résistance de tirage ;

- timer ; - liaisons séries diverses : liaison synchrone SPI ou I2C, asynchrone, bus CAN, USB… ; - CAN, CNA ; - comparateur analogique ; - tension de référence ; - Modulateur de largeur d’impulsions.

11 Choix d’un PIC

Le choix d’un PIC se fait en fonction de la capacité mémoire disponible, des périphériques nécessaires à l’application : nombre de timer, présence d’une liaison I2C, nombre de ports d’entrées sorties etc… Le type de boîtier et le nombre de broches peuvent également intervenir Référence des composants :

PIC16 F 877 – 20 Famille 10, 12, 16, 17 ou 18

Fréquence maximale (MHz)

Type de mémoire et alimentation F : Flash 4,5 à 6 V C : EEPROM et EPROM 4,5 à 6 V CR : ROM 4,5 à 6 V LF : Flash 2 à 6 V LC : EEPROM ou EPROM 2 à 6 V LCR : ROM 2 à 6 V

Référence

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 13/14

12 Mise au point et programmation

L’algorigramme ci-contre représente les différentes phases de la mise au point d’un programme. Seuls les composants dont la référence contient la lettre F ont leur mémoire programme en flash et sont reprogrammables sur site via un programmateur connecté à la carte imprimée où se trouve le PIC et l’application associée. Le programmateur peut être un produit Microchip (l’ICD2 par exemple) ou un programmateur « maison » (on trouve de nombreux schéma sur internet). Quelle que soit l’option choisie, les entrées / sorties RB6 et RB7 du port B seront utilisées au moment de la programmation. Il est éventuellement possible de les dédier de nouveau à l’application en prévoyant sur la carte un circuit d’isolation pour ces deux broches, entre l’application et le programmateur.

DEBUT

ALGORIGRAMME

CODE SOURCE

COMPILATIONSIMULATION

CORRECT ?

MODE "DEBUG"

CORRECT ?

PROGRAMMATION

CORRECT ?

FIN

ou EMULATEUR

non

non

non

oui

oui

oui

13 Documentations

Remarque : le «datasheet » d’un composant est souvent insuffisant pour décrire complètement le composant, il faut également consulter les manuels de référence liés à la famille du composant. On trouve cette documentation sur le site de Microchip en laçant une recherche « datasheet » autour de la référence du composant choisi.

programmation des microcontrôleurs PIC

Denis Rabasté IUFM Aix-Marseille

programmation des microcontrôleurs PIC 14/14

Annexe 1 : le jeu d’instructions