Vous êtes sur la page 1sur 80

1

MICROCONTROLEURS
Famille Mid-Range
de Microchip

LE PIC 16F876/877
A. Oumnad

PORTD

PORTC

PORTB

Capture/Comparaison

CCP1

timer 0
TMR0

timer 1
TMR1

timer 2
TMR2

CCP2

Chien de
garde

Capture/Comparaison

PORTA

WDT

USART
(RS232)

SSP (I2C)

Horloge
systme

PORTE

CAN
10 bits
W
ALU
96 registres
systme

368
registres
utilisateur

14 bits : config

Mmoire
programme
de type
Flash
8 x 1024
mots de 14
bits

EEPROM

256 octets

SOMMAIRE

Introduction ................................................................................ 6
I.1
Les microcontrleurs en gnral.................................................. 6
I.2
Les PICs de Microchip ................................................................ 7
II
Les lments de base du PIC 16F876/877................................... 9
II.1
L'Horloge ................................................................................. 9
II.2
L'ALU et laccumulateur W .......................................................... 9
II.3
Organisation de la mmoire RAM................................................10
II.3.1 Accs la RAM par adressage DIRECT .....................................10
II.3.2 Accs la RAM par ladressage INDIRECT.................................11
II.4
Registres de configuration et leurs position dans la RAM ...............13
II.5
Les registres de configuration avec leurs tats aprs un RESET ......13
II.6
Les instructions du 16F876/877 .................................................14
II.6.1 Les instructions orientes Registre ......................................14
II.6.2 Les instructions orientes bits ...........................................14
II.6.3 Les instructions oprant sur une constante ...............................14
II.6.4 Les instructions de saut et appel de procdures.........................14
II.6.5 Les indicateur dtat ..............................................................14
II.6.6 Le jeu d'instructions...............................................................15
II.6.7 Les paramtres des instructions agissant sur registre ................16
II.6.8 Les paramtres des instructions agissant sur bit........................16
II.6.9 Les instruction MOVWF et MOVF ..............................................16
II.6.10
Les instructions btfss et btfsc ...............................................17
II.6.11
Les instructions incfsz et decfsz ............................................17
II.6.12
Linstruction goto................................................................18
II.6.13
Linstruction call .................................................................18
II.7
Les directives de l'assembleur MPASM.........................................19
II.8
Illustrant de quelques aspects de programmation : ......................22
III Les outils de dveloppement ..................................................... 24
III.1
Procdure de travail .................................................................24
III.2
Lenvironnement de dveloppement MPLAB .................................25
III.2.1
Editer, compiler simuler.......................................................27
III.3
Quelques exemples ..................................................................29
III.3.1
Comparaison......................................................................29
III.3.2
Boucles de temporisation.....................................................29
IV
Les ports dE/S .......................................................................... 32
IV.1
Le port d' E/S PORTA ................................................................32
IV.1.1
La broche RA4....................................................................32
IV.1.2
Les autres broches..............................................................33
IV.2
Le port d' E/S PORTB ................................................................33
IV.3
Le port d' E/S PORTC ................................................................33
IV.4
Le port d' E/S PORTD................................................................34
IV.5
Le port d' E/S PORTE ................................................................34
V
Les mmoires permanentes ....................................................... 35
V.1
La mmoire EEPROM de donnes ...............................................35
V.1.1 Procdure de lecture dans l'EEPROM ........................................35

4
V.1.2 Procdure d'criture dans l'EEPROM .........................................36
V.2
La mmoire Programme ou mmoire flash ..................................36
V.2.1 Procdure lecture dans la mmoire programme.........................37
V.2.2 Procdure d'criture dan la mmoire programme ......................37
VI
Les interruptions ....................................................................... 39
VI.1
Droulement d'une interruption .................................................39
VI.2
Les sources d'interruption .........................................................40
VI.3
L'interruption INT (Entre RB0 du port B)....................................40
VI.4
L'interruption RBI (RB4 A RB7 du port B) ....................................40
VI.5
Les autres interruptions ............................................................40
VII Les Timers ................................................................................. 41
VII.1 Le Timer TMR0.........................................................................41
VII.2 Le Watchdog Timer WDT (Chien de garde) .................................42
VII.3 Le Timer TMR1.........................................................................43
VII.3.1 Le mode Timer ...................................................................43
VII.3.2 Le mode Compteur .............................................................43
VII.3.3 Le registre de control de T1CON ...........................................44
VII.4 Les module de Comparaison/Capture CCP1 et CCP2 .....................45
VII.4.1 Le module CCP1 .................................................................45
VII.4.2 Le module CCP2 .................................................................47
VII.5 Le Timer TMR2.........................................................................48
VIII Le module de conversion A/N .................................................... 49
VIII.1 Droulement dune Conversion ..................................................50
VIII.2 Temps de conversion ................................................................51
VIII.3 Temps d'acquisition ..................................................................52
VIII.4 Frquence d'chantillonnage......................................................52
VIII.5 Valeur numrique obtenue ........................................................52
VIII.6 Programmation ........................................................................53
IX
L'USART ..................................................................................... 54
IX.1
Mode Asynchrone .....................................................................54
IX.2
Le port en transmission.............................................................54
IX.2.1
Les tapes de transmission (sans interruption, mode 8 bits) ....56
IX.3
Le port en rception .................................................................56
IX.3.1
Les tapes de rception (sans interruption, mode 8 bits) .........57
IX.4
La vitesse de communication .....................................................57
X
Le module MSSP (Master Synchronous Serial Port) ................... 59
X.1
Introduction au bus I2C ............................................................59
X.1.1 start condition.......................................................................60
X.1.2 Transmission d'un bit .............................................................60
X.1.3 Stop condition.......................................................................61
X.1.4 Remarque sur le Start et le Stop condition................................61
X.1.5 L' acknowledge .....................................................................61
X.1.6 L'adresse et le bit R/W ...........................................................61
X.2
Le module MSSP en mode I2C ...................................................62
X.2.1 Transmission dun octet .........................................................62
X.2.2 Rception dun octet ..............................................................62
X.2.3 Les registres de configuration .................................................63
X.2.4 MSCP en mode I2C Master......................................................65
X.2.5 MSCP en mode I2C Slave ......................................................69

5
X.3
Le module MSSP en mode SPI ...................................................73
X.3.1 Le mode SPI master ..............................................................74
X.3.2 Le mode SPI slave .................................................................76
XI
Annexe : Gestion du Programme Counter, ................................. 79
XI.1
GOTO calcul : modification de la valeur de PCL...........................79
XI.2
Instruction de branchement.......................................................79
XII Rfrences................................................................................. 80

Introduction

I.1

Les microcontrleurs en gnral

Un microcontrleur est un composant lectronique Autonome dot :

dun microprocesseur,

de la mmoire RAM,

de la mmoire permanente,

des interfaces dE/S //, srie (RS232,I2C, SPI )

des interfaces dE/S analogique

Des Timer pour grer le temps

Dautres module plus au moins sophistiqus selon la taille des C

Il est gnralement moins puissant quun microprocesseur en terme de


rapidit ou de taille mmoire, il se contente le plus souvent dun bus 8 ou 16
bits. Ceci en fait un composant trs bon march parfaitement Adapt pour
piloter les applications embarques dans de nombreux domaines dapplication.
Je pense quon ne se tromperait pas beaucoup si on affirme quaujourdhui il
ya un microcontrleur ( grand) dans chaque quipement lectronique :

Informatique (souris, modem )

Vido (Appareil photos numrique, camra numrique )

Contrle des processus industriels (rgulation, pilotage)

Appareil de mesure (affichage, calcul statistique, mmorisation)

Automobile (ABS, injection, GPS, airbag)

Multimdia (tlviseur,carte audio, carte vido, MP3, magntoscope)

Tlphones (fax, portable, modem)

Electromnager (lave-vaisselle, lave-linge, four micro-onde)

Un microcontrleur peut tre programm une fois pour toutes afin qu'il
effectue une ou des tches prcises au sein d'un appareil lectronique. Mais les
C rcents peuvent tre reprogramms et ceci grce leur mmoire
permanente de type FLASH (do le terme flasher quelque chose)
Plusieurs Constructeurs se partagent le march des microcontrleurs,
citons INTEL, MOTOROLA, AMTEL, ZILOG, PHILIPS et enfin MICROCHIP avec
ses PICs trs populaires qui nous intresse ici dans ce cours.
Les microcontrleurs, quelque soit leurs constructeurs, ont des architecture
trs similaires et sont constitus de modules fondamentaux assurant les
mmes fonctions : UAL, Ports dE/S, interfaces de communications srie,
Interfaces dE/S analogiques, Timers et horloge temps rels On peut dire que
seul le langage de programmation (Assembleurs) constitue la diffrence

7
majeure en deux microcontrleur (similaires) venant de deux constructeurs
diffrents.
Nous avons choisit dans ce cours dapprendre les microcontrleurs
travers une tude dtaille des microcontrleur 16F87x (x=3, 4, 6, 7) qui
constitue les lments fondamentaux de la famille mid-range qui est la famille
moyenne puissance de Microchip

I.2

Les PICs de Microchip

Les PICs sont des microcontrleurs architecture RISC (Reduce


Instructions Construction Set), ou encore composant jeu dinstructions
rduit. L'avantage est que plus on rduit le nombre dinstructions, plus leur
dcodage sera rapide ce qui augmente la vitesse de fonctionnement du
microcontrleur.
La famille des PICs est subdivise en 3 grandes familles : La famille BaseLine, qui utilise des mots dinstructions de 12 bits, la famille Mid-Range, qui
utilise des mots de 14 bits (et dont font partie la 16F84 et 16F876), et la
famille High-End, qui utilise des mots de 16 bits.
Les PICs sont des composants STATIQUES, Ils peuvent fonctionner avec
des frquences dhorloge allant du continu jusqu une frquence max
spcifique chaque circuit. Un PIC16F876-04 peut fonctionner avec une
horloge allant du continu jusqu 4 MHz.
Nous nous limiterons dans ce document la famille Mid-Range et
particulirement au PIC 16F876/877, sachant que si on a tout assimil, on
pourra facilement passer une autre famille, et mme un autre
microcontrleur.
PIC
16F870
16F871
16F872
16F873
16F874
16F876
16F877

FLASH
2K
2K
2K
4K
4K
8K
8K

RAM
128
128
128
192
192
368
368

EEPROM
64
64
64
128
128
256
256

I/O
22
33
22
22
33
22
33

A/D
5
8
5
5
8
5
8

Port //
NON
PSP
NON
NON
PSP
NON
PSP

Port Srie
USART
USART
MSSP
USART/MSSP
USART/MSSP
USART/MSSP
USART/MSSP

Tableau I.1 : diffrents circuit de la famille 16F87X

Les lments essentiels du PIC 16F876 sont :

Une mmoire programme de type EEPROM flash de 8K mots de 14 bits,

Une RAM donne de 368 octets,

Une mmoire EEPROM de 256 octets,

Trois ports d'entre sortie, A (6 bits), B (8 bits), C (8 bits),

Convertisseur Analogiques numriques 10 bits 5 canaux,

USART, Port srie universel, mode asynchrone (RS232) et mode synchrone

SSP, Port srie synchrone supportant I2C

Trois TIMERS avec leurs Prescalers, TMR0, TMR1, TMR2

Deux modules de comparaison et Capture CCP1 et CCP2

Un chien de garde,

13 sources d'interruption,

Gnrateur d'horloge, quartz (jusqu 20 MHz) ou Oscillateur RC

Protection de code,

Fonctionnement en mode sleep pour rduction de la consommation,

Programmation par mode ICSP (In Circuit Serial Programming) 12V ou 5V,

Possibilit aux applications utilisateur daccder la mmoire programme,

Tension de fonctionnement de 2 5V,

Jeux de 35 instructions

PORTD

PORTC

PORTB

Capture/Comparaison

CCP1

timer 0
TMR0

timer 1
TMR1

timer 2
TMR2

CCP2

Chien de
garde

Capture/Comparaison

PORTA

WDT

USART
(RS232)

SSP (I2C)

Horloge
systme

PORTE

CAN
10 bits
W
ALU
96 registres
systme

368
registres
utilisateur

14 bits : config

Mmoire
programme
de type
Flash
8 x 1024
mots de 14
bits

EEPROM

256 octets

Fig. I.1 : Les lments constitutifs du PIC 16F877

Le port D (8 bits) et le port E (3 bits) ne sont pas disponibles sur tous les
processeurs. (Voir Tableau I.1)

II

Les lments de base du PIC 16F876/877

II.1

L'Horloge

L'horloge peut tre soit interne


soit externe. L'horloge interne est
constitue d'un oscillateur quartz
ou d'un oscillateur RC.
Avec l'oscillateur Quartz, on
peut avoir des frquences allant
jusqu' 20 MHz selon le type de C.
Le filtre passe bas (Rs, C1, C2)
limite les harmoniques dus
lcrtage et Rduit lamplitude de
loscillation, il n'est pas obligatoire.
Avec un oscillateur RC, la
frquence de l'oscillation est fixe
par Vdd, Rext et Cext. Elle peut
varier lgrement d'un circuit
l'autre.
Dans certains cas, une horloge
externe au microcontrleur peut tre
utilise pour synchroniser le PIC sur
un processus particulier.
Quelque soit l'oscillateur utilis, l'horloge systme dite aussi horloge
instruction est obtenue en divisant la frquence par 4. Dans la suite de ce
document on utilisera le terme Fosc/4 pour dsigner l'horloge systme.
Avec un quartz de 4 MHz, on obtient une horloge instruction de 1 MHz, soit
le temps pour excuter une instruction de 1s.

II.2

L'ALU et laccumulateur W

LALU est une Unit Arithmtique et logique 8 Bits qui ralise les oprations
arithmtiques et logique de base. Laccumulateur W est un registre de travail 8
bits, toutes les oprations deux oprandes passe par lui. On peut avoir :
-

Une instruction sur un seul oprande qui est en gnral un registre situ
dans la RAM
Une instruction sur 2 oprandes. Dans ce cas, lun des deux oprandes est
toujours laccumulateur W, lautre peut tre soit un registre soit une
constante.

Pour les instructions dont un des oprandes est un registre, le rsultat peut
tre rcupr soit dans laccumulateur, soit dans le registre lui-mme.

10

II.3

Organisation de la mmoire RAM

Lespace mmoire RAM adressable est de 512 positions de 1 octet chacune :

96 positions sont rserves au SFR (Special Function Registers) qui sont les
registres de configuration du PIC.

Les 416 positions restantes constituent les registres GPR (General Propose
Registers) ou RAM utilisateur. Sur le 16F876 et 16F877, 3 blocs de 16
octets chacun ne sont pas implants physiquement do une capacit de
RAM utilisateur de 368 GPR.

Pour accder la RAM, on dispose de deux modes dadressage :

II.3.1
Accs la RAM par adressage DIRECT
Avec ce mode dadressage, on prcise dans linstruction la valeur de
ladresse laquelle on veut accder. Par exemple, pour copier le contenu de
l'accumulateur W dans la case mmoire d'adresse 50, on utilise l'instruction
MOVWF 50. Cette instruction sera code sur 14 bits, la partie adresse est
code sur 7 bits ce qui va poser quelques petits problmes. En effet, 7 bits
permettent dadresser seulement 128 positions. Pour pouvoir adresser les 512
positions accessibles, il faut 9 bits dadresse. Pour avoir ces 9 bits, le PIC
complte les 7 bits venant de linstruction par deux bits situs dans le registre
de configuration STATUS. Ces bits sont appels RP0 et RP1 et doivent tre
positionns correctement avant toute instruction qui accde la RAM par
ladressage direct.
RP1 RP0
9 bits
La RAM apparat alors organise en 4 banks de 128 octets chacun.
L'adresse instruction permet d'adresser l'intrieur d'un bank alors que les
bits RP0 et RP1 du registre STATUS permettent de choisir un bank. La Figure
II.1 montre lorganisation de la RAM avec les zones alloue au SFR et aux GPR.
Les zones hachures ne sont pas implantes physiquement. Si on essaye dy
accder, on est aiguill automatiquement vers la zone [70h,7Fh] appele zone
commune.
Mme si on prcise une adresse suprieure 127 (+ de 7 bits) dans une
instruction, elle est tronque 7 bits puis complte par les bits RP0 et RP1
pour former une adresse 9 bis. Par exemple, pour copier laccumulateur W
dans la case mmoire dadresse 1EFh, il faut dabord placer les bits RP0 et RP1
1 (bank 3), ensuite on utilise soit linstruction MOVWF 6Fh soit linstruction
MOVWF 1EFh, qui donne le mme rsultat. En effet, que lon crive 6Fh =
0110 1111 ou 1EFh = 0001 1110 1111, le PIC ne prend que 7 bits soit :
1101111 = 6Fh et complte avec les bits RP1,RP0 pour obtenir 11 1101111 =
1EFh

11
bank 0

bank 1

RP1 RP0

01

00

80
SFR
(32)

1F
20

RP1 RP0

10

100
SFR
(32)

bank 3

RP1 RP0

RP1 RP0

00

10F
110

SFR
(16)

11

180
18F
190

SFR
(16)

9F
A0

GPR
(96)

GPR
(80)

6F
70 Zone
7F

bank 2

GPR
(96)

GPR
(96)

EF

16F

1EF

FF

17F

1FF

commune

Figure II.1 : organisation de la RAM du 16F876/877

Nous allons anticiper un peu et prsenter les instructions bcf et bsf et qui
permettent de positionner un bit 0 ou 1
bcf

STATUS,RP0

; place le bit RP0 0

bsf

STATUS,RP1

; place le bit RP1 1

II.3.2

Accs la RAM par ladressage INDIRECT

Pour accder une position de la RAM en utilisant ladressage indirect, on


passe toujours par une position fictive appele INDF. Exemple : linstruction
CLRF INDF signifie : mettre zro la case mmoire dadresse INDF. Mais
quelle est ladresse de cette position appele INDF ?
INDF est la case mmoire pointe par le registre (pointeur) FSR
Cela signifie que si on place 74h dans le registre FSR et ensuite on excute
linstruction CLRF INDF, cela va remettre zro la case mmoire dadresse
74h.

12
Ceci nest pas tout fait complet car (comme pour ladressage direct) on
va avoir un problme de capacit dadressage. En effet, comme tous les
registres, le registre de pointage FSR est un registre 8 bits, il peut donc
adresser au maximum 256 positions mmoire (de 00h FFh), cest seulement
la moiti de la RAM dont on dispose. Il nous manque un bit pour avoir les 9
bits ncessaires. On utilise le bit IRP qui se trouve dans le registre STATUS.
IRP

