Vous êtes sur la page 1sur 316

Cours Informatique

Industrielle

Microcontrôleur
PIC-16F887
12/09/2022 FI-SICoM 1
• https://www.mikroe.com/ebooks/pic-
microcontrollers-programming-in-c/the-basics-
of-c-programming-language

12/09/2022 FI-SICoM 2
Introduction et définitions aux systèmes embarqués

• Système électronique et informatique autonome


• Les entrées sorties du système sont spécifiques à
l’application
• Le matériel et l’application sont imbriqués ( ex :
systèmes mecatronique)
• Le système embarqué est numérique, utilise un
processeur, ou un ASIC, il exécute une application qui
est spécifique.(ASIC=application specific integrated
circuit, FPGA= Field programable gate array)
• L’interface utilisateur est spécifique : Ecran LCD,
voyants, touches, clavier.

12/09/2022 FI-SICoM 3
Introduction et définitions aux systèmes embarqués

• Le logiciel embarqué a une fonctionnalité spécifique à


l’application du système.
• On discerne 4 grandes familles de systèmes embarqués:
• General computing : application similaire à PC mais empaquetée
différemment : Console de jeux, machine à traitement de texte
• Control systems : Systèmes temps réels, contrôle de moteurs
automobile, contrôles d’éléments de navigation aérienne.
• Signal processing : commande de moteurs, radar, sonar, analyse
video
• Communication network : téléphone, transmitions de données,
wifi, bluetooth.

12/09/2022 FI-SICoM 4
Introduction et définitions : Système temps réel

Environnement

Restitution et
Acquisition Traitement
commande

Système « temps réel »

Système en interaction avec un environnement externe variable en fonction du


temps. Le système exécute des fonctions spécifiques et limitées .Le système doit
être exact logiquement (sorties en adéquation avec les entrées),et exact
temporellement (contraintes temporelles respectées)

12/09/2022 FI-SICoM 5
Généralisation -1….

Dynamique imposée par le système à piloter

données
Système Système à piloter
pilotant mesures
(ex : une chaîne de
Autres électronique événements production, une
Autres
Autres
systèmes informatique réaction
systèmes
systèmes chimique…)

commandes

12/09/2022 FI-SICoM 6
Généralisation -2….

12/09/2022 FI-SICoM 7
Structure interne typique

• Memory Software

Sensors

A/D
ASIC/FPGA Processor(s) D/A
Actuators

Other Hardware
Human Interface

Auxiliary Systems (power, package,…)

12/09/2022 FI-SICoM 8
Un système embarqué typique

12/09/2022 FI-SICoM 9
Composants des système embarqués

• Composants hardware :
• Processeurs RISC CISC
• DSP
• FPGA
• Periph de communication, afficheurs, interfaces

• Software :
• système d’exploitation embarqué
• Logiciels spécifique, compilateur, interpreteurs.

12/09/2022 FI-SICoM 10
Architecture de processeur de Von Neuman

Le processeur et la mémoires sont connectés par bus.


La mémoire contient les instructions et les données.
La vitesse de calcul de l’ensemble est limitée par la mémoire qui est
lente.
11
12/09/2022 FI-SICoM
Architecture de processeur de Von Neuman

Différentes possibilités de connecter les entrées sorties.

12/09/2022
FI-SICoM 12
Architecture de processeur Harvard

Les mémoires instruction et données sont séparées.


Le processeur peut accéder en même temps dans les deux plans mémoire.

12/09/2022 FI-SICoM 13
Von Neumann vs. Harvard
• L’architecture Harvard permet deux lectures simultanées .
• La plupart des DSP (digital signal processor) utilisent
l’architecture Harvard
– Note : DSP processeur à archi dédiée pour traitement de
signal (opération sur les matrices)
• Intéressante dans le cas des applications traitant des
données à la volée « streaming data »:
– Permet une plus grande bande passante pour les données
(nombre de données lues ou écrites par cycles
importantes)
– Comme la lecture des données et la lectures des
instructions se font sur des bus différents, il y a moins
d’interférence, une plus grande prédictibilité au niveau
de la largeur de bande.

12/09/2022 FI-SICoM 14
RISC versus SISC

Caractéristique des architectures CISC et RISC


Caractéristiques RISC CISC
Nombre d'instructions <100 >200
Nombre de modes d'adressage 1à2 5 à 20
Nombre de formats d'instructions 1à2 3+
Nombre cycles/instruction #1 3 à 10
Accès à la mémoire load/store La plupart des instructions
Nombre de registres 32+ 2 à 16
Réalisation du microprocesseur câblé microprogrammé

12/09/2022 FI-SICoM 15
Différentes familles de processeurs : exemples types

• Microcontrôleurs :
• 8051
• 68HC11
• PIC
• MSP 430
• Processeurs :
• Intel 80XXX
• Motorola 68XX
• ARM
• DSP :
• TMS 320 C XX
• ADSP 21 XXX, SHARC
• 56 XXX

12/09/2022 FI-SICoM 16
DEFINITION

• Un microcontrôleur est un C.I qui


rassemble les éléments essentiels d'un
ordinateur:

Processeur
Mémoires
Unités périphériques et interfaces
d‘E/S

12/09/2022 FI-SICoM 17
Du µ-processeur au µ-
contrôleur

Pour réaliser un système (micro computer) minimum,


il faut ajouter au micro-processeur les éléments
suivants :
Mémoire de programme ROM.
Mémoire de données RAM.
Circuits d’Entrées/Sorties PIA, ACIA, TIMER.
12/09/2022 FI-SICoM 18
Du µ-processeur au µ-
contrôleur
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

Microcontrôleur = Microprocesseur + Ram + Rom


+ E/S

Un microcontrôleur est donc un composant autonome,

Les microcontrôleurs peuvent fonctionner sans


l’addition de circuits externes
Caractéristiques d’un µ-
Contrôleur
Circuit imprimé peu complexe

Faible consommation

Coût réduit

Encombrement réduit

Programmation nécessitant un matériel adapté

Une vitesse de fonctionnement et taille mémoire


plus faible par rapport aux microprocesseurs
Applications
 Informatique et télécommunication (souris, modems…)

 Contrôle de processus industriels (régulation, pilotage)

 Vidéo (Appareil photos et caméra numériques…),

 Multimédia (téléviseur, carte audio, carte vidéo, MP3,…)

 Systèmes embarqués, comme les contrôleurs des moteurs


automobiles (ABS, injection, GPS, airbag), les télécommandes,
jouets, la téléphonie mobile,…

12/09/2022 FI-SICoM 21
Familles de microcontrôleurs
-la famille Atmel AT91 , Atmel AVR ;
-le C167 de Siemens;
-la famille Hitachi H8;
-l’Intel 8085 , Intel 8051
-la famille Motorolla 68HC11, 68HC08 , 68HC12 ;
-la famille des PIC de Microchip ;
-la famille des ST6, ST7, ST10, STR7, STR9 de STMicroelectronics ;
-la famille ADuC d'Analog Devices ;
-la famille MSP430 de Texas Instruments ;
-la famille LPC21xx ARM7-TDMI de Philips ;

12/09/2022 FI-SICoM 22
Les PICs de Microchip
La société Américaine Microchip Technologie a mis au
point dans les années 90 un microcontrôleur CMOS :
le PIC (Peripheral Interface Controller).
Ses caractéristiques principales sont :

- Architecture RISC : Reduced Instruction Set


Computer
-Jeu d’instruction réduit
-Instruction et opérande codés sur un seul mot
-Toutes les instructions (hors saut) sur un cycle
machine
-Architecture Harvard :
Le programme et les données sont stockées dans
des mémoires physiquement séparées.
12/09/2022 FI-SICoM 23
Architecture
RISC & CISC

12/09/2022 FI-SICoM 24
Microcontrôleurs
Architecture interne

•Mémoire flash : C'est une mémoire


réinscriptible qui conserve ses données lorsque la
PIC n'est pas alimentée. Elle est utilisée pour
stocker le programme.
•Mémoire RAM : C'est une mémoire volatile.
Les variables utilisées au cours du programme
sont stockées à cet endroit.
•Unité de Calcul : C'est là où se déroulent
toutes les opérations à une vitesse définie
par la fréquence d'horloge.
•Registre temporaire W : C'est ici qu'est
stockée la valeur nécessaire pour une opération
de l'unité de calcul.
•Ports E/S ( Entrées/Sorties ) : Ce sont les
unités qui font le lien entre ce qui se passe
à l'intérieur du PIC et l'extérieur.
•Modules annexes : Toutes les fonctions annexes
(timers, comparateurs, convertisseurs
analogiques/numériques ...)

12/09/2022 FI-SICoM 25
Les différentes familles des
PICs
-Base-line (Les instructions sont codées sur12 bits)

- PIC 10 - PIC 12
- Certains PIC12F & PIC16F

-Mid-range (Les instructions sont codées sur 14 bits)

- La plupart des PIC 16


- Certains PIC12F

-High-end (Les instructions sont codées sur 16 bits)

- PIC 17
- PIC 18

12/09/2022 FI-SICoM 26
Référence des MCU

12/09/2022 FI-SICoM 27
Référence des MCU

PIC 16F887

• Le numéro 16 signifie qu'il fait partie de la famille "MID-RANGE". C'est la


famille de PIC qui travaille sur des mots de 14 bits.

• La lettre F indique que la mémoire programme de cette PIC est de type "Flash".

• Les derniers chiffres permettent d'identifier précisément la PIC, ici c'est une
PIC de type 887.

• La référence 16F887 peut avoir un suffixe du type "-XX" dans lequel XX


représente la fréquence d'horloge maximale que la PIC peut recevoir.

12/09/2022 FI-SICoM 28
3.1 LES CARACTÉRISTIQUES DE BASE
PIC16F887
• Architecture RISC
– Seulement 35 instructions pour apprendre
– Toutes les instructions seul cycle sauf les branches
• D'utilisation de fréquence de 0-20 MHz
• Précision oscillateur interne
– Calibré en usine
– Bande de fréquences de logiciel de 8 MHz à 31 KHz
• 2.0 La tension d'alimentation de puissance-5.5V
– Consommation : 220uA (2,0 v, 4 MHz), 11uA (2,0 V, 32 KHz) 50nA (mode
veille)
• Mode veille d'économie d'énergie
• Brown-out Reset (BOR) avec option de contrôle de logiciel
• 35 broches d'entrée/sortie
– Sources et de puits actuel élevé à entraînement direct de LED
– logiciel et résistance programmables individuellement pull-up
– Interruption-sur-Changez code
• 8 K de mémoire ROM en technologie FLASH
– Puce peut être reprogrammé jusqu'à 100.000 fois
• Programmation série en Circuit Option
Puce peut être programmé même incorporé dans l'appareil cible

12/09/2022 FI-SICoM 29
3.1 LES CARACTÉRISTIQUES DE BASE
PIC16F887
• mémoire EEPROM de 256 octets
– Les données peuvent être écrites plus de 1.000.000 fois
• mémoire de 368 octets de RAM
• Convertisseur A/D :
– 14 canaux
– résolution de 10 bits
• 3 timers/compteurs indépendants
• Timer chien de garde
• Module comparateur analogique avec
– Deux groupes de comparaison analogiques
– Référence de tension fixe (0.6V)
– Référence de tension programmable d'on-chip
• Commande de direction de sortie PWM
• Module USART amélioré
– Supporte RS-485, RS-232 et LIN2.0
– Détection automatique de débit
• Maître de Port série synchrone (MSSP)
– prend en charge le mode SPI et I2C
12/09/2022 FI-SICoM 30
Broches du microcontrôleur PIC16F887

12/09/2022 FI-SICoM 31
Broches du microcontrôleur PIC16F887

12/09/2022 FI-SICoM 32
Broches du microcontrôleur PIC16F887

12/09/2022 FI-SICoM 34
outils de développement

• L’environnement de développement
MPLAB
Séance de
« Prise en main de MPLAB »

ET

MIKROC
POUR LES PICs
12/09/2022 FI-SICoM 35
Les ports parallèles d'entrée sortie
Le 16F877 possède 5 ports différents :

le port A (6 broches)
le port B (8 broches)
le port C (8 broches)
le port D (8 broches)
le port E (3 broches)

ça fait 33 broches d’entrées-sorties (E/S) disponibles

Chaque port est associé à un registre de direction TRISx

- un bit à 1 --> I --> Input --> entrée -


- un bit à 0 --> O --> Output --> sortie –

Le courant absorbé ou fourni peut atteindre 25 mA

La majorité des broches sont multiplexées avec d'autres fonctions

12/09/2022 FI-SICoM 36
Le port A
C’est un port de 6bits (RA0 à RA5). RA6 et RA7
ne sont pas accessibles.
La ligne RA4 est partagée avec l'entrée TOCK1
du timer0,
Les autre lignes sont partagées avec les
fonctions
analogiques (CAN ),
Direction configurée dans TRISA (85h bank1),
Données accessibles dans PORTA (05h bank0).

12/09/2022 FI-SICoM 37
Les registres utilisés par le port A
En sortie, RA4 est une E/S à drain ouvert, pour l'utiliser comme sortie logique, il faut
ajouter une résistance de pull-up externe.

Il faut remarquer que la logique est inversée, si on envoie 0 sur RA4, l'interrupteur se
ferme et la LED s'allume. Si on envoie 1, l'interrupteur s'ouvre et la LED s'éteint.

Pour les utiliser les E/S en E/S numériques, il faut écrire '00000110'
dans le registre ADCON1

12/09/2022 FI-SICoM 38
Le port B
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 direction se fait à l'aide du registre


TRISB, positionner un bit de TRISB à 1 configure la
broche correspondante de PORTB en entré et
inversement.
Au départ toutes les broches sont configurées en entrée.

En entrée, la ligne RB0 appelée aussi INT peut


déclencher l’interruption externe INT.

En entrée, une quelconque des lignes


RB4 à RB7 peut déclencher l'interruption RBI.

Direction configurée dans TRISB (86h bank1),

Données accessibles dans PORTB(06h bank0).

12/09/2022 FI-SICoM 39
Le port C
N'existe que pour les boîtiers 28 et 40
broches,
Partagé avec les liaisons séries, les Timers
1,2 et les modules CCP, port bidirectionnel de 8
bits (RC0 à RC7).
Toutes les broches sont compatibles TTL.
Entrées à trigger de Schmitt,
Direction configurée dans TRISC (87h bank1),
Données accessibles dans PORTC (07h
bank0).

12/09/2022 FI-SICoM 40
Le port D
Le port D désigné par PORTD est un port bidirectionnel de 8
bits (RD0 à RD7). Toutes les broches sont compatibles TTL et
ont la fonction trigger de Schmitt en entrée.

Chaque broche et configurable en entrée ou en sortie à


l’aide du registre TRISD.

PORTD n’est pas implémenté sur tous les processeurs


16F87X, il est disponible sur le 16F877, le 16F874 et le 16F871

PORTD peut être utilisé dans un mode particulier appelé


parallèle slave port, pour cela il faut placer le bit PSPMODE
(bit 4) de TRISE à 1.
Dans ce cas les 3 bits de PORTE deviennent les entrées de
control de ce port (RE, WE et CS)

