1

MICROCONTROLEURS

Famille Mid-Range
de Microchip

LE PIC 16F876/877

A. Oumnad



2
SOMMAIRE

I Introduction ............................................................................................................. 5
I.1 Les PICs de Microchip ........................................................................................... 6
II Les éléments de base du PIC 16F876/877 ............................................................. 7
II.1 L'Horloge ............................................................................................................. 7
II.2 L'ALU et l’accumulateur W ..................................................................................... 8
II.3 Organisation de la mémoire RAM ........................................................................... 8
II.3.1 Accès à la RAM par adressage DIRECT ................................................................ 8
II.3.2 Accès à la RAM par l’adressage INDIRECT ......................................................... 10
II.4 Quelques registres de configuration et leurs bits .................................................... 11
II.5 Les instructions du 16F876/877............................................................................ 12
II.5.1 Les instructions « orientées Registre» ............................................................... 12
II.5.2 Les instructions « orientées bits » ..................................................................... 12
II.5.3 Les instructions opérant sur une constante ........................................................ 12
II.5.4 Les instructions de saut et appel de procédures ................................................. 12
II.5.5 Le jeu d'instructions ........................................................................................ 13
II.5.6 Les paramètres des instructions agissant sur registre ......................................... 14
II.5.7 Les paramètres des instructions agissant sur bit ................................................ 14
II.5.8 Les instructions MOVWF et MOVF ..................................................................... 14
II.5.9 Les instructions btfss et btfsc ........................................................................... 15
II.5.10 Les instructions incfsz et decfsz ........................................................................ 15
II.5.11 L’instruction goto ............................................................................................ 15
II.5.12 L’instruction call .............................................................................................. 16
II.5.13 Les indicateur d’état (drapeaux) ....................................................................... 17
II.5.13.1 Les indicateurs, la soustraction et la comparaison ....................................... 17
II.6 Les directives de l'assembleur MPASM .................................................................. 18
III Les outils de développement .................................................................................22
III.1 Procédure de travail ............................................................................................ 22
III.2 L’environnement de développement MPLAB .......................................................... 23
III.3 Structure générale d’un programme ..................................................................... 25
III.4 Quelques exemples ............................................................................................. 26
III.4.1 Comparaison................................................................................................... 26
III.4.2 Boucles de temporisation ................................................................................. 27
III.4.2.1 Temporisation avec une boucle ................................................................. 27
III.4.2.2 Temporisation avec 2 boucles imbriquées .................................................. 28
III.4.2.3 Temporisation avec 3 boucles imbriquées .................................................. 28
IV Les ports d’E/S .......................................................................................................29
IV.1 Le port d' E/S PORTA .......................................................................................... 29
IV.1.1 La broche RA4 ................................................................................................ 29
IV.1.2 Les autres broches de PORTA........................................................................... 29
IV.2 Le port d' E/S PORTB .......................................................................................... 30
IV.3 Le port d' E/S PORTC .......................................................................................... 30
IV.4 Le port d' E/S PORTD .......................................................................................... 30
IV.5 Le port d' E/S PORTE .......................................................................................... 31
V Les mémoires permanentes ...................................................................................32
V.1 La mémoire EEPROM de données ......................................................................... 32
V.1.1 Procédure de lecture dans l'EEPROM ................................................................. 33
V.1.2 Procédure d'écriture dans l'EEPROM.................................................................. 33
V.2 La mémoire Programme ou mémoire flash ............................................................ 33
V.2.1 Procédure de lecture dans la mémoire programme ............................................. 34
V.2.2 Procédure d'écriture dan la mémoire programme ............................................... 34
3
VI Les interruptions ....................................................................................................35
VI.1 Déroulement d'une interruption ........................................................................... 35
VI.2 Les sources d'interruption .................................................................................... 36
VI.3 L'interruption INT (Entrée RB0 du port B) ............................................................. 36
VI.4 L'interruption RBI (RB4 A RB7 du port B) .............................................................. 36
VI.5 Les autres interruptions ....................................................................................... 36
VII Les Timers ..............................................................................................................37
VII.1 Le Timer TMR0 ................................................................................................... 37
VII.2 Le Watchdog Timer WDT (Chien de garde) .......................................................... 38
VII.3 Le Timer TMR1 ................................................................................................... 39
VII.3.1 Le mode Timer ............................................................................................... 39
VII.3.2 Le mode Compteur .......................................................................................... 39
VII.3.3 Le registre de control de T1CON ....................................................................... 40
VII.4 Les module de Comparaison/Capture CCP1 et CCP2............................................... 41
VII.4.1 Le module CCP1 .............................................................................................. 41
VII.4.1.1 Le mode Capture ..................................................................................... 41
VII.4.1.2 Le registre de configuration CCP1CON ....................................................... 42
VII.4.1.3 Le mode Comparaison .............................................................................. 42
VII.4.2 Le module CCP2 .............................................................................................. 43
VII.5 Le Timer TMR2 ................................................................................................... 44
VIII Le module de conversion A/N................................................................................46
VIII.1 Déroulement d’une Conversion ............................................................................ 47
VIII.2 Temps de conversion .......................................................................................... 48
VIII.3 Temps d'acquisition ............................................................................................ 48
VIII.4 Fréquence d'échantillonnage ................................................................................ 49
VIII.5 Valeur numérique obtenue .................................................................................. 49
VIII.6 Programmation ................................................................................................... 49
IX L'USART ..................................................................................................................50
IX.1 Mode Asynchrone ............................................................................................... 50
IX.2 Le port en transmission ....................................................................................... 50
IX.2.1 Les étapes de transmission (sans interruption, mode 8 bits) ............................... 51
IX.3 Le port en réception ............................................................................................ 52
IX.3.1 Les étapes de réception (sans interruption, mode 8 bits) .................................... 53
IX.4 La vitesse de communication ............................................................................... 53
X Le module MSSP (Master Synchronous Serial Port) .............................................54
X.1 Introduction au bus I2C ...................................................................................... 54
X.1.1 start condition................................................................................................. 55
X.1.2 Transmission d'un bit....................................................................................... 55
X.1.3 Stop condition ................................................................................................. 55
X.1.4 Remarque sur le Start et le Stop condition ......................................................... 56
X.1.5 L' acknowledge ............................................................................................... 56
X.1.6 L'adresse et le bit R/W ..................................................................................... 56
X.2 Le module MSSP en mode I2C ............................................................................. 57
X.2.1 Transmission d’un octet ................................................................................... 57
X.2.2 Réception d’un octet ........................................................................................ 57
X.2.3 Les registres de configuration ........................................................................... 57
X.2.3.1 Le registre SSPSTAT :............................................................................... 58
X.2.3.2 Le registre SSPCON : ................................................................................ 58
X.2.3.3 Le registre SSPCON2 : .............................................................................. 59
X.2.3.4 Le registre SSPADD : ................................................................................ 59
X.2.4 MSCP en mode I2C Master ............................................................................... 59
X.2.4.1 Master en transmission : ........................................................................... 60
X.2.4.2 Master en réception : ............................................................................... 62
4
X.2.5 MSCP en mode I2C Slave ................................................................................ 64
X.2.5.1 Slave en Réception de données (venant du master) .................................... 64
X.2.5.2 Slave en transmission de données (vers le master) ..................................... 66
X.2.5.3 Utilisation des interruptions ....................................................................... 68
X.3 Le module MSSP en mode SPI ............................................................................. 69
X.3.1 Le mode SPI master ........................................................................................ 70
X.3.1.1 Récapitulation mode master ...................................................................... 71
X.3.2 Le mode SPI slave ........................................................................................... 72
X.3.2.1 Les chronogrammes de fonctionnement : ................................................... 72
XI Annexe : Gestion du Programme Counter, ............................................................74
XI.1 GOTO calculé : modification de la valeur de PCL .................................................... 74
XI.2 Instruction de branchement ................................................................................. 74
XII Références ..............................................................................................................75

5
I Introduction

Un microcontrôleur est un composant électronique Autonome doté :
- d’un microprocesseur,
- de la mémoire RAM,
- de la mémoire permanente,
- des interfaces d’E/S //, série (RS232,I2C, SPI …)
- des interfaces d’E/S analogique
- Des Timer pour gérer le temps
- D’autres module plus au moins sophistiqués selon la taille des µC

Il est généralement moins puissant qu’un microprocesseur en terme de rapidité ou de taille
mémoire, il se contente le plus souvent d’un bus 8 ou 16 bits. Ceci en fait un composant très bon
marché parfaitement Adapté pour piloter les applications embarquées dans de nombreux
domaines d’application. Je pense qu’on ne se tromperait pas beaucoup si on affirme qu’aujourd’hui
il y’a un microcontrôleur (± grand) dans chaque équipement électronique :
- Informatique (souris, modem …)
- Vidéo (Appareil photos numérique, caméra numérique …)
- Contrôle des processus industriels (régulation, pilotage)
- Appareil de mesure (affichage, calcul statistique, mémorisation)
- Automobile (ABS, injection, GPS, airbag)
- Multimédia (téléviseur,carte audio, carte vidéo, MP3, magnétoscope)
- Téléphones (fax, portable, modem)
- Electroménager (lave-vaisselle, lave-linge, four micro-onde)

Un microcontrôleur peut être programmé une fois pour toutes afin qu'il effectue une ou des
tâches précises au sein d'un appareil électronique. Mais les µC récents peuvent être reprogrammés
et ceci grâce à leur mémoire permanente de type FLASH (d’où le terme flasher quelque chose)

Plusieurs Constructeurs se partagent le marché des microcontrôleurs, citons INTEL,
MOTOROLA, AMTEL, ZILOG, PHILIPS et enfin MICROCHIP avec ses PICs très populaires qui nous
intéresse ici dans ce cours.

Les microcontrôleurs, quelque soit leurs constructeurs, ont des architecture très similaires et
sont constitués de modules fondamentaux assurant les mêmes fonctions : UAL, Ports d’E/S,
interfaces de communications série, Interfaces d’E/S analogiques, Timers et horloge temps réels
…On peut dire que seul le langage de programmation (Assembleurs) constitue la différence
majeure en deux microcontrôleur (similaires) venant de deux constructeurs différents.

Nous avons choisit dans ce cours d’apprendre les microcontrôleurs à travers une étude
détaillée des microcontrôleur 16F87x (x=3, 4, 6, 7) qui constitue les éléments fondamentaux de la
famille mid-range qui est la famille « moyenne puissance » de Microchip

6
I.1 Les PICs de Microchip

Les PICs sont des microcontrôleurs à architecture RISC (Reduce Instructions Construction
Set), ou encore composant à jeu d’instructions réduit. L'avantage est que plus on réduit le nombre
d’instructions, plus leur décodage sera rapide ce qui augmente la vitesse de fonctionnement du
microcontrôleur.
La famille des PICs est subdivisée en 3 grandes familles : La famille Base-Line, qui utilise des
mots d’instructions 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 fréquences
d’horloge allant du continu jusqu’à une fréquence max spécifique à 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 particulièrement au PIC
16F876/877, sachant que si on a tout assimilé, on pourra facilement passer à une autre famille, et
même à un autre microcontrôleur.

PIC FLASH RAM EEPROM I/O A/D Port // Port Série
16F870 2K 128 64 22 5 NON USART
16F871 2K 128 64 33 8 PSP USART
16F872 2K 128 64 22 5 NON MSSP
16F873 4K 192 128 22 5 NON USART/MSSP
16F874 4K 192 128 33 8 PSP USART/MSSP
16F876 8K 368 256 22 5 NON USART/MSSP
16F877 8K 368 256 33 8 PSP USART/MSSP
Tableau I.1 : différents circuit de la famille 16F87X

Les éléments essentiels du PIC 16F876 sont :
- Une mémoire programme de type EEPROM flash de 8K mots de 14 bits,
- Une RAM donnée de 368 octets,
- Une mémoire EEPROM de 256 octets,
- Trois ports d'entrée sortie, A (6 bits), B (8 bits), C (8 bits),
- Convertisseur Analogiques numériques 10 bits à 5 canaux,
- USART, Port série universel, mode asynchrone (RS232) et mode synchrone
- SSP, Port série 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,
- Générateur d'horloge, à quartz (jusqu’ à 20 MHz) ou à Oscillateur RC
- Protection de code,
- Fonctionnement en mode sleep pour réduction de la consommation,
- Programmation par mode ICSP (In Circuit Serial Programming) 12V ou 5V,
- Possibilité aux applications utilisateur d’accéder à la mémoire programme,
- Tension de fonctionnement de 2 à 5V,
- Jeux de 35 instructions
7

Fig. I.1 : Les éléments 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 éléments de base du PIC 16F876/877
II.1 L'Horloge
L'horloge peut être soit interne soit
externe. L'horloge interne est constituée d'un
oscillateur à quartz ou d'un oscillateur RC.
Avec l'oscillateur à Quartz, on peut avoir
des fréquences allant jusqu'à 20 MHz selon le
type de µC. Le filtre passe bas (Rs, C1, C2)
limite les harmoniques dus à l’écrêtage et
Réduit l’amplitude de l’oscillation, il n'est pas
obligatoire.
Avec un oscillateur RC, la fréquence de
l'oscillation est fixée par Vdd, Rext et Cext.
Elle peut varier légèrement d'un circuit à
l'autre.
Dans certains cas, une horloge externe
au microcontrôleur peut être utilisée pour
synchroniser le PIC sur un processus
particulier.
Quelque soit l'oscillateur utilisé, l'horloge
système dite aussi horloge instruction est
obtenue en divisant la fréquence par 4. Dans
la suite de ce document on utilisera le terme
Fosc/4 pour désigner l'horloge système.

Avec un quartz de 4 MHz, on obtient une horloge instruction de 1 MHz, soit le temps pour
exécuter une instruction de 1µs.

Mémoire
programme
de type Flash

8 x 1024
mots de 14 bits
EEPROM
256 octets
14 bits : config
timer 2
TMR2
Chien de
garde
WDT
Horloge
système
PORTB
W
ALU
PORTA PORTC
timer 1
TMR1
timer 0
TMR0
MSSP
(I2C/SPI)
CCP1
Capture/Comparaison
CCP2
Capture/Comparaison

DAC
10 bits
USART
(RS232)
PORTE PORTD
96 registres
système
368 registres
utilisateur
8
II.2 L'ALU et l’accumulateur W

L’ALU est une Unité Arithmétique et logique 8 Bits qui réalise les opérations arithmétiques et
logique de base. L’accumulateur W est un registre de travail 8 bits, toutes les opérations à deux
opérandes passe par lui. On peut avoir :

- Une instruction sur un seul opérande qui est en général un registre situé dans la RAM
- Une instruction sur 2 opérandes. Dans ce cas, l’un des deux opérandes est toujours
l’accumulateur W, l’autre peut être soit un registre soit une constante.

Pour les instructions dont un des opérandes est un registre, le résultat peut être récupéré soit
dans l’accumulateur, soit dans le registre lui-même.


II.3 Organisation de la mémoire RAM
L’espace mémoire RAM adressable est de 512 positions de 1 octet chacune :
- 96 positions sont réservées 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 implantés
physiquement d’où une capacité de RAM utilisateur de 368 GPR.

Pour accéder à la RAM, on dispose de deux modes d’adressage :


II.3.1 Accès à la RAM par adressage DIRECT
Avec ce mode d’adressage, on précise dans l’instruction la valeur de l’adresse à laquelle on
veut accéder. Par exemple, pour copier le contenu de l'accumulateur W dans la case mémoire
d'adresse 50, on utilise l'instruction MOVWF 50. Cette instruction sera codée sur 14 bits, la partie
adresse est codée sur 7 bits ce qui va poser quelques petits problèmes. En effet, 7 bits
permettent d’adresser seulement 128 positions. Pour pouvoir adresser les 512 positions
accessibles, il faut 9 bits d’adresse. Pour avoir ces 9 bits, le PIC complète les 7 bits venant de
l’instruction par deux bits situés dans le registre de configuration STATUS. Ces bits sont appelés
RP0 et RP1 et doivent être positionnés correctement avant toute instruction qui accède à la RAM
par l’adressage direct.



La RAM apparaît alors organisée en 4 banks de 128 octets chacun. L'adresse instruction
permet d'adresser à l'intérieur d'un bank alors que les bits RP0 et RP1 du registre STATUS
permettent de choisir un bank. La Figure II-1 montre l’organisation de la RAM avec les zones
allouée au SFR et aux GPR. Les zones hachurées ne sont pas implantées physiquement. Si on
essaye d’y accéder, on est aiguillé automatiquement vers la zone [70
h
,7F
h
] appelée zone
commune.

Même si on précise une adresse supérieure à 127 (+ de 7 bits) dans une instruction, elle est
tronquée à 7 bits puis complétée par les bits RP0 et RP1 pour former une adresse 9 bis. Par
exemple, pour copier l’accumulateur W dans la case mémoire d’adresse 1EF
h
, il faut d’abord placer
les bits RP0 et RP1 à 1 (bank 3), ensuite on utilise soit l’instruction MOVWF 6Fh soit l’instruction

9 bits
RP0 RP1
9
MOVWF 1EFh, qui donne le même résultat. En effet, que l’on écrive 6Fh = 0110 1111 ou 1EFh
= 0001 1110 1111, le PIC ne prend que 7 bits soit : 1101111 = 6Fh et complète avec les bits
RP1,RP0 pour obtenir 11 1101111 = 1EFh

Bank 0 (00) Bank 1 (01) Bank 2 (10) Bank 3 (11)
00h INDF 80h INDF 100h INDF 180h INDF
01h TMR0 81h OPTION_REG 101h TMR0 181h OPTION_REG
02h PCL 82h PCL 102h PCL 182h PCL
03h STATUS 83h STATUS 103h STATUS 183h STATUS
04h FSR 84h FSR 104h FSR 184h FSR
05h PORTA 85h TRISA 105h 185h
06h PORTB 86h TRISB 106h PORTB 186h TRISB
07h PORTC 87h TRISC 107h 187h
08h PORTD (*) 88h TRISD (*) 108h 188h
09h PORTE (*) 89h TRISE (*) 109h 189h
0Ah PCLATH 8Ah PCLATH 10Ah PCLATH 18Ah PCLATH
0Bh INTCON 8Bh INTCON 10Bh INTCON 18Bh INTCON
0Ch PIR1 8Ch PIE1 10Ch EEDATA 18Ch EECON1
0Dh PIR2 8Dh PIE2 10Dh EEADR 18Dh EECON2
0Eh TMR1L 8Eh PCON 10Eh EEDATH 18Eh
0Fh TMR1H 8Fh 10Fh EEADRH 18Fh
10h T1CON 90h 110h
































16Fh
190h
































1EFh
11h TMR2 91h SSPCON2

12h T2CON 92h PR2
13h SSPBUF 93h SSPADD
14h SSPCON 94h SSPSTAT
15h CCPR1L 95h
16h CCPR1H 96h
17h CCP1CON 97h
18h RCSTA 98h TXSTA
19h TXREG 99h SPBRG
1Ah RCREG 9Ah
1Bh CCPR2L 9Bh
1Ch CCPR2H 9Ch
1Dh CCP2CON 9Dh
1Eh ADRESH 9Eh ADRESL
1Fh ADCON0 9Fh ADCON1
20h















6Fh
A0h















EFh
70h



7Fh
Zone
commune

F0h



FFh
170h



17Fh
1F0h



1FFh

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

Nous allons anticiper un peu et présenter 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

10
II.3.2 Accès à la RAM par l’adressage INDIRECT
Pour accéder à une position de la RAM en utilisant l’adressage indirect, on passe toujours par
une position fictive appelée INDF (Indirect File).
Exemple : l’instruction CLRF INDF signifie : mettre à zéro la case mémoire d’adresse INDF.
Mais quelle est l’adresse de cette position appelée INDF ? La réponse est :

INDF est la case mémoire pointée par le pointeur IRP/FSR.

IRP est un bit qui se trouve dans STATUS et FSR est un registre accessible dans tous les
bancs. On peut se demander pourquoi on ajoute le bit IRP. En effet, le registre de pointage FSR
est un registre 8 bits, il peut donc adresser au maximum 256 positions mémoire (de 00h à FFh),
c’est seulement la moitié de la RAM dont on dispose. Il nous manque un bit pour avoir les 9 bits
nécessaires. On utilise le bit IRP qui se trouve dans le registre STATUS.

Exemle : Si on place 74h dans le registre FSR et on positionne le bit IRP à 1, alors, l’instruction
CLRF INDF signifie : remettre à zéro la case mémoire d’adresse 174h.



Donc en résumé, chaque fois que le PIC rencontre le mot INDF dans un programme, il sait
qu’il s’agit de la case mémoire dont l’adresse (9 bits) se trouve dans le registre FSR complété par
le bit IRP du registre STATUS

INDF est la case mémoire pointée par le pointeur:



IRP = 0  000h à 0FFh  page 0

IRP = 1  100h à 1FFh  page 1

FSR
pointeur 9 bits
IRP
SFR
(32)
SFR
(32)
GPR
(80)
GPR
(96)
SFR
(16)
GPR
(96)
SFR
(16)
GPR
(96)
0 00
0 1F
0 20
0 7F
0 80
0 9F
0 A0
0 EF
1 00
1 0F
1 10
1 6F
1 80
1 8F
1 90
1 EF
IRP
page 0 page 1
FSR
0 FF 1 FF
11
II.4 Quelques registres de configuration et leurs bits
STATUS IRP RP1 RP0 TO PD Z DC C 0001 1xxx
OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x
PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000
PIR1 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000
PIE2 N.I. Réservé N.I. EEIE BCLIE N.I. N.I. CCP2IE -r-0 0--0
PIR2 N.I. Réservé N.I. EEIF BCLIF N.I. N.I. CCP2IF -r-0 0--0
EECON1 EEPGD — — — WRERR WREN WR RD x--- x000
TXSTA CSRC TX9 TXEN SYNC — BRGH TRMT TX9D 0000 -010
RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000x
CCPxCON — — DCxB1 DCxB0 CCPxM3 CCPxM2 CCPxM1 CCPxM0 --00 0000
T1CON — — T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON --00 0000
T2CON — TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 -000 0000
SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 0000 0000
SSPCON2 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN 0000 0000
SSPSTAT SMP CKE D/A P S R/W UA BF 0000 0000
CCP1CON — — CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 --00 0000
TXSTA CSRC TX9 TXEN SYNC — BRGH TRMT TX9D 0000 -010
RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000x
CCP2CON — — CCP2X CCP2Y CCP2M3 CCP2M2 CCP2M1 CCP2M0 --00 0000
ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE — ADON 0000 00-0
ADCON1 ADFM — — — PCFG3 PCFG2 PCFG1 PCFG0 0--- 0000
TRISx 1111 1111
Tableau II.1 : détail des registres SFR et leurs états au démarrage

12
II.5 Les instructions du 16F876/877
- Tous les PICs Mid-Range ont un jeu de 35 instructions,
- Chaque instruction est codée sur un mot de 14 bits qui contient le code opération (OC) ainsi
que l'opérande,
- Toutes les instructions sont exécutées en un cycle d'horloge, à part les instructions de saut qui
sont exécutées en 2 cycles d’horloge. Sachant que l’horloge système 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 l’ordre de 1MIPS (1 Million d’ Instructions Par Seconde). Avec un
quartz de 20MHz, on obtient une vitesse de traitement de 5 MIPS.


II.5.1 Les instructions « orientées 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 mémoire quelconque (Registre GPR)

II.5.2 Les instructions « orientées bits »
Ce sont des instructions destinées à manipuler directement un bit d’un registre que se soit un
registre de configuration SFR ou une case mémoire quelconque (registre GPR). Tous les bits de la
RAM peuvent être manipulé individuellement.

II.5.3 Les instructions opérant sur une constante
Ce sont les instructions entre l’accumulateur W est une constante K

II.5.4 Les instructions de saut et appel de procédures
Ce sont les instructions qui permettent de sauter à une autre position dans le programme et
de continuer l’exécution du programme à partir de cette position.


Exercice 1)
Dans quel bank se trouvent les cases mémoire d'adresse : 1A4h, B5h, 130h, 58h, 100, 200, 250,
300, 400

Exercice 2)
Combien de cases mémoires libres (GPR) y a-t-il dans la zone mémoire qui commence à la position
A0h et se termine à EAh.

Exercice 3)
Quelle est l'adresse de la dernière position d'une zone mémoire de 40 cases qui commence à la
position 190h.

Exercice 4)
Combien de cases mémoires libres (GPR) y a-t-il dans le bank1. Même question pour le bank2.



13
II.5.5 Le jeu d'instructions

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

INSTRUCTIONS OPERANT SUR REGISTRE indicateurs Cycles
ADDWF F,d W+F  {W,F ? d} C,DC,Z 1
ANDWF F,d W and F  {W,F ? d} Z 1
CLRF F Clear F Z 1
COMF F,d Complémente F  {W,F ? d} Z 1
DECF F,d décrémente F  {W,F ? d} Z 1
DECFSZ F,d décrémente F  {W,F ? d} skip if 0 1(2)
INCF F,d incrémente F  {W,F ? d} Z 1
INCFSZ F,d incrémente F  {W,F ? d} skip if 0 1(2)
IORWF F,d W or F  {W,F ? d} Z 1
MOVF F,d F  {W,F ? d} Z 1
MOVWF F W  F 1
RLF F,d rotation à gauche de F a travers C  {W,F ? d} C 1
RRF F,d rotation à droite de F a travers C  {W,F ? d} 1
SUBWF F,d F – W  {W,F ? d} C,DC,Z 1
SWAPF F,d permute les 2 quartets de F  {W,F ? d} 1
XORWF F,d W xor F  {W,F ? d} Z 1

INSTRUCTIONS OPERANT SUR BIT
BCF F,b RAZ du bit b du registre F 1
BSF F,b RAU du bit b du registre F 1
BTFSC F,b teste le bit b de F, si 0 saute une instruction 1(2)
BTFSS F,b teste le bit b de F, si 1 saute une instruction 1(2)

INSTRUCTIONS OPERANT SUR CONSTANTE
ADDLW K W + K  W C,DC,Z 1
ANDLW K W and K  W Z 1
IORLW K W or K  W Z 1
MOVLW K K  W 1
SUBLW K K – W  W C,DC,Z 1
XORLW K W xor K  W Z 1

AUTRES INSTRUCTIONS
CLRW Clear W Z 1
CLRWDT Clear Watchdoc timer TO', PD' 1
CALL L Branchement à un sous programme de label L 2
GOTO L branchement à la ligne de label L 2
NOP No operation 1
RETURN retourne d'un sous programme 2
RETFIE Retour d'interruption 2
RETLW K retourne d'un sous programme avec K dans W 2
SLEEP se met en mode standby TO', PD' 1

14
On remarque que :
- Les instructions qui agissent sur un registre ou un bit d’un registre contiennent toutes la l ettre
F dans le nom de l’instruction. Ceci vient du fait que chez Microchip, la RAM est appelée
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 d’adressage, chez d’autres constructeurs, on parle
d’adressage immédiat

II.5.6 Les paramètres des instructions agissant sur registre
Pour les instructions qui agissent sur registre, le paramètre F représente l’adresse du registre
considéré. Le paramètre d (destination) joue un rôle important, si on prend d = 0 ou w, le résultat
de l’opération sera placé dans l’accumulateur W, si on prend d = 1 ou f, le résultat de l’opération
sera placé dans le registre précisé par F.

ADDWF 70h,1 ou ADDWF 70h,f
Signifie : additionner le contenu de W avec le contenu de la case mémoire d’adresse 70h et placer le
résultat dans la case mémoire 70h

XORWF 35h,0 ou XORWF 35h,w
Signifie : faire un ou exclusif entre W et le contenu de la case mémoire d’adresse 35h et placer le
résultat dans l’accumulateur W

II.5.7 Les paramètres des instructions agissant sur bit
Pour les instructions agissant sur un bit, le paramètre F indique le registre qui contient le bit à
modifier et le paramètre b indique le numéro du bit à modifier; on compte à partir de zéro en
commençant à droite



BSF STATUS,2 ; signifie : placer à 1 le bit 2 (3ème bit à partir de la droite) du registre
STATUS

BCF 45h,6 ; signifie : placer à 0 le bit 6 (7ème bit à partir de la droite) du registre de la
case mémoire d’adresse 45h


II.5.8 Les instructions MOVWF et MOVF
Ce sont les instructions les plus utilisées,

MOVWF permet de copier l’accumulateur 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 mémoire d’adresse 55h


MOVF permet de copier le contenu d’un registre (SFR ou GPR) dans l’accumulateur W, le
paramètre d doit être = 0

7 6 5 4 3 2 1 0

W
RAM
MOVWF
15
MOVF STATUS,0 ; Copier le contenu du registre STATUS dans l’accumulateur W

MOVF 35h,0 ; Copier le contenu de la case
mémoire d’adresse 35h dans
l’accumulateur W

Avec le paramètre d=1, l’instruction MOVF semble inutile car
elle permet de copier un registre sur lui-même ce qui à priori
ne sert à rien.

MOVF STATUS,1 ; Copier le contenu du registre STATUS
dans lui même

En réalité cette instruction peut s’avérer utile car, comme elle positionne l’indicateur Z, elle
permet de tester si le contenu d’un registre est égal à zéro


II.5.9 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 l’instruction suivante si le
bit testé est nul

btfss F,b : bit test skip if set : teste le bit b du registre F et saute l’instruction suivante si le
bit testé est égal à 1

exemple :
sublw 100 ; 100 – W ÷ W
btfss STATUS,Z ; tester le bit Z du registre STATUS et sauter une ligne si Z=1
clrf 70h ; après btfss, le programme continue ici si Z=0
cmpf 70h,f ; après btfss, le programme continue ici si Z=1
suite du programme
suite du programme


II.5.10 Les instructions incfsz et decfsz
Ces instructions permette d’incrémenter ou de décrémenter un registre et de sauter si le
résultat est nul

Incfsz F,1 : increment skip if Z : incrémente le registre F et sauter une ligne si le résultat =
0. Le paramètre 1 indique que le résultat de l’incrémentation doit aller dans F.

deccfsz F,1 : decrement skip if Z : décrémente le registre F et sauter une ligne si le résultat
= 0. Le paramètre 1 indique que le résultat de la décrémentation doit aller dans
F.



II.5.11 L’instruction goto
Permet de transférer l’exécution à une autre position du programme repérée par une
étiquette (label)

W
RAM
MOVF
16
Instruction 1
Instruction 2
Goto bonjour
instruction 3
instruction 4
instruction 5
bonjour instruction 6
instruction 7


II.5.12 L’instruction call
L’instruction call permet d’appeler une fonction. Une fonction est un sous programme écrit à
la suite du programme principal. Sa première 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 différence en call et goto est que, quant
le processeur rencontre l’instruction call, il
sauvegarde l’adresse de la ligne suivante avant
d’aller exécuter les instructions constituant la
fonction. Comme ça, quand il rencontre
l’instruction return, il sait où il doit retourner
pour continuer l’exécution du programme
principal.
17
II.5.13 Les indicateur d’état (drapeaux)
Les bits Z, DC et C situés dans le registre STATUS sont des indicateurs qui permettent de
savoir comment une instruction s’est terminée. Toutes les instructions n’agissent pas sur les
indicateurs, voir liste des instructions ci-dessous.

Z : passe à 1 quand le résultat d’une instruction est nul
C : passe à 1 quand l’opération a généré une retenue
DC : passe à 1 quand les 4
ème
bits génère une retenue

Ces bits peuvent être utilisé très astucieusement par les instructions btfsc et btfss qui
permettent de tester un bit et de réaliser un saut conditionnel. Nous aurons l’occasion d’en
reparler dans la suite du cours.

STATUS IRP RP1 RP0 Z DC C


II.5.13.1 Les indicateurs, la soustraction et la comparaison
Suite à une soustraction, les drapeaux Z et C sont positionnés 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 ==> A sup ou égal à B
C=0 ==> inférieur



18
II.6 Les directives de l'assembleur MPASM
Les directives de l'assembleur sont des instructions qu'on ajoute dans le programme et qui
seront interprétées par l'assembleur MPASM. Ce ne sont pas des instructions destinées au PIC.
Nous ne présentons ici que quelques directives, pour le reste, consulter la documentation de
MPASM "MPASM USER'S GUIDE".

Remarque : Je vais présenter les directives en Majuscule, mais sachez que le compilateur MPASM
accepte les instructions et les directives en minuscule et en majuscule. Attention ce n’est pas le
cas pour les étiquettes et les noms de déclaration des constantes.

- LIST : permet de définir un certain nombre de paramètres comme le processeur utilisé (p), la
base par défaut pour les nombres (r) ainsi que d'autres paramètres. Exemple :
LIST p=16F876, r=dec

avec r=dec, les nombres sans spécification particulière
seront considérés par l'assembleur comme des nombre
décimaux, sinon voir tableau ci-contre


- INCLUDE : permet d'insérer un fichier source. Par
exemple le fichier p16f876.inc contient la définition
d'un certain nombre de constante comme les noms des registres ainsi que les noms de certains
bits;
INCLUDE "p16f876.inc"

- EQU : permet de définir 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 d’adresse 0x20

- CBLOCK/ENDC : permet de définir un ensemble de constantes :
L'ensemble des déclarations suivantes :
XX1 EQU 0x20
XX2 EQU 0x21
XX3 EQU 0x22
XX4 EQU 0x23
peut être remplacé par
CBLOCK 0x20
XX1, XX2, XX3, XX4
ENDC

- ORG : définit la position dans la mémoire programme à partir de laquelle seront inscrites les
instructions suivantes.

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

Fig. II.1 : Illustration de la directive ORG
- #DEFINE : fonctionne un peu comme la directive EQU tout en étant un peu plus générale, car
elle permet d’affecter toute une chaîne à une abréviation

