Cette page et ses descendantes sont encore en cours de construction…

Structure interne du PIC16F150x

Les microcontroleurs de type PIC16F150x, de la société Microchip, sont des unités de calculs embarquées sur 8 bits prévues pour des utilisations industrielles et cadencées à environ 10~MHz.

On peut noter, sur la figure précédente (tirée de la documentation technique du PIC16F1509), la présence des éléments de base d’un microcontroleur :

  • un CPU (ou Central Processing Unit), qui sera détaillé dans la section suivante
  • une zone de mémoire programme (ou Program Flash Memory) permettant de stocker la liste d’instructions à exécuter par le microcontroleur
  • une zone de mémoire données (ou RAM – Random Access Memory) permettant de stocker les variables temporaires de l’application
  • des ports d’entrées/sorties (notés PORTx) permettant au microcontroleur d’interagir rapidement avec son environnement (capteurs, périphériques, autres systèmes, être humain…)
  • un module de gestion du temps (ou Timing Generation), permettant de cadencer les calculs réalisés par l’unité de calcul
  • des modules spécifiques (TMRx, ADC, DAC, PWMx…) permettant de réaliser des tâches spécifiques de manière quasi-autonomes

L’ensemble des bus de données (i.e. les chemins électriques par lesquels transitent les données) ont une taille de 8 bits. Les différents espaces mémoires seront abordés dans un tutoriel ultérieur (voir le tutoriel Registres internes du PICF16F150x).

Unité de calcul et Instructions

CPU / Calculateur

Ces microcontroleurs sont basés sur des architecture de type MIPS (Microprocessor without Interlocked Pipeline Stages).

Dans le schéma précédent (tiré de la documentation technique du PIC16F1509), on retrouve les espaces mémoires annoncés précédemment (à savoir l’espace mémoire programme – Program Flash Memory – et l’espace mémoire données – RAM) ainsi que les éléments suivants, constituant le calculateur (ou CPU) :

  • une unité arithmétique et logique (ou ALU – Arithmetic and Logic Unit) permettant de réaliser un ensemble d’une trentaine d’opérations différentes de manière séquentielle
  • un compteur programme (noté Program Counter) contenant l’adresse de la prochaine instruction à exécuter par l’unité de calcul
  • un registre d’instruction (noté Instruction Reg) contenant l’instruction en cours d’exécution par l’unité de calcul
  • un module de décodage de l’instruction (noté Instruction Decode and Control) permettant de décoder l’instruction à réaliser et à positionner tous les chemins de données correctement
  • un registre de travail (noté W Reg) contenant le résultat de l’opération
  • un grand nombre de multiplexeurs permettant de définir les bons chemins de transfert des données

Jeu d’instructions

Une instruction est l’une des opérations élémentaires que peut réaliser le microcontroleur sur une (ou plusieurs) donnée(s).

Dans le cas des microcontroleurs PIC16F, qui sont de type RISC (Reduced Instruction Set Computer – i.e. avec un nombre très limité de calculs précablés), il existe une cinquantaine d’opérations différentes (incluant la gestion de la mémoire).

Une instruction est codée sous forme binaire dans la mémoire du microcontroleur. Pour les repérer plus facilement, elles possèdent toutes un mnémonique (leur nom). Dans le cas des PIC16F, elles sont codées sur 14 bits de la façon suivante (cas d’une opération de calcul ou de déplacement en mémoire nécessitant le stockage du résultat) :

On retrouve dans ce code :

  • un code pour l’instruction, noté OPCODE
  • une destination, noté d, pour savoir où stocker le résultat de l’opération
  • une adresse de destination, noté f, pour spécifier l’adresse de la case mémoire de données qui stockera le résultat

Une liste complète de l’ensemble des instructions est disponible dans le tableau 28-3 de la documentation technique. Ce langage s’appelle de l’assembleur.

Un paragraphe de description est également disponible pour chacune des instructions dans le chapitre 28-2 de la documentation technique. Ces descriptions ressemblent à ceci (exemple de l’instruction INCF – incrémentation d’une case mémoire de 1) :

N.B. Ces microcontroleurs n’intègrent qu’une simple unité de calculs arithmétiques et logiques (ALUArithmetic and Logic Unit). Les opérations de type multiplication ou division ne sont pas implémentées, elles sont donc réalisées à partir des opérations plus basiques et prennent du temps à être exécutées.

N.B. Le langage assembleur n’a pas besoin d’être connu pour développer sur ce type de microcontroleur. L’IDE de développement MPLABX peut être associée à des compilateurs en langage C, qui traduiront pour vous du code écrit en C vers du langage assembleur.

Exécution d’une instruction

L’ensemble du microcontroleur et de l’exécution du programme est cadencé par un système d’horloge, à une fréquence notée $$F_{OSC}$$. On parle d’un cycle d’horloge.

Pour pouvoir réaliser une des opérations, listées précédemment, l’unité de calcul a besoin d’un certain temps pour exécuter chacune de ces instructions. On notera $$F_{CYC}$$ la fréquence associée. On parle alors d’un cycle d’instruction.

Dans le cas des PIC16F, il faut 4 temps d’horloge pour exécuter une instruction. La fréquence d’exécution des instructions $$F_{CYC}$$ est alors 4 fois plus petite que la fréquence des oscillations de l’horloge $$F_{OSC}$$.

On a alors :
$$$F_{CYC} = \frac{F_{OSC}}{4}$$$

Dans la figure suivante, on retrouve les 4 étapes d’exécution d’une instruction, notées Q1 à Q4.

Microchip PIC16F / Structure interne PIC16F150x