12/09/2022 FI-SICoM 41
Le port E
PORTE contient seulement 3 bits RE0, RE1 et RE2. Les 3 sont
configurables en entrée ou en sortie à l’aide des bits 0, 1 ou 2 du
registre TRISE.

PORTE n’est pas implémenté sur tous les processeurs 16F87X, il est
disponible sur le 16F877, le 16F874 et le 16F871

Les 3 bits de PORTE peuvent être utilisés soit comme E/S


numérique soit comme entrées analogiques du CAN.
La configuration se fait à l’aide du registre ADCON1.

Si le bit PSPMODE de TRISE est placé à 1, Les trois bits de PORTE
deviennent les entrées de control du PORTD qui (dans ce cas)
fonctionne en mode parallele Slave mode

A la mise sous tension (RESET), les 3 broches de PORTE sont


configurées comme entrées analogiques.

12/09/2022 FI-SICoM 42
 Remarques :

o Au reset, toutes les broches d'E/S TOR sont configurées

par défaut en entrées.

 C'est pour des raisons de sécurité …

o L'intensité maximale qu'une broche de sortie peut fournir

est de 25 mA.

 Permet de connecter une LED (avec une résistance)

directement sur une sortie du PIC.

12/09/2022 FI-SICoM 43
Structure d'un port d'entrée / sortie

 2 bascules D sur front