#DEFINE XX 0x20 ; dans ce cas c’est équivalent à XX EQU 0x20

#DEFINE LED PORTB,3 ; ici chaque fois que le compilateur rencontrera le mot LED, il le
remplacera par PORTB,3

BCF LED ; éteindre la LED branchée sur la broche 3 de PORTB

On peu ainsi affecter une abréviation à toute une instruction

#DEFINE eteindre bcf PORTC,5 ;affecte l’abréviation eteindre à l’instruction bcf
PORTC,5

#DEFINE allumer bsf PORTC,5 ;affecte l’abréviation allumer à l’instruction
bsf PORTC,5

allumer ; allume la LED branchée sur la broche 5 de PORTC
eteindre ; éteindre la LED branchée sur la broche 5 de PORTC

- DE : pour déclarer des donnés qui seront stockée dans l'EEPROM de donnée au moment de
l'implantation du programme sur le PIC
ORG 0x2100
DE "Programmer un PIC, rien de plus simple", 70, 'Z'

- DT : pour déclarer un tableau RETLW
DT 10,35h,’Hello’ ; sera remplacée par la suite d’instructions :

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

- END : indique la fin du programme
20

- __CONFIG : permet de définir les 14 bits (fusibles ou switch) de configuration qui seront
copiés 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 ; Déterminent quelle zone de la mémoire programme sera protégée contre
la lecture externe (via ICSP) ou l'écriture par programme conformément à l'état du bit 9 (WRT).
On peut choisir de protéger la totalité de la mémoire ou seulement une partie. Les différentes
zones pouvant être protégées 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 l’intégralité de la mémoire (_CP_ALL)

DEBUG : bit 11 : Debuggage sur circuit. Permet de dédicacer RB7 et RB6 à la communication
avec un debugger.
1 : RB6 et RB7 sont des I/O ordinaires (_DEBUG_OFF)
0 : RB6 et RB7 sont utilisés pour le debuggage sur circuit (_DEBUG_ON)

WRT : bit 9 : Autorisation d’écriture en flash
1 : Le programme peut écrire dans les zones non protégées par les bits CP1/CP0
(_WRT_ENABLE_ON)
0 : Le programme ne peut pas écrire en mémoire flash (_WRT_ENABLE_OFF)

CPD : bit 8 : Protection en lecture de la mémoire EEPROM de données.
1 : mémoire EEPROM non protégée (_CPD_OFF)
0 : mémoire EEPROM protégée 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 utilisée comme I/O standard (_LVP_OFF)

BODEN : bit 6 : provoque le reset du PIC en cas de chute de tension (surveillance de la tension
d’alimentation)
1 : En service (_BODEN_ON)
0 : hors service (_BODEN_OFF)

PWRTE : bit 3 : Délai de démarrage à la mise en service. Attention, est automatiquement mis en
service si le bit BODEN est positionné.
1 : délai hors service (sauf si BODEN = 1) (_PWRTE_OFF)
0 : délai en service (_PWRTE_ON)

WDTE : bit 2 : Validation du Watchdog timer
1 : WDT en service (_WDT_ON)
0 : WDT hors service (_WDT_OFF)

FOSC1/FOSC0 : bits 1/0 : sélection du type d’oscillateur
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)
21

Voici 3 exemples d’utilisation :

__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 microcontrôleurs avec l’extension « A » comme 16F876A ou 16F877A ont une
disposition des bits de configuration légèrement différente, consultez le datasheet.

22
III Les outils de développement
L’outil de développement principal est l’environnement de développement intégré MPLAB
fournit gratuitement par Microchip


III.1 Procédure de travail
Les étapes nécessaires permettant de voir un programme s'exécuter 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 résultat est un
fichier exécutable avec l'extension .hex contenant une suite d'instruction compréhensible par
le pic.
- Transplanter le fichier .hex dans la mémoire programme du PIC (mémoire flash) à l'aide d'un
programmateur adéquat. On peut utiliser les programmateurs de Microchip ou tout autre
programmateur acheté ou réalisé par soit même.
- Mettre le PIC dans son montage final, mettre sous tension et admirer le travail.

Microchip propose gratuitement l'outil de développement MPLAB qui regroupe l'éditeur de
texte, le compilateur MPASM, un outil de simulation et le logiciel de programmation. Le
programmateur lui-même, 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 mémoire 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
23
III.2 L’environnement de développement MPLAB
MPLAB-IDE peut être téléchargé sur le site Web http://www.microchip.com

Après l'installation, lancer MPLAB et faire les config ci-dessous :
- Configure ÷ Select Device ÷ PIC16F876 ou PIC16F877

Nous allons réaliser un tout petit programme sans grand intérêt pour voir la procédure de
fonctionnement (avec MPLAB 6.30)
- Ouvrir une nouvelle fenêtre (de l'éditeur) pour commencer à écrire un programme : file 
new ou cliquez sur l'icône feuille blanche
- Taper le petit programme ci-dessous dans la fenêtre qui vient de s'ouvrir. Ce programme
incrémente sans fin la position mémoire (RAM) 70
H


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 problème, 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 définit dans la ligne précédente prend seulement deux o. Corrigez et
recommencez. Cette fois ça a l'air d'aller. On peut vérifier que le compilateur a crée le fichier
bidon.hex dans la même 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 détruire.

- Nous pouvons maintenant exécuter notre programme en simulation pour voir s'il réalise bien la
tache demandée :
Pour faire apparaître la barre d'outil du simulateur :
Debugger ÷ Select tool ÷ MPLAB SIM
- Ouvrez la fenêtre qui visualise la mémoire RAM : view  FileRegisters. et repérer la case
mémoire 70h
- Exécuter maintenant le programme PAS à PAS en cliquant à chaque fois sur le bouton Step
Into {} en observant la case mémoire 70h . (on dirait que ça marche).
- On peut aussi exécuter en continu en cliquant sur le bouton animate  , pour arrêter, il faut
cliquer sur le bouton halt 

Pour plus de détail, consulter le manuel d'utilisation de MPLAB
24



Modifiez maintenant la case 70h par la case 190h, compilez, simulez et tirer les conclusions
25
III.3 Structure générale d’un programme

;*****************************************************************
; 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 STATUS,RP0 ;bank 0
bcf STATUS,RP1 ;bank 0
movlw 'A'
movwf 20h

bsf STATUS,RP0 ;bank 1
movlw 'B'
movwf 0xA0

bcf STATUS,RP0 ;bank 2
bsf STATUS,RP1 ;bank 2
movlw 'C'
movwf 110h

bsf STATUS,RP0 ;bank 3
movlw 'D'
movwf 190h

end

Compilons le programme avec
MPLAB (projectquikbuild) et
visualisons la mémoire programme
(viewprogram memory) , on obtient la
fenêtre ci-dessus.


Observations :

- Comme il n'y a pas d'interruption, on
ne s'est pas soucié de l'implantation
du programme dans la mémoire
programme (directive ORG). on
remarque sur la fenêtre que
l'implantation du programme
commence à l'adresse 0.

- La colonne de droite de cette fenêtre
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 déclarations STATUS EQU 0x3 et RP0 EQU 0x5
26

- On remarque aussi que l'instruction movwf 190h a été remplacée 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 même l'adresse 190h qui sera adressée l'adresse
001 0000 sera complétée par RP1,RP0=11 (bank 3) et on obtient 11001 0000 = 190h



III.4 Quelques exemples

Exercice 5) : Accès à la RAM par l'adressage direct
Donner le programme qui copie :
35 dans la position 20h, 'A' dans la position A0h
-5 dans la position 110h, 35h dans la position 190h

Exercice 6) : Soustraction
Donner le programme qui :
- soustrait la constante 33 de l'accumulateur W (W-33)
- Soustrait la constante 40h de la case mémoire d'adresse 70h ([70h]-40h  [70h])
- qui soustrait le contenu de la case mémoire 70h de l'accumulateur W avec le résultat dans W
( W – [70h]  W )
- qui soustrait le contenu de la case mémoire 71h de l'accumulateur W avec le résultat dans la
case mémoire
( W – [71h]  [71h] )

Exercice 7) : Accès à la RAM par l'adressage indirect
Donner le programme qui copie l'alphabet majuscule dans la RAM à partir de la position 190h


III.4.1 Comparaison

Exercice 8) : (comp1.asm)
Comparer les contenus des cases mémoire 6Fh et EFh, s’il son égaux mettre à zéro tous les
bits de la case 16Fh sinon mettre à 1 tous les bits de la case 1EFh

Exercice 9) : (comp2.asm)
Comparer les contenus des cases mémoire 6Fh et EFh,
- si [6Fh] = [EFh] copier la lettre E dans la case mémoire 16Fh
- si [6Fh] > [EFh] copier la lettre S dans la case mémoire 16Fh
- si [6Fh] < [EFh] copier la lettre I dans la case mémoire 16Fh

27
III.4.2 Boucles de temporisation
Il arrive souvent qu'on désire introduire des temporisations pendant l'exécution d'un
programme. Le PIC dispose de 3 timers permettant de gérer le temps avec précision. Nous
étudierons ces modules plus tard, pour l'instant regardons comment on peut réaliser des
temporisations à l'aide de simples boucles. L'idée est d'initialiser une variable à une valeur donnée
et ensuite la décrémenter en boucle jusqu'à ce qu'elle atteint 0. Connaissant le temps d'exécution
de chaque instruction, on peut calculer le temps que mettra le processeur terminer la boucle de
décrémentation

III.4.2.1 Temporisation avec une boucle
Examinons l'exemple ci-dessous, on met une valeur N1 dans la case mémoire 70h et on la
décrémente jusqu'à 0

movlw 4
movwf 70h
ici decfsz 70h,f
goto 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
- chaque passage dans la boucle prend (1+2) cycle sauf le dernier qui prend 2 cycle

T = 2 + (W-1)*3 + 2 = 3*W + 1 cycles

La valeur max que l'on peut donner à W 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 mémoire qui sert de compteur, il faut la déclarer au début
avec la directive EQU

tempo1: ; il faut placer une valeur dans W avant d'appeler cette fonction
movwf AN1
t1: decfsz AN1,f
goto t1
return

Cette fonction doit être placée après 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 W + 5 cycles

Le maximum est obtenu pour N1 =256, soit T1max = 773 µs = 0.77 ms


28
III.4.2.2 Temporisation avec 2 boucles imbriquées
La boucle intérieure (N1) se fait toujours 256 fois. La boucle extérieure se fait N2 fois. C’est
N2 qui constituera le paramètre de la fonction, Il faut le placer dans W avant de l’appeler.

tempo2 : ; il faut définir W dans le programme principal
movwf AN2
t2 : decfsz AN1,f
goto t2
decfsz AN2,f
goto t2
return

T2 = 2 + 2 + [W(t1+3)-1] + 2 avec t1=256*3-1=767 on obtient :

T2 = 770 W +5 cycles

Le maximum est obtenu pour N2 =256, soit T2max = 197125 µs = 0.197 s


III.4.2.3 Temporisation avec 3 boucles imbriquées
Les boucles intérieures (N1 et N2) se font toujours 256 fois. La boucle extérieure se fait N3
fois. C’est N3 qui constituera le paramètre de la fonction, Il faut le placer dans W avant de
l’appeler.


tempo3 : ;Il faut définir W dans le programme principal
movwf AN3
t3 : decfsz AN1,f
goto t3
decfsz AN2,f
goto t3
decfsz AN3,f
goto t3
return

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

T3 = 197122 W +5 cycles

Le maximum est obtenu pour N3 =256, soit T3max = 50463237 µs = 50.46 s

Remarque : La précision de ces fonctions peut être améliorée en y insérant des instructions nop,
dans ce cas il faut revoir les formules. On verra plus tard comment on peut faire des
temporisations à l’aide des timers.

29
IV Les ports d’E/S
Le PIC 16F877 dispose de 33 broches d’entrée sortie regroupés dans 5 ports PORTA, PORTB,
PORTC, PORTD et PORTE. Chaque broche d’un port peut être configurée soit en entrée soit en
sortie à l’aide des registres de direction TRISA, TRISB, TRISC et TRISD et TRISE:

Bit k de TRISx = 0  broche k de PORTx = SORTIE
Bit k de TRISx = 1  broche k de PORTx = ENTRÉE

Certains ports ont quelques particularités que nous allons détailler ci-desous,

IV.1 Le port d' E/S PORTA
Le port A désigné 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 départ toutes les
broches sont configurées en entrée

IV.1.1 La broche RA4
En entrée, la broche RA4 peut être utilisée soit comme E/S numérique normale, soit comme
entrée horloge pour le Timer TMR0

En sortie, RA4 est une E/S à drain ouvert, pour l'utiliser comme sortie
logique, il faut ajouter une résistance de pull-up externe. Le schéma (Fig.
IV.1) illustre (pour les non électroniciens) le principe d'une sortie drain
ouvert (ou collecteur ouvert) : si RA4 est positionnée à 0, l'interrupteur est
fermé, la sortie est reliée à la masse, c'est un niveau bas. Si RA4 est placée
à 1, l'interrupteur est ouvert, la sortie serait déconnectée s'il n'y avait pas la
résistance externe qui place la sortie au niveau haut.

Si on veut utiliser RA4 pour allumer une LED,
on peut utiliser le schéma de Fig. IV.2. Il faut
juste remarquer que la logique est inversée, si on
envoie 0 sur RA4, l'interrupteur se ferme et la LED s'allume. Si on envoie
1, l'interrupteur s'ouvre et la LED s'éteint.
Le schéma illustré sur Fig. IV.3 peut aussi être utilisé. La logique
n'est pas inversée mais il demande une précaution particulière. Il ne faut
pas positionner la sortie RA4 à l'aide d'une instruction qui réalise une
opération sur l'état actuel du port; genre IORWF, ANDWF, XORWF ou
COMF, ADDWF, INCF … Ces instructions réalisent
une lecture-écriture en commencent par lire l'état
du port pour ensuite faire une opération dessus.
Or, (sur Fig. IV.3) si la sortie était au niveau
haut, l'interrupteur est ouvert, la LED est allumée et elle impose une
tension de l'ordre de 1.5V qui sera considérée (à tort) comme un niveau
bas lors de la lecture du port par les instructions précitées. La solution est
d'utiliser des instructions qui positionnent le PORT sans tenir compte de
son état courant comme MOVWF, BSF ou BCF


IV.1.2 Les autres broches de PORTA
Les autres broches (RA0, RA1, RA2, RA3 et RA5) peuvent être utilisée soit comme E/S
numériques soit comme entrées analogiques. Au RESET, ces E/S sont configurées en entrées

Vdd
1k
RA4

Fig. IV.1 : résistance de pull-up

Vdd
1k
RA4
LED

Fig. IV.2 : LED sur RA4


Vdd
1k
RA4
LED

Fig. IV.3 : LED sur RA4
30
analogiques. Pour les utiliser en E/S numériques, il faut écrire '00000110' dans le registre
ADCON1 (pour plus de détail, voir chapitre VIII).

Pour utiliser PORTA en port Numérique (normal), il faut placer 06h dans le
registre ADCON1 (bank1)

Quelque soit le mode (Analogique ou Numérique), 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 entrée

IV.2 Le port d' E/S PORTB
- Le port B désigné par PORTB est un port bidirectionnel de 8 bits (RB0 à RB7). Toutes les
broches sont compatibles TTL.
- La configuration de direction se fait à l'aide du registre TRISB, positionner un bit de TRISB à 1
configure la broche correspondante de PORTB en entré et inversement. Au départ toutes les
broches sont configurées en entrée.
- En entrée, la ligne RB0 appelée aussi INT peut déclencher l’interruption externe INT.
- En entrée, une quelconque des lignes RB4 à RB7 peut déclencher l'interruption RBI. Nous
reviendrons là-dessus dans le paragraphe réservé aux interruptions.


IV.3 Le port d' E/S PORTC
- Le port C désigné 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 départ toutes les
broches sont configurées en entrée.
- Toutes les broches du port C peuvent être utilisées soit comme E/S normales soit comme
broches d'accès à différents modules comme le timer 1, les modules de comparaison et de
capture CCP1/2, le timer 2, le port I2C ou le port série, ceci sera précisé au moment de l'étude
de chacun de ces périphériques.
- Pour l’utilisation d’une broche du port C comme E/S normale, il faut s’assurer qu’elle n’a pas
été affectée à un de ces modules. Par exemple, si TIMER1 est validé, il peut utiliser les broches
RC0 et RC1 selon sa configuration.


IV.4 Le port d' E/S PORTD
- Le port D désigné par PORTD est un port bidirectionnel de 8 bits (RD0 à RD7). Toutes les
broches sont compatibles TTL et ont la fonction trigger de Schmitt en entrée.
- Chaque broche et configurable en entrée ou en sortie à l’aide du registre TRISD. Pour
configurer une broche en entrée, on positionne le bit correspondant dans TRISD à 1 et
inversement.
- PORTD n’est pas implémenté sur tous les processeurs 16F87X, il est disponible sur le 16F877,
le 16F874 et le 16F871
31
- PORTD peut être utilisé dans un mode particulier appelé parallel slave port, pour cela il faut
placer le bit PSPMODE (bit 4) de TRISE à 1. Dans ce cas les 3 bits de PORTE deviennent les
entrées de control de ce port (RE, WE et CS)

Pour utiliser PORTD en mode normal, il faut placer le bit PSPMODE 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 entrée ou en
sortie à l’aide des bits 0, 1 ou 2 du registre TRISE.
- PORTE n’est pas implémenté sur tous les processeurs 16F87X, il est disponible sur le 16F877,
le 16F874 et le 16F871
- Les 3 bits de PORTE peuvent être utilisés soit comme E/S numérique soit comme entrées
analogiques du CAN. La configuration se fait à l’aide du registre ADCON1.
- Si le bit PSPMODE de TRISE est placé à 1, Les trois bits de PORTE deviennent les entrées de
control du PORTD qui (dans ce cas) fonctionne en mode parallel Slave mode
- A la mise sous tension (RESET), les 3 broches de PORTE sont configurées comme entrées
analogiques.

Pour utiliser les broches de PORTE en E/S numériques normales :
- Placer 06h dans ADCON1
- Placer le bit PSPMODE de TRISE à 0

Exercice 10) : Clignoter une LED
Donner le programme qui fait clignoter une LED branchée sur RA0 avec une temporisation
voisine de 0.5s. Sachant que le PIC est doté d'un quartz de 4 MHz, la temporisation sera réalisée à
l'aide de boucles imbriquées

Exercice 11) : compteur impulsions
Programme qui :
– Allume la LED branchée sur RB3
– Compte 150 impulsions sur l'entrée RA4 (la case mémoire 70h servira de compteur)
– Eteint la LED branchée sur RB3



32
V Les mémoires permanentes
Le PIC 16F877 dispose de 2 mémoires permanentes. La mémoire EEPROM PROGRAMME de
capacité 8k mots de 14 bits et la mémoire EEPROM DE DONNÉES de capacité 256 octets. On
dispose de deux méthodes pour écrire dans ces mémoires.

La première consiste à flasher le PIC avec l'exécutable (.hex). Les instructions sont flashés
dans la EEPROM programme et les donnée sont flashés dans la EEPROM de données. Le flashage
se fait à l’aide d’un programmeur et le soft qui va avec. (voir les directive DE et ORG dans ce cours
et d’autres directives comme DA, DW … dans le manuel d’utilisation de MPASM)

La deuxième méthode consiste à accéder aux mémoires EEPROM à partir du programme
durant la phase d'exécution de ce dernier. C’est ce que nous allons détailler dans les paragraphes
ci-dessous.

V.1 La mémoire EEPROM de données
Le PIC 16F876/877 dispose de 256 octets de mémoire EEPROM de donnée. Son implantation
physique commence à la position d’adresse absolue 2100h. Mais pour y accéder à partir des
programmes utilisateur on utilise l’adressage relatif par rapport à la première position. La première
position aura l’adresse 0, la deuxième aura l’adresse 1. . . et la dernière aura l’adresse 255.

Pour accéder à la EEPROM, on utilise 4 registres particuliers :
- EEADR : registre d’adresse (relative) (bank 2)
- EEDATA : registre de donnée (bank 2)
- EECON1 : registre de control (bank 3)
- EECON2 : 2
ème
registre de control (bank 3)

Le registre EECON1 : EEPGD — — — WRERR WREN WR RD

EEPGD : Accès à la mémoire EEPROP ou à la mémoire Programme
0 : EEPROM de données
1 : Mémoire 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 autorisée

WR : Write Enable. Ce bit doit être mis à 1 pour démarrer l'écriture d'un octet. Il est remis à
zéro automatiquement à la fin de l'écriture. Ce bit ne peut pas être mis à zéro par une
instruction.

RD : Read Enable. Ce bit doit être mis à 1 pour démarrer la lecture d'un octet. Il est remis à
zéro automatiquement à la fin de la lecture. Ce bit ne peut pas être mis à zéro par une
instruction

33
V.1.1 Procédure de lecture dans l'EEPROM
Pour lire le contenu d’une position de la mémoire EEPROM, on place l’adresse dans le registre
EEADR, on lance l’opération de lecture à l’aide du bit RD du registre EECON1, la donnée désirée
est tout de suite disponible dans le registre EEDATA :
1) Mettre le bit EEPGD à 0 pour pointer sur l'EEPROM de donnée
2) Placer l’adresse relative de la position à lire dans EEADR
3) Mettre le bit RD à 1 pour démarrer la lecture. Ce bit revient à 0 automatiquement tout de
suite après le transfert de la donnée vers EEDATA, (moins d'un cycle)
4) Traiter la donnée disponible dans EEDATA
5) Recommencer au point 2 si on a d'autres données à lire,

V.1.2 Procédure d'écriture dans l'EEPROM
Pour écrire une donnée dans une position de la mémoire EEPROM, on place l’adresse dans le
registre EEADR, la donnée dans le registre EEDATA, on lance l’opération d’écriture à l’aide du bit
WR de EECON1 et du registre EECON2. La donnée présente dans EEDATA est alors copiée dans la
EEPROM mais cette opération prend 10 ms. A la fin de l'écriture le bit WR revient à zéro
automatiquement, le drapeau EEIF est levé ce qui peut déclencher l'interruption EEI si elle a été
validée auparavant :

1) Interdire les interruptions (si elles ont été validées avant : bit INTCON.GIE)
2) Mettre le bit EEPGD à 0 pour pointer sur l'EEPROM de donnée
3) Positionner le bit WREN pour valider l'écriture dans l'EEPROM
4) Placer l’adresse relative de la position à écrire dans EEADR
5) Placer la donnée à é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 démarrer l'opération d'écriture, et attendre qu’il revienne à 0
7) Recommencer au point (4) si on a d'autres données à écrire,

Remarque : Les bits WREN et WR ne peuvent être positionné dans la même instruction. WR ne
peut être positionné que si le bit WREN a été positionné avant.

V.2 La mémoire Programme ou mémoire flash
Cette mémoire de 8 x 1024 mots de 14 bits sert à stocker le programme, mais elle est
accessible par programme et peut donc être utilisée comme une extension de la mémoire EEPROM
de données. 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 mémoire. Cependant il faut savoir que suite à un RESET ou lors de la mise sous tension, le PIC
commence l'exécution à l'adresse 0000
H
. De plus, lorsqu'il y a une interruption, le PIC va à
l'adresse 0004
H
. Il est donc nécessaire de bien organiser le programme si celui-ci utilise des
interruptions.

Le programme exécutable par le PIC est implanté dans la mémoire flash à l'aide d'un
programmateur (hard+soft) sur lequel nous reviendrons dans la suite de ce document.

L'accès à la mémoire flash par les instructions du programme se fait de la même façon que
l'accès à l'EEPROM de données, à l'exception des points suivant :
- Le bit EEPGD doit être placé à 1
- Le registre EEADR (8 bits) seul ne suffit pas à adresser les 8k de mémoire programme, on lui
accole le registre EEADRH dans lequel il faut écrire la partie haute de l'adresse. On obtient
ainsi les 13 bits nécessaires pour adresser 8K.
34
- Le registre EEDATA (8 bits) seul ne suffit pas pour contenir les 14 bits contenus dans une
position de la mémoire programme. On lui accole le registre EEDATH qui contiendra les 6 bits
supérieurs.
- Il faut insérer deux instructions NOP dans les cycles de lecture/écriture. Pendant la phase
d'écriture, le processeur arrête l'exécution des instructions. Il n'est donc pas nécessaire
d'attendre la fin de l'écriture pour continuer car ceci se fait automatiquement, à la fin de
l'écriture, l'exécution reprend à l'instruction qui suit le 2
ème
NOP,

V.2.1 Procédure de lecture dans la mémoire programme
1) Mettre le bit EEPGD à 1 pour pointer sur la mémoire programme
2) Placer l’adresse de la position à lire dans EEADRH:EEADR
3) Mettre le bit RD à 1 pour démarrer 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 données à lire


V.2.2 Procédure d'écriture dan la mémoire programme
1) Interdire les interruptions (si elles ont été validées avant)
2) Mettre le bit EEPGD à 1 pour pointer sur la mémoire programme
3) Positionner le bit WREN pour valider l'écriture dans la mémoire programme
4) Placer l’adresse de la position à écrire dans EEADRH:EEADR
5) Placer la donnée à é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 démarrer l'opération d'écriture
7) Exécuter 2 instructions NOP
8) Recommencer au point 3 si on a d'autres données à écrire
Remarque : après le point (6), ça ne sert à rien d’attendre que WR passe à 0 pour détecter la fin
de l'écriture. Le processeur arrête l'exécution du programme pendant la phase d'écriture dans la
mémoire programme. La boucle de scrutation ne sera exécutée qu'après la fin de l'écriture ce qui
la rend tout à fait inutile. Il suffit de mettre deux instructions NOP avant de continuer.

Exercice 12)
Programme qui écrit l'alphabet majuscule dans la mémoire EEPROM de données à partir de la
position 20h.

Exercice 13) EEPROM-D vers RAM
Programme qui utilise la directive DE pour initialiser les premières positions de l'EEPROM de
données avec la chaîne "BONJOUR CHER AMI". Le programme doit ensuite lire ces caractères (1
par 1) dans l' EEPROM et les copier dans la RAM à partir de la position 110h

Exercice 14) Mem-Prog vers RAM
Programme qui lit 20 positions de la mémoire programme débutant à la position 12FAh et les copie
dans la RAM à partir de la position 110h. Attention :
- Le contenu d’une position mémoire programme permet de remplir 2 positions de la RAM.
- Le débordement de EEADR n’affecte pas EEADRH

35
VI Les interruptions
Une interruption provoque l’arrêt du programme principal pour aller exécuter une procédure
d'interruption. A la fin de cette procédure, le microcontrôleur reprend le programme principal à
l’endroit où il l’a laissé. A chaque interruption sont associés deux bits, un bit de validation et un
drapeau. Le premier permet 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 classées en deux catégories, les interruptions
primaires et les interruptions périphériques. Elles sont gérées par les registres :

INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
PIE1 (bk1) PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
PIR1 (bk0) PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
PIE2 (bk0) - - - EEIE BCLIE - - CCP2IE
PIR2 (bk1) - - - EEIF BCLIF - - CCP2IF
OPTION_REG(bk1) INTEDG
- Toutes les interruptions peuvent être validées/interdites par le bit INTCON.GIE
- Toutes les interruptions périphériques peuvent être validées/interdites par le bit INTCON.PEIE
- Chaque interruption peut être validée/interdite par son bit de validation individuel

En résumé, pour valider une interruption périphérique (par exemple), il faut positionner 3 bits,
GIE, PEIE et le bit individuel de l’interruption.

VI.1 Déroulement d'une interruption
Lorsque l'événement déclencheur d'une interruption intervient, alors son drapeau est
positionné à 1 (levé). Si l'interruption a été validée (bits de validations = 1), elle est alors
déclenchée : le programme arrête ce qu'il est en train de faire et va exécuter la procédure
d'interruption qui se trouve à l'adresse 4 en exécutant les étapes suivantes :
- l'adresse contenue dans le PC (Program Counter) est sauvegardée dans la pile, puis remplacée
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
dérangé pendant l'exécution de la procédure d'interruption).
- A la fin de la procédure d'interruption (instruction RETFIE) :
- le bit GIE est remis à 1 (autorisant ainsi un autre événement)
- le contenu du PC est rechargé à partir de la pile ce qui permet au programme de reprendre là
où il s'est arrêté

Deux remarques importantes sont à faire :

Le drapeau reste à l’état haut même après le traitement de l’interruption. Par conséquent, il faut
toujours le remettre à "0" à la fin de la routine d'interruption sinon l'interruption sera déclenchée
de nouveau juste après l'instruction RETFIE

Seul le PC est empilé automatiquement. Si cela est nécessaire, les registres W et STATUS doivent
être sauvegardés en RAM puis restaurés à la fin de la routine pour que le microcontrôleur puisse
reprendre le programme principal dans les mêmes conditions où il l'a laissé.

36
VI.2 Les sources d'interruption
Interruption : Source d’interruption Validation Flag PEIE
T0I : Débordement Timer 0 INTCON,T0IE INTCON,T0IF non
INT : Front sur RB0/INT INTCON,INTE INTCON,INTF non
RBI : Front sur RB4-RB7 INTCON,RBIE INTCON,RBIF non
ADI : Fin de conversion A/N PIE1,ADIE PIR1,ADIF oui
RCI : Un Octet est reçu sur l'USART PIE1,RCIE PIR1,RCIF oui
TXI : Fin transmission d'un octet sur l'USART PIE1,TXIE PIR1,TXIF oui
SSPI : Caractère émis/reçu sur port série synchrone PIE1,SSPIE PIR1,SSPIF oui
TMR1I : Débordement de Timer 1 PIE1,TMR1IE PIR1,TMR1IF oui
TMR2I :Timer 2 a atteint la valeur programmée PIE1,TMR2IE PIR1,TMR2IF oui
PSPI : Lecture/écriture terminée sur Port parallèle (16F877) PIE1,PSPIE PIR1,PSPIF oui
CCP1I : Capture/comparaison de TMR1 avec module CCP1 PIE1,CCP1IE PIR1,CCP1IF oui
CCP2I : Capture/comparaison de TMR1 avec module CCP2 PIE2,CCP2IE PIR2,CCP2IF oui
EEI : Fin d'écriture en EEPROM PIE2,EEIE PIR2,EEIF oui
BCLI : Collision sur bus SSP en mode I2C PIE2,BCLIE PIR2.BCLIF oui

VI.3 L'interruption INT (Entrée RB0 du port B)
Cette interruption est provoquée par un changement d'état sur l'entrée RB0 du port B quand
elle est programmée en entrée. En plus de son bit de validation INTE et son drapeau INTF, elle est
gérée aussi par le bit INTEDG (OPTION_REG) qui détermine le front sur lequel l'interruption se
déclenche, 1=montant, 0=descendant

VI.4 L'interruption RBI (RB4 A RB7 du port B)
Cette interruption est provoquée par un changement d'état sur l'une des entrées RB4 à RB7 du
port B, Le front n'a pas d'importance. Les bits associés sont RBIE (validation) et RBIF (drapeau).
ATTENTION : Le drapeau RBIF ne peut être remis à zéro sans la lecture préalable de PORTB
(MOVF PORTB,w). Si on ne veut pas modifier le contenu de W, on peut copier PORTB sur lui-
même (MOVF PORTB,f).

VI.5 Les autres interruptions
Les autres interruptions seront abordées au moment de l'étude des modules qui les
déclenchent.


Exercice 15) (int.asm)
Programme qui utilise l’interruption INT comme suit :
Chaque fois que l’entrée RB0 passe de 1 à 0, la LED branchée sur RB1 clignote 4 fois au rythme de
la ½ seconde

Exercice 16) (div-freg-rbi.asm)
Ecrire un programme qui réalise une division de fréquence par 5. Le signal d'entrée est appliqué
sur l'entrée RB4. Le signal de sortie est généré sur la sortie RB1. On utilisera l'interruption RBI
pour détecter les transitions du signal d'entrée.




37
VII Les Timers
VII.1 Le Timer TMR0
C’est un compteur 8 bits ayant les caractéristiques suivantes :
- Il est incrémenté en permanence soit par l’horloge interne Fosc/4 (mode timer) soit par une
horloge externe appliquée à 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 appliquée à 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'incrémente.
o T0SE = 0  incrémentation sur fronts montants
o T0SE = 1  incrémentation sur fronts descendants
- Quelque soit l'horloge choisie, on peut la passer dans un diviseur de
fréquence programmable (prescaler) dont le rapport DIV est fixés par
les bits PS0, PS1 et PS2 du registre OPTION_REG (tableau ci-contre).
L'affectation ou non du prédiviseur se fait à l'aide du bit PSA du
registre OPTION_REG
o PSA = 0  on utilise le prédiviseur
o PSA = 1  pas de prédiviseur (affecté au chien de garde)
- Le contenu du timer TMR0 est accessible par le registre qui porte le
même nom. Il peut être lu ou écrit à n'importe quel moment. Après une écriture, le timer ne
comte pas pendant deux cycles machine.
- Au débordement de TMR0 (FF  00), le drapeau INTCON.T0IF est placé à 1. Ceci
peut déclencher l'interruption T0I si celle-ci est validée

OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0



En résumé, chaque fois que le compteur complète un tour, le drapeau T0IF se lève. Si on note T
H

la période de l'horloge source, T
0
l'horloge de TMR0 et T
F0
le temps qui sépare 2 levés de drapeau
successifs :
- Sans prédiviseur : T
F0
= 256 T
0
= 256 T
H

- Avec prédiviseur : T
F0
= 256 T
0
= 256 x (DIV x T
H
)
- Avec prédiviseur et compteur N dans le programme on obtient : NxT
F0
= N x 256 x (DIV x T
H
)

