Vous êtes sur la page 1sur 30

Les Microcontrôleurs et Systèmes embarqués A.

OUMNAD page 1

Système embarqué
Un système embarqué est défini comme un système électronique et informatique autonome, souvent
temps réel, spécialisé dans une tâche bien précise.
source: http://fr.wikipedia.org/wiki/Système_embarqué

Pour être caractérisé comme temps réel, le système embarqué doit répondre aux stimulis provenant
de son environnement dans un intervalle de temps faible qui dépend de la fonction réalisée.

Caractéristiques générales: (source: IFS_SysEmb_1_intro.pdf de Etienne Messerli)

• Dédié à une application spécifique


• Coût réduit, maximisation rapport performance/prix
• Volume restreint (compact, pas modulaire)
• Capacité mémoire adaptée
• Capacité de calcul appropriée à l'application
• Exécution temps réel (souvent)
• Fiabilité et sécurité de fonctionnement
• Consommation d’énergie maitrisée
• voir très faible en cas d’utilisation sur batterie
• …

L'élément central d'un système embarqué est le Microcontrôleur.


Le microcontrôleur est un système SoC, (Système On a Chip) on système sur une puce. C'un circuit
intégré qui regroupe, sur une seule et unique puce, les différents composants d'un ordinateur tels que
le processeur (CPU), la mémoire EEPROM pour le programme et les donnés permanentes, la mémoire
RAM pour les données temporaires, les périphériques d'interface avec l'environnement extérieur: E/S
logiques, E/S analogique, bus de communication (USART, I2C, ISP, USB, ETHERNET …)
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 2

Le microcontrôleur PIC16F887

PORTB PORTA Générateur


d'Horloge
Mémoire
Timer programme
ADC RAM
TMR0 EEPROM Flash
10 bits 96 registres
timer système 8 x 1024
TMR2 SFR mots de 14
MSSP bits
(I2C/SPI) timer 368 registres
TMR1 utilisateur
USART GPR
(RS232) Chien de
garde W CONFIG1
WDT
CONFIG2
CCP2 CCP1
Capture/Compar Capture/Compar EEPROM
PWM PWM Unité Données
ALU De contrôle 256 octets
PORTE PORTD PORTC
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 3

L’Horloge
• L'horloge système est un signal carré qui a une importance capitale. C'est elle qui cadence
l'exécution des programmes. Elle est aussi utilisée par les modules d'E/S.
• Le PIC dispose de deux générateurs d'horloge, un oscillateur interne et un oscillateur externe.
• L'horloge générée par ces générateurs sera appelée horloge de base. Sa fréquence est appelée fosc
sa période est appelée tosc,
• Le PIC est un processeur d'architecture RISC, il exécute une instruction par cycle (période)
d'horloge. L'horloge utilisée pour cadencer le programme est l'horloge instruction. Elle obtenue à
l'aide d'un diviseur de fréquence par 4. Sa fréquence est Fosc/4, sa période est Tcy = 4 * tosc
Oscillateur Interne
Horloge de base fosc
Oscillateur Externe
÷4 Horloge instruction fosc/4

• La configuration de l'horloge se fait à l'aide des Switchs du registre CONFIG1 et du registre SFR
OSCCON. Dans la suite, nous prendrons CONFIG1=23E4h pour travailler avec l'horloge interne.
CONFIG1
… FOSC2 FOSC1 FOSC0

OSC1/RA7 He
Oscillateur
OSC2/RA6 Externe
H
MX1 0
MX2 Fosc
Hi 1
Oscillateur
Interne

Hi

IRCF2 IRCF1 IRCF0 … SCS


OSCCON
• Les 3 switch <DOSC2,FOSC1,FOSC0> du registre le configuration CONFIG1 permettent de commander le
multiplexeur MX1 et de configurer l'oscillateur externe. La fréquence max de l'oscillateur externe
est 20MHz. Elle fixée par le composant externe: Quartz ou RC.
• Les 3 bits <IRFC2,IRFC1,IRFC0> du registre OSCCON permettent de choisir la fréquence de l'oscillateur
interne. Les choix possibles sont énumérés dans le tableau ci-dessous. Par défaut, l'oscillateur
interne délivre une horloge Fosc = 4MHz

OSCCON - IRCF2 IRCF1 IRCF0 OSTS HTS LTS SCS

1 1 1 8 MHz
1 1 0 4 MHz (défaut)
1 0 1 2 MHz
1 0 0 1 MHz
0 1 1 500 kHz
0 1 0 250 kHz
0 0 1 125 kHz
0 0 0 31 kHz

• Le bit SCS commande le multiplexeur MX2 pour permettre de basculer entre l'horloge interne et
externe. Si MX1 et positionné sur Hi, l'horloge sera interne quelque soit la valeur du bit SCS.
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 4

Le jeux D’instructions

Instructions Opérant sur registre Flags Cycles Codes machine


ADDWF F,d W+F {W,F ? d} C,DC,Z 1 00 0111 dfff ffff
ANDWF F,d W and F {W,F ? d} Z 1 00 0101 dfff ffff
CLRF F Clear F Z 1 00 0001 1fff ffff
COMF F,d Complémente F {W,F ? d} Z 1 00 1001 dfff ffff
DECF F,d décrémente F {W,F ? d} Z 1 00 0011 dfff ffff
DECFSZ F,d décrémente F skip if 0 {W,F ? d} 1(2) 00 1011 dfff ffff
INCF F,d incrémente F {W,F ? d} Z 1 00 1010 dfff ffff
INCFSZ F,d incrémente F skip if 0 {W,F ? d} 1(2) 00 1111 dfff ffff
IORWF F,d W or F {W,F ? d} Z 1 00 0100 dfff ffff
MOVF F,d F {W,F ? d} Z 1 00 1000 dfff ffff
MOVWF F W F 1 00 0000 1fff ffff

RLF F,d C 1 00 1101 dfff ffff


C {W,F ? d}

RRF F,d C
C 1 00 1100 dfff ffff
{W,F ? d}
SUBWF F,d F – W {W,F ? d} C,DC,Z 1 00 0010 dfff ffff
SWAPF F,d permute les 2 quartets de F {W,F ? d} 1 00 1110 dfff ffff
XORWF F,d W xor F {W,F ? d} Z 1 00 0110 dfff ffff

Instructions Opérant bit


BCF F,b RAZ du bit b du registre F 1 01 00bb bfff ffff
BSF F,b RAU du bit b du registre F 1 01 01bb bfff ffff
BTFSC F,b teste le bit b de F, si 0 saute une instruction 1(2) 01 10bb bfff ffff
BTFSS F,b teste le bit b de F, si 1 saute une instruction 1(2) 01 11bb bfff ffff

Instructions Opérant sur Valeur


ADDLW V W+V W C,DC,Z 1 11111x kkkk kkkk
ANDLW V W and V W Z 1 11 1001 kkkk kkkk
IORLW V W or V W Z 1 11 1000 kkkk kkkk
MOVLW V V W 1 11 00xx kkkk kkkk
SUBLW V V–W W C,DC,Z 1 11 110x kkkk kkkk
XORLW V W xor KV W Z 1 11 1010 kkkk kkkk