o La 1ère gère le
niveau à appliquer
en sortie (PORTx)
(uniquement orsque
la broche est
configurée en
sortie)
o La 2ème gère la
configuration de la
broche (TRISx

12/09/2022 FI-SICoM 44
Fonctionnement en entrée

 Circuit de gestion de la sortie «


déconnectée ». (sortie du buffer
en haute impédance …)
 Partie grisée
inopérante
 TRISx.n à 1 :
Lors de l’écriture dans le registre,
le front descendant du signal
« WR TRIS » (généré par
l'horloge interne du µC) permet de
placer la sortie /Q de le bascule D
à 0.

12/09/2022 FI-SICoM 45
 L'état appliqué sur la broche
d'entrée (X) se retrouve en
entrée du buffer 3 états.
 Cet état (X) reste « bloqué »
car le buffer 3 états est en
haute impédance ...
 Lors d’une opération de
LECTURE, actif à l’état haut,
l’état de l’entrée se retrouve sur
le bus de données pour être
stocké dans le registre PORTx.n
correspondant

12/09/2022 FI-SICoM 46
Fonctionnement en sortie
 Configuration de la broche en
sortie :
 « Data Bus » = 0 puis
un front descendant
est appliqué à
« WR TRIS ».
 La sortie /Q passe
donc à 1.
 La sortie du buffer 3
états à droite du
schéma est ainsi
validée.
 Si on souhaite mettre cette sortie
à«0»:
 « Data Bus » = 0 puis un
front descendant est
appliqué à « WR
PORT »
 La sortie de la bascule D
passe à 0

12/09/2022 FI-SICoM 47
Bilan sur les entrées / sorties TOR

On configure la broche respectivement en entrée ou en sortie en mettant le bit


TRISx.n à 1 ou 0. (x = A, B, C, D ou E et n = 0, 1, 2, 3, 4, 5, 6, 7)

En entrée, on lit l'état appliqué à la broche en lisant le bit PORTx.n

En sortie, on met la broche à 0 ou à 1 en écrivant dans le bit PORTx.n

 Remarques:
o Avec le compilateur CC5X, vous pouvez accéder soit à un registre
entier (8 bits), soit à un seul bit d'un registre.
o Exemples :
 PORTB = 0x08 ;
– Met à « 1 » le bit n° 3 et à « 0 » tout les
autres bits du registre PORTB.
 PORTB.3 = 1 ;– Met à « 1 » le bit n°3 du registre PORTB … et
c'est tout ! L'état des autres bits du registre PORTB n'est
pas modifié, contrairement à la commande précédente.

12/09/2022 FI-SICoM 48
Interfaçage avec un microcontrôleur en sortie

1er cas : 2ème cas :

LED active à l'état haut LED active à l'état bas


– Sortie à « 1 » – Sortie à « 1 »
● LED allumée ● LED éteinte
– Sortie à « 0 » – Sortie à « 0 »
● LED éteinte ● LED allumée

12/09/2022 FI-SICoM 49
Dimensionnement de la résistance
VD = 2V | VCC = 5V | I = 10mA

● 1er cas : ● 2ème cas :


– VOH = R1*I + VD1 – VCC = VOL+ R2*I + VD2
– VOH : tension à l'état haut de la – VOL : tension à l'état bas de la
sortie sortie
– R1 = (VOH – VD1) / I – R2 = (VCC - VOL– VD2) / I

12/09/2022 FI-SICoM 50
● LEDs du kit PICDEM2+ utilisé en TP
- Elles sont actives (allumées) pour
un niveau … haut !
- La résistance est de 470Ω
- Le courant qui circule dans les
LED est de … mA
- Un cavalier permet de
déconnecter les LED

12/09/2022 FI-SICoM 51
 Pour connecter plusieurs
LED sur une même sortie :
o En série
 Courant
identique
 Limitation vis-à-
vis de la
tension.
o En parallèle
 Tension
identique
 Limitation vis-
à-vis du courant
délivré par le
microcontrôleur

12/09/2022 FI-SICoM 52
● En utilisant un transistor

– Transistor bipolaire NPN (2N2222 par exemple)

– On a toujours VD = 2V et IC = 10mA

– VCC = R1*I + VD + VD + VCE VCE = 0.2V

– D’où R1 = (VCC – VD – VD – VCE) / I

– Pour la résistance R2 :

 Prenons β = 100 et un coeff de sur saturation

de 10

 IB = 10 * IC / β = 1mA

 VOH = R2*IB + VBE VBE = 0.7V

 D'où R2 = (VOH – VBE) / IB = (4.3 – 0.7) / 10−3

12/09/2022 FI-SICoM 53
En utilisant un transistor

– Jusqu'où peut-on aller comme ça ?

● Avec VCC = 12V, VD = 2V

et VCE = 0.2V

•5 LEDs max !

– On peut aller encore plus loin avec

un montage de ce type :

12/09/2022 FI-SICoM 54
•Interfaçage avec un microcontrôleur en entrée

Connexion d'un bouton poussoir


● Deux possibilités
•L'appui sur le BP est reconnu par un « 1
» logique
•L'appui sur le BP est reconnu par un «
0 » logique
● Valeur de la résistance de tirage
•Entre 1kΩ et 100kΩ
•Typiquement 10kΩ
12/09/2022 FI-SICoM 55
Règles de base :
oUne entrée ne doit jamais se trouver
en l'air.
oIl ne faut pas court-circuiter
l'alimentation !
oIl faut pouvoir appliquer un potentiel
de Vcc ou de 0V à l'entrée du PIC par
l'appui et le relâchement du BP.

12/09/2022 FI-SICoM 56
Le KIT propose 2 boutons
connectés sur RA4 et RB0.
Les boutons poussoir sont
connectés à la masse avec une
résistance de tirage de 4,7kΩ.
Le constructeur de la carte
Microchip a rajouté une résistance
de 470 Ω entre l’interrupteur et le
PIC.

12/09/2022 FI-SICoM 57
Le but de cette résistance est de
protéger le PIC d’une mauvaise
programmation. En effet, si vous placez la
broche RB0 en sortie en présentant un 1
logique (en sortie) et que l’interrupteur
est fermé, vous provoquez un (joli) court-
circuit.
La résistance de 470 Ω permet de
limiter le courant consommé par la sortie
RB0 et donc empêcher la destruction de
celle-ci.

12/09/2022 FI-SICoM 58
Principe de fonctionnement

Chaque port (A,B,C,D et E) est associé à 2 registres :


Registre de direction des données (TRISx)
TRIS : TRansfert Input Set
Sert à définir quelles broches sont des entrées et quelles broches
sont des sorties.
Exemples :
TRISA pour le port A
TRISB pour le port B …
Ce sont des registres de 8 bits.
Chaque bit est associé à une broche du port :
Bit n°0 associé à la broche 0
Bit n°1 associé à la broche 1
Bit n°2 associé à la broche 2
...
12/09/2022 FI-SICoM 59
 Registre de direction des données (TRISx)
 Pour chaque bit (associé à une broche) du registre :

 Exemple : TRISB = 0xF3

12/09/2022 FI-SICoM 60
12/09/2022 FI-SICoM 61
 Registre de données (PORTx)
o Exemples :
PORTA pour le port A
PORTB pour le port B, …
o Ce sont des registres de 8 bits
o Registre prévu pour faire soit une lecture d'entrée (lorsque
la broche associée a été configurée en entrée …), soit une
écriture de sortie (lorsque la broche associée a été
configurée en sortie ...)
 Registre de données (PORTx)
o Exemple : PORTB
 If (PORTB.1 == 1) {…}
 Permet de lire l'état de l'entrée appliquée sur la
broche n°1 du port B.
 PORTB.2 = 1;
 Permet d'appliquer un 1 logique en sortie sur la
broche 2 du port B.
12/09/2022 FI-SICoM 62
Description des registres des ports parallèles

 Deux registres 8 bits sont utilisés pour paramétrer un port.


 Le registre TRISx configure le sens de tranfert des données
du port bidirectionnel, un état logique 1 passe la ligne en entrée, et
un 0 passe la ligne en sortie.
 Le registre PORTx est destiné à recevoir une donnée envoyée
par le programme, celle-ci va affecter l'état des sorties du port,
configuré en sortie par son registre TRISx, un niveau logique 1
place la sortie à 5V, un niveau logique 0 place la sortie à 0V.
 Le registre PORTx peut aussi recevoir une donnée par ses
entrées à condition que son registre TRISx soit configuré en
entrée.
12/09/2022 FI-SICoM 63
Configuration des ports

Le chargement du registre TRISx d'un port, avec la valeur 255, passe


la totalité du port en entrée.
TRISA=255;
Le chargement du registre TRISx d'un port avec la valeur 0, passe la
totalité du port en sortie.
TRISA=0;
Le registre d'un port chargé avec la valeur 255, passe ses broches de
sorties à 5V, ou 0v si chargé avec la valeur 0.

PORTA=255; // les broches de sorties passent à 5V


PORTA=0; // les broches de sorties passent à 0V

12/09/2022 FI-SICoM 64
•Les bits des ports peuvent être aussi configurés individuellement avec
l'instruction Rxy .
•Le x indique le port A, B, C, ou D. Le y indique le numéro du bit à
modifier.
•Configuration du bit 3 du registe PORTx à 1, ceci place la broche
associée au bit 3 du port, à 5V.
RA3=1;
•Configuration du bit 3 du registe PORTx à 0, ceci place la broche
associée au bit 3 du port, à 0V.
RA3=0;
• Il est souvent utile de déterminer le niveau logique appliqué à une ligne
d'entrée d'un port, le code C suivant permet de lire le niveau logique
d'une entrée.

if(RA5==1) {// placer votre code ici};

• Lecture de l'état logique appliqué à la broche correspondant au bit 5, du


Port A (configuré en entrée).
• Si le niveau logique lu est égal à 1, il faut traiter les instructions entre
les accolades.
12/09/2022 FI-SICoM 65
Exemples de configurations des ports
Plusieurs types de notation en C ANSI, vous sont offerts pour configurer les
registres.
Le chiffre Décimal 255, donne en Hexadécimal 0xFF, et 0b11111111 en binaire.
Je vous conseille d'utiliser la notation binaire pour configurer les registres
TRISx, on visualise ainsi rapidement les sens de transfert, des lignes du port.
En langage C cela donne TRISx=0b11110000;
Le quartet de lignes supérieur du port sera en entrée et le quartet inférieur en
sortie.

 Configuration du port A, afin d'obtenir 5V sur la totalité des lignes de sorties


du port.
TRISA=0; // port A en sortie
PORTA=255; // Lignes de sorties à 5V;

12/09/2022 FI-SICoM 66
Configuration du port A, afin d'obtenir 0V sur la totalité des lignes de
sorties du port.
TRISA=0; // port A en sortie
PORTA=0; // Lignes de sorties à 0V;
 Configuration du bit 3 du port A, afin d'obtenir 5V en sortie.
TRISA=0; // bit 3 port A en sortie
RA3=1; // Ligne bit 3 en sortie à 5V

Configuration du bit 3 du port A, afin d'obtenir 0V en sortie.


TRISA=0; // bit 3 port A en sortie
RA3=0; // Ligne bit 3 en sortie à 0V

Configuration de la totalité du port A en entrée haute impédance.


TRISA=255; // port A en entrée
12/09/2022 FI-SICoM 67
Chargement du registre PORTx avec la valeur hexadécimale
0x41, en binaire 0100 0001

 Le registre TRISx est chargé avec 0, les lignes sont donc en


sorties.

PORTx=0b01000010;
TRISx=0;

12/09/2022 FI-SICoM 68
Application de tensions sur le port, correspondant au mot binaire
0100 0010, ce mot est automatiquement chargé dans le registre PORTx,
car le registre TRISx chargé avec le mot binaire
11111111, est configuré en entrée.
TRISx=0b11111111;

12/09/2022 FI-SICoM 69
Chargement du registre PORTx avec la valeur hexadécimale 0x9A, en binaire
1001 1010.
 Le registre TRISx est chargé avec la valeur hedadécimale 0xE2, en binaire
1110 0010.
 Cette configuration place les lignes Rx0, Rx2, Rx3, Rx4 en sorties, et les
lignes Rx1, Rx5, Rx6, Rx7
en entrées.
 Vous allez mesurer en sortie du port, le mot binaire 00011000 soit 0x18 en
hexadécimal.

PORTx=0b10011010;
TRISx=0b11100010;

12/09/2022 FI-SICoM 70
Particularités des ports

RA4 possède un transistor de sortie MOS a drain ouvert, donc il faut placer une
résistance (10k) de cette patte au 5v, pour avoir un niveau logique 1 correct.
Placer cette résistance seulement si la ligne RA4 est en sortie.
Le portA par défaut ou lors d'un reset est configuré en entrée analogique sur certain
PIC comme le 16F876, 16F877.
Il faut initialiser les bits PCFG1, PCFG2, du registre ADCON1 à 1 avec le code suivant:
ADCON1=6;
Le port B des PIC 16F876, 16F877 dispose de résistances de tirage au 5V.
Placer le bit RBPU à 0 pour activer les résistances, ou 1 pour les désactiver.
Les résistances sont désactivées lors d'un reset.
Les résistances fonctionnent seulement sur les lignes du port placées en entrées.
RBPU=0;// Résistances activées
RBPU=1;// Résistances désactivées

12/09/2022 FI-SICoM 71
STRUCTURE D’UN PROGRAMME EN MIKROC

Règles générale d’écriture en mikroC


Les instructions propres au langage mikroC doivent être écrites en minuscule
(void main(void)).
Les instructions particulières aux microcontrôleurs doivent être écrites en
majuscule (TRISB).
Les retours à la ligne et les espaces servent uniquement à aérer le code
Toutes instructions ou actions se terminent par un point virgule « ; ».

Exemple:

La structure la plus simple d'un programme en mikroC, c’est le


programme représenté dans le code source 1 (LED.c), qui nous
permettra de faire clignoter une LED connectée au PORTB (par
exemple bit 0 du PORTB) du microcontrôleur PIC avec une période de 2
secondes (1 seconde allumée et une seconde éteinte).
Accès individuel aux bits 1

MikroC vous permet un accès individuel dans les variables 8 bits (char

et unsigned short). En utilisant simplement le sélecteur (.) Suivi de l’un

des identifiants F0, F1, ..., F7. Être F7 le bit le plus significatif

Exemple:
PORTC.F0 = 1;
PORTD.F5 = 0;
PORTB.F7 = 1;

Les identifiants F0-F7 ne sont pas reconnus en minuscule.

REMARQUE: Un délai minimum de 2 microsecondes doit être respecté

entre les accès à deux bits.

12/09/2022 FI-SICoM 73
Entrée ou sortie
Si nous voulons configurer le port C avec l’affectation suivante:

RC0 Entrée
RC1 Entrée
RC2 Entrée
RC3 Entrée
RC4 Sortie
RC5 Sortie
RC6 Sortie
RC7 Sortie

Instructions possibles à utilise

TRISC = 0b’00001111’; o
TRISC = 0x0F; o
TRISC = 15;

12/09/2022 FI-SICoM 74
Delay_ms (délai logiciel)

Description: crée un délai logiciel en fonction du temps en millisecondes


(constant). La gamme de constantes applicables à la fonction dépend de la
fréquence de l'oscillateur. C'est une fonction interne; Le code est généré à
l'endroit où l'appel est effectué. L'appel de cette fonction ne compte donc pas
dans la limite des appels imbriqués

void Delay_ms(const time_in_ms)

Exemple:
Générer un délai de 1 seconde

Delay_ms(1000); /* Pause d’une seconde */

12/09/2022 FI-SICoM 75
Structure d'un programme en C (Boucle While)
// Définition des variables globales

// Définition des fonctions

void main(void)
{
// Définition des variables locales

// Configuration d'enregistrement (ressources et ports)

// cycle infini

while ( 1 )
{

// programme principal

}
}

12/09/2022 FI-SICoM 76
Structure d'un programme en C (Boucle for)
// Définition des variables globales

// Définition des fonctions

void main(void)
{
// Définition des variables locales

// Configuration d'enregistrement (ressources et ports)

// cycle infini

for ( ; ; )
{

// programme principal

}
}

12/09/2022 FI-SICoM 77
Structure d'un programme en C (Boucle do - while )
// Définition des variables globales

// Définition des fonctions

void main(void)
{
// Définition des variables locales

// Configuration d'enregistrement (ressources et ports)

// cycle infini

do
{

// programme principal

} while ( 1 )
}
12/09/2022 FI-SICoM 78
Éclairage d’une LED
Créez un programme qui allume et éteint une led située sur le terminal

RD7 du port D. Le temps d'allumage est de 1000 millisecondes et le

temps d'extinction est de 300 millisecondes.

L’algorithme

Définir le bit 7 du port D comme sortie de données

Allumage du led

Retard par logiciel de 1000 millisecondes.

Eteindre la led

Retard par logiciel de 300 millisecondes

Répétez l'étape 2
12/09/2022 FI-SICoM 79
Éclairage d’une LED (programme-1)

void main ( void )


{
TRISD.F7 = 0;
while( 1 )
{
PORTD.F7 = 1;
Delay_ms( 1000 );
PORTD.F7 = 0;
Delay_ms( 300 );
}
}

12/09/2022 FI-SICoM 80
Éclairage d’une LED (programme-2)

void main ( void )


{
TRISD = 0;
while( 1 )
{
PORTD = 0x80;
Delay_ms( 1000 );
PORTD = 0;
Delay_ms( 300 );
}
}

12/09/2022 FI-SICoM 81
LED clignotante
==============
Ce programme fait clignoter une LED connectée à la broche RB0 du PIC 16F887
Code-source 1. (LED.c)

void main( )
{
for(;;) //Boucle fin
{
TRISB=0; //Configuration du PORTB en sortie
PORT.F0; //RP0=0
Delay_Ms(1000); //Pause d’une seconde
PORTb.f0=1. //RP0=1
Delay_Ms(1000); //Pause d’une seconde
} //Fin de la boucle
}

12/09/2022 FI-SICoM 82
Ce programme fait clignoter d’une LED connectée au port RB0 d'un microcontrôleur PIC avec
l’intervalle d’une seconde. En utilisant les commandes de préprocesseur #define le
programme est devenu plus facile à suivre.

#define LED PORTB.0


#define ON 1
#define OFF 0
#define One_Second_Delay Delay_ms(1000)

void main()
{
TRISB = 0; // PORTB est configuré en sortie
for(; ;) // Boucle sans fin
{
LED = ON; // LED est allumée (ON)
One_Second_Delay; // Retard 1 seconde
LED = OFF; // LED est désactivée (OFF)
One_Second_Delay; // Retard 1 seconde
}
}

12/09/2022 FI-SICoM 83
Exemple 1. Chenille à LEDs

Dans ce projet les huit LEDs sont connectées à PORTC d'un microcontrôleur.
Lorsqu'une tension est appliquée au microcontrôleur (ou est réinitialisé), les LEDs
s'allument en alternance. Il y a le délai d’une seconde de sorte qu’une LED peut
être vu tourner sur ON et OFF.
Le schéma de principe du projet est illustré à la figure suivante.

12/09/2022 FI-SICoM 84
Chenille à LEDs
===============
Les huit LEDs sont connectées à PORTC du microcontrôleur 18f452. Lorsqu'une
tension est appliquée au microcontrôleur (ou est réinitialisé), les LEDs s'allument en
alternance.

void main()
{
unsigned char J = 1;
TRISC = 0; // PORTC est configure en sortie
for(;;) // Boucle sans fin
{
PORTC = J; // Envoyer J au PORTC
Delay_ms(100); // Pause 100 ms
J = J << 1; // Décalage à gauche J
if(J == 0) J = 1; // Si la dernière LED, allumer la 1ère LED
}
}

12/09/2022 FI-SICoM 85
12/09/2022 FI-SICoM 86
void main ( void )
{
TRISD.F7 = 0;
while( 1 )
{
PORTD.F7 = 1;
Delay_ms( 1000 );
PORTD.F7 = 0;
Delay_ms( 300 );
}
}

void main ( void )


{
TRISD = 0;
while( 1 )
{
PORTD = 0x80;
Delay_ms( 1000 );
PORTD = 0;
Delay_ms( 300 );
}
}
12/09/2022 FI-SICoM 87
Exercices proposés

 L'étudiant allumera et éteindra alternativement deux LED situées dans les bits
2 et 3 du port B. Les retards seront de 500 millisecondes (les deux). Utilisation
de l'allocation directe aux bits

 L'étudiant allume et éteint une led située dans le bit 5 du port C. Les retards
seront de 100 millisecondes et 2 secondes, respectivement. Utilisation de
l'allocation des octets

12/09/2022 FI-SICoM 88
Lumières séquentielles

1.Configuration du port en tant que sortie de données.

2.Envoi des premières données au port de départ.

3.Envoi de deuxièmes données au port de départ.

4.Envoi de troisièmes données au port de départ.

9.Envoi des dernières données au port de départ.

10.Retour à 2

12/09/2022 FI-SICoM 89
Lumières séquentielles

12/09/2022 FI-SICoM 90
Lumières séquentielles
void main(void)
{
TRISD = 0;
while ( 1 )
{
PORTD = 0b00000001; // Envoyer les premières données
Delay_ms(500);
PORTD = 0b00000010; // Envoyer les deuxièmes données
Delay_ms(500);
PORTD = 0b00000100; // Envoyer les troisièmes données
Delay_ms(500);
PORTD = 0b00001000;
Delay_ms(500);
PORTD = 0b00010000;
Delay_ms(500);
PORTD = 0b00100000;
Delay_ms(500);
PORTD = 0b01000000;
Delay_ms(500);
PORTD = 0b10000000;
Delay_ms(500);
}
}

12/09/2022 FI-SICoM 91
L'étudiant enverra une séquence de données différente via le port B,
en utilisant des retards logiciels de différentes durées, avec des
incréments de 100 millisecondes chacun.

L'étudiant enverra la séquence de données via le port A, en utilisant


des retards logiciels d'une durée de 800 millisecondes.

100001
010010
001100
010010
100001

12/09/2022 FI-SICoM 92
SYSTEMES D’ENTREE DES DONNEES

L'interaction de l’utilisateur avec les systèmes à microcontrôleurs


nécessite des systèmes d’entrée de données. Pour ce faire, on utilise des
périphériques tels que des interrupteurs, des claviers et même des claviers
PS2 utilisés par les ordinateurs de bureau.

Pour le traitement des boutons et l’élimination des rebondissements,


le compilateur MikroC PRO dispose d’une bibliothèque Button, qui peut être
trouvé dans la palette ou l'onglet des bibliothèques.
Cette bibliothèque contient la seule fonction : unsigned short Button
(unsigned short *port, unsigned short pin, unsigned short time, unsigned
short active_state) ;

12/09/2022 FI-SICoM 93
Installation des boutons peut être effectuée de deux manières, actif à
l’état haut ou actif à l’état bas, la figure suivante montre comment configurer les
deux possibilités :

12/09/2022 FI-SICoM 94
La décision d'utiliser l'activation à l’état haut ou bas, dépend du
développeur qui doit analyser la manière la plus simple au moment de la conception.
On rappelle que dans tous les cas l'activation finale peut être inversée avec la
fonction de la bibliothèque

12/09/2022 FI-SICoM 95
Pour analyser et étudier l'utilisation decette bibliothèque, on crée un
nouveau projet avec les composants : PIC 16F877A, BUTTON, RES,et LED-RED. Le
circuit correspondant dans ISIS est le suivant :

Le programme respectif du microcontrôleur est le suivant :


void main( void )
{
TRISB=0xF0; //Configuration des ports.
PORTB=0;
while(1) //Boucle infinie
{
if(Button(&PORTB, 7, 100, 0)) //Test de d’état du bouton sur RB7, activé à l’état bas
PORTB.F0=1; // Allumer le voyant si le bouton est actif.
else
PORTB.F0=0; //Eteindre la LED s’il est relâché.
}
}

12/09/2022 FI-SICoM 96
A l’exécution de la simulation, la LED doit s'allumer lorsque le bouton est pressé, et
s’éteindre lorsqu'il est relâché.
L'exemple suivant commute l’état de la LED :

void main( void )


{
TRISB=0xF0; //Configuration des ports.
PORTB=0;
while(1) //Boucle infinie.
{
if(Button(&PORTB, 7, 100, 0)) //Test de l’état actif du bouton.
{
if( PORTB.F0==1 ) // Commutation de l’état de la LED.
PORTB.F0=0;
else
PORTB.F0=1;
//Attente que le bouton soit no actif.
while( Button(&PORTB, 7, 100, 0) );
}
}
}

12/09/2022 FI-SICoM 97
Port en entrée: Bouton poussoir

U1
1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
16 D1
2
RC1/T1OSI/CCP2
17
R1
RA0/AN0/ULPWU/C12IN0- RC2/P1A/CCP1
3 18
RA1/AN1/C12IN1- RC3/SCK/SCL 10
4 23 LED-GREEN
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24
RA3/AN3/VREF+/C1IN+ RC5/SDO
6 25
RA4/T0CKI/C1OUT RC6/TX/CK
7 26
RA5/AN4/SS/C2OUT RC7/RX/DT
14
RA6/OSC2/CLKOUT
13 19
RA7/OSC1/CLKIN RD0
20
33
RD1
21 D2
34
RB0/AN12/INT RD2
22
R2
RB1/AN10/C12IN3- RD3
35 27
RB2/AN8 RD4 10
36 28 LED-GREEN
RB3/AN9/PGM/C12IN2- RD5/P1B
37 29
RB4/AN11 RD6/P1C
38 30
RB5/AN13/T1G RD7/P1D
39
RB6/ICSPCLK
40 8
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7 D3
R4 R3
PIC16F887
10 10
LED-GREEN

R5
10

R6
10

12/09/2022 FI-SICoM 98
void main()
{
TRISC=0X00;
PORTC=0X00;
TRISD=0XFF;
for(;;)
{
if(PORTD.B0==0) PORTC.B0=1; else PORTC.B0=0;
if(PORTD.B1==0) PORTC.B1=1; else PORTC.B1=0;
if(PORTD.B2==0) PORTC.B2=1; else PORTC.B2=0;
}
}

12/09/2022 FI-SICoM 99
bit a1,a2,a3;

void main()
{
TRISC=0X00;
PORTC=0X00;
TRISD=0XFF;
a1=a2=a3=0;
for(;;)
{
if(PORTD.B0==0) {a1=~a1; delay_ms(100);}
PORTC.B0=a1;
if(PORTD.B1==0) {a2=~a2; delay_ms(100);}
PORTC.B1=a2;
if(PORTD.B2==0) {a3=~a3; delay_ms(100);}
PORTC.B2=a3;
}
}

12/09/2022 FI-SICoM 100


Systèmes à microprocesseurs

Les Interruptions
Généralités sur les interruptions

Une interruption est un arrêt temporaire de l'exécution normale du


programme principal par le microprocesseur afin d'exécuter un autre
programme (appelé routine d'interruption ou programme d'interruption).

Ce programme d'interruption va permettre de gérer l'évènement qui


a provoqué cette interruption.

Tous les circuits périphériques (Timer0, Timer1, Timer2……) contenus


dans le PIC sont susceptibles de générer une interruption.
Généralités sur les interruptions

On distingue deux types d’interruptions :


Les interruptions externes, qui sont déclenchées lorsqu’un
événement extérieur se produit tels que le changement d’état d’une
entrée destinée à l’interruption.
Les interruptions internes, qui sont déclenchées par le déroulement
du programme tel que le résultat d’un calcul ou le débordement d’un
Timer.
Généralités sur les interruptions
Généralités sur les interruptions

Quand l’interruption se produit :

Le microcontrôleur finit l’instruction en cours (l’instruction en

assembleur, pas en C)

Sauvegarde l’adresse suivante du programme principal

Sauvegarde du contexte (à faire par le programmeur)

Exécute le programme lié au périphérique demandant l’interruption.

Récupération du contexte (à faire par le programmeur)

Retour au programme principal à l’adresse suivante mémorisée.


Vecteur(s) d'interruptions

Comme pour le reset, il existe une

adresse vers laquelle va se diriger le

système lorsqu'il y a une interruption

(on l'appelle également vecteur

d'interruption).

Cette adresse est l'adresse 0x0004

Il faut donc placer le sous-programme

d'interruption à cette adresse


Bits de validation et flag associés
Le pic 16F887 dispose de 17 sources d'interruptions.

Pour chaque source :

•1 bit de validation (xxxIE)

oInterrupt Enable (Validation de l'IT)

•1 flag ou drapeau en français (xxxIF)

oInterrupt Flag (Drapeau de l'IT)

Ces 34 bits sont accessibles dans les registres INTCON, PIE1, PIE2,

PIR1 et PIR2.

Exemple du Timer 0 : T0IE et T0IF


Bits de validation et flag associés
Registres du PIC 16F887 liés aux interruptions

Au reset, tous ces bits sont placés à zéro (sauf le flag RBIF) ce
qui implique qu’aucune interruption n'est validée et qu’aucun
flag n'est levé.
Bits de validation et flag associés
Masquage des interruptions
● Toutes ces interruptions sont des interruptions masquables.

● Le bit GIE du registre INTCON (page 33 de la datasheet)

permet de valider ou d’invalider toutes les interruptions.

Au reset, ce bit est placé à 0, dévalidant ainsi toutes les interruptions.


Priorités des interruptions

Une interruption peut elle interrompre une autre interruption ?


NON !
Où mettre le programme d'IT ?
Déclaration du programme d'interruption

Toute interruption est gérée à l’aide de 3 bits :


Un bit indicateur ou drapeau (Flag bit). Ce bit est mis à 1 lorsque
l’interruption
correspondante survient.
Un bit d’activation (Enable bit). Ce bit permet d’activer ou de
désactiver l’interruption correspondante.
Un bit d’activation globale (Global Enable bit). Ce bit permet
d’activer ou de désactiver toutes les interruptions.
Déclaration du programme d'interruption

Ces bits sont regroupés suivant le microcontrôleur cible dans des

registres appelés registres de configuration des interruptions tels que :

INTCON, PIE1, PIE2, PIR1 et PIR2. Le nombre de sources d’interruptions

dépend du microcontrôleur utilisé.

MikroC, le sous-programme d’interruption est déclaré en tant


En MikroC

que fonction avec le nom spécial « Interrupt ». Cette fonction s’exécute

automatiquement en réponse aux évènements déclencheurs des

interruptions activées par l’utilisateur.


REGISTRE DE CONFIGURATION DES INTERRUPTIONS

Le registre INTCON (INT


INTerrupt CON
CONtroller) est le registre principal de
contrôle et de gestion des interruptions.
Suivant le type du microcontrôleur donc du nombre de sources
d’interruptions, le registre INTCON est parfois accompagné par
d’autres registres tels que (PIE, PIR1, etc.) pour gérer la totalité des
sources d’interruptions disponibles.

Le registre INTCON est parfois différent d’un PIC à un autre. Il est
impératif de revenir au document constructeur pour chaque type de
microcontrôleur.
Bit 7: GIE = Global Interrupt Enable bit
1 = Autorise toutes les interruptions non masquées par leur bit individuel.
0 = Désactive toutes les interruptions.

Bit 6 (PIC16F87x): PEIE = Peripheral Interrupt Enable bit.


1 = Autorise les interruptions causées par les périphériques non masqués par leur bit
individuel dans les registres PIE1 et PIE2 (PIE : Peripheral Interrupts Enable)
0 = Désactive les interruptions causées par les périphériques.

Bit 5: T0IE = Timer TMR0 Overflow Interrupt Enable bit.


1 = Autorise l’interruption du Timer TMR0.
0 = Désactive l’interruption du Timer TMR0.

Bit 4: INTE = RB0/Int Interrupt Enable bit.


1 = Autorise l’interruption sur la broche RB0.
0 = Désactive l’interruption sur la broche RB0.
Bit 3: RBIE = RB Port Change Interrupt Enable bit.
1 = Autorise l’interruption par changement d’état du Port B (RB4 à RB7).
0 = Désactive l’interruption par changement d’état du Port B (RB4 à RB7).
Bit 2: T0IF = Timer TMR0 Overflow Interrupt Flag bit.
Ce bit est un indicateur ou drapeau (Flag); il est mis à 1 si une interruption est
générée par le débordement du TMR0.
1 = Le Timer a débordé.
0 = Le Timer n’a pas débordé.
Bit 1: INTF = RB0/Int Interrupt Flag bit.
1 = Une interruption sur la broche RB0 est survenue.
0 = Pas d’interruption sur la broche RB0.
Bit 0: RBIF = RB Port Change Interrupt Flag bit. Ce drapeau doit être remis à zéro
par leprogramme.
1 = Quand au moins une entrée du port B (de RB4 à RB7) a changé d’état.
0 = Aucune entrée de RB4 à RB7 n’a changé d’état.
EXEMPLE D’APPLICATION

 Le programme principal doit faire clignoter la Led avec temporisation = 30ms.

 Si l’interruption INT arrive (appuie sur BP) alors comptage de 0 à 9 sur

l’afficheur BCD 7 segments puis retour au programme principal.

 Donner le programme complet ( SPI et PP).


Cette interruption est provoquée par un changement d’état sur l’une des entrées

RB0 à RB7 du port B, le front n’a pas d’importance. Les bits associés sont RBIE

(validation) et EBIF (drapeau).

Le changement d’état sur la broche en question provoque une interruption.

Pour autoriser l’interruption sur la broche Rbi le bit i du registre IOCB doit être

mis à 1.

12/09/2022 FI-SICoM 121


C’est une entrée qui d’éclanche une interruption si un front descendant ou

montant arrive sur RB0.

La nature du front est programmée par le bit INTEDG du registre

OPTION_REG ; 1 = montant, 0 = descendant.

Cette interruption est provoquée par un changement d’état sur l’entrée RB0 du

port B quand elle est programmée en entrée.

Elle est gérée par son bit de validation INTE et son drapeau INTF.

12/09/2022 FI-SICoM 122


Programme Principal
void main()

{
ANSEL = 0;
ANSELH = 0;
TRISD.B7=0;

TRISC=0;
PORTC=0;
while(1)
{
PORTD.B7=!PORTD.B7;
delay_ms(100);
}
PORTC=0;
}
void main()

{
ANSEL = 0;
ANSELH = 0;
TRISD.B7=0;
INTCON.GIE=1;
INTCON.INTE=1;
TRISC=0;
PORTC=0;
while(1)
{
PORTD.B7=!PORTD.B7;
delay_ms(100);
}
PORTC=0;
}
Programme d’Interruption Programme Principal
void interrupt() void main()

{ {
int i; ANSEL = 0;
for(i=0;i<10;i++) ANSELH = 0;
{ TRISD.B7=0;
PORTC=i; INTCON.GIE=1;
delay_ms(100); INTCON.INTE=1;
} TRISC=0;
PORTC=0;
PORTC=0; while(1)
} {
PORTD.B7=!PORTD.B7;
delay_ms(100);
}
PORTC=0;
}
Programme d’Interruption Programme Principal
void interrupt() void main()

{ {
int i; ANSEL = 0;
for(i=0;i<10;i++) ANSELH = 0;
{ TRISD.B7=0;
PORTC=i; INTCON.GIE=1;
delay_ms(100); INTCON.INTE=1;
} TRISC=0;
INTCON.INTF=0; PORTC=0;
PORTC=0; while(1)
} {
PORTD.B7=!PORTD.B7;
delay_ms(100);
}
PORTC=0;
}
Les Timers du
Pic-16F887
en MikroC
Présentation du Timer
Les Timers/compteurs sont des périphériques de gestion de temps. Ils permettent

des réaliser

les fonctions suivantes :

- comptage des évènements

- synchronisation des signaux

- fixer le débit d’une liaison série synchrone ou asynchrone

- génération des événements périodiques (échantillonnage des signaux

analogiques, rafraichissement des afficheurs multiplexés …)

- génération des signaux périodiques (carré, MLI …)

- mesure de temps
Fonctionnement du Timer
Les timers sont des compteurs formés généralement d’un pré-diviseur suivi d’un

registre compteur de 8 ou 16 bits. L’entrée d’horloge peut être interne (mode

timer) ou externe (mode compteur d’événements). Lorsque le registre compteur

atteint sa valeur maximale et repasse à 0, un bit indicateur (flag) sera positionné et

une interruption pourra être générée, informant ainsi la CPU du débordement du

timer. Il faut bien noter que le programmeur devra remettre à zéro cet indicateur

après chaque débordement.

Le microcontrôleur PIC16F887 dispose de trois timers appelés Timer0, Timer1 et

Timer2
Fonctionnement du Timer
Elément essentiel : Compteur qui s'incrémente à chaque front montant du signal
qui lui est appliqué
:
Lorsque le compteur dépasse la valeur maximale qu'il peut contenir (par exemple :
256 pour un compteur sur 8 bits), un drapeau (flag en anglais) se lève.

Ce drapeau a pour but d'indiquer au programme que le compteur a débordé (c'est à dire
qu'il a fini de compter). De la même manière que pour la boite aux lettres, c'est au
programme de rebaisser le drapeau pour recommencer un cycle de comptage (ça ne se fait
pas tout seul !).
1. Principe de fonctionnement

•Rôle : Réaliser une temporisation

•Élément essentiel : Compteur qui s'incrémente à chaque front montant du

signal qui lui est appliqué :


1. Principe de fonctionnement

•Lorsque le compteur dépasse la valeur maximale qu'il peut contenir (par exemple:
256 pour un compteur sur 8 bits), un drapeau (flag en anglais) se lève.

•Ce drapeau a pour but d'indiquer au programme que le compteur a débordé


(c'est à dire qu'il a ”fini” de compter).
•De la même manière que pour la boîte aux lettres, c'est au programme de
rebaisser le drapeau pour recommencer un cycle de comptage (ça ne se fait
pas tout seul !).
2. Méthodes de configuration

•Un Timer doit pouvoir compter un temps défini par le programme (par exemple
1ms, 10ms, 50ms, etc).
•Pour cela, 2 paramètres peuvent être modifiés :
La fréquence du signal appliqué au compteur
Le compteur s'incrémentera ainsi plus ou moins vite.
Le nombre d'impulsions à compter
Le drapeau se lève toujours lorsqu'il y a débordement, on peut
donc faire partir le compteur d'une valeur non nulle pour
réduire le temps de comptage.
•Modification de la fréquence du signal appliqué au compteur : le pré-diviseur
(prescaler en anglais)
Exemple : pour compter 4 fois moins vite

Modification du nombre d'impulsions à compter


Si le compteur démarre à 0, il mettra beaucoup de temps à atteindre sa
valeur maximale.
Pour réduire le temps de comptage, on peut donc charger une valeur
initiale non nulle dans le compteur.
Exemple : Valeur initiale égale à 250
3. Les Timers du PIC 16F887
•Composition générale d'un Timer sur un microcontrôleur PIC :

•Calcul du temps mis par le Timer pour faire lever son drapeau :

•Les Timers sont internes au microcontrôleur.

•Le 16F887 en compte 3 :

oTimer0 et Timer2 sur 8 bits

oTimer1 sur 16 bits


Composition du Timer0
C’est un compteur 8 bits qui peut compter (de 0 à 255) :

- soit les impulsions de l’horloge via un prédiviseur : Mode Timer

- soit des impulsions externes, via la broche RA4 : Mode compteur

Mode Timer

Timer0 est incrémenté à chaque cycle instruction ( Fosc/4), en considérant le

prédiviseur avec un rapport de 1.

Mode Compteur

Timer0 est alors incrémenté à chaque front montant ou descendant sur la

broche RA4
Composition du Timer0

Prédiviseur

Il est formé d’un pré-diviseur programmable (Programmable Prescaler) suivi d’un

registre compteur 8 bits (TMR0). Un prescaler ou prédiviseur permet de diviser la

fréquence de comptage. Il est partagé entre le Watchdog et TMR0


Composition du Timer0

Le pré-diviseur peut prendre une valeur parmi la liste suivante : 1, 2, 4, 8, 16, 32,
64, 128 ou 256.

 La valeur initiale peut prendre n'importe quelle valeur entière comprise entre 0
et 255.
Calcul du temps maximum

 Pour que le drapeau se lève le plus tard possible, il faut que la fréquence du signal
applique au compteur soit la plus faible possible. Il faut donc configurer le pré-diviseur le
plus grand : 256.

 Il faut également faire démarrer le compteur avec la valeur la plus petite possible pour
qu'il compte le nombre d'impulsion le plus grand : valeur initiale = 0.
Calcul d'un temps de 10 ms
Registre de configuration du Timer0 : OPTION_REG
Registres associé au Timer0:
•TMR0 : c'est le registre de comptage. C'est donc dans ce registre que
nous allons rentrer la valeur de départ de notre compteur.

• INTCON seuls les bits 7, 6, 5 et 2 sont utiles pour le Timer0 (ce sont les
seuls non grisés). Dans ce chapitre, nous ne nous intéresserons qu'au bit 2
appelé T0IF et qui correspond au flag permettant de tester la fin du
comptage.

• OPTION_REG : Nous venons de le voir ...


•Inscription OPTION_REG
12/09/2022 FI-SICoM 146
Lorsque le bit PSA est mis à 0, le pré-détartreur est assigné à timer / counter

Timer0, comme indiqué dans la figure suivante.


Lorsque le bit PSA est réglé sur 1, le pré-détartreur est assigné à la temporisation

du chien de garde comme indiqué dans la figure suivante.


En dehors de ce qui précède, il convient de noter ce qui suit:

 En affectant le prescaler au timer / compteur, le prescaler sera mis à 0 avec


n'importe quelle écriture dans l'enregistrement TMR0.
 En affectant le prescaler au chien de garde, le WDT et le prescaler seront mis à
0 avec l'instruction CLRWDT.
 Lors de l'écriture dans le registre TMR0, utilisé comme temporisateur, le
comptage des impulsions n'est pas démarré immédiatement, mais avec le retard
de deux cycles d'instructions. Par conséquent, il est nécessaire d'ajuster la
valeur écrite dans le registre TMR0.
 Lorsque le microcontrôleur est mis en mode veille, l'oscillateur d'horloge
s'éteint. Le débordement ne peut pas se produire puisqu'il n'y a pas
d'impulsions à compter. C'est la raison pour laquelle l'interruption de
débordement TMR0 ne peut pas "réveiller" le processeur en mode inactif.
 S'il est utilisé comme compteur d'horloge externe sans pré-détartreur, la durée

d'impulsion minimale ou le temps mort entre deux impulsions doit être 2 Tosc +

20 nS (Tosc est la période du signal d'horloge de l'oscillateur).

 Si elle est utilisée comme compteur d'horloge externe avec pré-détartreur, la

durée d'impulsion minimale ou le temps mort entre deux impulsions est

seulement de 10 nS.

 L'enregistrement pré-scalaire 8 bits n'est pas disponible pour l'utilisateur, ce qui

signifie qu'il n'est pas possible de le lire ou de l'écrire directement.

 Lors de la modification de l'affectation du pré-détartreur du temporisateur 0 au

temporisateur de surveillance, il est nécessaire d'exécuter la séquence

d'instructions suivante écrite en assembleur pour empêcher le redémarrage du

microcontrôleur:
EXEMPLE.1

Dans cet exemple la minuterie, sur la base de registre TMR0, est utilisée

comme un compteur. L'entrée de comptage est reliée à un bouton-poussoir Input

de sorte que toute pression sur Input provoque TMR0 à compter une impulsion.

Lorsque le nombre d'impulsions correspond au nombre stocké dans le registre

nommé TEST, la valeur logique 1 (5V) apparaît sur le pin3 de PORTC. Cette

tension active une LED.


void main()
{
char TEST = 5; // Constante TEST = 5
enum sortie {RELAI = 3}; // Constante RELAI = 3

PORTA = 0; // Initialisation du porte A


TRISA = 0xFF; // Porte A est configuré en entré
PORTD = 0; // Initialisation du PORTC
TRISD = 0b11110111; /* Broche 3 du PORTC3 est configuré en
sortie*/
OPTION_REG.F5 = 1; /* Conteur TMR0 reçoit des impulsions
par la broche RA4 * /
OPTION_REG.F3 = 1; // Taux de prédiviseur est de 1:1
TMR0 = 0; // Initialisation du compteur TMR0
do
{
if (TMR0 == TEST) /* Est-ce que le nombre d’impulsion TMRO
est égale à constante TEST? */
(PORTD.RELAI = 1); /* Nombre est égale à TEST. La broche RD3
est en 1(RELAIS est activé) */
}
EXEMPLE.2

Dans l'exemple précédent, le microcontrôleur ne fait rien entre des impulsions de


comptage en utilisant des boucles sans fin. Ces déchets du temps est un luxe
inadmissible et par conséquent une autre méthode doit être appliquée.

Une fois que le registre TMR0 est ’’ trop-plein’’ le routin d’interruption


incrémente automatiquement la variable cnt par 1. Lorsque sa valeur atteint
400, le PORTB est incrémenté de 1. L'ensemble de la procédure est ’’masqué’’,
qui permet au microcontrôleur de faire autre chose.
unsigned cnt;
Void interrupt()
{
cnt++; /* Interruption cause l’incrémentation par 1 de la variable cnt*/
TMR0 = 100; // Valeur initiale du TMR0
INTCON = 0x20; // Bit T0IE est positionné à 1, bit T0IF est en 0
}
void main()
{
OPTION_REG = 0x84; // Prédiviseur pour TMR0
ANSEL = 0; // Toutes les broches E/S sont configuré en digitale
ANSELH = 0;
TRISC = 0; // PORTB est configuré en sortie
PORTC = 0x0; // Initialisation du PORTB
TMR0 = 100; // TMR0 conte de 100 à 255
INTCON = 0xA0; // Interruption par TMR0 est autorisés
cnt = 0; // Variable cnt est initialisée à 0
do
{ // Incrémenter port B après 400 interruptions
PORTB = PORTB++; // Incrémenter PORTB par 1
cnt = 0; // Initialiser la variable cnt
}
} while(1);
}
Le Timer2 du 16F887

 Il est légèrement différent du Timer 0 puisque le début de comptage est en

principe 0x00 et que la fin de comptage est la valeur à entrer.

 Il possède comme le Timer 0 un pré-compteur fixe et un pré-compteur

variable (3 valeurs possibles : 1, 4 et 16). C'est aussi un compteur 8 bits.


•Calcul de la durée de comptage.

•Durée de comptage max :

 Originalité de ce Timer :
 Le flag ne se lève pas systématiquement à chaque fin de
comptage.
o Existance d'un post-compteur.
o Ce post-compteur peut prendre chaque
valeur entière entre 1 et 16.
 Exemple pour un post-compteur de 4:
•La temporisation max de ce Timer est donc :

TMAX = 16 * 4,096 ms soit 65,536 ms

•La formule permettant de calculer la durée de la temporisation est donc :


Timer2
void main()
{
ANSEL=0;
ANSELH=0;
TRISB=0;
PORTB=0;
T2CON=0b00000111;
PR2=10;
for(;;)
{
PORTB=TMR2;
}
}
char a,b;
void interrupt()
{
if(PIR1.TMR2IF)
{
a++; if(a==255) {a=0; b++;}
}
PIR1.TMR2IF=0;
}

void main()
{
ANSEL=0;
ANSELH=0;
TRISB=0;
PORTB=0;
T2CON=0b00000111;
INTCON=0b11000000;
PIE1.B1=1;
PR2=255;
for(;;)
{
PORTB=b;
}
12/09/2022 FI-SICoM 167
}
12/09/2022 FI-SICoM 168
Le Timer1 du 16F887
 Particularités de ce Timer 1:

 Principe de fonctionnement similaire au Timer0.

 Le pré-compteur ne peut prendre que quatre valeurs : 1, 2, 4 ou 8.

 Le compteur est un compteur 16 bits :

o Registre de comptage composé de deux registres de 8 bits :


TMR1H et TMR1L
 Fonctions particulières des Timers

 Les Timers 0 et 1 peuvent être utilisés en compteur d’événements


extérieurs.

 Exemples :

o Compteur de pièces dans une machine industrielle

o Affichage de la vitesse d’un véhicule

 Timer 0:

 Signal à appliquer sur la broche RA4/T0CKl


 Timer 1 en compteur d'évènements

 La broche du PIC associée au Timer 1 est la ligne RC0/T1OSO/T13CKI :


La ligne RC1 / T1OSI est aussi associée au Timer 1, mais ne joue pas de rôle
dans le comptage d'événements extérieurs.

Compte tenu de la remarque ci-dessus, il faut déconnecter la ligne RC1 /


T1OSI en invalidant la porte logique inverseuse.

bit T1OSCEN = 0
 Timer 1 associé à un quartz

 Il est possible de connecter un quartz sur le Timer 1 et de compter les


impulsions de celui-ci pour générer des temps plus précis comme par exemple
pour créer une horloge de secondes, minutes, heures ou un chronomètre.

 Très utile pour gérer le mode sommeil du micro-controleur.

 En général, on prend un quartz dit d'”horloger” de 32768 Hz (on divise


ensuite par 215 pour avoir 1s)

T1OSCEN = 1
void main()
{
ANSEL=0;
ANSELH=0;
TRISB=0;
PORTB=0;
T1CON=0b00110101;
for(;;)
{
PORTB=TMR1L;
}
}
char a;
void interrupt()
{
if(PIR1.TMR1IF==1)
{
a++;
}
PIR1.TMR1IF=0;
}

void main()
{
ANSEL=0;
ANSELH=0;
TRISB=0x00;
PORTB=0;
T1CON=0b00000101;
INTCON=0b11000000;
PIE1=0b00000001;
for(;;)
{
PORTB=a;
}
}
void main()
{
ANSEL=0;
ANSELH=0;
TRISB=0;
PORTB=0;
TRISC.B1=1;
T1CON=0b00010111;
TMR1L=0;
for(;;)
{
PORTB=TMR1L;
}
}
Le module de

génération de signaux

MLI (PWM
PWM))
Presentation