Exercice 17) Clignoter LED / TMR0
PIC doté d'un quartz de 4 MHz. Programme qui fait clignoter une LED branchée 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
PS2 PS1 PS0 Div
0 0 0 2
0 0 1 4
0 1 0 8
0 1 1 16
1 0 0 32
1 0 1 64
1 1 0 128
1 1 1 256
Fosc/4
TMR0
Prédiviseur
programmable
PS0 PS1 PS2
Horloge
à quartz
Fosc
÷ 4
RA4
T0CS
0
0
1
1
T0SE
PSA
T0IF
0
1
T
H

T
F0

T
0

T
F0
= 256 x (DIV x T
H
)
38
VII.2 Le Watchdog Timer WDT (Chien de garde)

C’est un compteur 8 bits incrémenté en permanence (même si le µC est en mode sleep) par
une horloge RC intégrée indépendante de l'horloge système. Lorsqu’il déborde, (WDT TimeOut),
deux situations sont possibles :
- Si le µC est en fonctionnement normal, le WDT time-out provoque un RESET. Ceci permet
d’éviter de rester planté en cas de blocage du microcontrôleur par un processus indésirable
non contrôlé
- Si le µC est en mode SLEEP, le WDT time-out provoque un WAKE-UP, l'exécution du
programme continue normalement là où elle s'est arrêtée avant de rentrer en mode SLEEP.
Cette situation est souvent exploitée pour réaliser des temporisations

L'horloge du WDT a une période voisine de 70 µs ce donne un Time-Out
toutes les 18 ms. Il est cependant possible d'augmenter cette durée en faisant
passer le signal Time-Out dans un prédiviseur programmable (partagé avec le
timer TMR0). L'affectation se fait à l'aide du bit PSA du registre OPTION_REG
o PSA = 1  on utilise le prédiviseur
o PSA = 0  pas de prédiviseur (affecté à TMR0)

Le rapport du prédiviseur est fixé par les bits PS0, PS1 et PS2 du registre
OPTION_REG (voir tableau ci-contre)

L'utilisation du WDT doit se faire avec précaution pour éviter la
réinitialisation (inattendue) répétée du programme. Pour éviter un WDT timeOut lors de l'exécution
d'un programme, on a deux possibilités :
- Inhiber le WDT d'une façon permanente en mettant à 0 le bit WDTE dans l'EEPROM de
configuration
- Remettre le WDT à 0 périodiquement dans le programme à l'aide de l'instruction CLRWDT pour
éviter qu'il ne déborde



PS2 PS1 PS0 Div
0 0 0 1
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128
WDT
Prédiviseur
programmable
PS0 PS1 PS2
Horloge
WDT
0 0
1 1
PSA
WDT timeout
39
VII.3 Le Timer TMR1
TMR1 est un Timer/Compteur 16 bits accessible en lecture/écriture par l'intermédiaire 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)



- TMR1 peut fonctionner dans 3 modes différents :
- Timer Synchrone (horloge interne)
- Compteur Synchrone (horloge externe)
- Compteur Asynchrone (horloge externe)

Le bit de contrôle TMR1CS détermine le fonctionnement en Timer ou en Compteur et le bit
T1SYNC détermine le mode de fonctionnement en synchrone ou en asynchrone

- TMR1 peut être arrêté/démarré à l'aide du bit TMR1ON
- TMR1 peut être RAZ à l'aide du module de capture/comparaison CCP
- TMR1 peut être précédé d'un prédiviseur (Prescaler) qui peut diviser la fréquence par 1, 2, 4
ou 8 selon la valeur des bits T1CKPS1 et T1CKPS0
- A son débordement (FFFFh ÷ 0000h) le drapeau PIR1.TMR1IF (bank0) est positionné ce qui
peut déclencher l'interruption périphérique TMR1I si elle est validée par son bit de validation
PIE1.TMR1IE (bank1).


VII.3.1 Le mode Timer
Dans ce mode, TMR1 est incrémenté par l’horloge système Fosc/4 éventuellement prédivisée.
Le bit de synchronisation n'a pas d'effet car l'horloge Fosc/4 est toujours synchronisée sur l'horloge
système.

VII.3.2 Le mode Compteur
Dans ce mode, TMR1 est incrémenté à chaque front montant de l'horloge externe T1CKI
(RC0) ou l'horloge dédiée générée par l’oscillateur T1OSC à condition de positionner le bit
T1OSCEN à 1 et de brancher un quartz entre les broche RC0 et RC1.
En mode compteur, RC0 et RC1 sont automatiquement configurées en entrée, on n’a pas
besoin de configurer les bits TRISC,0 et TRISC,1

0
1 TMR1
16 bits
TMR1IF
SYNC
Prédiviseur
DIV=1,2 4,8
Horloge
Système
FOSC/4
T1OSC
T1SYNC
TMR1ON
TMR1CS
T1OSCEN
RC0
RC1
0
1
CLR
CCP
T1CON
T
F1

T
1

T
H

T
F1
= 65536 x T
1
= 65536 x (DIV x T
H
)
40
- En fonctionnement Synchrone, l'horloge externe (éventuellement prédivisée) n'incrémente
pas directement le timer mais elle est synchronisée sur l'horloge système ce qui peut entraîner
un délai de l'ordre de 1 cycle machine. Dans cette configuration

- En fonctionnement Asynchrone, l'horloge externe (éventuellement prédivisée) incrémente le
timer indépendamment de l'horloge système.

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 arrêté
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 système (Fosc/4) : mode timer
1 : Horloge externe : mode compteur

TMR1ON : Démarrer arrêter le timer
0 : Timer stoppé
1 : Timer en fonctionnement

En résumé :
Le temps qui sépare 2 levés de drapeau TMR1IF est : T
F1
= 65536 x T
1
= 65536 x (DIV x T
H
)
Si on ajoute un compteur N dans le programme on obtient un temps = N x T
F1


Exercice 18) Clignoter LED / scrutation de TMR1
Clignoter une LED reliée à RE0. La temporisation voisine de 0.5s sera réalisée à l'aide de TMR1 par
scrutation du drapeau TMR1IF

Exercice 19) Clignoter LED / interruption TMR1
Clignoter une LED reliée à RD0. La temporisation voisine de 0.5s sera réalisée à l'aide de TMR1 est
son interruption TMR1I



41
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 déclencher un
événement au moment de l’égalité.

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 contrôle 8 bits CCP1CON.
- Un prédiviseur permettant de filtrer les événements déclencheurs de capture venant de la
broche RC2

VII.4.1.1 Le mode Capture


Dans ce mode le contenu de TMR1 est copié dans CCPR1 chaque fois qu'un événement
intervient sur la broche RC2. Le choix de l'événement déclencheur se fait en programmant le
prescaler à l’aide des bits 0 à 3 du registre de contrôle CCP1CON. On a le choix parmi les
événements suivants :
- A chaque front descendant
- A chaque front montant (prescaler 1:1)
- A chaque 4
ème
front montant (prescaler 1:4)
- A chaque 16
ème
front montant (prescaler 1:16)

A la fin de la capture, le drapeau CCP1IF est positionné, l'interruption périphérique associée
est déclenchée si elle a été validée.

Plusieurs aspects sont à noter comme :
- Si on veut déclencher la capture par un signal externe, celui-ci doit être appliqué sur la proche
RC2 qui doit être configurée en entrée par le bit TRISC,2
Prescaler
1, 4 ou 16
TMR1H TMR1L
CCPR1H CCPR1L
chargement
CCP1IF
CCP1CON
CCPR1
Registre de capture et comparaison
Registre de control
TMR1
RC2
42
- Si on veut déclencher 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 indésirable peut intervenir.
L'utilisateur doit veiller à masquer l'interruption CCP1I avant de procéder à cette modification
et de baisser le drapeau CCP1IF après la modification.
- En mode Sleep, le prescaler et le drapeau CCP1IF restent opérationnels. le positionnement du
drapeau peut déclencher 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 : utilisés 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 arrêté (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 d’impulsion), 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 différentes actions sont accomplies selon le mode défini
par les bits de configuration CCP1M3:CCP1M0



- 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.
TMR1H TMR1L
CCPR1H CCPR1L
CCP1IF
RC2
Logique
de
control
Comparateur
(RAZ)
CCP1Mx
horloge
43

- 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 d’origine 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 utilisée.

- 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 d’interchanger 1 et 2 et de constater les
points suivants :
- CCP2 est associé à la broche RC1
- Il est géré par le registre de control CCP2CON
- Son registre de capture/comparaison est CCPR2 = CCPR2H:CCPR2L
- En mode comparaison 1011, A l’égalité :
o le drapeau CCP2IF passe à 1
o RAZ de TMR1
o envoi d’un GO vers le convertisseur analogique numérique



Exercice 20) générer signal TMR1/CCP1
Programme qui génère le signal ci-dessous sur la sortie RE0 en utilisant TMR1 associé à CCP1



500 µs 500 µs
44
VII.5 Le Timer TMR2



TMR2 est un timer 8 bits accessible en lecture écriture constitué de :
- un registre de control T2CON (bank0)
- un prédiviseur (1,4,16)
- un registre de période PR2 (bank1) accessible en lecture/écriture
- un comparateur,
- un postdiviseur (1 à 16)

- TMR2 est incrémenté par l'horloge interne Fosc/4. Il commence à 0 et quant il atteint la valeur
du registre PR2, le comparateur génère un signal qui :
 Remet TMR2 à 0
 incrémente le postscaler qui fonctionne comme un diviseur de fréquence
Comme le comptage commence à 0, si PR2=N, alors le comparateur annonce une égalité tous
les N+1 coups d’horloge
- Au débordement du postscaler, le drapeau PIR1.TMR2IF est positionné, l'interruption
correspondante et déclenchée si elle est validée
- TMR2 est remis à zéro à chaque RESET
- Le prescaler et le postscaler sont initialisés à 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 :


En résumé, Si on note :
DIV1 : rapport du prédiviseur
DIV2 : Rapport du postdiviseur
P : Valeur placée dans le registre PR2
Tsy : période de l'horloge système,

la périodicité du drapeau TMR2IF est donnée par :

TF2 = DIV1 x (P+1) x DIV2 x Tsy .


45
Le registre 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 : démarrer arrêter TMR2
0 : TMR2 off
1 : TMR2 on

T2CKPS1,T2CKPS0 : ratio du prescaler
00 : prédiviseur par 1
01 : prédiviseur par 4
1x : prédiviseur par 16

REMARQUE :
Dans le cas de la scrutation du drapeau TMR2IF par les 2 instructions suivantes :
ici btfss PIR1,TMR2IF ; attendre drapeau
goto ici
Les temporisations obtenues peuvent être erronées à cause de l’instruction goto qui prend
deux cycles pour s’exécuter ce qui peut retarder la détection du drapeau.

La solution est d’utiliser l’interruption liée au drapeau TMR2IF, dans ce cas, les
temporisations obtenues sont exactes


Exercice 21)
On dispose d'un PIC doté d'un quartz de 4 MHz. Donner le programme qui génère le signal ci-
dessous sur la sortie RB0 en utilisant l'interruption TMR2I associée à TMR2.






Exercice 22)
On dispose d'un PIC doté d'un quartz de 4 MHz. Donner le programme qui fait clignoter une LED
reliée à RE0. La temporisation voisine de 0.5s est réalisée à l'aide de TMR2 :
1) Par scrutation du drapeau TMR2IF
2) En utilisant l’interruption TMR2I

30 µs 30 µs
46
VIII Le module de conversion A/N



Ce module est constitué d'un convertisseur Analogique Numérique 10 bits dont l'entrée
analogique peut être connectée sur l'une des 8 (5 pour 16F876) entrées analogiques externes. On
dit qu'on a un CAN à 8 canaux. Les entrées analogiques doivent être configurées en entrée à l'aide
des registres TRISA et/ou TRISE. L’échantillonneur bloqueur est intégré, il est constitué d’un
interrupteur d’échantillonnage et d’une capacité de blocage de 120 pF.
Les tensions de références permettant de fixer la dynamique du convertisseur. Elles peuvent
être choisies parmi Vdd, Vss, Vr+ ou Vr-


Le 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
11 : Oscillateur RC dédié au CAN

CHS2:CHS0 : choix de l'entrée 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)

111
110
101
100
011
CHS2 CHS1 CHS0
Vdd
Vss
ADRESL
ADCON0
ADCON1
DIV
fosc
010
001
000
RA0
RA1
RA2
RA3
RA5
RE0
RE1
RE2
Vref+
Vref-
H
CAN
GO
ADRESH
RA3
RA2
47
GO/DONE : Une conversion démarre quand on place ce bit à 1. A la fin de la conversion, il est
remis automatiquement à zéro. 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 résultat dans les registre ADRESH et ADRESL

ADRESH ADRESL
1 : justifié à droite 000000XX XXXXXXXX
0 : justifié à gauche XXXXXXXX XX000000

PCFG3:PCFG0 : configuration des E/S et des tensions de références. Les 5 broches de PORTA et
les 3 de PORTE peuvent être configurés soit en E/S digitales, soit en entrées
analogiques. RA2 et RA3 peuvent aussi être configurées en entrée de référence.

PCFG3:
PCFG0
RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0 V
REF+
V
REF-
A/R/N
0000 A A A A A A A A V
DD
V
SS
8/0/0
0001 A A A A V
REF+
A A A RA3 V
SS
7/1/0
0010 N N N A A A A A V
DD
V
SS
5/0/3
0011 N N N A V
REF+
A A A RA3 V
SS
4/1/3
0100 N N N N A N A A V
DD
V
SS
3/0/5
0101 N N N N V
REF+
N A A RA3 V
SS
2/1/5
011x N N N N N N N N V
DD
V
SS
0/0/8
1000 A A A A V
REF+
V
REF-
A A RA3 RA2 6/2/0
1001 N N A A A A A A V
DD
V
SS
6/0/2
1010 N N A A V
REF+
A A A RA3 V
SS
5/1/2
1011 N N A A V
REF+
V
REF-
A A RA3 RA2 4/2/2
1100 N N N A V
REF+
V
REF-
A A RA3 RA2 3/2/3
1101 N N N N V
REF+
V
REF-
A A RA3 RA2 2/2/4
1110 N N N N N N N A V
DD
V
SS
1/0/7
1111 N N N N V
REF+
V
REF-
N A RA3 RA2 1/2/5



VIII.1 Déroulement d’une Conversion
Le PIC dispose d’un échantillonneur bloqueur intégré constitué d'un interrupteur S, d'une
capacité de maintien C=120 pF et d’un convertisseur Analogique numérique 10 bits. Pendant la
conversion, la tension Ve à l'entrée du convertisseur A/N doit être maintenue constante.
Au départ il faut commencer par faire l’acquisition du signal en fermant l’interrupteur S, ceci
se fait à l’aide du registre ADCON0, soit au moment de la validation du module par le bit ADON
soit après un changement de canal si ADON est déjà positionné.
Après la fin de l’acquisition, on peut démarrer une conversion en positionnant le bit
GO_DONE, l'interrupteur S s’ouvre pour assurer le blocage de la tension. La conversion commence,
elle est réalisée en 12 T
AD,
à la fin, le bit GO_DONE repasse à 0, le drapeau ADIF passe à 1 et le
résultat est chargé dans les registres ADRESL et ADRESH. Le module met 2 T
AD
supplémentaires
pour fermer l'interrupteur S ce qui démarre une nouvelle phase d’acquisition pendant laquelle la
tension Ve rejoint la tension analogique d'entrée Va. Le temps d'acquisition dépend de la
constante de temps RC, R étant la somme des résistances entre le module de conversion et la
source de la tension analogique. Après la fin de l’acquisition, on peut démarrer une nouvelle
conversion et ainsi de suite

48

VIII.2 Temps de conversion
Le temps de conversion est égal à 12 T
AD

T
AD
est le temps de conversion d'un bit, il dépend de la fréquence du quartz et du prédiviseur (div)
choisi : T
AD
= div x 1/fosc. Le choix de div doit être ajusté pour que T
AD
soit ≥ à 1,6 µs

\Quartz
Div \
20Mhz 5Mhz 4Mhz 2Mhz
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 grisées sont hors plage d’utilisation)

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

soit un temps de conversion : T
CONV
= 24 µs

VIII.3 Temps d'acquisition

Temps d'acquisition = T
ACQ
= Tc + CT +2 µs

Tc : temps de charge du condenseur = (Ric+Rss+Rs) C Ln(2047)
Ric = Résistance d’interconnexions, elle est inférieure à 1k
Rss = Résistance du l’interrupteur S (Sampling switch), elle dépend de la tension
d’alimentation Vdd. Elle est égale à 7kΩ pour Vdd=5V
Rs : Résistance interne de la source du signal analogique. Microchip recommande de ne pas
dépasser 10 kΩ
C : Capacité de blocage = 120 pF

CT : Coefficient de température = (Tp -25°C) 0.05 µs/°C
Tp = Température Processeur, voisine de 45°C en temps normal

Exemple :
Ric = 1k, Rss = 7k, Rs = 2k, Tp = 45 °C :
Tc = 10k x 120pF x Ln(2047) = 9 µs
CT = 20 x 0.05 µs = 1 µs
T
ACQ
= 2 + 9 + 1 µs = 12 µs
T
acq

2Tad
S
CAN
120 pF
Va
Ve
Va
Ve
GO/DONE
nous automatique
12Tad
49
VIII.4 Fréquence d'échantillonnage
Si on veut échantillonner un signal variable, La période d'échantillonnage Te doit être
supérieur ou égale à T
emin
= T
CONV
+ 2 Tad + T
ACQ


Avec les exemple précités, on aura la péride d’échantillonnage min T
emin
= 24 + 2 + 12 = 40 µs
La fréquence d’échantillonnage max est donc femax = 1/T
emin
= 25 kHz
Si on tient compte de la règle de Shannon (fe > 2 fmax), on constate que l’on peut échantillonner
des signaux dont la fréquence ne dépasse pas 12 KHz.

VIII.5 Valeur numérique 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 = (V
ref+
- V
ref-
)/1024
Va = tension analogique à convertir
N = valeur numérique obtenue,

N = valeur entière de (Va – V
ref-
) / Q

Avec Vref- = masse, on obtient N = int (Va / Q)

exemple :
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 entrée de PORTE sont utilisées, le configurer en mode normal à l'aide du bit PSPMODE
2) Configurer les E/S en Analogique/Numérique/Référence (ADCON1)
3) Configurer les entrées analogiques en entrées (TRISA, TRISE)
4) Définir l'horloge de conversion à l'aide du diviseur DIV dans ADCON0
5) Choisir le canal à convertir et valider le module (ADCON0)
6) Attendre le temps d’acquisition (12 µs )
7) Lancer la conversion, GO = 1 (ADCON0)
8) Attendre fin de conversion, GO = 0 ou drapeau ADIF=1
9) Traiter le résultat
10) Si l'on désire prendre d'autres mesures, recommencer au point 7 en faisant attention aux
timings

Exercice 23)
PIC doté d'un quartz de 4 MHz. Programme qui converti la tension appliquée à RA0 et
recopie le résultat dans la RAM à la position 70h et 71h

Exercice 24)
Sur un PIC doté d'un quartz de 4 MHz, Donner le programme qui fait l'acquisition de 40
échantillons du signal appliqué sur RA0, et recopie les résultats dans la RAM à partir de la
position 190h. L'échantillonnage se fera à la vitesse la plus rapide possible

Exercice 25)
Refaire l’exercice précédent avec une fréquence d’échantillonnage fe = 8000Hz. Utiliser le timer
2 pour ajuster la période d'échantillonnage.
50
IX L'USART
L'USART (Universal Synchronous Asynchronous Receiver Transmitter) est l'un des deux
modules de communication série dont dispose le PIC 16F876/877. L'USART peut être configuré
comme système de communication asynchrone full duplex ou comme système synchrone half
duplex (non étudié).
La communication se fait sur les deux broches RC6/TX et RC7/RX qui doivent être configurés
toutes les deux en ENTREE par TRISC. (oui, j’ai 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 reçus dans l'ordre ci-dessous :
- 1 bit de START (toujours 0)
- 8 ou 9 bits de donnée (LSB d'abord)
- 1 bits de STOP (toujours 1)
- La transmission se fait sur la broche RC6/TX et la réception 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 fixée par le registre SPBRG et le bit TXSTA.BRGH
- La parité n'est pas gérée d'une façon matérielle, elle peut être gérée par soft si son utilisation
est nécessaire.
- L'accès au port en lecture ou écriture se fait par les registres tampon RCREG et TXREG. La
transmission et la réception se font par deux registres à décalage, un pour la transmission
(TSR) et un pour la réception (RSR). L'accès au registres tampon peut se faire alors que les
registre à décalage sont en train de transmettre/recevoir une donnée.
- Les drapeaux PIR1.RCIF et PIR1.TXIF sont très utiles pour gérer la lecture/écriture dans le
port. RCIF est positionné quand le port a terminé une réception et TXIF est positionné quand
le buffer de transmission TXREG est "vide".

IX.2 Le port en transmission


Le contrôle de la transmission se fait par le registre TXSTA

CSRC TX9 TXEN SYNC — BRGH TRMT TX9D

CSRC : non utilisé en mode asynchrone
51
TX9 et TX9D : Pour utiliser le mode 9 bits il faut positionner le bit TX9. Le 9
ème
bit doit être écrit
dans TX9D avant d'écrire les 8 bits de données dans TXREG
TXEN : permet de valider ou interdire la transmission
SYNC : 0 ÷ mode asynchrone, 1 ÷ mode synchrone
BRGH : sélectionne le mode haut débit du générateur de baud rate
TRMT : Indicateur de l’activité du registre à décalage de transmission TSR
1 ÷ TSR libre, 0 ÷ TSR en activité

Déroulement 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 n’est pas occupé, alors la donnée D est transférée
immédiatement 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.
- Le registre de transmission TSR est occupé à transmettre un octet qui lui été donné
auparavant. La donnée D attend dans TXREG, et le drapeau TXIF reste à 0 jusqu’à ce que TSR
termine de transmettre l’octet précédent. La donnée D est alors transférée 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.


Figure IX-1 : illustration de la transmission de deux octet successifs D0 et D1
- A la mise sous tension, tous les drapeaux sont à zéro y compris TXIF. Dès qu’on valide la
transmission en positionnant le bit TXEN, le drapeau TXIF passe automatiquement à 1, sauf si
on écrit d’abord un octet dans TXREG et on valide ensuite le bit TXEN, dans ce cas, dès la
validation de TXEN, le contenu de TXREG est transféré dans TSR qui commence sa
transmission et le drapeau TXIF passe à 1.
- Comme on vient de le voir, le drapeau TXIF est géré automatiquement, on ne peut pas le
modifier directement par programme.


IX.2.1 Les étapes de transmission (sans interruption, mode 8 bits)
1) S’assurer que l’interruption TXI n’est pas validée
2) Configurer la broche TX/RC6 en entrée
3) Configurer le registre TXSTA (mode 8 bits, valider transmission, asynchrone, BRGH)
4) Initialiser le registre SPBRG pour définir la vitesse de transmission
5) Valider le port avec le bit RCSTA.SPEN
6) Vérifier que le drapeau PIR1.TXIF=1 c.à.d TXREG est vide
7) Placer la donnée à transmettre dans le registre TXREG
8) recommencer au point 6) tant qu’on a des données à transmettre

écriture D0
dans TXREG
chargement
TXREGTSR
TXIF
Transmission D0 Transmission D1
écriture D1
dans TXREG
chargement
TXREGTSR
52
IX.3 Le port en réception


- La réception est validée par le bit CREN
- La réception d'un octet démarre à la réception du START bit qui commence toujours par une
transition 1 ÷ 0
- A la réception du stop bit le contenu du registre à décalage de réception RSR est recopié dans
le registre tampon de réception RCREG. Le drapeau RCIF (PIR1.5) est positionné, l'interruption
associée est déclenchée si elle est validée. Le drapeau RCIF est remis à zéro 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 3
ème
dans le registre à décalage RSR. A
la fin de la réception du 3
ème
octet, si RCREG est toujours plein, alors le dernier octet reçu est
perdu et le bit OERR (Overrun ERRor bit) est positionné ce qui provoque l'arrêt des transfert
du registre à décalage RSR vers le buffer RCREG. Pour reprendre la réception il faut réinitialiser
le module de réception en mettant à 0 puis à 1 le bit CREN ().
- Le drapeau PIR1.RCIF ne passe à 0 que quand la pile RCREG est vide
- Si on reçoit 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 bufferisés, Il doivent être lu
dans le registre RCSTA avant la lecture du registre RCREG.

Le contrôle de la réception se fait par le registre RCSTA

SPEN RX9 SREN CREN ADDEN FERR OERR RX9D

SPEN : Validation du port série (1 = validé, 0 = Inhibé)
RX9 : Validation du mode 9 bits (1 ÷ mode 9 bits, 0 ÷ mode 8 bits)
SREN : validation de réception d'u seul octet (non utilisé en mode asynchrone)
CREN : Validation du mode réception continue (1 ÷ validé, 0 ÷ inhibé)
ADDEN : validation du mode détection 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 débordement du buffer de réception, lecture seule. (Voir au dessus)
RX9D : En mode 9 bits, le 9
ème
bit est reçu ici
53
IX.3.1 Les étapes de réception (sans interruption, mode 8 bits)
1) S’assurer que l’interruption RCI n’est pas validée
2) Configurer la broche RX/RC7 en entrée
3) Initialiser le registre SPBRG pour définir la vitesse de communication
4) Configurer le registre TXSTA (asynchrone, BRGH)
5) Configurer le registre RCSTA (validation port, mode 8 bits, valider réception continue)
6) Attendre que drapeau RCIF passe à 1 ce qui annonce la fin de réception d'un octet
7) Lire l’octet reçu dans le registre RCREG
8) recommencer au point 6) tant qu’on a des données à recevoir

IX.4 La vitesse de communication
La vitesse de communication est déterminée par le générateur de rythme BRG (Baud Rate
Generator) qui est dédié au port série. La vitesse de communication est définie à l'aide du registre
de control SPBRG et du bit BRGH (TXSTA.2) qui quadruple la vitesse quand il est positionné. Il
préférable d'utiliser le mode haute vitesse (BRGH=1) car permet d'obtenir une meilleur précision
sur la fréquence.

baud
1) (SPBRG 64
Fosc 4
vitesse
BRGH
+ ×
×
= 1 -
vitesse 64
Fosc 4
SPBRG
BRGH
×
×
=
Tableau IX.1 : vitesse de transmission BRGH = 0

FOSC 1000000 4000000 8000000 20000000

SPBRG Baude err% SPBRG Baude err% SPBRG Baude err% SPBRG Baude err%
2400 25 2404 0,17 103 2404 0,17 207 2404 0,17
4800 12 4808 0,17 51 4808 0,17 103 4808 0,17
9600 6 8929 6,99 25 9615 0,16 51 9615 0,16 129 9615 0,16
19200 2 20833 8,51 12 19231 0,16 25 19231 0,16 64 19231 0,16
28800 1 31250 8,51 8 27778 3,55 16 29412 2,13 42 29070 0,94
33600 1 31250 6,99 6 35714 6,29 14 33333 0,79 36 33784 0,55
Tableau IX.2 : vitesse de transmission BRGH = 1
Exercice 26)
On dispose d'un PIC doté d'un quartz de 4MHz.
Donner le programme qui transmet l'alphabet sur le port série à 19200 baud avec un délai voisin
de ½ s entre les caractères.

Exercice 27)
On dispose d'un PIC doté d'un quartz de 10MHz.
Donner le programme qui lit 40 caractères sur le port série (9600 baud) et les stocke dans la RAM
à partir de la position 190h.

FOSC 1000000 4000000 8000000 20000000

SPBRG Baude err% SPBRG Baude err% SPBRG Baude err% SPBRG Baude err%
2400 6 2232 7 25 2404 0,17 51 2404 0,17 129 2404 0,17
4800 2 5208 8,5 12 4808 0,17 25 4808 0,17 64 4808 0,17
9600 1 7813 18,61 6 8929 6,99 12 9615 0,16 32 9470 1,35
19200 0 15625 18,62 2 20833 8,51 6 17857 6,99 15 19531 1,72
54
X Le module MSSP (Master Synchronous Serial Port)
Le MSSP est une des deux modules de communication série du PIC 16F876/877. Il permet
d'échanger des données en mode synchrone avec d'autres circuits qui peuvent être des
microcontrôleurs, des mémoires EEPROM série, 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 très brièvement Le
standard I2C
Le bus I²C permet de faire communiquer entre eux des composants électroniques très divers
grâce à seulement 3 fils : Un signal de donnée (SDA), un signal d'horloge (SCL), et un signal de
référence électrique ( Masse ).
Comme les lignes SDA et SCK sont utilisées 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 détruire les deux composants. Pour éviter ce
problème, 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 résistance 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 données entre les deux composants.



