Académique Documents
Professionnel Documents
Culture Documents
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
12/09/2022 FI-SICoM 3
Introduction et définitions aux systèmes embarqués
12/09/2022 FI-SICoM 4
Introduction et définitions : Système temps réel
Environnement
Restitution et
Acquisition Traitement
commande
12/09/2022 FI-SICoM 5
Généralisation -1….
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
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
12/09/2022
FI-SICoM 12
Architecture de processeur Harvard
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
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
Processeur
Mémoires
Unités périphériques et interfaces
d‘E/S
12/09/2022 FI-SICoM 17
Du µ-processeur au µ-
contrôleur
Faible consommation
Coût réduit
Encombrement réduit
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 :
12/09/2022 FI-SICoM 24
Microcontrôleurs
Architecture interne
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
- 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
• 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.
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)
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.
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.
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
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
12/09/2022 FI-SICoM 42
Remarques :
est de 25 mA.
12/09/2022 FI-SICoM 43
Structure d'un port d'entrée / sortie
12/09/2022 FI-SICoM 44
Fonctionnement en entrée
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
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
12/09/2022 FI-SICoM 49
Dimensionnement de la résistance
VD = 2V | VCC = 5V | I = 10mA
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
– On a toujours VD = 2V et IC = 10mA
– Pour la résistance R2 :
de 10
IB = 10 * IC / β = 1mA
12/09/2022 FI-SICoM 53
En utilisant un transistor
et VCE = 0.2V
•5 LEDs max !
un montage de ce type :
12/09/2022 FI-SICoM 54
•Interfaçage avec un microcontrôleur en entrée
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
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
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.
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
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
Exemple:
MikroC vous permet un accès individuel dans les variables 8 bits (char
des identifiants F0, F1, ..., F7. Être F7 le bit le plus significatif
Exemple:
PORTC.F0 = 1;
PORTD.F5 = 0;
PORTB.F7 = 1;
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
TRISC = 0b’00001111’; o
TRISC = 0x0F; o
TRISC = 15;
12/09/2022 FI-SICoM 74
Delay_ms (délai logiciel)
Exemple:
Générer un délai de 1 seconde
12/09/2022 FI-SICoM 75
Structure d'un programme en C (Boucle While)
// Définition des variables globales
void main(void)
{
// Définition des variables locales
// 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
void main(void)
{
// Définition des variables locales
// 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
void main(void)
{
// Définition des variables locales
// 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
L’algorithme
Allumage du led
Eteindre la led
Répétez l'étape 2
12/09/2022 FI-SICoM 79
Éclairage d’une LED (programme-1)
12/09/2022 FI-SICoM 80
Éclairage d’une LED (programme-2)
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.
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 );
}
}
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
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.
100001
010010
001100
010010
100001
12/09/2022 FI-SICoM 92
SYSTEMES D’ENTREE DES DONNEES
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 :
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 :
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;
}
}
Les Interruptions
Généralités sur les interruptions
assembleur, pas en C)
d'interruption).
Ces 34 bits sont accessibles dans les registres INTCON, PIE1, PIE2,
PIR1 et PIR2.
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 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.
RB0 à RB7 du port B, le front n’a pas d’importance. Les bits associés sont RBIE
Pour autoriser l’interruption sur la broche Rbi le bit i du registre IOCB doit être
mis à 1.
Cette interruption est provoquée par un changement d’état sur l’entrée RB0 du
Elle est gérée par son bit de validation INTE et son drapeau INTF.
{
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
- mesure de temps
Fonctionnement du Timer
Les timers sont des compteurs formés généralement d’un pré-diviseur suivi d’un
timer. Il faut bien noter que le programmeur devra remettre à zéro cet indicateur
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
•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.
•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
•Calcul du temps mis par le Timer pour faire lever son drapeau :
Mode Timer
Mode Compteur
broche RA4
Composition du Timer0
Prédiviseur
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.
d'impulsion minimale ou le temps mort entre deux impulsions doit être 2 Tosc +
seulement de 10 nS.
microcontrôleur:
EXEMPLE.1
Dans cet exemple la minuterie, sur la base de registre TMR0, est utilisée
de sorte que toute pression sur Input provoque TMR0 à compter une impulsion.
nommé TEST, la valeur logique 1 (5V) apparaît sur le pin3 de PORTC. Cette
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 :
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:
Exemples :
Timer 0:
bit T1OSCEN = 0
Timer 1 associé à un quartz
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
utilise le Timer 1 ou 2
•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 :
// prescaler 1:16
T2CKPS1_bit = 1;
T2CKPS0_bit = 1;
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_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);
}
}
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.
● Caractéristiques :
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
tandis que 1023 au positif Vref +. Ensuite, la tension mesurée sera calculée, à
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
- la ANS7 bits {} ANSEL Registre détermine si la broche PORTE.2 est analogique - CH7
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
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:
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 ;
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
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
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.
RV1 U1
1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
16
RC1/T1OSI/CCP2
2 17
0%
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
}
}
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%
%
* Full-Duplex ou Half-Duplex
-Norme RS232
(ports COM)
-Norme RS485
identiques
● Pour indiquer au récepteur le début d'une transmission, il faut lui envoyer un signal:
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).
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
● Exemple :
nombre de « 1 » impaire.
Bilan
● Pour que 2 équipements puissent échanger des données, il faut qu'ils soient:
Afin de pouvoir envoyer les signaux plus loin, la liaison série RS232
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.
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” :
recevoir les données. Ils sont au nombre de deux (un pour l'émission, l'autre
● 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.
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
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é
● 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
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
- BRG16 = 0 et BRGH = 0
- X forcément entier → X = 6
(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
asynchrone.
•Validation des lignes RC6 et RC7 comme broches d’entrée / sortie associées à
-La réception est validée en plaçant un '1' dans le bit CREN du registre RCSTA
TXSTA .
-Le bit TX9 du registre TXSTA permet de valider une transmission de 8 bits ou
de 9 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.
8 bits de données
2 bits STOP
sans parité
Registre SPBRG
erreur de 8,51%.
TX9 : '1' transmission de 9 bits (le 9ème bit sera un bit de STOP)
SENDB : '0'
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