Académique Documents
Professionnel Documents
Culture Documents
1.1. INTRODUCTION
Un SoC (system on chip : système sur puce) constitue un circuit complexe qui intègre tous les
éléments fonctionnels d’un produit sur une même puce. Par exemple, des modules logiciels (DSP), des
mémoires, des périphériques, des processeurs matériels (FPGA ou ASIC) …
Chaque jour nous utilisons des produit qui contient des systèmes sur puce qui sont constitués d’une UC
(CPU),des mémoires et des programmes (Téléphone portable, télévision, GPS … ) c’est les
microcontrôleurs. Dans ce chapitre on va donner une introduction générale sur les microcontrôleurs
L.HACINI Page 1
Chapitre 1 Du microprocesseur au microcontrôleur
le bus de contrôle qui indique si l'opération en cours est une lecture ou une écriture, si un
périphérique demande une interruption pour faire remonter une information au processeur, etc.
Traditionnellement, ces composants sont intégrés dans des circuits distincts. Le développement d'un tel
système à base de microprocesseur se trouve donc pénalisé par :
la nécessité de prévoir l'interconnexion de ces composants (bus, câblage, nappes de
connexion) ;
la place occupée physiquement par les composants et les moyens d'interconnexion ;
la consommation énergétique ;
la chaleur dégagée ;
le coût financier.
Les microcontrôleurs améliorent l'intégration et le coût (lié à la conception et à la réalisation) d'un
système à base de microprocesseur en rassemblant ces éléments essentiels dans un seul circuit intégré.
1. 3. LE MICROCONTRÔLEUR
1.3.1. Définition
Les Microcontrôleurs sont des dispositifs qui associent au microprocesseur de base un programme
intégré au circuit, ainsi que des périphériques et de la RAM, ce qui a permis de faire évoluer les
montages vers plus de simplicité et de rapidité.
Les microcontrôleurs sont donc des circuits intégrés qui regroupent dans un même boîtier tous les
composants habituellement nécessaires à un système programmable, à savoir :
Le microprocesseur
de la mémoire vive pour les données, voire de la mémoire morte de programme
Les ports d’entrée et de sortie parallèle ou série
Les bus de données et d’adresse
Selon le modèle ; des timers, des ports série, des convertisseur A/N et/ou N/A, des sorties PWM
(ou MLI modulation de largeur d’impulsion), bus I²C.
Un microcontrôleur est un composant autonome, capable d'exécuter le programme contenu dans sa
mémoire morte dès qu'il est mis sous tension.
L.HACINI Page 2
Chapitre 1 Du microprocesseur au microcontrôleur
Circuit plus fiable car moins de composants.
Diminution des coûts : un microcontrôleur coûte moins cher que la somme des composants
qu’il intègre.
L.HACINI Page 3
Chapitre 1 Du microprocesseur au microcontrôleur
1.3.5. Domaine d’utilisation des microcontrôleurs
Les microcontrôleurs sont essentiellement utilisés dans les systèmes embarqués, on peut les trouver
donc dans de nombreuses systèmes électroniques complexes utilisés de nos jours : Téléphones mobiles
Horloges
Technique médicale (par exemple mesure de la glycémie)
Systèmes de sécurité : alarme incendie
Récepteurs GPS
Electroménager
Appareil WIFI, TV, Télécommande…
Automobile,
Transport aérien/maritime.
L.HACINI Page 4
Chapitre 1 Du microprocesseur au microcontrôleur
Memoire
de programme CPU
et de données
On voit que les échanges s’effectuent de manière simple entre l’unité centrale et la mémoire unique,
par un bus transitant les codes de programme et les données. On a ainsi des données collées aux
instructions. Cette architecture est maintenant principalement utilisée pour la conception des
processeurs d’ordinateurs (PC, MAC) car elle est très souple pour la programmation.
Mémoire Mémoire
de CPU de
programme données
On voit que les échanges s’effectuent de manière double entre l’unité centrale et les deux mémoires, ce
qui permet une grande souplesse pour l’enregistrement et l’utilisation des données. Cette architecture
très employée pour la conception des processeurs de traitement de signal (DSP) est de plus en plus
utilisée pour les microcontrôleurs d’usage généraux
1.3.2.2. Les microprocesseurs RISC (Reduced Instruction Set Computing) : sont munis d’un jeu réduit
d’instructions simples.Ces instructions sont adaptées et sont très rapides.
L.HACINI Page 5
Chapitre2 Architecture du microcontrôleur PIC 16F877
D’une mémoire de programme laquelle contient les instructions que doit réaliser le
microcontrôleur. La capacité de cette mémoire est variable selon les PIC.
D’une mémoire RAM pour sauvegarder temporairement des données. La capacité de cette
RAM est variable selon les PIC.
D’une Unité Arithmétique et Logique (ALU), chargée d’effectuer toutes les opérations
arithmétique de base (addition, soustraction etc. ) ainsi que les opérations logiques de base ( ET,
OU logique etc... ).
De ports d’entrées-sorties pour pouvoir dialoguer avec l’extérieur du microcontrôleur.
Exemples :-pris en compte de l’état d’un interrupteur (entrée logique)
- commande d’un relais (sortie logique)
D’un registre compteur de programme (CP) qui pointe l’adresse mémoire contenant
l’instruction courante à réaliser par le microcontrôleur.
D’un registre pointeur de pile (PP) qui est essentiellement utilisé lorsque l’on réalise des sous
programmes à l’intérieur d’un programme. Le pointeur de pile est chargé de mémoriser
l’adresse courante avant le saut au sous-programme.
D’un registre d’instruction qui contient tous les codes binaires correspondant aux instructions à
réaliser par le microcontrôleur.
D’un registre d’état qui est en relation avec l’UAL et qui permet de tester le résultat de la
dernière opération effectuée par le microcontrôleur. Selon la dernière opération effectuée des
bits seront positionnés dans le registre d’état ceux-ci pourront être testés pour effectuer des
sauts conditionnels.
D’une horloge système qui permettra de cadencer tous les échanges internes ou externes au
microcontrôleur
Certains microcontrôleurs possèdent des convertisseurs analogiques-numériques et numériques-
analogiques, ainsi que de la mémoire EEPROM, également des TIMERS, … etc
A la mise en route de l’unité centrale, une série de micro-instructions va automatiquement charger 0x00
(adresse de la première instruction à exécuter) dans le registre appelé Compteur de Programme (PC).
Cette opération s’appelle RESET. Ce compteur de programme est destiné à contenir l’adresse de
l’instruction qui va être exécutée. Il compte les adresses, c-à-d qu’il s’incrémente dès que l’unité
centrale a chargé l’instruction complète qu’il pointe en mémoire.
Le signal d'horloge externe est divisé par 4 à l'intérieur du PIC pour obtenir 4 horloges internes en
quadrature nommées Q1, Q2, Q3 et Q4 (voir figure. 2.2).
Le compteur de programme est incrémenté pendant l’impulsion d’horloge Q1 (voir figure. 2.2).
L’instruction avec son opérande est chargée à partir de la mémoire dans le registre d’instruction par le
bus de programme pendant l’impulsion d’horloge Q4 du premier cycle (délai nécessaire à cause du
temps d'accès de la mémoire programme). Ensuite l’automate séquenceur va décoder l’instruction
contenue par le registre d’instruction et va générer des micro-instructions qui permettront d’exécuter
l’instruction pendant les cycles d’horloge Q1 à Q4 suivants.
Q1 : décodage de l'instruction
Q2 : lire l'opérande (W, registre en RAM, donnée immédiate…)
Q3 : effectuer un éventuel traitement (addition, …)
Les sorties des PIC peuvent délivrer environ 25 mA, on peut au moyen de transistors, amplifier
ce courant de sortie pour piloter un relais ou bien tout autre composant électrique ou
électronique.
Pour les applications de type analogiques, certain PIC possèdent des convertisseurs intégrés, il
est possible également d'adjoindre un circuit annexe (CNA ou CAN) qui dialoguera avec le
microcontrôleur et effectuera les conversions analogiques.
Mode RC
La fréquence max d'utilisation va dépendre du microcontrôleur utilisé. Le suffixe indiqué sur le boîtier
donne la nature de l'horloge à utiliser et sa fréquence max.
Suffixe :
LP ( Low Power ) oscillateur à quartz fmax = 200 khz
RC oscillateur RC fmax = 4 Mhz
XT oscillateur à quartz fmax =4 Mhz
HS (High Speed )oscillateur à quartz rapide fmax = 20 Mhz
Un nombre suit le suffixe, il donne la fréquence d'utilisation pour le circuit spécifié :
02 2 Mhz pour les suffixes XT et RC
Un port parallèle esclave sur 8 bits avec des lignes de contrôle RD, WR et CS
8 entrées de convertisseurs analogiques numériques 10 bits
Un circuit de détection Brown-Out Resqet (BOR) pour surveiller la tension d’alimentation
Le composant ne comprenant que 40 connexions, il est évident que celles-ci sont communes à plusieurs
interfaces
2.2.1.4. La pile
La pile est constituée de 8 registres de 13 bits situés en dehors de la mémoire de données et en dehors
de la mémoire de programme.
3.1.INTRODUCTION
Une fois le projet établi, l'étape suivante consiste à créer le programme. Le programme source, est une
suite d'ordres dit "Mnémoniques" qui font partie du jeu d'instructions du PIC utilisé. Pour créer le
programme source il faut uniquement un éditeur de texte.
Une fois que le programme source est figé, l'étape suivante consistera à compiler le programme, c'est à
dire à transformer le programme source en un programme dit "binaire" (code machine). L'extension du
fichier sera alors .hex (hexadécimal). Une fois compilé, le fichier binaire sera transféré vers la mémoire
programme du PIC.
3.2.L’ASSEMBLAGE
La transformation du texte en programme, que l’on appelle assemblage, s’effectue en deux temps
appelés passes. Au cours de la première passe le logiciel appelé assembleur, reconnaît chaque symbole
d’instruction (mnémonique), et déduit le code machine correspondant. Après cette première passe,
l’assembleur à défini une table des symboles.
Pendant la deuxième passe, cette table des symboles est utilisée pour achever la traduction.
L’assembleur génère le code machine comme une suite d’octets qui pourront être mis en mémoire,
constituant ainsi le programme exécutable (fichier.hex).une fois l’assemblage est terminé l’utilisateur
dispose de plusieurs fichiers dans l’ordinateur :
Le fichier source qu’il a édité et qu’il pourra modifier par la suite
Le fichier listing qui contient toutes les informations nécessaires à la relecture et à la
compréhension du programme
Le fichier (.hex) qui contient les codes machines exécutés par le microcontrôleur est stocké
sous forme texte sur le disque de l’ordinateur, il contient toutes les informations nécessaires
à son implantation dans la mémoire programme de PIC
D’autres fichiers de travail générés par l’assembleur notamment un fichier détaillant les
erreurs et avertissements qui subissent dans la source.
Exemple1 :
;------------------------------------- Programme principal ------------------------------
ORG 0000h
; Le programme commencera à l'adresse 0000 de la mémoire programme du PIC.
Exemple2 :
;------------------------------------ Initialisation du PIC ---------------------------------
ORG 0000h
GOTO start
;--------------------------------- Programme d' interruption -----------------------------
ORG 0004h
…………………
…………………
;------------------------------------ Programme principal ---------------------------------
start
………………….
………………….
Exemple :
List P=16F877
c) La directive END : Elle précise où doit s’arrêter l’assemblage, les instructions situées après sont
ignorées.
d) La directive CONFIG : Elle permet de définir les paramètres de fonctionnement du PIC. Pour cela il
suffit de positionner la valeur de chacun des bits du registre de configuration. Pour programmer ce
registre on utilise la directive CONFIG qui n’intervient qu’avec le programmateur. Cette directive n’est
utile que pour modifier la configuration par défaut du microcontrôleur.
Exemple:
_CONFIG_CP_OFF&WDTE_OFF&PWRTE_ON&HS_OSC
Chaque définition est séparée par le symbole &, chaque bit est suivi de ON ou OFF. Le bit CP est à 0,
le bit WDTE (watchdog timer enable) est à 0, le bit PWRTE (power timer enable) est à 1 et le terme
HS définit le type d’horloge utilisé.
e) La directive include : elle permet d’introduire dans le programme les assignations contenues dans le
fichier du microcontrôleur, c'est-à-dire toutes les constantes utiles du microcontrôleur.
Exemple :
include p16F877.inc
Exemple :
table EQU 0x50
A chaque fois dans notre programme que le compilateur rencontrera l'équivalence définie, il la
remplacera par sa valeur numéraire. Il est plus facile de comprendre dans un programme le mot table
plutôt que la valeur 5.
Exemple :
define led PORTA,3 ; led désigne le bit 3 du port A
Exemple
GOTO tempo
Dès que le programme rencontre l'instruction GOTO, il va se "brancher" à l'adresse mémoire que
représente l'étiquette tempo pour exécuter les instructions qui se trouvent derrière cette étiquette.
Exemple
AAA macro
Bsf PORTB,2 ; mise à 1 du bit 2 du port B
endm
Exemple
CBLOCK 0x0C ; début de la zone de variables
cmpt : 1 ; zone de 1 octet
table : 8 ; zone de 8 octets
endc ; fin de la zone
CLRF : (CLeaR F)
Cette instruction efface le registre f spécifié
Syntaxe : clrf f ; 00 ( f )
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z=1
CLRW : (CLeaR W)
Efface le contenu du registre W
Syntaxe : clrw ; 00 W
COMF: (COMplement F)
Effectue le complément à 1 du registre spcifié
Syntaxe : comf f,d ; NOT(f) (d)
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté :Z
Exemple :
Dans cet exemple on charge une valeur dans un registre ici 55h puis on complémente cette valeur qui
devient alors AAh.
Reg_temp equ 0x0A ; 0A correspond à l'adresse d'un registre temporaire
movlw B’01010101’ ; on charge 55h dans le registre W
movwf Reg_temp ; on met W dans le registre temporaire
comf Reg_temp, 1 ; on complémente le contenu du registre temporaire
DECF : (DECrement F)
Décrémente le registre spécifié et le met en mémoire selon la valeur de d
Syntaxe : decf f,d ; (f) - 1 (d)
Nombre de cycle d'horloge : 1
Bits du registre STATUS affecté: Z
Exemple :
Dans cet exemple on charge une valeur dans un registre ici 01h puis on décrémente cette valeur qui
devient alors 00h ( flag Z = 1 dans cet exemple ) .
Reg_temp equ 0Ah ; 0A correspond à l'adresse d'un registre temporaire
movlw 01h ; on charge 01h dans le registre W
movwf Reg_temp ; on met W dans le registre temporaire
decf Reg_temp, 1 ; on décrémente le contenu du registre temporaire
GOTO : aller à
Cette instruction effectue ce que l’on appelle un saut inconditionnel. Elle contient les 11 bits de
l’emplacement de destination. Les 2 bits manquants pour reconstituer l’adresse complète sont dans le
registre PCLATH.
Fonctionnement de goto :
l’adresse de saut sur 11 bits est chargée dans le PC
les deux bits manquants sont chargés depuis PCLATH (b3 et b4)
le résultat donne l’adresse sur 13 bits
la suite du programme s’effectue à la nouvelle adresse du PC
Syntaxe : goto étiquette
Nombre de cycle d'horloge : 2
Bits du registre STATUS affectés : aucun
INCF: (INCrement F)
Incrémente le registre f et range le résultat dans l’emplacement mémoire selon d
Syntaxe : incf f,d ; (f) + 1 (d)
Nombre de cycle d'horloge : 1
Bit du registre STATUS affecté : Z
Exemple :
incf x,f ; le contenu de x est augmenté de 1
; le résultat est stocké dans x
incf x,w ; le contenu de x est augmenté de 1 et stocké dans W, x n’est pas modifié
; le résultat est stocké dans x
MOVF: (MOVe F)
Charge le contenu du registre spécifié dans la destination selon la valeur de d.
Syntaxe : movf f,d ; (f) (d)
MOVWF: (MOVe W to F)
Charge le registre W dans le registre f
Syntaxe : movwf f ;(W) (f)
Nombre de cycle d'horloge : 1
Bits du registre STATUS affectés : Aucun
Exemple :
movlw 0x50 ; charge 0x50 dans w
movwf PORTB ; PORTB contient 0x50
Exemple :
retlw 0xFF ; retour de sous programme avec W contenant 0xFF
C (Carry) : Il passe à 1 quand une retenue apparaît sur le bit le plus significatif
DC (Digit Carry) : Ce bit est utilisé principalement lorsque l’on travaille avec des nombres
BCD : il indique un report ou retenue du bit 3 vers le bit 4.
Z (Zero) : ce bit est positionné à 1 si le résultat de la dernière opération logique ou arithmétique
vaut 0.
PD (Power Down) : ce bit est actif au niveau zéro. Il est mis à 1 à la mise sous tension. PD est
mis à 0 par l’instruction SLEEP (état de basse consommation). Indique quel événement a
entraîné le dernier arrêt du PIC (instruction sleep ou dépassement du temps du watchdog).
TO (Time-Out bit) : ce bit est actif au niveau zéro. Il est mis à 1 à la mise sous tension. Ce bit
est mis à 0 par le débordement du chien de garde, il peut indiquer si le redémarrage suit un arrêt
provoqué par débordement du compteur du chien de garde ou d’une mise en sommeil.
RP0, RP1 (Register bank select) : ces deux bits permettent d’indiquer dans quel bloc de RAM
on veut travailler. Si RP0 et RP1 sont à 0 on utilise le bloc 0. Si RP0 et RP1 sont à 1 on utilise
le bloc 4.
IRP (Indirect RP) : permet de choisir quel bloc de RAM on veut utiliser en cas d’adressage
indirect.
Exemple :
MOVLW 0x34 ; charge la valeur hexadécimale 34 dans l’accumulateur
Le code opératoire est suivi d’un octet non signé qui est l’adresse effective de l’opérande à traiter.
L’opérande est l’adresse de la valeur à utiliser par l’instruction. L’adresse écrite sur 7 bits est
complétée, en adressage direct, par les bits RP0 et RP1 du registre STATUS.
Exemple :
MOVF 0x5,W ; charge l’accumulateur W avec la donnée située dans la case mémoire 5.
Si RP0 et RP1 sont à 0, l’adresse 5 est celle du port A dans le bloc mémoire 0 et si RP0 est à 1 et RP1
est à 0, l’adresse 5 devient 85, c’est l’adresse du registre TRISA dans le bloc 1.
Exemple :
Le registre à l’adresse 7 contient 0x0A.
Pour lire le contenu de cette case il suffit d’écrire 7 dans le FSR, puis de lire le contenu de INDF. En
incrémentant le contenu de FSR, on accédera au contenu de la case mémoire 8.
Exemple :
etiq decfsz T1,f
goto etiq
Pendant l’assemblage l’étiquette etiq sera remplacée par la valeur du déplacement qui additionnée au
contenu du compteur de programme permettra à l’unité centrale d’effectuer l’instruction decfsz T1,f.
3.8. FORMAT DES INSTRUCTIONS
Une instruction est codée en un seul mot de 14 bits composé :
D’un code opération ou code machine, disposé sur les bits de poids forts du mot, précisant le
type d’instruction.
D’une ou plusieurs opérandes codées sur les bits restants précisant l’opération de l’instruction.
On distingue trois grands types d’instruction :
3.8.1. Opérations orientées mots des registres
Dans ce cas des instructions orientées mot, selon l’état du bit du rang 7 de l’instruction, le résultat de
l’instruction sera logé dans l’accumulateur W si d=0 ou dans le registre considéré de la zone mémoire
si d=1.
Exemple :
ADDWF 0x40,1
Cette instruction accomplit l’addition : W+(0x40) (0x40)
Son codage sur 14 bits est :
ADDWF d 0x40
000111 1 1000000
3.8.2. Opérations de manipulations de bits
L’adresse du bit est écrite sur 3 bits et l’adresse du registre sur les 7 bits de poids faible
Exemple :
BCF 0x40, 3 ; met à 0 un bit dans le registre (0x40)
Son codage sur 14 bits est :
BCF 3 0x40
0100 011 1000000
3.8.3. Opérations de branchement
L’adresse de destination sur 11 bits ne permet qu’un saut à l’intérieur d’une page de mémoire (2Ko).
Pour accéder à une adresse plus lointaine il faut mettre en œuvre les bits b3 et b4 du registre PCLATH.
Exemple :
goto etiq ; etiq est l’étiquette correspondant à la destination
Son codage sur 14 bits est :
101 xxxxxxxxxxx
Code machine adresse de destination
4.1. INTRODUCTION
Une interruption comme son nom l’indique, interrompt un programme en cours (appelé aussi
programme principal) pour faire exécuter à l’unité centrale un autre travail (suite s’instructions appelée
sous-programme). Celui-ci se termine par une instruction de retour d’interruption (RETFIE) qui permet
à l’unité centrale de reprendre le programme principal où il a été quitté.
La ligne INT peut être rendu sensible à un front descendant en plaçant à 0 le bit INTEDG
(Interrupt EDGe) du registre OPTION et inversement.
Les interruptions sont remises en service automatiquement lors du retour de l’interruption.
L’instruction RETFIE agit donc exactement comme l’instruction RETURN, mais elle
repositionne en même temps le bit GIE.
Le contenu du PC est sauvé sur la pile interne (8 niveaux). Donc, si on utilise des interruptions,
on ne dispose que de 7 niveaux d’imbrication pour les sous-programmes.
GIE (Global Interrupt Enable) : interdit toutes les interruptions tant qu’il est à 0. Ce bit est mis
à 0 automatiquement pendant un sous-programme d’interruption par l’unité centrale pour éviter
de perturber le déroulement de celui-ci. Il est remis à 1 par l’instruction RETFIE.
PEIE (PEripheral Interrupt Enable) : il permet de valider toutes les interruptions périphériques
T0IE (Timer0 Interrupt Enable) : Valide l’interruption générée par le débordement du timer0.
INTE (INTerrupt Enable) : associé à la connexion RB0/INT de demande externe
d’interruption. Il autorise l’interruption quand il est à 1.
RBIE (RB port change Interrupt Enable) : autorise quand il est à 1 les interruptions demandées
par un changement d’état de l’une des connexions RB4 à RB7 du port B.
T0IF (Timer0 Interrupt Flag) : ce bit est mis à 1 quand le compteur TMR0 déborde c’est à dire
quand son contenu passe de FFh à 00h.
INTF (Interrupt Flag) : signale une transition sur la pin RB0 dans le sens déterminé par
INTEDG du registre OPTION (b6).
RBIF (port change Interrupt Flag) : ce bit est mis à 1 quand un changement d’état est détecté
sur une des connexions RB4 à RB7 du port B. ces quatre connexions sont indissociables, c'est-
à-dire que l’événement est pris en compte quelle que soit la connexion stimulée.
En fait, MICROCHIP a scindé les interruptions entre les interruptions primaires et les interruptions
secondaires, appelées aussi interruptions périphériques.
Remarque :
La mise en service de PEIE ne dispense pas l’initialisation du bit GIE, qui reste de toute façon
prioritaire. Cette architecture permet de couper toutes les interruptions d’un coup (effacement de GIE)
ou de couper toutes les interruptions périphériques en une seule opération (effacement de PEIE) tout en
conservant les interruptions primaires.
Tous les indicateurs activés doivent être remis à 0 durant le sous-programme d’interruption.
Les deux registres d’autorisations (PIE1 et PIE2) se trouvent en banque 1, tandis que les registres de
flags (PIR1 et PIR2) se trouvent en banque 0.
Registre adresse B7 B6 B5 B4 B3 B2 B1 B0
PIE1 0x8C PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
PIR1 0x0C PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
PIE2 0x8D NI réservé NI EEIE BCLIE NI NI CCP2IE
PIR2 0x0D NI réservé NI EEIF BCLIF NI NI CCP2IF
Tableau 4.2. Les registres PIE1, PIE2, PIR1 et PIR2
Il y a quelques bits non implémentés, qui donneront toujours 0 s’ils sont lus, mais aussi 2 bits réservés
qu’il est impératif de maintenir à 0.
Les bits des registres PIEx permettent d’autoriser les interruptions correspondantes, mais ces bits ne
sont opérationnels que si le bit PEIE du registre INTCON est mis à 1. Dans le cas contraire, toutes ces
interruptions sont invalidées.
Registre PIE1
PSPIE : Lecture/écriture sur le port PSP (Parallel Slave Port)
ADIE : Conversion analogique/numérique
RCIE : Réception d’un caractère sur le port série USART
TXIE : Emission d’un caractère sur le port série USART
SSPIE : Communication sur le port série synchrone SSP
CCP1IE : Evénement sur compare/capture registre 1
TMR2IE : Correspondance de valeurs pour le timer TMR2
TMR1IE : Débordement du timer TMR1
Registre PIE2
EEIE : Ecriture dans l’EEPROM
BCLIE : Collision de bus pour le port série synchrone I2C
CCP2IE : Evénement sur compare/capture registre 2
Registre PIR1
PSPIF : Lecture ou écriture terminée sur le port parallèle
ADIF : Fin de la conversion analogique/numérique
RCIF : Le buffer de réception de l’USART est plein (lecture seule)
Registre PIR2
EEIF : Fin d’écriture de la valeur en EEPROM
BCLIF : Collision de bus, quand le SSP est configuré en maître I2C
CCP2IF : Evénement compare/capture 2 détecté suivant le mode :
Mode capture : capture du TMR1 réalisée
Mode compare : La valeur de TMR1 atteint la valeur programmée
Avec :
RBPU : Pull up du port B
Une résistance de rappel (environ 50K) est reliée au +5 volt sur chaque connexion du PORTB,
quand le bit RBPU est mis à 0(actif au niveau bas). Ce bit valide simultanément les résistances
sur toutes les connexions du PORTB.
INTEDG : sélection du front du signal de demande d’interruption.
- Si INTEDG=1, une interruption est demandée si le niveau sur la connexion RB0(INT) passe
de 0 vers 1 (front montant)
- Si INTEDG=0, l’interruption s’effectue lors de la transition de 1 vers 0 (front descendant).
Exemple :
Supposons qu’un programme interrompu entre les deux instructions suivantes :
movf var,w
btfss STATUS,z
Il est probable que le sous-programme d’interruption utilise une instruction qui modifie le bit Z. on doit
donc restaurer le registre STATUS dans l’état qu’il était avant de sortir du sous-programme
d’interruption. Sinon le test ne se fera pas sur la valeur de var, mais sur une valeur modifié par le sous-
programme d’interruption. De même, le registre de travail W peut aussi être modifié, donc il faut le
sauvegardé également.
5.2. DEFINITIONS
Le module MSSP (Master Synchronous Serial Port), permet l’échange de données du PIC avec le
mode extérieur, en utilisant des transmissions série synchrones.
SPI signifie : Serial Peripheral Interface.
Une liaison série est une liaison qui transfère les données bit après bit (en série), au contraire d’une
liaison parallèle, qui transmet un mot à la fois (mot de 8 bits, 16 bits, ou plus suivant le
processeur).
La notion de synchrone signifie que l’émetteur/récepteur fournira un signal de synchronisation qui
déterminera non seulement le début et la fin de chaque octet, mais également la position de chaque
état stable des bits.
Il y en a deux façons d’envoyer les bits à la suite les uns des autres :
Soit on commence par le bit 7, et on le poursuit par les autres bits jusqu’au bit 0. C’est la
méthode utilisée par le module MSSP.
Soit on procède d’une façon inverse, d’abord le bit 0 jusqu’au bit de poids le plus fort. C’est de
cette façon que fonctionnera le module USART.
5.3. CONSTITUTION
Cette interface est pilotée par deux registres de la MSSP :
Le registre de contrôle SSPCON d’adresse 14h.
Le registre d’état SSPSTAT d’adresse 94h.
A ces registres s’ajoutent le SSPSR (Synchronous Serial Port Shift Register), qui contient la
donnée en cours de transfert, et le registre SSPBUF (Synchronous Serial Port BUFfer) qui
contient l’octet à envoyer, ou l’octet reçu.
SDI Emission
SCK Horloge
(a)
(b)
Avec :
SD0 (RC5) : Serial Data Out sortie de donnée
SDI (RC4) : Serial Data Input entrée de donnée
SCK (RC3/SDA) : Serial ClocK sortie d’horloge sur maître
(entrée d’horloge sur esclave)
SS (RA5/AN4) : Slave Select
Cette ligne de sélection, qui fait partie du port A, active au niveau bas, permet au maître d’activer la
SPI de l’esclave avec qui dialoguer dans un réseau. En cas de dialogue entre plusieurs
microcontrôleurs, si la connexion SS est au niveau haut le microcontrôleur est maître, et à l’inverse, si
Avec :
WCOL : Write COLlision detect bit
L.HACINI M1 Electronique des Systèmes Embarqués Page 4
Chapitre 5 La liaison SPI du module MSSP
SSPOV : SSP receive Overflow indicator bit (=1, perte de l’octet reçu)
Ce bit passé à 1 quand un nouveau mot est reçu alors que le buffer SSPBUF contient la
donnée précédente (débordement). La donnée dans le registre à décalage (SSPSR) est
perdue. En mode esclave, le programme doit lire le SSPBUF afin d’évier le débordement. Ce
bit doit être remis à 0 par programme.
SSPEN : SSP ENable (=1, module SSP en service)
à 1, il met en service le port série et configure les lignes SCK, SDO, SDI et SS. Dans ce cas
il faut que les lignes soient configurées correctement en entrées et en sorties via TRISC.
CKP : ClocK Polarity select bit (détermine le niveau de l’état de repos de l’horloge)
CKP=0 : repos de l’horloge au niveau 0
CKP=1 : repos de l’horloge au niveau 1
SSPM3 à SSPM0: Synchronous Serial Port Mode select bits
Les bits de sélection du mode de fonctionnement comme le montre le tableau suivant :
M3 M2 M1 M0 Origine de l’horloge
0 0 0 0 Fosc/4
0 0 0 1 Fosc/16
0 0 1 0 Fosc/64
0 0 1 1 TMR2 output/2
0 1 0 0 Entrée SCK-SS en service
0 1 0 1 Entrée SCK-SS libre
Tableau 5.1. Mode de fonctionnement
Pour la SPI en maître, ces bits permettent de déterminer l’origine (TMR2 ou OSC) et la fréquence de
l’horloge de transmission, pour la SPI en esclave, ils mettent en service ou non la ligne SS.
Avec :
SMP : data SaMPle timing
Echantillonnage d’un bit sur l’entrée SDI. Permet de définir à quel moment du cycle d’horloge
on effectue la capture du bit présent sur SDI
SPI mode maître :
SMP=1 : l’échantillonnage de la donnée reçue a lieu à la fin du bit de donnée.
L.HACINI M1 Electronique des Systèmes Embarqués Page 5
Chapitre 5 La liaison SPI du module MSSP
SMP=0 : l’échantillonnage a lieu au milieu du bit.
Ce réglage de l’échantillonnage permet d’être compatible avec tout esclave
SPI mode esclave :
Dans ce mode de fonctionnement SMP doit être mis à 0.
CKE : SPI ClocK Edge select
Ce bit détermine quel sens de transition de l’horloge accompagne le placement du bit sur SDO
Si CKP=0
CKE=1 : la donnée est transmise sur un front montant de l’horloge SCK
CKE=0 : la donnée est transmise sur un front descendant de l’horloge SCK
Si CKP=1
CKE=1 : la donnée est transmise sur un front descendant de l’horloge SCK
CKE=0 : la donnée est transmise sur un front montant de l’horloge SCK
BF : Buffer Full
Ce bit est un indicateur (lecture seule). Il indique quand il est à 1 que le registre de réception
(SSPBUF) est plein. Il faut lire le buffer avant toute autre lecture ou écriture aussi pour le maître
que pour l’esclave.
EEDATA, à l’adresse 10Ch du bloc mémoire 2, est un registre de transition pour les données
en lecture et en écriture. C’est dans ce registre que transitent les données transférées.
EEADR, à l’adresse 10D du bloc mémoire 2, précise l’adresse de lecture ou d’écriture dans
l’EEPROM.
EECON1, à l’adresse 18Ch du bloc mémoire 2, est un registre de contrôle d’accès à la mémoire
EEPROM. Il se compose de 5 bits comme le montre la figure suivante :
- RD (ReaD control bit) : ce bit mis à 1 démarre un cycle de lecture. Il est remis à 0
automatiquement à la fin de la lecture. Il ne peut être mis à 0 par programme.
- WR (WRite control bit) : ce bit démarre un cycle d’écriture quand il est mis à 1. il est
mis à 0 automatiquement à la fin du cycle d’écriture et ne peut être mis à 0 par
programme.
- WREN (WRite ENable bit) :ce bit autorise un cycle d’écriture quand il est mis à 1. a la
mise en service du microcontrôleur (Reset), il est à 0.
- WRERR (WRite eeprom ERRor bit) : c’est un indicateur d’erreur en écriture, il passé à 1
quand un cycle d’écriture à été interrompu par un RESET ou par le chien de garde. Il
EECON2, à l’adresse 18Dh du bloc mémoire 2, est un registre de contrôle qui n’existe pas
physiquement, il ne sert qu’a des commandes spécifiques d’écriture. Sa lecture donne 0.
MICROCHIP l’utilise en tant que registre de commande. L’écriture de valeurs spécifiques dans
EECON2 provoque l’exécution d’une commande spécifique dans l’électronique interne du PIC.
Remarque :
L’emplacement physique réel de l’EEPROM commence à l’adresse 0x2100, alors que l’adresse
relative employée dans le programme commence à la valeur 0x00. C’est-à-dire que lorsqu’on
accède à l’adresse EEPROM 0x01 dans le programme, la donnée se trouvera physiquement à
l’adresse 0x2101 du PIC.
Remarques :
L’écriture d’un octet en mémoire EEPROM nécessite une durrée de l’ordre de 4 ms (PIC
16F877 de 20 MHz) cela représente pas moins de 20000 cycles d’instruction. Donc les
écritures en EEPROM nécessitent énormément de temps à l’échelle du PIC.
A la fin du cycle d’écriture, il s’écoule un certain temps avant que la donnée ne soit écrite en
mémoire. Il faut donc attendre et vérifier que tout soit terminé avant de recommencer un
autre cycle ou de lire cette donnée.
La fin de l’écriture peut être détectée en lisant l’état de l’indicateur EEIF, ou en lisant l’état
du bit WR qui est remis automatiquement à 0 en fin de cycle.
A la fin d’écriture le bit EEIF passe à 1, ce qui permet de demander une interruption si le bit
EEIE le permet
Quantification
Il faut préciser que le PIC nécessite un temps Tad avant le démarrage effectif de la conversion, 10 *
Tad pour la conversion des 10 bits du résultat, et un temps supplémentaire Tad à la fin de la
conversion. Donc, le temps total de conversion est de : 12 Tad
En résumé, le temps nécessaire pour effectuer l’ensemble des opérations :
On charge le condensateur interne (nécessite le temps Tacq)
On effectue la conversion (nécessite le temps 12 * Tad)
On doit attendre 2 * Tad avant de pouvoir recommencer une autre conversion
Supposons donc que nous travaillions avec un PIC à 20MHz. Nous utilisons le diviseur par 32. Chaque
Tad vaut donc 32 Tosc. Notre temps de conversion effectif prend donc normalement 12 Tad, soit 12 *
32 Tosc, soit 19,2μs.
Si on accepte de limiter la précision à un nombre inférieur à 10 bits, et en constatant que la
numérisation s’effectue en commençant par les bits les plus significatifs, on peut se dire : N bits me
suffisent, on décide de stopper la conversion après que les bits en question aient été numérisés.
Donc, pour conserver N bits significatifs, on aurait :
Tacq pour charger le condensateur
Tad pour le démarrage
N * Tad pour la conversion
Remarque
La tension d’entrée ne peut être supérieure à la tension d’alimentation Vdd du PIC, ni inférieure à sa
tension Vss. Pour mesurer une tension supérieure, par exemple une tension de 15V maximum, il faut
Utilisation de Vss comme tension Vref- et de Vdd comme tension Vref+. Dans ce mode, les
tensions de références sont tirées en interne de la tension d’alimentation. Il n’y a donc pas
besoin de les fournir.
(a)
(b)
Fig7.3. sauvegarde du résultat
(a) justification à droite (b) justification à gauche
La justification à droite sera principalement utilisée lorsque nous avons besoin de l’intégralité des 10
bits de résultat, tandis que la justification à gauche est très pratique lorsque 8 bits sont suffisants. Dans
ce cas, les deux bits de poids faibles se trouvent isolés dans ADRESL, il suffit donc de ne pas en tenir
compte. Le choix de la méthode s’effectue à l’aide du bit 7 de ADCON1.
PCFG AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 Vref- Vref A/D/R
3à0 RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0 +
0000 A A A A A A A A Vss Vdd 8/0/0
0001 A A A A Vref+ A A A Vss RA3 7/0/1
0010 D D D A A A A A Vss Vdd 5/3/0
0011 D D D A Vref+ A A A Vss RA3 4/3/1
0100 D D D D A D A A Vss Vdd 3/5/0
0101 D D D D Vref+ D A A Vss RA3 2/5/1
0110 D D D D D D D D - - 0/8/0
0111 D D D D D D D D - - 0/8/0
1000 A A A A Vref+ Vref- A A RA2 RA3 6/0/2
1001 D D A A A A A A Vss Vdd 6/2/0
1010 D D A A Vref+ A A A Vss RA3 5/2/1
1011 D D A A Vref+ Vref- A A RA2 RA3 4/2/2
1100 D D D A Vref+ Vref- A A RA2 RA3 3/3/2
1101 D D D D Vref+ Vref- A A RA2 RA3 2/4/2
1110 D D D D D D D A Vss Vdd 1/7/0
1111 D D D D Vref+ Vref- D A RA2 RA3 1/5/2
Tableau 7.2. Configuration des pins du convertisseur analogique/numérique
Lors d’une mise sous tension, les bits PCFGx contiennent 0000. Le PORTA et le PORTE seront donc
configurés par défaut comme ports complètement analogiques. Ceci explique pourquoi l’utilisation de
ces ports comme ports d’entrées/sorties classiques implique d’initialiser ADCON1, avec0110 ou 0111.
Les bits CHSx sont des bits qui permettent de sélectionner l’entrée analogique à convertir comme le
montre le tableau suivant :
CHS2 CHS1 CHS0 Canal Pin
0 0 0 0 AN0/RA0
0 0 1 1 AN1/RA1
0 1 0 2 AN2/RA2
0 1 1 3 AN3/RA3
1 0 0 4 AN4/RA5
1 0 1 5 AN5/RE0
1 1 0 6 AN6/RE1
1 1 1 7 AN7/RE2
Tableau. 7.4. Choix du canal
Le bit ADON permet de mettre en service le convertisseur. Si le canal a été correctement choisi, le
positionnement de ce bit permet de démarrer la charge du condensateur interne, et donc détermine le
début du temps d’acquisition.
Le bit Go/DONE, il sera placé à 1 par l’utilisateur. Cette action détermine le début de la conversion en
elle-même, qui dure 12 Tad.
Une fois la conversion terminée, ce bit est remis à 0 par l’électronique du convertisseur. Cette remise à
0 est accompagnée du positionnement du flag ADIF du registre PIR1. Ce bit permettra éventuellement
de générer une interruption. On dispose donc de deux façons pratiques de connaître la fin de la durée de
conversion :
Si le programme n’a rien d’autre à faire durant l’attente de la conversion, on boucle dans
l’attente du passage à 0 du bit GO/Done.
Si le programme continue son traitement, on peut utiliser l’interruption générée par le
positionnement du flag ADIF.