•Un signal MLI (Modulation de Largeur d'Impulsions) ou PWM en anglais


(Pulse Width Modulation) est un signal dont le rapport cyclique varie.
En général,
•les applications les plus courantes travaillent à fréquence fixe :
Alimentation à découpage, variateur de vitesse et d'une manière
générale un grand nombre de dispositifs d'électronique de puissance.

•Autre application : conversion numérique – analogique


C’est une manière simple et efficace de générer une tension
analogique avec un microcontrôleur. Peu d’entre eux sont en effet
équipés d’un convertisseur numérique analogique.
Le principe est de générer un signal logique (valant 0 ou 1), à
fréquence fixe mais dont le rapport cyclique est contrôlé
numériquement. La moyenne du signal de sortie est égale au rapport
cyclique : il suffit donc de mettre un filtre pour obtenir la valeur
analogique recherchée.
•Les niveaux de tensions générés par le micro-contrôleur sont celles
de son alimentation (en général 0 ~ 5V), mais la fréquence et le
rapport cycliques sont configurables/variables.
Ressources matériels

Que faut-il utiliser pour générer un tel signal ?

Le micro-contrôleur PIC 16F887 dispose de deux modules

appelés ”CCP1” et ”CCP2”

CCP : Capture / Compare / PWM


CCP

En fonction de son mode d'utilisation, le module CCP1 ou CCP2

utilise le Timer 1 ou 2

oUn module CCP est forcément lié à un Timer


Principe de fonctionnement

La génération d'un signal MLI se fait en deux temps :

On utilise un compteur qui fixe la fréquence du signal à générer.

On compare en permanence la valeur du compteur à une valeur fixe

qui permet de définir le rapport cyclique


Configuration des modules CCP

Comme nous l'avons vu précédemment, nous pouvons décomposer le


problème en deux parties distinctes :
Configuration de la fréquence de la PWM
oCette tache est assurée par le Timer 2
Configuration du rapport cyclique
oCette tache est assurée par le module CCP
Les signaux générés seront sortis sur les broches RC1(pour le module
CCP2) et RC2 (pour le module CCP1) du microcontrôleur PIC.
Si les deux modules CCP (CCP1 et CCP2) sont utilisés en même temps pour
générer deux signaux PWM, ceux-ci auront la même fréquence.
C'est normal car chacun d'eux doit utiliser le Timer 2 pour configurer
la fréquence ...
•La documentation du constructeur nous donne:

•Pour générer un signal PWM, il faudra donc utiliser le Timer 2.


C'est donc ce compteur qui fixera la fréquence du signal.
•La valeur de comparaison, qui permet de configurer le rapport
cyclique, est fixée dans un registre du module CCP1 (ou CCP2).
•C'est donc ce registre qui est comparé en permanence au registre de
comptage du Timer 2.
Timer 2:
 Formule permettant de calculer le temps de comptage:

 Cette formule est similaire à celle donnée dans la documentation

 Il n'y a que 2 registres à configurer:


-T2CON

12/09/2022 FI-SICoM 190


-T2CON

12/09/2022 FI-SICoM 191


-et PR2

•Exemple
On désire créer un signal à 400Hz.
Il faut donc créer une temporisation avec le Timer 2 de 2,5ms
( T = 1 / F = 1 / 400).
Avec la formule ci-dessous :

•Plusieurs possibilités s’offrent à nous:


Nous prendrons celle laissant le plus de choix possible pour le rapport
cyclique.
Pour cela nous allons prendre pour PR2 la valeur la plus grande possible.
Soit un précompteur de 16, et une valeur de PR2 de 156.
12/09/2022 FI-SICoM 192
Exemple de programme
PWM
Duty Cycle = Ton/(Ton + Toff) = (Valeur % ) * (255)
Si on veut un rapport cyclique de 50%
Valeur% = 50/100 = 0.5
Rapport cyclique = (0.5) * (255) = 127.5 ---> 128

Vout = Duty Cycle * Voltage


Period Registre = ( (1/Frequired ) Fosc / 4 * prescaler)) -1