Autres InstructionS
CLRW Clear W Z 1 00 0001 0xxx xxxx
CALL etqt Branchement à un sous programme de label etqt 2 10 0kkk kkkk kkkk
GOTO etqt branchement à la ligne de label etqt 2 10 1kkk kkkk kkkk
NOP No operation 1 00 0000 0xx0 0000
RETURN retourne d'un sous programme 2 00 0000 0000 0000
RETFIE Retour d'interruption 2 00 0000 0000 1001
RETLW K retourne d'un sous programme avec K dans W 2 11 01xx kkkk kkkk
SLEEP se met en mode standby TO, PD 1 00 0000 0110 0011

La soustraction et Les Flags

STATUS IRP RP1 RP0 Z DC C

A -B
A = B ==> Z=1 , C=1 Z = 1 => A = B
A > B ==> Z=0 , C=1 C = 0 => A < B
A < B ==> Z=0 , C=0 C = 1 => A ≥ B
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 5

Représentation des nombres :


Base Préfixe Exemple (36)
Décimal D'nnn' D'36'
.nnn .36
Hexadécimal H'nn' H'24'
0xnn 0x24
nnh 24h
Binaire B'….' B'00100100'
Octal O'nnn' O'44'

Quelques directives :

ORG Position dans la EEPROM programme ou la EEPROM de données


_ _CONFIG Pour définir les switches de configuration
RADIX Base par défaut
EQU Affecter un alias à une constante
#DEFINE Affecter un alias à une constante ou une chaine
CBLOCK/ENDC Blocs d’alias
DE Déclarer une donnée dans la EEPROM de donnée
DT Sert à définir des tableaux
END Fin de programme (Arrêt de compilation)
INCLUDE Inclure un fichier source

Les macros :
Une macro consiste à affecter un alias à un ensemble d’instructions :

BANK0 macro
Bcf STATUS,RP0
Bcf STATUS,RP1
endm

Quelques Opérateurs interprétés lors de la phase d’assemblage :

opérateur déscription exemple


+ addition ALPHA EQU 12
- Soustraction ou négation BETA EQU 50
* multiplication movlw -5
/ division addlw ((ALPHA + 25)*3 –BETA) / 2
~ complément movlw ~0x0F équivaut à movlw 0xF0
% modulo movlw BETA % 16
≪ Décalage à gauche Movlw 3 ≪ 2 (3 décalée à gauche de 2 position
=12)
≫ Décalage à droite Movlw BETA ≫ 3
& ET bit par bit
| OU bit par bit Movlw ((BETA & ALPHA) | 0x0F) ^ 25
^ XOR bit par bit
LOW Extrait l'octet bas Movlw LOW 37500 ; W=B'01111100'=124
HIGH Extrait l'octet haut movlw HIGH 37500 ;W=B'10010010'=146
UPPER Extrait le 3ème octet à partir Movlw UPPER 44332211h ; W=33h
de la droite Movlw UPPER (44332211h ≫ 8) ; W=44h
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 6

Accès Direct aux registres de la RAM :

Bank 0 (00) Bank 1 (01) Bank 2 (10) Bank 3 (11)


00h INDF 80h INDF 100h INDF 180h INDF
01h TMR0 81h OPTION_REG 101h TMR0 181h OPTION_REG
02h PCL 82h PCL 102h PCL 182h PCL
03h STATUS 83h STATUS 103h STATUS 183h STATUS
04h FSR 84h FSR 104h FSR 184h FSR
05h PORTA 85h TRISA 105h WDTCON 185h SRCON
06h PORTB 86h TRISB 106h PORTB 186h TRISB
07h PORTC 87h TRISC 107h CM1CON0 187h BAUDCTL
08h PORTD 88h TRISD 108h CM2CON0 188h ANSEL
09h PORTE 89h TRISE 109h CM2CON1 189h ANSELH
0Ah PCLATH 8Ah PCLATH 10Ah PCLATH 18Ah PCLATH
0Bh INTCON 8Bh INTCON 10Bh INTCON 18Bh INTCON
0Ch PIR1 8Ch PIE1 10Ch EEDATA 18Ch EECON1
0Dh PIR2 8Dh PIE2 10Dh EEADR 18Dh EECON2
0Eh TMR1L 8Eh PCON 10Eh EEDATH 18Eh réservé
0Fh TMR1H 8Fh OSCCON 10Fh EEADRH 18Fh réservé
10h T1CON 90h OSCTUNE 110h 190h
11h TMR2 91h SSPCON2 111h 191h
12h T2CON 92h PR2 112h 192h
13h SSPBUF 93h SSPADD 113h 193h
14h SSPCON 94h SSPSTAT 114h 194h
15h CCPR1L 95h WPUB 115h 195h
16h CCPR1H 96h IOCB 116h 196h
17h CCP1CON 97h VRCON 117h 197h
18h RCSTA 98h TXSTA 118h 198h
19h TXREG 99h SPBRG 119h 199h
1Ah RCREG 9Ah SPBRGH 11Ah 19Ah
1Bh CCPR2L 9Bh PWM1CON 11Bh 19Bh
1Ch CCPR2H 9Ch ECCPAS 11Ch 19Ch
1Dh CCP2CON 9Dh PSTRCON 11Dh 19Dh
1Eh ADRESH 9Eh ADRESL 11Eh 19Eh
1Fh ADCON0 9Fh ADCON1 11Fh 19Fh
20h A0h 120h 1A0h
21h A1h 121h 1A1h
22h A2h 122h 1A2h
23h A3h 123h 1A3h
24h A4h 124h 1A4h

. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .

6Ch ECh 16Ch 1ECh


6Dh EDh 16Dh 1EDh
6Eh EEh 16Eh 1EEh
6Fh EFh 16Fh 1EFh
70h F0h 170h 1F0h
71h F1h 171h 1F1h
72h Zone F2h 172h 1F2h
. . . . . . . .
. . . . . . . .
. Commune . . . . . .
7Dh FDh 17Dh 1FDh
7Eh FEh 17Eh 1FEh
7Fh FFh 17Fh 1FFh

Pour toucher un registre de la RAM, il faut d'abord choisir son bank à l'aide des 2 bits RP0 et RP1

STATUS IRP RP1 RP0 Z DC C

BANK0 macro
Bcf STATUS,RP0
Bcf STATUS,RP1
BANK1
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 7

Accès INDIRECT aux registres de la RAM :

Pour accéder à un registre de la RAM, on place son adresse dans un registre d’adressage (pointeur)
appelé FSR. Pour accéder au contenu du registre pointé, on utilise le mot INDF.
FSR est un registre de 8 bits, il permet d’adresser seulement 256 position (00h → FFh). Or la RAM fait
512 octets (000h → 1FFh). On utilise le bit IRP de STATUS pour compléter le registre d’adressage. On
obtient le pointeur d’adressage :

IRP FSR

La RAM apparait alors coupée en deux pages. FSR permet d’adresser à l’intérieur d’une page, et le bit
IRP permet de choisir la page

Page 0 Page 1
0 00h 1 00h
0 01h 1 01h
0 02h 1 02h
0 03h 1 03h
0 04h 1 04h
. .
. .
. .
. .
. .
. .
. .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .

0 FCh 1 FCh
0 FDh 1 FDh
0 FEh 1 FEh
0 FFh 1 FFh

