Igsit - Automatisme - Microcontrôleurs
Igsit - Automatisme - Microcontrôleurs
Igsit - Automatisme - Microcontrôleurs
AUTOMATISME :
MICROCONTRÔLEURS
1A IGSIT
NIKIEMA Daniel
MICROCONTRÔLEURS : MISE EN ŒUVRE ET PROGRAMMATION
I. INTRODUCTION
Un microcontrôleur est une unité de traitement de l’information de type
microprocesseur à laquelle on a ajouté des périphériques internes permettant de
faciliter l'interfaçage avec le monde extérieur sans nécessiter l’ajout de composants
externes complexes.
Ils sont en général utilisés pour contrôler de simples machines et constituent des
systèmes embarqués (véhicules, appareils électroménagers, cartes à puce, lecteurs
de carte à puce, cartes d'automatisme industriel, ...).
Exemples de microcontrôleurs :
8051, 80C186XX, … d’Intel ;
68HC11, 68HC12, 68HC16, … de Motorola ;
MSP430F1611, MSP430G2553, … de Texas Instruments (TI) ;
PIC16F84, PIC16F877, PIC18xxxx, PIC24xxxx, ... de Microchip ;
ATmega328P, ATmega2560, … de Atmel (racheté par Microchip) utilisés par
Arduino ;
Etc.
Par rapport à un projet, le choix d’un microcontrôleur est fait en fonction des
ressources (Entrées/Sorties, ports et protocoles de communication, modules
internes, …) nécessaires au développement de l’application. Il est aussi fonction de
la marque qu’on maitrise. En général, chaque constructeur propose un ensemble de
familles de microcontrôleurs en fonction des différentes applications.
1. Le microcontrôleur PIC16F84
1.1. Présentation
a. Brochage et mise en œuvre
Brochage du PIC16F84
Le reste des broches (RA0 à RA4 pour le PORTA et RB0 à RB7 pour le PORTB) sont 13
entrées/sorties à la disposition de l’utilisateur. Elles sont configurables et
exploitables individuellement ou ensemble par port.
Le bouton poussoir BP raccordé sur RB0 (en entrée) pourra être utilisé pour
commander la LED connectée sur RA0 (en sortie). La résistance R2 de 10kΩ est
appelée « résistance de rappel » qui sert à rappeler au 5V l’entrée RB0 pour lui
imposer un état logique 1, on dit que RB0 est en « pull up ». Un appui sur le BP
mettra alors RB0 à l’état logique 0. Ce changement sera donc détecté par le
programme (code) pour agir sur l’état de RA0 afin d’allumer ou éteindre la LED.
Remarque :
Si une entrée est rappelée à la masse, est dit qu’elle est en « pull down » ;
Les résistances de rappel peuvent être internes pour certaines broches ;
R1 est calculée de sorte à limiter le courant qui sort de RA0 à 20mA
maximum.
b. Architecture interne
c. Principales Caractéristiques
Ci-dessous, une représentation des bits RP0 et RP1 dans le registre STATUS.
Le port A désigné par PORTA est un port de 5 bits (RA0 à RA4). Chaque broche
(E/S pour Entée/Sortie ou I/O pour Input/Output) est bidirectionnelle et
compatible TTL. La configuration de la direction (entrée ou sortie) de chaque
broche du port est réalisée avec le registre TRISA :
La broche RA4 est multiplexée avec l'entrée horloge du timer TMR0. Elle peut donc
être utilisée soit comme E/S normale du port A, soit comme entrée horloge pour le
Timer TMR0. Le choix se fait à l'aide du bit T0CS (TMR0 Clock Source Select bit) du
registre OPTION_REG :
Registre OPTION_REG : RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0
Le port B désigné par PORTB est un port bidirectionnel de 8 bits (RB0 à RB7).
Toutes les broches sont compatibles TTL. La configuration de la direction se fait à
l'aide du registre TRISB :
En entrée, la broche RB0 appelée aussi INT peut déclencher l’interruption externe
INT. En entrée, une quelconque des broches RB4 à RB7 peut déclencher
l'interruption RBI. Nous reviendrons là-dessus dans le paragraphe réservé aux
interruptions.
Chaque broche du PORTB peut être connectée ou déconnectée à Vdd (5 V) via une
résistance de rappel interne de 10 kΩ à l'aide du bit 𝐑𝐁𝐏𝐔 (PORTB Pull-Up enable bit)
du registre OPTION_REG :
1.6. L'Horloge
L'horloge peut être soit interne, soit externe. L'horloge interne est constituée d'un
oscillateur à quartz ou d'un oscillateur RC.
On utilise le terme Fosc/4 pour désigner l'horloge système (où Fosc égale à la
fréquence à l'entrée de l'oscillateur).
Ils sont configurables (choix de l’horloge, diviseur programmable, …), disposent des
possibilités d’interruption (activation d’un flag au débordement) et servent à
certains modules comme le Capture/Compare pour des fonctions PWM (Pulse Wide
Modulation) par exemple pour certains PIC comme le PIC16F877.
Il est incrémenté en permanence soit par l’horloge interne Fosc/4 (mode timer)
soit par une horloge externe appliquée à la broche RA4 du port A (mode
compteur). Le choix de l'horloge se fait à l'aide du bit T0CS du registre
OPTION_REG :
Dans le cas de l'horloge externe, on peut choisir le front sur lequel le TIMER
s'incrémente à l'aide du bit T0SE (TMR0 Source Edge select bit) du registre
OPTION_REG :
Quel que soit l'horloge choisie, on peut la passer dans un diviseur de fréquence
programmable appelé prédiviseur (prescaler) dont le rapport est fixé par les bits
PS0, PS1 et PS2 (Prescaler rate Select bits) du registre OPTION_REG.
L'affectation ou non du prédiviseur se fait à l'aide du bit PSA (Prescaler
Assignment bit) du registre OPTION_REG :
Registre OPTION_REG : RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0
Le contenu du timer TMR0 est accessible par le registre qui porte le même nom.
Il peut être lu ou écrit à n'importe quel moment. Après une écriture,
l'incrémentation est inhibée pendant deux cycles instruction.
L'horloge du WDT est ajustée pour que Le Time-out arrive toutes les 18 ms. Il est
cependant possible d'augmenter cette durée en faisant passé le signal time-out dans
un prédiviseur programmable (partagé avec le timer TMR0). L'affectation se fait à
l'aide du bit PSA (Prescaler Assignment bit) du registre OPTION_REG :
PSA = 1 on utilise le prédiviseur ;
PSA = 0 on n'utilise pas de prédiviseur (il affecté à TMR0).
Le rapport du prédiviseur est fixé par les bits PS0, PS1 et PS2 du registre
OPTION_REG.
L'utilisation du WDT doit se faire avec précaution pour éviter les réinitialisations
inattendues répétées du programme. Pour éviter un WDT time-out lors de
l'exécution d'un programme, on a deux possibilités :
Inhiber le WDT d'une façon permanente en mettant à 0 le bit WDTE (Watch Dog
Timer Enable bit) dans l'EEPROM de configuration ;
Remettre le WDT à 0 périodiquement dans le programme à l'aide de l'instruction
CLRWDT pour éviter qu'il ne déborde.
La durée d’écriture d’un octet est de l’ordre de 10 ms. La fin de chaque écriture
réussie est annoncée par le drapeau EEIF (EEPROM write operation Interrupt Flag bit)
et la remise à zéro du bit WR (Write Control bit) du registre EECON1. Le drapeau
EEIF peut déclencher l'interruption « fin d’écriture dans l’EEPROM de données » (EEI)
si elle a été validée.
L'écriture dans L'EEPROM doit être autorisée : bit WREN (EEPROM Write Enable
bit) égal 1 ;
Placer l’adresse relative dans EEADR ;
Placer la donnée à écrire dans EEDATA ;
Placer 55h dans EECON2 ;
Placer AAh dans EECON2 ;
Démarrer l'écriture en positionnant le bit WR ;
Attendre la fin de l'écriture (EEIF = 1 ou WR = 0) ;
Recommencer au deuxième point si on a d'autres données à écrire.
Le drapeau WRERR (EEPROM Error Flag bit) est positionné si une erreur d'écriture
intervient.
Si on veut modifier le Program Counter pour réaliser un saut (goto calculé), il faut
d'abord placer la partie haute dans le registre PCLATH, ensuite on écrit la partie
basse dans PCL. Au moment de l'écriture dans PCL, le contenu de PCLATH est
recopié automatiquement dans PCH.
Le bit GIE (Global Interrupt Enable bit) du registre INTCON est mis à 0 pour
inhiber toutes les interruptions (afin d'éviter une autre interruption pendant
l'exécution de la procédure d'interruption).
Remarques :
Cette interruption est provoquée par un changement d'état sur la broche RB0 du
PORTB quand elle est configurée en entrée. Elle est gérée par les bits :
Cette interruption est provoquée par un changement d'état sur l'une des entrées
RB4 à RB7 du PORTB quand elle est configurée en entrée. Le front n'a pas
d'importance. Les bits associés sont RBIE (RB Port Change Interrupt Enable bit) pour
la validation et RBIF (RB Port Change Interrupt Flag bit) pour le drapeau.
Cette interruption est déclenchée à la fin d'une écriture réussie dans l'EEPROM. Les
bits associés sont EEIE (validation) et EEIF (drapeau).
Pour sortir du mode SLEEP, il faut provoquer un WAKE-UP, pour cela il y a trois
possibilités :
Interruption INT (sur RB0) ou RBI (sur RB4-RB7) ou EEI (fin d'écriture dans
l’EEPROM de données). Le bit de validation de l'interruption en question doit être
validé, par contre, le WAKE-UP a lieu quel que soit l'état du bit de validation
globale GIE. On a alors deux situations :
GIE = 0, Le PIC reprend l'exécution du programme à partir de l'instruction qui
suit l'instruction SLEEP, l'interruption n'est pas prise en compte ;
GIE = 1, Le PIC exécute l'instruction qui se trouve juste après l'instruction
SLEEP puis se branche à l'adresse 0004h pour exécuter la procédure
d'interruption. Dans le cas où l'instruction suivant SLEEP n'est pas nécessaire,
il faut utiliser l'instruction NOP.
13 12 11 10 9 8 7 6 5 4 3 2 1 0
CP CP CP CP CP CP CP CP CP CP PWRTE WDTE FOSC1 FOSC0
Bits de configuration du microcontrôleur
Remarque : 7 bits ne donnent pas accès à la mémoire RAM totale, donc voici
l’explication de la division de la RAM en deux Banks. Pour remplacer le bit
manquant, on utilise le bit RP0 du registre STATUS. Bien qu'on ne l'utilise pas sur le
16F84, le bit RP1 est aussi réservé pour le changement de Bank, le 16F876 par
exemple possède 4 banks.
Nous pouvons déjà en déduire que les sauts ne donnent accès qu’à 2K (211) de
mémoire programme. Pas de problème pour le 16F84 qui ne possède que 1k de
mémoire programme.
a. Le jeu d'instructions
addwf f,d : Additionne une variable à l’adresse f avec W. Résultat dans f si d=1 ou
dans W si d=0. Les bits de STATUS affectés sont C, DC et Z.
sublw k : Soustraction : k-W, résultat dans W. Les bits de STATUS affectés sont C,
DC et Z.
andwf f,d : ET logique entre une variable à l’adresse f et W. Résultat dans f si d=1
ou dans W si d=0. Le bit de STATUS affecté est Z.
iorwf f,d : OU logique entre une variable à l’adresse f et W. Résultat dans f si d=1
ou dans W si d=0.
xorwf f,d : OU Exclusif entre une variable à l’adresse f et W. Résultat dans f si d=1
ou dans W si d=0. Le bit de STATUS affecté est Z.
swapf f,d : Permute les deux quartets de f. Résultat dans f si d=1 ou dans W si d=0.
movf f,d : Met la variable contenu à l’adresse f dans W si d=0 ou dans f si d=1. Le
bit de STATUS affecté est Z.
clrwdt : Fait un reset du chien de garde (registre WDT mis à 0). Les bits de
STATUS affectés sont TO et PD.
btfsc f,b : Teste le bit b de f. Si ce bit vaut 0 alors l’instruction suivante est ignorée
(instruction NOP exécuté à la place).
btfss f,b : Teste le bit b de f. Si ce bit vaut 1 alors l’instruction suivante est ignorée
(instruction NOP exécuté à la place).
Adressage direct
Dans ce mode d’adressage, le code opération est suivi d’un nombre de 7 bits non
signé qui est l’adresse effective pour une page précise (Bank0 ou Bank1) de la
donnée, ou opérande, à manipuler. Dans ce mode d’adressage, les instructions se
terminent par une valeur précédée d’une virgule qui indique la destination du
résultat ou le numéro d’un bit à manipuler. Exemples :
Adressage indirect
L'adressage indirect se fait par l'intermédiaire des registres FSR et INDF. Le registre
INDF n'est pas un vrai registre mais représente la case mémoire pointée par le
registre d'index FSR. Pour lire ou écrire dans une case mémoire en utilisant
l'adressage indirect, on commence par placer l'adresse dans le registre FSR
(attention, les adresses sont sur 8 bits et non sur 7 bits comme pour le mode
d’adressage direct), ensuite on lit ou écrit dans le registre INDF. Exemple :
OUTIL
ECRITURE DU PROGAMME
EDITEUR DE TEXTE SOURCE
LISTING SOURCE
(SUITE DE MNEMONIQUES,
INSTRUCTION)
COMPILATEUR/ COMPILATION ET ASSEMBLAGE
ASSEMBLEUR DU PROGRAMME
LISTING OBJET
(SUITE DE CODES BINAIRES QUI
CONSTITUE LE FICHIER .hex)
TRANSFERT DU
PROGRAMMATEUR PROGRAMME DANS LA
MEMOIRE PROGRAMME DU
MICROCONTROLEUR
uC (CIRCUIT PROGRAMME)
MAQUETTE OU
SIMULATEUR OU ESSAI SUR L'APPLICATION
EMULATEUR
Les étapes de développement
3. Programmation
3.1. Algorithme/Organigramme ou ordinogramme
Un l'algorithme est un ensemble de règles opératoires rigoureuses permettant de
décrire un processus particulier. Exemples : algorithme de régulation de
température, de conditionnement de bouteilles, ... Un algorithme peut donc être
représenté de diverses manières.
Début ou Fin
Opération ou Traitement Sous-programme
de programme
Oui Sortie
Structure linéaire
Elle se caractérise par une suite d'actions à exécuter successivement dans
l'ordre de leur énoncé.
Algorithme Organigramme
Action n
Fin
Structures alternatives
Une structure alternative n'offre que deux issues possibles s'excluant
mutuellement.
Structure alternative réduite : si … alors … fin si
Algorithme Organigramme
Si condition
Alors action Non Oui
Fin si Condition
Action
Algorithme Organigramme
Si condition
Alors action 1 Non Oui
Sinon action 2 Condition
Fin si
Action 2 Action 1
Structures répétitives
Une structure répétitive ou itérative répète l'exécution d'un traitement.
Nombre de répétitions inconnu
Répéter … jusqu'à …
Algorithme Organigramme
Répéter
action Action
jusqu'à condition vraie
Non Oui
Condition
Algorithme Organigramme
Algorithme Organigramme
Non Oui
V=VFinale
action
V = V +/- pas
Remarque :
V signifie Valeur
a. Langage assembleur
On peut à l'aide de la directive LIST ou RADIX définir un format par défaut. Si par
exemple on place une des directives suivantes au début du programme, tous les
nombres sans indication de base seront interprétés en décimal :
LIST r = dec
RADIX dec
Les RADIX valables sont dec (pour décimal), hex (pour hexadécimal) et oct (pour
octal). Au lieu de déclarer le format par défaut dans le code source, une de ces
options peut être cochée dans MPLAB.
Les directives de l'assembleur sont des directives qu'on ajoute au programme et qui
seront interprétées par l'assembleur MPASM. Ce ne sont pas des instructions
destinées au PIC. Les directives les plus utilisées sont :
#INCLUDE "p16f84A.inc"
__CONFIG B'11111111110010'
ou
__CONFIG H'3FF2'
TRANSFERT macro
bcf STATUS,RP0
movwf PORTB
endm
La macro se compose d’un nom écrit en première colonne, suivi par la directive
«macro». Commence alors à la ligne suivant la portion de code qui constitue la
macro. La fin de la macro est définie par la directive «endm» (end of macro).
Pour notre exemple, chaque fois que la macro TRANSFERT sera rencontrée, elle
sera remplacée au moment de l’assemblage par les 2 lignes :
bcf STATUS,RP0
movwf PORTB
Notez que l’on peut utiliser des macros plus complexes, avec passage de
paramètres.
CBLOCK 0X0C
var : 1
cpt : 2
k :1
ENDC
Le chiffre après les ":" indique le nombre d'octets sur lesquels sera codée la
variable. Cela signifie que var est une variable sur un octet (adresse 0x0C), cpt
est une variable sur 2 octets (adresses 0x0D et 0x0E) et k est une variable sur
un octet (adresse 0x0F).
ORG 0x00
GOTO prog_principal
DE : pour déclarer des donnés qui seront stockée dans l'EEPROM de donnée au
moment de l'implantation du programme sur le PIC. Exemple :
ORG 0x2100
DE "Programmer un PIC, rien de plus simple", 'A', 'B', 4
DT "Programmer un PIC",23,0x47
Tout ce qui suit un point-virgule (quel que soit la colonne) est considéré comme
un commentaire non interprété par le compilateur.
cblock 0x0C
cpt : 1
var : 2
endc
org 0x0000
goto prog_principal
ORG 0x0004
Ecrire la routine d'interruption ici
RETFIE
; on connecte un interrupteur sur RB0 (entrée) et une LED sur RB1 (sortie)
; l’anode est reliée à RB0 à travers une résistance de 220 Ω et la cathode à VSS
; une résistance de pull up est placée entre RB0 et VDD et l’interrupteur relié VSS.
; Si on ouvre l’interrupteur, la LED doit s'allumer, si on ferme l’intérupteur, elle doit
; s'éteindre
c. Langage C embarqué
Il existe plusieurs compilateurs C pour les PIC. Nous nous servirons de « CCS C
Compileur » qui offre un grand nombre d’avantages à travers les multiples
fonctions et bibliothèques intégrées.
Les opérateurs logiques binaires sont souvent utilisés pour optimiser les codes. Le
tableau suivant résume ces opérateurs.
Opérateurs logiques du C
NOT (NON) permet de complémenter un bit ou tous les bits d’un mot binaire ;
OR (OU) permet de positionner un ou plusieurs bits à 1 ;
AND (ET) permet de positionner un ou plusieurs bits à 0 ;
Tous les autres opérateurs du C standard sont également utilisables : !, &&, ||, %, +, -
, /, ...
Une fonction d’interruption n’est jamais appelée et ne retourne rien. Les flags
d’interruption sont automatiquement remis à 0 par CCS C.
Exemple de programme C
/*Le programme principal fait clignoter une Led sur RA2 lorsqu’on appuie un BP
(Bouton poussoir) connecté sur RB0 et l’interruption TMR0 fait clignoter à 1 Hz une
led sur RA0. Led : anode sur RA2 à travers une résistance de 220 Ω et la cathode à
la masse. BP relié sur RB0 par une borne et l’autre à la masse, l’appui met la masse
sur RB0. Une résistance pull up est connectée entre RB0 et VDD*/
#use delay (clock=4000000) //déclaration fréquence quartz pour les delay : 4 Mhz
//assignations des registres et bits spéciaux si le fichier « P16F84_628.C » n’est pas inclus
#byte PORTA = 0x05
#byte PORTB = 0x06
#byte TRISA = 0x85
#byte TRISB = 0x86
#byte TMR0 = 0x01
#byte INTCON = 0x0B
#byte OPTION_REG = 0x81
//programme principal
void main (void)
{
//initialisation du uC
PORTA = 0; //effacer PORTA
PORTB = 0; //effacer PORTB
TRISA = 0b11111010; //configuration PORTA : RA2 et RA0 en sortie et le reste en entrée
TRISB = 0b11111111; //configuration PORTB : RB0 en entrée et le reste aussi en entrée
//configuration TMR0
T0CS = 0; //TMR0 synchronisé sur F_instructions
PSA = 0; //prédiviseur sur TMR0
PS0 = 0; //valeur du pré-diviseur égale 8
PS1 = 1;
PS2 = 0;
//activation Interruption TMR0
GIE = 1; //activation des interruptions
T0IE = 1; //activer Interruption TMR0
//boucle infinie
while(1)
{
if(RB0 == 0) //si BP appuyé c-à-d RB0 égal 0
{
RA2 = RA2^1; //inverser état led sur RA2
delay_ms(250); //temporisation de 250 ms (fonction fournie par CCS C)
}
}
}
Sur la petite fenêtre (fenêtre projet) qui apparait, écrivez Essai dans le champs
de texte Project Name, sélectionnez le dossier Essai_PIC dans le champs de
texte Project Directory à l'aide de du bouton Browse et cliquez sur le bouton
OK. Cliquez sur le bouton OK sur la nouvelle fenêtre qui apparaitra.
Sur la nouvelle petite fenêtre qui apparait, cliquez droit sur Source Files et
prenez l'option Add Files. Sur la fenêtre qui apparaitra, sélectionnez le fichier
essai.asm dans le dossier Essai_PIC et cliquez sur le bouton Ouvrir.
Sur la fenêtre projet, double cliquez sur essai.asm dans Source Files pour
l'ouvrir.
Nous pouvons maintenant exécuter notre programme en simulation pour voir s'il
réalise bien la tache demandée :
Icônes de simulation
Pour programmer en C :
4.1. Brochage
Ci-dessous, les boîtiers PDIP (28 broches pour les 873/876 et 40 broches pour les
874/877) donnent les représentations externes de ces microcontrôleurs.
Brochage PIC16F87x
L’espace « utilisateur » réservé aux variables commence aux adresses 20h, A0h,
120h et 1A0h, respectivement dans les bank0, bank1, Bank2, Bank3.
Un des avantages de l'architecture Von Neumann est que le code peut aussi bien
être exécuté à partir de la mémoire RAM que de la mémoire FLASH. Du code
machine peut donc être créé à la volé et copié en RAM pour être exécuté.
1. Le microcontrôleur MSP430G2553
1.1. Présentation
a. Brochage
Brochage du MSP430G2553
L’exécution du programme interne est interrompue lorsque la broche RST̅̅̅̅̅ est active
(état 0) et reprend à nouveau depuis le vecteur de reset (début) lorsque RST ̅̅̅̅̅
redevient inactive (état 1). Il est donc nécessaire de rappeler cette broche à VCC
(pull-up) avec une résistance d'environ 47 kΩ. Un condensateur d’environ 100 nF
doit être monté entre les broches d’alimentation (DVCC et DVSS) pour éviter les
reset dus aux parasites à travers l’alimentation. Souvent, il est aussi nécessaire
̅̅̅̅̅ et la masse.
d’utiliser un deuxième condensateur entre RST
b. Architecture interne
Architecture interne
c. Principales caractéristiques
Plan mémoire
Organisation de la mémoire
MCLK (Main CLocK) : utilisé comme horloge du CPU et commutable sur toutes
les sources ;
SMCLK (Sub‐Main CLocK) : utilisé pour les périphériques (disponible même en
mode sleep) ;
ACLK (Auxiliary CLocK) : utilisé pour certains périphériques en mode basse
consommation.
Après reset par mise sous tension, MCLK et SMCLK sont alimentés par le DCOCLK à
environ 1.1 MHz, et ACLK est alimenté par LFXT1CLK en mode LF (Low Frequency).
Les bits SCG0, SCG1, OSCOFF et CPUOFF du registre STATUS (RS) configurent les
modes d’opération the MSP430 et permettent d’activer ou de désactiver les
horloges.
Individuellement programmables ;
Individuellement et indépendamment configurables en entrée ou en sortie ;
Individuellement configurables en interruption ;
Indépendamment utilisables en registres (P1 et P2) de d’entrée ou de sortie ;
Individuellement configurables en pull up or pull down sur des résistances
internes ;
Entrées d’oscillateur sélectionnables.
Un ensemble de registres SFR (Special Fonction Registers) est associé à chaque port
E/S pour sa configuration et son exploitation.
PxDIR configure le mode entrée (0) ou sortie (1) de chaque bit du port.
PxOUT détermine les niveaux de sortie sur les broches en sortie (1 pour Vdd
et 0 pour Vss). Mais lorsque le bit est en mode entrée et que le bit
correspondant dans PxREN est actif, ce registre détermine si la résistance
d'entrée est en pull up (1) ou pull down (0).
PxIN permet de lire les niveaux des broches en entrée.
PxREN permet d'activer (1) / désactiver (0) les résistances de rappel sur les
broches.
PxIE permet d'activer (1) / désactiver (0) les interruptions sur changement
d'état des broches individuellement.
PxIES détermine si l'interruption doit se produire lors d'une transition
montante (0) ou descendante (1).
x désigne le numéro du port. Tous ces registres sont de la largeur du port, car
chaque bit de ces registres est en correspondance avec le bit du port à la même
position. Pour un port 8 bits, ils ont 8 bits.
Organisation du CPU
Il permet :
L’UAL a une largeur de 16 bits. Elle permet d’effectuer des calculs arithmétiques
(additions, soustraction, comparaison) et des opérations logiques (AND, OR, XOR).
Le PC peut être adressé par toutes les instructions et de tous les modes d'adressage.
Exemples :
MOV.W #LABEL,PC ; Branchement à l’adresse LABEL
MOV.W LABEL,PC ; Branchement à l’adresse contenue dans LABEL
MOV @R4,PC ; Branchement indirect à l’adresse continue R4
ADD #4,PC ; Saut de deux mots (4 positions mémoire)
Le pointeur de pile de 16 bits (SP/R1) est employé par le CPU pour stocker les
adresses de retour des appels de sous-routines (sous-programmes) et des routines
(programmes) interruptions. Il emploie une pré-décrémentation et une post-
incrémentation. Le pointeur de pile peut être employé pour toutes les instructions et
modes d'adressage. Le pointeur de pile est initialisé dans la RAM par l'utilisateur, et
il est aligné sur des adresses paires.
Exemple :
MOV 2(SP),R6 ; [SP]+2 −> R6 (R6 prend le contenu de SP + 2)
MOV R7,0(SP) ; R7 −> [SP]+0 (SP prend le contenu de R7)
PUSH #0123h ; 0123h −> [SP] (SP prend 0123h)
POP R8 ; [SP] −> R8 (= 0123h) (R8 prend le contenu de SP)
Génération de constantes
Par exemple :
L'instruction à un seul opérande CLR dst est émulée par l'instruction à deux
opérandes MOV R3,dst ;
L’instruction CLR R5 est donne MOV #0,R5 où #0 est remplacé par l’assembleur en
utilisant R3 avec As=00 ;
L’instruction INC dst donne ADD R3,dst d’où INC R5 est remplacé par ADD #1,R5.
Les douze registres R4 à R15 du CPU peuvent être utilisés sur des largeurs de 8 bits
(suffixe .B) ou 16 bits (suffixe .W). L’écriture d’un byte force la mise à 0 des bits
[15…8].
Certaines instructions peuvent s’effectuer, au choix, sur des données d’un octet
avec l’indication .B (pour Byte) ou sur des données de deux octets avec l’indication
.W (pour Word).
bic.b #BIT3,P1DIR
Force à 0 le bit 3 de P1DIR pour configurer P1.3 en entrée.
BIT3 égal « 00001000b » qui vise le bit 3 de la «destination » c’est-à-dire
P1DIR et le force à 0 par l’opération NOT(00001000b) AND P1DIR, et le
résultat dans P1DIR.
bis.b #(BIT6+BIT0),P1DIR
Force à 1 les bits 6 et 0 de P1DIR pour configurer P1.6 et P1.0 en sortie.
(BIT6+BIT0) donne (01000000b+00000001b) = « 01000001b » qui vise les
bits 6 et 0 de P1DIR pour les forcer à 1 par l’opération (01000001b) OR
P1DIR, et le résultat dans P1DIR.
L’opérateur « + » peut être remplacé par l’opérateur « | », OU logique.
test_BP
bit.b #BIT3,P1IN ; tester de P1.3 en entrée et en pull up.
jnz test_BP ; sauter à « test_BP » si le P1.3 est au niveau haut.
xor.b #BIT0,P1OUT ; sinon, continuer ici (si P1.3 est au niveau bas).
La famille MSP430 possède sept modes d'adressage pour les opérandes de source et
quatre modes d'adressage pour les opérandes de destination qui permettent
d’adresser la totalité l'espace mémoire.
Ces modes d’adressage sont valables aussi bien sur les instructions de chargement
(MOV) que sur des opérations logiques et arithmétiques (ADD, SUB, AND, BIS, …).
Exemples :
Le tableau ci-dessous résume les formats des instructions et les syntaxes des modes
d’adressage.
Ils sont configurables (choix de l’horloge, diviseur programmable, …), disposent des
possibilités d’interruption (activation d’un flag au débordement) et servent à
certains modules comme le Capture/Compare pour des fonctions PWM (Pulse Wide
Modulation) par exemple.
2. Programmation
Il existe plusieurs environnements de développement intégrés (IDE) qui supportent
les MSP430 : IAR Embedded Workbench, CCS (Code Composer Studio), MSPGCC, ...
LaunchPad MSP-EXP430G2553
NOT (NON) permet de complémenter un bit ou tous les bits d’un mot binaire.
OR (OU) permet de positionner un ou plusieurs bits à 1.
AND (ET) permet de positionner un ou plusieurs bits à 0.
XOR (OU exclusif) permet d’inverser (complémenter) l’état un ou plusieurs
bits.
Directives du linker
Directives du listing
Directives de macro
Le programme suivant fait clignoter à 1 Hz une Led connectée sur P1.6 lorsqu’un
bouton poussoir (BP) relié à P1.3 est appuyé (tiré à la masse).
P1.3 doit donc être configurée en entrée et sa résistance pull up activée. P1.6 sera
configurée en sortie.
Sur la barre d’outils, utiliser les icônes suivantes pour compiler et tester le
programme :
;-------------------------------------------------------------------------------
; MSP430 Assembler Code Template for use with TI Code Composer Studio
; MCK à environ 1 Mhz
; un cycle d’instruction égal environ 1 microseconde
;-------------------------------------------------------------------------------
.cdecls C,LIST,"msp430.h" ; Include device header file
;-------------------------------------------------------------------------------
.text ; Assemble into program memory
.retain ; Override ELF conditional linking
; and retain current section
.retainrefs ; Additionally retain any sections
; that have references to current section
;-------------------------------------------------------------------------------
RESET mov.w #__STACK_END, SP ; Initialize stack pointer
StopWDT mov.w #WDTPW | WDTHOLD,&WDTCTL ; Stop watchdog timer
;-------------------------------------------------------------------------------
; Stack Pointer definition
;-------------------------------------------------------------------------------
.global __STACK_END
.sect .stack
;-------------------------------------------------------------------------------
; Interrupt Vectors
;-------------------------------------------------------------------------------
.sect ".reset" ; MSP430 RESET Vector
.short RESET
2.2. Langage C
Le langage C embarqué respecte les règles du C standard. Mais quelques directives
de configurations et de déclarations viennent s’ajouter en fonction du
microcontrôleur.
Les opérateurs logiques binaires sont souvent utilisés pour optimiser les codes. Le
tableau suivant résume ces opérateurs.
Tous les autres opérateurs du C standard sont également utilisables : !, &&, ||, %, +, -
, =, /, etc. (voir annexes pour tous les opérateurs)
a. Exemple de programme C
Reprenons le programme précédent, qui fait clignoter à 1 Hz une Led connectée sur
P1.6 lorsqu’un bouton poussoir (BP) relié à P1.3 est appuyé (tiré à la masse), en C.
_delay_cycles(x) est une fonction qui compte le nombre de cycles CPU passé en
argument (x). Elle est fournie directement par CCS. Comme après un RESET le MCLK
(Master CLK) fonctionne à environ 1Mhz, 500000 cycles donnent 500 millisecondes.
Si on configure le DCO (Digitally Controlled Oscillator) qui alimente MCLK pour une
autre fréquence, il faut ajuster l'argument en conséquence.
// MCLK également environ 1 Mhz, donc un cycle d’instruction égal environ 1 microseconde
#include <msp430g2553.h>
#include <stdio.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // désactivation du watchdog timer
#pragma vector=PORT1_VECTOR
__interrupt void nom (void) //pour les interruptions du Port1
#pragma vector=PORT2_VECTOR
__interrupt void nom (void) //pour les interruptions du Port2
#pragma vector=TIMER0_A1_VECTOR
__interrupt void nom (void) //pour l’interruption TimerA overflow
etc.
Une fonction d’interruption n’est jamais appelée et ne retourne rien. Les flags
d’interruption des ports doivent être remis à 0 dans la fonction d’interruption.
#include <msp430.h
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // désactivation du watchdog timer
P1DIR |= BIT0; // mise à 1 pour P1.0 en sortie, pour la Led
P1OUT |= BIT0; // mise à 1 de P1.0 pour allumer la Led
P1DIR &= ~BIT3; // mise à 0 pour P1.3 en entrée
P1OUT |= BIT3; // 1 sur P1OUT.3 active la résistance pull up
P1REN |= BIT3; // mise à 1 pour activer la résistance pull up sur P1.3
P1IE |= BIT3; // mise à 1 pour activer l’interruption P1.3
P1IES |= BIT3; // mise à 1 pour interruption sur front descendant
P1IFG &= ~BIT3; // effacer le flag d’interruption P1.3
_BIS_SR(GIE); // activer les interruptions
while (1) ; // boucle infinie, la fonction principale ne fait plus rien
}
ANNEXES
Nombre de cycles et longueur des instructions
Opérateurs du langage C
Affectation et arithmétique
Comparaison :
Logique de comparaison :
Logique binaire
BIBLIOGRAPHIE ET WEBOGRAPHIE
PIC16F8X, document DS30430C,
http://ww1.microchip.com/downloads/en/devicedoc/30430c.pdf