PWM Period = (PR2 +1) * 4 * (1/Fosc )*(Prescaler)


void main()
{
trisc = 0; // C2 en sortie pour PWM
PR2 = 124; //charger Registre Période

// prescaler 1:16
T2CKPS1_bit = 1;
T2CKPS0_bit = 1;

PWM1_Set_Duty(127); // Charger Rapport cyclique

PWM1_Start();

}
void main()
{
trisc = 0; // C2 en sortie pour PWM
PR2 = 249; //charger Registre Periode

// prescaler 1:4
T2CKPS1_bit = 0;
T2CKPS0_bit = 1;

PWM1_Set_Duty(127); // Charger Rapport cyclique

PWM1_Start();

}
Travaille demander comme TP
char a;
void interrupt()
{
if(intcon.INTF)
{
a=a+20;
}
intcon.INTF=0;
}
void main()
{
ANSEL=0;
ANSELH=0;
OPTION_reg.B7=0;
OPTION_reg.B6=0;
intcon=0b11010000;
a=40;
trisb.B0=1;
PWM1_Init(37000);
PWM1_Set_Duty(a);
for(;;)
{
PWM1_Start();
PWM1_Set_Duty(a);
}
}
trisb.b1 = 1;

trisc.b2 = 0;

PR2 = 124;

T2CKPS1_bit = 1;
T2CKPS0_bit = 1;

PWM1_SET_Duty(duty_cycle);
PWM1_Start();

while(1)
{
if(portb.b0 == 0)
{
duty_cycle++;
PWM1_Set_Duty(duty_cycle);
delay_ms(50);
}
if(portb.b1 == 0)
{
duty_cycle--;
PWM1_Set_Duty(duty_cycle);
delay_ms(50);
}
}

12/09/2022 FI-SICoM 205


unsigned short duty_cycle = 0; while(1)
{
void main() if(portb.b0 == 0)
{
{
ANSEL=0;
duty_cycle++;
ANSELH=0;
PWM1_Set_Duty(duty_cycle);
delay_ms(50);
trisb.b0 = 1;
}
trisb.b1 = 1;
if(portb.b1 == 0)
trisc.b2 = 0; {
duty_cycle--;
PR2 = 124; PWM1_Set_Duty(duty_cycle);
delay_ms(50);
T2CKPS1_bit = 1;
}
T2CKPS0_bit = 1;
}

PWM1_SET_Duty(duty_cycle);
}
PWM1_Start();
12/09/2022 FI-SICoM 206
CONVERTISSEUR
ADC
16F887
Le rôle du CAN est de transformer une
tension analogique en un signal numérique
pour interfacer un système numérique (tel que
le microcontrôleur PIC) avec le monde
extérieur.
Exemples
● Capteur de température dans une machine à
laver le linge.
● Pédale de Kart : La pédale de kart est directement
fixée à un potentiomètre. Pour connaître la vitesse
désirée il suffit de connaître la tension lue sur le
potentiomètre.
12/09/2022 FI-SICoM 210
12/09/2022 FI-SICoM 211
12/09/2022 FI-SICoM 212
12/09/2022 FI-SICoM 213
Mesure de distance à l’aide de capteurs sharp
GP2
Le capteur est un module infra-rouge qui fournit une
tension analogique variant en fonction de la distance le
séparant d’un objet.

Structure d'un CAN


● Plusieurs technologies existent :
-Convertisseur double rampe
-Convertisseur flash
-Convertisseur à approximation successives
-Nous nous intéresserons qu'à cette dernière
car c'est celle utilisée dans le CAN du PIC.
Convertisseur à approximations
successives
● Le principe de ce CAN s’apparente à la
dichotomie. On va tester bit après bit en
commençant par celui de poids fort la tension
d’entrée avec celle générée par le CNA.
● Nécessite un signal d'horloge !
Caractéristiques d'un CAN
Caractéristiques d'un CAN
● Avec un résultat sur 3 bits, on peut obtenir 23=8
valeurs possibles.
● La plage de variation de la tension à mesurer est
donc découpée également en 8.
– Exemple : Vref- = 0V et Vref+ = 5V
Le résultat de conversion sera (000)2 si la tension à mesurer
est compris entre 0V et 5/8=0,625V
Le résultat de conversion sera (111)2 si la tension à mesurer
est compris entre (7/8)*5 =4,375V et 5V
10
● Avec un résultat sur 10 bits, on peut obtenir 2 =1024
valeurs possibles.
● La plage de variation de la tension à mesurer est
donc découpée également en 1024.
– Exemple : Vref- = 0V et Vref+ = 5V
Le résultat de conversion sera (0000000000)2 si la
tension à mesurer est compris entre 0V et
5/1024≈0,005V
Le résultat de conversion sera (1111111111)2 si la tension à
mesurer est compris entre (1023/1024)*5 ≈ 4,995V et 5V
Schéma fonctionnel
Le CAN du PIC 16F887 (ADC module)

● Caractéristiques :

 CAN à approximations successives


 10 bits (entre 0 et 5V en entrée au maximum)
 Résolution de 5 mV au maximum
 Temps de conversion minimal : 19,1 µs
 IT peut être générée à la fin de la conversion
 Les niveaux bas et haut de la tension de référence (Vref- et Vref+)
peuvent être sélectionnés par l’utilisateur.
 Peut-être connecté à une des 14 entrées analogiques
et à une seule en même temps.
Les registres associés
Le PIC16F887 a 14 canaux analogiques. Le convertisseur A/V vous permet de