Exemple :
Pour écrire 25 dans le registre d’adresse 04h, et les caractères A et B dans les registre 1FCh et 1FDh
Movlw 04h
Movwf FSR
Bcf STATUS,IRP

Movlw .25
Movwf INDF

Bsf STATUS,IRP
Movlw FCh
Movwf FSR

Movlw 'A'
Movwf INDF
ADDLW 1
INCF FSR,f
Movwf INDF

Exercices
• Permuter le contenu de deux cases mémoire
• Ajouter une valeur à une zone mémoire
• Comparer le contenu d’une zone mémoire à une valeur et faire deux actions différentes
• Permuter deux zones mémoire
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 8

Les ports d'E/S


• 36 E/S regroupées dans 5 ports, PORTA, PORTB, PORTC, PORTD, PORTE.

PORTE
RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 RE3

PORTD PORTC RE2

RE1
PORTA PORTB
RE0
RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0

• Chaque E/S peut fonctionner soit en entrée soit en sortie. 14 E/S peuvent fonctionner soit en E/S
numériques soit en entrées analogiques AN0, AN1, AN2 … AN13
• Le chois de la direction se fait à l'aide des bits TRIS regroupés dans les registres de direction TRISA,
TRISB, TRISC, TRISD, TRISE
TRIS = 0 Sortie TRIS=1 Entrée

1 1 1 0 0 0 1 0 TRISA

Exemple
RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0 PORTA

• Le choix entre analogique et numérique se fait par les bits ANS regroupés dans les registres ANSEL
et ANSELH
ANS = 0 Numériques ANS = 1 Analogiques

ANSELH ANSEL

ANS13 ANS12 ANS11 ANS10 ANS9 ANS8 ANS7 ANS6 ANS5 ANS4 ANS3 ANS2 ANS1 ANS0

AN13 AN12 AN11 AN10 AN9 AN8 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0
RB5 RB0 RB4 RB1 RB3 RB2 RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0

ANSEL 1 1 0 0 0 0 1 0

PORTE RE3 RE2 RE1 RE0 RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0 PORTA

• Au démarrage du PIC, tous les bits TRIS et ANS sont à 1 toutes les E/S sont configurées en
entrée. Toutes le E/S-A/N sont configurées en analogiques
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 9

Méthode de développement:

monprog.asm monprog.hex

compilation
Programme Programme
source Exécutable

Programmeur

MPLAB IDE 8.xx:

Environnement de développement intégré de Microchip .


Téléchargement gratuit sur www.microchip.com : Aller sur la page MPLAB X, chercher (en bas) l’onglet
Download archives et télécharger la dernière version MPLAB IDE 8.xx
Installer et faire la configuration ci-dessous
Configure → Select device → PIC16f887
• Commencer un nouveau fichier pour écrire un programme :

o file new ou cliquer sur l'icône


o Dès le début, sauvegarder votre programme avec l’extension .asm pour profiter des avantages
d'affichage contextuel de l’éditeur.

Le programme doit être organisé comme suit:

__CONFIG 2007h, 23E4h


__CONFIG 2008h, 3FFFh
INCLUDE p16f887.inc
directives et macros s’il y en a

Programme
Zone Principal
réservée
aux
étiquettes

Fonctions s’il y en a

END
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 10

• Compiler le programme : Project → Quickbuild


Maintenant on dispose du programme exécutable .hex qu’il faut uploader dans le PIC à l’aide d’un
programmeur. On utilise souvent le terme de flasher le PIC.
• Lors du flashage du PIC, le programme est flashé dans la mémoire EEPROM-PROGRAM. Les
données sont flashées dans la mémoire EEPROM-DATA. Il faut utiliser les directives ORG et DE pour
séparer les données du programme.

Le logiciel de simulation PROTEUS-ISIS :


Si on ne dispose pas d’un PIC et d’un programmeur, on peut faire des simulations sur le logiciel
Proteus-Isis :
1 15
RE3/MCLR/VPP RC0/T1OSO/T1CKI
• Placer un PIC 2
RC1/T1OSI/CCP2
16
17
RA0/AN0/ULPWU/C12IN0- RC2/P1A/CCP1
3 18
• Rajouter les composants pour obtenir le système désiré 4
RA1/AN1/C12IN1- RC3/SCK/SCL
RA2/AN2/VREF-/CVREF/C2IN+ RC4/SDI/SDA
23
5 24
RA3/AN3/VREF+/C1IN+ RC5/SDO
• Double-clic sur le PIC 6
7
RA4/T0CKI/C1OUT RC6/TX/CK
25
26
RA5/AN4/SS/C2OUT RC7/RX/DT
14
o Préciser la valeur de l’horloge RA6/OSC2/CLKOUT
13 19
RA7/OSC1/CLKIN RD0
20
RD1
o Cliquer sur et sélectionner le programme .hex 33
RB0/AN12/INT RD2
21
34 22
RB1/AN10/C12IN3- RD3
35 27
réalisé avec MPLAB 36
RB2/AN8 RD4
28
RB3/AN9/PGM/C12IN2- RD5/P1B
37 29
RB4/AN11 RD6/P1C
• Cliquer sur pour lancer la simulation 38
39
RB5/AN13/T1G RD7/P1D
30
RB6/ICSPCLK
40 8
RB7/ICSPDAT RE0/AN5
9
RE1/AN6
10
RE2/AN7
PIC16F887
Voici les nomenclatures de quelques composants :

RES : Résistance
CAP : Condensateur
LOGICPROBE : Voyant logique pour visualiser l’état d’une sortie logique (mieux qu’une LED)
LOGICSTATE : générateur logique interactif : Change d’état à chaque clic
LOGICTOGGLE : générateur d’impulsion interactif : au clic, il change d’état puis revient à son état de
repos
POT-HG : Potentiomètre interactif
NPN : Transistor NPN
PNP : Transistor PNP
LM016L : afficheur LCD 2x16
7SEG-BCD : Afficheur 7 segment avec décodeur incorporé
7SEG-COM-ANODE : Afficheur 7 segments anode commune (rouge)
7SEG-COM-CATHODE : Afficheur 7 segments cathode commune (rouge)
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 11

Premier Programme:

On va réaliser un premier programme qui fait clignoter


Positionner les switches de configuration
une LED branchée sur la broche RD3 au rythme
Inclure le fichier p16f887.inc
0.5s/0.5s
• Pour les switches de configuration, on prendra
toujours CONFIG1=23E4h, CONFIG2=3FFFh ce qui Configurer RD3 en sortie
choisit de travailler avec l'horloge interne.
• Nous ne toucheront pas au registre OSCCON, donc
l'horloge interne est ajustée à sa fréquence par RD3 = 1 (allumer)
défaut: Fosc = 4MHz. => Fosc/4 = 1MHz, => 1 cycle
machine Tcy = 1 μs
Attendre ½ s
• Le fichier p16f887.inc contient la déclaration des
noms des registres et des bits spéciaux.
RD3 = 0 (éteindre)
• Pour les temporisations, on utilisera la librairie
my_lib.asm qui contient les 3 fonctions:
Attendre ½ s
tempo1 → T1 = (3 × W + 7) Cycles
tempo2 → T2 = (770 × W + 7) Cycles
tempo3 → T3 = (197122 × W + 7) Cycles
• Sachant que les ports d'E/S sont situés dans bank0 et les registres de direction TRIS sont situés
dans bank1, on utilisera le fichier d'entête macros.asm qui contient les 4 macros BANK0, BANK1,
BANK2, BANK3,