0 00
0 1F
0 20

0 7F
0 80
0 9F
0 A0
0 EF

SFR
(32)

FSR

1 00
1 0F
1 10

GPR
(96)

1 6F

SFR
(32)

1 80
1 8F
1 90

GPR
(80)

1 EF

0 FF

SFR
(16)

GPR
(96)
SFR
(16)

GPR
(96)

1 FF

page 0

page 1

Donc en rsum, chaque fois que le PIC rencontre le mot INDF dans un
programme, il sait quil sagit de la case mmoire dont ladresse (9 bits) se
trouve dans le registre FSR complt par le bit IRP du registre STATUS

INDF est la case mmoire dadresse par:


IRP

FSR
9 bits

IRP = 0 000h 0FFh

page 0

IRP = 1 100h 1FFh

page 1

13

II.4

Registres de configuration et leurs position dans la RAM


Bank 0
INDF
TMR0
PCL
STATUS
FSR
PORTA
PORTB
PORTC
PORD (*)
PORT (*)
PCLATH
INTCON
PIR1
PIR2
TMR1L
TMR1H
T1CON
TMR2
T2CON
SSPBUF
SSPCON
CCPR1L
CCPR1H
CCP1CON
RCSTA
TXREG
RCREG
CCPR2L
CCPR2H
CCP2CON
ADRESH
ADCON0

00h
01h
02h
03h
04h
05h
06h
07h
08h
09h
0Ah
0Bh
0Ch
0Dh
0Eh
0Fh
10h
11h
12h
13h
14h
15h
16h
17h
18h
19h
1Ah
1Bh
1Ch
1Dh
1Eh
1Fh

Bank 1
INDF
OPTION_REG
PCL
STATUS
FSR
TRISA
TRISB
TRISC
TRISD (*)
TRISE (*)
PCLATH
INTCON
PIE1
PIE2
PCON

80h
81h
82h
83h
84h
85h
86h
87h
88h
89h
8Ah
8Bh
8Ch
8Dh
8Eh
8Fh
90h
91h
92h
93h
94h
95h
96h
97h
98h
99h
9Ah
9Bh
9Ch
9Dh
9Eh
9Fh

SSPCON2
PR2
SSPADD
SSPSTAT

100h
101h
102h
103h
104h
105h
106h
107h
108h
109h
10Ah
10Bh
10Ch
10Dh
10Eh
10Fh

Bank 2
INDF
TMR0
PCL
STATUS
FSR
PORTB

PCLATH
INTCON
EEDATA
EEADR
EEDATH
EEADRH

180h
181h
182h
183h
184h
185h
186h
187h
188h
189h
18Ah
18Bh
18Ch
18Dh
18Eh
18Fh

Bank 3
INDF
OPTION_REG
PCL
STATUS
FSR
TRISB

PCLATH
INTCON
EECON1
EECON2

PORTD et PORTE existent seulement dans le


16F877 et le 16F874

TXSTA
SPBRG

ADRESL
ADCON1
Tableau II.1 : Registres de configuration avec leurs adresses

II.5

Les registres de configuration avec leurs tats aprs un RESET

STATUS
OPTION_REG
INTCON
PIE1
PIR1
PIE2
PIR2
EECON1
TXSTA
RCSTA
CCPxCON
T1CON
T2CON
SSPCON
SSPCON2
SSPSTAT
CCP1CON
TXSTA
RCSTA
CCP2CON
ADCON0
ADCON1
TRISx

IRP
RBPU
GIE
PSPIE
PSPIF
N.I.
N.I.
EEPGD
CSRC
SPEN

WCOL
GCEN
SMP

CSRC
SPEN

ADCS1
ADFM

RP1
INTEDG
PEIE
ADIE
ADIF
Rserv
Rserv

TX9
RX9

TOUTPS3
SSPOV
ACKSTAT
CKE

TX9
RX9

ADCS0

RP0
T0CS
T0IE
RCIE
RCIF
N.I.
N.I.

TXEN
SREN
DCxB1
T1CKPS1
TOUTPS2
SSPEN
ACKDT
D/A
CCP1X
TXEN
SREN
CCP2X
CHS2

TO
T0SE
INTE
TXIE
TXIF
EEIE
EEIF

SYNC
CREN
DCxB0
T1CKPS0
TOUTPS1
CKP
ACKEN
P
CCP1Y
SYNC
CREN
CCP2Y
CHS1

PD
PSA
RBIE
SSPIE
SSPIF
BCLIE
BCLIF
WRERR

ADDEN
CCPxM3
T1OSCEN
TOUTPS0
SSPM3
RCEN
S
CCP1M3

ADDEN
CCP2M3
CHS0
PCFG3

Z
PS2
T0IF
CCP1IE
CCP1IF
N.I.
N.I.
WREN
BRGH
FERR
CCPxM2
T1SYNC
TMR2ON
SSPM2
PEN
R/W
CCP1M2
BRGH
FERR
CCP2M2
GO/DONE
PCFG2

DC
PS1
INTF
TMR2IE
TMR2IF
N.I.
N.I.
WR
TRMT
OERR
CCPxM1
TMR1CS
T2CKPS1
SSPM1
RSEN
UA
CCP1M1
TRMT
OERR
CCP2M1

PCFG1

Tableau II.2 : dtail des registres SFR et leurs tats au dmarrage

C
PS0
RBIF
TMR1IE
TMR1IF
CCP2IE
CCP2IF
RD
TX9D
RX9D
CCPxM0
TMR1ON
T2CKPS0
SSPM0
SEN
BF
CCP1M0
TX9D
RX9D
CCP2M0
ADON
PCFG0

0001 1xxx
1111 1111
0000 000x
0000 0000
0000 0000
-r-0 0--0
-r-0 0--0
x--- x000
0000 -010
0000 000x
--00 0000
--00 0000
-000 0000
0000 0000
0000 0000
0000 0000
--00 0000
0000 -010
0000 000x
--00 0000
0000 00-0
0--- 0000
1111 1111

14

II.6

Les instructions du 16F876/877

Tous les PICs Mid-Range ont un jeu de 35 instructions,

Chaque instruction est code sur un mot de 14 bits qui contient le code
opration (OC) ainsi que l'oprande,

Toutes les instructions sont excutes en un cycle d'horloge, part les


instructions de saut qui sont excutes en 2 cycles dhorloge. Sachant que
lhorloge systme est gale fosc/4, si on utilise un quartz de 4MHz, on
obtient une horloge fosc/4 = 1000000 cycles/seconde, cela nous donne une
puissance de lordre de 1MIPS (1 Million d Instructions Par Seconde). Avec
un quartz de 20MHz, on obtient une vitesse de traitement de 5 MIPS.

II.6.1
Les instructions orientes Registre
Ce sont des instructions qui manipulent un octet se trouvant dans la RAM.
a peut tre un registre de configuration SFR ou une case mmoire
quelconque (Registre GPR)
II.6.2
Les instructions orientes bits
Ce sont des instructions destines manipuler directement un bit dun
registre que se soit un registre de configuration SFR ou une case mmoire
quelconque (registre GPR). Tous les bits de la RAM peuvent tre manipul
individuellement.
II.6.3
Les instructions oprant sur une constante
Ce sont les instructions entre laccumulateur W est une constante K
II.6.4
Les instructions de saut et appel de procdures
Ce sont les instructions qui permettent de sauter une autre position dans
le programme et de continuer lexcution du programme partir de cette
position.
II.6.5
Les indicateur dtat
Les bits Z, DC et C situs dans le registre STATUS sont des indicateurs qui
permettent de savoir comment une instruction sest termine. Toutes les
instructions nagissent pas sur les indicateurs, voir liste des instructions cidessous.
Z : passe 1 quand le rsultat dune instruction est nul
C : passe 1 quand lopration a gnr une retenue
DC : passe 1 quand les 4me bits gnre une retenue
Ces bits peuvent tre utilis trs astucieusement par les instructions btfsc
et btfss qui permettent de tester un bit et de raliser un saut conditionnel.
Nous aurons loccasion den reparler dans la suite du cours.
STATUS

IRP

RP1

RP0

DC

15

II.6.6

Le jeu d'instructions

{W,F ? d} signifie que le rsultat va soit dans W si d=0 ou w, soit dans F si d= 1 ou f


INSTRUCTIONS OPERANT SUR REGISTRE
ADDWF F,d W+F {W,F ? d}
ANDWF F,d W and F {W,F ? d}
CLRF
F
Clear F
COMF
F,d Complmente F {W,F ? d}
DECF
F,d dcrmente F {W,F ? d}
DECFSZ F,d dcrmente F {W,F ? d} skip if 0
INCF
F,d incrmente F {W,F ? d}
INCFSZ F,d incrmente F {W,F ? d} skip if 0
IORWF F,d W or F {W,F ? d}
MOVF
F,d F {W,F ? d}
MOVWF F
WF
RLF
F,d rotation gauche de F a travers C {W,F ? d}
RRF
F,d rotation droite de F a travers C {W,F ? d}
SUBWF F,d F W {W,F ? d}
SWAPF F,d permute les 2 quartets de F {W,F ? d}
XORWF F,d W xor F {W,F ? d}

indicateurs Cycles

C,DC,Z
Z
Z
Z
Z
Z
Z
Z
C
C,DC,Z
Z

INSTRUCTIONS OPERANT SUR BIT


BCF
F,b RAZ du bit b du registre F
BSF
F,b RAU du bit b du registre F
BTFSC
F,b teste le bit b de F, si 0 saute une instruction
BTFSS
F,b teste le bit b de F, si 1 saute une instruction
INSTRUCTIONS OPERANT SUR CONSTANTE
ADDLW K
W+KW
ANDLW K
W and K W
IORLW K
W or K W
MOVLW K
KW
SUBLW K
KWW
XORLW K
W xor K W
AUTRES INSTRUCTIONS
CLRW
Clear W
CLRWDT
Clear Watchdoc timer
CALL
L
Branchement un sous programme de label L
GOTO
L
branchement la ligne de label L
NOP
No operation
RETURN
retourne d'un sous programme
RETFIE
Retour d'interruption
RETLW K
retourne d'un sous programme avec K dans W
SLEEP
se met en mode standby

1
1
1
1
1
1(2)
1
1(2)
1
1
1
1
1
1
1
1

1
1
1(2)
1(2)

C,DC,Z
Z
Z
C,DC,Z
Z

Z
TO', PD'

TO', PD'

1
1
1
1
1
1

1
1
2
2
1
2
2
2
1

16
On remarque que :

Les instructions qui agissent sur un registre ou un bit dun registre


contiennent toutes la lettre F dans le nom de linstruction. Ceci vient du fait
que chez Microchip, la RAM est appele register File (Fichier des registres).

Les instructions qui agissent sur une constante contiennent toutes la lettre
L, parce que chez Microchip, on appelle Literal ce genre dadressage,
chez dautre constructeurs, on parle dadressage immdiat

II.6.7
Les paramtres des instructions agissant sur registre
Pour les instructions qui agissent sur registre, le paramtre F reprsente
ladresse du registre considr. Le paramtre d (destination) joue un rle
important, si on prend d = 0 ou w, le rsultat de lopration sera plac dans
laccumulateur W, si on prend d = 1 ou f, le rsultat de lopration sera plac
dans le registre prcis par F.
ADDWF 70h,1
ou
ADDWF
70h,f
Signifie : additionner le contenu de W avec le contenu de la case mmoire dadresse 70h et
placer le rsultat dans la case mmoire 70h
XORWF 35h,0
ou
XORWF
35h,w
Signifie : faire un ou exclusif entre W et le contenu de la case mmoire dadresse 35h et
placer le rsultat dans laccumulateur W

II.6.8
Les paramtres des instructions agissant sur bit
Pour les instructions agissant sur un bit, le paramtre F indique le registre
qui contient le bit modifier et le paramtre b indique le numro du bit
modifier; on compte partir de zro en commenant droite
7

BSF

STATUS,2

; signifie : placer 1 le bit 2 (3me bit partir de la droite) du


registre STATUS

BCF

45h,6

; signifie : placer 0 le bit 6 (7me bit partir de la droite) du


registre de la case mmoire dadresse 45h

II.6.9
Les instruction MOVWF et MOVF
Ce sont les instructions les plus utilises,
RAM

MOVWF permet de copier laccumulateur W dans


un registre (SFR ou GPR):
MOVWF

STATUS

; signifie : Copier le contenu de W


dans le registre STATUS

MOVWF

55h

; signifie : Copier le contenu de W


dans la case mmoire dadresse 55h

MOVWF

17

MOVF permet de copier le contenu dun


registre (SFR ou GPR) dans laccumulateur W, le
paramtre d doit tre = 0

RAM

MOVF

STATUS,0

; Copier le contenu du registre


STATUS dans laccumulateur W

MOVF

35h,0

; Copier le contenu de la case


mmoire dadresse 35h dans laccumulateur W

MOVF

Avec le paramtre d=1, linstruction MOVF semble inutile car elle permet de
copier un registre sur lui-mme ce qui priori ne sert rien.
MOVF

STATUS,1

; Copier le contenu du registre STATUS dans lui mme

En ralit cette instruction peut savrer utile car, comme elle positionne
lindicateur Z, elle permet de tester si le contenu dun registre est gal zro

II.6.10 Les instructions btfss et btfsc


Ces instructions permettent de tester un bit et de sauter ou non une ligne
de programme en fonction de la valeur du bit,
btfsc F,b

: bit test skip if clear : teste le bit b du registre F et saute


linstruction suivante si le bit test est nul

btfss F,b

: bit test skip if set : teste le bit b du registre F et saute


linstruction suivante si le bit test est gal 1

exemple :
sublw
100
btfss
STATUS,Z
clrf
70h
cmpf
70h,f
suite du programme
suite du programme

; 100 W W
; tester le bit Z du registre STATUS et sauter une ligne si Z=1
; aprs btfss, le programme continue ici si Z=0
; aprs btfss, le programme continue ici si Z=1

II.6.11 Les instructions incfsz et decfsz


Ces instructions permette dincrmenter ou de dcrmenter un registre et
de sauter si le rsultat est nul
Incfsz F,1

: increment skip if Z : incrmente le registre F et sauter une


ligne si le rsultat = 0. Le paramtre 1 indique que le rsultat
de lincrmentation doit aller dans F.

18
deccfsz F,1

: decrement skip if Z : dcrmente le registre F et sauter une


ligne si le rsultat = 0. Le paramtre 1 indique que le rsultat
de la dcrmentation doit aller dans F.

II.6.12 Linstruction goto


Permet de transfrer lexcution une autre position du programme
repre par une tiquette (label)
Instruction 1
Instruction 2
Goto
bonjour
instruction 3
instruction 4
instruction 5
instruction 6
instruction 7

bonjour

II.6.13 Linstruction call


Linstruction call permet dappeler une fonction. Une fonction est un sous
programme crit la suite du programme principal. Sa premire ligne doit
comporter une tiquette et elle doit se terminer par return
Programme principal

debut

Instruction
Instruction
Instruction
Instruction
Call afficher
Instruction
Instruction
Instruction

goto debut

Fonction

afficher

Instruction
Instruction
Instruction
Instruction
Instruction
Instruction
Instruction
return

La diffrence en call et goto est


que, quant le processeur rencontre
linstruction
call,
il
sauvegarde
ladresse de la ligne suivante avant
daller
excuter
les
instructions
constituant la fonction. Comme a,
quand il rencontre linstruction return,
il sait o il doit retourner pour
continuer lexcution du programme
principal.

19

II.7

Les directives de l'assembleur MPASM

Les directives de l'assembleur sont des instructions qu'on ajoute dans le


programme et qui seront interprtes par l'assembleur MPASM. Ce ne sont pas
des instructions destines au PIC. Nous ne prsentons ici que quelques
directives, pour le reste, consulter la documentation de MPASM "MPASM
USER'S GUIDE".
Remarque : Je vais prsenter les directives en Majuscule, mais sachez que le
compilateur MPASM accepte les instructions et les directives en minuscule et
en majuscule. Attention ce nest pas le cas pour les tiquettes et les noms de
dclaration des constantes.

LIST : permet de dfinir un certain nombre de paramtres comme le


processeur utilis (p), la base par dfaut pour les nombres (r) ainsi que
d'autres paramtres. Exemple :
Base
Prfixe Exemple (36)
LIST
p=16F876, r=dec
Dcimal
D'nnn' D'36'
.nnn
.36
avec
r=dec,
les
nombres
sans
H'24'
spcification
particulire
seront Hexadcimal H'nn'
0x24
0xnn
considrs par l'assembleur comme des
24h
nnh
nombre dcimaux, sinon voir tableau ci
Binaire
B'.'
B'00100100'
dessous
Octal
O'nnn' O'44'

INCLUDE : permet d'insrer un fichier source. Par exemple le fichier


p16f876.inc contient la dfinition d'un certain nombre de constante comme
les noms des registres ainsi que les noms de certains bits;
INCLUDE
"p16f876.inc"

ORG : dfinit la position dans la mmoire programme partir de laquelle


seront inscrites les instructions suivantes.

Fig. II.1 : Illustration de la directive ORG

20

EQU : permet de dfinir une constante ou une variable :


XX EQU
0x20
Chaque fois que le compilateur rencontrera XX, il la remplacera par 0x20.
a peut tre une constante s'il s'agit d'une instruction avec adressage
Literal, ou d'une adresse s'il s'agit d'une instruction avec adressage direct.
MOVLW

XX

; charger dans W la constante 0x20

MOVF

XX,w ; charger dans W le contenu de la case dadresse 0x20

#DEFINE : fonctionne un peu comme la directive EQU tout en tant un peu


plus gnrale, car elle permet daffecter toute une chane une abrviation
#DEFINE

XX

#DEFINE LED
BCF

LED

0x20

; dans ce cas cest quivalent

PORTB,3

XX EQU 0x20

; ici chaque fois que le compilateur rencontrera


le mot LED, il le remplacera par PORTB,3

; teindre la LED branche sur la broche 3 de PORTB

On peu ainsi affecter une abrviation toute une instruction


#DEFINE

eteindre

bcf
bsf

PORTC,5

;affecte labrviation eteindre


linstruction bcf PORTC,5

#DEFINE

allumer

PORTC,5 ;affecte
labrviation allumer
linstruction bsf PORTC,5