Un bus I2C peut être relié à plusieurs circuits, mais pendant une communication, un des
circuits est le maître, c'est lui génère l'horloge et initie les séquences de transmission, l'autre est
l'esclave, il subit l'horloge du maître sur la ligne SCK mais il peut tout de même recevoir et émettre
des données sur la ligne SDA. Chaque esclave a une adresse, au début d'une séquence de
communication, le maître qui initie la séquence envoie l'adresse du slave avec lequel il désire
communiquer, celui-ci reconnaît son adresse et répond, les autres slaves (s'il y en a) restent
muets.

lecture
Ecriture
lecture
Ecriture
Vcc
55



Certains circuits sont fabriqués pour être des masters, d'autres des slaves et d'autres peuvent
être soit l'un soit l'autre.

Pour prendre le contrôle du bus, il faut que celui-ci soit au repos ( SDA et SCL à '1'). Lorsqu'un
circuit prend le contrôle du bus, il en devient le maître. C'est lui qui génère le signal d'horloge et
c'est lui qui initie les séquences d'échange.

X.1.1 start condition
Au début d'une séquence d'échange, le master génère un start condition (S) avant de
commencer l'échange de données. Au repos, les lignes SCL et SDA sont à l'état haut (relâchées).
Pour générer un start, le master place d'abord la ligne SDA à 0, ensuite il place SCK à 0.




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 donnée sur SDA


X.1.3 Stop condition
A la fin d'une séquence d'échange, le master génère un stop condition (P) après 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
SCK
bit à transmettre
moment de lecture par le
récepteur
S
SDA
SCK
SDA SCK

Maître ou Esclave
SDA SCK

Maître ou Esclave
SDA SCK

Maître ou Esclave
Vcc Vcc
56



X.1.4 Remarque sur le Start et le Stop condition
Une séquence 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 réception. Il est placé par le circuit qui reçoit sur la ligne SDA
juste après la réception du 8
ème
bit. C'est l'émetteur qui le lit de la même façon qu'on lit un bit
ordinaire. SDA=0  acknowledge positif (ACK), SDA=1  acknowledge négatif (NOACK),




En conclusion, l'échange d'un octet nécessite 8 + 1 = 9 impulsions d’horloge sur la pin SCL.




X.1.6 L'adresse et le bit R/W
Comme on peut brancher plusieurs composant sur un bus I2C, il est nécessaire de définir une
adresse unique pour chacun. Elle est codée sur 7 bits A
6
A
5
A
4
A
3
A
2
A
1
A
0
. Le master qui démarre
une séquence d'échange envoie l'adresse du slave juste après le start condition. Comme il y a
seulement 7 bits, le master envoie à la 8
ème
position le bit R/W pour indiquer au slave s'il désire
une émission (R/W=0) ou une réception (R/W=1).


Le standard I2C supporte maintenant l'adressage sur 10 bits. Comme avec 7 bits on peut
adresser jusqu'à 128 composants, cela nous suffira largement.

S
SDA
SCK
Acknowledge
R/W A
6
A
5

A
4
A
0
A
1
A
2
A
3

SDA
SCK
Acknowledge
D
7
D
6
D
5
D
4
D
0
D
1
D
2
D
3

SDA
SCK
ACK NOACK
P
SDA
SCK
57
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 (données). Ces broches doivent être configurées en ENTREE à
l'aide du registre TRISC et doivent être munie de résistances de pull-up externes nécessaire au
fonctionnement I2C.

Les fréquences d'horloges supportées sont 100 kHz, 400 kHz et 1 MHz

L'accès au module en lecture et écriture se fait à l'aide du registre tampon (buffer) SSPBUFF.
La transmission et la réception se fait à l'aide du registre à décalage SSPSR auquel nous n’avons
pas directement accès




X.2.1 Transmission d’un octet
Pour transmettre un octet, il suffit de le copier dans le registre SSPBUF, et le module MSSP
s’occupe du reste. Au moment de l’écriture 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 d’interruption
PIR1.SSPIF passe à 1.
Le bit BF apparaît donc comme un bit très important, c’est 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 Réception d’un octet
A la fin de la réception d'un octet, celui-ci est transféré dans SSPBUF, l’indicateur SSPSTAT.BF
et le drapeau d’interruption PIR1.SSPIF passent à 1. BF repasse automatiquement à 0 au moment
de la lecture de SSPBUF alors que SSPIF soit être remis à 0 par soft.
Si le PIC termine la réception d'un octet avant que l'octet précédent 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, l’octet arrivé est perdu.


X.2.3 Les registres de configuration
Le control du module se fait à l'aide des registres :
SSPCON : registre de control (BANK0)
SSPCON2 : registre de control (BANK1)
SSPSTAT : registre d'état (BANK1)
SSPADD : registre d'adresse (BANK1)


SSPSR
SCK/RC3
SDA/RC4
SSPBUF SSPCON
SSPCON2
SSPSTA
SSPADD
58
X.2.3.1 Le registre SSPSTAT :

SSPSTAT SMP CKE D/A P S R_W UA BF

SMP : Control de slew rate : 1 pour 100 kHz et 1 MHz, 0 pour 400 kHz
CKE : Control des niveaux de tension à l'entrée, 0 : I2C, 1 : SMBUS
D/A : Indicateur d'état, 0 : dernier octet émis/reçu = adresse, 1 : dernier octet émis/reçu =
donnée
P : Indicateur de Stop Condition. Ce bit passe à 1 quand on détecte un Stop Condition. Il
est automatiquement remis à 0 quand un autre événement et reçu.
S : Indicateur de Start Condition. Ce bit passe à 1 quand on détecte un Start Condition. Il
est automatiquement remis à 0 quand un autre événement et reçu
R_W : 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
UA : Indicateur utilisé en mode esclave avec adressage 10 bits pour nous informer qu'il faut
placer la 2
ème
partie de l'adresse dans le registre adresse. Ce dernier ayant seulement 8
bits, l'adresse est traitée en 2 parties. Ce bit est remis automatiquement à zéro après
l'écriture dans SSPADD.
BF : Indicateur sur l'état du registre SSPBUF.

X.2.3.2 Le registre SSPCON :

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 séquence 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
précédant. Ce bit doit être remis à zéro par programme.

SSPOV : Overflow, cet indicateur d'erreur est positionné quand une nouvelle donnée est reçue
alors que le registre SSBUF n'est pas encore lu. Dans ce cas la nouvelle donnée est
perdue. Ce bit doit être remis à zéro par programme.

SSPEN : Validation du module MSSP (1 = validé)

CKP : Utilisé en mode I2C slave pour générer des pauses en inhibant l'horloge.
0 : horloge forcée à zéro, 1 : horloge validée

SSPM3:SSPM0 : mode de fonctionnement du module
0110 : I2C Slave, adresse 7 bits
0111 : I2C Slave, adresse 10 bits
1000 : I2C master, fréquence = 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




59
X.2.3.3 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 répond à son adresse et à l'adresse
générale 0000h
ACKSTAT : Acknowledge Status bit (mode master) : ce bit est l’image de l’accusé de réception
envoyé par le slave. 0=accusé positif, 1=accusé négatif
ACKDT : Acknowledge Data bit (master mode) : Valeur du bit envoyé au slave en fin de
réception. Ce bit est envoyé au moment ou on positionne le bit ACKEN.
ACKEN : Acknowledge Sequence Enable bit (master mode) : quand il est placé à un, ce bit
démarre une séquence accusé de réception qui consiste à placer les broches SDA et SCL
dans le mode correspondant au bit ACKDT
RCEN : Receive Enable bit : (master, réception) Quand on le place à 1, ce bit démarre la réception
d'un octet. Il revient automatiquement à 0 après la transmission du 8
ème
bit. La réception
ne démarre que si l'horloge n'est pas stretchée (forcée à 0: pause) par le slave.
PEN : STOP Condition Enable bit , démarre une séquence stoP_condition sur les broches SDA et
SCL. Ce bit est remis à 0 automatiquement après la séquence du STOP
RSEN : Repeated START Condition Enable bit : démarre une séquence Repeated Start condition. Il
est remis à 0 automatiquement après la séquence du R-START
SEN : START Condition Enable bit : démarre une séquence Start condition. Il est remis à 0
automatiquement après la séquence du START

X.2.3.4 Le registre SSPADD :
En mode I2C master, ce registre permet de déterminer la fréquence de communication
Hz
1) (SSPADD 4
Fosc
F
+ ×
=


Les fréquences possibles sont : 100 kHz, 400 kHz et 1 MHz

Hz 1
F 4
Fosc
SSPADD ÷
×
=

En mode I2C slave, ce registre doit contenir l'adresse du slave. Le bit 0 est réservé, il doit
être toujours placé à zéro, l'adresse doit être écrite à partir du bit 1. En cas d'adresse 7 bits, cela
ne pose pas de problème. En cas d'adresse 10 bits, l'adresse est écrite en 2 temps, On commence
par écrire 1 1 1 1 0 A
9
A
8
0 dans SSPADD, en attend l'indicateur UA, ensuite on écrit A
7
A
6
A
5
A
4
A
3

A
2
A
1
A
0


X.2.4 MSCP en mode I2C Master
Une séquence de communication est toujours initiée par le master qui commence par envoyer
un Start_bit (SSPCON2.SEN), suivi de l'adresse du slave. L’adresse sera codée seulement sur 7
bits, Le LSB qu’on appelle bit R/W permet de préciser le sens de l’échange qui va suivre, R/W=0
pour transmission, R/W=1 pour réception. On envoie ou on reçoit les données et on termine la
communication par un stoP_bit (SSPCON2.PEN)
Si l’on désire changer le sens de l’échange avant l’envoi du stoP, ce qui évite l'éventualité de
perdre la ligne au profit d'un autre master, il faut envoyer un RepeatStart condition suivi de
l’adresse accompagnée d’un R/W différent
60

X.2.4.1 Master en transmission :



- On positionne le bit SSPCON2.SEN sur le master, celui-ci envoie le START bit sur la ligne SDA
puis r.à.z automatiquement le bit SEN et positionne le drapeau d'interruption PIR1.SSPIF, ce
dernier doit être r.a.z par soft. Le slave voit le START, positionne son bit S et se prépare à
recevoir l'adresse,

- On copie l’adresse avec R/W=0 dans SSPBUF, les bits SSPSTAT.BF et SSPSTAT.R_W passent à
1, la transmission démarre, après le 8
ème
coup d'horloge, SSPSTAT.BF repasse à zéro, après le
9
ème
R_W repasse à 0, et le drapeau d’interruption SSPIF passe à 1 et l'horloge est forcée à 0
(pause) jusqu'`a ce qu'un nouvel octet est copié dans SSPBUF. Le drapeau SSPIF doit être raz
par soft pour qu’il puisse servir dans la suite.
- L'acquittement sur l'adresse est renvoyé par le slave pendant le 9
ème
coup d'horloge sur la ligne
SDA : 0 (ACK) s’il a lu l’octet correctement, 1 (NoACK) s’il n’a pas pu lire l’octet correctement.
Ce bit recopié par le master dans le bit SSPCON2.ACKSTAT. Le programmeur doit vérifier l’état
de ce bit pour décider de la suite des événements,
- Si acquittement de l'adresse est négatif on envoie un R-START et on renvoie ládresse
- Si acquittement de l'adresse est positif, on envoie un octet de donnée en l'écrivant dans
SSPBUF. Tout se passe comme lorsqu'on a envoyé l'adresse. Les bit BF et R_W passent à 1 au
début de l'émission et repassent à 0 à la fin. Le drapeau SSPIF passe à 1. Le slave renvoie
l'acquittement pendant le 9
ème
bit qui sera copié dans le bit ACKSTAT.
- Si l'acquittement sur la donnée est négatif, le plus simple est de retransmettre la donnée
- Si l'acquittement sur la donnée est positif :
o Si on a encore des données à transmettre, on démarre une nouvelle émission en écrivant
dans SSPBUF.
o Si on n'a plus de données à transmettre, on envoie un stoP_bit en positionnant le bit
SSPCON2.PEN qui est remis à zéro automatiquement après la transmission d'un Stop bit sur
la ligne SDA.
- Quand le slave voie le stoP_bit, il r.a.z le bit S et positionne le bit P puis réinitialise son
électronique pour se préparer à la réception d'un nouveau Start_bit.
S Slave adress 0 A Data byte A P Data byte A …
R/W
ACK envoyé par le slave
61


Configuration du module I2C
Envoyer START
Envoyer adresse avec R/W=0
Tester Acquittement Adresse
OK ?
Envoyer une donnée
Tester Acquittement sur donnée
Fini ?
Envoyer STOP
Envoyer R-START OK ?
PIC Master - Transmission
oui
non
non
oui
62
X.2.4.2 Master en réception :


- 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 et positionne le drapeau d'interruption PIR1.SSPIF, ce dernier
doit être r.a.z par soft. Le slave voit le Start_bit, il place le bit SSPSTAT.S à 1 et se prépare à
recevoir l'adresse,
- On copie l’adresse avec R/W=1 dans SSPBUF, les bits SSPSTAT.BF et SSPSTAT.R_W passent à
1, la transmission démarre, après le 8
ème
coup d'horloge, SSPSTAT.BF repasse à zéro, après le
9
ème
R_W repasse à 0, et le drapeau d’interruption SSPIF passe à 1, il doit être raz par soft
pour qu’il puisse servir dans la suite.
- Pendant le 9
ème
coup d'horloge, le slave renvoie un ACK/NOACK selon sa situation et force
l'horloge à zéro (pause) pour empêcher le master de lire avant que la donnée ne soit préparée
sur le bus. On appelle ça : clock stretching.
- Le programme du slave prépare la donnée sur le bus puis libère l’horloge à l'aide du bit CKP
- Le programme du master doit tester l'acknowledge dans SSPCON2.ACKSTAT, si = 0(OK), il
positionne le bit SSPCON2.RCEN pour demander le début d'une réception.
- Le module I2C master voyant le RCEN=1 essaye de commencer une réception par l'envoi d'une
rafale de 8 coups d'horloge. Quand il place l'horloge à 1 (première impulsion), celle-ci peut ne
pas passer à 1 car il se peut qu'elle soit forcée à 0 par le slave. Dans ce cas le master attend
que l'horloge passe à 1 pour continuer la rafale de coup d'horloge
- En résumé, dès que les deux conditions {RCEN=1 et horloge libre} sont vérifiées, le master
envoie une rafale de 8 coups d'horloge qui s'accompagne de la réception de 8 bits de données.
o A la fin de la réception, le module I2C master ramène le bit SSPCON2.RCEN à 0, transfert
l’octet reçu dans SSPBUF, l’indicateur BF passe à 1 ainsi que le drapeau d’interruption
PIR1.SSPIF. Ensuite Il force l'horloge à 0 (pause) pour donner le temps au programme
d'envoyer l' Acknowledge,
- Le programme utilisateur du master vide le buffer SSPBUF, BF repasse à 0. Ensuite il envoie l'
Acknowledge en plaçant 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 libérée juste le temps d'un coup d'horloge (le 9
ème
) pour que le
slave puisse prendre l' Acknowledge en compte. Elle est remise en pause après. Le drapeau
d’interruption SSPIF est aussi positionné après l’envoi du ACK
- Si on a envoyé ACK, ça veut dire qu’on veut recevoir d’autres données, alors notre programme
peut initier la réception d’un nouvel octet en validant SSPCON2.RCEN.
- A la réception du ACK, le slave met l'horloge en mode pose pour donner le temps à son
programme de placer une donnée dans le registre SSPBUF et de libérer ensuite l'horloge à
l'aide du bit CKP.
- Si on a envoyé NOACK, (on ne veut plus de donnée), Le slave qui le reçoit réinitialise sa
logique comme s'il a reçu un STOP.
S Slave adress 1 A Data byte A P Data byte A …
R/W
ACK du slave ACK du master
reçu reçu transmis
63



non
Configuration du module I2C
Envoyer START
Envoyer adresse avec R/W=1
Teste Acquittement
Adresse
Lancer la réception d'un octet en activant RCEN
Attendre la fin de réception en scrutant RCEN
Désire-t-on
d'autres données? Envoyer ACK
Envoyer R-START OK ?
PIC Master - réception
Traiter l'octet reçu
Envoyer NOACK
fin
oui
oui
non
64
X.2.5 MSCP en mode I2C Slave

X.2.5.1 Slave en Réception de données (venant du master)


- Le PIC détecte le START sur la ligne SDA, il positionne le bit SSPSTAT.S et se prépare à
recevoir l'adresse,
- Le PIC détecte la fin de réception de l’adresse, il vérifie si elle correspond à son adresse.
- Si c’est l’adresse d’un autre slave, il ne réagit pas, il se met à attendre le stoP_bit,
- Si l’adresse reçue correspond à celle de notre PIC :
o Le LSB R/W est recopié dans SSPSTAT.R_W
o Le bit SSPSTAT.D_A passe à 0 ¬ c’est une adresse qui est arrivée
o la suite dépend de l'état de BF et SSPOV (voir tableau ci-dessus pour plus de détail) :
o Si BF=0 et SSPOV=0 (tout est OK)
 SSPSR (l'adresse) est transféré dans SSPBUF  BF passe à 1
 Un ACK (0) est placé sur la ligne SDA pendant le 9
ème
coup d'horloge. C’est le
PIC qui le fait, notre programme ne s’en occupe pas
 Le drapeau PIR1.SSPIF passe à 1 ce qui peut déclencher une interruption. Il doit
être r.a.z par soft.
o Si BF=1 (Buffer SSPBUF plein)
 L'adresse ne sera pas transférée dans SSPBUF
 SSPOV sera positionné
 L'ACK ne sera pas transmis (NoAck)
 Le drapeau PIR1.SSPIF passe à 1 ce qui peut déclencher une interruption, Il doit
être r.a.z par soft
o Si BF=0 et SSPOV=1 (Buffer SSPBUF vide mais il y'a eu un overflow avant)
 SSPSR (l'adresse) est transférée dans SSPBUF
 SSPOV reste positionné
 L'ACK ne sera pas transmis (NoAck)
 Le drapeau PIR1.SSPIF passe à 1 ce qui peut déclencher une interruption

S Slave adress 0 A Data byte A P Data byte A …
R/W
ACK envoyé par le slave
65
- Dans le cas "tout est OK" , notre programme doit :
o Vider SSPBUF pour que BF passe à 0 et qu'on soit prêt pour la suite.
o On vérifie le bit R_W, on trouve 0, on sait qu’on va recevoir un octet
- Le PIC attend la réception du 8
ème
bit, vérifie BF et SSPOV (on suppose que tout est OK), il
transfert l’octet arrivé dans SSPBUF, BF et D_A passent à 1.
- Le PIC envoie l'acquittement pendant le 9
ème
bit et positionne SSPIF à 1.
- Notre programme vide SSPBUF, BF repasse à 0
- Maintenant on peut soit recevoir, une autre donnée, soit un stoP_condition, soit un
Repeat_Start_Condition. Il faut donc avoir l’œil, sur les indicateurs, BF, SSPIF, P et S pour
décider de la suite des opérations


0
Configuration du module I2C
Attendre l'adresse en scrutant BF
Vider SSPBUF pour baisser BF
Attendre une donnée en scrutant BF
BF
PIC Slave - Réception
Vider SSPBUF pour baisser BF
P
Traiter la donnée reçue
fin
0
1
1
66

X.2.5.2 Slave en transmission de données (vers le master)

Remarquons que le slave en transmission ne fait que préparer la donnée à transmettre dans son
buffer SSPBUF. C'est le master qui décide du début de l'échange puisque c'est lui qui gère
l'horloge. Toutefois, le slave peut bloquer un échange en bloquant l'horloge à 0. Clock Stretching.

Le drapeau BF passe à 1 quand le programme utilisateur écrit un octet dans SSPBUF et revient à 0
après la transmission du 8 bit de cet octet. Quand au début de l'échange, on reçoit l'adresse, celle-
ci est transférée dans SSPBUF et BF reste à 0 dans ce cas.
- Le PIC détecte le Start_bit sur la ligne SDA, positionne le bit SSPSTAT.S et se prépare à
recevoir l'adresse,
- Le PIC détecte la fin de réception de l’adresse, il vérifie si elle correspond à son adresse.
- Si c’est l’adresse d’un autre slave, il ne réagit pas, il se met à attendre le stoP_condition,
- Si l’adresse reçue correspond à notre PIC. Le module I2C Slave recopie le bit R/W (1 dans ce
cas) dans le bit R_W du registre SSPSTAT , puis vérifie les bits BF et SSPOV pour savoir si le
contenu précèdent 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
 Il place un ACK (0) sur la ligne SDA pendant le 9
ème
coup d'hologe. C’est le PIC qui le
fait, notre programme ne s’en occupe pas
 Il place le bit CKP à 0 ce qui force l'horloge à 0.(Mode pause : Clock Stretching)
 Le drapeau PIR1.SSPIF passe à 1 ce qui peut déclencher une interruption, il doit être
r.a.z par soft
 Le bit SSPSTAT.D_A passe à 0 ¬ c’est une adresse qui est arrivée
- Notre programme détecte que SSPIF est passé à 1 :
o Si on vérifie le bit R_W, on trouve 1, on sait qu’on va envoyer un octet
o On n’a pas besoin de lire SSPBUF car BF est égal à 0
o On copie un octet de donnée dans SSPBUF. L'indicateur SSPSTAT.BF passe à 1
o On replace le bit CKP à 1 pour libérer l'horloge. C'est le moyen d'informer le master que
la donnée est prête.
o Le master détecte, la libération de l’horloge, envoie une rafale de coup d’horloge, l’octet
est transmis. L’indicateur SSPSTAT.BF repasse à 0 après le 8
ème

o Maintenant le master peut renvoyer soit un ACK, soit NoACK :
 Si c'est un ACK, le PIC (slave) positionne le drapeau SSPIF et r.a.z le bit CKP pour
mettre l'horloge en pause. Ceci donne au programme du slave le temps de préparer
une nouvelle donnée dans SSPBUF et libérer l'horloge ensuite. Si le master envoie
un STOP après le ACK, le slave ne le détecte pas.
S Slave adress 1 A Data byte A P Data byte A …
R/W
ACK du slave ACK du master
reçu
transmis transmis
67
 Si c'est un NOACK, le PIC (slave) positionne le drapeau SSPIF, le bit CKP reste à 1
et le bit R_W passe à 0. L'électronique du slave est réinitialisée, il est prêt à recevoir
un nouveau START. Normalement, le master n'a pas besoin d'envoyer un STOP
dans ce cas. S'il le fait quand même, le slave le détecte et positionne l'indicateur P.







Configuration du module I2C
Attendre l'adresse en scrutant SSPIF
Placer une donnée dans SSPBUF
Libérer l'horloge à l'aide de CKP
PIC Slave - Transmission
Attendre fin transmission en scrutant SSPIF
Tester CKP pour déterminer
la nature de l'ACK envoyé
par le maitre
fin
ACK
NoACK CKP=1
CKP=0
68
X.2.5.3 Utilisation des interruptions



Voici les 5 événements qui déclenchent l'interruption SSPI sur un PIC Slave.

Evénement R/W D/A BF CKP Action
On a reçu une adresse avec R/W=0 0 0 1 NU Il faut vider SSPBUF pour baisser le
drapeau BF et attendre une donnée
On a reçu une donnée 0 1 1 NU Il faut vider SSPBUF et attendre un
événement (qui peut être un STOP)
On a reçu une adresse avec R/W=1.
L'horloge est forcée en pause
1 0 0 0 Il faut placer une donnée dans
SSPBUF et libérer l'horloge en
positionnant le bit CKP
On a fini la transmission d'un octet et
reçu un ACK. L'horloge est forcée en
pause
1 1 0 0 Il faut placer une donnée dans
SSPBUF et libérer l'horloge en
positionnant le bit CKP
On dirait qu'on a reçu une donnée
mais le buffer reste vide et l'horloge
n'est pas pausée: anormal. C'est un
NOACK qui a été reçu
0 1 0 1 La séquence d'échange est finie







SSPIF
R/W
Reçu adresse
avec R/W=1,
horloge=pause
On a envoyé donnée
et reçu ACK,
horloge=pause
D/A
On reçu une
donnée
Reçu adresse
avec R/W=0
D/A
BF
Reçu NOACK
CKP=1
1
0
0
0
1
1 0
69
X.3 Le module MSSP en mode SPI

Ce mode (Serial Peripheral Interface) permet de transmettre et recevoir simultanément des mots
de 8bits. Il utilise les broches :
RC4/SDI : Serial Data Input (doit être configurée en entrée)
RC5/SDO : Serial Data Output (doit être configurée en sortie)
RC3/SCK : Serial Clock (doit être configurée en sortie)
RA4/SS : Slave Select : Utilisée optionnellement en mode slave soit comme entrée de
synchronisation soit comme Chip Select en mode esclave multiples. Elle doit être
configurée en E/S numérique à l’aide du registre ADCON1 et comme entrée à l’aide
du registre TRISA

Le contrôle 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 génère et gère l'horloge de synchronisation SCK. C'est donc lui qui
décide du moment de démarrage d'une transmission réception.

Mode slave : L'horloge est générée par le circuit (master) avec lequel on communique. Notre Pic
démarre une émission/réception au moment ou il commence à recevoir l'horloge venant du maître.

L'émission et la réception se font simultanément par le même registre à décalage SSPSR. Un
cycle d'émission/réception commence au moment où on écrit un octet dans le registre SSPBUF, cet
octet est copié par le PIC dans le registre à décalage 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'entrée SDI. A la fin, le contenu de SSPSR (c.a.d l’octet reçu) est copié
dans SSPBUF. Cette action est annoncée par la mise à 1 du bit BF et du drapeau d’interruption
SSPIF. Le bit BF est un bit en lecture seule, la seule façon de le remettre à zéro est de lire le
contenu du registre SSPBUF. Le drapeau SSPIF doit être remis à zéro à l’aide de l’instruction BCF
par exemple.





SSPSR
SDI
SDO
SSPBUF
70
X.3.1 Le mode SPI master

Le PIC fonctionne en master, il
génère et gère l'horloge de
synchronisation. C'est lui qui
décide du moment où démarrer
une émission/réception.
Le PIC peut communiquer avec
plusieurs slaves, dans ce cas il
faut désigner le slave avec lequel
on désire communiquer, il faut
que les slaves disposent d'une
entrée de sélection CS qu'on peut
contrôler avec une sortie
quelconque d'un port d'E/S. Dans
le cas ou les slaves sont des PIC,
l'entrée de sélection est RA4/SS

Le cycle émission/réception
d'un octet démarre au moment
où on écrit dans le registre
SSPBUF. A la fin du cycle, les bits
SSPSTAT.BF et PIR1.SSPIF sont
positionnés pour nous informer
qu’un octet a été transmis et que
l'octet reçu attend d'être lu dans le registre SSPBUF. Ces deux bits doivent être remis à zéro par
nos soins, il faut juste remarquer que BF est un bit en lecture seule, pour le remettre à zéro 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 : définit l'état de repos de l'horloge (idle state)
0 : Bas au repos, 1 : Haut au repos

SSPM3:SSPM0 : Ces bits définissent le mode de fonctionnement du module
0000 : SPI Master : débit = Fosc/4
0001 : SPI Master : débit = Fosc/16
0010 : SPI Master : débit = Fosc/64
0011 : SPI Master : débit = Ftmr2/2

Le registre SSPSTAT en mode master :

SMP CKE BF

Seuls les bits utilisés par le mode SPI master sont représentés ici.

SMP : Sample bit : front d'horloge SCK sur lequel on lit le bit présent sur l'entrée SDI
0 : milieu de période d'horloge
1 : fin de la période d'horloge

PIC
(master)
Slave 1
RX

Tx

horloge

sélection
SDO
SDI
SCK

Ri
Slave 2
RX

Tx

horloge

sélection
Rj

PIC
(master)
Circuit
quelconque
(slave)
SDO
SDI
SCK

71

CKE : Clock Edge Select : front de l'horloge SCK sur lequel on place un bit sur la sortie SDO. Ceci
va dépendre du bit CKP. Si on désigne le niveau actif de l'horloge comme le niveau opposé du
niveau de repos défini 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 reçu. Ce bit est remis automatiquement à zéro au moment de la lecture du registre SSPBUF.

Le dessin ci-dessous montre la configuration la plus fréquemment utilisée. Le Master écrit au
début de la période d’horloge et lit aux milieux. Le Slave en fait de même.



X.3.1.1 Récapitulation mode master
En résumé, les étapes à suivre pour utiliser MSSP en mode SPI master sont :

Configurer la direction des lignes RC4/SDI, RC5/SDO et RC3/SCK
Définir la polarité de l'horloge par le bit SSPCON.CKP
Définir la fréquence de l'horloge à l'aide des bits SSPCON.SSPMx
Définir le moment de lecture des bits entrant à l'aide du bit SSPSTAT.SMP
Définir le moment d’’ecriture des bits sortants à l'aide du bit SSPSTAT.CKE
Valider le port par le bit SSPCON.SSPEN

Une fois cette initialisation réalisée, l'émission/réception se fait comme suit :
- Copier un octet dans SSPBUF pour démarrer l’émission/réception
- attendre la fin en surveillant SSPSTAT.BF ou PIR1.SSPIF
- La lecture de SSPBUF est la seule façon de r.à.z le bit SSPSTAT.BF
- Si on l’utilise, le drapeau PIR1.SSPIF doit être remis à 0


B7 B6 B5 B4 B3 B2 B1 B0 SDO
Le slave doit lire ici
SDI
Le master lit ici
B7 B6
B5 B4 B3 B2 B1 B0
CKE=0
CKP=1
SMP=0
72
X.3.2 Le mode SPI slave
En mode slave, le module MSSP fonctionne d'une façon similaire au mode master à part qu'ici,
ce n'est pas notre PIC qui génère l'horloge et décide des moments de communication. Il se
contente de réaliser une émission/réception chaque fois qu'il reçoit une rafale d'horloge sur la
broche SCK qui est devenue une entrée.

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. Dans ce cas le mode
Sélection 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 reçu. Ce bit est remis automatiquement à zéro au moment de la lecture du registre SSPBUF.


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 précédente n'est pas encore transmise. Il doit être remis à
zéro par programme

SSPOV : Receive Overflow Indicator bit : Cet indicateur d'erreur est positionné quand une
nouvelle donnée est reçue alors que le registre SSBUF n'est pas encore lu. Dans ce cas la nouvelle
donnée est perdue. Ce bit doit être remis à zéro par programme

SSPEN : Validation du module SSP (1 = validé)

SKP : Clock Polarity : définit l'état de repos de l'horloge (idle state)
0 : Bas au repos, 1 : Haut au repos (doit coïncider avec le choix du master)

SSPM3:SSPM0 : Ces bits définissent le mode de fonctionnement du module
0100 : SPI Slave : mode Slave Select, l'entrée SS est validée, il faut la placer à 0 quand on
veut communiquer avec ce slave (chip select)
0100 : SPI Slave : l'entrée SS est inhibée (fonctionne en E/S normale)

Dans le cas ou l'entrée SS est utilisée, elle doit être configurée en entrée par TRISA.5 et elle
doit être configurée comme entrée numérique à l'aide du registre ADCON1 car elle est multiplexée
avec une entrée analogique du module CAN.

X.3.2.1 Les chronogrammes de fonctionnement :
Un cycle d'émission/réception démarre au moment du démarrage de l'horloge externe.

Si on ne désire réaliser que des réceptions, on n'a pas besoin d'écrire à chaque fois dans
SSPBUF du moment que ce n'est pas nous qui démarrons le cycle Tx/Rx
73
Si on ne désire réaliser que des transmissions, il va de soi que nous devons écrire les données
à 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 déclenchée (SSPOV)

Le chronogramme ci-dessous illustre la configuration la plus courante, CKP=1, CKE=0,
CMP=0(obligatoire). Les bits sont transmis au début de la période d’horloge et lu au milieu de celle
ci. Il n'est pas nécessaire d'utiliser l'entrée SS dans ce cas.






CKP=1
CKE=0
B7 B6 B5 B4 B3 B2 B1 B0
SDI
moment de lecture (SMP=0)
B7 B6 B5 B4 B3 B2 B1 B0
SDO
Moment d’écriture : CKE=0
74
XI Annexe : Gestion du Programme Counter,
Le PC est un registre de 13 bits, il peut donc adresser 8 k de mémoire programme.



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.



XI.2 Instruction de branchement
Un branchement consiste à modifier la valeur de PC. Mais dans les instructions de
branchement, seulement 11 bits sont utilisés pour coder l'adresse de destination, ce qui donne au
maximum un intervalle de 2 k alors que nous avons une mémoire programme de 8k. Pour
remédier à ce problème, les deux bits manquants pour compléter les 13 bits de PC sont pris dans
PCLATH :


La mémoire programme apparaît donc comme organisée en 4 page de 2 k chacune. Lors d'un
saut, l'adresse instruction précise la destination à l'intérieur d'une page et les deux bits 3 et 4 de
PCLATH désignent la page
Attention, en assembleur on ne précise pas les adresses mais on utilise des étiquettes qui
correspondent à des adresses complètes (13 bits). Cela ne change rient car seuls 11 bits de
l'étiquette seront envoyés dans le PC et c'est à nous de gérer les deux bits de PCLATH pour
compléter l'adresse de destination.

11 bits venant de l'instruction
PCLATH

PC
PCL PCH
PCLATH
Ecriture dans PCL
PCL PCH
75

Fig. XI.1 : gestion de la mémoire programme lors d'une instruction de saut




XII Références
1) http://www.multimania.com/pmorphe/bienvenuechez_atm.htm
2) La programmation des PICs, Première partie – PIC16F84, Rev 5, Bigonff
3) La programmation des PICs, Secode partie-PIC16F876/877, Rev 7, Bigonff
4) PIC 16F87X Data Sheet (DS30292C) , Microchip
5) 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

Page 0
Page 1
Page 2
Page 3
00
01
10
11
PCLATH


0
8k
2k
6k
4k
mémoire programme

2

SOMMAIRE
I II Introduction .............................................................................................................5 I.1 Les PICs de Microchip ........................................................................................... 6 Les éléments de base du PIC 16F876/877 .............................................................7 II.1 L'Horloge ............................................................................................................. 7 II.2 L'ALU et l’accumulateur W ..................................................................................... 8 II.3 Organisation de la mémoire RAM ........................................................................... 8 II.3.1 Accès à la RAM par adressage DIRECT ................................................................ 8 II.3.2 Accès à la RAM par l’adressage INDIRECT ......................................................... 10 II.4 Quelques registres de configuration et leurs bits .................................................... 11 II.5 Les instructions du 16F876/877............................................................................ 12 II.5.1 Les instructions « orientées Registre» ............................................................... 12 II.5.2 Les instructions « orientées bits »..................................................................... 12 II.5.3 Les instructions opérant sur une constante ........................................................ 12 II.5.4 Les instructions de saut et appel de procédures ................................................. 12 II.5.5 Le jeu d'instructions ........................................................................................ 13 II.5.6 Les paramètres des instructions agissant sur registre ......................................... 14 II.5.7 Les paramètres des instructions agissant sur bit ................................................ 14 II.5.8 Les instructions MOVWF et MOVF ..................................................................... 14 II.5.9 Les instructions btfss et btfsc ........................................................................... 15 II.5.10 Les instructions incfsz et decfsz ........................................................................ 15 II.5.11 L’instruction goto ............................................................................................ 15 II.5.12 L’instruction call .............................................................................................. 16 II.5.13 Les indicateur d’état (drapeaux) ....................................................................... 17 II.6

II.5.13.1

Les directives de l'assembleur MPASM .................................................................. 18

Les indicateurs, la soustraction et la comparaison ....................................... 17

III Les outils de développement .................................................................................22 III.1 Procédure de travail ............................................................................................ 22 III.2 L’environnement de développement MPLAB .......................................................... 23 III.3 Structure générale d’un programme ..................................................................... 25 III.4 Quelques exemples ............................................................................................. 26 III.4.1 Comparaison................................................................................................... 26 III.4.2 Boucles de temporisation ................................................................................. 27

III.4.2.1 III.4.2.2 III.4.2.3

Temporisation avec une boucle ................................................................. 27 Temporisation avec 2 boucles imbriquées .................................................. 28 Temporisation avec 3 boucles imbriquées .................................................. 28

IV Les ports d’E/S .......................................................................................................29 IV.1 Le port d' E/S PORTA .......................................................................................... 29 IV.1.1 La broche RA4 ................................................................................................ 29 IV.1.2 Les autres broches de PORTA........................................................................... 29 IV.2 Le port d' E/S PORTB .......................................................................................... 30 IV.3 Le port d' E/S PORTC .......................................................................................... 30 IV.4 Le port d' E/S PORTD .......................................................................................... 30 IV.5 Le port d' E/S PORTE .......................................................................................... 31 V Les mémoires permanentes ...................................................................................32 V.1 La mémoire EEPROM de données ......................................................................... 32 V.1.1 Procédure de lecture dans l'EEPROM ................................................................. 33 V.1.2 Procédure d'écriture dans l'EEPROM.................................................................. 33 V.2 La mémoire Programme ou mémoire flash ............................................................ 33 V.2.1 Procédure de lecture dans la mémoire programme............................................. 34 V.2.2 Procédure d'écriture dan la mémoire programme ............................................... 34

3 VI Les interruptions ....................................................................................................35 VI.1 Déroulement d'une interruption ........................................................................... 35 VI.2 Les sources d'interruption .................................................................................... 36 VI.3 L'interruption INT (Entrée RB0 du port B) ............................................................. 36 VI.4 L'interruption RBI (RB4 A RB7 du port B) .............................................................. 36 VI.5 Les autres interruptions ....................................................................................... 36 VII Les Timers ..............................................................................................................37 VII.1 Le Timer TMR0 ................................................................................................... 37 VII.2 Le Watchdog Timer WDT (Chien de garde) .......................................................... 38 VII.3 Le Timer TMR1 ................................................................................................... 39 VII.3.1 Le mode Timer ............................................................................................... 39 VII.3.2 Le mode Compteur .......................................................................................... 39 VII.3.3 Le registre de control de T1CON ....................................................................... 40 VII.4 Les module de Comparaison/Capture CCP1 et CCP2............................................... 41 VII.4.1 Le module CCP1 .............................................................................................. 41