• Ecrire le programme en assembleur et le vérifier sur ISIS

Deuxième Programme:
Cette fois on va brancher la LED sur RB3 et utiliser une boucle légèrement améliorée.

Configuration

Changer l'état de RB3

Attendre ½ s

Attention au problème ANSELH sur ISIS

Chenillard sur PORTD:


On branche 8 LEDs sur PORTD et on fait circuler une LED allumée vers la gauche au rythme de la ½ s

PIC PORTD

Tester l'état d'une entrée:


On branche un interupteur sur la broche RB7, une LED sur RE2 et 8 LEDs sur PORTD
Ecrire le programme qui teste l'état de l’interrupteur, s'il est égal à 0, on clignote la LED RE2, s'il
est égal à 1, on réalise un chenillard sur PORTD
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 12

Vcc RE2

RB7
PIC
PORTD

Attendre qu'une entrée passe à 1 ou à 0:


Programme qui attend que l'entrée RB7 passe à 1 pour démarrer le clignotement de RE2. Le clignotement
continue même si RB7 repasse à 0

Programme qui surveille l'entrée RB6, chaque fois qu'il reçoit une impulsion ⍽, il décale PORTD d'un bit vers la
gauche

Attendre qu'une entrée change d'état


La meilleure façon de réaliser cette tache est l'utilisation des interruptions. En 0
?
attendant, on va utiliser l'algorithme ci-dessous
1
Programme qui surveille l'entrée RC0. Chaque fois qu'elle change d'état, il fait
clignoter RC5 5 fois. attendre ↓

attendre ↑

Surveiller deux entrées


La aussi, la meilleure façon est l'utilisation des interruptions. En attendant on va réaliser l'algorithme
suivant:

oui
E1 ok

non

oui
E2 ok

non

T2

suite

T1
BP1
suite
RC1

Programme qui surveille deux boutons poussoirs. Si BP1 est PIC PORTD
actionné, on décale le chenillard une position vers la BP2
gauche. Si BP2 est actionné, on décale le chenillard une
RC6
position vers la droite.
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 13

Commander une sortie de puissance


Le programme qui commande une LED peut très bien commander une charge de puissance (Lampe,
moteur, Climatiseur …) Il suffit d'utiliser une interface de puissance.

Vrel

Vcc

220V
Relai

Rb
PIC
Lampe
Vcc
Rb < β Rrel
Vrel
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 14

Commande d'un afficheur LCD

VDD
VEE

VSS
RW
RS
D7
D6
D5
D4
D3
D2
D1
D0

E
• Deux lignes de 40 caractères dont 16 sont visibles

14
13
12
11
10
9
8
7

6
5
4

3
2
1
• Les informations sont envoyées sous forme d'octets. L'interprétation dépend de l'entrée RS:
o RS = 0 → L'octet envoyé sera interpré té comme une commande
o RS = 1 → L'octet envoyé est le code ASCII d'un caractère qui sera affiché
• L'octet peut être envoyé en un seul coup (mode 8 bits) ou moitié-moitié (mode 4 bits). Quelque soit
le mode, l'envoi d'un octet ou d'un demi octet est toujours validé par une impulsion ⎍ sur l'entrée E
• Les octets de commandes sont regroupés dans le tableau ci_dessous

Commandes D7 D6 D5 D4 D3 D2 D1 D0 Description Délai


Clear Screen 0 0 0 0 0 0 0 1 Efface écran, curseur début première ligne 1,64ms
Return home 0 0 0 0 0 0 1 X Curseur en début de première ligne 1,64ms
Sens de l'affichage
Entry mode set 0 0 0 0 0 1 I/D S I/D=1→ gauche à droite, I/D=0 → droite à gauche 40 µs
S=0→ curseur se dé place, S=1→ texte se dé place
D: affichage ON/OFF, C: curseur ON/OFF,
Display on/off 0 0 0 0 1 D C B 40 µs
B: clignotement du curseur ON/OFF
Décale le curseur ou tout l'affichage à droite ou à gauche
Cursor or display shift 0 0 0 1 S/C R/L X X S/C=0→ dé caler curseur, S/C=1→ dé caler afeichage 40 µs
R/L=0→ vers la gauche, R/L=1 vers la droite
Définit taille de l'interface, de l'afficheur est des caractères
DL=0→ mode 4 bits, DL=1→ mode 8 bits
Function set 0 0 1 DL N F X X 40 µs
N=0→ afeicheur 1 ligne, N=1→ afeicheur 2 ou 4 lignes
F=0→ fonte 5x7, F=1→fonte 5x10.
Définit la position courante dans la CG RAM qui peut servir à
Set CG RAM address 0 1 A5 A4 A3 A2 A1 A0 40 µs
la création de nouveaux caractères
Définit la position courante dans la mémoire d'affichage DD
Set DD RAM address 1 A6 A5 A4 A3 A2 A1 A0 40 µs
RAM. L'adresse de première position de la 2ème ligne est 64
Read Busy Flag & Lit le drapeau BF et l'dresse courante (position curseur)
BF A6 A5 A4 A3 A2 A1 A0 1 µs
address BF=0→ afeicheur prêt, BF=1→afeicheur occupé

• La librairie malib.asm contient des fonctions permettant d'utiliser l'afficheur LCD en mode 4 bits

PORTB

PIC
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 15

lcd_init: Initialisation de l'afficheur en mode 4 bits sur PORTB. Doit être invoquée avant tout accès
à l'afficheur
lcd_char: Affiche le caractère présent dans W à la position du curseur
lcd_puts: Affiche une chaine déclarée dans la EEPROM. W=adresse du premier caractère de la
chaine. La chaine doit se terminer par le caractère NULL (code ascii 0)
lcd_cmd: Envoie l'octet de commande présent dans W
lcd_locate: Positionne le curseur à la position présente dans W. La ligne 1 commence à 0 et la ligne 2
commence à 64
lcd_clrscr : Efface l'écran effacer l'écran et positionne le curseur début ligne 1
lcd_byte_d : Affiche l'octet présent dans W en décimal
lcd_byte_h : Affiche l'octet présent dans W en Hexadécimal
lcd_word_d: Affiche le word présent dans les variables AH, AL en décimal. AL et AH sont déjà
déclarés dans BANK0

Programme qui produit l'affichage représenté sur la figure

Microcontroleurs
2018

Programme qui affiche un compteur 8bits (0 255 modulo 256 ) (rythme 0.5s/0.5s)

Programme qui affiche un compteur 16 bits (0 65535 modulo 65536 ) (rythme 0.1s/0.1s)

Programme qui affiche deux chaines de plus de 16 caractères (une chaine par ligne) puis les fait défiler
vers la gauche au rythme de la demi-seconde

fonction lcd_puts qui affiche un string préalablement déclaré dans la mémoire EEPROM. La chaine doit se
terminer par le caractère NULL (code ascii 0). Lors de l'appel de la fonction, W doit contenir l'adresse
du premier caractère de la chaine
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 16

Accès à la mémoire DATA-EEPROM