allumer
eteindre

; allume la LED branche sur la broche 5 de PORTC


; eteindre la LED branche sur la broche 5 de PORTC

DE : pour dclarer des donns qui seront stocke dans l'EEPROM de donne
au moment de l'implantation du programme sur le PIC
ORG
0x2100
DE
"Programmer un PIC, rien de plus simple", 70, 'Z'

DT : pour dclarer un tableau RETLW


DT 10,35h,Hello

; sera remplace par la suite dinstructions :

RETLW 10
RETLW 35h
RETLW 'H'
RETLW 'e'
RETLW l
RETLW l
RETLW o

END : indique la fin du programme

21

__CONFIG : permet de dfinir les 14 bits (fusibles ou switch)


de
configuration qui seront copis dans l'EEPROM de configuration (adresse
2007h) lors de l'implantation du programme dans le PIC.

CP1

CP0

DEBUG

WRT

CPD

LVP

BODEN

CP1

CP0

PWRTE

WDTE

F0SC1

F0SC0

CP1/CP0 : bits 13/12 ; Dterminent quelle zone de la mmoire programme


sera protge contre la lecture externe (via ICSP) ou l'criture par programme
conformment l'tat du bit 9 (WRT). On peut choisir de protger la totalit
de la mmoire ou seulement une partie. Les diffrentes zones pouvant tre
protges sont les suivantes :
1 1 : Aucune protection (_CP_OFF)
1 0 : Protection de la zone 0x1F00 0x1FFF (_CP_UPPER_256)
0 1 : Protection de la zone 0x1000 0x1FFF (_CP_HALF)
0 0 : Protection de lintgralit de la mmoire (_CP_ALL)
DEBUG : bit 11 : Debuggage sur circuit. Permet de ddicacer RB7 et RB6 la
communication avec un debugger.
1 : RB6 et RB7 sont des I/O ordinaires (_DEBUG_OFF)
0 : RB6 et RB7 sont utiliss pour le debuggage sur circuit (_DEBUG_ON)
WRT : bit 9 : Autorisation dcriture en flash
1 : Le programme peut crire dans les zones non protges par les bits
CP1/CP0 (_WRT_ENABLE_ON)
0 : Le programme ne peut pas crire en mmoire flash (_WRT_ENABLE_OFF)
CPD : bit 8 : Protection en lecture de la mmoire EEPROM de donnes.
1 : mmoire EEPROM non protge (_CPD_OFF)
0 : mmoire EEPROM protge contre la lecture externe via ICSP (_CPD_ON)
LVP : bit 7 : Utilisation de la pin RB3/PGM comme broche de programmation
5V
1 : La pin RB3 permet la programmation du circuit sous tension de 5V
(_LVP_ON)
0 : La pin RB3 est utilise comme I/O standard (_LVP_OFF)
BODEN : bit 6 : provoque le reset du PIC en cas de chute de tension
(surveillance de la tension dalimentation)
1 : En service (_BODEN_ON)
0 : hors service (_BODEN_OFF)
PWRTE : bit 3 : Dlai de dmarrage la mise en service. Attention, est
automatiquement mis en service si le bit BODEN est positionn.
1 : dlai hors service (sauf si BODEN = 1) (_PWRTE_OFF)
0 : dlai en service (_PWRTE_ON)
WDTE : bit 2 : Validation du Watchdog timer

22
1 : WDT en service (_WDT_ON)
0 : WDT hors service (_WDT_OFF)
FOSC1/FOSC0 : bits 1/0 : slection du type doscillateur
11 : Oscillateur de type RC (_RC_OSC) (3K < R < 100k, C > 20 pF)
10 : Oscillateur haute vitesse (_HS_OSC) (4 Mhz 20 Mhz)
01 : Oscillateur basse vitesse (_XT_OSC) (200 kHz 4 Mhz)
00 : Oscillateur faible consommation (_LP_OSC) (32 k 200 kHz)
Voici 3 exemples dutilisation :
__CONFIG B'11111100111001'
__CONFIG H'3F39'
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF &
_LVP_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
Remarque :
Attention, les microcontrleurs avec lextension A comme 16F876A ou
16F877A ont une disposition des bits de configuration lgrement diffrente,
consultez le datasheet.

II.8

Illustrant de quelques aspects de programmation :

Exercice 1) : analyse de programmes


Analyser (tracer) le programme ci-dessous :
clrf
Incf
Incf

35h
35h,f
35h,w

clrf
Incf
Incf

135h
135h,f
135h,w

movlw
movwf
movlw
movwf
movf
addwf

100
70h
50
71h
70h,w
71h,f

Exercice 2) : Accs la RAM par l'adressage direct


Donner le programme qui copie :
35 dans la position 20h,
-5 dans la position 110h,

'A' dans la position A0h


35h dans la position 190h

23

Exercice 3) : Accs la RAM par l'adressage indirect


Donner le programme qui copie l'alphabet majuscule dans la RAM partir
de la position 190h
Exercice 4) : Soustraction
Donner le programme qui :
soustrait la constante 33 de l'accumulateur W (W-33)
Soustrait la constante 40h de la case mmoire d'adresse 70h ([70h]-40h)
qui soustrait le contenu de la case mmoire 70h de l'accumulateur W avec
le rsultat dans W
( W [70h] W )
qui soustrait le contenu de la case mmoire 71h de l'accumulateur W avec
le rsultat dans la case mmoire
( W [71h] [71h] )

24

III Les outils de dveloppement


III.1 Procdure de travail
Les tapes ncessaires permettant de voir un programme s'excuter sur un
PIC sont :

Ecrire un programme en langage assembleur dans un fichier texte et le


sauvegarder avec l'extension .asm

Compiler ce programme avec l'assembleur MPASM fourni par Microchip. Le


rsultat est un fichier excutable avec l'extension .hex contenant une suite
d'instruction comprhensible par le pic.

Transplanter le fichier .hex dans la mmoire programme du PIC (mmoire


flash) l'aide d'un programmateur adquat. On peut utiliser les
programmateurs de Microchip ou tout autre programmateur achet ou
ralis par soit mme.

Mettre le PIC dans son montage final, mettre sous tension et admirer le
travail.

Microchip propose gratuitement l'outil de dveloppement MPLAB qui


regroupe l'diteur de texte, le compilateur MPASM, un outil de simulation et le
logiciel
de
programmation.
Le
programmateur
lui-mme,
n'est
malheureusement pas gratuit.
Pour ce qui nous concerne, nous utiliseront MPLAB pour crire, compiler et
ventuellement simuler nos programmes, ensuite, pour implanter les
programmes dans la mmoire flash du PIC, nous utiliserons un programmateur
fait maison que nous piloteront par le logiciel ICPROG, les deux sont
disponibles gratuitement sur le Web.

Internet est riche en informations sur ce sujet. Vous trouverez une rubrique
sur les programmateurs de PIC sur mon site http://z.oumnad.123.fr

25

III.2 Lenvironnement de dveloppement MPLAB


MPLAB-IDE peut tre tlcharg sur le site Web http://www.microchip.com
Aprs l'installation, lancer MPLAB et faire les config ci-dessous :

Configure Select Device PIC16F876 ou PIC16F877

Nous allons raliser un tout petit programme sans grand intrt pour voir la
procdure de fonctionnement (avec MPLAB 6.30)

Ouvrir une nouvelle fentre (de l'diteur) pour commencer crire un


programme : file new ou cliquez sur l'icne feuille blanche

Taper le petit programme ci-dessous dans la fentre qui vient de s'ouvrir.


Ce programme incrmente sans fin la position mmoire (RAM) 70H

loop

incf 70h,1
goto looop
end

Sauvegarder (file save ) ce programme dans la directory de votre chois


sous le nom bidon.asm

Lancer la compilation du programme l'aide de la commande project


Quikbuild
Apparemment il y a un problme, le compilateur nous dit qu'il y une erreur
la ligne 2
Error[113] C:\...\BIDON.ASM 2 : Symbol not previously defined (looop)
Evidemment, le label loop dfinit dans la ligne prcdente prend seulement
deux o. Corrigez et recommencez. Cette fois a a l'air d'aller. On peut
vrifier que le compilateur a cre le fichier bidon.hex dans la mme
directory o se trouve bidon.asm. Les fichiers bidon.cod, bidon.err et
bidon.lst ne nous servent rien pour l'instant on peut les dtruire.

Nous pouvons maintenant excuter notre programme en simulation pour


voir s'il ralise bien la tache demande :
Pour faire apparatre la barre d'outil du simulateur :
Debugger Select tool MPLAB SIM

Ouvrez la fentre qui visualise la mmoire RAM : view FileRegisters. et


reprer la case mmoire 70h

Excuter maintenant le programme PAS PAS en cliquant chaque fois sur


le bouton Step Into {} en observant la case mmoire 70h . (on dirait que
a marche).

On peut aussi excuter en continu en cliquant sur le bouton animate ,


pour arrter, il faut cliquer sur le bouton halt

Pour plus de dtail, consulter le manuel d'utilisation de MPLAB

26

27

III.2.1

Editer, compiler simuler

;*****************************************************************
; Ce programme crit les lettres A, B, C, D dans les positions suivantes de la RAM
; A => 20h
B => A0h
C => 110h
D => 190h
;*****************************************************************
list p=16f877 , r=dec
include <p16f877.inc>
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF &
_LVP_OFF & _BODEN_OFF & _PWRTE_OFF & _WDT_OFF & _XT_OSC
bcf
bcf
movlw
movwf

STATUS,RP0
STATUS,RP1
'A'
20h

;bank 0
;bank 0

bsf
movlw
movwf

STATUS,RP0
'B'
0xA0

;bank 1

bcf
bsf
movlw
movwf

STATUS,RP0
STATUS,RP1
'C'
110h

;bank 2
;bank 2

bsf
movlw
movwf

STATUS,RP0
'D'
190h

;bank 3

end
Compilons
le
programme
avec MPLAB (project quikbuild)
et
visualisons
la
mmoire
programme
(view program
memory) , on obtient la fentre
ci-dessus.
Observations :

Comme
il
n'y
a
pas
d'interruption, on ne s'est pas
souci de l'implantation du
programme dans la mmoire
programme (directive ORG).
on remarque sur la fentre
que
l'implantation
du
programme
commence

l'adresse 0.

28

La colonne de droite de cette fentre obtenue par cross-assemblage du


code machine n'utilise pas les noms des registres mais leurs adresses. Si
nous avons pu utiliser les instruction comme bcf STATUS,RP0, au lieu de bcf
0x3,0x5 c'est parce que le fichier p16f876.inc que nous avons inclus
contient les dclarations STATUS EQU 0x3 et
RP0 EQU 0x5

On remarque aussi que l'instruction movwf 190h a t remplace par


movwf 0x10, c'est tout fait normal car on ne retient que 7 bits de
l'adresse 190h = 0001 1001 0000 ce qui donne 001 0000 = 10h. Rassurons
nous, c'est quand mme l'adresse 190h qui sera adresse l'adresse 001
0000 sera complte par RP1,RP0=11 (bank 3) et on obtient 11001 0000 =
190h

Simulation :
Visualisons la RAM (view file registers) et les registres de configuration
(vew Special function registers) et excutons le programme pas par pas tout
en observant l'accumulateur WREG, le registre STATUS et les cases mmoire
concernes.

29

III.3 Quelques exemples


III.3.1 Comparaison
Suite une soustraction, les drapeau Z et C situs dans le registre STATUS
sont positionns comme suit :
A - B = 0 ==>
Z=1 , C=1
A - B > 0 ==>
Z=0 , C=1
A - B < 0 ==>
Z=0 , C=0
On peut conclure :
Z=1 ==> galit
C=1 ==> sup ou gal
C=0 ==> infrieur
Exercice 5) : (comp1.asm)
Comparer les contenus des cases mmoire 6Fh et EFh, sil son gaux
mettre zro tous les bits de la case 16Fh sinon mettre 1 tous les bits de
la case 1EFh
Exercice 6) : (comp2.asm)
Comparer les contenus des cases mmoire 6Fh et EFh,
si [6Fh] = [EFh]
copier la lettre E dans la case mmoire 16Fh
si [6Fh] > [EFh]
copier la lettre S dans la case mmoire 16Fh
si [6Fh] < [EFh]
copier la lettre I dans la case mmoire 16Fh

III.3.2 Boucles de temporisation


Il arrive souvent qu'on dsire introduire des temporisations pendant
l'excution d'un programme. Le PIC dispose de 3 timers permettant de grer le
temps avec prcision. Nous tudierons ces modules plus tard, pour l'instant
regardons comment on peut raliser des temporisations l'aide de simples
boucles. L'ide est d'initialiser une variable une valeur donne et ensuite la
dcrmenter en boucle jusqu' ce qu'elle atteint 0. Connaissant le temps
d'excution de chaque instruction, on peut calculer le temps que mettra le
processeur terminer la boucle de dcrmentation
III.3.2.1
Temporisation avec une boucle
Examinons l'exemple ci-dessous, on met une valeur N1 dans la case
mmoire 70h et on la dcrmente jusqu' 0

ici
-

movlw
movwf
decfsz
goto

4
70h
70h,f
ici

Les instructions movlw et movwf prennent 1 cycle chacune


L'instruction decfsz prend un cycle si elle ne saute pas et 2 cycles quand
elle saute
L'instruction goto prend 2 cycles

30
-

chaque passage dans la boucle prend (1+2) cycle sauf le dernier qui prend
2 cycle
T = 2 + (N1-1)*3 + 2 = 3*N1 + 1 cycles

La valeur max que l'on peut donner N1 est = 0 = 256, ce qui donne une
temporisation max de 769 cycles.
Avec un quartz = fosc = 4 Mhz, 1 cycle = fosc/4 = 1 s, ce qui donne une
temporisation max de 769 s
Pour faciliter l'utilisation de cette temporisation on va l'utiliser comme une
fonction que l'on appellera tempo1. On note AN1 la case mmoire qui sert de
compteur, il faut la dclarer au dbut avec la directive EQU
tempo1:
t1:

; il faut placer une valeur dans W dans le programme principal


movwf
AN1
decfsz
AN1,f
goto
t1
return

Cette fonction doit tre place aprs le programme principal, et on l'appelle


avec l'instruction call tempo1
Pour le calcul il faut rajouter 2 cycles pour l'instruction call et 2 cycles pour
l'instruction return, ce qui donne
T1 = 3 N1 + 5 cycles
Le maximum est obtenu pour N1 =256, soit T1max = 773 s = 0.77 ms

III.3.2.2
Temporisation avec 2 boucles imbriques
La boucle intrieure (N1) se fait toujours 256 fois. La boucle extrieure se
fait N2 fois
tempo2 :
t2 :

; il faut dfinir W dans le programme principal


movwf
AN2
decfsz
AN1,f
goto
t2
decfsz
AN2,f
goto
t2
return

T2 = 2 + 2 + [N2(t1+3)-1] + 2

avec t1=256*3-1=767 on obtient :

T2 = 770 N2 +5
Le maximum est obtenu pour N2 =256, soit T2max = 197125 s = 0.197 s

31

III.3.2.3
Temporisation avec 3 boucles imbriques
Les boucles intrieures (N1 et N2) se font toujours 256 fois. La boucle
extrieure se fait N3 fois
tempo3 :
t3 :

;Il faut dfinir W dans le programme principal


movwf
AN3
decfsz
AN1,f
goto
t3
decfsz
AN2,f
goto
t3
decfsz
AN3,f
goto
t3
return

T3 = 2 + 2 + N3(t2+3)-1 + 2

avec t2=256*(767+3)-1 on obtient :

T3 = 197122 N3 +5
Le maximum est obtenu pour N3 =256, soit T3max = 50463237 s = 50.46 s
Remarque : La prcision de ces fonctions peut tre amliore en y insrant
des instructions nop, dans ce cas il faut revoir les formules. On verra plus tard
comment on peut faire des temporisations laide des timers.

32

IV

Les ports dE/S

IV.1 Le port d' E/S PORTA


Le port A dsign par PORTA est un port de 6 bits (RA0 RA5). RA6 et RA7
ne sont pas accessibles.
La configuration de direction se fait l'aide du registre TRISA, positionner
un bit de TRISA 1 configure la broche correspondante de PORTA en entr et
inversement. Au dpart toutes les broches sont configures en entre

IV.1.1 La broche RA4


En entre, la broche RA4 peut tre utilise soit comme E/S numrique
normale, soit comme entre horloge pour le Timer TMR0
Vdd
En sortie, RA4 est une E/S drain ouvert, pour l'utiliser
comme sortie logique, il faut ajouter une rsistance de pullup externe. Le schma (Fig. IV.1) illustre (pour les non
lectroniciens) le principe d'une sortie drain ouvert (ou
collecteur ouvert) : si RA4 est positionne 0, l'interrupteur
est ferm, la sortie est relie la masse, c'est un niveau
bas. Si RA4 est place 1, l'interrupteur est ouvert, la sortie
serait dconnecte s'il n'y avait pas la rsistance externe qui
place la sortie au niveau haut.

1k

RA4

Fig. IV.1 : rsistance de pull-up

Si on veut utiliser RA4 pour allumer une LED, on peut


utiliser le schma de Fig. IV.2. Il faut juste remarquer que
la logique est inverse, si on envoie 0 sur RA4,
1k
l'interrupteur se ferme et la LED s'allume. Si on envoie 1,
l'interrupteur s'ouvre et la LED s'teint.
LED
Le schma illustr sur Fig. IV.3 peut aussi tre utilis.
La logique n'est pas inverse mais il demande une
RA4
prcaution particulire. Il ne faut pas positionner la sortie
RA4 l'aide d'une instruction qui ralise
Vdd
une opration sur l'tat actuel du port;
genre IORWF, ANDWF, XORWF ou
Fig. IV.2 : LED sur RA4
COMF, ADDWF, INCF Ces instructions
1k
ralisent une lecture-criture en commencent par lire l'tat RA4
du port pour ensuite faire une opration dessus. Or, (sur
Fig. IV.3) si la sortie tait au niveau haut, l'interrupteur est
LED
ouvert, la LED est allume et elle impose une tension de
l'ordre de 1.5V qui sera considre ( tort) comme un
niveau bas lors de la lecture du port par les instructions
Fig. IV.3 : LED sur RA4
prcites. La solution est d'utiliser des instructions qui
positionnent le PORT sans tenir compte de son tat courant comme MOVWF,
BSF ou BCF
Vdd