VII.4.2 Le module CCP2 .............................................................................................. 43 VII.5 Le Timer TMR2 ................................................................................................... 44 VIII Le module de conversion A/N................................................................................46 VIII.1 Déroulement d’une Conversion ............................................................................ 47 VIII.2 Temps de conversion .......................................................................................... 48 VIII.3 Temps d'acquisition ............................................................................................ 48 VIII.4 Fréquence d'échantillonnage ................................................................................ 49 VIII.5 Valeur numérique obtenue .................................................................................. 49 VIII.6 Programmation ................................................................................................... 49 IX L'USART ..................................................................................................................50 IX.1 Mode Asynchrone ............................................................................................... 50 IX.2 Le port en transmission ....................................................................................... 50 IX.2.1 Les étapes de transmission (sans interruption, mode 8 bits) ............................... 51 IX.3 Le port en réception ............................................................................................ 52 IX.3.1 Les étapes de réception (sans interruption, mode 8 bits) .................................... 53 IX.4 La vitesse de communication ............................................................................... 53 X Le module MSSP (Master Synchronous Serial Port) .............................................54 X.1 Introduction au bus I2C ...................................................................................... 54 X.1.1 start condition................................................................................................. 55 X.1.2 Transmission d'un bit....................................................................................... 55 X.1.3 Stop condition................................................................................................. 55 X.1.4 Remarque sur le Start et le Stop condition......................................................... 56 X.1.5 L' acknowledge ............................................................................................... 56 X.1.6 L'adresse et le bit R/W..................................................................................... 56 X.2 Le module MSSP en mode I2C ............................................................................. 57 X.2.1 Transmission d’un octet ................................................................................... 57 X.2.2 Réception d’un octet........................................................................................ 57 X.2.3 Les registres de configuration........................................................................... 57

VII.4.1.1 VII.4.1.2 VII.4.1.3

Le mode Capture ..................................................................................... 41 Le registre de configuration CCP1CON ....................................................... 42 Le mode Comparaison .............................................................................. 42

X.2.4

X.2.3.1 X.2.3.2 X.2.3.3 X.2.3.4 X.2.4.1 X.2.4.2

MSCP en mode I2C Master ............................................................................... 59

Le registre SSPSTAT :............................................................................... 58 Le registre SSPCON : ................................................................................ 58 Le registre SSPCON2 : .............................................................................. 59 Le registre SSPADD : ................................................................................ 59 Master en transmission :........................................................................... 60 Master en réception : ............................................................................... 62

..............1 X............2..................... 64 Slave en transmission de données (vers le master) ...................... 72 XI Annexe : Gestion du Programme Counter.......................... 71 Les chronogrammes de fonctionnement : .........................................................2 Instruction de branchement .............................5....................................1 Le mode SPI master .......2 X..........3......3 Le module MSSP en mode SPI ........4 X...1......3............74 XI.......................................3 X............... 70 X........................2.................................................. ................................................................................3........................5..........75 .............5.............5 MSCP en mode I2C Slave ................................................... 64 X................................................. 72 Le mode SPI slave......................................................1 X..1 Slave en Réception de données (venant du master) .. 68 Récapitulation mode master ....................2....................................... 69 X........................ 74 XII Références ........................2...........................3............2..... 74 XI..................................2 X..................................1 GOTO calculé : modification de la valeur de PCL ............ 66 Utilisation des interruptions ....

il se contente le plus souvent d’un bus 8 ou 16 bits. Timers et horloge temps réels …On peut dire que seul le langage de programmation (Assembleurs) constitue la différence majeure en deux microcontrôleur (similaires) venant de deux constructeurs différents. modem …) Vidéo (Appareil photos numérique. airbag) Multimédia (téléviseur.5 I        Introduction d’un microprocesseur. 7) qui constitue les éléments fondamentaux de la famille mid-range qui est la famille « moyenne puissance » de Microchip . 4. des interfaces d’E/S //. de la mémoire permanente. four micro-onde) Un microcontrôleur peut être programmé une fois pour toutes afin qu'il effectue une ou des tâches précises au sein d'un appareil électronique. modem) Electroménager (lave-vaisselle. pilotage) Appareil de mesure (affichage. Interfaces d’E/S analogiques. Les microcontrôleurs. quelque soit leurs constructeurs. série (RS232. MP3.I2C. Je pense qu’on ne se tromperait pas beaucoup si on affirme qu’aujourd’hui il y’a un microcontrôleur ( grand) dans chaque équipement électronique :         Informatique (souris. lave-linge. Mais les µC récents peuvent être reprogrammés et ceci grâce à leur mémoire permanente de type FLASH (d’où le terme flasher quelque chose) Plusieurs Constructeurs se partagent le marché des microcontrôleurs. carte vidéo.carte audio. magnétoscope) Téléphones (fax. interfaces de communications série. PHILIPS et enfin MICROCHIP avec ses PICs très populaires qui nous intéresse ici dans ce cours. mémorisation) Automobile (ABS. ont des architecture très similaires et sont constitués de modules fondamentaux assurant les mêmes fonctions : UAL. injection. 6. Ceci en fait un composant très bon marché parfaitement Adapté pour piloter les applications embarquées dans de nombreux domaines d’application. AMTEL. ZILOG. calcul statistique. Ports d’E/S. MOTOROLA. GPS. caméra numérique …) Contrôle des processus industriels (régulation. de la mémoire RAM. Nous avons choisit dans ce cours d’apprendre les microcontrôleurs à travers une étude détaillée des microcontrôleur 16F87x (x=3. portable. SPI …) des interfaces d’E/S analogique Des Timer pour gérer le temps D’autres module plus au moins sophistiqués selon la taille des µC Un microcontrôleur est un composant électronique Autonome doté : Il est généralement moins puissant qu’un microprocesseur en terme de rapidité ou de taille mémoire. citons INTEL.

qui utilise des mots d’instructions de 12 bits. Port série synchrone supportant I2C Trois TIMERS avec leurs Prescalers. Tension de fonctionnement de 2 à 5V. Nous nous limiterons dans ce document à la famille Mid-Range et particulièrement au PIC 16F876/877.1 Les PICs de Microchip Les PICs sont des microcontrôleurs à architecture RISC (Reduce Instructions Construction Set). C (8 bits). et même à un autre microcontrôleur. et la famille High-End. 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 Série USART USART MSSP USART/MSSP USART/MSSP USART/MSSP USART/MSSP Tableau I. ou encore composant à jeu d’instructions réduit. Une mémoire EEPROM de 256 octets.1 : différents circuit de la famille 16F87X Les éléments essentiels du PIC 16F876 sont :                   Une mémoire programme de type EEPROM flash de 8K mots de 14 bits. Possibilité aux applications utilisateur d’accéder à la mémoire programme. A (6 bits). Les PICs sont des composants STATIQUES. Fonctionnement en mode sleep pour réduction de la consommation. Port série universel. Programmation par mode ICSP (In Circuit Serial Programming) 12V ou 5V. Un PIC16F87604 peut fonctionner avec une horloge allant du continu jusqu’à 4 MHz. TMR1. on pourra facilement passer à une autre famille. Générateur d'horloge. à quartz (jusqu’ à 20 MHz) ou à Oscillateur RC Protection de code. B (8 bits). qui utilise des mots de 16 bits.6 I. Jeux de 35 instructions . USART. la famille Mid-Range. plus leur décodage sera rapide ce qui augmente la vitesse de fonctionnement du microcontrôleur. qui utilise des mots de 14 bits (et dont font partie la 16F84 et 16F876). TMR2 Deux modules de comparaison et Capture CCP1 et CCP2 Un chien de garde. mode asynchrone (RS232) et mode synchrone SSP. TMR0. sachant que si on a tout assimilé. 13 sources d'interruption. L'avantage est que plus on réduit le nombre d’instructions. La famille des PICs est subdivisée en 3 grandes familles : La famille Base-Line. Convertisseur Analogiques numériques 10 bits à 5 canaux. Une RAM donnée de 368 octets. Trois ports d'entrée sortie. Ils peuvent fonctionner avec des fréquences d’horloge allant du continu jusqu’à une fréquence max spécifique à chaque circuit.

Quelque soit l'oscillateur utilisé. l'horloge système dite aussi horloge instruction est obtenue en divisant la fréquence par 4. Rext et Cext. (Voir Tableau I. L'horloge interne est constituée d'un oscillateur à quartz ou d'un oscillateur RC.1) II II. la fréquence de l'oscillation est fixée par Vdd. Dans certains cas. une horloge externe au microcontrôleur peut être utilisée pour synchroniser le PIC sur un processus particulier. Avec un quartz de 4 MHz. C2) limite les harmoniques dus à l’écrêtage et Réduit l’amplitude de l’oscillation. Avec un oscillateur RC.1 Les éléments de base du PIC 16F876/877 L'Horloge L'horloge peut être soit interne soit externe. .1 : Les éléments constitutifs du PIC 16F877 Le port D (8 bits) et le port E (3 bits) ne sont pas disponibles sur tous les processeurs. il n'est pas obligatoire. Dans la suite de ce document on utilisera le terme Fosc/4 pour désigner l'horloge système. Elle peut varier légèrement d'un circuit à l'autre. on obtient une horloge instruction de 1 MHz. soit le temps pour exécuter une instruction de 1µs. Le filtre passe bas (Rs.7 PORTE PORTD PORTC PORTB PORTA 96 registres système 368 registres utilisateur 14 bits : config DAC 10 bits CCP1 Capture/Comparaison timer 0 TMR0 timer 1 TMR1 timer 2 TMR2 Chien de garde Mémoire programme de type Flash 8 x 1024 mots de 14 bits CCP2 Capture/Comparaison W ALU Horloge système 256 octets MSSP (I2C/SPI) USART (RS232) WDT EEPROM Fig. C1. Avec l'oscillateur à Quartz. on peut avoir des fréquences allant jusqu'à 20 MHz selon le type de µC. I.

Dans ce cas. le résultat peut être récupéré soit dans l’accumulateur. Ces bits sont appelés RP0 et RP1 et doivent être positionnés correctement avant toute instruction qui accède à la RAM par l’adressage direct.1 Accès à la RAM par adressage DIRECT Avec ce mode d’adressage. on est aiguillé automatiquement vers la zone [70 h.3   Organisation de la mémoire RAM L’espace mémoire RAM adressable est de 512 positions de 1 octet chacune : 96 positions sont réservées au SFR (Special Function Registers) qui sont les registres de configuration du PIC. elle est tronquée à 7 bits puis complétée par les bits RP0 et RP1 pour former une adresse 9 bis. Les zones hachurées ne sont pas implantées physiquement. la partie adresse est codée sur 7 bits ce qui va poser quelques petits problèmes. La Figure II-1 montre l’organisation de la RAM avec les zones allouée au SFR et aux GPR. ensuite on utilise soit l’instruction MOVWF 6Fh soit l’instruction . on utilise l'instruction MOVWF 50. II. Même si on précise une adresse supérieure à 127 (+ de 7 bits) dans une instruction.7Fh] appelée zone commune. En effet. RP1 RP0 9 bits La RAM apparaît alors organisée en 4 banks de 128 octets chacun. L'adresse instruction permet d'adresser à l'intérieur d'un bank alors que les bits RP0 et RP1 du registre STATUS permettent de choisir un bank. On peut avoir : Une instruction sur un seul opérande qui est en général un registre situé dans la RAM Une instruction sur 2 opérandes. 7 bits permettent d’adresser seulement 128 positions. Les 416 positions restantes constituent les registres GPR (General Propose Registers) ou RAM utilisateur.3. Sur le 16F876 et 16F877. Pour pouvoir adresser les 512 positions accessibles. soit dans le registre lui-même. Pour les instructions dont un des opérandes est un registre. le PIC complète les 7 bits venant de l’instruction par deux bits situés dans le registre de configuration STATUS.8 II. 3 blocs de 16 octets chacun ne sont pas implantés physiquement d’où une capacité de RAM utilisateur de 368 GPR. l’un des deux opérandes est toujours l’accumulateur W.2 L'ALU et l’accumulateur W L’ALU est une Unité Arithmétique et logique 8 Bits qui réalise les opérations arithmétiques et logique de base. on précise dans l’instruction la valeur de l’adresse à laquelle on veut accéder. pour copier l’accumulateur W dans la case mémoire d’adresse 1EF h. il faut 9 bits d’adresse. Cette instruction sera codée sur 14 bits. l’autre peut être soit un registre soit une constante. Par exemple. Pour accéder à la RAM. Par exemple. Pour avoir ces 9 bits. Si on essaye d’y accéder. toutes les opérations à deux opérandes passe par lui. il faut d’abord placer les bits RP0 et RP1 à 1 (bank 3). on dispose de deux modes d’adressage : II. pour copier le contenu de l'accumulateur W dans la case mémoire d'adresse 50. L’accumulateur W est un registre de travail 8 bits.

RP0 STATUS. En effet. le PIC ne prend que 7 bits soit : 1101111 = 6Fh et complète avec les bits RP1. place le bit RP0 à 0 . que l’on écrive 6Fh = 0110 1111 ou 1EFh = 0001 1110 1111. place le bit RP1 à 1 .RP0 pour obtenir 11 1101111 = 1EFh 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 20h Bank 0 (00) INDF TMR0 PCL STATUS FSR PORTA PORTB PORTC PORTD (*) PORTE (*) PCLATH INTCON PIR1 PIR2 TMR1L TMR1H T1CON TMR2 T2CON SSPBUF SSPCON CCPR1L CCPR1H CCP1CON RCSTA TXREG RCREG CCPR2L CCPR2H CCP2CON ADRESH ADCON0 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 A0h Bank 1 (01) INDF OPTION_REG PCL STATUS FSR TRISA TRISB TRISC TRISD (*) TRISE (*) PCLATH INTCON PIE1 PIE2 PCON 100h 101h 102h 103h 104h 105h 106h 107h 108h 109h 10Ah 10Bh 10Ch 10Dh 10Eh 10Fh 110h Bank 2 (10) INDF TMR0 PCL STATUS FSR PORTB 180h 181h 182h 183h 184h 185h 186h 187h 188h 189h 18Ah 18Bh 18Ch 18Dh 18Eh 18Fh 190h Bank 3 (11) INDF OPTION_REG PCL STATUS FSR TRISB PCLATH INTCON EEDATA EEADR EEDATH EEADRH PCLATH INTCON EECON1 EECON2 SSPCON2 PR2 SSPADD SSPSTAT TXSTA SPBRG ADRESL ADCON1 6Fh 70h Zone commune 7Fh EFh F0h 16Fh 170h 1EFh 1F0h FFh 17Fh 1FFh Figure II-1 : organisation de la RAM du 16F876/877 Nous allons anticiper un peu et présenter les instructions bcf et bsf et qui permettent de positionner un bit à 0 ou à 1 bcf bsf STATUS. qui donne le même résultat.RP1 .9 MOVWF 1EFh.

l’instruction CLRF INDF signifie : remettre à zéro la case mémoire d’adresse 174h.2 Accès à la RAM par l’adressage INDIRECT Pour accéder à une position de la RAM en utilisant l’adressage indirect. En effet. On peut se demander pourquoi on ajoute le bit IRP.3. Mais quelle est l’adresse de cette position appelée INDF ? La réponse est : INDF est la case mémoire pointée par le pointeur IRP/FSR. Exemle : Si on place 74h dans le registre FSR et on positionne le bit IRP à 1. Exemple : l’instruction CLRF INDF signifie : mettre à zéro la case mémoire d’adresse INDF. IRP FSR 0 00 0 1F 0 20 SFR (32) GPR (96) SFR (32) GPR (80) 1 00 1 0F 1 10 SFR (16) GPR (96) SFR (16) 1 6F 1 80 1 8F 1 90 0 7F 0 80 0 9F 0 A0 0 EF 0 FF GPR (96) 1 EF 1 FF page 0 page 1 Donc en résumé. on passe toujours par une position fictive appelée INDF (Indirect File). c’est seulement la moitié de la RAM dont on dispose.10 II. le registre de pointage FSR est un registre 8 bits. IRP est un bit qui se trouve dans STATUS et FSR est un registre accessible dans tous les bancs. il peut donc adresser au maximum 256 positions mémoire (de 00h à FFh). alors. Il nous manque un bit pour avoir les 9 bits nécessaires. chaque fois que le PIC rencontre le mot INDF dans un programme. On utilise le bit IRP qui se trouve dans le registre STATUS. il sait qu’il s’agit de la case mémoire dont l’adresse (9 bits) se trouve dans le registre FSR complété par le bit IRP du registre STATUS INDF est la case mémoire pointée par le pointeur: IRP FSR pointeur 9 bits IRP = 0  000h à 0FFh IRP = 1  100h à 1FFh   page 0 page 1 .

0000 1111 1111 STATUS OPTION_REG INTCON PIE1 PIR1 PIE2 PIR2 EECON1 TXSTA RCSTA CCPxCON T1CON T2CON SSPCON SSPCON2 SSPSTAT CCP1CON TXSTA RCSTA CCP2CON ADCON0 ADCON1 TRISx Tableau II. WR TRMT OERR CCPxM1 TMR1CS T2CKPS1 SSPM1 RSEN UA CCP1M1 TRMT OERR CCP2M1 — PCFG1 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--. N.I.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.4 Quelques registres de configuration et leurs bits IRP RBPU GIE PSPIE PSPIF N.11 II.I.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--.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. N.1 : détail des registres SFR et leurs états au démarrage .I. N. N.I.I. EEPGD CSRC SPEN — — — WCOL GCEN SMP — CSRC SPEN — ADCS1 ADFM RP1 INTEDG PEIE ADIE ADIF Réservé Réservé — TX9 RX9 — — TOUTPS3 SSPOV ACKSTAT CKE — TX9 RX9 — ADCS0 — RP0 T0CS T0IE RCIE RCIF N.

5.5. II.5.3 II.12 II.2 Les instructions « orientées bits » Ce sont des instructions destinées à manipuler directement un bit d’un registre que se soit un registre de configuration SFR ou une case mémoire quelconque (registre GPR). Exercice 1) Dans quel bank se trouvent les cases mémoire d'adresse : 1A4h. II. si on utilise un quartz de 4MHz. 250. 400 Exercice 2) Combien de cases mémoires libres (GPR) y a-t-il dans la zone mémoire qui commence à la position A0h et se termine à EAh. 200. Même question pour le bank2. Exercice 4) Combien de cases mémoires libres (GPR) y a-t-il dans le bank1. Avec un quartz de 20MHz. .5. Chaque instruction est codée sur un mot de 14 bits qui contient le code opération (OC) ainsi que l'opérande. B5h.5    Les instructions du 16F876/877 Tous les PICs Mid-Range ont un jeu de 35 instructions. à part les instructions de saut qui sont exécutées en 2 cycles d’horloge. 58h. 100. on obtient une vitesse de traitement de 5 MIPS. on obtient une horloge fosc/4 = 1000000 cycles/seconde. Ça peut être un registre de configuration SFR ou une case mémoire quelconque (Registre GPR) II. cela nous donne une puissance de l’ordre de 1MIPS (1 Million d’ Instructions Par Seconde). 130h. 300.4 Les instructions opérant sur une constante Les instructions de saut et appel de procédures Ce sont les instructions entre l’accumulateur W est une constante K Ce sont les instructions qui permettent de sauter à une autre position dans le programme et de continuer l’exécution du programme à partir de cette position. Toutes les instructions sont exécutées en un cycle d'horloge. Exercice 3) Quelle est l'adresse de la dernière position d'une zone mémoire de 40 cases qui commence à la position 190h.1 Les instructions « orientées Registre» Ce sont des instructions qui manipulent un octet se trouvant dans la RAM. Tous les bits de la RAM peuvent être manipulé individuellement. Sachant que l’horloge système est égale à fosc/4.

DC.b BTFSC F.d INSTRUCTIONS BCF F.d DECF F. PD' TO'.F ? d} incrémente F  {W.F ? d} signifie que le résultat va soit dans W si d=0 ou w.F ? d} F  {W.d IORWF F.F ? d} skip if 0 W or F  {W.F ? d} rotation à droite de F a travers C  {W.d SUBWF F.d XORWF F. PD' 1 1 2 2 1 2 2 2 1 .d INCF F.F ? d} W xor F  {W.DC.F ? d} décrémente F  {W.b INSTRUCTIONS ADDLW K ANDLW K IORLW K MOVLW K SUBLW K XORLW K OPERANT SUR REGISTRE W+F  {W.d MOVWF F RLF F.DC.d MOVF F.Z Z 1 1 1 1 1 1 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 Z TO'.Z Z Z C. si 0 saute une instruction teste le bit b de F.F ? d} skip if 0 incrémente F  {W.DC.d DECFSZ F. soit dans F si d= 1 ou f INSTRUCTIONS ADDWF F.d CLRF F COMF F.d SWAPF F.F ? d} WF rotation à gauche de F a travers C  {W.d ANDWF F.F ? d} OPERANT SUR BIT RAZ du bit b du registre F RAU du bit b du registre F teste le bit b de F.F ? d} permute les 2 quartets de F  {W.Z 1 Z 1 Z 1 Z 1 Z 1 1(2) Z 1 1(2) Z 1 Z 1 1 C 1 1 C.d RRF F.F ? d} Clear F Complémente F  {W. si 1 saute une instruction OPERANT SUR CONSTANTE W+KW W and K  W W or K  W KW K–WW W xor K  W indicateurs Cycles C.5 Le jeu d'instructions {W.Z 1 1 Z 1 1 1 1(2) 1(2) C.F ? d} F – W  {W.F ? d} W and F  {W.5.d INCFSZ F.13 II.b BTFSS F.F ? d} décrémente F  {W.b BSF F.

on parle d’adressage immédiat  II. le paramètre F représente l’adresse du registre considéré.5. le paramètre d doit être = 0 .2 45h. le paramètre F indique le registre qui contient le bit à modifier et le paramètre b indique le numéro du bit à modifier.7 Les paramètres des instructions agissant sur bit Pour les instructions agissant sur un bit.0 ou XORWF 35h.14 On remarque que :  Les instructions qui agissent sur un registre ou un bit d’un registre contiennent toutes la lettre F dans le nom de l’instruction.6 . signifie : Copier le contenu de W dans la case mémoire d’adresse 55h W MOVF permet de copier le contenu d’un registre (SFR ou GPR) dans l’accumulateur W. parce que chez Microchip. signifie : placer à 0 le bit 6 (7ème bit à partir de la droite) du registre de la case mémoire d’adresse 45h II.6 Les paramètres des instructions agissant sur registre Pour les instructions qui agissent sur registre.8 Les instructions MOVWF et MOVF un MOVWF RAM Ce sont les instructions les plus utilisées. le résultat de l’opération sera placé dans l’accumulateur W. Le paramètre d (destination) joue un rôle important. signifie : placer à 1 le bit 2 (3ème bit à partir de la droite) du registre STATUS . le résultat de l’opération sera placé dans le registre précisé par F. MOVWF permet de copier l’accumulateur W dans registre (SFR ou GPR): MOVWF MOVWF STATUS 55h .5. la RAM est appelée register File (Fichier des registres). on appelle « Literal » ce genre d’adressage. signifie : Copier le contenu de W dans le registre STATUS .5. si on prend d = 0 ou w. ADDWF 70h. Ceci vient du fait que chez Microchip. on compte à partir de zéro en commençant à droite 7 6 5 4 3 2 1 0 BSF BCF STATUS.f Signifie : additionner le contenu de W avec le contenu de la case mémoire d’adresse 70h et placer le résultat dans la case mémoire 70h XORWF 35h. Les instructions qui agissent sur une constante contiennent toutes la lettre L.w Signifie : faire un ou exclusif entre W et le contenu de la case mémoire d’adresse 35h et placer le résultat dans l’accumulateur W II. chez d’autres constructeurs. si on prend d = 1 ou f.1 ou ADDWF 70h.

le programme continue ici si Z=1 II. : decrement skip if Z : décrémente le registre F et sauter une ligne si le résultat = 0. Le paramètre 1 indique que le résultat de la décrémentation doit aller dans F.5.f suite du programme suite du programme … .Z clrf 70h cmpf 70h. comme elle positionne l’indicateur Z.15 MOVF MOVF STATUS. l’instruction MOVF semble inutile car elle permet de copier un registre sur lui-même ce qui à priori ne sert à rien. II.1 deccfsz F.0 35h.11 L’instruction goto étiquette (label) Permet de transférer l’exécution à une autre position du programme repérée par une .b exemple : : bit test skip if clear : teste le bit b du registre F et saute l’instruction suivante si le bit testé est nul : bit test skip if set : teste le bit b du registre F et saute l’instruction suivante si le bit testé est égal à 1 sublw 100 btfss STATUS.1 : increment skip if Z : incrémente le registre F et sauter une ligne si le résultat = 0. le programme continue ici si Z=0 .5.9 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.0 . après btfss. après btfss. tester le bit Z du registre STATUS et sauter une ligne si Z=1 . btfsc F. Le paramètre 1 indique que le résultat de l’incrémentation doit aller dans F. MOVF STATUS.b btfss F. 100 – W  W . elle permet de tester si le contenu d’un registre est égal à zéro II.10 Les instructions incfsz et decfsz Ces instructions permette d’incrémenter ou de décrémenter un registre et de sauter si le résultat est nul Incfsz F. Copier le contenu du registre STATUS dans l’accumulateur W . Copier le contenu de la case mémoire d’adresse 35h dans l’accumulateur W W MOVF RAM Avec le paramètre d=1.5. Copier le contenu du registre STATUS dans lui même En réalité cette instruction peut s’avérer utile car.1 .

16 Instruction 1 Instruction 2 Goto bonjour instruction 3 instruction 4 instruction 5 instruction 6 instruction 7 bonjour II. Fonction afficher . quand il rencontre l’instruction return. Sa première 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 Instruction Instruction Instruction Instruction Instruction Instruction Instruction return La différence en call et goto est que.12 L’instruction call L’instruction call permet d’appeler une fonction. Une fonction est un sous programme écrit à la suite du programme principal. Comme ça. il sait où il doit retourner pour continuer l’exécution du programme principal. il sauvegarde l’adresse de la ligne suivante avant d’aller exécuter les instructions constituant la fonction. quant le processeur rencontre l’instruction call.5.

B > 0 ==> A .17 II. voir liste des instructions ci-dessous.B < 0 ==> On peut conclure : Z=1 ==> égalité C=1 ==> A sup ou égal à B C=0 ==> inférieur . les drapeaux Z et C sont positionnés comme suit : A . Toutes les instructions n’agissent pas sur les indicateurs. la soustraction et la comparaison Z=1 .B = 0 ==> A .5. Z : passe à 1 quand le résultat d’une instruction est nul C : passe à 1 quand l’opération a généré une retenue DC : passe à 1 quand les 4ème bits génère une retenue Ces bits peuvent être utilisé très astucieusement par les instructions btfsc et btfss qui permettent de tester un bit et de réaliser un saut conditionnel. C=1 Z=0 . C=0 Suite à une soustraction.1 Les indicateurs.13.13 Les indicateur d’état (drapeaux) Les bits Z.5. STATUS IRP RP1 RP0 Z DC C II. Nous aurons l’occasion d’en reparler dans la suite du cours. DC et C situés dans le registre STATUS sont des indicateurs qui permettent de savoir comment une instruction s’est terminée. C=1 Z=0 .

Ça peut être une constante s'il s'agit d'une instruction avec adressage Literal. mais sachez que le compilateur MPASM accepte les instructions et les directives en minuscule et en majuscule. Par Octal O'nnn' O'44' exemple le fichier p16f876. INCLUDE "p16f876. sinon voir tableau ci-contre 0xnn 0x24 nnh 24h Binaire B'…. charger dans W la constante 0x20 XX. il la remplacera par 0x20. la base par défaut pour les nombres (r) ainsi que d'autres paramètres. pour le reste. XX4 .36 seront considérés par l'assembleur comme des nombre Hexadécimal H'nn' H'24' décimaux.  LIST : permet de définir un certain nombre de paramètres comme le processeur utilisé (p). r=dec Base Préfixe Exemple (36) Décimal D'nnn' D'36' avec r=dec. ou d'une adresse s'il s'agit d'une instruction avec adressage direct. Remarque : Je vais présenter les directives en Majuscule. XX1. consulter la documentation de MPASM "MPASM USER'S GUIDE". Attention ce n’est pas le cas pour les étiquettes et les noms de déclaration des constantes.w . Ce ne sont pas des instructions destinées au PIC. les nombres sans spécification particulière . Exemple : LIST p=16F876. XX2. Nous ne présentons ici que quelques directives.' B'00100100'  INCLUDE : permet d'insérer un fichier source.nnn . MOVLW MOVF  XX .inc contient la définition d'un certain nombre de constante comme les noms des registres ainsi que les noms de certains bits. XX3.6 Les directives de l'assembleur MPASM Les directives de l'assembleur sont des instructions qu'on ajoute dans le programme et qui seront interprétées par l'assembleur MPASM.18 II.inc"  EQU : permet de définir une constante ou une variable : XX EQU 0x20 Chaque fois que le compilateur rencontrera XX. charger dans W le contenu de la case d’adresse 0x20 CBLOCK/ENDC : permet de définir un ensemble de constantes : L'ensemble des déclarations suivantes : XX1 XX2 XX3 XX4 EQU EQU EQU EQU 0x20 0x21 0x22 0x23 0x20 peut être remplacé par CBLOCK ENDC  ORG : définit la position dans la mémoire programme à partir de laquelle seront inscrites les instructions suivantes.

5 #DEFINE allumer allumer eteindre  bsf PORTC. II. éteindre la LED branchée sur la broche 5 de PORTC DE : pour déclarer des donnés qui seront stockée dans l'EEPROM de donnée au moment de l'implantation du programme sur le PIC ORG 0x2100 DE "Programmer un PIC.3 . 70.5 . il le remplacera par PORTB. sera remplacée par la suite d’instructions :  END : indique la fin du programme . rien de plus simple".’Hello’ RETLW 10 RETLW 35h RETLW 'H' RETLW 'e' RETLW ‘l’ RETLW ‘l’ RETLW ‘o’ .5 .affecte l’abréviation eteindre à l’instruction bcf PORTC. allume la LED branchée sur la broche 5 de PORTC .35h.5 .3 .affecte l’abréviation allumer à l’instruction bsf PORTC. dans ce cas c’est équivalent à XX EQU 0x20 #DEFINE LED BCF LED PORTB. car elle permet d’affecter toute une chaîne à une abréviation #DEFINE XX 0x20 . ici chaque fois que le compilateur rencontrera le mot LED.19 Fig. éteindre la LED branchée sur la broche 3 de PORTB On peu ainsi affecter une abréviation à toute une instruction #DEFINE eteindre bcf PORTC.1 : Illustration de la directive ORG  #DEFINE : fonctionne un peu comme la directive EQU tout en étant un peu plus générale. 'Z'  DT : pour déclarer un tableau RETLW DT 10.

Permet de dédicacer RB7 et RB6 à la communication avec un debugger. On peut choisir de protéger la totalité de la mémoire ou seulement une partie. 1 : RB6 et RB7 sont des I/O ordinaires (_DEBUG_OFF) 0 : RB6 et RB7 sont utilisés pour le debuggage sur circuit (_DEBUG_ON) WRT : bit 9 : Autorisation d’écriture en flash 1 : Le programme peut écrire dans les zones non protégées par les bits CP1/CP0 (_WRT_ENABLE_ON) 0 : Le programme ne peut pas écrire en mémoire flash (_WRT_ENABLE_OFF) CPD : bit 8 : Protection en lecture de la mémoire EEPROM de données.20  __CONFIG : permet de définir les 14 bits (fusibles ou switch) de configuration qui seront copiés dans l'EEPROM de configuration (adresse 2007h) lors de l'implantation du programme dans le PIC. 1 : mémoire EEPROM non protégée (_CPD_OFF) 0 : mémoire EEPROM protégée 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 utilisée comme I/O standard (_LVP_OFF) BODEN : bit 6 : provoque le reset du PIC en cas de chute de tension (surveillance de la tension d’alimentation) 1 : En service (_BODEN_ON) 0 : hors service (_BODEN_OFF) PWRTE : bit 3 : Délai de démarrage à la mise en service. 1 : délai hors service (sauf si BODEN = 1) (_PWRTE_OFF) 0 : délai en service (_PWRTE_ON) WDTE : bit 2 : Validation du Watchdog timer 1 : WDT en service (_WDT_ON) 0 : WDT hors service (_WDT_OFF) FOSC1/FOSC0 : bits 1/0 : sélection du type d’oscillateur 11 : Oscillateur de type RC (_RC_OSC) (3K < R < 100k. est automatiquement mis en service si le bit BODEN est positionné. 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) . Les différentes zones pouvant être protégées 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 l’intégralité de la mémoire (_CP_ALL) DEBUG : bit 11 : Debuggage sur circuit. Attention. CP0 DEBUG — WRT CPD LVP BODEN CP1 CP0 PWRTE WDTE F0SC1 F0SC0 CP1 CP1/CP0 : bits 13/12 . Déterminent quelle zone de la mémoire programme sera protégée contre la lecture externe (via ICSP) ou l'écriture par programme conformément à l'état du bit 9 (WRT).

. les microcontrôleurs avec l’extension « A » comme 16F876A ou 16F877A ont une disposition des bits de configuration légèrement différente. consultez le datasheet.21 Voici 3 exemples d’utilisation : __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 deux sont disponibles gratuitement sur le Web. n'est malheureusement pas gratuit. Internet est riche en informations sur ce sujet.hex contenant une suite d'instruction compréhensible par le pic.123. Le programmateur lui-même. un outil de simulation et le logiciel de programmation. ensuite. Mettre le PIC dans son montage final.oumnad. le compilateur MPASM. compiler et éventuellement simuler nos programmes. On peut utiliser les programmateurs de Microchip ou tout autre programmateur acheté ou réalisé par soit même.22 III Les outils de développement L’outil de développement principal est l’environnement de développement intégré MPLAB fournit gratuitement par Microchip III. pour implanter les programmes dans la mémoire flash du PIC.asm Compiler ce programme avec l'assembleur MPASM fourni par Microchip. Le résultat est un fichier exécutable avec l'extension . mettre sous tension et admirer le travail. Transplanter le fichier .fr . nous utiliseront MPLAB pour écrire.   Microchip propose gratuitement l'outil de développement MPLAB qui regroupe l'éditeur de texte. nous utiliserons un programmateur fait maison que nous piloteront par le logiciel ICPROG.1 Procédure de travail Les étapes nécessaires permettant de voir un programme s'exécuter sur un PIC sont :   Ecrire un programme en langage assembleur dans un fichier texte et le sauvegarder avec l'extension . Vous trouverez une rubrique sur les programmateurs de PIC sur mon site http://z. Pour ce qui nous concerne.hex dans la mémoire programme du PIC (mémoire flash) à l'aide d'un programmateur adéquat.

23

III.2 L’environnement de développement MPLAB
MPLAB-IDE peut être téléchargé sur le site Web http://www.microchip.com Après l'installation, lancer MPLAB et faire les config ci-dessous :  Configure  Select Device  PIC16F876 ou PIC16F877

Nous allons réaliser un tout petit programme sans grand intérêt pour voir la procédure de fonctionnement (avec MPLAB 6.30)   Ouvrir une nouvelle fenêtre (de l'éditeur) pour commencer à écrire un programme : file  new ou cliquez sur l'icône feuille blanche Taper le petit programme ci-dessous dans la fenêtre qui vient de s'ouvrir. Ce programme incrémente sans fin la position mémoire (RAM) 70H incf 70h,1 goto looop end

loop

 

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 problème, 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 définit dans la ligne précédente prend seulement deux o. Corrigez et

recommencez. Cette fois ça a l'air d'aller. On peut vérifier que le compilateur a crée le fichier bidon.hex dans la même 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 détruire.  Nous pouvons maintenant exécuter notre programme en simulation pour voir s'il réalise bien la tache demandée : Pour faire apparaître la barre d'outil du simulateur :

Debugger  Select tool  MPLAB SIM
  

Ouvrez la fenêtre qui visualise la mémoire RAM : view  FileRegisters. et repérer la case mémoire 70h Exécuter maintenant le programme PAS à PAS en cliquant à chaque fois sur le bouton Step Into {} en observant la case mémoire 70h . (on dirait que ça marche). On peut aussi exécuter en continu en cliquant sur le bouton animate  , pour arrêter, il faut cliquer sur le bouton halt 

Pour plus de détail, consulter le manuel d'utilisation de MPLAB

24

Modifiez maintenant la case 70h par la case 190h, compilez, simulez et tirer les conclusions

25

III.3 Structure générale d’un programme
;***************************************************************** ; 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 bsf movlw movwf bcf bsf movlw movwf bsf movlw movwf end Compilons le programme avec MPLAB (projectquikbuild) et visualisons la mémoire programme (viewprogram memory) , on obtient la fenêtre ci-dessus. STATUS,RP0 STATUS,RP1 'A' 20h STATUS,RP0 'B' 0xA0 STATUS,RP0 STATUS,RP1 'C' 110h STATUS,RP0 'D' 190h ;bank 0 ;bank 0

;bank 1

;bank 2 ;bank 2

;bank 3

Observations :
 Comme il n'y a pas d'interruption, on ne s'est pas soucié de l'implantation du programme dans la mémoire programme (directive ORG). on remarque sur la fenêtre que l'implantation du programme commence à l'adresse 0. La colonne de droite de cette fenêtre 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 déclarations STATUS EQU 0x3 et RP0 EQU 0x5

1 Comparaison Exercice 8) : (comp1. E dans la case mémoire 16Fh S dans la case mémoire 16Fh I dans la case mémoire 16Fh . -5 dans la position 110h.4 Quelques exemples Exercice 5) : Accès à la RAM par l'adressage direct Donner le programme qui copie : 35 dans la position 20h. 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.asm) Comparer les contenus des cases mémoire 6Fh et EFh. Rassurons nous.RP0=11 (bank 3) et on obtient 11001 0000 = 190h III.4. 'A' dans la position A0h 35h dans la position 190h Exercice 6) : Soustraction Donner le programme qui :  soustrait la constante 33 de l'accumulateur W (W-33)  Soustrait la constante 40h de la case mémoire d'adresse 70h ([70h]-40h  [70h])  qui soustrait le contenu de la case mémoire 70h de l'accumulateur W avec le résultat dans W ( W – [70h]  W )  qui soustrait le contenu de la case mémoire 71h de l'accumulateur W avec le résultat dans la case mémoire ( W – [71h]  [71h] ) Exercice 7) : Accès à la RAM par l'adressage indirect Donner le programme qui copie l'alphabet majuscule dans la RAM à partir de la position 190h III. s’il son égaux mettre à zéro tous les bits de la case 16Fh sinon mettre à 1 tous les bits de la case 1EFh Exercice 9) : (comp2.26  On remarque aussi que l'instruction movwf 190h a été remplacée par movwf 0x10.asm) Comparer les contenus des cases mémoire  si [6Fh] = [EFh] copier la lettre  si [6Fh] > [EFh] copier la lettre  si [6Fh] < [EFh] copier la lettre 6Fh et EFh. c'est quand même l'adresse 190h qui sera adressée l'adresse 001 0000 sera complétée par RP1.