Le PIC contient 2 mémoires permanentes:
• La mémoire EEPROM-PROGRAM. Elle fait 8k mots de 14 bits, elle commence à l'adresse 0000h. Son
rôle est de contenir le programme. Chaque position contient le code machine d'une instruction.
• La mémoire EEPROM-DATA. Elle fait 256 octets. Elle commence à l'adresse 2100h. Elle est
disponible à l'usage de l'utilisateur.

On se contente dans ce paragraphe d'étudier l'accès à la mémoire EEPROM-DATA. Il y a deux


méthodes pour accéder à cette mémoire:
1) Ecriture pendant le flashage:
ORG 2100h
A1 DE 10, 45h, "BONJOUR", 25
A2 "BONSOIR",0
ORG 2160h
A3 DE "Bonne Année",0,33h, 56

ORG 0
programme
--------

2) Accès par programme


Pour accéder à la mémoire EEPROM-DATA pendant la phase d'exécution, on utilise les registres
EEADR, EEDATA, EECON1, EECON2

EECON1 : EEPGD — — — WRERR WREN WR RD

EEPGD : Accès à la mémoire EEPROM-DATA ou EEPROM-PROG


0 : EEPROM-DATA
1 : EEPRoM-PROG
WRERR : Flag indiquant une Erreur d'écriture
0 : Pas d'erreur, l'écriture s'est terminée normalement
1 : Une erreur s'est produite, l'écriture s'est arrêtée prématurément
WREN : Bit de protection de la EEPROM
0 : Ecriture interdite
1 : Ecriture autorisée
WR : Write Enable. Ce bit doit être mis à 1 pour démarrer l'écriture d'un octet. Il est remis à zéro
automatiquement à la fin de l'écriture. Ce bit ne peut pas être mis à zéro par une instruction.
RD : Read Enable. Ce bit doit être mis à 1 pour démarrer la lecture d'un octet. Il est remis à zéro
automatiquement à la fin de la lecture. Ce bit ne peut pas être mis à zéro par une instruction

Procédure de lecture
1) le bit EEPGD doit être à 0 (c'est sa valeur par défaut)
2) Placer l’adresse relative de la position à lire dans le registre EEADR,
3) Mettre le bit RD à 1 pour démarrer la lecture. Le PIC transfert la donnée demandée dans le registre
EEDATA et remet le bit WR à 0 automatiquement. L'opération de lecture prend moins d'un cycle machine
4) Traiter la donnée disponible dans EEDATA,
5) Recommencer au point 2 si on a d'autres données à lire,
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 17

Procédure d'écriture
1) Le bit EEPGD doit être à 0 (c'est sa valeur par défaut)
2) Le bit WREN doit être à 1 sinon toute écriture sera soldée par un échec
3) Faire les opérations suivantes pour chaque octet à écrire
a) Placer l’adresse relative de la position à écrire dans le registre EEADR
b) Placer la donnée à écrire dans le registre EEDATA
c) Ecrire 55h dans EECON2
d) Ecrire AAh dans EECON2
e) Positionner le bit WR à 1 pour démarrer l'opération d'écriture,

Le bit WR revienne automatiquement à 0 à la fin de l'opération d'écriture (≈ 10ms)


Pour accéder de nouveau à la EEPROM, il faut attendre que WR revienne à 0
Les étapes c), d) et e) doivent obligatoirement être exécutées dans cet ordre et ne doivent pas
être interrompues par une interruption.

Programme qui écrit l'alphabet dans la mémoire EEPROM à partir de la position 40h

Programme qui déclare une chaine à partir de la position 20h de la EEPROM à l'aide des directives ORG et
DE puis la relit octet par octet et la place dans la RAM à partir de la position 190h

Programme qui déclare une chaine dans la EEPROM à l'aide des directives ORG et DE puis la relit octet par
octet et l'affiche sur l'afficheur LCD

Programme qui déclare deux chaines dans la EEPROM à l'aide des directives ORG et DE puis les affiche sur
l'afficheur LCD (une chaque ligne) à l'aide de la fonction lcd_puts

Programme qui cherche la valeur minimale des 10 premières cases mémoire de la EEPROM et l'affiche sur
l'afficheur LCD

Programme qui copie le contenu de la zone mémoire RAM [190h, 1B0h] dans la mémoire EEPROM à partir de la
position 20h

Programme qui copie le contenu de la zone mémoire EEPROM [20h, 90h] dans la mémoire RAM à partir de la
position 110h
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 18

Mécanisme d'interruption

Une interruption est un événement qui provoque la suspension temporaire du programme en cours
pour aller exécuter une procédure d'interruption. A la fin de cette procédure, le microcontrôleur
reprend le programme à l’endroit où il l’a laissé.
A chaque interruption sont associés deux bits, un bit de validation et un drapeau. Le premier permet
au programmeur (nous) d'autoriser ou non l'interruption. Le second est un drapeau (bit) levé par la
source d'interruption pour indiquer qu'elle demande une interruption. Après le traitement de
l'interruption, le drapeau doit être ramené à 0. (Pour certaines interruptions, le drapeau revient à 0
automatiquement, pour d'autres, c'est au programmeur de le ramener à 0.)

Déroulement d'une interruption


Lorsque l'événement déclencheur d'une interruption intervient, alors son drapeau passe à 1 (levé). Si
l'interruption a été validée au préalable (bits de validations = 1), elle est alors déclenchée: Le
programme arrête ce qu'il est en train de faire et va exécuter la procédure d'interruption qui se trouve
à l'adresse 4 de la mémoire programme.
Pour traiter l'interruption, le processeur procède comme suit:
• Il termine l'instruction qu'il est en train d'exécuter,
• Il place le bit GIE à "0" pour inhiber toutes les interruptions (afin qu'il ne soit pas dérangé pendant
l'exécution de la procédure d'interruption en cours).
• il sauvegarde l'adresse contenue dans le PC (Program Counter) dans la pile, puis la remplace par la
valeur 0004 (adresse de la routine d'interruption).
• Il exécute la procédure d'interruption,
• A la fin de la procédure d'interruption (instruction RETFIE), il remet le bit GIE à 1 (autorisant ainsi
un autre événement). Il recharge le contenu du PC à partir de la pile ce qui permet au programme
de reprendre là où il s'est arrêté

Sources d'interruptions
Validation Validation
Interruption Sources d’interruption Flag
individuelle Globale
INT Transition sur l’entrée RB0/INT INTE GIE INTF
Transition sur une entrée du PORTB. (Interrupt
IOCB IOCBx GIE, RBIE RBIF
On change on PORTB)
T0I Débordement du Timer TMR0 T0IE GIE T0IF
ADI Fin de conversion A/N ADIE GIE, PEIE ADIF
Changement à la sortie des comparateurs
C1I, C2I CxIE GIE, PEIE CxIF
analogiques
Détection d’une défaillance sur un élément externe
OSFI OSFIE GIE, PEIE OSFIF
de l’horloge (Fail-Safe Clock Monitor Interrupt)
RCI Un Octet est reçu sur l'USART RCIE GIE, PEIE RCIF
TXI Fin transmission d'un octet sur l'USART TXIE GIE, PEIE TXIF
TMR1I Débordement de Timer TMR1 TMR1IE GIE, PEIE TMR1IF
TMR2I Timer TMR2 a atteint la valeur programmée TMR2IE GIE, PEIE TMR2IF
Capture/Comparaison de TMR1 avec module
CCP1I CCP1IE GIE, PEIE CCP1IF
CCP1
CCP2I Capture/comparaison de TMR1 avec module CCP2 CCP2IE GIE, PEIE CCP2IF
EEI Fin d'écriture en EEPROM EEIE GIE, PEIE EEIF
CCLI Collision sur bus SSP en mode I2C BCLIE GIE, PEIE BCLIF
Sorties périodiques du mode sleep (Ultra Low-
ULPWUI ULPWUIE GIE, PEIE ULPWUIF
Power Wake-up interrupt)
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 19