mesurer la tension sur ces canaux et de la convertir en valeur numérique.

Le convertisseur A/N convertit l’entrée analogique en une représentation à 10

bits du signal enregistré dans les deux registres ADRESL et ADRESH de l’ADC .

Sur la base des tensions de référence Vref- et Vref +, il est alors possible de

réaliser une conversion correcte en Volts ou milliVolts selon les besoins. Pendant la

conversion, la valeur 0 sera associée à la tension de référence négative Vref-

tandis que 1023 au positif Vref +. Ensuite, la tension mesurée sera calculée, à

partir du nombre lu dans les registres ADC, en utilisant la formule:


V an = (Vref -) + {[(Vref +) - (Vref -)] / 1023} * Nombre10Bit

La différence [(Vref +) - (Vref-)] est appelée tension de référence V ref .

Le fonctionnement du module A / D est basé sur 4 registres

- ADRESH - Contient les bits hauts du résultat de la conversion

- ADRESL - Contient les bits faibles du résultat de conversion

- ADCON0 - Registre de contrôle 0

- ADCON1 - Registre de contrôle 1


Pour mesurer la tension sur l'une des broches d'entrée avec le convertisseur
A / N, nous suivons ces 3 étapes:

Étape 1 - Configuration du port


Nous définissons les broches d'un port comme entrée en affectant la valeur
1 aux bits du registre TRIS combinés au port que nous voulons configurer;

exemple:
TRISA = 0x00; // Toutes les broches de PORTA sont sorties
TRISA = 0xFF; // Toutes les broches de PORTA sont entrées
TRISA = 0b00000100 // Broche 2 (RA2) du port A et entrée
TRISA = 0x04; // Broche 2 (RA2) du port A et entrée
Réglons le bit correspondant sur 1 dans les registres ANSEL et ANSELH des
broches que nous voulons configurer comme analogiques;

Les registres ANSEL et ANSELH sont utilisés pour régler les broches d'E / S en
analogique ou numérique.
La sélection du canal s'effectue en réglant le bit correspondant sur 1 dans les
registres ANSEL et ANSELH. Le modèle à suivre est la suivante:
Pour le port A seulement 5 broches peuvent être définies comme analogiques:
- la ANS0 bits {} détermine ANSEL registre si la broche est PORTA.0 analogique - CH0
- Bit ANS1 registre} {ANSEL détermine si la broche PORTA.1 est analogique - CH1
- bit ANS2 {} détermine ANSEL registre si la broche est PORTA.2 analogique - CH2
- bit ANS3 {} détermine ANSEL registre si la broche est PORTA.3 analogique - CH3
- bit ANS4 {ANSEL Register} détermine si la broche PORTA.4 est analogique - CH4

Pour le port E seulement 3 broches peuvent être réglées comme analogiques:


- la ANS5 bits {} détermine ANSEL registre si la broche est PORTE.0 analogique - CH5
- la ANS6 bits {} détermine ANSEL registre si la broche est PORTE.1 analogique - CH6

- la ANS7 bits {} ANSEL Registre détermine si la broche PORTE.2 est analogique - CH7

Pour le port B seulement 6 broches peuvent être réglées comme analogiques:


- bit ANS8 {ANSELH Register} détermine si la broche PORTB.2 est analogique - CH8
- bit ANS9 {ANSELH Register} détermine si broche PORTB.3 est analogique - CH9
- registre bits ANSELH ANS10 {} détermine si la broche est PORTB.1 analogique - CH10
- registre bits ANSELH ANS11 {} détermine si la broche est PORTB.4 analogique - CH11
- le ANS12 bit {ANSELH Register} détermine si la broche PORTB.0 est analogique - CH12
- bit ANS13 {ANSELH Register} détermine si PORTB.5 est analogique - CH13
exemple:

ANSEL = 0xFF; // Toutes les broches configurables combinées


avec ANSEL sont analogiques
ANSEL = 0b00000001; // Seule la broche 1 du port est
analogique
ANSELH = 0; // Les broches du port B configurables sont
numériques

Étape 2 - Configuration du module ADC:


Configurez la tension de référence à l'aide du registre ADCON1 ;
Le bit VCFG0 sélectionner la tension de référence positive:
- s'il est mis à 1 , alors il est utilisé en tant que tension de référence positive à
la broche Vref +
- si elle est réglée sur 0 utilise la tension d'alimentation Vdd (maximum ladite
tension de fonctionnement) en tant que tension de référence positif
le bit VCFG1 sélectionne qui est la tension de référence négative utilisée par
le convertisseur AD:
- si elle est réglée sur une tension de référence négative est celle de la
broche Vref
- s'il est mis à 0 en utilisant la tension d'alimentation Vss (tension minimale qui
correspond généralement à zéro de la masse commune) en tant que tension
de référence négative.
La possibilité d'utiliser également une tension de référence externe (produite
par un circuit approprié) permet de mettre en œuvre une tension de référence
adaptée à notre application.
Cas 1: avec VCFG1 à 0 et VCFG0 à 0, la tension d'alimentation (Vdd -Vss) sera utilisée comme
tension de référence. Donc, si le microcontrôleur est alimenté à 5V, ce sera la tension de référence.

Cas 2: avec VCFG1 à 0 et VCFG0 à 1 est utilisé comme tension de référence positive à une
certaine broche dédiée à recevoir le Vref + d'une source externe tandis que la référence négative
sera celle de la masse (Vss)

Cas 1: avec VCFG1 à 1 et VCFG0 à 1, les deux Vref + et Vref-pins seront utilisés. Vref + acceptera
la tension externe supérieure (mais qui doit être égale ou inférieure à Vdd ) tandis que Vref-
la tension mineure (qui peut être supérieure à Vss ). Ce choix nous permet d'obtenir un «espace
de mesure» aussi adapté que possible à nos besoins.

En résumé:
Tension de référence Vmax Vmin

Tension
1 V dd V ss
d'alimentation

2 Masse et V ref + externe V ref + V ss

3 Tension externe V ref + V ref-


exemple:
ADCON1 = 0b..00 ....; // Vref => Vdd et Vss
ADCON1 = 0b..01 ....; // Vref => Vref + et Vss
ADCON1 = 0b..11 ....; // Vref => Vref + et Vref-

Sélectionnez l'horloge du convertisseur ADC ( Clock ADC ) avec le registre ADCON0 ;

A l' intérieur du microprocesseur , il existe plusieurs configurations qui permettent de sélectionner


l'oscillateur qui fournit l'horloge de la PIC ( Fosc ):

LP Avec cristal basse fréquence de 5 à 200 kHz


XT Avec quartz à fréquence moyenne de 0,1 à 4 MHz
HS Avec Quartz Circuit de résistance de condensateur
RC haute fréquence de 4 à 25MHz de 0 à 4MHz
EC Horloge externe de 0 à 40MHz
Le temps total pour acquérir une donnée analogique dépend de deux temps
fondamentaux:
- T1 : temps d'acquisition (environ 20μS dans le pire des cas - microsecondes 10 -6 -
dépend de l'impédance du circuit {source de tension} et correspond au temps
nécessaire pour charger le condensateur)
- T2 : temps de conversion (période qui commence lorsque le bit GO / DONE est mis à 1
et se termine quand il revient à 0)
Le T1 dépend de facteurs tels que la résistance d'entrée (générateur), la température,
etc. Le temps d'acquisition T1 est obtenue comme la somme des contributions:

T1 = T max + T c + T coff

où:
T ampères = Temps d' établissement d' amplificateur
T c = condensateur de maintien Le temps de charge
T coff = Coefficient de température
Ces valeurs ( T amp , T c , T coff ) peuvent être déduites de la fiche technique. Le temps
d'acquisition T1 est invariable, sauf s'il est nécessaire d'intervenir sur les paramètres
matériels du système.
T2 dépend à la place du temps pour terminer une conversion d'un seul bit
(appelé T AD ). Le T AD correspond à la période du convertisseur ADC pour
laquelle T AD = 1 / Clock ADC . Le T AD est tiré de la fiche technique et doit être d'au
moins 1,6 μS (10 -6 secondes). Ainsi, une conversion complète de 10 bits nécessite un
temps égal ou supérieur à 10 T AD . Comme le montre la figure ci-dessous et environ
11,5 T AD car il est également nécessaire d'ajouter le temps perdu pour déconnecter /
connecter le condensateur.
Le T AD dépend de l'horloge de référence pour laquelle nous devons calibrer la
source d'horloge de l'ADC de sorte que la valeur minimale qui est d'au moins 1,6μS
soit dépassée.
Il est possible de réduire le temps de conversion au moyen d'un logiciel à condition
qu'il accepte une diminution de la précision de la valeur convertie.
Par exemple, si la fréquence d'horloge est de 4 Mhz et réglé comme étant la source
d'horloge du convertisseur Fosc / 8 , on a:

T AD = 1 / réveil ADC = 1 / (Fosc / 8) = 1 / (4MHz / 8) = 500kHz = 2s que c'est> 1.6μS


Le tableau suivant montre les valeurs T AD basées sur la fréquence de référence
utilisée
Fréquence de l'appareil (Fosc)
Verrou
de référence C p
our ADCS1 ADCS0
le convertisseur 20 Mhz 8 Mhz 4 Mhz 1 Mhz
ADC

Fosc / 2 0 0 100 nS 250 nS 500 nS 2 uS


Fosc / 8 0 1 400 nS 1 us 2 uS 8 US
Fosc / 32 1 0 1,6 us 4 uS 8 US 32 US
frc 1 1 2 - 6 ans

Frc est l'horloge générée par un oscillateur situé à l'intérieur du module ADC. Cette
source, si elle est sélectionnée, permet à l'ADC de fonctionner même lorsque la CPU est
en mode veille.
Sélectionnez l'un des canaux d'entrée ( CH0-CH13 ) via le registre ADCON0 ;

pour sélectionner le canal, ce tableau doit être utilisé


chs3 CHS2 CHS1 CHS0 canal goupille

0 0 0 0 0 RA0 / AN0

0 0 0 1 1 RA1 / AN1

0 0 1 0 2 RA2 / AN2

0 0 1 1 3 RA3 / AN3

0 1 0 0 4 RA5 / AN4

0 1 0 1 5 RE0 / AN5

0 1 1 0 6 RE1 / AN6

0 1 1 1 7 RE2 / AN7

1 0 0 0 8 RB2 / AN8

1 0 0 1 9 RB3 / AN9
RB1 /
1 0 1 0 10
AN10
RB4 /
1 0 1 1 11
AN11
RB0 /
1 1 0 0 12
AN12
RB5 /
1 1 0 1 13
AN13
1 1 1 0 CVref
1 1 1 1 Vref = 0.6V
exemple:
ADCON0 = 0b..0000 ..; // Activer le canal 0
ADCON0 = 0b..0010 ..; // Activer le canal 2

Sélectionnez le format de sortie des registres ADRESL et ADRESH via le


bit ADFM du registre ADCON1

le premier bit (ADFM) du registre ADCON1

vous permet de définir si la valeur convertie est justifiée à droite ou à gauche.


Si applique ADFM est 1 alors le résultat est justifié à droite (pour laquelle les 6 bits les plus
significatifs du registre ADRESLH ne sont pas utilisés)
Si cela est vrai ADFM est 1 alors le résultat est justifié à gauche (à laquelle les 6 bits
les moins significatifs du registre ADRESL ils ne seront pas utilisés).

exemple:
ADCON1 = 0b1 .......; // Activer le canal 0
ADCON1 = 0b0 .......; // activer le canal 2 Activer le convertisseur A / D en plaçant le
bit ADON à 1 dans le registreADCON0 Le bit ADON registre
ADCON0 active ou désactive le convertisseur A / N

Étape 3 - Ces étapes sont incluses dans l’instruction ADC_Read (Channel)

Attendre que le temps d'acquisition demandé passe (environ 20uS -


microsecondes 10 -6 )

Pour que l'ADC atteigne son niveau de précision spécifique, il est nécessaire de prévoir un
certain délai entre la sélection du canal d'entrée analogique et sa mesure. Cette période est
appelée " temps d'acquisition " et dépend de l'impédance ( résistance au passage d'un
courant variable ) de la source. Il y a des équations qui permettent de le calculer avec
précision mais on peut utiliser comme référence le pire des cas qui est d'environ 20uS.
Commencez la conversion en plaçant le bit GO / DONE à 1 dans le
registre ADCON0 .

Attendez la fin de la conversion (le bit GO / DONE revient à 0). Une boucle d'attente sera
donc nécessaire. Il y a la possibilité d'attendre une interruption A / D mais elle doit être
activée.

Lisez les résultats dans les registres ADRESH et ADRESL .


Vcc

RV1 U1
1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
2 17
0%

RA0/AN0/ULPW U/C12IN0- RC2/P1A/CCP1


3 18
RA1/AN1/C12IN1- RC3/SCK/SCL
4 23
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24
RA3/AN3/VREF+/C1IN+ RC5/SDO
1k 6 25
RA4/T0CKI/C1OUT RC6/TX/CK
7 26
RA5/AN4/SS/C2OUT RC7/RX/DT
14
RA6/OSC2/CLKOUT
13 19
RA7/OSC1/CLKIN RD0
20
RD1
33 21
RB0/AN12/INT RD2
34 22
RB1/AN10/C12IN3- RD3
35 27
RB2/AN8 RD4
36 28
RB3/AN9/PGM/C12IN2- RD5/P1B
37 29
RB4/AN11 RD6/P1C
38 30
RB5/AN13/T1G RD7/P1D
39
RB6/ICSPCLK
40 8
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7
PIC16F887
Exemple.1 Codage sur 10 Bits

unsigned int a;
void main()
{
TRISC=0X00; PORTC=0X00;
TRISD=0X00; PORTD=0X00;
a=0x00;
ADC_Init();

for(;;)
{
a = ADC_Read(0);
PORTC=a;
PORTD=a >> 8;
}

}
Exemple.1 Codage sur 8 Bits

unsigned int a;
void main()
{
TRISC=0X00; PORTC=0X00;
TRISD=0X00; PORTD=0X00;
a=0x00;
ADC_Init();

for(;;)
{
a = ADC_Read(0);
PORTC = a >> 2;
}
}
Exemple.1 Codage sur 7 Bits

unsigned int a;
void main()
{
TRISC=0X00; PORTC=0X00;
TRISD=0X00; PORTD=0X00;
a=0x00;
ADC_Init();

for(;;)
{
a = ADC_Read(0);
PORTC = a >> 3;
}

}
Exemple.2
unsigned int Valeur_ADC =0 ; // Création et initialisation de la variable de stockage