27 III.2 Boucles de temporisation Il arrive souvent qu'on désire introduire des temporisations pendant l'exécution d'un programme. on met une valeur N1 dans la case mémoire 70h et on la décrémente jusqu'à 0 movlw movwf decfsz goto 4 70h 70h.4. soit T1max = 773 µs = 0. il faut la déclarer au début avec la directive EQU tempo1: t1: . et on l'appelle avec l'instruction Pour le calcul il faut rajouter 2 cycles pour l'instruction call et 2 cycles pour l'instruction T1 = 3 W + 5 cycles return. ce qui donne une temporisation max de 769 cycles. On note AN1 la case mémoire qui sert de compteur. 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.f ici 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 chaque passage dans la boucle prend (1+2) cycle sauf le dernier qui prend 2 cycle T = 2 + (W-1)*3 + 2 = 3*W + 1 cycles La valeur max que l'on peut donner à W est = 0 = 256. pour l'instant regardons comment on peut réaliser des temporisations à l'aide de simples boucles. on peut calculer le temps que mettra le processeur terminer la boucle de décrémentation III. 1 cycle = fosc/4 = 1 µs. Avec un quartz = fosc = 4 Mhz. L'idée est d'initialiser une variable à une valeur donnée et ensuite la décrémenter en boucle jusqu'à ce qu'elle atteint 0.4.2. il faut placer une valeur dans W avant d'appeler cette fonction movwf AN1 decfsz AN1. Connaissant le temps d'exécution de chaque instruction.77 ms .1 Temporisation avec une boucle Examinons l'exemple ci-dessous. Nous étudierons ces modules plus tard. ce qui donne Le maximum est obtenu pour N1 =256.f goto t1 return call tempo1 Cette fonction doit être placée après le programme principal. Le PIC dispose de 3 timers permettant de gérer le temps avec précision.

f goto t3 return T3 = 2 + 2 + W(t2+3)-1 + 2 avec t2=256*(767+3)-1 on obtient : T3 = 197122 W +5 cycles Le maximum est obtenu pour N3 =256.4.28 III. C’est N3 qui constituera le paramètre de la fonction. soit T2max = 197125 µs = 0.197 s III.2. C’est N2 qui constituera le paramètre de la fonction. tempo3 : t3 : .2. La boucle extérieure se fait N2 fois. dans ce cas il faut revoir les formules.3 Temporisation avec 3 boucles imbriquées Les boucles intérieures (N1 et N2) se font toujours 256 fois.46 s Remarque : La précision de ces fonctions peut être améliorée en y insérant des instructions nop.f goto t3 decfsz AN2. soit T3max = 50463237 µs = 50. . On verra plus tard comment on peut faire des temporisations à l’aide des timers.f goto t2 return T2 = 2 + 2 + [W(t1+3)-1] + 2 avec t1=256*3-1=767 on obtient : T2 = 770 W +5 cycles Le maximum est obtenu pour N2 =256. il faut définir W dans le programme principal movwf AN2 decfsz AN1.4.f goto t2 decfsz AN2. Il faut le placer dans W avant de l’appeler.2 Temporisation avec 2 boucles imbriquées La boucle intérieure (N1) se fait toujours 256 fois. tempo2 : t2 : .Il faut définir W dans le programme principal movwf AN3 decfsz AN1. Il faut le placer dans W avant de l’appeler.f goto t3 decfsz AN3. La boucle extérieure se fait N3 fois.

RA2.2.2 : LED sur RA4 du port pour ensuite faire une opération dessus. INCF … Ces instructions réalisent Vdd une lecture-écriture en commencent par lire l'état Fig.2 Les autres broches de PORTA Les autres broches (RA0. TRISC et TRISD et TRISE: Bit k de TRISx = Bit k de TRISx = 0 1  broche k de PORTx =  broche k de PORTx = SORTIE ENTRÉE Certains ports ont quelques particularités que nous allons détailler ci-desous. IV. Au RESET. Or. BSF ou BCF Vdd Fig. la sortie est reliée à la masse. IV.5V qui sera considérée (à tort) comme un niveau bas lors de la lecture du port par les instructions précitées. il faut ajouter une résistance de pull-up externe.1) illustre (pour les non électroniciens) le principe d'une sortie drain ouvert (ou collecteur ouvert) : si RA4 est positionnée à 0. soit comme entrée horloge pour le Timer TMR0 En sortie. Si on envoie 1. IV.1. l'interrupteur se ferme et la LED s'allume. Si RA4 est placée à 1. l'interrupteur est ouvert. IV. Il faut Fig. (sur Fig. Chaque broche d’un port peut être configurée soit en entrée soit en sortie à l’aide des registres de direction TRISA. PORTD et PORTE.1. RA1. RA3 et RA5) peuvent être utilisée soit comme E/S numériques soit comme entrées analogiques. PORTC. ces E/S sont configurées en entrées . 1k RA4 Si on veut utiliser RA4 pour allumer une LED. La solution est LED d'utiliser des instructions qui positionnent le PORT sans tenir compte de son état courant comme MOVWF. c'est un niveau bas. RA4 est une E/S à drain ouvert. la LED est allumée et elle impose une RA4 tension de l'ordre de 1. si on 1k envoie 0 sur RA4. Le schéma (Fig. la broche RA4 peut être utilisée soit comme E/S numérique normale. la sortie serait déconnectée s'il n'y avait pas la résistance externe qui place la sortie au niveau haut. l'interrupteur est fermé.1 : résistance de pull-up juste remarquer que la logique est inversée. pour l'utiliser comme sortie logique. La logique LED n'est pas inversée mais il demande une précaution particulière. ADDWF. Au départ toutes les broches sont configurées en entrée IV.1 La broche RA4 Vdd En entrée.1 Le port d' E/S PORTA Le port A désigné par PORTA est un port de 6 bits (RA0 à RA5). RA6 et RA7 ne sont pas accessibles. Il ne faut pas positionner la sortie RA4 à l'aide d'une instruction qui réalise une RA4 opération sur l'état actuel du port. TRISB. l'interrupteur s'ouvre et la LED s'éteint. Le schéma illustré sur Fig.29 IV Les ports d’E/S Le PIC 16F877 dispose de 33 broches d’entrée sortie regroupés dans 5 ports PORTA. l'interrupteur est ouvert. PORTB. IV. IV.3) si la sortie était au niveau 1k haut. XORWF ou COMF.3 peut aussi être utilisé. IV. on peut utiliser le schéma de Fig. genre IORWF.3 : LED sur RA4 IV. positionner un bit de TRISA à 1 configure la broche correspondante de PORTA en entré et inversement. ANDWF. La configuration de direction se fait à l'aide du registre TRISA. IV.

La configuration de direction se fait à l'aide du registre TRISC. le port I2C ou le port série. Par exemple.2 Le port d' E/S PORTB   Le port B désigné par PORTB est un port bidirectionnel de 8 bits (RB0 à RB7). Pour l’utilisation d’une broche du port C comme E/S normale. une quelconque des lignes RB4 à RB7 peut déclencher l'interruption RBI. le timer 2. Pour configurer une broche en entrée.   IV. PORTD n’est pas implémenté sur tous les processeurs 16F87X. En entrée. Chaque broche et configurable en entrée ou en sortie à l’aide du registre TRISD. on positionne le bit correspondant dans TRISD à 1 et inversement. il faut placer 06h dans le registre ADCON1 (bank1) Quelque soit le mode (Analogique ou Numérique).4 Le port d' E/S PORTD   Le port D désigné par PORTD est un port bidirectionnel de 8 bits (RD0 à RD7). Toutes les broches sont compatibles TTL. ceci sera précisé au moment de l'étude de chacun de ces périphériques. si TIMER1 est validé. voir chapitre VIII). il faut s’assurer qu’elle n’a pas été affectée à un de ces modules. il est disponible sur le 16F877. Au départ toutes les broches sont configurées en entrée. positionner un bit de TRISB à 1 configure la broche correspondante de PORTB en entré et inversement. 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 entrée IV. les modules de comparaison et de capture CCP1/2. la ligne RB0 appelée aussi INT peut déclencher l’interruption externe INT. Toutes les broches sont compatibles TTL et ont la fonction trigger de Schmitt en entrée.3 Le port d' E/S PORTC   Le port C désigné par PORTC est un port bidirectionnel de 8 bits (RC0 à RC7). Au départ toutes les broches sont configurées en entrée. il faut écrire '00000110' dans le registre ADCON1 (pour plus de détail.   IV. La configuration de direction se fait à l'aide du registre TRISB. il peut utiliser les broches RC0 et RC1 selon sa configuration.30 analogiques. Toutes les broches du port C peuvent être utilisées soit comme E/S normales soit comme broches d'accès à différents modules comme le timer 1. Nous reviendrons là-dessus dans le paragraphe réservé aux interruptions. Pour utiliser PORTA en port Numérique (normal). positionner un bit de TRISC à 1 configure la broche correspondante de PORTC en entré et inversement. le 16F874 et le 16F871  . Toutes les broches sont compatibles TTL. En entrée. Pour les utiliser en E/S numériques.

Les trois bits de PORTE deviennent les entrées de control du PORTD qui (dans ce cas) fonctionne en mode parallel Slave mode A la mise sous tension (RESET). Les 3 sont configurables en entrée ou en sortie à l’aide des bits 0. le 16F874 et le 16F871 Les 3 bits de PORTE peuvent être utilisés soit comme E/S numérique soit comme entrées analogiques du CAN. Si le bit PSPMODE de TRISE est placé à 1. WE et CS) Pour utiliser PORTD en mode normal.31  PORTD peut être utilisé dans un mode particulier appelé parallel slave port.Placer 06h dans ADCON1 . Dans ce cas les 3 bits de PORTE deviennent les entrées de control de ce port (RE.5s. la temporisation sera réalisée à l'aide de boucles imbriquées Exercice 11) : compteur impulsions Programme qui : – Allume la LED branchée sur RB3 – Compte 150 impulsions sur l'entrée RA4 (la case mémoire 70h servira de compteur) – Eteint la LED branchée sur RB3 .5 Le port d' E/S PORTE      PORTE contient seulement 3 bits RE0. RE1 et RE2. il faut placer le bit PSPMODE de TRISE à 0 IV. les 3 broches de PORTE sont configurées comme entrées analogiques. La configuration se fait à l’aide du registre ADCON1. PORTE n’est pas implémenté sur tous les processeurs 16F87X. il est disponible sur le 16F877. pour cela il faut placer le bit PSPMODE (bit 4) de TRISE à 1. Pour utiliser les broches de PORTE en E/S numériques normales : . Sachant que le PIC est doté d'un quartz de 4 MHz.Placer le bit PSPMODE de TRISE à 0 Exercice 10) : Clignoter une LED Donner le programme qui fait clignoter une LED branchée sur RA0 avec une temporisation voisine de 0. 1 ou 2 du registre TRISE.

C’est ce que nous allons détailler dans les paragraphes ci-dessous. (voir les directive DE et ORG dans ce cours et d’autres directives comme DA. et la dernière aura l’adresse 255. Son implantation physique commence à la position d’adresse absolue 2100h. . . on utilise 4 registres particuliers :     EEADR : registre d’adresse (relative) EEDATA : registre de donnée EECON1 : registre de control (bank 2) (bank 2) (bank 3) (bank 3) — — — WRERR WREN WR RD EECON2 : 2ème registre de control EEPGD Le registre EECON1 : EEPGD : Accès à la mémoire EEPROP ou à la mémoire Programme 0 : EEPROM de données 1 : Mémoire 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 autorisée WR : Write Enable. Le flashage se fait à l’aide d’un programmeur et le soft qui va avec. On dispose de deux méthodes pour écrire dans ces mémoires. Ce bit ne peut pas être mis à zéro par une instruction RD . Pour accéder à la EEPROM. Ce bit ne peut pas être mis à zéro par une instruction. La première position aura l’adresse 0. Il est remis à zéro automatiquement à la fin de l'écriture. Il est remis à zéro automatiquement à la fin de la lecture. Ce bit doit être mis à 1 pour démarrer la lecture d'un octet. Mais pour y accéder à partir des programmes utilisateur on utilise l’adressage relatif par rapport à la première position.1 La mémoire EEPROM de données Le PIC 16F876/877 dispose de 256 octets de mémoire EEPROM de donnée.hex). la deuxième aura l’adresse 1. Ce bit doit être mis à 1 pour démarrer l'écriture d'un octet. Les instructions sont flashés dans la EEPROM programme et les donnée sont flashés dans la EEPROM de données.32 V Les mémoires permanentes Le PIC 16F877 dispose de 2 mémoires permanentes. DW … dans le manuel d’utilisation de MPASM) La deuxième méthode consiste à accéder aux mémoires EEPROM à partir du programme durant la phase d'exécution de ce dernier. La mémoire EEPROM PROGRAMME de capacité 8k mots de 14 bits et la mémoire EEPROM DE DONNÉES de capacité 256 octets. : Read Enable. V. La première consiste à flasher le PIC avec l'exécutable (.

à l'exception des points suivant :   Le bit EEPGD doit être placé à 1 Le registre EEADR (8 bits) seul ne suffit pas à adresser les 8k de mémoire programme.Ecrire AAh dans EECON2 (commandes de process hardwares) . La donnée présente dans EEDATA est alors copiée dans la EEPROM mais cette opération prend 10 ms. Elle est non volatile (flash) et reprogrammable à souhait. le PIC commence l'exécution à l'adresse 0000H. on lui accole le registre EEADRH dans lequel il faut écrire la partie haute de l'adresse. on lance l’opération d’écriture à l’aide du bit WR de EECON1 et du registre EECON2.2 Procédure d'écriture dans l'EEPROM Pour écrire une donnée dans une position de la mémoire EEPROM. WR ne peut être positionné que si le bit WREN a été positionné avant. L'accès à la mémoire flash par les instructions du programme se fait de la même façon que l'accès à l'EEPROM de données.Positionner le bit WR pour démarrer l'opération d'écriture. . on place l’adresse dans le registre EEADR.Ecrire 55h dans EECON2 (commande de process hardwares) .2 La mémoire Programme ou mémoire flash Cette mémoire de 8 x 1024 mots de 14 bits sert à stocker le programme.1.33 V. 7) Remarque : Les bits WREN et WR ne peuvent être positionné dans la même instruction. Le programme exécutable par le PIC est implanté dans la mémoire flash à l'aide d'un programmateur (hard+soft) sur lequel nous reviendrons dans la suite de ce document. Chaque position de 14 bits contient une instruction. De plus. On obtient ainsi les 13 bits nécessaires pour adresser 8K. on lance l’opération de lecture à l’aide du bit RD du registre EECON1. lorsqu'il y a une interruption. la donnée dans le registre EEDATA. mais elle est accessible par programme et peut donc être utilisée comme une extension de la mémoire EEPROM de données. le drapeau EEIF est levé ce qui peut déclencher l'interruption EEI si elle a été validée auparavant : 1) 2) 3) 4) 5) 6) Interdire les interruptions (si elles ont été validées avant : bit INTCON. L'emplacement du programme peut se situer à n'importe quel endroit de la mémoire. V.1 Procédure de lecture dans l'EEPROM Pour lire le contenu d’une position de la mémoire EEPROM. Ce bit revient à 0 automatiquement tout de suite après le transfert de la donnée vers EEDATA. A la fin de l'écriture le bit WR revient à zéro automatiquement. la donnée désirée est tout de suite disponible dans le registre EEDATA : 1) Mettre le bit EEPGD à 0 pour pointer sur l'EEPROM de donnée 2) Placer l’adresse relative de la position à lire dans EEADR 3) Mettre le bit RD à 1 pour démarrer la lecture.1. le PIC va à l'adresse 0004H. Il est donc nécessaire de bien organiser le programme si celui-ci utilise des interruptions. et attendre qu’il revienne à 0 Recommencer au point (4) si on a d'autres données à écrire. V. Cependant il faut savoir que suite à un RESET ou lors de la mise sous tension. on place l’adresse dans le registre EEADR. (moins d'un cycle) 4) Traiter la donnée disponible dans EEDATA 5) Recommencer au point 2 si on a d'autres données à lire.GIE) Mettre le bit EEPGD à 0 pour pointer sur l'EEPROM de donnée Positionner le bit WREN pour valider l'écriture dans l'EEPROM Placer l’adresse relative de la position à écrire dans EEADR Placer la donnée à écrire dans le registre EEDATA .

l'exécution reprend à l'instruction qui suit le 2 ème NOP. à la fin de l'écriture.2. Attention :  Le contenu d’une position mémoire programme permet de remplir 2 positions de la RAM.  Le débordement de EEADR n’affecte pas EEADRH .  V. On lui accole le registre EEDATH qui contiendra les 6 bits supérieurs.Ecrire AAh dans EECON2 (commandes de process hardwares) .1 1) 2) 3) 4) 5) 6) Procédure de lecture dans la mémoire programme Mettre le bit EEPGD à 1 pour pointer sur la mémoire programme Placer l’adresse de la position à lire dans EEADRH:EEADR Mettre le bit RD à 1 pour démarrer la lecture Attendre 2 cycles machine (2 instructions NOP) Lire le contenu des registres EEDATH:EEDATA Recommencer au point 2) si on a d'autres données à lire V. Il suffit de mettre deux instructions NOP avant de continuer.Ecrire 55h dans EECON2 (commande de process hardwares) . le processeur arrête l'exécution des instructions. Exercice 12) Programme qui écrit l'alphabet majuscule dans la mémoire EEPROM de données à partir de la position 20h. Exercice 13) EEPROM-D vers RAM Programme qui utilise la directive DE pour initialiser les premières positions de l'EEPROM de données avec la chaîne "BONJOUR CHER AMI". Pendant la phase d'écriture.34  Le registre EEDATA (8 bits) seul ne suffit pas pour contenir les 14 bits contenus dans une position de la mémoire programme. Le programme doit ensuite lire ces caractères (1 par 1) dans l' EEPROM et les copier dans la RAM à partir de la position 110h Exercice 14) Mem-Prog vers RAM Programme qui lit 20 positions de la mémoire programme débutant à la position 12FAh et les copie dans la RAM à partir de la position 110h. Il n'est donc pas nécessaire d'attendre la fin de l'écriture pour continuer car ceci se fait automatiquement. La boucle de scrutation ne sera exécutée qu'après la fin de l'écriture ce qui la rend tout à fait inutile.2.2 1) 2) 3) 4) 5) 6) Procédure d'écriture dan la mémoire programme Interdire les interruptions (si elles ont été validées avant) Mettre le bit EEPGD à 1 pour pointer sur la mémoire programme Positionner le bit WREN pour valider l'écriture dans la mémoire programme Placer l’adresse de la position à écrire dans EEADRH:EEADR Placer la donnée à écrire dans le registre EEDATH:EEDATA . ça ne sert à rien d’attendre que WR passe à 0 pour détecter la fin de l'écriture.Positionner le bit WR pour démarrer l'opération d'écriture Exécuter 2 instructions NOP Recommencer au point 3 si on a d'autres données à écrire 7) 8) Remarque : après le point (6). Le processeur arrête l'exécution du programme pendant la phase d'écriture dans la mémoire programme. Il faut insérer deux instructions NOP dans les cycles de lecture/écriture.

A la fin de cette procédure. le second permet au programmeur de savoir de quelle interruption il s'agit. l'es interruptions sont classées en deux catégories. le microcontrôleur reprend le programme principal à l’endroit où il l’a laissé. les interruptions primaires et les interruptions périphériques.1 Déroulement d'une interruption Lorsque positionné à déclenchée : d'interruption      l'événement déclencheur 1 (levé). Si l'interruption le programme arrête ce qui se trouve à l'adresse 4 d'une interruption intervient. PEIE et le bit individuel de l’interruption.35 VI Les interruptions Une interruption provoque l’arrêt du programme principal pour aller exécuter une procédure d'interruption. . alors son drapeau est a été validée (bits de validations = 1). Si cela est nécessaire. les registres W et STATUS doivent être sauvegardés en RAM puis restaurés à la fin de la routine pour que le microcontrôleur puisse reprendre le programme principal dans les mêmes conditions où il l'a laissé. Le premier permet d'autoriser ou non l'interruption. puis remplacée par la valeur 0004 (adresse de la routine d'interruption). A la fin de la procédure d'interruption (instruction RETFIE) : le bit GIE est remis à 1 (autorisant ainsi un autre événement) le contenu du PC est rechargé à partir de la pile ce qui permet au programme de reprendre là où il s'est arrêté Deux remarques importantes sont à faire : Le drapeau reste à l’état haut même après le traitement de l’interruption. un bit de validation et un drapeau. il faut toujours le remettre à "0" à la fin de la routine d'interruption sinon l'interruption sera déclenchée de nouveau juste après l'instruction RETFIE Seul le PC est empilé automatiquement.GIE Toutes les interruptions périphériques peuvent être validées/interdites par le bit INTCON. Elles sont gérées par les registres : INTCON PIE1 (bk1) PIR1 (bk0) PIE2 (bk0) PIR2 (bk1) OPTION_REG(bk1)    GIE PSPIE PSPIF PEIE T0IE ADIE RCIE ADIF RCIF INTEDG INTE TXIE TXIF EEIE EEIF RBIE SSPIE SSPIF BCLIE BCLIF T0IF CCP1IE CCP1IF INTF TMR2IE TMR2IF RBIF TMR1IE TMR1IF CCP2IE CCP2IF Toutes les interruptions peuvent être validées/interdites par le bit INTCON. Sur le 16F876/877. elle est alors qu'il est en train de faire et va exécuter la procédure en exécutant les étapes suivantes : l'adresse contenue dans le PC (Program Counter) est sauvegardée dans la pile.PEIE Chaque interruption peut être validée/interdite par son bit de validation individuel En résumé. Le bit GIE est placé "0" pour inhiber toutes les interruptions (afin que le PIC ne soit pas dérangé pendant l'exécution de la procédure d'interruption). pour valider une interruption périphérique (par exemple). A chaque interruption sont associés deux bits. VI. il faut positionner 3 bits. Par conséquent. GIE.

TMR2IF PIR1.CCP1IE PIE2. VI.2 Les sources d'interruption Interruption : Source d’interruption T0I : Débordement Timer 0 INT : Front sur RB0/INT RBI : Front sur RB4-RB7 ADI : Fin de conversion A/N RCI : Un Octet est reçu sur l'USART TXI : Fin transmission d'un octet sur l'USART SSPI : Caractère émis/reçu sur port série synchrone TMR1I : Débordement de Timer 1 TMR2I :Timer 2 a atteint la valeur programmée PSPI : Lecture/écriture terminée sur Port parallèle (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. ATTENTION : Le drapeau RBIF ne peut être remis à zéro sans la lecture préalable de PORTB (MOVF PORTB.PSPIE PIE1.CCP2IE PIE2.f).TXIF PIR1.ADIF PIR1. En plus de son bit de validation INTE et son drapeau INTF.4 L'interruption RBI (RB4 A RB7 du port B) Cette interruption est provoquée par un changement d'état sur l'une des entrées RB4 à RB7 du port B.TMR1IE PIE1. la LED branchée sur RB1 clignote 4 fois au rythme de la ½ seconde Exercice 16) (div-freg-rbi. .BCLIE Flag INTCON.PSPIF PIR1.TMR2IE PIE1. 0=descendant VI.w).RBIF PIR1. On utilisera l'interruption RBI pour détecter les transitions du signal d'entrée.RCIF PIR1.5 Les autres interruptions Les autres interruptions seront abordées au moment de l'étude des modules qui les déclenchent.SSPIF PIR1. Le signal de sortie est généré sur la sortie RB1.T0IF INTCON. Si on ne veut pas modifier le contenu de W. on peut copier PORTB sur luimême (MOVF PORTB.asm) Programme qui utilise l’interruption INT comme suit : Chaque fois que l’entrée RB0 passe de 1 à 0.INTF INTCON.RBIE PIE1.TMR1IF PIR1. elle est gérée aussi par le bit INTEDG (OPTION_REG) qui détermine le front sur lequel l'interruption se déclenche.36 VI. Les bits associés sont RBIE (validation) et RBIF (drapeau).CCP1IF PIR2.EEIF PIR2. Exercice 15) (int.BCLIF PEIE non non non oui oui oui oui oui oui oui oui oui oui oui VI.CCP2IF PIR2.SSPIE PIE1.INTE INTCON.TXIE PIE1. Le front n'a pas d'importance.asm) Ecrire un programme qui réalise une division de fréquence par 5. 1=montant.3 L'interruption INT (Entrée RB0 du port B) Cette interruption est provoquée par un changement d'état sur l'entrée RB0 du port B quand elle est programmée en entrée. Le signal d'entrée est appliqué sur l'entrée RB4.T0IE INTCON.RCIE PIE1.ADIE PIE1.EEIE PIE2.

Au débordement de TMR0 (FF  00). le drapeau INTCON. Le bit T0SE du registre OPTION_REG permet de choisir le front sur lequel le TIMER s'incrémente.37 VII Les Timers VII. T0 l'horloge de TMR0 et TF0 le temps qui sépare 2 levés de drapeau successifs :  Sans prédiviseur : TF0 = 256 T0 = 256 TH  Avec prédiviseur : TF0 = 256 T0 = 256 x (DIV x TH )  Avec prédiviseur et compteur N dans le programme on obtient : NxTF0 = N x 256 x (DIV x TH) Exercice 17) Clignoter LED / TMR0 PIC doté d'un quartz de 4 MHz. Si on note TH la période de l'horloge source. le drapeau T0IF se lève. PS1 et PS2 du registre OPTION_REG (tableau ci-contre).T0IF est placé à 1. le timer ne comte pas pendant deux cycles machine.1 Le Timer TMR0 C’est un compteur 8 bits ayant les caractéristiques suivantes :  Il est incrémenté en permanence soit par l’horloge interne Fosc/4 (mode timer) soit par une horloge externe appliquée à la broche RA4 du port A (mode compteur). Après une écriture. PS2 PS1 PS0 Div o T0SE = 0  incrémentation sur fronts montants o T0SE = 1  incrémentation sur fronts descendants 0 0 0 2 0 0 1 4 Quelque soit l'horloge choisie. chaque fois que le compteur complète un tour. on peut la passer dans un diviseur de 0 1 0 8 fréquence programmable (prescaler) dont le rapport DIV est fixés par 0 1 1 16 les bits PS0. L'affectation ou non du prédiviseur se fait à l'aide du bit PSA du 1 0 0 32 registre OPTION_REG 1 0 1 64 o PSA = 0  on utilise le prédiviseur 1 1 0 128 o PSA = 1  pas de prédiviseur (affecté au chien de garde) 1 1 1 256 Le contenu du timer TMR0 est accessible par le registre qui porte le même nom. Programme qui fait clignoter une LED branchée sur RB0. 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 appliquée à RA4 Dans le cas de l'horloge externe. Ceci peut déclencher l'interruption T0I si celle-ci est validée RBPU T0SE RA4 0 1     OPTION_REG INTEDG T0CS T0SE PSA PS2 PSA 1 PS1 PS0 TF0 T0CS 1 0 TH T0 TMR0 T0IF Horloge à quartz Fosc ÷4 Prédiviseur programmable 0 Fosc/4 PS2 PS1 PS0 TF0 = 256 x (DIV x TH) En résumé.5s à l'aide de TMR0 a) Par scrutation du drapeau T0IF (pas d'interruption) b) En utilisant l'interruption T0I . Il peut être lu ou écrit à n'importe quel moment. delay voisin de 0.

le WDT time-out provoque un WAKE-UP. le WDT time-out provoque un RESET. Pour éviter un WDT timeOut lors de l'exécution d'un programme. on a deux possibilités :   Inhiber le WDT d'une façon permanente en mettant à 0 le bit WDTE dans l'EEPROM de configuration Remettre le WDT à 0 périodiquement dans le programme à l'aide de l'instruction CLRWDT pour éviter qu'il ne déborde PSA Horloge WDT 0 1 0 WDT WDT timeout Prédiviseur programmable PS2 PS1 PS0 1 . L'affectation se fait à l'aide du bit PSA du registre OPTION_REG 0 1 0 4 o PSA = 1  on utilise le prédiviseur 0 1 1 8 o PSA = 0  pas de prédiviseur (affecté à TMR0) 1 0 0 16 Le rapport du prédiviseur est fixé par les bits PS0. Cette situation est souvent exploitée pour réaliser des temporisations  L'horloge du WDT a une période voisine de 70 µs ce donne un Time-Out toutes les 18 ms.38 VII. Il est cependant possible d'augmenter cette durée en faisant PS2 PS1 PS0 Div 0 1 passer le signal Time-Out dans un prédiviseur programmable (partagé avec le 0 0 0 0 1 2 timer TMR0). (WDT TimeOut). l'exécution du programme continue normalement là où elle s'est arrêtée avant de rentrer en mode SLEEP. Lorsqu’il déborde. Ceci permet d’éviter de rester planté en cas de blocage du microcontrôleur par un processus indésirable non contrôlé Si le µC est en mode SLEEP. deux situations sont possibles :  Si le µC est en fonctionnement normal. PS1 et PS2 du registre 1 0 1 32 OPTION_REG (voir tableau ci-contre) 1 1 0 64 1 1 1 128 L'utilisation du WDT doit se faire avec précaution pour éviter la réinitialisation (inattendue) répétée du programme.2 Le Watchdog Timer WDT (Chien de garde) C’est un compteur 8 bits incrémenté en permanence (même si le µC est en mode sleep) par une horloge RC intégrée indépendante de l'horloge système.

RC0 et RC1 sont automatiquement configurées en entrée.39 VII. On le configure à l'aide du registre T1CON (bank0) RC1 T1OSC T1OSCEN RC0 1 0 Horloge Système FOSC/4 TMR1CS T1CON T1SYNC Prédiviseur DIV=1.1 Le mode Timer Dans ce mode.1 .3 Le Timer TMR1 TMR1 est un Timer/Compteur 16 bits accessible en lecture/écriture par l'intermédiaire des registres 8 bits TMR1H (bank0) et TMR1L (bank0) qui constituent sa partie haute et sa partie basse. on n’a pas besoin de configurer les bits TRISC.0 et TRISC. 4 ou 8 selon la valeur des bits T1CKPS1 et T1CKPS0 A son débordement (FFFFh  0000h) le drapeau PIR1.2 Le mode Compteur Dans ce mode.Compteur Asynchrone (horloge externe) Le bit de contrôle TMR1CS détermine le fonctionnement en Timer ou en Compteur et le bit T1SYNC détermine le mode de fonctionnement en synchrone ou en asynchrone     TMR1 peut être arrêté/démarré à l'aide du bit TMR1ON TMR1 peut être RAZ à l'aide du module de capture/comparaison CCP TMR1 peut être précédé d'un prédiviseur (Prescaler) qui peut diviser la fréquence par 1.Timer Synchrone (horloge interne) .3.3. TMR1 est incrémenté par l’horloge système Fosc/4 éventuellement prédivisée. VII.TMR1IE (bank1).Compteur Synchrone (horloge externe) . TMR1 est incrémenté à chaque front montant de l'horloge externe T1CKI (RC0) ou l'horloge dédiée générée par l’oscillateur T1OSC à condition de positionner le bit T1OSCEN à 1 et de brancher un quartz entre les broche RC0 et RC1. En mode compteur.2 4.8 SYNC 1 0 TF1 T1 TMR1IF TH TMR1 16 bits TMR1ON CLR CCP TF1 = 65536 x T1 = 65536 x (DIV x TH)  TMR1 peut fonctionner dans 3 modes différents : . 2.TMR1IF (bank0) est positionné ce qui peut déclencher l'interruption périphérique TMR1I si elle est validée par son bit de validation PIE1. Le bit de synchronisation n'a pas d'effet car l'horloge Fosc/4 est toujours synchronisée sur l'horloge système. VII.

3 Le registre de control de T1CON — — T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON T1CKPS1.3.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 arrêté 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 système (Fosc/4) : mode timer 1 : Horloge externe : mode compteur TMR1ON : Démarrer arrêter le timer 0 : Timer stoppé 1 : Timer en fonctionnement En résumé : Le temps qui sépare 2 levés de drapeau TMR1IF est : TF1 = 65536 x T1 = 65536 x (DIV x TH) Si on ajoute un compteur N dans le programme on obtient un temps = N x TF1 Exercice 18) Clignoter LED / scrutation de TMR1 Clignoter une LED reliée à RE0.40  En fonctionnement Synchrone. En mode Compteur Asynchrone. Dans cette configuration En fonctionnement Asynchrone. La temporisation voisine de 0. on ne peut pas utiliser les modules CCP1 et CCP2 pour faire des captures ou des comparaisons sur TMR1  VII.5s sera réalisée à l'aide de TMR1 par scrutation du drapeau TMR1IF Exercice 19) Clignoter LED / interruption TMR1 Clignoter une LED reliée à RD0. La temporisation voisine de 0. l'horloge externe (éventuellement prédivisée) n'incrémente pas directement le timer mais elle est synchronisée sur l'horloge système ce qui peut entraîner un délai de l'ordre de 1 cycle machine. l'horloge externe (éventuellement prédivisée) incrémente le timer indépendamment de l'horloge système.5s sera réalisée à l'aide de TMR1 est son interruption TMR1I .