33

IV.1.2 Les autres broches


Les autres broches (RA0, RA1, RA2, RA3 et RA5) peuvent tre utilise soit
comme E/S numriques soit comme entres analogiques. Au RESET, ces E/S
sont configures en entres analogiques. Pour les utiliser en E/S numriques,
il faut crire '00000110' dans le registre ADCON1 (pour plus de dtail, voir
chapitre VIII).
Pour utiliser PORTA en port Numrique (normal), il faut placer
06h dans le registre ADCON1 (bank1)
Quelque soit le mode (Analogique ou Numrique), il faut utiliser le registre
TRISA pour configurer la direction des E/S :

Bit i de TRISA = 0 bit i de PORTA configur en sortie

Bit i de TRISA = 1 bit i de PORTA configur en entre


OPTION_REG :
ADCON1
:

RBPU
ADFM

INTEDG

T0CS

T0SE

PSA
PCFG3

PS2
PCFG2

PS1
PCFG1

PS0
PCFG0

IV.2 Le port d' E/S PORTB

Le port B dsign par PORTB est un port bidirectionnel de 8 bits (RB0


RB7). Toutes les broches sont compatibles TTL.

La configuration de direction se fait l'aide du registre TRISB, positionner


un bit de TRISB 1 configure la broche correspondante de PORTB en entr
et inversement. Au dpart toutes les broches sont configures en entre.

En entre, la ligne RB0 appele aussi INT peut dclencher linterruption


externe INT.

En entre, une quelconque des lignes RB4 RB7 peut dclencher


l'interruption RBI. Nous reviendrons l-dessus dans le paragraphe rserv
aux interruptions.

IV.3 Le port d' E/S PORTC

Le port C dsign par PORTC est un port bidirectionnel de 8 bits (RC0


RC7). Toutes les broches sont compatibles TTL.

La configuration de direction se fait l'aide du registre TRISC, positionner


un bit de TRISC 1 configure la broche correspondante de PORTC en entr
et inversement. Au dpart toutes les broches sont configures en entre.

Toutes les broches du port C peuvent tre utilises soit comme E/S
normales soit comme broches d'accs diffrents modules comme le timer
1, les modules de comparaison et de capture CCP1/2, le timer 2, le port I2C
ou le port srie, ceci sera prcis au moment de l'tude de chacun de ces
priphriques.

Pour lutilisation dune broche du port C comme E/S normale, il faut


sassurer quelle na pas t affecte un de ces modules. Par exemple, si
TIMER1 est valid, il peut utiliser les broches RC0 et RC1 selon sa
configuration.

34

IV.4 Le port d' E/S PORTD

Le port D dsign 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 entre.

Chaque broche et configurable en entre ou en sortie laide du registre


TRISD. Pour configurer une broche en entre, on positionne le bit
correspondant dans TRISD 1 et inversement.

PORTD nest pas implment sur tous les processeur 16F87X, il est
disponible sur le 16F877, le 16F874 et le 16F871

PORTD peut tre utilis dans un mode particulier appel parallel slave port,
pour cela il faut placer le bit 4 (PSPMODE) de TRISE 1. Dans ce cas les 3
bits de PORTE deviennent les entres de control de ce port (RE, WE et CS)
Pour utiliser PORTD en mode normal, il faut placer le bit 4 de TRISE 0

IV.5 Le port d' E/S PORTE

PORTE contient seulement 3 bits RE0, RE1 et RE2. Les 3 sont configurables
en entre ou en sortie laide des bits 0, 1 ou 2 du registre TRISE.

PORTD nest pas implment sur tous les processeur 16F87X, il est
disponible sur le 16F877, le 16F874 et le 16F871

Les 3 bits de PORTE peuvent tre utiliss soit comme E/S numrique soit
comme entres analogiques du CAN. La configuration se fait laide du
registre ADCON1.

Si le bit 4 de TRISE est plac 1, Les trois bits de PORTE deviennent les
entres de control du PORTD qui (dans ce cas) fonctionne en mode parallel
Slave mode

A la mise sous tension (RESET), les 3 broche de PORTE sot configur en


entre analogique.
Pour utiliser les broches de PORTE en E/S numriques normales :
- Placer 06h dans ADCON1
- Placer le bit 4 (PSPMODE) de TRISE 0

Exercice 7) : Clignoter une LED


Donner le programme qui fait clignoter une LED branche sur RA0 avec une
temporisation voisine de 0.5s. Sachant que le PIC est dot d'un quartz de 4
MHz, la temporisation sera ralise l'aide de boucles imbriques
Exercice 8) : compteur impulsions
Programme qui :
place la sortie RB0 1
compte 150 impulsions sur l'entre RA4
remettre la sortie RB0 0

35

Les mmoires permanentes

V.1

La mmoire EEPROM de donnes

Le PIC 16F876/877 dispose de 256 octets de mmoire EEPROM de donne.


Son implantation physique commence la position dadresse absolue 2100h.
Mais pour y accder partir des programmes utilisateur on utilise ladressage
relatif par rapport la premire position. La premire position aura ladresse 0,
la deuxime aura ladresse 1. . . et la dernire aura ladresse 255.
Pour accder la EEPROM, on utilise 4 registres particuliers :

EEADR : registre dadresse (relative) (bank 2)

EEDATA : registre de donne

(bank 2)

EECON1 : registre de control

(bank 3)

EECON2 : 2

me

registre de control

Le registre EECON1 :

EEPGD

(bank 3)

WRERR WREN WR RD

EEPGD : Accs la mmoire EEPROP ou la mmoire Programme


0 : EEPROM de donnes
1 : Mmoire programme (flash)
WRERR : Erreur d'criture (indicateur)
0 : Pas d'erreur
1 : Une erreur s'est produite
WREN : Validation de l'criture dans l'EEPROM
0 : Ecriture interdite
1 : Ecriture autorise
WR

: Write Enable. Ce bit doit tre mis 1 pour dmarrer l'criture d'un
octet. Il est remis zro automatiquement la fin de l'criture. Ce bit
ne peut pas tre mis zro par une instruction.

RD

: Read Enable. Ce bit doit tre mis 1 pour dmarrer la lecture d'un
octet. Il est remis zro automatiquement la fin de la lecture. Ce bit
ne peut pas tre mis zro par une instruction

V.1.1
Procdure de lecture dans l'EEPROM
Pour lire le contenu dune position de la mmoire EEPROM, on place
ladresse dans le registre EEADR, on lance lopration de lecture laide du bit
RD du registre EECON1, la donne dsire est tout de suite disponible dans le
registre EEDATA :
1) Mettre le bit EEPGD 0 pour pointer sur l'EEPROM de donne
2) Placer ladresse relative de la position lire dans EEADR
3) Mettre le bit RD 1 pour dmarrer la lecture. Ce bit revient 0
automatiquement tout de suite aprs le transfert de la donne vers
EEDATA, (moins d'un cycle)
4) Traiter la donne disponible dans EEDATA

36
5)

Recommencer au point 2 si on a d'autres donnes lire,

V.1.2
Procdure d'criture dans l'EEPROM
Pour crire une donne dans une position de la mmoire EEPROM, on place
ladresse dans le registre EEADR, la donne dans le registre EEDATA, on lance
lopration dcriture laide du bit WR de EECON1 et du registre EECON2. La
donne prsente dans EEDATA est alors copie dans la EEPROM mais cette
opration prend 10 ms. A la fin de l'criture le bit WR revient zro
automatiquement, le drapeau EEIF est lev ce qui peut dclencher
l'interruption EEI si elle a t valide auparavant :
1) Mettre le bit EEPGD 0 pour pointer sur l'EEPROM de donne
2) Positionner le bit WREN pour valider l'criture dans l'EEPROM
3) Interdire les interruptions (si elles ont t valides avant : bit INTCON.GIE)
4) Placer ladresse relative de la position crire dans EEADR (L'adresse de la
premire position est 0)
5) Placer la donne crire dans le registre EEDATA
6) - Ecrire 55h dans EECON2 (commande de process hardwares)
- Ecrire AAh dans EECON2 (commandes de process hardwares)
- Positionner le bit WR pour dmarrer l'opration d'criture, ce bit revient
automatiquement 0 la fin de lcriture (aprs 10 ms)
7) attendre la fin de l'criture en surveillant le bit WR ou le drapeau EEIF
8) Recommencer au point (4) si on a d'autres donnes crire,
9) Autoriser les interruptions (si besoin)
10) Remettre Zro le bit WREN (si besoin)
Les bits WREN et WR ne peuvent tre positionn dans la mme instruction. WR
ne peut tre positionn que si le bit WREN a t positionn avant.

V.2

La mmoire Programme ou mmoire flash

Cette mmoire de 8 x 1024 mots de 14 bits sert stocker le programme,


mais elle est accessible par programme et peut donc tre utilise comme une
extension de la mmoire EEPROM de donnes. Elle est non volatile (flash) et
reprogrammable souhait. Chaque position de 14 bits contient une instruction.
L'emplacement du programme peut se situer n'importe quel endroit de la
mmoire. Cependant il faut savoir que suite un RESET ou lors de la mise
sous tension, le PIC commence l'excution l'adresse 0000H. De plus, lorsqu'il
y a une interruption, le PIC va l'adresse 0004H. Il est donc ncessaire de bien
organiser le programme si celui-ci utilise des interruptions.
Le programme excutable par le PIC est implant dans la mmoire flash
l'aide d'un programmateur (hard+soft) sur lequel nous reviendrons dans la
suite de ce document.
L'accs la mmoire flash par les instructions du programme se fait de la
mme faon que l'accs l'EEPROM de donnes, l'exception des points
suivant :

37

Le bit EEPGD doit tre plac 1

Le registre EEADR (8 bits) seul ne suffit pas adresser les 8k de mmoire


programme, on lui accole le registre EEADRH dans lequel il faut crire la
partie haute de l'adresse. On obtient ainsi les 13 bits ncessaires pour
adresser 8K.

Le registre EEDATA (8 bits) seul ne suffit pas pour contenir les 14 bits
contenus dans une position de la mmoire programme. On lui accole le
registre EEDATH qui contiendra les 6 bits suprieurs.

Il faut insrer deux instructions NOP dans les cycles de lecture/criture.


Pendant la phase d'criture, le processeur arrte l'excution des
instructions. Il n'est donc pas ncessaire d'attendre la fin de l'criture pour
continuer car ceci se fait automatiquement, la fin de l'criture, l'excution
reprend l'instruction qui suit le 2me NOP,

V.2.1
Procdure lecture dans la mmoire programme
1) Mettre le bit EEPGD 1 pour pointer sur la mmoire programme
2) Placer ladresse de la position lire dans EEADRH:EEADR
3) Mettre le bit RD 1 pour dmarrer la lecture
4) Attendre 2 cycles machine (2 instructions NOP)
5) Lire le contenu des registres EEDATH:EEDATA
6) Recommencer au point 2) si on a d'autres donnes lire

V.2.2
Procdure d'criture dan la mmoire programme
1) Interdire les interruptions (si elles ont t valides avant)
2) Mettre le bit EEPGD 1 pour pointer sur la mmoire programme
3) Positionner le bit WREN pour valider l'criture dans la mmoire programme
4) Placer ladresse de la position crire dans EEADRH:EEADR
5) Placer la donne crire dans le registre EEDATH:EEDATA
6) - Ecrire 55h dans EECON2 (commande de process hardwares)
- Ecrire AAh dans EECON2 (commandes de process hardwares)
- Positionner le bit WR pour dmarrer l'opration d'criture, ce bit revient
automatiquement 0 la fin de lcriture (aprs 10 ms)
7) Excuter 2 instructions NOP
8) Recommencer au point 4 si on a d'autres donne crire
9) Autoriser les interruptions (si besoin)
10) Remettre Zro le bit WREN (si besoin)

38

Remarque : aprs le point (6), a ne sert rien de scruter le bit WR pour


attendre la fin de l'criture. Le processeur arrte l'excution du programme
pendant la phase d'criture dans la mmoire programme. La boucle de
scrutation ne sera excute qu'aprs la fin de l'criture ce qui la rend tout
fait inutile. Il suffit de mettre deux instructions NOP avant de continuer.
Exercice 9)
Programme qui crit l'alphabet majuscule dans la mmoire EEPROM de
donnes.
Exercice 10) EEPROM-D vers RAM
Programme qui utilise la directive DE pour initialiser les premires positions de
l'EEPROM de donnes avec la chane "BONJOUR CHER AMI". Le programme
doit ensuite lire ces caractres (1 par 1) dans l' EEPROM et les copier dans la
RAM partir de la position 110h
Exercice 11) Mem-Prog vers RAM
Programme qui lit 20 positions de la mmoire programme dbutant la
position 250 (FAh) et les copie dans la RAM partir de la position 110h

39

VI

Les interruptions

Une interruption provoque larrt du programme principal pour aller


excuter une procdure d'interruption. A la fin de cette procdure, le
microcontrleur reprend le programme principal lendroit o il la laiss. A
chaque interruption sont associs deux bits, un bit de validation et un drapeau.
Le premier permet d'autoriser ou non l'interruption, le second permet au
programmeur de savoir de quelle interruption il s'agit.
Sur le 16F876/877, l'es interruptions sont classes en deux catgories, les
interruptions primaires et les interruptions priphriques. Elles sont gres par
les registres :
INTCON
GIE
PIE1 (bk1)
PSPIE
PIR1 (bk0)
PSPIF
PIE2 (bk0)
PIR2 (b1)
OPTION_REG

PEIE
T0IE
ADIE
RCIE
ADIF
RCIF
INTEDG

INTE
TXIE
TXIF
EEIE
EEIF

peuvent

tre

RBIE T0IF
INTF
SSPIE CCP1IE TMR2IE
SSPIF CCP1IF TMR2IF
BCLIE
BCLIF
valides/interdites

par

RBIF
TMR1IE
TMR1IF
CCP2IE
CCP2IF

Toutes les interruptions


INTCON.GIE

le

bit

Toutes les interruptions priphriques peuvent tre valides/interdites par


le bit INTCON.PEIE

Chaque interruption peut tre valide/interdite par son bit de validation


individuel
En rsum, pour valider une interruption priphrique (par exemple), il faut
positionner 3 bits, GIE, PEIE et le bit individuel de linterruption.

VI.1 Droulement d'une interruption


Lorsque l'vnement dclencheur d'une interruption intervient, alors son
drapeau est positionn 1 (lev). Si l'interruption a t valide (bits de
validations = 1), elle est alors dclenche : le programme arrte ce qu'il est en
train de faire et va excuter la procdure d'interruption qui se trouve
l'adresse 4 en excutant les tapes suivantes :

l'adresse contenue dans le PC (Program Counter) est sauvegarde dans la


pile, puis remplace par la valeur 0004 (adresse de la routine
d'interruption).

Le bit GIE est plac "0" pour inhiber toutes les interruptions (afin que le PIC
ne soit pas drang pendant l'excution de la procdure d'interruption).

A la fin de la procdure d'interruption (instruction RETFIE) :

le bit GIE est remis 1 (autorisant ainsi un autre vnement)

le contenu du PC est recharg partir de la pile ce qui permet au


programme de reprendre l o il s'est arrt

Deux remarques importantes sont faire :

40
Le drapeau reste ltat haut mme aprs le traitement de linterruption. Par
consquent, il faut toujours le remettre "0" la fin de la routine
d'interruption sinon l'interruption sera dclenche de nouveau juste aprs
l'instruction RETFIE
Seul le PC est empil automatiquement. Si cela est ncessaire, les registres W
et STATUS doivent tre sauvegards en RAM puis restaurs la fin de la
routine pour que le microcontrleur puisse reprendre le programme principal
dans les mmes conditions o il l'a laiss.

VI.2 Les sources d'interruption


Interruption : Source dinterruption
T0I : Dbordement Timer 0
INT : Front sur RB0/INT
RBI : Front sur RB4-RB7
ADI : Fin de conversion A/N
RCI : Un Octet est reu sur l'USART
TXI : Fin transmission d'un octet sur l'USART
SSPI : Caractre mis/reu sur port srie synchrone
TMR1I : Dbordement de Timer 1
TMR2I :Timer 2 a atteint la valeur programme
SSPI : Lecture/criture termine sur Port parallle (16F877)
CCP1I : Capture/comparaison de TMR1 avec module CCP1
CCP2I : Capture/comparaison de TMR1 avec module CCP2
EEI : Fin d'criture en EEPROM
BCLI : Collision sur bus SSP en mode I2C

Validation
INTCON.T0IE
INTCON.INTE
INTCON.RBIE
PIE1.ADIE
PIE1.RCIE
PIE1.TXIE
PIE1.SSPIE
PIE1.TMR1IE
PIE1.TMR2IE
PIE1.PSPIE
PIE1.CCP1IE
PIE2.CCP2IE
PIE2.EEIE
PIE2.BCLIE

Flag
INTCON.T0IF
INTCON.INTF
INTCON.RBIF
PIR1.ADIF
PIR1.RCIF
PIR1.TXIF
PIR1.SSPIF
PIR1.TMR1IF
PIR1.TMR2IF
PIR1.PSPIF
PIR1.CCP1IF
PIR2.CCP2IF
PIR2.EEIF
PIR2.BCLIF

PEIE
non
non
non
oui
oui
oui
oui
oui
oui
oui
oui
oui
oui
oui

VI.3 L'interruption INT (Entre RB0 du port B)


Cette interruption est provoque par un changement d'tat sur l'entre RB0
du port B quand elle est programme en entre. En plus de son bit de
validation INTE et son drapeau INTF, elle est gre aussi par le bits INTEDG
(OPTION_REG) qui dtermine le front sur lequel l'interruption se dclenche,
1=montant, 0=descendant

VI.4 L'interruption RBI (RB4 A RB7 du port B)


Cette interruption est provoque par un changement d'tat sur l'une des
entres RB4 RB7 du port B, Le front n'a pas d'importance. Les bits associs
sont RBIE (validation) et RBIF (drapeau)

VI.5 Les autres interruptions


Les autres interruptions seront abordes au moment de l'tude des
modules qui les dclenchent.

41

VII Les Timers


VII.1 Le Timer TMR0
Cest un compteur 8 bits ayant les caractristiques suivantes :

Il est incrment en permanence soit par lhorloge interne Fosc/4 (mode


timer) soit par une horloge externe applique la broche RA4 du port A
(mode compteur). Le choix de l'horloge se fait l'aide du bit T0CS du
registre OPTION_REG
o T0CS = 0 horloge interne
o T0CS = 1 horloge externe applique RA4

Dans le cas de l'horloge externe, Le bit T0SE du registre OPTION_REG


permet de choisir le front sur lequel le TIMER s'incrmente.
o T0SE = 0 incrmentation sur fronts montants
o T0SE = 1 incrmentation sur fronts descendants

Quelque soit l'horloge choisie, on peut la passer dans un diviseur de


frquence programmable (prescaler) dont le rapport est fixs par les bits
PS0, PS1 et PS2 du registre OPTION_REG (tableau ciPS2 PS1 PS0 Div
contre). L'affectation ou non du prdiviseur se fait
0
0
0
2
l'aide du bit PSA du registre OPTION_REG
0
0
1
4
o PSA = 0 on utilise le prdiviseur
1
0
8
o PSA = 1 pas de prdiviseur (affect au chien de 0
0
1
1 16
garde)
0
0 32
Le contenu du timer TMR0 est accessible par le registre 1
1
0
1 64
qui porte le mme nom. Il peut tre lu ou crit
1
0 128
n'importe
quel
moment.
Aprs
une
criture, 1
1
1 256
l'incrmentation est inhibe pendant deux cycles 1
instruction

Au dbordement de TMR0 (FF 00), le drapeau INTCON.T0IF est plac 1.


Ceci peut dclencher l'interruption T0I si celle-ci est valide
OPTION_REG
T0SE

RA4

Horloge

quartz
Fosc

RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0


T0CS

PSA

1
0

1
Prdiviseur
programmable

TMR0

T0IF

Fosc/4
PS2

PS1 PS0

Exercice 12) Clignoter LED / TMR0