void main() {
ANSEL = 0b00000001; // Configure pin an0 en analogique

C1ON_bit = 0; // Ici on désactive les comparateurs


C2ON_bit = 0;

TRISA = 0b00000001; // PORTA en entrée


TRISD = 0x00; // PORTD en sortie pour leds
TRISC = 0x00; // PORTC en sortie pour leds

PORTD = 0x00; // On initialise les sorties à 0


PORTC = 0x00; // On initialise les sorties à 0

while (1) { // Boucle infinie

Valeur_ADC = ADC_Read(0); // Lecture de An0 est stockage de la valeur dans la


//variable "Valeur_ADC" sur 10bits
PORTC = Valeur_ADC; // On envoie les 8 bits de points faibles sur le port D
PORTD = Valeur_ADC >> 8; // On fait un décalage des 8 bits de poids faibles pour
//faire apparaitre les 2 bits de poids fort restant sur le
//PORTC

}
}
Exemple.3
unsigned int temp_res;
void main() {
ANSEL = 0x0C; // Pins AN2 and AN3 are configured as analog
TRISA = 0xFF; // All port A pins are configured as inputs
ANSELH = 0; // Rest of pins is configured as digital
TRISB = 0x3F; // Port B pins RB7 and RB6 are configured as outputs
TRISD = 0; // All port D pins are configured as outputs
ADCON1.F4 = 1 ; // Voltage reference is brought to the RA3 pin.
ADCON1.F5 = 1 ;
do {
temp_res = ADC_Read(2); // Result of A/D conversion is copied to temp_res
PORTD = temp_res; // 8 LSBs are moved to port D
PORTB = temp_res >> 2; // 2 MSBs are moved to bits RB6 and RB7
} while(1); // Endless loop
}
Vcc

RV1 U1
1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
16
Voltage de reference 2
RC1/T1OSI/CCP2
17

100%
RA0/AN0/ULPWU/C12IN0- RC2/P1A/CCP1
3 18
RA1/AN1/C12IN1- RC3/SCK/SCL
4 23
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24
RV2 RA3/AN3/VREF+/C1IN+ RC5/SDO
1k 6 25
RA4/T0CKI/C1OUT RC6/TX/CK
7 26
RA5/AN4/SS/C2OUT RC7/RX/DT
14
RA6/OSC2/CLKOUT
13 19
93%
%

Voltage a mesurer RA7/OSC1/CLKIN RD0


20
RD1
33 21
RB0/AN12/INT RD2
34 22
RB1/AN10/C12IN3- RD3
1k 35 27
RB2/AN8 RD4
36 28
RB3/AN9/PGM/C12IN2- RD5/P1B
37 29
RB4/AN11 RD6/P1C
38 30
RB5/AN13/T1G RD7/P1D
39
RB6/ICSPCLK
40 8
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7
PIC16F887
La liaison série RS232
Utilisation de l'EUSART
l'EUSART
Généralités

● Intérêts d'une liaison série

– Moins de câblage (- de cuivre donc - cher)

– Pas de perturbation entre pistes

*Débits plus élevés

*Distances de communication plus importantes


Transmissions séries

● Au minimum, 2 fils sont nécessaires


-1 fil de données
-1 fil de référence (masse)
● D'autres fils peuvent être rajoutés.
● Deux critères permettent de définir une liaison série :
+L’interface (ou support) physique de communication
(câble, connexions)
+Le format de transfert des données de communication
(protocole)
*2 types : synchrone ou asynchrone
Transmissions séries asynchrones
2
● Les transmissions séries synchrones (transmission d'un signal d'horloge) I C .

● Les communications asynchrones sont définies par plusieurs paramètres :

*Les niveaux de tensions

*La vitesse de transmission (Baud Rate en anglais)

*Le format des données

*Le mode de fonctionnement

* Full-Duplex ou Half-Duplex

● Les interfaces physiques de communication peuvent être divers :

Fils de cuivre, fibre optique, hertzien, ...


● Protocoles les plus courants :

-Norme RS232

+Utilisée notamment pour la communication avec un PC

(ports COM)

+Également utilisée dans de nombreux modules électroniques

spécifiques (modules Zigbee, …)

-Norme RS485

+Utilisée dans les applications où les perturbations sont importantes

On en trouve sur les Automates Programmables Industriels


Principe de transmission
● Dans une communication série RS232, les bits sont envoyés les uns à la
suite des autres sur la ligne en commençant par le bit de poids
faible. La transmission s’appuie donc sur le principe des registres à
décalage.
+ La transmission se fait octet par octet.
● Liaison série asynchrone : pas d'horloge transmise
+ Nécessité de rajouter un bit de ”START” ('0' logique) avant l'octet à
transmettre, et un bit de ”STOP” ('1' logique) après l'octet à transmettre.
● La norme RS232 prévoit également la possibilité de rajouter
un autre bit juste avant le bit de STOP :
ème
+ Bit de parité ou un 2 bit de STOP
● Au total, cela nous fait donc 10 ou 11 bits qui sont transmis au registre à décalage
qui assure la transmission en commençant par le bit de poids faible.
Configuration de la liaison
● On dispose de registres de contrôle et d’état.
● Le(s) registre(s) de contrôle permet(tent) de :
+ Fixer le format de transmission (7, 8 ou 9 bits)
+ Fixer le facteur de division de l’horloge (Baud Rate)
+ Fixer le test de parité
+ Fixer le nombre de bits STOP
+ Préciser le fonctionnement en interruption

● Le(s) registre(s) d'état(s) permet(tent) de savoir :


+ Si une transmission est en cours
+ Si une réception est terminée
+ L’état des lignes de contrôle
+ L’état des interruptions
Principe de la réception asynchrone
● Pas d'horloge transmise entre les 2 équipements

→ les fréquences d'horloge de l'émetteur et du récepteur doivent être

identiques

● Pour indiquer au récepteur le début d'une transmission, il faut lui envoyer un signal:

+C'est le rôle du bit de START

● La ligne au repos est à l'état logique '1'

● Le bit de START est donc logiquement à '0'


● Le récepteur attend le premier front descendant de la ligne de données pour se
synchroniser.
● Après une demi-période d’horloge, il vient tester le bit. L’intérêt est de pouvoir
savoir s’il s’agit d’un vrai bit de START (si le signal est toujours à ‘0’) ou alors
si on a eu du bruit sur la ligne qui aurait provoqué un faux bit de START (si le
bit est remonté à‘1’).
● Ensuite, on échantillonne le nombre de bits de données (défini dans la configuration
de la liaison série) à chaque période d’horloge.
● Enfin, on teste le ou les bits STOP
-Si le bit est à ‘1’, on a bien un bit STOP.
-Si le bit est à ‘0’, on a un mauvais bit STOP. On parle d’une erreur
d’encadrement (framing error).
● Chronogramme type

Exemple de transmission
● On souhaite envoyer l'octet 0x32 (qui est le code ASCII du caractère '2'), sur 8
bits, sansparité avec 1 bit STOP. - 0x32 = (0011 0010)2
Lignes de contrôle
● Ce sont les signaux additionnels aux lignes de données qui permettent de contrôler
la communication.
● Différents signaux peuvent être échangés.
● Ces signaux peuvent être groupés de la manière suivante :
* Des signaux de transmission de données
- TXD (transmit data) : Données dans un sens
- RXD (receive data) : Données dans l'autre sens
* Des signaux de contrôle de flux de transmission
- RTS (request to send) : Demande à émettre
- CTS (clear to send) : Prêt à recevoir
Ces signaux peuvent être utiles pour gérer l'échange du flux de données.
Notamment, il permet d'indiquer si l'équipement destinataire est prêt à
recevoir.
– Des références de potentiels (masse)
Vitesse de transmission des données
● Les deux équipements doivent être configurés avec la même vitesse (baud rate).

● Elle est exprimée est bits / seconde

● Ces vitesses sont normalisées :

1200 bauds (ou bits/seconde)

2400 bauds

4800 bauds

9600 bauds

19200 bauds

38400 bauds

57600 bauds

115200 bauds
Contrôle de flux
● Le rôle du contrôle de flux est de permettre d'éviter de perdre des informations
pendant la transmission.
● Différents types de contrôle de flux :
+ Contrôle de flux matériel
+ Contrôle de flux logiciel

Contrôle de flux matériel :


+ Il est possible de contrôler le flux de données entre deux équipements par


deux lignes de « handshake » (poignée de main en français). Ces lignes sont
RTS et CTS.
+ Le principe de fonctionnement est le suivant :
+ L'émetteur informe le récepteur qu'il est prêt à envoyer une
donnée en agissant sur RTS et en le mettant à l'état bas.
+ Le récepteur informe l'émetteur qu'il est prêt à recevoir en mettant
le signal CTS à l'état bas.
● La transmission devient effective.
● Cette technique permet d'éviter d'envoyer des données
quand le récepteur n'est pas prêt et donc permet d'éviter
la perte d'information.

● Contrôle de flux logiciel :


● Il est également possible de contrôler la transmission à l'aide de deux
codes ASCII « XON » et « XOFF » :
● XOFF (code ASCII 17) : demande l'arrêt de la transmission
● XON (code ASCII 19) : demande le départ d'une transmission
Parité
● Le mot transmis peut être suivi ou non d'un bit
de parité qui sert à détecter les erreurs
éventuelles de transmission.
● Il existe deux types de parités :
Parité paire
Parité impaire
● Le bit ajouté à la donnée est positionné de
telle façon que le nombre des états « 1 » soit paire sur l'ensemble donné + bit
de parité.
● Exemple :
soit la donnée 11001011 contenant 5 états «1»
le bit de parité paire est positionné à « 1 », ramenant ainsi le nombre
de « 1 » à 6.
Parité impaire
● Le bit ajouté à la donnée est positionné de telle façon que le nombre

des états « 1 » soit impaire sur l'ensemble donné + bit de parité.

● Exemple :

soit la donnée 11001011 contenant 5 états «1»

le bit de parité impaire est positionné à « 0 », laissant ainsi un

nombre de « 1 » impaire.
Bilan
● Pour que 2 équipements puissent échanger des données, il faut qu'ils soient:

configurés pour que :


Interfaces physiques
● Il existe différentes interfaces physiques pour
la liaison série, dont les normes :
RS232 : Interface de liaison série présente sur les PCs
(ports COM).
RS422 : Interface mieux immunisée vis à vis du bruit.
RS485 : Identique à la RS422 mais développée
pour pouvoir connecter plus de deux appareils
sur le même bus.
● Le choix d'une interface dépend :
de la vitesse de transmission souhaitée
de la longueur du câble
du nombre d'équipements que l'on souhaite
connecter
de l'immunité vis à vis des parasites
Interface RS232
● Niveaux de tension
Les 0-5V (voire moins) que l'on trouve généralement en sortie des
microcontrôleurs est insuffisant pour transmettre les informations loin.
En effet, sous l'effet de l'impédance de la ligne (inductances et capacités
parasites), le signal est atténué.
● Niveaux de tension

Afin de pouvoir envoyer les signaux plus loin, la liaison série RS232

transmet les informations sous des niveaux de tension plus élevés.

Un niveau logique bas (0V) sera transmis à l'aide d'une tension de +10V.

Un niveau logique haut (5V) sera transmis à l'aide d'une tension de -10V.

Il y a donc INVERSION DES NIVEAUX LOGIQUE et ADAPTATION à +10V

ET-10V
● Niveaux de tension
Chronogrammes
Composant externe (MAX 232)
● Cet adaptation est très classiquement réalisée par le composant
MAX 232 :
● Ce composant est capable de générer à partir d'une
alimentation Vcc de 5V, les tensions +10V et -10V.
● Avec une telle tension, il est possible de communiquer
avec une liaison série RS232 à
9600 bauds jusqu'à 10m.
● Plus la distance sera grande, moins la vitesse
de transmission sera rapide car les atténuations et
les déformations des signaux seront plus
importantes.
Connecteur
● La connexion se fait aujourd'hui généralement sur
des connecteurs DB9.
● Le schéma de connexion est donné ci-dessous :
Évolution
● Depuis quelques années, les ordinateurs neufs ne sont plus pourvus par défaut de
ports COM RS232.
● Il existe maintenant des cables USB permettant de continuer à utiliser des liaisons
séries RS232.
● Ces cables intègrent un circuit intégré permettant de gérer le protocole USB d'un coté
et la liaison RS232 de l'autre (puces FTDI)
Mise en œuvre de la liaison série avec le PIC 16F887
● Le périphérique interne qui gère la liaison série asynchrone s'appelle ”EUSART” :

Enhanced Universal Synchronous Asynchronous Receiver Transmitter

● Ce périphérique repose sur des registres à décalages qui permettront d'envoyer et de

recevoir les données. Ils sont au nombre de deux (un pour l'émission, l'autre

pour la réception), ce qui autorise théoriquement le PIC à envoyer et recevoir

des données simultanément.

● Il est nécessaire de configurer la vitesse de transmission, le nombre de bits de

données, la parité ou le deuxième bit STOP s'il y a lieu.

● Il faudra donc mettre la bonne valeur dans les registres de configuration de l'EUSART.
● Il nous permettra également de savoir si une transmission est en cours, si elle s'est
passée convenablement ou bien s'il y a eu une erreur. Ce sera le rôle du
registre d'état.
● Enfin, nous aurons des registres pour écrire les données à envoyer ou lire les
données reçues.

● Ce périphérique dispose également de deux pattes de connexion qui permettront


d'envoyer un message (RC6) ou bien de le recevoir (RC7). La configuration
de ces pins se fait de la manière indiquée ci-dessous :

Setting the SPEN bit of the RCSTA register enables the EUSART and
automatically configures the TX/CK I/O pin as an output. If the TX/CK pin is
shared with an analog peripheral the analog I/O function must be disabled by
clearing the corresponding ANSEL bit.
Setting the SPEN bit of the RCSTA register enables the EUSART and
automatically configures the RX/DT I/O pin as an input. If the RX/DT pin is
shared with an analog peripheral the analog I/O function must be disabled by
clearing the corresponding ANSEL bit.
● Si l'on souhaite se connecter sur un PC, il faudra penser à utiliser un composant

(par exemple un MAX 232) pour générer un signal entre -10V et +10V.
Fonctionnement en transmission
● La figure 12-1 nous indique le fonctionnement de l'EUSART en transmission :
● Le module d'envoi est basé sur un registre à décalage (TSR Register = « Transmit

Shift Register »). On charge la valeur à transmettre sur 8 bits à l’aide du

registre TXREG
● L'écriture de TXREG dans TSR met à '1' le drapeau TXIF. Celui-ci est capable de
générer une interruption si le bit TXIE est à '1'. Le registre à décalage ajoute
tout seul le bit de START et de STOP.
● Le fait que le drapeau TXIF passe à '1' n’indique pas que la donnée a été transmise,
mais uniquement le fait que vous avez mis une donnée dans le registre
TXREG.
● Le drapeau « TRMT » indique quand le registre à décalage est vide. C'est à dire
quand le mot est complètement envoyé.
Il est ainsi bien plus utile de tester le bit TRMT que le bit TXIF.
● La figure 12-3, nous donne les chronogrammes des bits TRMT et TXIF :
● Pour envoyer les données, il faut configurer l'horloge de transmission. Ceci se fait à
l'aide du registre SPBRG (composé de 2 registres de 8 bits
SPBRGH:SPBRG) qui divise la fréquence de l'horloge interne pour obtenir
la bonne vitesse de transmission.
● La validation de cette horloge se fait par TXEN. L'horloge est la même pour les
modules d'envoi et de réception.
● Les bits sérialisés sont envoyés vers la patte de sortie RC6/TX. Cette patte à la
double fonction de servir de patte d'E/S standard ou de servir comme sortie
d'envoi de la liaison série.
● La configuration entre ces deux modes de fonctionnement se fait grâce au bit SPEN.
● Lorsque le bit SPEN est égal à '1', les pattes RC6/TX et RC7/RX sont respectivement
configurés automatiquement en sortie et en entrée.
● Il est possible d'envoyer un 9ème bit avant le bit de STOP (par exemple une parité