Le choix de l'événement déclencheur se fait en programmant le prescaler à l’aide des bits 0 à 3 du registre de contrôle CCP1CON. l'interruption périphérique associée est déclenchée si elle a été validée.41 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 déclencher un événement au moment de l’égalité.1 Le module CCP1 Ce module est constitué de :    Un registre 16 bits CCPR1 utilisé pour la capture ou la comparaison de TMR1. On a le choix parmi les événements suivants :     A chaque front descendant A chaque front montant (prescaler 1:1) A chaque 4ème front montant (prescaler 1:4) A chaque 16ème front montant (prescaler 1:16) A la fin de la capture.1 Le mode Capture CCP1IF Registre de capture et comparaison Registre de control CCP1CON RC2 Prescaler 1.2 . le drapeau CCP1IF est positionné.4.1. Plusieurs aspects sont à noter comme :  Si on veut déclencher la capture par un signal externe. Ces modules ne fonctionnent pas si TMR1 est configuré en mode Compteur non synchronisé VII. Il est accessible par sa partie basse CCP1L et sa partie haute CCP1H Un registre de contrôle 8 bits CCP1CON. Un prédiviseur permettant de filtrer les événements déclencheurs de capture venant de la broche RC2 VII. 4 ou 16 CCPR1 CCPR1H chargement CCPR1L TMR1H TMR1 TMR1L Dans ce mode le contenu de TMR1 est copié dans CCPR1 chaque fois qu'un événement intervient sur la broche RC2. celui-ci doit être appliqué sur la proche RC2 qui doit être configurée en entrée par le bit TRISC.4.

4. le positionnement du drapeau peut déclencher un Wake-up si le bit de validation CCP1IE a été validé auparavant  VII.1. ce mode ne sera pas traité dan ce cours VII. Quand l'égalité intervient. celui-ci doit être configuré en sortie par le bit TRISC. le drapeau CCP1IF passe à 1 et différentes actions sont accomplies selon le mode défini par les bits de configuration CCP1M3:CCP1M0 CCP1IF CCP1Mx CCPR1H CCPR1L RC2 Logique de control Comparateur (RAZ)  TMR1H TMR1L horloge mode 1000 : Au moment de l'égalité. le prescaler et le drapeau CCP1IF restent opérationnels. une interruption indésirable peut intervenir. En mode Sleep. L'utilisateur doit veiller à masquer l'interruption CCP1I avant de procéder à cette modification et de baisser le drapeau CCP1IF après la modification.42   Si on veut déclencher la capture par programme en changeant la valeur du bit RC2.2 Lors de la modification du mode de capture.1. le drapeau CCP1IF est le bit RC2 passent à 1. DC1B0 : utilisés en PWM mode Ce sont les 2 bits de poids faible des 10 bits MWM duty cycle.3 Le mode Comparaison Dans ce mode le registre CCPR1 est comparé en permanence à TMR1. . RC2 doit être configuré en sortie. Les 8 autres bits sont dans le registre CCPR1L CCP1M3 à CCP1M0 : mode de fonctionnement du module CCP1 0000 : Module arrêté (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 d’impulsion).4.2 — — Le registre de configuration CCP1CON DC1B1 DC1B0 CCP1M3 CCP1M2 CCP1M1 CCP1M0 DC1B1. C'est à l'utilisateur de les remettre à 0 pour une prochaine utilisation.

La broche RC2 n'est pas utilisée. RC2 doit être configuré en sortie.43  mode 1001 : Au moment de l'égalité.4.2 Le module CCP2 Le module CCP2 est identique au module CCP1. C'est à l'utilisateur de les remettre à leur état d’origine pour une prochaine utilisation. il suffit d’interchanger 1 et 2 et de constater les points suivants :     CCP2 est associé à la broche RC1 Il est géré par le registre de control CCP2CON Son registre de capture/comparaison est CCPR2 = CCPR2H:CCPR2L En mode comparaison 1011. mode 1011 : A l'égalité. mode 1010 : A l'égalité le drapeau CCP1IF passe à 1. A l’égalité : o o o le drapeau CCP2IF passe à 1 RAZ de TMR1 envoi d’un GO vers le convertisseur analogique numérique Exercice 20) générer signal TMR1/CCP1 Programme qui génère le signal ci-dessous sur la sortie RE0 en utilisant TMR1 associé à CCP1 500 µs 500 µs . le drapeau CCP1IF passe à 1 et le timer TMR1 est remis à 0   VII. le drapeau CCP1IF passe à 1 et le bit RC2 passe à 0.

TMR2IF est positionné. la périodicité du drapeau TMR2IF est donnée par : TF2 = DIV1 x (P+1) x DIV2 x Tsy .5 Le Timer TMR2 TMR2 est un timer 8 bits accessible en lecture écriture constitué de :       un registre de control T2CON (bank0) un prédiviseur (1.4. le drapeau PIR1. Si on note : DIV1 DIV2 P Tsy : rapport du prédiviseur : Rapport du postdiviseur : Valeur placée dans le registre PR2 : période de l'horloge système. l'interruption correspondante et déclenchée si elle est validée TMR2 est remis à zéro à chaque RESET Le prescaler et le postscaler sont initialisés à 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 : En résumé.44 VII.16) un registre de période PR2 (bank1) accessible en lecture/écriture un comparateur. . alors le comparateur annonce une égalité tous les N+1 coups d’horloge     Au débordement du postscaler. le comparateur génère un signal qui :  Remet TMR2 à 0  incrémente le postscaler qui fonctionne comme un diviseur de fréquence Comme le comptage commence à 0. Il commence à 0 et quant il atteint la valeur du registre PR2. si PR2=N. un postdiviseur (1 à 16) TMR2 est incrémenté par l'horloge interne Fosc/4.

T2CKPS0 : ratio du prescaler 00 : prédiviseur par 1 01 : prédiviseur par 4 1x : prédiviseur par 16 REMARQUE : Dans le cas de la scrutation du drapeau TMR2IF par les 2 instructions suivantes : ici Les temporisations obtenues peuvent être erronées à cause de l’instruction goto qui prend deux cycles pour s’exécuter ce qui peut retarder la détection du drapeau.. 30 µs 30 µs Exercice 22) On dispose d'un PIC doté d'un quartz de 4 MHz. dans ce cas. Donner le programme qui fait clignoter une LED reliée à RE0.TMR2IF . attendre drapeau ici Exercice 21) On dispose d'un PIC doté d'un quartz de 4 MHz. Donner le programme qui génère le signal cidessous sur la sortie RB0 en utilisant l'interruption TMR2I associée à TMR2.45 Le registre 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 : démarrer arrêter TMR2 0 : TMR2 off 1 : TMR2 on T2CKPS1. La temporisation voisine de 0.. les temporisations obtenues sont exactes btfss goto PIR1. La solution est d’utiliser l’interruption liée au drapeau TMR2IF.5s est réalisée à l'aide de TMR2 : 1) Par scrutation du drapeau TMR2IF 2) En utilisant l’interruption TMR2I .

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. L’échantillonneur bloqueur est intégré. (RA5) 101 = channel 5.2) 00 : Fosc/2 01 : Fosc/8 10 : Fosc/32 11 : Oscillateur RC dédié au CAN CHS2:CHS0 : choix de l'entrée analogique 000 = channel 0. Les entrées analogiques doivent être configurées en entrée à l'aide des registres TRISA et/ou TRISE. (RE1) 111 = channel 7.46 VIII Le module de conversion A/N RA3 CHS2 CHS1 CHS0 000 001 010 011 100 101 110 111 GO DIV VrefH Vref+ ADRESL Vdd ADCON0 ADCON1 RA0 RA1 RA2 RA3 RA5 RE0 RE1 RE2 CAN ADRESH RA2 Vss fosc Ce module est constitué d'un convertisseur Analogique Numérique 10 bits dont l'entrée analogique peut être connectée sur l'une des 8 (5 pour 16F876) entrées analogiques externes. Vss. Les tensions de références permettant de fixer la dynamique du convertisseur. (RA0) 001 = channel 1. (RE2) . (RA2) 011 = channel 3. (RA1) 010 = channel 2. il est constitué d’un interrupteur d’échantillonnage et d’une capacité de blocage de 120 pF. On dit qu'on a un CAN à 8 canaux. Elles peuvent être choisies parmi Vdd. (RE0) 110 = channel 6. (RA3) 100 = channel 4.

Au départ il faut commencer par faire l’acquisition du signal en fermant l’interrupteur S. ADON : Ce bit permet de mettre le module AN en service ADCON1 ADFM — — — PCFG3 PCFG2 PCFG1 PCFG0 ADFM : justification à droite ou à gauche du résultat dans les registre ADRESH et ADRESL 1 : justifié à droite 0 : justifié à gauche ADRESH ADRESL 000000XX XXXXXXXX XXXXXXXX XX000000 PCFG3:PCFG0 : configuration des E/S et des tensions de références. Le module met 2 TAD supplémentaires pour fermer l'interrupteur S ce qui démarre une nouvelle phase d’acquisition pendant laquelle la tension Ve rejoint la tension analogique d'entrée Va. la tension Ve à l'entrée du convertisseur A/N doit être maintenue constante. Après la fin de l’acquisition.47 GO/DONE : Une conversion démarre quand on place ce bit à 1. Les 5 broches de PORTA et les 3 de PORTE peuvent être configurés soit en E/S digitales. soit au moment de la validation du module par le bit ADON soit après un changement de canal si ADON est déjà positionné. on peut démarrer une conversion en positionnant le bit GO_DONE. le bit GO_DONE repasse à 0. l'interrupteur S s’ouvre pour assurer le blocage de la tension. à la fin. il est remis automatiquement à zéro. ceci se fait à l’aide du registre ADCON0. Après la fin de l’acquisition. soit en entrées analogiques.1 Déroulement d’une Conversion Le PIC dispose d’un échantillonneur bloqueur intégré constitué d'un interrupteur S. A la fin de la conversion. R étant la somme des résistances entre le module de conversion et la source de la tension analogique. PCFG3: PCFG0 0000 0001 0010 0011 0100 0101 011x 1000 1001 1010 1011 1100 1101 1110 1111 RE2 A A N N N N N A N N N N N N N RE1 A A N N N N N A N N N N N N N RE0 A A N N N N N A A A A N N N N RA5 A A A A N N N A A A A A N N N RA3 A VREF+ A VREF+ A VREF+ N VREF+ A VREF+ VREF+ VREF+ VREF+ N VREF+ RA2 A A A A N N N VREFA A VREFVREFVREFN VREFRA1 A A A A A A N A A A A A A N N RA0 A A A A A A N A A A A A A A A VREF+ VDD RA3 VDD RA3 VDD RA3 VDD RA3 VDD RA3 RA3 RA3 RA3 VDD RA3 VREFVSS VSS VSS VSS VSS VSS VSS RA2 VSS VSS RA2 RA2 RA2 VSS RA2 A/R/N 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 VIII. d'une capacité de maintien C=120 pF et d’un convertisseur Analogique numérique 10 bits. RA2 et RA3 peuvent aussi être configurées en entrée de référence. on peut démarrer une nouvelle conversion et ainsi de suite . Le temps d'acquisition dépend de la constante de temps RC. Pendant la conversion. elle est réalisée en 12 TAD. le drapeau ADIF passe à 1 et le résultat est chargé dans les registres ADRESL et ADRESH. Ce bit peut aussi être positionné automatiquement par le module CCP2. La conversion commence.

05 µs = 1 µs TACQ = 2 + 9 + 1 µs = 12 µs . elle est inférieure à 1k Rss = Résistance du l’interrupteur S (Sampling switch).3 Temps d'acquisition Temps d'acquisition = TACQ = Tc + CT +2 µs Tc : temps de charge du condenseur = (Ric+Rss+Rs) C Ln(2047) Ric = Résistance d’interconnexions.2 Temps de conversion Le temps de conversion est égal à 12 TAD TAD est le temps de conversion d'un bit.6 µs 6.4 µs 8 µs 16 µs Tableau VIII.4 µs 1. voisine de 45°C en temps normal Exemple : Ric = 1k. Elle est égale à 7kΩ pour Vdd=5V Rs : Résistance interne de la source du signal analogique.48 Va Va S Ve CAN 120 pF Ve 2Tad 12Tad Tacq GO/DONE nous automatique VIII. Rs = 2k.6 µs \Quartz 20Mhz 5Mhz 4Mhz 2Mhz Div \ 2 0. il dépend de la fréquence du quartz et du prédiviseur (div) choisi : TAD = div x 1/fosc.6 µs 2 µs 4 µs 32 1. elle dépend de la tension d’alimentation Vdd. Microchip recommande de ne pas dépasser 10 kΩ C : Capacité de blocage = 120 pF CT : Coefficient de température = (Tp -25°C) 0.1 µs 0. il faut choisir div=8 ce qui donne T AD = 2 µs soit un temps de conversion : TCONV = 24 µs VIII.5 µs 1 µs 8 0.4 µs 0. Tp = 45 °C : Tc = 10k x 120pF x Ln(2047) = 9 µs CT = 20 x 0. Le choix de div doit être ajusté pour que T AD soit ≥ à 1.1 : Temps de conversion d'un bit TAD (les cases grisées sont hors plage d’utilisation) Avec un quartz de 4 MHz. Rss = 7k.05 µs/°C Tp = Température Processeur.

et recopie les résultats dans la RAM à partir de la position 190h.= masse.6 Programmation 1) Si des entrée de PORTE sont utilisées. Programme qui converti la tension appliquée à RA0 et recopie le résultat dans la RAM à la position 70h et 71h Sur un PIC doté d'un quartz de 4 MHz.49 VIII.Vref-)/1024 Va = tension analogique à convertir N = valeur numérique obtenue.4 Fréquence d'échantillonnage Si on veut échantillonner un signal variable. recommencer au point 7 en faisant attention aux timings Exercice 23) PIC doté d'un quartz de 4 MHz. VIII. La période d'échantillonnage Te doit être supérieur ou égale à Temin = TCONV + 2 Tad + TACQ Avec les exemple précités. le configurer en mode normal à l'aide du bit PSPMODE 2) Configurer les E/S en Analogique/Numérique/Référence (ADCON1) 3) Configurer les entrées analogiques en entrées (TRISA. on obtient N = int (Va / Q) exemple : Vref+ = Vdd = 5V. GO = 1 (ADCON0) 8) Attendre fin de conversion. Donner le programme qui fait l'acquisition de 40 échantillons du signal appliqué sur RA0. . Utiliser le timer 2 pour ajuster la période d'échantillonnage. on constate que l’on peut échantillonner des signaux dont la fréquence ne dépasse pas 12 KHz. GO = 0 ou drapeau ADIF=1 9) Traiter le résultat 10) Si l'on désire prendre d'autres mesures. N = valeur entière de (Va – Vref-) / Q Avec Vref. L'échantillonnage se fera à la vitesse la plus rapide possible Exercice 24) Exercice 25) Refaire l’exercice précédent avec une fréquence d’échantillonnage fe = 8000Hz.0048828125 V N = 4V / 0. Vin = 4 V Q = 5V/1024 = 0. Vref.5 Valeur numérique 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+ . on aura la péride d’échantillonnage min Temin = 24 + 2 + 12 = 40 µs La fréquence d’échantillonnage max est donc femax = 1/Temin = 25 kHz Si on tient compte de la règle de Shannon (fe  2 fmax).0048828125 = 819 VIII. TRISE) 4) Définir l'horloge de conversion à l'aide du diviseur DIV dans ADCON0 5) Choisir le canal à convertir et valider le module (ADCON0) 6) Attendre le temps d’acquisition (12 µs ) 7) Lancer la conversion.= 0.

elle peut être gérée par soft si son utilisation est nécessaire.TXIF sont très utiles pour gérer la lecture/écriture dans le port. 10 (ou 11) bits sont transmis ou reçus dans l'ordre ci-dessous : . RCIF est positionné quand le port a terminé une réception et TXIF est positionné quand le buffer de transmission TXREG est "vide".1 bits de STOP (toujours 1)      La transmission se fait sur la broche RC6/TX et la réception 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 fixée par le registre SPBRG et le bit TXSTA. un pour la transmission (TSR) et un pour la réception (RSR).2 Le port en transmission Le contrôle de la transmission se fait par le registre TXSTA CSRC TX9 TXEN SYNC — BRGH TRMT TX9D CSRC : non utilisé en mode asynchrone .1 bit de START (toujours 0) .50 IX L'USART L'USART (Universal Synchronous Asynchronous Receiver Transmitter) est l'un des deux modules de communication série dont dispose le PIC 16F876/877. L'USART peut être configuré comme système de communication asynchrone full duplex ou comme système synchrone half duplex (non étudié). j’ai bien dit toutes les deux) IX. L'accès au registres tampon peut se faire alors que les registre à décalage sont en train de transmettre/recevoir une donnée.8 ou 9 bits de donnée (LSB d'abord) . Les drapeaux PIR1. La communication se fait sur les deux broches RC6/TX et RC7/RX qui doivent être configurés toutes les deux en ENTREE par TRISC.1 Mode Asynchrone Si on place le bit SYNC du registre TXSTAT à 0.BRGH La parité n'est pas gérée d'une façon matérielle. l'USART fonctionne dans le mode asynchrone standard.RCIF et PIR1. L'accès au port en lecture ou écriture se fait par les registres tampon RCREG et TXREG.  IX. (oui. La transmission et la réception se font par deux registres à décalage.

TXIF=1 c.  IX. Le 9 ème bit doit être écrit dans TX9D avant d'écrire les 8 bits de données dans TXREG TXEN : permet de valider ou interdire la transmission SYNC : 0  mode asynchrone.SPEN Vérifier que le drapeau PIR1.TXIF passe à 0. La donnée D est alors transférée dans TSR qui commence sa transmission bit bar bit. La donnée D attend dans TXREG. le drapeau TXIF passe automatiquement à 1. Dès qu’on valide la transmission en positionnant le bit TXEN. 0  TSR en activité Déroulement de la transmission   Quand on écrit un octet D dans le registre TXREG. 1  mode synchrone BRGH : sélectionne le mode haut débit du générateur de baud rate TRMT : Indicateur de l’activité du registre à décalage de transmission TSR 1  TSR libre. on ne peut pas le modifier directement par programme. dans ce cas. Le drapeau TXIF repasse à 1 pour nous dire que nous pouvons de nouveau écrire dans TXREG. le contenu de TXREG est transféré dans TSR qui commence sa transmission et le drapeau TXIF passe à 1. alors la donnée D est transférée immédiatement dans TSR qui commence sa transmission bit bar bit.1 1) 2) 3) 4) 5) 6) 7) 8) Les étapes de transmission (sans interruption. valider transmission. BRGH) Initialiser le registre SPBRG pour définir la vitesse de transmission Valider le port avec le bit RCSTA. tous les drapeaux sont à zéro y compris TXIF. écriture D0 dans TXREG écriture D1 dans TXREG  TXIF Transmission D0 Transmission D1 chargement TXREGTSR  chargement TXREGTSR Figure IX-1 : illustration de la transmission de deux octet successifs D0 et D1 A la mise sous tension. Le drapeau TXIF repasse à 1 pour nous dire que nous pouvons de nouveau écrire dans TXREG.2. Le registre de transmission TSR est occupé à transmettre un octet qui lui été donné auparavant. mode 8 bits) S’assurer que l’interruption TXI n’est pas validée Configurer la broche TX/RC6 en entrée Configurer le registre TXSTA (mode 8 bits. le drapeau PIR1. et le drapeau TXIF reste à 0 jusqu’à ce que TSR termine de transmettre l’octet précédent.à. le drapeau TXIF est géré automatiquement. ensuite. asynchrone. dès la validation de TXEN. sauf si on écrit d’abord un octet dans TXREG et on valide ensuite le bit TXEN. Comme on vient de le voir. deux situations sont possibles : Le registre de transmission TSR n’est pas occupé.d TXREG est vide Placer la donnée à transmettre dans le registre TXREG recommencer au point 6) tant qu’on a des données à transmettre .51 TX9 et TX9D : Pour utiliser le mode 9 bits il faut positionner le bit TX9.

lecture seule. Pour reprendre la réception il faut réinitialiser le module de réception en mettant à 0 puis à 1 le bit CREN (). 0  inhibé) ADDEN : validation du mode détection d'adresse en mode 9 bits. le 9ème bit est reçu ici . Le drapeau PIR1. (Voir au dessus) RX9D : En mode 9 bits. On peut donc avoir 2 octets en attente dans ce registre et être en train de recevoir un 3 ème dans le registre à décalage RSR. alors le dernier octet reçu est perdu et le bit OERR (Overrun ERRor bit) est positionné ce qui provoque l'arrêt des transfert du registre à décalage RSR vers le buffer RCREG. Le drapeau RCIF (PIR1. (Voir au dessus) OERR : Erreur débordement du buffer de réception. l'interruption associée est déclenchée si elle est validée. 0 = Inhibé) RX9 : Validation du mode 9 bits (1  mode 9 bits. si RCREG est toujours plein. A la fin de la réception du 3ème octet. alors le bit FERR (Framing ERRor) est positionné. Il doivent être lu dans le registre RCSTA avant la lecture du registre RCREG. Le drapeau RCIF est remis à zéro automatiquement au moment de la lecture dans RCREG. Le registre RCREG est un registre double (FIFO à 2 positions). Ce bit ainsi que le 9ème bit (si utilisé) sont bufferisés. 0  mode 8 bits) SREN : validation de réception d'u seul octet (non utilisé en mode asynchrone) CREN : Validation du mode réception continue (1  validé. lecture seule.RCIF ne passe à 0 que quand la pile RCREG est vide Si on reçoit un 0 à la position du STOP bit qui doit être toujours à 1. 0 : Inhibé) FERR : Erreur de synchronisation.52 IX.    Le contrôle de la réception se fait par le registre RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D SPEN : Validation du port série (1 = validé.5) est positionné.3 Le port en réception    La réception est validée par le bit CREN La réception d'un octet démarre à la réception du START bit qui commence toujours par une transition 1  0 A la réception du stop bit le contenu du registre à décalage de réception RSR est recopié dans le registre tampon de réception RCREG. utilisé en mode multiprocesseurs ( 1  validé.

valider réception continue) Attendre que drapeau RCIF passe à 1 ce qui annonce la fin de réception d'un octet Lire l’octet reçu dans le registre RCREG recommencer au point 6) tant qu’on a des données à recevoir IX.17 0.17 0.61 6 8929 18.55 8000000 SPBRG Baude 207 2404 103 4808 51 9615 25 19231 16 29412 14 20000000 err% SPBRG Baude err% 0.16 2.17 6. Exercice 27) On dispose d'un PIC doté d'un quartz de 10MHz.17 32 9470 1. La vitesse de communication est définie à l'aide du registre de control SPBRG et du bit BRGH (TXSTA.35 15 19531 1.16 6.62 2 20833 err% 0.17 0.17 6.99 20000000 SPBRG Baude err% 129 2404 0.16 64 19231 0. mode 8 bits.13 42 29070 0.5 12 4808 18.51 8.99 8. Il préférable d'utiliser le mode haute vitesse (BRGH=1) car permet d'obtenir une meilleur précision sur la fréquence.17 0.4 La vitesse de communication La vitesse de communication est déterminée par le générateur de rythme BRG (Baud Rate Generator) qui est dédié au port série.94 36 33784 0. 4 BRGH  Fosc vitesse  baud 64  (SPBRG  1) FOSC 2400 4800 9600 19200 1000000 SPBRG Baude 6 2232 2 5208 1 7813 0 15625 4000000 err% SPBRG Baude 7 25 2404 8. .79 Tableau IX.17 0.17 0. BRGH) Configurer le registre RCSTA (validation port.2) qui quadruple la vitesse quand il est positionné.29 33333 0.1 1) 2) 3) 4) 5) 6) 7) 8) Les étapes de réception (sans interruption. mode 8 bits) S’assurer que l’interruption RCI n’est pas validée Configurer la broche RX/RC7 en entrée Initialiser le registre SPBRG pour définir la vitesse de communication Configurer le registre TXSTA (asynchrone.16 0.1 : vitesse de transmission BRGH = 0 FOSC 2400 4800 9600 19200 28800 33600 1000000 SPBRG Baude 25 2404 12 4808 6 8929 2 20833 1 31250 1 err% 0.55 31250 6.51 SPBRG  8000000 SPBRG Baude 51 2404 25 4808 12 9615 6 17857 4 BRGH  Fosc -1 64  vitesse err% 0.17 0.53 IX.17 0. Donner le programme qui lit 40 caractères sur le port série (9600 baud) et les stocke dans la RAM à partir de la position 190h.17 64 4808 0.99 8.72 Tableau IX.16 3.16 129 9615 0.3.99 35714 6.51 4000000 SPBRG Baude 103 2404 51 4808 25 9615 12 19231 8 27778 6 err% 0.16 0. Donner le programme qui transmet l'alphabet sur le port série à 19200 baud avec un délai voisin de ½ s entre les caractères.2 : vitesse de transmission BRGH = 1 Exercice 26) On dispose d'un PIC doté d'un quartz de 4MHz.

un des circuits est le maître. et un signal de référence électrique ( Masse ). Il permet d'échanger des données en mode synchrone avec d'autres circuits qui peuvent être des microcontrôleurs. . introduisons très brièvement Le standard I2C Le bus I²C permet de faire communiquer entre eux des composants électroniques très divers grâce à seulement 3 fils : Un signal de donnée (SDA). le maître qui initie la séquence envoie l'adresse du slave avec lequel il désire communiquer. Elle passe à 1 quand les deux circuits imposent le 1 (circuit ouvert). les autres slaves (s'il y en a) restent muets.1 Introduction au bus I2C Avant de parler du module MSSP en mode I2C du PIC. le niveau haut est obtenu par une résistance de tirage externe. c'est lui génère l'horloge et initie les séquences de transmission. celui-ci reconnaît son adresse et répond.54 X Le module MSSP (Master Synchronous Serial Port) Le MSSP est une des deux modules de communication série du PIC 16F876/877. des mémoires EEPROM série. des convertisseurs A/N. des modules d'affichage . 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 détruire les deux composants. Ainsi une ligne est à 0 quand un des deux circuits impose le 0. mais pendant une communication. l'autre est l'esclave. au début d'une séquence de communication. Pour éviter ce problème. un signal d'horloge (SCL). Chaque esclave a une adresse. . . Vcc lecture Ecriture lecture Ecriture Un bus I2C peut être relié à plusieurs circuits. il subit l'horloge du maître sur la ligne SCK mais il peut tout de même recevoir et émettre des données sur la ligne SDA. 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. Comme les lignes SDA et SCK sont utilisées dans les deux sens par les deux circuits qui communiquent. Le protocole I2C jongle avec cette situation pour organiser l'échange des données entre les deux composants. Il peut fonctionner selon deux modes : le mode SPI (Serial Peripheral Interface) et le mode I2C (Inter-Integrated Circuit) X.

d'autres des slaves et d'autres peuvent être soit l'un soit l'autre. SCK=0. le master génère un stop condition (P) après lequel le bus est de nouveau libre.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. il faut que celui-ci soit au repos ( SDA et SCL à '1'). le master commence par placer SCK à 1 et place ensuite SDA à 1. à partir de la situation SDA=0.1.1. Au repos.1 start condition Au début d'une séquence d'échange. Pour générer un start. ensuite il place SCK à 0. les lignes SCL et SDA sont à l'état haut (relâchées).1. X.3 Stop condition moment de lecture par le récepteur A la fin d'une séquence d'échange. C'est lui qui génère le signal d'horloge et c'est lui qui initie les séquences d'échange. . le master place d'abord la ligne SDA à 0. il en devient le maître. Pour cela. le master génère un start condition (S) avant de commencer l'échange de données. SDA SCK S X.55 Vcc Vcc SDA SCK SDA SCK SDA SCK Maître ou Esclave Maître ou Esclave Maître ou Esclave Certains circuits sont fabriqués pour être des masters. C'est cette impulsion qui informe le slave qu'il doit lire la donnée sur SDA bit à transmettre SDA SCK X. Pour prendre le contrôle du bus. Lorsqu'un circuit prend le contrôle du bus.