Localisation des bits de validation et des drapeau


INTCON ( all) GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
PIE1 (bank1) - ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
PIR1 (bank0) - ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
PIE2 (bank1) OSFIE C2IE C1IE EEIE BCLIE ULPWUIE - CCP2IE
PIR2 (bank0) OSFIF C2IF C1IF EEIF BCLIF ULPWUIF - CCP2IF
IOCB (bank1) IOCB7 IOCB6 IOCB5 IOCB4 IOCB3 IOCB2 IOCB1 IOCB0
OPTION_REG(bk1) INTEDG

L'interruption INT (Entrée RB0 de PORTB)


Cette interruption est provoquée par un changement d'état sur l'entrée RB0 de PORTB. Celle-ci doit
être programmée en entrée. En plus de son bit de validation INTE et son drapeau INTF, elle est gérée
aussi par le bit INTEDG qui détermine le front sur lequel l'interruption se déclenche, 1=montant,
0=descendant. Ce bit est situé dans le registre OPTION_REG.
Cette interruption peut sortir le PIC du mode sleep si le bit INTE a été positionné au préalable.
INTF . Wake-up si mode sleep

Transition sur RB0

INTE . Déclenchement de
l'interruption
GIE
Le drapeau INTF doit être ramené à 0 par le programme

L'interruption IOCB
Cette interruption est provoquée par un changement d'état sur n’importe quelle entrée de PORTB. Le
front n'a pas d'importance. Elle est annoncée par le drapeau RBIF. Sa validation se fait (globalement)
par les bits GIE et RBIE, et individuellement (pour chaque entrée de PORTB) par les bits du registre
IOCB (bank1)

Transition sur RB0


IOCB0
Transition sur RB1
IOCB1
Drapeau RBIF
Transition sur RB2
IOCB2 Wake-up si mode sleep
Transition sur RB3
IOCB3
Déclenchement de
Transition sur RB4
RBIE L'interruption
IOCB4 GIE

Transition sur RB5


IOCB5
Transition sur RB6
IOCB6
Transition sur RB7
IOCB7

Attention:
Le drapeau RBIF ne peut être remis à zéro sans l'accès préalable (lecture/écriture) au port PORTB.

BANK1
Attention: bsf IOCB,IOCB5
A la mise sous tension, le drapeau RBIF peut être égal à 1 ce BANK0
movf PORTB,w
qui peut déclencher intempestivement l’interruption. Pour y bcf INTCON,RBIF
remédier il faut baisser le drapeau avant de valider bsf INTCON,RBIE
entièrement l'interruption bsf INTCON,GIE
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 20

La levé du drapeau RBIF peut sortir le PIC du mode sleep si le bit de validation RBIE a été positionnés
au préalable.

Exercices:

Chaque fois qu'une transition 1→ 0 survient sur l'entrée RB0, la LED branchée sur la sortie RB1 clignote
5 fois au rythme de la ½ seconde.

Programme qui fait sonner 5 fois l'alarme branchée sur RA5 chaque fois qu'un des 3 capteurs branchés sur
RB0, RB3 et RB7 est actionné

C1 RB0 PIC
C2 RB3 RA5

C3 RB7

Programme qui réalise une division de fréquence par une valeur DIV qui sera lue sur PORTD.
Le signal d'entrée est appliqué sur l'entrée RB5. Le signal de sortie est généré sur la sortie RB4.
On utilisera l'interruption IOCB pour détecter les transitions du signal d'entrée.
L'algorithme est simple. On compte les transitions du signal d'entrée. Chaque fois qu'on a compté DIV
transitions, on change l'état du signal de sortie.

PIC
RB5 RB4

PORTD

DIV

Exercice montrant la nécessité de sauvegarder environnement (W, STATUS, FSR …)


Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 21

Le convertisseur analogique Numérique


CHS<3:0> ADCON0
0000 ADCON1
AN0/RA0
RA3/VREF+ Vdd
AN1/RA1 0001

AN2/RA2 0010
1 0
AN3/RA3 0011 VCFG0
GO/DONE
AN4/RA5 0100
Start Vref+
AN5/RE0 0101

0110 S
AN6/RE1 ADRESL

AN7/RE2 0111 ADCS1 ADCS0 CAN ADRESH


1000 Tosc
AN8/RB2
Fosc DIV
1001 CLK
AN9/RB3 MXR
AN10/RB1 1010 Tad Vref-
Oscillateur
AN11/RB4 1011
RC dédié
VCFG1
AN12/RB0 1100 1 0

AN13/RB5 1101

CVREF 1110

1111 RA2/VREF- Vss


FVREF

ADCON0 ADCS1 ADCS0 CHS3 CHS2 CHS1 CHS0 GO_DONE ADON

ADCS1:ADCS0 : Choix de l'horloge de conversion, Tad = Tosc × div doit être ≥ 1.6µs
00 : div = 2
01 : div = 8
10 : div = 32
11 : Oscillateur RC dédié au CAN, Tad est de l'ordre de 4 µs

<CHS3:CHS0> : Choix du canal analogique à convertir (Voir figure)

GO_DONE : En plaçant ce bit à 1, on démarre une Conversion. A la fin de la conversion, il revient automatiquement à 0

ADON : Ce bit permet d'activer/désactiver le CAN


0 : CAN désactivé
1 : CAN activé

ADCON1 ADFM - VCFG1 VCFG0 - - - -

ADFM : justification à droite ou à gauche du résultat dans les registre ADRESH et ADRESL
ADRESH ADRESL
1 : justifié à droite 000000xx xxxxxxxx
0 : justifié à gauche xxxxxxxx xx000000

VCFG1 : Choix de la tension de référence inférieure


0 : Vref- = Vss (=masse)
1 : Vref- = AN2/RA2
VCFG0 : Choix de la tension de référence supérieure
0 : Vref+ = Vdd (=5V)
1 : Vref+ = AN3/RA3
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 22

La procédure de programmation est simple. Après la configuration des registres ADCON1 et


ADCON0, on démarre la conversion à l'aide du bit GO_DONE. On attend la fin de conversion en
surveillant ce dernier. On exploite le résultat présent dans les registres ADRESL et ADRESH

Ve
Va
S
Va Ve
CAN

10 pF

2Tad

12Tad Tacq

GO/DONE

nous automatique

• Le temps d'acquisition Tacq est de l'ordre de 4μs,


• Chaque fois qu'on change de canal, il faut attendre au moins Tacq avant de démarrer une conversion,
• A la fin d'une conversion, il faut attendre au moins 2Tad + Tacq avant de démarrer une nouvelle
conversion