Clignoter une LED branche sur RB0, delay voisin de 0.5s l'aide de TMR0
a) Par scrutation du drapeau T0IF (pas d'interruption)
b) En utilisant l'interruption T0I

42

VII.2 Le Watchdog Timer WDT (Chien de garde)


Cest un compteur 8 bits incrment en permanence (mme si le C est en
mode sleep) par une horloge RC intgre indpendante de l'horloge systme.
Lorsquil dborde, (WDT TimeOut), deux situations sont possibles :

Si le C est en fonctionnement normal, le WDT time-out provoque un


RESET. Ceci permet dviter de rester plant en cas de blocage du
microcontrleur par un processus indsirable non contrl

Si le C est en mode SLEEP, le WDT time-out provoque un WAKE-UP,


l'excution du programme continue normalement l o elle s'est arrte
avant de rentrer en mode SLEEP. Cette situation est souvent exploite pour
raliser des temporisations

L'horloge du WDT a une priode voisine de 70 s ce donne


PS2 PS1 PS0 Div
un Time-Out toutes les 18 ms. Il est cependant possible
0 0 0 1
d'augmenter cette dure en faisant passer le signal Time-Out
0 0 1 2
dans un prdiviseur programmable (partag avec le timer
TMR0). L'affectation se fait l'aide du bit PSA du registre 0 1 0 4
0 1 1 8
OPTION_REG
1 0 0 16
o PSA = 1 on utilise le prdiviseur
1 0 1 32
o PSA = 0 pas de prdiviseur (affect TMR0)
1 1 0 64
Le rapport du prdiviseur est fix par les bits PS0, PS1 et 1 1 1 128
PS2 du registre OPTION_REG (voir tableau ci-contre)
L'utilisation du WDT doit se faire avec prcaution pour viter la
rinitialisation (inattendue) rpte du programme. Pour viter un WDT
timeOut lors de l'excution d'un programme, on a deux possibilits :

Inhiber le WDT d'une faon permanente en mettant 0 le bit WDTE dans


l'EEPROM de configuration

Remettre le WDT 0 priodiquement dans le programme l'aide de


l'instruction CLRWDT pour viter qu'il ne dborde
PSA
Horloge
WDT

WDT

WDT timeout
1

Prdiviseur
programmable
PS2 PS1 PS0

43

VII.3 Le Timer TMR1


TMR1 est un Timer/Compteur 16 bits accessible en lecture/criture par
l'intermdiaire des registres 8 bits TMR1H (bank0) et TMR1L (bank0) qui
constituent sa partie haute et sa partie basse.
On le configure l'aide du registre T1CON (bank0)
RC1

T1OSC
T1OSCEN

RC0

1
0

Horloge
Systme
FOSC/4

TMR1IF

T1SYNC
1

Prdiviseur
1, 2, 4, 8

TMR1
SYNC

TMR1CS

CLR

TMR1ON

CCP

A son dbordement (FFFFh 0000h) le drapeau PIR1.TMR1IF (bank0) est


positionn ce qui peut dclencher l'interruption priphrique TMR1I si elle
est valide par son bit de validation PIE1.TMR1IE (bank1).

TMR1 peut fonctionner dans 3 modes diffrents :


- Timer Synchrone (horloge interne)
- Compteur Synchrone (horloge externe)
- Compteur Asynchrone (horloge externe)
Le bit de contrle TMR1CS dtermine le fonctionnement en Timer ou en
Compteur et le bit T1SYNC dtermine le mode de fonctionnement en
synchrone ou en asynchrone

TMR1 peut tre arrt/dmarr l'aide du bit TMR1ON

TMR1 peut tre RAZ l'aide du module de capture/comparaison CCP

TMR1 peut tre prcd d'un prdiviseur (Prescaler) qui peut diviser la
frquence par 1, 2, 4 ou 8 selon la valeur des bits T1CKPS1 et T1CKPS0

VII.3.1 Le mode Timer


Dans ce mode, TMR1 est incrment par lhorloge systme Fosc/4
ventuellement prdivise. Le bit de synchronisation n'a pas d'effet car
l'horloge Fosc/4 est toujours synchronise sur l'horloge systme.
VII.3.2 Le mode Compteur
Dans ce mode, TMR1 est incrment chaque front montant de l'horloge
externe T1CKI (RC0) ou l'horloge interne gnre par loscillateur ddi T1OSC
condition de positionner le bit T1OSCEN 1 et de brancher un quartz entre
les broche RC0 et RC1.

44
En mode compteur, RC0 et RC1 sont automatiquement configures en
entre, on na pas besoin de configurer les bits TRISC,0 et TRISC,1

En fonctionnement Synchrone, l'horloge externe (ventuellement


prdivise) n'incrmente pas directement le timer mais elle est
synchronise sur l'horloge systme ce qui peut entraner un dlai de l'ordre
de 1 cycle machine. Dans cette configuration

En fonctionnement Asynchrone, l'horloge externe (ventuellement


prdivise) incrmente le timer indpendamment de l'horloge systme.
En mode Compteur Asynchrone, on ne peut pas utiliser les modules CCP1
et CCP2 pour faire des captures ou des comparaisons sur TMR1

VII.3.3 Le registre de control de T1CON

T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

T1CKPS1,T1CKPS0 : Control du prescaler


00 : division par 1
01 : division par 2
10 : division par 4
11 : division par 8
T1OSCEN : Validation de l'Oscillateur associ TMR1
0 : Oscillateur arrt
1 : Oscillateur activ
T1SYNC : Synchronisation de l'horloge externe (ignor en mode timer)
0 : Synchronisation
1 : pas de synchronisation
TMR1CS : Choix de l'horloge du Timer
0 : horloge systme (Fosc/4) : mode timer
1 : Horloge externe : mode compteur
TMR1ON : Dmarrer arrter le timer
0 : Timer stopp
1 : Timer en fonctionnement

Exercice 13) Clignoter LED / interruption TMR1


Clignoter une LED relie RD0. La temporisation voisine de 0.5s est ralise
l'aide de TMR1 est son interruption TMR1I

45
Exercice 14) Clignoter LED / scrutation de TMR1
Clignoter une LED relie RE0. La temporisation voisine de 0.5s est ralise
l'aide de TMR1 par scrutation du drapeau TMR1IF

VII.4

Les module de Comparaison/Capture CCP1 et CCP2

Chacun des modules CCP1 et CCP2 permet :

Soit de CAPTURER en un seul coup le contenu du double registre TMR1

Soit de COMPARER en permanence son contenu avec un registre 16 bits et


de dclencher un vnement au moment de lgalit.
Ces modules ne fonctionnent pas si TMR1 est configur en mode Compteur
non synchronis

VII.4.1 Le module CCP1


Ce module est constitu de :

Un registre 16 bits CCPR1 utilis pour la capture ou la comparaison de


TMR1. Il est accessible par sa partie basse CCP1L et sa partie haute CCP1H

Un registre de contrle 8 bits CCP1CON.

Un prdiviseur permettant de filtrer les vnements dclencheurs de


capture venant de la broche RC2

VII.4.1.1

Le mode Capture
CCP1IF
Registre de control

Registre de capture et comparaison

CCPR1
CCPR1H CCPR1L

CCP1CON
RC2

Prescaler
1, 4 ou 16

chargement

TMR1H

TMR1L

TMR1
Dans ce mode le contenu de TMR1 est copi dans CCPR1 chaque fois qu'un
vnement intervient sur la broche RC2. Le choix de l'vnement dclencheur
se fait en programmant le prescaler laide des bits 0 3 du registre de
contrle CCP1CON. On a le choix parmi les vnements suivants :

A chaque front descendant

A chaque front montant (prescaler 1:1)

A chaque 4me front montant (prescaler 1:4)

A chaque 16me front montant (prescaler 1:16)

46
A la fin de la capture, le drapeau CCP1IF est positionn, l'interruption
priphrique associe est dclenche si elle a t valide.
Plusieurs aspects sont noter comme :

Si on veut dclencher la capture par un signal externe, celui-ci doit tre


appliqu sur la proche RC2 qui doit tre configure en entre par le bit
TRISC,2

Si on veut dclencher la capture par programme en changeant la valeur du


bit RC2, celui-ci doit tre configur en sortie par le bit TRISC,2

Lors de la modification du mode de capture, une interruption indsirable


peut intervenir. L'utilisateur doit veiller masquer l'interruption CCP1I
avant de procder cette modification et de baisser le drapeau CCP1IF
aprs la modification.

En mode Sleep, le prescaler et le drapeau CCP1IF restent oprationnels. le


positionnement du drapeau peut dclencher un Wake-up si le bit de
validation CCP1IE a t valid auparavant

VII.4.1.2

Le registre de configuration CCP1CON

DC1B1

DC1B0

CCP1M3

CCP1M2 CCP1M1 CCP1M0

DC1B1, DC1B0 : utiliss en PWM mode


Ce sont les 2 bits de poids faible des 10 bits MWM duty cycle. Les 8 autres
bits sont dans le registre CCPR1L
CCP1M3 CCP1M0 : mode de fonctionnement du module CCP1
0000 : Module arrt (reset module)
0100 : Capture sur chaque front descendant
0101 : Capture sur chaque front montant
0110 : Capture tous les 4 fronts montants
0111 : capture tous les 16 fronts montants
1000 : Mode comparaison (drapeau CCP1IF + broche RC2 0 1)
1001 : Mode comparaison (drapeau CCP1IF + broche RC2 1 0)
1010 : Mode comparaison (drapeau CCP1IF seulement)
1011 : Mode comparaison (drapeau CCP1IF + RAZ TMR1)
10xx : PWM mode (modulation de largeur dimpulsion), ce mode ne sera
pas trait dan ce cours

VII.4.1.3 Le mode Comparaison


Dans ce mode le registre CCPR1 est compar en permanence TMR1.
Quand l'galit intervient, le drapeau CCP1IF passe 1 et diffrentes actions
sont accomplies selon le mode dfini par les bits de configuration
CCP1M3:CCP1M0

47
CCP1IF
CCP1Mx

RC2

CCPR1H CCPR1L

Logique
de
control

Comparateur

(RAZ)

TMR1H

TMR1L

horloge

mode 1000 :
Au moment de l'galit, le drapeau CCP1IF est le bit RC2 passent 1. C'est
l'utilisateur de les remettre 0 pour une prochaine utilisation. RC2 doit
tre configur en sortie.

mode 1001 :
Au moment de l'galit, le drapeau CCP1IF passe 1 et le bit RC2 passe
0. C'est l'utilisateur de les remettre leur tat dorigine pour une
prochaine utilisation. RC2 doit tre configur en sortie.

mode 1010 :
A l'galit le drapeau CCP1IF passe 1. La broche RC2 n'est pas utilise.

mode 1011 :
A l'galit, le drapeau CCP1IF passe 1 et le timer TMR1 est remis 0

VII.4.2 Le module CCP2


Le module CCP2 est identique au module CCP1, il suffit dinterchanger 1 et 2 et
de constater les points suivants :

CCP2 est associ la broche RC1

Il est gr par le registre de control CCP2CON

Son registre de capture/comparaison est CCPR2 = CCPR2H:CCPR2L

En mode comparaison 1011, A lgalit :


o le drapeau CCP2IF passe 1
o RAZ de TMR1
o envoi dun GO vers le convertisseur analogique numrique

Exercice 15) gnrer signal TMR1/CCP1


Programme qui gnre le signal ci-dessous sur la sortie RE0 en utilisant TMR1
associ CCP1
500 s

500 s

48

VII.5 Le Timer TMR2


TMR2 est un timer 8 bits
accessible
en
lecture
criture constitu de :

un registre de
T2CON (bank0)

control

un prdiviseur (1,4,16)

un registre de priode
PR2 (bank1) accessible
en lecture/criture

un comparateur,

un postdiviseur (1 16)

TMR2 est incrment par l'horloge interne Fosc/4. Il commence 0 et quant


il atteint la valeur du registre PR2, le comparateur gnre un signal qui :
Remet TMR2 0
incrmente le postscaler qui fonctionne comme un diviseur de
frquence
Comme le comptage commence 0, si PR2=N, alors le comparateur
annonce une galit tous les N+1 coups dhorloge

Au dbordement du postscaler, le drapeau PIR1.TMR2IF est positionn,


l'interruption correspondante et dclenche si elle est valide

TMR2 est remis zro chaque RESET et chaque criture dans PR2

Le prescaler et le postscaler sont initialiss chaque criture dans TMR2 ou


dans T2CON et au RESET du processeur

Le fonctionnement de TMR2 est configur l'aide du registre de control


T2CON :
TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0

TOUTPS3:TOUTPS0 : ratio du postscaler


0000 : division par 1
0001 : division par 2
...
1111 : division par 16
TMR2ON : dmarrer arrter TMR2
0 : TMR2 off
1 : TMR2 on
T2CKPS1,T2CKPS0 : ratio du prescaler
00 : prdiviseur par 1
01 : prdiviseur par 4
1x : prdiviseur par 16

49
Exercice 16) Clignoter LED / scrutation de TMR2
Clignoter une LED relie RE0. La temporisation voisine de 0.5s est ralise
l'aide de TMR2 :
1) Par scrutation du drapeau TMR2IF
2) En utilisant linterruption TMR2I

VIII Le module de conversion A/N


Vdd
ADCON0
CHS2:CHS0

RA0

000

RA1

001

RA2

010

RA3

011

RA5

100

RE0

101

RE1

110

RE2

111

ADCON1
Vref+

CAN

Vref-

GO

ADRES

DIV
Vss
fosc

Ce module est constitu d'un convertisseur Analogique Numrique 10 bits


dont l'entre analogique peut tre connecte sur l'une des 8 (5 pour 16F876)
entres analogiques externes. On dit qu'on a un CAN 8 canaux. Les entres
analogiques doivent tre configures en entre l'aide des registres TRISA
et/ou TRISE. Lchantillonneur bloqueur est intgr, il est constitu dun
interrupteur dchantillonnage et dune capacit de blocage de 120 pF.
Les tensions de rfrences permettant de fixer la dynamique du
convertisseur. Elles peuvent tre choisies parmi Vdd, Vss, Vr+ ou VrLe control du module se fait par les deux registres ADCON0 et ADCON1
ADCON0

ADCS1 ADCS0 CHS2

CHS1

CHS0

GO/DONE

ADON

ADCS1:ADCS0 : Choix de l'horloge de conversion donc du temps de


conversion (voir paragraphe VIII.2)
00 : Fosc/2
01 : Fosc/8
10 : Fosc/32

50
11 : Oscillateur RC ddi au CAN
CHS2:CHS0 : choix de l'entre analogique
000 = channel 0, (RA0)
001 = channel 1, (RA1)
010 = channel 2, (RA2)
011 = channel 3, (RA3)
100 = channel 4, (RA5)
101 = channel 5, (RE0)
110 = channel 6, (RE1)
111 = channel 7, (RE2)
GO/DONE : Une conversion dmarre quand on place ce bit 1. A la fin de la
conversion, il est remis automatiquement zro. Ce bit peut aussi
tre positionn automatiquement par le module CCP2.
ADON : Ce bit permet de mettre le module AN en service
ADCON1

ADFM

PCFG3 PCFG2 PCFG1 PCFG0

ADFM : justification droite ou gauche du rsultat


1 : justifi droite 000000XX XXXXXXXX
0 : justifi gauche XXXXXXXX XX000000
PCFG3:PCFG0 : configuration des E/S et des tensions de rfrences. Les 5
broches de PORTA et les 3 de PORTE peuvent tre configurs
soit en E/S digitales, soit en entres analogiques. RA2 et RA3
peuvent aussi tre configures en entre de rfrence.
PCFG3:
PCFG0
0000
0001
0010
0011
0100
0101
011x
1000
1001
1010
1011
1100
1101
1110
1111

VIII.1

AN7
RE2
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D

AN6
RE1
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D

AN5
RE0
A
A
D
D
D
D
D
A
A
A
A
D
D
D
D

AN4
RA5
A
A
A
A
D
D
D
A
A
A
A
A
D
D
D

AN3
RA3
A
VREF+
A
VREF+
A
VREF+
D
VREF+
A
VREF+
VREF+
VREF+
VREF+
D
VREF+

AN2
RA2
A
A
A
A
D
D
D
VREFA
A
VREFVREFVREFD
VREF-

AN1
RA1
A
A
A
A
A
A
D
A
A
A
A
A
A
D
D

AN0
RA0
A
A
A
A
A
A
D
A
A
A
A
A
A
A
A

VREF+

VREF-

A/R/D

VDD
RA3
VDD
RA3
VDD
RA3
VDD
RA3
VDD
RA3
RA3
RA3
RA3
VDD
RA3

VSS
VSS
VSS
VSS
VSS
VSS
VSS
RA2
VSS
VSS
RA2
RA2
RA2
VSS
RA2