56 SDA SCK P X. cela nous suffira largement. ACK SDA SCK NOACK En conclusion.5 L' acknowledge L' acknowledge est l'accusé de réception.1. l'échange d'un octet nécessite 8 + 1 = 9 impulsions d’horloge sur la pin SCL. Acknowledge SDA SCK D7 D6 D5 D4 D3 D2 D1 D0 X.1.4 Remarque sur le Start et le Stop condition Une séquence de transmission peut contenir plusieurs Starts conditions avant de rencontrer un Stop Condition. Acknowledge R/W SDA SCK S A6 A5 A4 A3 A2 A1 A0 Le standard I2C supporte maintenant l'adressage sur 10 bits.1. Le master qui démarre une séquence d'échange envoie l'adresse du slave juste après le start condition. Il est placé par le circuit qui reçoit sur la ligne SDA juste après la réception du 8ème bit. SDA=0  acknowledge positif (ACK). C'est l'émetteur qui le lit de la même façon qu'on lit un bit ordinaire. Comme il y a seulement 7 bits. Un Stop condition est toujours synonyme de FIN de transmission. Comme avec 7 bits on peut adresser jusqu'à 128 composants. Elle est codée sur 7 bits A 6 A5 A4 A3 A2 A1 A0. le master envoie à la 8ème position le bit R/W pour indiquer au slave s'il désire une émission (R/W=0) ou une réception (R/W=1).6 L'adresse et le bit R/W Comme on peut brancher plusieurs composant sur un bus I2C. X. . SDA=1  acknowledge négatif (NOACK). il est nécessaire de définir une adresse unique pour chacun. On parle de repeated Start condition.

celui-ci est transféré dans SSPBUF. le bit BF passe à 1 et la transmission commence. Ces broches doivent être configurées en ENTREE à l'aide du registre TRISC et doivent être munie de résistances de pull-up externes nécessaire au fonctionnement I2C. et le module MSSP s’occupe du reste. A la fin de la transmission. Le transfert n'a pas lieu.3 Les registres de configuration des registres : (BANK0) (BANK1) (BANK1) (BANK1) Le control du module se fait à l'aide SSPCON : registre de control SSPCON2 : registre de control SSPSTAT : registre d'état SSPADD : registre d'adresse .2. X.2. 400 kHz et 1 MHz L'accès au module en lecture et écriture se fait à l'aide du registre tampon (buffer) SSPBUFF. le bit SSPSTAT. Le bit BF apparaît donc comme un bit très important. BF repasse automatiquement à 0 au moment de la lecture de SSPBUF alors que SSPIF soit être remis à 0 par soft. X. La transmission et la réception se fait à l'aide du registre à décalage SSPSR auquel nous n’avons pas directement accès SSPBUF SCK/RC3 SDA/RC4 SSPSR SSPCON SSPCON2 SSPSTA SSPADD X. Au moment de l’écriture dans SSPBUF. c’est 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.1 Transmission d’un octet Pour transmettre un octet.SSPIF passe à 1.2 Réception d’un octet A la fin de la réception d'un octet. on a un Overflow qui sera signalé par le drapeau SSPOV.WCOL passe à 1 pour indiquer une collision et l'écriture n'a pas lieu. Il utilise les broches RC3/SCL (Horloge) et RC4/SDA (données).BF et le drapeau d’interruption PIR1.SSPIF passent à 1. Les fréquences d'horloges supportées sont 100 kHz. il suffit de le copier dans le registre SSPBUF. Si le PIC termine la réception d'un octet avant que l'octet précédent qui se trouve dans SSPBUF n'ait été lu.2. l’octet arrivé est perdu.57 X.BF repasse à 0 et le drapeau d’interruption PIR1. l’indicateur SSPSTAT. le bit SSPCON.2 Le module MSSP en mode I2C Le module MSSP du PIC peut être configuré en master ou en slave.

Il est automatiquement remis à 0 quand un autre événement et reçu : Indicateur de lecture écriture Mode master : 0 : pas de transmission en cours.58 X. l'adresse est traitée en 2 parties. : Overflow. 0 : écriture.2. : Indicateur sur l'état du registre SSPBUF.2. adresse 7 bits. fréquence = FOSC / (4 * (SSPADD+1)) 1011 : I2C Slave forcé à l'état de repos 1110 : I2C master. 1 : transmission en cours Mode slave : image du bit R/W qui constitue le bit 0 du premier octet suivant le start condition. En mode I2C master. : Indicateur de Start Condition. 1 : SMBUS : Indicateur d'état. adresse 7 bits 0111 : I2C Slave. 0 : I2C. adresse 10 bits 1000 : I2C master. Ce bit doit être remis à zéro par programme. 1 : dernier octet émis/reçu = donnée : Indicateur de Stop Condition.2 SSPCON WCOL Le registre SSPCON : WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 : Collision d'écriture. Ce bit doit être remis à zéro par programme. adresse 10 bits. En mode I2C slave. il est positionné si on tente d'écrire dans SSBUF avant la fin de la transmission de l'octet précédant. Ce dernier ayant seulement 8 bits. 0 pour 400 kHz : Control des niveaux de tension à l'entrée. SSPOV SSPEN : Validation du module MSSP (1 = validé) CKP : Utilisé en mode I2C slave pour générer des pauses en inhibant l'horloge. 0 : dernier octet émis/reçu = adresse. X. 1 : horloge validée SSPM3:SSPM0 : mode de fonctionnement du module 0110 : I2C Slave. ce bit passe à 1 si on tente d'écrire dans SSPBUF à mauvais moment de la séquence de transmission (BF=1). interruption sur START et STOP 1110 : I2C master.3. Dans ce cas la nouvelle donnée est perdue.3. cet indicateur d'erreur est positionné quand une nouvelle donnée est reçue alors que le registre SSBUF n'est pas encore lu. 1 : lecture : Indicateur utilisé en mode esclave avec adressage 10 bits pour nous informer qu'il faut placer la 2ème partie de l'adresse dans le registre adresse. interruption sur START et STOP .1 SSPSTAT SMP CKE D/A P S R_W Le registre SSPSTAT : SMP CKE D/A P S R_W UA BF UA BF : Control de slew rate : 1 pour 100 kHz et 1 MHz. Ce bit est remis automatiquement à zéro après l'écriture dans SSPADD. Ce bit passe à 1 quand on détecte un Stop Condition. Ce bit passe à 1 quand on détecte un Start Condition. 0 : horloge forcée à zéro. Il est automatiquement remis à 0 quand un autre événement et reçu.

L’adresse sera codée seulement sur 7 bits. Il revient automatiquement à 0 après la transmission du 8 ème bit. ce qui évite l'éventualité de perdre la ligne au profit d'un autre master. En cas d'adresse 10 bits. R/W=1 pour réception.SEN). R/W=0 pour transmission. PEN : STOP Condition Enable bit . 1=accusé négatif ACKDT : Acknowledge Data bit (master mode) : Valeur du bit envoyé au slave en fin de réception. en attend l'indicateur UA. cela ne pose pas de problème. le PIC répond à son adresse et à l'adresse générale 0000h ACKSTAT : Acknowledge Status bit (mode master) : ce bit est l’image de l’accusé de réception envoyé par le slave. démarre une séquence stoP_condition sur les broches SDA et SCL.PEN) Si l’on désire changer le sens de l’échange avant l’envoi du stoP. La réception ne démarre que si l'horloge n'est pas stretchée (forcée à 0: pause) par le slave. Ce bit est remis à 0 automatiquement après la séquence du STOP RSEN : Repeated START Condition Enable bit : démarre une séquence Repeated Start condition. réception) Quand on le place à 1. Il est remis à 0 automatiquement après la séquence du START X. Il est remis à 0 automatiquement après la séquence du R-START SEN : START Condition Enable bit : démarre une séquence Start condition. Le LSB qu’on appelle bit R/W permet de préciser le sens de l’échange qui va suivre. ce registre permet de déterminer la fréquence de communication Fosc F  Hz 4  (SSPADD  1) Les fréquences possibles sont : 100 kHz.3. Le bit 0 est réservé. suivi de l'adresse du slave.2. ce registre doit contenir l'adresse du slave. ensuite on écrit A 7 A6 A5 A4 A3 A2 A1 A0 SSPADD  X.59 X. En cas d'adresse 7 bits. 0=accusé positif.3.2. il faut envoyer un RepeatStart condition suivi de l’adresse accompagnée d’un R/W différent . 400 kHz et 1 MHz Fosc  1 Hz 4 F En mode I2C slave. les autres bits concernent le mode master : GCEN : General call enable bit : Si ce bit est validé. il doit être toujours placé à zéro. ce bit démarre la réception d'un octet. Ce bit est envoyé au moment ou on positionne le bit ACKEN. On commence par écrire 1 1 1 1 0 A9 A8 0 dans SSPADD. l'adresse est écrite en 2 temps.4 MSCP en mode I2C Master Une séquence de communication est toujours initiée par le master qui commence par envoyer un Start_bit (SSPCON2.2. ACKEN : Acknowledge Sequence Enable bit (master mode) : quand il est placé à un.4 Le registre SSPADD : En mode I2C master. On envoie ou on reçoit les données et on termine la communication par un stoP_bit (SSPCON2. ce bit démarre une séquence accusé de réception qui consiste à placer les broches SDA et SCL dans le mode correspondant au bit ACKDT RCEN : Receive Enable bit : (master.3 SSPCON2 Le registre SSPCON2 : GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN Le bit 7 concerne le mode slave. l'adresse doit être écrite à partir du bit 1.

Le programmeur doit vérifier l’état de ce bit pour décider de la suite des événements. Les bit BF et R_W passent à 1 au début de l'émission et repassent à 0 à la fin. Si acquittement de l'adresse est négatif on envoie un R-START et on renvoie ládresse Si acquittement de l'adresse est positif. celui-ci envoie le START bit sur la ligne SDA puis r.1 Master en transmission : ACK envoyé par le slave S Slave adress 0 R/W A Data byte A Data byte A … P  On positionne le bit SSPCON2.ACKSTAT.BF repasse à zéro. Le drapeau SSPIF passe à 1. après le 9ème R_W repasse à 0.à. SSPSTAT. on envoie un stoP_bit en positionnant le bit SSPCON2.a. Ce bit recopié par le master dans le bit SSPCON2. Le slave renvoie l'acquittement pendant le 9ème bit qui sera copié dans le bit ACKSTAT.R_W passent à 1.60 X.SSPIF. et le drapeau d’interruption SSPIF passe à 1 et l'horloge est forcée à 0 (pause) jusqu'`a ce qu'un nouvel octet est copié dans SSPBUF. . le plus simple est de retransmettre la donnée Si l'acquittement sur la donnée est positif : o o Si on a encore des données à transmettre. les bits SSPSTAT.z le bit S et positionne le bit P puis réinitialise son électronique pour se préparer à la réception d'un nouveau Start_bit. L'acquittement sur l'adresse est renvoyé par le slave pendant le 9 ème coup d'horloge sur la ligne SDA : 0 (ACK) s’il a lu l’octet correctement. on démarre une nouvelle émission en écrivant dans SSPBUF. Tout se passe comme lorsqu'on a envoyé l'adresse.z par soft.PEN qui est remis à zéro automatiquement après la transmission d'un Stop bit sur la ligne SDA. on envoie un octet de donnée en l'écrivant dans SSPBUF. Le slave voit le START. il r. Si l'acquittement sur la donnée est négatif.BF et SSPSTAT.4. ce dernier doit être r. Si on n'a plus de données à transmettre. On copie l’adresse avec R/W=0 dans SSPBUF. Le drapeau SSPIF doit être raz par soft pour qu’il puisse servir dans la suite.SEN sur le master.a. 1 (NoACK) s’il n’a pas pu lire l’octet correctement. la transmission démarre.        Quand le slave voie le stoP_bit. positionne son bit S et se prépare à recevoir l'adresse.2. après le 8ème coup d'horloge.z automatiquement le bit SEN et positionne le drapeau d'interruption PIR1.

61 PIC Master .Transmission Configuration du module I2C Envoyer START Envoyer adresse avec R/W=0 Tester Acquittement Adresse Envoyer R-START OK ? Envoyer une donnée Tester Acquittement sur donnée non OK ? oui Fini ? non oui Envoyer STOP .

2 Master en réception : ACK du slave S Slave adress transmis R/W 1 A Data byte reçu A ACK du master Data byte reçu A … P  On positionne le bit SSPCON2. Dans ce cas le master attend que l'horloge passe à 1 pour continuer la rafale de coup d'horloge En résumé. celui-ci envoie le Start_bit sur la ligne SDA et r. On copie l’adresse avec R/W=1 dans SSPBUF. après le 9ème R_W repasse à 0. L'horloge est libérée juste le temps d'un coup d'horloge (le 9 ème) pour que le slave puisse prendre l' Acknowledge en compte. On appelle ça : clock stretching. Le bit ACKDT est placé sur la ligne SDA.        Le programme utilisateur du master vide le buffer SSPBUF. et le drapeau d’interruption SSPIF passe à 1. et ACKEN est r. l’indicateur BF passe à 1 ainsi que le drapeau d’interruption PIR1. Ensuite il envoie l' Acknowledge en plaçant ACK/NOACK (0/1) dans la bit SSPCON2.a. il place le bit SSPSTAT. Le slave qui le reçoit réinitialise sa logique comme s'il a reçu un STOP. dès que les deux conditions {RCEN=1 et horloge libre} sont vérifiées.z par soft.ACKDT et en validant le bit SSPCON2. automatiquement.RCEN pour demander le début d'une réception. o A la fin de la réception. Le module I2C master voyant le RCEN=1 essaye de commencer une réception par l'envoi d'une rafale de 8 coups d'horloge. ce dernier doit être r. Le drapeau d’interruption SSPIF est aussi positionné après l’envoi du ACK Si on a envoyé ACK.    .SSPIF.à.RCEN à 0.SEN sur le master.R_W passent à 1. Le programme du slave prépare la donnée sur le bus puis libère l’horloge à l'aide du bit CKP Le programme du master doit tester l'acknowledge dans SSPCON2. le slave renvoie un ACK/NOACK selon sa situation et force l'horloge à zéro (pause) pour empêcher le master de lire avant que la donnée ne soit préparée sur le bus. Elle est remise en pause après. BF repasse à 0. il positionne le bit SSPCON2. Pendant le 9ème coup d'horloge. ça veut dire qu’on veut recevoir d’autres données.S à 1 et se prépare à recevoir l'adresse. Le slave voit le Start_bit.z automatiquement le bit SEN et positionne le drapeau d'interruption PIR1. Ensuite Il force l'horloge à 0 (pause) pour donner le temps au programme d'envoyer l' Acknowledge. Si on a envoyé NOACK. la transmission démarre. le module I2C master ramène le bit SSPCON2.62 X. Quand il place l'horloge à 1 (première impulsion). les bits SSPSTAT.2. si = 0(OK).BF et SSPSTAT. celle-ci peut ne pas passer à 1 car il se peut qu'elle soit forcée à 0 par le slave.BF repasse à zéro. transfert l’octet reçu dans SSPBUF.RCEN.ACKEN.ACKSTAT.SSPIF.a. le master envoie une rafale de 8 coups d'horloge qui s'accompagne de la réception de 8 bits de données.z.4. il doit être raz par soft pour qu’il puisse servir dans la suite. après le 8ème coup d'horloge. le slave met l'horloge en mode pose pour donner le temps à son programme de placer une donnée dans le registre SSPBUF et de libérer ensuite l'horloge à l'aide du bit CKP. SSPSTAT. (on ne veut plus de donnée). alors notre programme peut initier la réception d’un nouvel octet en validant SSPCON2. A la réception du ACK.

réception Configuration du module I2C Envoyer START Envoyer adresse avec R/W=1 Teste Acquittement Adresse Envoyer R-START non OK ? oui Lancer la réception d'un octet en activant RCEN Attendre la fin de réception en scrutant RCEN Traiter l'octet reçu oui Envoyer ACK Désire-t-on d'autres données? non Envoyer NOACK fin .63 PIC Master .

Le PIC détecte la fin de réception de l’adresse. Si l’adresse reçue correspond à celle de notre PIC : o o o o Le LSB R/W est recopié dans SSPSTAT. Il doit être r.R_W Le bit SSPSTAT. notre programme ne s’en occupe pas Le drapeau PIR1. Si c’est l’adresse d’un autre slave.2. il positionne le bit SSPSTAT.z par soft SSPSR (l'adresse) est transférée dans SSPBUF SSPOV reste positionné L'ACK ne sera pas transmis (NoAck) Le drapeau PIR1.SSPIF passe à 1 ce qui peut déclencher une interruption. L'adresse ne sera pas transférée dans SSPBUF SSPOV sera positionné L'ACK ne sera pas transmis (NoAck) Le drapeau PIR1.S et se prépare à recevoir l'adresse.a.64 X.D_A passe à 0  c’est une adresse qui est arrivée la suite dépend de l'état de BF et SSPOV (voir tableau ci-dessus pour plus de détail) : Si BF=0 et SSPOV=0 (tout est OK)    o SSPSR (l'adresse) est transféré dans SSPBUF  BF passe à 1 Un ACK (0) est placé sur la ligne SDA pendant le 9 ème coup d'horloge.SSPIF passe à 1 ce qui peut déclencher une interruption Si BF=1 (Buffer SSPBUF plein)     o Si BF=0 et SSPOV=1 (Buffer SSPBUF vide mais il y'a eu un overflow avant)     .SSPIF passe à 1 ce qui peut déclencher une interruption.5 X. il vérifie si elle correspond à son adresse. Il doit être r.z par soft.a. il ne réagit pas. il se met à attendre le stoP_bit.1 MSCP en mode I2C Slave Slave en Réception de données (venant du master) ACK envoyé par le slave S Slave adress 0 R/W A Data byte A Data byte A … P     Le PIC détecte le START sur la ligne SDA.5. C’est le PIC qui le fait.2.

on trouve 0. Le PIC envoie l'acquittement pendant le 9ème bit et positionne SSPIF à 1. Il faut donc avoir l’œil. Notre programme vide SSPBUF. vérifie BF et SSPOV (on suppose que tout est OK). BF. BF repasse à 0 Maintenant on peut soit recevoir. soit un Repeat_Start_Condition.65  Dans le cas "tout est OK" . une autre donnée. P et S pour décider de la suite des opérations PIC Slave .Réception Configuration du module I2C Attendre l'adresse en scrutant BF Vider SSPBUF pour baisser BF Attendre une donnée en scrutant BF Vider SSPBUF pour baisser BF Traiter la donnée reçue 1 BF 0 P 0 1 fin . sur les indicateurs. notre programme doit : o o     Vider SSPBUF pour que BF passe à 0 et qu'on soit prêt pour la suite. BF et D_A passent à 1. soit un stoP_condition. il transfert l’octet arrivé dans SSPBUF. SSPIF. On vérifie le bit R_W. on sait qu’on va recevoir un octet Le PIC attend la réception du 8ème bit.

C'est le moyen d'informer le master que la donnée est prête.2. Si l’adresse reçue correspond à notre PIC. la libération de l’horloge. on reçoit l'adresse. C'est le master qui décide du début de l'échange puisque c'est lui qui gère l'horloge.a.66 X. L’indicateur SSPSTAT.2 Slave en transmission de données (vers le master) ACK du slave S Slave adress reçu R/W 1 A Data byte transmis A ACK du master Data byte transmis A … P Remarquons que le slave en transmission ne fait que préparer la donnée à transmettre dans son buffer SSPBUF. C’est le PIC qui le fait. on trouve 1.S et se prépare à recevoir l'adresse. le slave ne le détecte pas. Si le master envoie un STOP après le ACK. l’octet est transmis. celleci est transférée dans SSPBUF et BF reste à 0 dans ce cas. il se met à attendre le stoP_condition. le PIC (slave) positionne le drapeau SSPIF et r. soit NoACK :  Si c'est un ACK. le slave peut bloquer un échange en bloquant l'horloge à 0. Quand au début de l'échange.z par soft Le bit SSPSTAT. Si c’est l’adresse d’un autre slave.BF repasse à 0 après le 8ème Maintenant le master peut renvoyer soit un ACK. on sait qu’on va envoyer un octet On n’a pas besoin de lire SSPBUF car BF est égal à 0 On copie un octet de donnée dans SSPBUF.a.     Le PIC détecte le Start_bit sur la ligne SDA. il vérifie si elle correspond à son adresse. puis vérifie les bits BF et SSPOV pour savoir si le contenu précèdent du registre SSPBUF à été lu ou non o Supposons que tout est OK. Notre programme détecte que SSPIF est passé à 1 : . envoie une rafale de coup d’horloge. Le module I2C Slave recopie le bit R/W (1 dans ce cas) dans le bit R_W du registre SSPSTAT . Clock Stretching.SSPIF passe à 1 ce qui peut déclencher une interruption. Le PIC détecte la fin de réception de l’adresse.(Mode pause : Clock Stretching) Le drapeau PIR1. il ne réagit pas.5.z le bit CKP pour mettre l'horloge en pause.D_A passe à 0  c’est une adresse qui est arrivée Si on vérifie le bit R_W. positionne le bit SSPSTAT. Toutefois. Le master détecte. il doit être r.BF passe à 1 On replace le bit CKP à 1 pour libérer l'horloge. Le drapeau BF passe à 1 quand le programme utilisateur écrit un octet dans SSPBUF et revient à 0 après la transmission du 8 bit de cet octet. Ceci donne au programme du slave le temps de préparer une nouvelle donnée dans SSPBUF et libérer l'horloge ensuite. notre programme ne s’en occupe pas Il place le bit CKP à 0 ce qui force l'horloge à 0. BF=0 et SSPOV=0       o o o o o o Il recopie SSPSR (l'adresse) dans SSPBUF  BF ne passe pas à 1 Il place un ACK (0) sur la ligne SDA pendant le 9ème coup d'hologe. L'indicateur SSPSTAT.

le PIC (slave) positionne le drapeau SSPIF.Transmission Configuration du module I2C Attendre l'adresse en scrutant SSPIF Placer une donnée dans SSPBUF Libérer l'horloge à l'aide de CKP Attendre fin transmission en scrutant SSPIF CKP=0 ACK Tester CKP pour déterminer la nature de l'ACK envoyé par le maitre CKP=1 fin NoACK . le bit CKP reste à 1 et le bit R_W passe à 0. il est prêt à recevoir un nouveau START. Normalement. le master n'a pas besoin d'envoyer un STOP dans ce cas. S'il le fait quand même. L'électronique du slave est réinitialisée. le slave le détecte et positionne l'indicateur P. PIC Slave .67  Si c'est un NOACK.

L'horloge est forcée en pause On a fini la transmission d'un octet et reçu un ACK.5. L'horloge est forcée en pause On dirait qu'on a reçu une donnée mais le buffer reste vide et l'horloge n'est pas pausée: anormal. horloge=pause . Evénement On a reçu une adresse avec R/W=0 On a reçu une donnée On a reçu une adresse avec R/W=1.2.68 X. horloge=pause On a envoyé donnée et reçu ACK. C'est un NOACK qui a été reçu R/W 0 0 1 D/A 0 1 0 BF 1 1 0 CKP NU NU 0 Action Il faut vider SSPBUF pour baisser le drapeau BF et attendre une donnée Il faut vider SSPBUF et attendre un événement (qui peut être un STOP) Il faut placer une donnée dans SSPBUF et libérer l'horloge en positionnant le bit CKP Il faut placer une donnée dans SSPBUF et libérer l'horloge en positionnant le bit CKP La séquence d'échange est finie 1 1 0 0 0 1 0 1 SSPIF 0 0 Reçu NOACK CKP=1 0 Reçu adresse avec R/W=0 BF 1 D/A On reçu une donnée 1 0 D/A 1 R/W Reçu adresse avec R/W=1.3 Utilisation des interruptions Voici les 5 événements qui déclenchent l'interruption SSPI sur un PIC Slave.

Mode slave : L'horloge est générée par le circuit (master) avec lequel on communique.d l’octet reçu) est copié dans SSPBUF. A la fin. Il utilise les broches : RC4/SDI : Serial Data Input (doit être configurée en entrée) RC5/SDO : Serial Data Output (doit être configurée en sortie) RC3/SCK : Serial Clock (doit être configurée en sortie) RA4/SS : Slave Select : Utilisée optionnellement en mode slave soit comme entrée de synchronisation soit comme Chip Select en mode esclave multiples.3 Le module MSSP en mode SPI Ce mode (Serial Peripheral Interface) permet de transmettre et recevoir simultanément des mots de 8bits. SSPBUF SDO SDI SSPSR . C'est donc lui qui décide du moment de démarrage d'une transmission réception. L'émission et la réception se font simultanément par le même registre à décalage SSPSR. Elle doit être configurée en E/S numérique à l’aide du registre ADCON1 et comme entrée à l’aide du registre TRISA Le contrôle du port se fait par les bits 0 à 5 du registre SSPCON et les bits 6 et 7 du registre SSPSTAT. Cette action est annoncée par la mise à 1 du bit BF et du drapeau d’interruption SSPIF. le contenu de SSPSR (c.a. Le bit BF est un bit en lecture seule. Le drapeau SSPIF doit être remis à zéro à l’aide de l’instruction BCF par exemple. Notre Pic démarre une émission/réception au moment ou il commence à recevoir l'horloge venant du maître. L'octet est alors transmis bit par bit sur la sortie SDO et il est remplacé par les bits qui arrivent sur l'entrée SDI. cet octet est copié par le PIC dans le registre à décalage SSPSR auquel il applique ensuite une rafale de 8 coups d'horloges. la seule façon de le remettre à zéro est de lire le contenu du registre SSPBUF. Un cycle d'émission/réception commence au moment où on écrit un octet dans le registre SSPBUF.69 X. Deux modes de fonctionnement sont possibles : Mode master : C'est le PIC qui génère et gère l'horloge de synchronisation SCK.

1 : Haut au repos SSPM3:SSPM0 : Ces bits définissent le mode de fonctionnement du module 0000 : SPI Master : débit = Fosc/4 0001 : SPI Master : débit = Fosc/16 0010 : SPI Master : débit = Fosc/64 0011 : SPI Master : débit = Ftmr2/2 Le registre SSPSTAT en mode master : SMP CKE BF Seuls les bits utilisés par le mode SPI master sont représentés ici.1 Le mode SPI master SDO PIC (master) SDI SCK Circuit quelconque (slave) Slave 1 SDO PIC (master) RX Tx SDI SCK horloge sélection Slave 2 RX Tx Ri Rj Le PIC fonctionne en master. SMP : Sample bit : front d'horloge SCK sur lequel on lit le bit présent sur l'entrée SDI 0 : milieu de période d'horloge 1 : fin de la période d'horloge . il faut que les slaves disposent d'une entrée de sélection CS qu'on peut contrôler avec une sortie quelconque d'un port d'E/S. Ces deux bits doivent être remis à zéro par nos soins.SSPIF sont sélection positionnés pour nous informer qu’un octet a été transmis et que l'octet reçu attend d'être lu dans le registre SSPBUF. dans ce cas il faut désigner le slave avec lequel on désire communiquer.BF et PIR1. il faut juste remarquer que BF est un bit en lecture seule. A la fin du cycle. Le PIC peut communiquer avec plusieurs slaves. Dans le cas ou les slaves sont des PIC.70 X. C'est lui qui décide du moment où démarrer une émission/réception. l'entrée de sélection est RA4/SS Le cycle émission/réception d'un octet démarre au moment où on écrit dans le registre horloge SSPBUF. il génère et gère l'horloge de synchronisation.3. pour le remettre à zéro 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 : définit l'état de repos de l'horloge (idle state) 0 : Bas au repos. les bits SSPSTAT.

SSPIF  La lecture de SSPBUF est la seule façon de r. Le Slave en fait de même. RC5/SDO et RC3/SCK Définir la polarité de l'horloge par le bit SSPCON.SSPMx Définir le moment de lecture des bits entrant à l'aide du bit SSPSTAT.BF ou PIR1. Ce bit est remis automatiquement à zéro au moment de la lecture du registre SSPBUF. les étapes à suivre pour utiliser MSSP en mode SPI master sont : Configurer la direction des lignes RC4/SDI.SMP Définir le moment d’’ecriture des bits sortants à l'aide du bit SSPSTAT. Si on désigne le niveau actif de l'horloge comme le niveau opposé du niveau de repos défini 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 reçu.1 Récapitulation mode master En résumé. CKP=1 CKE=0 Le slave doit lire ici B7 B6 B5 B4 B3 B2 B1 B0 SDO SMP=0 SDI B7 B6 B5 B4 B3 B2 B1 B0 Le master lit ici X. Le dessin ci-dessous montre la configuration la plus fréquemment utilisée.SSPIF doit être remis à 0 . Ceci va dépendre du bit CKP.BF  Si on l’utilise.z le bit SSPSTAT.SSPEN Une fois cette initialisation réalisée. l'émission/réception se fait comme suit :  Copier un octet dans SSPBUF pour démarrer l’émission/réception  attendre la fin en surveillant SSPSTAT.à.3.CKP Définir la fréquence de l'horloge à l'aide des bits SSPCON.1. le drapeau PIR1.CKE Valider le port par le bit SSPCON.71 CKE : Clock Edge Select : front de l'horloge SCK sur lequel on place un bit sur la sortie SDO. Le Master écrit au début de la période d’horloge et lit aux milieux.

Dans ce cas le mode Sélection 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 reçu. Il doit être remis à zéro par programme SSPOV : Receive Overflow Indicator bit : Cet indicateur d'erreur est positionné quand une nouvelle donnée est reçue alors que le registre SSBUF n'est pas encore lu. Si on ne désire réaliser que des réceptions. ce n'est pas notre PIC qui génère l'horloge et décide des moments de communication. elle doit être configurée en entrée par TRISA.3. Il se contente de réaliser une émission/réception chaque fois qu'il reçoit une rafale d'horloge sur la broche SCK qui est devenue une entrée. Dans ce cas la nouvelle donnée est perdue.2 Le mode SPI slave En mode slave. 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. il faut la placer à 0 quand on veut communiquer avec ce slave (chip select) 0100 : SPI Slave : l'entrée SS est inhibée (fonctionne en E/S normale) Dans le cas ou l'entrée SS est utilisée.3. 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 précédente n'est pas encore transmise.72 X.2. Ce bit doit être remis à zéro par programme SSPEN : Validation du module SSP (1 = validé) SKP : Clock Polarity : définit l'état de repos de l'horloge (idle state) 0 : Bas au repos.1 Les chronogrammes de fonctionnement : Un cycle d'émission/réception démarre au moment du démarrage de l'horloge externe. on n'a pas besoin d'écrire à chaque fois dans SSPBUF du moment que ce n'est pas nous qui démarrons le cycle Tx/Rx . 1 : Haut au repos (doit coïncider avec le choix du master) SSPM3:SSPM0 : Ces bits définissent le mode de fonctionnement du module 0100 : SPI Slave : mode Slave Select. l'entrée SS est validée. X. Ce bit est remis automatiquement à zéro au moment de la lecture du registre SSPBUF. 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. le module MSSP fonctionne d'une façon similaire au mode master à part qu'ici.5 et elle doit être configurée comme entrée numérique à l'aide du registre ADCON1 car elle est multiplexée avec une entrée analogique du module CAN.

CKP=1 CKE=0 SDI B7 B6 B5 B4 B3 B2 B1 B0 moment de lecture (SMP=0) SDO B7 B6 B5 B4 B3 B2 B1 B0 Moment d’écriture : CKE=0 . 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 déclenchée (SSPOV) Le chronogramme ci-dessous illustre la configuration la plus courante. Les bits sont transmis au début de la période d’horloge et lu au milieu de celle ci. CKP=1. il va de soi que nous devons écrire les données à transmettre dans SSPBUF. Il n'est pas nécessaire d'utiliser l'entrée SS dans ce cas. CMP=0(obligatoire). CKE=0.73 Si on ne désire réaliser que des transmissions.

74 XI Annexe : Gestion du Programme Counter. seulement 11 bits sont utilisés pour coder l'adresse de destination.2 Instruction de branchement Un branchement consiste à modifier la valeur de PC. Pour remédier à ce problème. alors le contenu de PCLATH est automatiquement copié dans PCH. il n'est pas accessible directement. Lors d'un saut. On peut toutefois le modifier indirectement à l'aide du registre PCLATH qui est une registre SFR où seuls 5 bits sont utilisé. il peut donc adresser 8 k de mémoire programme. Donc. il est accessible en lecture écriture PCH (5 bits) est la partie haute de PC. PCH PCL PCL (8 bits) est la partie basse de PC. les deux bits manquants pour compléter les 13 bits de PC sont pris dans PCLATH : PC PCLATH 11 bits venant de l'instruction La mémoire programme apparaît donc comme organisée en 4 page de 2 k chacune. PCH PCL PCLATH Ecriture dans PCL XI. ce qui donne au maximum un intervalle de 2 k alors que nous avons une mémoire programme de 8k. . XI. avant d'écrire dans PCL s'assurer que la valeur contenue dans PCLATH est correcte. en assembleur on ne précise pas les adresses mais on utilise des étiquettes qui correspondent à des adresses complètes (13 bits). Mais dans les instructions de branchement.1 GOTO calculé : modification de la valeur de PCL Quand on écrit quelque chose dans PCL. Le PC est un registre de 13 bits. Cela ne change rient car seuls 11 bits de l'étiquette seront envoyés dans le PC et c'est à nous de gérer les deux bits de PCLATH pour compléter l'adresse de destination. l'adresse instruction précise la destination à l'intérieur d'une page et les deux bits 3 et 4 de PCLATH désignent la page Attention.

Secode partie-PIC16F876/877. Microchip PICmicro™ Mid-Range MCU Family Reference Manual (DS33023A). Bigonff PIC 16F87X Data Sheet (DS30292C) .com/pmorphe/bienvenuechez_atm. Bigonff La programmation des PICs.1 : gestion de la mémoire programme lors d'une instruction de saut XII Références 1) 2) 3) 4) 5) 6) 7) http://www. Rev 5. Première partie – PIC16F84. XI.htm La programmation des PICs.multimania.75 PCLATH 00 01 10 11 Page 0 Page 1 Page 2 Page 3 0 2k 4k 6k 8k mémoire programme Fig. Rev 7. Microchip La page web de Jacques Weiss sur les PIC La page web d'Offset sur les PIC .

Sign up to vote on this title
UsefulNot useful