Travaux Dirigés

Programme qui converti la tension appliquée à RB2 et recopie ADRESL dans PORTC et ADRESH dans PORTD. On
travaille ave Fosc = 4MHz

Programme qui converti la tension appliquée à RE2 et affiche le résultat sur l'afficheur LCD

Programme qui converti les tension appliquée à RA0, RA1, RA2 et RA3 et affiche les résultat sur
l'afficheur LCD

Programme qui fait l'acquisition de 40 échantillons du signal appliqué sur RE0, et recopie les résultats
dans la RAM à partir de la position 190h. L'échantillonnage se fera à la vitesse la plus rapide possible

ADCON0 BANK0
ADCON1 BANK1
ADRESL BANK1
ADRESH BANK0
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 23

L'USART (Port Série)

TXIF TXREG

TSR RC6/TX

RSR RC7/RX

RCIF RCREG

L'USART est gérée par les registres et les bits ci-dessous

Registre
Description Position Valeur générique
ou bit
TXSTA Registre de configuration BANK1 24h
RCSTA Registre de configuration BANK0 90h
SPBRG Registre de Configuration de la vitesse de communication BANK1 4 × Fosc
SPBRG = -1
64 × vitesse
TXREG Registre (buffer) de transmission BANK0
RCREG Registre (buffer) de réception BANK0
TXIF Drapeau (Transmission) PIR1
TXIF=1 TXREG vide BANK0
TXIF=0 TXREG plein
RCIF Drapeau (Réception) PIR1
RCIF=1 RCREG plein BANK0
RCIF=0 RCREG vide

• Pour utiliser l'USART, il faut commencer par configurer les registres TXSTA, RCSTA et SPBRG
comme indiqué sur le tableau ci-dessus
• Pour transmettre un octet, il suffit de le copier dans le registre de transmission après avoir vérifié
que celui-ci est libre à l'aide du drapeau TXIF (Registre PIR1, BANK0)
• Quand l'USART reçoit un octet, Elle le place dans le registre de réception RCREG et lève le drapeau
RCIF (Registre PIR1, BANK0)

Travaux Dirigés

Programme qui Transmet (vitesse 9600 baud) l'alphabet de A à Z avec une temporisation de 0.5s entre chaque
caractère. Après le Z, il transmet un CR (code ascii 13) et recommence

Programme qui écoute l'USART, quand il reçoit un octet, il lui ajoute 1 puis le retransmet
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 24

Le timer TMR2

T2CKPS1 T2CKPS0 Vers d'autres modules


TF2
PREDIV RàZ
Fosc/4 TMR2
1, 4 ou 16 TOUTPS3 : TOUTPS0 TMR2IF
Tcy
POSTDIV
Comparateur 1 à 16
Egalité

PR2

TF2 = PREDIV × (PR2+1) × POSTDIV × Tcy .

T2CON
— TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

TOUTPS3:TOUTPS0 rapport du POSTSCALER (POSTDIV)


0000 : division par 1
0001 : division par 2
...
1111 : division par 16

TMR2ON: démarrer arrêter TMR2


0 : TMR2 off
1 : TMR2 on

T2CKPS1,T2CKPS0: rapport du PRESCALER (PREDIV)


00 : division par 1
01 : division par 4
1x : division par 16

Avec Fosc=4MHz, Donner la valeur max que l'on obtenir pour la période TF2.
Que devient cette valeur si on ajoute un compteur CTR (1 seul registre) dans le programme

Quelle est la temporisation max que l'on peut obtenir si on rajoute dans le programme un compteur CTR qui
compte les périodes TF2. (CTR ≡ 1 seul registre)

Proposer une combinaison des variables CTR, PREDIV, POSTDIV, PR2 pour avoir un temps de 0.5 s

Programme pour faire clignoter une LED branchée sur RC3 au rythme de la ½ seconde
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 25

Génération d'un signal PWM:

Un signal PWM (Pulse Width Modulation) ou MLI (Modulation de largeur d'impulsion) est un signal de
rapport cyclique TH/T réglable.
TH

Le PIC contient deux modules CCP1 et CCP2 qui, associés au timer TMR2 peuvent être utilisés pour
générer des signaux PWM.

Module CCP1 en mode PWM

La configuration se fait par les registres:


CCP1CON
CCPR1L
BANK0
PSTRCON
T2CON
PR2 BANK1

La période T du signal est fixée par:

T = (PR2 + 1) × (4 × PREDIV × Tosc)

La largeur TH de l'impulsion est fixée par:

TH = (4 × CCPR1L + DCB) × PREDIV × Tosc

o PR2 est le registre de période associé au timer TMR2


o PREDIV est la valeur du prédiviseur de TMR2. Il est configuré dans le registre T2CON
o CCPR1L est un registre associé au module CCP1
o DCB est le nombre constitué par les deux bits DC1B1, DC1B0 situés dans le registre de control
CCP1CON

Signal toujours nul: CCPR1L=0, DCB=0


Rapport cyclique MIN: CCPR1L = 0, DCB=1 (01)
Rapport cyclique MAX: CCPR1L = PR2, DCB=3 (11)
Signal toujours à 1: CCPR1L > PR2

CCP1CON
P1M1 P1M0 DC1B1 DC1B0 CCP1M3 CCP1M2 CCP1M1 CCP1M0
P1M1, P1M0 : configuration des sorties P1A/RC2, P1B/RD5, P1C/RD6 et P1D/RD7
00 : single output : le signal PWM est disponible sur les sorties P1A, P1B, P1C, P1D selon la configuration
du registre PSTRCON. Par défaut, si on ne touche pas le registre PSTRCON, le signal PWM est disponible
sur P1A/RC2
01 : full bridge forward : P1D = sortie PWM, P1A active, P1B, P1C inactives
10 : half bridge : P1A, P1B = sorties PWM et PWM, P1C, P1D = E/S normales
11 : full bridge reverse : P1B = sortie PWM, P1C active, P1A, P1D inactives
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 26

DC1B1, DC1B0 : Ces deux bits constituent le nombre DCB utilisé dans le calcul de la largeur
d'impulsion.
CCP1M3 à CCP1M0 : mode de fonctionnement du module CCP1. Seules les combinaisons
concernant le mode PWM sont citées ici :
0000 : module CCP1 arrêté
1100 : mode PWM, P1A, P1C actives au niveau haut, P1B, P1D actives au niveau haut
1101 : mode PWM, P1A, P1C actives au niveau haut, P1B, P1D actives au niveau bas
1110 : mode PWM, P1A, P1C actives au niveau bas, P1B, P1D actives au niveau haut
1111 : mode PWM, P1A, P1C actives au niveau bas, P1B, P1D actives au niveau bas
(Attention aux utilisateurs du logiciel de simulation PROTEUS-ISIS, il semble que les deux dernières
configurations ne fonctionnent pas correctement)

T2CON
— TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
T2CKPS1,T2CKPS0: rapport du Prédiviseur (PREDIV)
00 : division par 1
01 : division par 4
1x : division par 16

PSTRCON
-- -- -- STRSYNC STRD STRC STRB STRA
STRSYNC
0 : la distribution du signal PWM sur les sorties est actualisée à chaque période PWM
1 : la distribution du signal PWM sur les sorties est actualisée à chaque cycle instruction
STRx
0 : La sortie P1x est une E/S normale
1 : La sortie P1x contient le signal PWM
A la mise sous tension, le registre PSTRCON est égal à - - - 0 0 0 0 1, ce qui fait que le signal PWM
est disponible sur la sortie P1A/RC2

Best practice
Pour éviter les aléas lors de la phase du démarrage du module CCP, il est conseillé de n'activer (TRIS)
la sortie PWM que lorsque le timer TMR2 a terminé un cycle (TMR2IF passe à 1) affin de s'assurer que
le rapport cyclique et correcte.

Exemple: Signal de rapport cyclique 1/5


On va générer un signal PWM de période 1ms et de rapport cyclique 1/5 à l'aide du module CCP1.
• T = 1ms = 1000 µs , TH = 200 µs
• Fosc = 4MHz → Tosc = 1/4 µs
• La valeur de PR2 sera déterminée à partir de la période T désirée:
(PR2+1) × 4 × PREDIV × Tosc = 1000 µs
PR2+1 = 1000/PREDIV
PREDIV peut prendre les valeurs 1, 4 ou 16, il n'y a que la valeur 4 qui est utilisable ce qui donne
PREDIV=4, PR2=249
• Les valeurs de CCPR1L et DCB seront déterminé à partir du rapport cyclique caractérisé par TH:
200 µs = (4 × CCPR1L + DCB) × PREDIV × Tosc = (4 × CCPR1L + DCB)
le choix le plus simple est DCB=0, CCPR1L = 50
• sigle mode, DCB=00, état actif=1 CCP1CON = 00001100
• Sortie sur PA1/RC2 (PSTRCON par défaut)
• T2CON = 0 0000 1 01
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 27

Travaux dirigés:

Programme qui écoute le port série (L'USART) à la vitesse de 9600, s'il reçoit :

A il allume la LED branchée sur RC0


B il éteint la LED branchée sur RC0
C il mesure l'entrée analogique RA0 et transmet le résultat sur l’USART (little Endian)
D il génère un signal PWM sur RC2 (f=3KhZ, RCy=50%)
E il Augmente le Rapport Cyclique du signal PWM
F il diminue le Rapport Cyclique du signal PWM
G il augmente la fréquence du signal PWM
H il diminue la fréquence du signal PWM
I il arrête le signal PWM
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 28

Protocole de communication I2C


I2C est un standard de communication série synchrone. Il est très utilisé pour l'échange de données en
différents circuits d'un système électronique.

• Il utilise 3 fils. SDA pour les données, SCL pour l'horloge et un fil pour la masse,
• Lors d'une communication, un circuit joue le rôle de master, l'autre le rôle du slave. C'est toujours
le master qui génère le signal horloge,
• Un master peut communiquer avec plusieurs slaves. Chaque slave est caractérisé par une adresse
unique. Un système peut comporter plusieurs masters. Dès qu'un master prend le contrôle du bus,
les autres doivent attendre que le bus soit de nouveau libre. un système d'arbitrage permet de
détecter les collisions. Certains circuit comme le PIC peuvent fonctionner soit en master soit en
slave
Vcc

Bus I2C

SDA SCK SDA SCK SDA SCK SDA SCK SDA SCK

Maître 1 Slave 1 Slave 2 Slave 3 Maître 2

• les E/S SDA et SCK fonctionnent en mode collecteur ouvert (ou drain ouvert) de sorte qu'un circuit
peut soit forcer la ligne au niveau bas soit libérer la ligne. le niveau haut est obtenu par une
résistance de tirage (pull-up) externe.
Vcc

Lecture
Lecture

Ecriture Ecriture

• Pour prendre le contrôle du bus, un master génère un START condition


Start
SDA

SCK

• Pour libérer le bus, le master génère un STOP condition

SDA

SCK stoP
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 29

• L'échange d'un octet se fait toujours en 9 coups d'horloge. Le 9ème coup d'horloge sert à échanger
l'acquittement qui est placé sur la ligne SDA par le récepteur. 0 pour acquittement positif (ACK), 1
pour acquittement négatif (NoACK)
Acknowledge

SDA D7 D6 D5 D4 D3 D2 D1 D0

SCK

• Séquence de transmission master → Slave


ACK envoyé par le slave

S Slave address 0 A Data byte A Data byte A … P

R/W

o Le master envoie le Start


o Le master envoie l'adresse du slave sur 7 bits complétée à sa droite par le bit R/W=0 pour
indiquer qu'il démarre une séquence de transmission
o Pendant le 9ème bit de l'horloge, le slave place l'acquittement sur la ligne. Le master doit le tester
avant de continuer
o Le master envoie le message octet par octet. Chaque octet est acquitté par le slave pendant le
9ème coup d'horloge
o Le master envoie un stoP

• Séquence de réception master  Slave


ACK du slave ACK du master

S Slave address 1 A Data byte A Data byte A … P

transmis reçu reçu


R/W

o Le master envoie le Start


o Le master envoie l'adresse du slave sur 7 bits complétée à sa droite par le bit R/W=1 pour
indiquer qu'il démarre une séquence de réception
o Pendant le 9ème bit de l'horloge, le slave place l'acquittement sur la ligne. Le master doit le tester
avant de continuer
o Le slave envoie un octet vers le master (8 coups d'horloges). Le master place un acquittement
sur la ligne et génère le 9ème coup d'horloge. La suite va dépendre de la valeur de l'acquittement:
L'acquittement est positif, le slave envoie un autre octet.
L'acquittement est négatif, le slave n'envoie rien. Il se met en attente d'un stoP ou d'un Start
o Le master envoie un stoP pour terminer la séquence et libérer le bus ou un Start (Repeat Start)
pour démarrer une autre séquence sans perdre le contrôle du bus.
Les Microcontrôleurs et Systèmes embarqués A. OUMNAD page 30

Le module I2C du PIC


Sur le PIC, les communications I2C sont assurées par le module MSSP

SSPBUF
SSPCON
SSPCON2 SCK/RC3
SSPSTA
SSPSR SDA/RC4
SSPADD

La librairie i2c_lib.inc permet d'utiliser le module I2C du PIC en mode master. Elle contient les
fonctions suivantes:

i2c_init: Initialise le module. W doit contenir un entier qui fixe la fréquence (F) de l'horloge de
Fosc
communications. Cet entier est calculé par la formule − 1
4 × F
Les vitesses standard du bus I2C sont 100kHz, 400kHz et 1 MHz.

i2c_start: envoie un START sur le bus

i2c_rstart: envoie un Repeat START sur le bus

i2c_stop: envoie un STOP sur le bus

i2c_write: envoie l'octet présent dans W sur le bus I2C

i2c_write_a: envoie l'octet (adresse R/W) présent dans W sur le bus I2C puis teste l'acquittement, Si
négatif, voie un ReSTART puis retransmet l'adresse et reteste. Cette fonction est bloquante
dans le cas où l'acquittement est toujours négatif

i2c_write_d: envoie l'octet présent dans W sur le bus I2C puis teste l'acquittement, Si négatif,
retransmet l'octet puis reteste. Cette fonction est bloquante dans le cas où l'acquittement
est toujours négatif

i2c_write: reçoit un octet sur le bus I2C et le place dans W