ou un deuxième bit STOP). Il faut alors valider TX9 et inscrire la donnée du

9ème bit dans TX9D avant de procéder à une émission.


Fonctionnement en réception
● La figure 12-2 nous indique le fonctionnement de l’EUSART en réception. Le module
de réception est relativement similaire au module d'émission. Il est basé sur
un registre à décalage de 11 bits (un START, 8 données, un 9ème bit et un
STOP).
● Tout comme le module d'émission, il dispose de l'horloge (SPBRGH:SPBRG) :

● Il scrute en permanence le signal qui arrive sur la patte RC7/RX. Il faut donc là
aussi indiquer que cette patte sert à la liaison série grâce à SPEN.
● La réception ne sera validée que lorsque le bit CREN sera correctement configuré.
● Une fois le mot reçu correctement, le PIC stocke les 8 bits de données reçus dans

le registre RCREG. Si on lui a validé un 9ème bit en réception à l'aide de

RX9, il stockera sa valeur dans RX9D.

● En outre, la réception d'une donnée valide le bit RCIF.

● On peut alors générer une interruption si le bit RCIE est à '1'.

● Le module de réception peut en outre générer des erreurs si la transmission s'est

mal passée. Il possède notamment les bits OERR (Overrun error) et FERR

(Framing error).
● Chronogrammes
Les registres associés à la transmission
Les registres associés à la réception
Les registres
● Les registres TXREG et RCREG
Vous placerez le mot à transmettre dans le registre TXREG.
Lorsqu'un mot sera reçu, vous pourrez le lire dans le registre RCREG.
● Les registres INTCON, PIR1 et PIE1
Ces registres sont utilisés pour gérer la liaison RS 232 en interruption

● Le registre PIR1
Ce registre contient les deux flags (drapeaux) permettant de :
Détecter qu’un mot a été reçu : bit RCIF
Détecter qu’un mot a été placé dans le registre de transmission : bit TXIF .
Remarque : il existe un autre « flag » pour la transmission : TRMT .
● Le registre PIE1

Ce registre contient les deux bits permettant d'autoriser les interruptions en


transmission (TXIE) et en réception (RCIE)
● Les registres SPBRGH:SPBRG, le bit BRGH(du registre TXSTA) et le bit
BRG16 (du registre BAUDCTL)
+Les registres SPBRGH et SPBRG permettent de configurer, avec le bit
BRGH et le bit BRG16, la vitesse de transmission de la liaison série.
● Par exemple, pour une transmission à 9600bauds,

avec un microcontrôleur cadencé à 4MHz, nous

obtenons (SYNC doit forcément être égal à 0):

- BRG16 = 0 et BRGH = 0

- X = fosc /(baud rate * 64) -1

X = 4000000 / (9600* 64) -1= 5,51

- X forcément entier → X = 6

- Baud rate réel = Fosc / (64( X+1)) soit 8928,59

- L’erreur est donc de 6,99 %

(calcul : (9600-8929)/9600)).
● On choisira la valeur afin de minimiser l'erreur commise sur la transmission.

● Des tableaux (pages 168 et 169 de la doc) permettent de trouver rapidement les

valeurs à mettre dans SPBRGH:SPBRG et BRGH en fonction :

* de la valeur du débit de transmission

* de la fréquence du quartz du PIC

* de la valeur du bit BRGH

* de la valeur du bit BRG16

● Remarque : la plupart du temps, il sera suffisant de travailler avec un registre SPBRG

sur 8 bits (BRG16 = 0 et utilisation de SPBRG uniquement). En effet, la nécessité de

travailler sur 16 bits s'impose uniquement pour obtenir de faibles vitesses de

transmission avec un quartz de fréquence élevée.


Les registres de contrôle et d'état

● Il nous reste plusieurs choses à configurer :


- Choix du type de transmission Asynchrone ou synchrone.
_ Le bit SYNC du registre TXSTA permet de choisir le type de
fonctionnement:
'1' : mode synchrone
'0' : mode asynchrone
_ Pour une communication de type RS232 nous prendrons le mode

asynchrone.
•Validation des lignes RC6 et RC7 comme broches d’entrée / sortie associées à

L’EUSART : bit SPEN du registre RCSTA

- '1' : port série validé


- '0' : port série invalidé

Remarque : le fait de configurer ce bit à 1, place automatiquement la ligne de

transmission en sortie et la ligne de réception en entrée.

• Sélection du baud rate pour le mode asynchrone (Permet de fixer la vitesse de

transmission en lien avec le registre SPBRG). Bit BRGH du registre TXSTA

- '1' : mode High Speed

- '0' : mode Low Speed


• Bits de marche/arrêt :

-La réception est validée en plaçant un '1' dans le bit CREN du registre RCSTA

- La transmission est validée en plaçant un '1‘ dans le bit TXEN du registre

TXSTA .

• Transmission de 8 bits ou de 9 bits :

-Le bit TX9 du registre TXSTA permet de valider une transmission de 8 bits ou

de 9 bits

.'1' : transmission de 9 bits.

.'0' : transmission de 8 bits.

-En mode 9 bits, il faut placer le 9ème bit dans le bit TX9D du registre TXSTA.

-En mode 8 bits, le bit TX9D peut prendre n’importe quelle valeur.
*Réception de 8 bits ou de 9 bits.
-Le bit RX9 du registre RCSTA permet de valider une réception de 8bits ou de
9 bits
'1' : réception de 9 bits
'0' : réception de 8 bits
-En mode 9 bits, le 9ème bit sera lu dans le bit RX9D du registre RCSTA.

-En mode 8 bits, le bit RX9D ne sera pas utilisé.


* Configuration de la réception.
-ADDEN : Fonctionne en mode asynchrone avec 9 bits
'1' : autorisation de la détection d'adresse
'0' : invalidation de la détection d'adresse
* Dans la plupart du temps nous travaillerons dans un mode 8 bits, donc sans
détection d’adresse.
Les bits d’état : L’EUSART propose 3 bits d’état :
TRMT : État du registre à décalage d'envoi
'1' : Registre à décalage vide
'0' : Registre à décalage plein
FERR : Drapeau de détection d'erreur d'encadrement (Framing Error)
'1' : Erreur d'encadrement
'0' : Pas d'erreur
OERR : Drapeau de détection d'Overrun Error
'1' : Erreur d'Overrun
'0' : pas d'erreur
● On n'utilisera pas le bit SENDB du registre TXSTA (on le laissera à '0').
●Deux bits sont inutilisés pour une transmission asynchrone.
Il s’agit du bit 5 du registre RCSTA et du bit 7 du registre TXSTA
Exemple de configuration
● On souhaite par exemple configurer la liaison série pour une transmission de:

8 bits de données

2 bits STOP

sans parité

vitesse de transmission :19200 bauds.

La fréquence du quartz du PIC est de 4 MHz.


● Solution :

Registre SPBRG

On va donc fixer le bit BRGH et la valeur deSPBRG.

Le tableau 18-3 pour BRGH='0', nous donne un SPBRG de 2 et une

erreur de 8,51%.

Le tableau 18-3 pour BRGH='1', nous donne un SPBRG de 12 et

une erreur de 0,16%.

C'est cette dernière valeur que nous allonsconserver.

→ bit BRGH= 1 et registre SPBRG = 12


Registre TXSTA

CSRC : '0' sans importance car on est en mode asynchrone

TX9 : '1' transmission de 9 bits (le 9ème bit sera un bit de STOP)

TXEN : '1' Autorisation de la transmission

SYNC : '0' Mode de fonctionnement asynchrone

SENDB : '0'

BRGH : '1' voir ci-dessus

TRMT : '0' c'est un bit en lecture seule, donc sans importance !

TX9D : '1' le neuvième bit sert de bit de STOP

→ Soit TXSTA = 0x65


Registre RCSTA

SPEN : '1' validation de l'affectation au port série de RC6 et RC7

RX9 : '1' réception de 9 bits

SREN : '0' Sans importance pour le mode asynchrone

CREN : '1' Validation de la réception

ADDEN : '0' invalidation de la détection d'adresse

FERR : '0' c'est un bit en lecture seule, donc sans importance !

OERR : '0' c'est un bit en lecture seule, donc sans importance !

RX9D : '0' c'est un bit en lecture seule, donc sans importance !

→ Soit RCSTA = 0xD0

Et registre BAUDCTL = 0x00


Exemple d'un programme en C
● Exemple d'un programme qui va envoyer le caractère 'A' (code ASCII 0x41) avec les
caractéristiques suivantes :
8 bits de données
2 bits STOP
sans parité
vitesse de transmission :19200 bauds
La fréquence du PIC est de 4 MHz

● L'analyse structurée du programme peut se présenter comme suit :


INITIALISER LA LIAISON SERIE
ENVOYER LE CARACTERE 'A'
ATTENDRE LA FIN DE LA TRANSMISSION
Exemple d'un programme en C (transmission)
void init_serie (void); // fonction d'initialisation de la liaison série
void main ( void )
{
init_serie(); // Initialisation de la liaison série
TXREG=0x41; // Envoi du caractère 'A' sur la liaison série
while (TRMT==0); // Attente de la fin de la transmission
while(1);
}
void init_serie (void) // 19200 bauds, 8 bits de données, 2 bits de STOP, sans parité
{
SPBRG=12; // configuration de la vitesse de transmission
TXSTA=0x65; // configuration de la transmission
RCSTA=0xD0; // configuration de la réception
BAUDCTL = 0x00 ; // configuration du registre de contrôle de vitesse de transmission
}
Exemple d'un programme en C (réception)
void init_serie (void); // fonction d'initialisation de la liaison série
void main ( void )
{
uns8 recu; // Variable qui sert à stocker le dernier octet reçu sur la liaison série
init_serie(); // Initialisation de la liaison série
while(1)
{
while(RCIF==0); // attente de la réception d'un caractère …
recu=RCREG; // on lit le caractère reçu et on le stocke dans recu
….
}
}
void init_serie (void) // 19200 bauds, 8 bits de données, 2 bits de STOP, sans parité
{
SPBRG=12; // configuration de la vitesse de transmission
TXSTA=0x65; // configuration de la transmission
RCSTA=0xD0; // configuration de la réception
BAUDCTL = 0x00 ; // configuration du registre de contrôle de vitesse de transmission
}
Programme de transmission Programme de Réception
void main() void main()
{ {
ANSEL = 0; ANSEL = 0;
ANSELH = 0; ANSELH = 0;
TRISB=0XFF; TRISB=0x00;
OPTION_REG.B7=0; PORTB=0;
C1ON_bit = C2ON_bit = 0; C1ON_bit = C2ON_bit = 0;
UART1_INIT(19133); UART1_INIT(19133);
Delay_ms(100); Delay_ms(100);

for(;;) for(;;)
{ {
UART1_WRITE(PORTB); if( UART1_DATA_READY() )
delay_ms(500); {
} PORTB=UART1_READ();
} }
}
}
U1 TRANSMISSION U2 RECEPTION
1 15 1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI RE3/MCLR/VPP RC0/T1OSO/T1CKI
16 16
RC1/T1OSI/CCP2 RC1/T1OSI/CCP2
2 17 2 17
RA0/AN0/ULPWU/C12IN0- RC2/P1A/CCP1 RA0/AN0/ULPWU/C12IN0- RC2/P1A/CCP1
3 18 3 18
RA1/AN1/C12IN1- RC3/SCK/SCL RA1/AN1/C12IN1- RC3/SCK/SCL
4 23 4 23
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24 5 24
RA3/AN3/VREF+/C1IN+ RC5/SDO RA3/AN3/VREF+/C1IN+ RC5/SDO
6 25 6 25
RA4/T0CKI/C1OUT RC6/TX/CK RA4/T0CKI/C1OUT RC6/TX/CK
7 26 7 26
RA5/AN4/SS/C2OUT RC7/RX/DT RA5/AN4/SS/C2OUT RC7/RX/DT
14 14
RA6/OSC2/CLKOUT RA6/OSC2/CLKOUT
13 19 13 19
RA7/OSC1/CLKIN RD0 RA7/OSC1/CLKIN RD0
20 20
RD1 RD1
33 21 33 21
RB0/AN12/INT RD2 RB0/AN12/INT RD2
34 22 34 22
RB1/AN10/C12IN3- RD3 RB1/AN10/C12IN3- RD3
35 27 35 27
RB2/AN8 RD4 RB2/AN8 RD4
36 28 36 28
RB3/AN9/PGM/C12IN2- RD5/P1B RB3/AN9/PGM/C12IN2- RD5/P1B
37 29 37 29
RB4/AN11 RD6/P1C RB4/AN11 RD6/P1C
38 30 38 30
RB5/AN13/T1G RD7/P1D RB5/AN13/T1G RD7/P1D
39 39
RB6/ICSPCLK RB6/ICSPCLK
40 8 40 8
RB7/ICSPDAT RE0/AN5 RB7/ICSPDAT RE0/AN5
9 9
RE1/AN6 RE1/AN6
10 10
RE2/AN7 RE2/AN7
PIC16F887 PIC16F887
U1 U2
1 15 1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI RE3/MCLR/VPP RC0/T1OSO/T1CKI
16 16
RC1/T1OSI/CCP2 RC1/T1OSI/CCP2
2 17 2 17
RA0/AN0/ULPWU/C12IN0- RC2/P1A/CCP1 RA0/AN0/ULPWU/C12IN0- RC2/P1A/CCP1
3 18 3 18
RA1/AN1/C12IN1- RC3/SCK/SCL RA1/AN1/C12IN1- RC3/SCK/SCL
4 23 4 23
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
5 24 5 24
RA3/AN3/VREF+/C1IN+ RC5/SDO RA3/AN3/VREF+/C1IN+ RC5/SDO
6 25 6 25
RA4/T0CKI/C1OUT RC6/TX/CK RA4/T0CKI/C1OUT RC6/TX/CK
7 26 7 26
RA5/AN4/SS/C2OUT RC7/RX/DT RA5/AN4/SS/C2OUT RC7/RX/DT
14 14
RA6/OSC2/CLKOUT RA6/OSC2/CLKOUT
13 19 13 19
RA7/OSC1/CLKIN RD0 RA7/OSC1/CLKIN RD0
20 20
RD1 RD1
33 21 33 21
RB0/AN12/INT RD2 RB0/AN12/INT RD2
34 22 34 22
RB1/AN10/C12IN3- RD3 RB1/AN10/C12IN3- RD3
35 27 35 27
RB2/AN8 RD4 RB2/AN8 RD4
36 28 36 28
RB3/AN9/PGM/C12IN2- RD5/P1B RB3/AN9/PGM/C12IN2- RD5/P1B
37 29 37 29
RB4/AN11 RD6/P1C RB4/AN11 RD6/P1C
38 30 38 30
RB5/AN13/T1G RD7/P1D RB5/AN13/T1G RD7/P1D
39 39
RB6/ICSPCLK RB6/ICSPCLK
40 8 40 8
RB7/ICSPDAT RE0/AN5 RB7/ICSPDAT RE0/AN5
9 9
RE1/AN6 RE1/AN6
10 10
RE2/AN7 RE2/AN7
PIC16F887 PIC16F887

Vous aimerez peut-être aussi