8/0/0
7/1/0
5/0/3
4/1/3
3/0/5
2/1/5
0/0/8
6/2/0
6/0/2
5/1/2
4/2/2
3/2/3
2/2/4
1/0/7
1/2/5

Droulement dune Conversion

Le PIC dispose dun chantillonneur bloqueur intgr constitu d'un


interrupteur S, d'une capacit de maintien C=120 pF et dun convertisseur

51
Analogique numrique 10 bits. Pendant la conversion, la tension Ve l'entre
du convertisseur A/N doit tre maintenue constante.
Au dpart il faut commencer par faire lacquisition du signal en fermant
linterrupteur S, ceci se fait laide du registre ADCON0, soit au moment de la
validation du module par le bit ADON soit aprs un changement de canal si
ADON est dj positionn.
Aprs la fin de lacquisition, on peut dmarrer une conversion en
positionnant le bit GO_DONE, l'interrupteur S souvre pour assurer le blocage
de la tension. La conversion commence, elle est ralise en 12 TAD. A la fin, le
bit GO_DONE repasse 0, le drapeau ADIF passe 1 et le rsultat est charg
dans les registres ADRESL et ADRESH. Le module met 2 TAD supplmentaires
pour fermer l'interrupteur S ce qui dmarre une nouvelle phase dacquisition
pendant laquelle la tension Ve rejoint la tension analogique d'entre Va. Le
temps d'acquisition dpend de la constante de temps RC, R tant la somme de
la rsistances entre le module de conversion la source de la tension
analogique. Aprs la fin de lacquisition, on peut dmarrer une nouvelle
conversion et ainsi de suite

Va
Va

Ve

Ve

CAN
100 pF
TCON

TACQ

GO/DONE
pF
nous

VIII.2

automatique

Temps de conversion

Le temps de conversion est gal 14 TAD


TAD est le temps de conversion d'un bit, il dpend de l'horloge systme et du
prdiviseur (div) choisi : TAD = div x 1/fosc. Le choix de div doit tre ajust
pour que TAD soit 1,6 s
\Quartz
20Mhz 5Mhz 4Mhz 2Mhz
Div \
2
0,1 s 0,4 s 0,5 s 1 s
8
0,4 s 1,6 s 2 s
4 s
32
1,6 s 6,4 s 8 s 16 s
Tableau VIII.1 : Temps de conversion d'un bit TAD (les cases grises sont hors plage dutilisation)

Avec un quartz de 4 MHz, il faut choisir div=8 ce qui donne T AD = 2 s

52
soit un temps de conversion : TCONV = 28 s

VIII.3

Temps d'acquisition

Temps d'acquisition = TACQ = 2 s + Tc + CT


Tc

: temps de charge du condenseur = (Ric+Rss+Rs) C Ln(2047)


Ric = Rsistance dinterconnexions, elle est infrieure 1k
Rss = Rsistance du linterrupteur S (Sampling switch), elle dpend de la
tension dalimentation Vdd. Elle est gale 7k pour Vdd=5V
Rs : Rsistance interne de la source du signal analogique. Microchip
recommande de ne pas dpasser 10 k
C : Capacit de blocage = 120 pF

CT

: Coefficient de temprature = (Tp -25C) 0.05 s/C


Tp = Temprature Processeur, voisine de 50C et temps normal

Exemple :
Ric = 1k, Rss = 7k, Rs = 2k, Tp = 50 C :
Tc = 10k x 120pF x Ln(2047) = 9 s
CT = 25 x 0.05 s = 1,25 s
TACQ = 2 + 8,2 + 1,25 s 12 s

VIII.4

Frquence d'chantillonnage

Si on veut chantillonner un signal variable, La priode d'chantillonnage


Te doit tre suprieur ou gale Temin = TCONV + TACQ
Avec les exemple prcits, on aura T emin = 28 +12 = 40 s
La frquence dchantillonnage max est donc femax = 1/Temin = 40 kHz
Si on tient compte de la rgle de channon (fe 2 fmax), on constate que lon
peut chantillonner des signaux dont la frquence ne dpasse pas 20 KHz.

VIII.5

Valeur numrique obtenue

Quelle est la relation entre la tension analogique convertie et le nombre N


recueilli dans le registre ADRES ?
Si on note :
Q = pas de quantification = (Vref+ - Vref-)/1024
Va = tension analogique convertir
N = valeur numrique obtenue,

53
N = valeur entire de (Va Vref-) / Q
Avec Vref- = masse, on obtient
exemple :

N = int (Va / Q)

Vref+ = Vdd = 5V, Vref- = 0, Vin = 4 V


Q = 5V/1024 = 0,0048828125 V
N = 4V / 0,0048828125 = 819

VIII.6

Programmation

1) Si des entre de PORTE sont utilises, placer le bit TRISE,4 0


2) Configurer les E/S en Analogique/digital/Rfrence (ADCON1)
3) Configurer les entres analogiques en entres (TRISA, TRISE)
4) Dfinir l'horloge de conversion, Valider le module (ADCON0)
5) Choisir le canal convertir (ADCON0)
6) attendre temps dacquisition (12 s )
7) Lancer la conversion, GO_DONE = 1 (ADCON0)
8) Attendre fin de conversion, GO_DONE = 0 ou drapeau ADIF=1
9) Lire le rsultat
10)

Arrter le convertisseur ou recommencer au point 6

54

IX

L'USART

L'USART (Universal Synchronous Asynchronous Receiver Transmitter) est


l'un des deux modules de communication srie dont dispose le PIC
16F876/877. L'USART peut tre configur comme systme de communication
asynchrone full duplex ou comme systme synchrone half duplex (non tudi).
La communication se fait sur les deux broches RC6/TX et RC7/RX qui doivent tre
configurs toutes les deux en ENTREE par TRISC. (oui, jai bien dit toutes les deux)

IX.1 Mode Asynchrone


Si on place le bit SYNC du registre TXSTAT 0, l'USART fonctionne dans le mode
asynchrone standard, 10 (ou 11) bits sont transmis ou reus dans l'ordre ci-dessous :
- 1 bit de START (toujours 0)
- 8 ou 9 bits de donne (LSB d'abord)
- 1 bits de STOP (toujours 1)

La transmission se fait sur la broche RC6/TX et la rception sur la broche


RC7/RX

La configuration et le control du port se fait par les registres TXSTA et


RCSTA

La vitesse de communication est fixe par le registre SPBRG et le bit


TXSTA.BRGH

La parit n'est pas gre d'une faon matrielle, elle peut tre gre par
soft si son utilisation est ncessaire.

L'accs au port en lecture ou criture se fait par les registres tampon


RCREG et TXREG. La transmission et la rception se font par deux registres
dcalage, un pour la transmission (TSR) et un pour la rception (RSR).
L'accs au registres tampon peut se faire alors que les registre dcalage
sont en train de transmettre/recevoir une donne.

Les drapeaux PIR1.RCIF et PIR1.TXIF


sont trs utiles pour grer la
lecture/criture dans le port. RCIF est positionn quand le port a termin
une rception et TXIF est positionn quand le buffer de transmission TXREG
est "vide".

IX.2 Le port en transmission

55

Le contrle de la transmission se fait par le registre TXSTA


CSRC

TX9

TXEN

SYNC

BRGH

TRMT

TX9D

CSRC : non utilis en mode asynchrone


TX9 et TX9D : Pour utiliser le mode 9 bits il faut positionner le bit TX9. Le
9me bit doit tre crit dans TX9D avant d'crire les 8 bits de
donnes dans TXREG
TXEN : permet de valider ou interdire la transmission
SYNC : 0 mode asynchrone, 1 mode synchrone
BRGH : slectionne le mode haut dbit du gnrateur de baud rate
TRMT : Indicateur de lactivit du registre dcalage de transmission TSR
1 TSR libre, 0 TSR en activit
Droulement de la transmission

Quand on crit un octet D dans le registre TXREG, le drapeau PIR1.TXIF


passe 0, ensuite, deux situations sont possibles :

Le registre de transmission TSR nest pas occup, alors la donne D est


transfre immdiatement dans TSR qui commence sa transmission bit bar
bit et le drapeau TXIF repasse 1 pour nous dire que nous pouvons de
nouveau crire dans TXREG.

Le registre de transmission TSR est occup transmettre un octet qui lui


t donn auparavant. La donne D attend dans TXREG, et le drapeau TXIF
reste 0 jusqu ce que TSR termine de transmettre loctet prcdent. La
donne D est alors transfre dans TSR qui commence sa transmission bit
bar bit. Le drapeau TXIF repasse 1 pour nous dire que nous pouvons de
nouveau crire dans TXREG.
criture D0
dans

criture D1
dans

TXIF

chargement
TXREGTSR

Transmission
D0

chargement
TXREGTSR

Transmission
D1

Figure IX.1 : illustration de la transmission de deux octet successifs D0 et D1

A la mise sous tension, tous les drapeaux sont zro y compris TXIF. Ds
quon valide la transmission en positionnant le bit TXEN, le drapeau TXIF
passe automatiquement 1, sauf si on crit dabord un octet dans TXREG et
on valide ensuite le bit TXEN, dans ce cas, ds la validation de TXEN, le
contenu de TXREG est transfr dans TSR qui commence sa transmission et
le drapeau TXIF passe 1.

56

Comme on vient de le voir, le drapeau TXIF est gr automatiquement, on


ne peut pas le modifier directement par programme.

IX.2.1 Les tapes de transmission (sans interruption, mode 8 bits)


1) Sassurer que linterruption TXI nest pas valide
2) Configurer la broche TX/RC6 en entre
3) Configurer le registre TXSTA (mode 8 bits, valider transmission,
asynchrone, BRGH)
4) Initialiser le registre SPBRG pour dfinir la vitesse de transmission
5) Valider le port avec le bit RCSTA.SPEN
6) Vrifier si le drapeau PIR1.TXIF=1 c..d TXREG est vide
7) Placer la donne transmettre dans le registre TXREG
8) recommencer au point 6) tant quon a des donnes transmettre

IX.3 Le port en rception

La rception est valide par le bit CREN

La rception d'un octet dmarre la rception du START bit qui commence


toujours par une transition 1 0

A la rception du stop bit le contenu du registre dcalage de rception


RSR est recopi dans le registre tampon de rception RCREG. Le drapeau
RCIF (PIR1.5) est positionn, l'interruption associe est dclenche si elle
est valide. Le drapeau RCIF est remis zro automatiquement au moment
de la lecture dans RCREG.

Le registre RCREG est un registre double (FIFO 2 positions). On peut donc


avoir 2 octets en attente dans ce registre et tre en train de recevoir un
3me dans le registre dcalage RSR. A la fin de la rception du 3me octet,
si RCREG est toujours plein, alors le dernier octet reu est perdu et le bit
OERR (Overrun ERRor bit) est positionn ce qui provoque l'arrt des
transfert du registre dcalage RSR vers le buffer RCREG. Pour reprendre

57
la rception il faut rinitialiser le module de rception en mettant 0 puis
1 le bit CREN ().

Le drapeau PIR1.RCIF ne passe 0 que quand la pile RCREG est vide

Si on reoit un 0 la position du STOP bit qui doit tre toujours 1, alors le


bit FERR (Framing ERRor) est positionn. Ce bit ainsi que le 9 me bit (si
utilis) sont bufferiss, Il doivent tre lu dans le registre RCSTA avant la
lecture du registre RCREG.
Le contrle de la rception se fait par le registre RCSTA
SPEN

SPEN

RX9

SREN

CREN

ADDEN

FERR

OERR

RX9D

: Validation du port srie (1 = valid, 0 = Inhib)

RX9 : Validation du mode 9 bits (1 mode 9 bits, 0 mode 8 bits)


SREN
: validation de rception d'u seul octet (non utilis en mode
asynchrone)
CREN

: Validation du mode rception continue (1 valid, 0 inhib)

ADDEN : validation du mode dtection d'adresse en mode 9 bits, utilis en


mode multiprocesseurs ( 1 valid, 0 : Inhib)
FERR : Erreur de synchronisation, lecture seule. (Voir au dessus)
OERR

: Erreur dbordement du buffer de rception, lecture seule. (Voir au


dessus)

RX9D : En mode 9 bits, le 9me bit est reu ici

IX.3.1 Les tapes de rception (sans interruption, mode 8 bits)


1) Sassurer que linterruption RCI nest pas valide
2) Configurer la broche RX/RC7 en entre
3) Initialiser le registre SPBRG pour dfinir la vitesse de communication
4) Configurer le registre TXSTA (asynchrone, BRGH)
5) Configurer le registre RCSTA (validation port, mode 8 bits, valider rception
continue)
6) Attendre que drapeau RCIF passe ce qui annonce la fin de rception d'un
octet
7) Lire la donne reue dans le registre RCREG
8) recommencer au point 6) tant quon a des donnes recevoir

IX.4 La vitesse de communication


La vitesse de communication est dtermine par le gnrateur de rythme BRG
(Baud Rate Generator)
qui est ddi au port srie. La vitesse de
communication est dfinie l'aide du registre de control SPBRG et du bit BRGH
(TXSTA.2) qui quadruple la vitesse quand il est positionn. Il prfrable
d'utiliser le mode haute vitesse (BRGH=1) car permet d'obtenir une meilleur
prcision sur la frquence.

58

vitesse

Vitesse
Kbaud

Fosc = 20 MHz
kbaud

%err

4 BRGH Fosc
baud
1)
64 (SPBRG

Fosc = 10 MHz

SPBRG

kbaud

%err

Fosc = 4 MHz

SPBRG

kbaud

%err

Fosc = 3.6864 MHz

SPBRG kbaud %err SPBRG

300

0.300

207

0.3

191

1200

1.221

1.75

255

1.202

0.17

129

1.202

0.17

51

1.2

47

2400

2.404

0.17

129

2.404

0.17

64

2.404

0.17

25

2.4

23

9600

9.766

1.73

31

9.766

1.73

15

8.929

6.99

9.6

19200

19.531

1.72

15

19.531

1.72

20.833

8.51

19.2

Tableau IX.1 : vitesse de transmission BRGH = 0

Fosc = 20 MHz
Fosc = 10 MHz
Fosc = 4 MHz
Fosc = 3.6864 MHz
Vitesse
Kbaud kbaud %err SPBRG kbaud %err SPBRG kbaud %err SPBRG kbaud %err SPBRG
9600

9615 0.16

129

9615 0.16

64

9615

0.16

25

9600

23

19200 19231 0.16

64

19531 1.72

31

19231 0.16

12

19200

11

28800 29070 0.94

42

28409 1.36

21

27798 3.55

28800

33600 33784 0.55

36

32895 2.10

18

35714 6.29

32900 2.04

Tableau IX.2 : vitesse de transmission BRGH = 1

59

Le module MSSP (Master Synchronous Serial Port)

Le MSSP est une des deux modules de communication srie du PIC


16F876/877. Il permet d'changer des donnes en mode synchrone avec
d'autres circuits qui peuvent tre des microcontrleurs, des mmoires EEPROM
srie, des convertisseurs A/N, des modules d'affichage . . . Il peut fonctionner
selon deux modes : le mode SPI (Serial Peripheral Interface) et le mode I2C
(Inter-Integrated Circuit)

X.1

Introduction au bus I2C

Avant de parler du module MSSP en mode I2C du PIC, introduisons trs


brivement Le standard I2C
Le bus IC permet de faire communiquer entre eux des composants
lectroniques trs divers grce seulement 3 fils : Un signal de donne (SDA),
un signal d'horloge (SCL), et un signal de rfrence lectrique ( Masse ).
Comme les lignes SDA et SCK sont utilises dans les deux sens par les deux
circuits qui communiquent, on peut avoir un circuit qui place la ligne 1 (Vcc)
et l'autre qui la place 0 (masse) ce qui correspond un court circuit qui peut
dtruire les deux composants. Pour viter ce problme, les E/S SDA et SCK
fonctionnent en mode collecteur ouvert (ou drain ouvert) de sorte qu'un circuit
ne peut imposer que le niveau bas ou ouvrir la ligne, le niveau haut est obtenu
par une rsistance de tirage externe. Ainsi une ligne est 0 quand un des deux
circuits impose le 0. Elle passe 1 quand les deux circuits imposent le 1
(circuit ouvert). Le protocole I2C jongle avec cette situation pour organiser
l'change des donnes entre les deux composants.
Vcc

lecture

lecture

Ecriture

Ecriture

Un bus I2C peut tre reli plusieurs circuits, mais pendant une
communication, un des circuits est le matre, c'est lui gnre l'horloge et initie
les squences de transmission, l'autre est l'esclave, il subit l'horloge du matre
sur la ligne SCK mais il peut tout de mme recevoir et mettre des donnes
sur la ligne SDA. Chaque esclave a une adresse, au dbut d'une squence de
communication, le matre qui initie la squence envoie l'adresse du slave avec
lequel il dsire communiquer, celui-ci reconnat son adresse et rpond, les
autres slaves (s'il y en a) restent muets.

60

SDA

SCK

Matre ou Esclave

Vcc

Vcc

SDA

SCK

Matre ou Esclave

SDA

SCK

Matre ou Esclave

Certains circuits sont fabriqus pour tre des masters, d'autres des slaves
et d'autres peuvent tre soit l'un soit l'autre.
Pour prendre le contrle du bus, il faut que celui-ci soit au repos ( SDA et
SCL '1'). Lorsqu'un circuit prend le contrle du bus, il en devient le matre.
C'est lui qui gnre le signal d'horloge et c'est lui qui initie les squences
d'change.

X.1.1
start condition
Au dbut d'une squence d'change, le master gnre un start condition
(S) avant de commencer l'change de donnes. Au repos, les lignes SCL et
SDA sont l'tat haut (relches). Pour gnrer un start, le master place
d'abord la ligne SDA 0, ensuite il place SCK 0.

SDA
SCK

X.1.2
Transmission d'un bit
On place le bit transmettre sur la ligne SDA ensuite on envoie une
impulsion d'horloge sur la ligne SCK. C'est cette impulsion qui informe le slave
qu'il doit lire la donne sur SDA
bit transmettre

SDA
SCK
moment de lecture par le
rcepteur

61

X.1.3
Stop condition
A la fin d'une squence d'change, le master gnre un stop condition (P)
aprs lequel le bus est de nouveau libre. Pour cela, partir de la situation
SDA=0, SCK=0, le master commence par placer SCK 1 et place ensuite SDA
1.
SDA
P

SCK

X.1.4
Remarque sur le Start et le Stop condition
Une squence de transmission peut contenir plusieurs Starts conditions
avant de rencontrer un Stop Condition. On parle de repeated Start condition.
Un Stop condition est toujours synonyme de FIN de transmission.
X.1.5
L' acknowledge
L' acknowledge est l'accus de rception. Il est plac par le circuit qui reoit
sur la ligne SDA juste aprs la rception du 8me bit. C'est l'metteur qui le lit
de la mme faon qu'on lit un bit ordinaire. SDA=0 acknowledge positif
(ACK), SDA=1 acknowledge ngatif (NOACK),
ACK

NOACK

SDA
SCK

En conclusion, l'change d'un octet ncessite 8 + 1 = 9 impulsions


dhorloge sur la pin SCL.
Acknowledge
SDA

D7

D6

D5

D4

D3

D2

D1

D0

SCK

X.1.6
L'adresse et le bit R/W
Comme on peut brancher plusieurs composant sur un bus I2C, il est
ncessaire de dfinir une adresse unique pour chacun. Elle est code sur 7 bits
A6 A5 A4 A3 A2 A1 A0. Le master qui dmarre une squence d'change envoie
l'adresse du slave juste aprs le start condition. Comme il y a seulement 7
bits, le master envoie la 8me position le bit R/W pour indiquer au slave s'il
dsire une mission (R/W=0) ou une rception (R/W=1).

62
Acknowledge
SDA
SCK

A6

A5

A4

A3

A2

A1

A0

R/W

Le standard I2C supporte maintenant l'adressage sur 10 bits. Comme avec


7 bits on peut adresser jusqu' 128 composant, cela nous suffira largement.

X.2

Le module MSSP en mode I2C

Le module MSSP du PIC peut tre configur en master ou en slave. Il utilise


les broches RC3/SCL (Horloge) et RC4/SDA (donnes). Ces broches doivent
tre configures en ENTREE l'aide du registre TRISC et doivent tre munie de
rsistances de pull-up externes ncessaire au fonctionnement I2C.
Les frquences d'horloges supportes sont 100 kHz, 400 kHz et 1 MHz
L'accs au module en lecture et criture se fait l'aide du registre tampon
(buffer) SSPBUFF. La transmission et la rception se fait l'aide du registre
dcalage SSPSR auquel nous navons pas directement accs
SSPBUF
SCK/RC3
SDA/RC4

SSPCON
SSPCON2

SSPSR

SSPSTA
SSPADD

X.2.1
Transmission dun octet
Pour transmettre un octet, il suffit de le copier dans le registre SSPBUF, et
le module MSSP soccupe du reste. Au moment de lcriture dans SSPBUF, le
bit BF passe 1 et la transmission commence. A la fin de la transmission, le bit
SSPSTAT.BF repasse 0 et le drapeau dinterruption PIR1.SSPIF passe 1.
Le bit BF apparat donc comme un bit trs important, cest lui qui nous
permet de savoir si le registre SSPBUF est libre ou non
Si on tante d'crire dans SSPBUF alors que BF=1, le bit SSPCON.WCOL
passe 1 pour indiquer une collision et l'criture n'a pas lieu.
X.2.2
Rception dun octet
A la fin de la rception d'un octet, celui-ci est transfr dans SSPBUF,
lindicateur SSPSTAT.BF et le drapeau dinterruption PIR1.SSPIF passent 1.
BF repasse automatiquement 0 au moment de la lecture de SSPBUF alors
que SSPIF soit tre remis 0 par soft.

63
Si le PIC termine la rception d'un octet avant que l'octet prcdent qui se
trouve dans SSPBUF n'ait t lu, on a un Overflow qui sera signal par le
drapeau SSPOV. Le transfert n'a pas lieu, loctet arriv est perdu.

X.2.3
Les registres de configuration
Le control du module se fait l'aide des registres :
SSPCON
: registre de control
SSPCON2
: registre de control
SSPSTAT
: registre d'tat
SSPADD
: registre d'adresse
SSPSTAT
SMP
CKE
D/A
P
S
R_W

UA

BF

SMP

CKE

D/A

R_W

UA

BF

: Control de slew rate : 1 pour 100 kHz et 1 MHz, 0 pour 400 kHz
: Control des niveau de tension l'entre, 0 : I2C, 1 : SMBUS
: Indicateur d'tat, 0 : dernier octet mis/reu = adresse, 1 : dernier
octet mis/reu = donne
: Indicateur de Stop Condition. Ce bit passe 1 quand on reoit un
Stop Condition. Il est automatiquement remis 0 quand un autre
vnement et reu.
: Indicateur de Start Condition. Ce bit passe 1 quand on reoit un
Start Condition. Il est automatiquement remis 0 quand un autre
vnement et reu
: Indicateur de lecture criture
Mode master : 0 : pas de transmission en cours, 1 : transmission en
cours
Mode slave : image du bit R/W qui constitue le bit 0 du premier octet
suivant le start condition. 0 : criture, 1 : lecture
: Indicateur utilis en mode esclave avec adressage 10 bits pour nous
informer qu'il faut placer la 2me partie de l'adresse dans le registre
adresse. Ce dernier ayant seulement 8 bits, l'adresse est traite en 2
parties. Ce bit est remis automatiquement zro aprs l'criture dans
SSPADD.
: Indicateur sur l'tat du registre SSPBUF.

SSPCON

WCOL SSPOV SSPEN CKP

SSPM3 SSPM2 SSPM1 SSPM0

WCOL : Collision d'criture. En mode I2C master, ce bit passe 1 si on tente


d'crire dans SSPBUF mauvais moment de la squence de
transmission (BF=1). En mode I2C slave, il est positionn si on tente
d'crire dans SSBUF avant la fin de la transmission de l'octet
prcdant. Ce bit doit tre remis zro par programme.
SSPOV : Overflow, cet indicateur d'erreur est positionn quand une nouvelle
donne est reue alors que le registre SSBUF n'est pas encore lu. Dans
ce cas la nouvelle donne est perdue. Ce bit doit tre remis zro par
programme.
SSPEN : Validation du module MSSP (1 = valid)
SKP
: Utilis en mode I2C slave pour gnrer des pauses en inhibant
l'horloge.

64
0 : horloge force zro, 1 : horloge valide
SSPM3:SSPM0 : mode de fonctionnement du module
0110 : I2C Slave, adresse 7 bits
0111 : I2C Slave, adresse 10 bits
1000 : I2C master, frquence = FOSC / (4 * (SSPADD+1))
1011 : I2C Slave forc l'tat de repos
1110 : I2C master, adresse 7 bits, interruption sur START et STOP
1110 : I2C master, adresse 10 bits, interruption sur START et STOP

Le registre SSPCON2 :
SSPCON2

GCEN

ACKSTAT ACKDT ACKEN RCEN

PEN

RSEN

SEN

Le bit 7 concerne le mode slave, les autres bits concernent le mode master :
GCEN : General call enable bit : Si ce bit est valid, le PIC rpond son
adresse et l'adresse gnrale 0000h
ACKSTAT : Acknowledge Status bit : En mission, ce bit est limage de
laccus de rception envoy par le slave. 0=accus positif, 1=accus
ngatif. En rception, il permet au master de savoir si le slave a envoy
ou non un accus de rception. 0 : ACK reu, 1 : ACK non reu
ACKDT : Acknowledge Data bit : Valeur du bit envoy au slave en fin de
rception. Ce bit est envoy au moment ou on positionne le bit ACKEN.
ACKEN : Acknowledge Sequence Enable bit : quand il est plac un, ce bit
dmarre une squence accus de rception qui consiste placer les
broches SDA et SCL dans le mode adquat et transmettre le bit
ACKDT
RCEN : Receive Enable bit , 0 : rception inhibe, 1 : dmarre la rception
d'un octet
PEN : STOP Condition Enable bit , dmarre une squence stoP_condition sur
les broches SDA et SCL. Ce bit est remis 0 automatiquement
RSEN : Repeated START Condition Enable bit : dmarre une squence
Repeated Start condition
SEN : START Condition Enable bit : dmarre une squence Start condition

65
Le registre SSPADD :
En mode I2C master, ce registre permet de dterminer la frquence de
communication
F

Fosc
4 (SSPADD

1)

Hz

Les frquences possibles sont : 100 kHz, 400 kHz et 1 MHz


SSPADD

Fosc
4 F

1 Hz

En mode I2C slave, ce registre doit contenir l'adresse du slave. Le bit 0 est
rserv, il doit tre toujours plac zro, l'adresse doit tre crite partir du
bit 1. En cas d'adresse 7 bits, cela ne pose pas de problme. En cas d'adresse
10 bits, l'adresse est crite en 2 temps, On commence par crire 1 1 1 1 0 A9
A8 0 dans SSPADD, en attend l'indicateur UA, ensuite on crit A7 A6 A5 A4 A3
A2 A1 A0

X.2.4
MSCP en mode I2C Master
Une squence de communication est toujours initie par le master qui
commence par envoyer un Start_bit (SSPCON2.SEN), suivi de l'adresse du
slave. Ladresse sera code seulement sur 7 bits, Le LSB quon appelle bit R/W
permet de prciser le sens de lchange qui va suivre, R/W=0 pour
transmission, R/W=1 pour rception. On envoie ou on reoit les donnes et on
termine la communication par un stoP_bit (SSPCON2.PEN)
Si lon dsire changer le sens de lchange avant lenvoi du stoP, cela est
possible, il faut envoyer un RepeatStart condition suivi de ladresse
accompagne dun R/W diffrent
X.2.4.1

Transmission master slave :


ACK envoy par le slave
S Slave adress 0 A

Data byte

Data byte

A P

R/W

On positionne le bit SSPCON2.SEN sur le master, celui-ci envoie le Start bit


sur la ligne SDA et r..z automatiquement le bit SEN. Le slave voit le
Start_bit et se prpare recevoir l'adresse,

On copie ladresse avec R/W=0 dans SSPBUF, les bits SSPSTAT.BF et


SSPSTAT.R_W passent 1, la transmission dmarre et aprs le 8 me coup
d'horloge, SSPSTAT.BF repasse zro, aprs le 9me R_W repasse 0, le
drapeau dinterruption passe 1 et l'horloge est force 0 (pause). Le
drapeau SSPIF doit tre raz par soft pour quil puisse servir dans la suite.

66

Le slave dtecte la fin de lchange et envoie un Acquittement sur la ligne


SDA : 0 (ACK) sil a lu loctet correctement, 1 (NoACK) sil na pas pu lire
loctet correctement

l'ACK renvoy par le slave est recopi (par le master) dans le bit
SSPCON2.ACKSTAT. Le programmeur doit vrifier ltat de ce bit pour
dcider de la suite des vnements, Si = 0 (ACK), le programme peut
envoyer une donne vers le slave, sinon (NOACK) il faut envoyer un
stoP_bit et recommencer,

Si SSPCON2.ACKSTAT=0, on envoie un octet de donne en l'crivant dans


SSPBUF, Les bit BF et R_W passent 1 au dbut de l'mission et repassent
0 la fin. Le drapeau SSPIF passe 1. Le slave renvoie l'ACK/NOACK
selon sa situation.

Cet ACK/NOACK est accessible dans ACKSTAT, Si =ACK et on a encore des


donnes transmettre, on dmarre une nouvelle mission en crivant dans
SSPBUF. Si =NOACK ou on n'a plus de donnes transmettre, on envoie
un stoP_bit en positionnant le bit SSPCON2.PEN qui est remis zro
automatiquement aprs la transmission d'un Stop bit sur la ligne SDA

Quand le slave voie le stoP_bit, il rinitialise son lectronique pour se


prparer la rception d'un nouveau Start_bit.

67

X.2.4.2

Rception master slave :


ACK du master

ACK du slave
S Slave adress 1 A

Data byte
reu

transmis

Data byte

A P

reu

R/W

On positionne le bit SSPCON2.SEN sur le master, celui-ci envoie le Start_bit


sur la ligne SDA et r..z automatiquement le bit SEN. Le slave voit le
Start_bit et se prpare recevoir l'adresse,

On copie ladresse avec R/W=1 dans SSPBUF, les bits SSPSTAT.BF et


SSPSTAT.R_W passent 1, la transmission dmarre et aprs le 8 me coup
d'horloge, BF repasse zro, aprs le 9 me R_W repasse zro et l'horloge
est force 0 (pause)

A la fin du 8me coup d'horloge, le slave renvoie un ACK/NOACK selon sa


situation et force l'horloge zro (pause) pour empcher le master de lire
avant que la donne ne soit prpare sur le bus

Le
programme
du
master
doit
tester
l'acknowledge
dans
SSPCON2.ACKSTAT, si = 0, il se prpare la rception en positionnant le
bit SSPCON2.RCEN,

Le slave prpare la donne sur le bus et libre lhorloge, le Master le


dtecte, dmarre l'horloge et la rception dmarre

A la fin de la rception, le bit SSPCON2.RCEN passe 0, loctet reu est


transfr dans SSPBUF, lindicateur BF passe 1 ainsi que le drapeau
dinterruption PIR1.SSPIF. L'horloge est force 0 (pause) pour donner le
temps au programme utilisateur d'envoyer l' Acknowledge,

Le programme utilisateur du master envoie l' Acknowledge en plaant


ACK/NOACK (0/1) dans la bit SSPCON2.ACKDT et en validant le bit
SSPCON2.ACKEN. Le bit ACKDT est plac sur la ligne SDA, et ACKEN est
r.a.z. automatiquement. L'horloge est libre juste le temps d'un coup
d'horloge (le 9me) pour que le slave puisse prendre l' Acknowledge en
compte. Elle est remise en pause aprs. Le drapeau dinterruption SSPIF est
aussi positionn aprs lenvoi du ACK

Si on a envoy ACK, a veut dire quon veut recevoir dautres donnes,


alors on initie la rception dun nouvel octet en validant SSPCON2.RCEN.

68

Si on a envoy NOACK, (on ne veut plus de donne), on doit envoyer un


StoP_Cond pour terminer le cycle ou un Repeat Start_Cond pour dmarrer
un cycle sans perdre le control du bus.

Quelques remarques :

Une squence dchange dmarre toujours par Start_condition suivi de


ladresse du slave accompagne du bit R/W qui fixe le sens de lchange

Lindicateur BF repasse 0 au moment de la lecture de SSPBUF

Le drapeau dinterruption SSPIF doit chaque fois tre remis 0 par soft.
(ceci bien sur, si on a dcid de sen servir)

Quand on envoie un octet on reoit toujours un ACK/NOACK de la part du


slave (quon le teste ou non, a cest une autre affaire)

Quand on reoit un octet, on doit envoyer un ACK/NOACK vers le slave

La direction de lchange est dcide au moment de lenvoi de ladresse


laide du bit R/W. Si on dsire changer le sens de lchange sans envoyer un
stoP_condition pour viter une perte ventuelle du control du bus, on
envoie un Repeat_Start_Condition suivi de ladresse accompagne du
nouveau R/W

69

X.2.5
MSCP en mode I2C Slave
Voici quelques points en vrac :

Si le MSSP reoit un Start_bit ou un RStart_bit, lindicateur


passe 1. Il reviendra 0 automatiquement

SSPSTAT.S

Si le MSSP reoit un stoP_bit, lindicateur


reviendra 0 automatiquement

Si le MSSP reoit un ACK : il semble quil ne se passe rien

Si le MSSP reoit un NoACK : il rinitialise son lectronique et se met en


attente dun nouveau Start_bit

Si le MSSP reoit un octet adresse (= sa propre adresse)

SSPSTAT.P passe 1. Il

o lindicateur SSPSTAT.D_A passe 0


o Le LSB (R/W) est copi dans lindicateur R_W
o Si SSPSTAT.BF=0 et SSPCON.SSPOV=0, loctet est copi dans
SSPBUF, le drapeau PIR1.SSPIF passe 1, lindicateur SSPSTAT.BF
passe 1 seulement dans le cas R/W=0
o Si BF=1 et/ou SSPOV=1, SSPBUF nest pas modifi, loctet adresse
est perdu, Les indicateurs BF, SSPOV et SSPIF passe 1, Aucun ACK
nest transmis (NoACK).

Si le MSSP reoit un octet de donne


o lindicateur SSPSTAT.D_A passe 1
o le tableau ci-dessous illustre les diffrentes possibilits. BF passe un
en cas de chargement de SSPBUF

Les ACK, comme on vient de le voir sont envoys automatiquement

Le drapeau BF repasse 0 la lecture du registre SSPBUF

Le bit SSPOV doit tre remis 0 par instruction

Le bit SKP permet de contrler lhorloge


o SKP=0, force lhorloge ltat dominant 0 donc lhorloge est bloque
o SKP=1, force lhorloge ltat rcessif 1, donc lhorloge est libre

70

X.2.5.1

Rception de donnes (venant du master)


ACK envoy par le slave
S Slave adress 0 A

Data byte

Data byte

A P

R/W

Le PIC dtecte le Start_bit sur la ligne SDA, positionne le bit SSPSTAT.S et


se prpare recevoir l'adresse,

Le PIC dtecte la fin de rception de ladresse, il vrifie si elle correspond


son adresse.

Si cest ladresse dun autre slave, il ne ragit pas, il se met attendre le


stoP_condition,

Si ladresse reue correspond notre PIC. Il recopie le bit R/W (0 dans ce


cas) dans le bit R_W du registre SSPSTAT , puis vrifie les bits BF et SSPOV
pour savoir si le contenu prcdent du registre SSPBUF t lu ou non
o Supposons que tout est OK, BF=0 et SSPOV=0

Il recopie SSPSR (l'adresse) dans SSPBUF BF passe 1

Le drapeau PIR1.SSPIF passe 1 ce qui peut dclencher une


interruption

Le bit SSPSTAT.D_A
arrive

Il place un ACK (0) sur la ligne SDA. Cest le PIC qui le fait,
notre programme ne sen occupe pas

passe 0 cest une adresse qui est

Notre programme dtecte que BF ou SSPIF est pass 1, il doit :


o Vider SSPBUF pour que BF passe 0 et qu'on soit prt pour la suite
o On vrifie le bit R_W, on trouve 0, on sait quon va recevoir un octet

Le PIC attend la rception du 8me bit, vrifie BF et SSPOV (on suppose que
tout est OK), il transfert loctet arriv dans SSPBUF et place les bits D_A, BF
et SSPIF 1.

Notre programme dtecte BF ou SSPIF, il vide SSPBUF, BF repasse 0

Maintenant on peut soit recevoir, une autre donne, soit un stoP_condition,


soit un Repeat_Start_Condition. Il faut donc avoir lil, sur les indicateurs,
BF, SSPIF, P et S pour dcider de la suite des oprations

71

X.2.5.2

Transmission de donnes (vers le master)


ACK du master
ACK du slave
S Slave adress 1 A
reu

Data byte
transmis

R/W

Data byte

A P

transmis

Le PIC dtecte le Start_bit sur la ligne SDA, positionne le bit SSPSTAT.S et


se prpare recevoir l'adresse,

Le PIC dtecte la fin de rception de ladresse, il vrifie si elle correspond


son adresse.

Si cest ladresse dun autre slave, il ne ragit pas, il se met attendre le


stoP_condition,

Si ladresse reue correspond notre PIC. Il recopie le bit R/W (1 dans ce


cas) dans le bit R_W du registre SSPSTAT , puis vrifie les bits BF et SSPOV
pour savoir si le contenu prcdent du registre SSPBUF t lu ou non
o Supposons que tout est OK, BF=0 et SSPOV=0

Il recopie SSPSR (l'adresse) dans SSPBUF BF ne passe pas 1

Le drapeau PIR1.SSPIF passe 1 ce qui peut dclencher une


interruption

Le bit SSPSTAT.D_A passe 0 cest une adresse qui est arrive

Il place un ACK (0) sur la ligne SDA. Cest le PIC qui le fait, notre
programme ne sen occupe pas

Notre programme dtecte que SSPIF est pass 1 :


o On vrifie le bit R_W, on trouve 1, on sait quon va envoyer un octet
o On na pas besoin de lire SSPBUF car BF est gal 0
o On place le bit CKP 0 ce qui force lhorloge 0 (pause) pour nous
donner le temps de prparer la donne.
o On copie un octet de donne dans SSPBUF. lindicateur SSPSTAT.BF
passe 1
o On replace le bit CKP 1, ce qui replace lhorloge 1
o Le master dtecte, la libration de lhorloge, envoie une rafale de
coup dhorloge, loctet est transmis. Lindicateur SSPSTAT.BF repasse
0 et le drapeau dinterruption PIR1.SSPIF passe 1
o Maintenant la master peut renvoyer soit un ACK, soit NoACK, suivi
dun stoP ou dun RStart. Malheureusement on na aucun moyen
(normal) au niveau de notre slave pour dtecter l ACK/NoACK,
Bigonoff parle dans son cous dune astuce pour le faire dans lexemple
quil a trait (cours : part2, rv 14, paragraphe 23.10). Il remarque
que dans le cas ou le master renvoie un NoACK, lindicateur R_W
passe 0. Si cela arrive on na plus qu attendre un Start_bit

72
PIC master

PIC Slave

On positionne SEN 1
Le PIC gnre un START
SEN repasse 0 automatiquement
On place l'adresse dans le registre SSBUF
bit R/W=0 : transmission MASTER SLAVE

Le SLAVE voit le START et se prpare


recevoir l'adresse

Le PIC dmarre la transmission


BF 1 et R_W 1

Aprs 8 coups d'horloge BF 0

Aprs 8 coups d'horloge


Le bit R/W est copi dans le bit
R_W du registre PSTAT
SSPBUF plein

BF

SSPOV 1
Ligne SDA 1
c'est un NOACK

Aprs le 9me coup d'horloge, R_W 0


Le ACK/NOACK issu du SLAVE
est copi dans le bit ACKSTAT (SSPCON2)
La ligne horloge est maintenue 0
si NOACK
on place PEN 1
le PIC gnre un STOP
PEN 0 automatique

on place PEN 1
le PIC gnre un STOP
PEN 0 automatique

=0
SSPSR SSPBUF
BF 1
Ligne SDA 0
c'est un ACK

On doit vider SPBUF (BF0) pour pouvoir


recevoir d'autres donnes

si ACK
On place un octet de
donne dans SSBUF

La transmission se fait de la mme faon que


pour l'adresse. on attend que R_W 0,
on vrifie l'ACK et on place un autre octet
dans SSBUF et on recommence jusqu' ce
qu'on a plus de donnes transmettre
c'est fini

SSPBUF vide

Si on veut dmarrer
une
squence
de
rception, on envoie
un REPEAT START

Initialisation du SLAVE
prt recevoir un
START

A la fin de chaque rception BF passe 1


On vide SSPBUF, BF repasse 0

Initialisation du SLAVE
prt recevoir un
START

On place RSEN 1, le PIC gnre un START


On place l'adresse dans le registre SSBUF
bit R/W=1 : rception MASTER SLAVE

On dmarre une squence de rception


On place SEN 1, le PIC gnre un START
On place l'adresse dans le registre SSBUF
bit R/W=1 : rception MASTER SLAVE

Le SLAVE voit le START et se prpare


recevoir l'adresse

73

X.3

Le module MSSP en mode SPI

Ce mode (Serial Peripheral Interface) permet de transmettre et recevoir


simultanment des mots de 8bits. Il utilise les broches :
RC4/SDI : Serial Data Input (doit tre configure en entre)
RC5/SDO : Serial Data Output (doit tre configure en sortie)
RC3/SCK : Serial Clock (doit tre configure en sortie)
RA4/SS
: Slave Select : Utilise optionnellement en mode slave soit comme
entre de synchronisation soit comme Chip Select en mode esclave
multiples. Elle doit tre configure en E/S numrique laide du
registre ADCON1 et comme entre laide du registre TRISA
Le contrle du port se fait par les bits 0 5 du registre SSPCON et les bits 6 et
7 du registre SSPSTAT.
Deux modes de fonctionnement sont possibles :
Mode master : C'est le PIC qui gnre et gre l'horloge de synchronisation
SCK. C'est donc lui qui dcide du moment de dmarrage d'une transmission
rception.
Mode slave : L'horloge est gnre par le circuit (master) avec lequel on
communique. Notre Pic dmarre une mission/rception au moment ou il
commence recevoir l'horloge venant du matre.
L'mission et la rception se font simultanment par le mme registre
dcalage SSPSR. Un cycle d'mission/rception commence au moment o on
crit un octet dans le registre SSPBUF, cet octet est copi par le PIC dans le
registre dcalage SSPSR auquel il applique ensuite une rafale de 8 coups
d'horloges. L'octet est alors transmis bit par bit sur la sortie SDO et il est
remplac par les bits qui arrivent sur l'entre SDI. A la fin, le contenu de
SSPSR (c.a.d loctet reu) est copi dans SSPBUF. Cette action est annonce
par la mise 1 du bit BF et du drapeau dinterruption SSPIF. Le bit BF est un
bit en lecture seule, la seule faon de le remettre zro est de lire le contenu
du registre SSPBUF. Le drapeau SSPIF doit tre remis zro laide de
linstruction BCF par exemple.
SSPBUF

SDO
SDI

SSPSR

74

X.3.1

Le mode SPI master


SDO

PIC
(master)

Circuit
quelconque
(slave)

SDI
SCK

Slave 1

SDO

PIC
(master)

RX

SDI

Tx

SCK

horloge

Ri

slection

Rj
Slave 2
RX
Tx
horloge
slection

Le PIC fonctionne en
master, il gnre et gre
l'horloge
de
synchronisation. C'est lui
qui dcide du moment o
dmarrer
une
mission/rception.
Le PIC peut communiquer
avec plusieurs slaves, dans
ce cas il faut dsigner le
slave avec lequel on dsire
communiquer, il faut que
les slaves disposent d'une
entre de slection CS
qu'on peut contrler avec
une sortie quelconque d'un
port d'E/S. Dans le cas ou
les slaves sont des PIC,
l'entre de slection est
RA4/SS

Le cycle mission/rception d'un octet dmarre au moment o on crit


dans le registre SSPBUF. A la fin du cycle, les bits SSPSTAT.BF et PIR1.SSPIF
sont positionns pour nous informer quun octet a t transmis et que l'octet
reu attend d'tre lu dans le registre SSPBUF. Ces deux bits doivent tre remis
zro par nos soins, il faut juste remarquer que BF est un bit en lecture seule,
pour le remettre zro il faut lire le registre SSPBUF
Le registre SSPCON en mode master :
SSPEN

CKP

SSPM3

SSPM2

SSPM1

SSPM0

SSPEN : Validation du module MSSP (1 = valid)


CKP : Clock Polarity : dfinit l'tat de repos de l'horloge (idle state)
0 : Bas au repos, 1 : Haut au repos
SSPM3:SSPM0 : Ces bits dfinissent le mode de fonctionnement du module
0000 : SPI Master : dbit = Fosc/4
0001 : SPI Master : dbit = Fosc/16
0010 : SPI Master : dbit = Fosc/64
0011 : SPI Master : dbit = Ftmr2/2

75
Le registre SSPSTAT en mode master :
SMP

CKE

BF

Seuls les bits utiliss par le mode SPI master sont reprsents ici.
SMP : Sample bit : front d'horloge SCK sur lequel on lit le bit prsent sur
l'entre SDI
0 : milieu de priode d'horloge
1 : fin de la priode d'horloge
CKE : Clock Edge Select : ce bit dtermine sur quel front de l'horloge SCK, les
bits transmettre seront plac sur la sortie SDO. Ceci va dpendre du bit CKP.
Si on dsigne le niveau actif de l'horloge comme le niveau oppos du niveau de
repos dfini par CKP :
0 : Les bits sont transmis au moment o l'horloge passe au niveau actif
1 : Les bits sont transmis au moment o l'horloge passe au niveau de repos
BF : Indicateur qui indique quand il passe 1 que le registre SSPBUF contient
l'octet qui vient d'tre reu. Ce bit est remis automatiquement zro au
moment de la lecture du registre SSPBUF.
Le dessin ci-dessous montre diffrentes situations possibles dpendant des
bits CKP et CKE. L'observation de ce chronogramme montre que :
L'mission/rception d'un octet dure 8 priode d'horloge,
L'apparition du premier front de l'horloge dpend des bits CKP et CKE,
Les bits transmettre sont placs sur la sortie SDO au dbut de chaque
priode d'horloge,
Le slave place ses bits sur SDI soit au dbut soit au milieu de la priode
d'horloge. Le matre doit donc adapter ses instants de lecture en
consquence laide du bit SMP
CKP=0
CKE=0
CKP=0
CKE=1
CKP=1
CKE=0
CKP=1
CKE=1

Le slave doit lire ici


SDO
SDI
cas 1

B7
B7

B6

B5

B6

B5

B4
B4

Le master doit lire ici


SDI
cas 2

Le master doit lire ici

B3
B3

B2
B2

B1
B1

B0
B0

76

X.3.1.1
Rcapitulation mode master
En rsum, les tapes suivre pour utiliser MSSP en mode SPI master sont :
Configurer la direction des lignes RC4/SDI, RC5/SDO et RC3/SCK
Dfinir la polarit de l'horloge par le bit SSPCON.CKP
Dfinir la frquence de l'horloge l'aide des bits SSPCON.SSPMx
Dfinir le moment de lecture des bits entrant l'aide du bit SSPSTAT.SMP
Dfinir le front sur lequel les bits seront transmis l'aide du bit SSPSTAT.CKE
Valider le port par le bit SSPCON.SSPEN
Une fois cette initialisation ralise, l'mission/rception se fait comme suit :
Copier un octet dans SSPBUF pour dmarrer lmission/rception
attendre la fin en surveillant SSPSTAT.BF ou PIR1.SSPIF
La lecture de SSPBUF est la seule faon de r..z le bit SSPSTAT.BF
Si on lutilise, le drapeau PIR1.SSPIF doit tre remis 0

X.3.2
Le mode SPI slave
En mode slave, le module MSSP fonctionne d'une faon similaire au mode
master part qu'ici, ce n'est pas notre PIC qui gnre l'horloge et dcide des
moments de communication. Il se contente de raliser une mission/rception
chaque fois qu'il reoit une rafale d'horloge sur la broche SCK qui est devenue
une entre.
Le registre SSPSTAT en mode slave :
SMP

CKE

BF

SMP :
doit tre mis 0 : la lecture sur SDI doit toujours se faire au milieu
du cycle horloge.
CKE : Clock Edge Select : ce bit fonctionne comme en mode master
0 : Les bits sont transmis au moment o l'horloge passe au niveau actif
1 : Les bits sont transmis au moment o l'horloge passe au niveau de repos
- Le choix dfinit par ce bit doit tre le mme que celui utilis sur le master.
- Si CKP=1, le mode Slection de slave soit tre obligatoirement utilis
BF : Indicateur qui indique quand il passe 1 que le registre SSPBUF contient
l'octet qui vient d'tre reu. Ce bit est remis automatiquement zro au
moment de la lecture du registre SSPBUF.

77
Le registre SSPCON en mode slave :
WCOL

SSPOV

SSPEN

CKP

SSPM3

SSPM2

SSPM1

SSPM0

WCOL : Write Collision Detect bit : Cet indicateur d'erreur est positionn
quand on crit une valeur dans SSBUF alors que la valeur prcdente n'est pas
encore transmise. Il doit tre remis zro par programme
SSPOV
: Receive Overflow Indicator bit : Cet indicateur d'erreur est
positionn quand une nouvelle donne est reue alors que le registre SSBUF
n'est pas encore lu. Dans ce cas la nouvelle donne est perdue. Ce bit doit tre
remis zro par programme
SSPEN : Validation du module SSP (1 = valid)
SKP : Clock Polarity : dfinit l'tat de repos de l'horloge (idle state)
0 : Bas au repos, 1 : Haut au repos (doit concider avec le choix du
master)
SSPM3:SSPM0 : Ces bits dfinissent le mode de fonctionnement du module
0100 : SPI Slave : l'entre SS (slave select) est valide
0100 : SPI Slave : l'entre SS est inhibe (fonctionne en E/S normale)
Dans le cas ou l'entre SS est utilise, elle doit tre configure en entre
par TRISA.5 et elle doit tre configure comme entre numrique l'aide du
registre ADCON1 car elle est multiplexe avec une entre analogique du
module CAN.

X.3.2.1
Les chronogrammes de fonctionnement :
Un cycle d'mission/rception dmarre au moment du dmarrage de
l'horloge externe.
Si on ne dsire raliser que des rceptions, on n'a pas besoin d'crire
chaque fois dans SSPBUF du moment que ce n'est pas nous qui dmarrons le
cycle Tx/Rx
Si on ne dsire raliser que des transmissions, il va de soi que nous devons
crire les donnes transmettre dans SSPBUF, mais il va falloir aussi lire ce
registre la fin de chaque cycle Tx/Rx pour baisser l'indicateur BF, sinon une
erreur d' Overflow sera dclenche (SSPOV)
Deux chronogrammes sont possibles selon la valeur CKE. Commenons par
le cas CKE=0, Les bits sont transmis au moment du passage de l'horloge son
niveau actif. Il n'est pas ncessaire d'utiliser l'entre SS dans ce cas, au cas o
elle est valide, il faut qu'elle soit place zro pour que la communication
puisse avoir lieu.

78

CKP=
0
CKP=
1
B7

SDI

B6

B5

B4

B3

B2

B1

B0

B3

B2

B1

B0

moment de lecture (SMP=0)


B7

SDO

B6

B5

B4

Examinons maintenant le cas SKE = 1, les bits sont transmis au moment o


l'horloge passe son niveau de repos. On remarque que ici, le slave ne peut
pas dtecter le dbut du cycle TX/RX car il n'y a pas de front au dbut de la
premire priode d'horloge. C'est l que le PIC utilise l'entre SS pour
dterminer le dbut du cycle. L'utilisation de cette entre est donc obligatoire
dans ce cas.
master
positionne
SS ici

master crit dans


SSPBUF ici

SS
CKP=0
CKP=
1
SDI

B7

B6

B5

B4

B3

B2

B1

B0

SDO

B7

B6

B5

B4

B3

B2

B1

B0

moment de lecture
master et slave

79

XI

Annexe : Gestion du Programme Counter,

Le PC est un registre de 13 bits, il peut donc adresser 8 k de mmoire


programme.
PCH

PCL

PCL (8 bits) est la partie basse de PC, il est accessible en lecture criture
PCH (5 bits) est la partie haute de PC, il n'est pas accessible directement. On
peut toutefois le modifier indirectement l'aide du registre PCLATH qui est une
registre SFR o seuls 5 bits sont utilis.

XI.1 GOTO calcul : modification de la valeur de PCL


Quand on crit quelque chose dans PCL, alors le contenu de PCLATH est
automatiquement copi dans PCH. Donc, avant d'crire dans PCL s'assurer que
la valeur contenue dans PCLATH est correcte.
PCH

PCL

PCLATH
Ecriture dans PCL

XI.2 Instruction de branchement


Un branchement consiste modifier la valeur de PC. Mais dans les
instructions de branchement, seulement 11 bits sont utiliss pour coder
l'adresse de destination, ce qui donne au maximum un intervalle de 2 k alors
que nous avons une mmoire programme de 8k. Pour remdier ce problme,
les deux bits manquants pour complter les 13 bits de PC sont pris dans
PCLATH :
PC

PCLATH
11 bits venant de l'instruction
La mmoire programme apparat donc comme organise en 4 page de 2 k
chacune. Lors d'un saut, l'adresse instruction prcise la destination l'intrieur
d'une page et les deux bits 3 et 4 de PCLATH dsignent la page
Attention, en assembleur on ne prcise pas les adresses mais on utilise des
tiquettes qui correspondent des adresses compltes (13 bits). Cela ne

80
change rient car seuls 11 bits de l'tiquette seront envoys dans le PC et c'est
nous de grer les deux bits de PCLATH pour complter l'adresse de
destination.
PCLATH

00
01
10
11

Page 0
Page 1
Page 2
Page 3

0
2k
4k
6k
8k

mmoire
programme

Fig. XI.1 : gestion de la mmoire programme lors d'une instruction de saut

XII Rfrences
1)
2)
3)
4)
5)

http://www.multimania.com/pmorphe/bienvenuechez_atm.htm
La programmation des PICs, Premire partie PIC16F84, Rev 5, Bigonff
La programmation des PICs, Secode partie-PIC16F876/877, Rev 7, Bigonff
PIC 16F87X Data Sheet (DS30292C) , Microchip
PICmicro Mid-Range MCU Family Reference Manual (DS33023A),
Microchip
6) La page web de Jacques Weiss sur les PIC
7) La page web d'Offset sur les PIC