IF3 TPuC
IF3 TPuC
IF3 TPuC
Travaux pratiques
Micro-contrôleur PIC
Les interruptions
MODULE IF3
A Annexes 1
1 Extraits de la documentation technique Microchip du PIC 16F887 . . . . . 1
1. "Bouton poussoir intelligent" avec interruptions
Les objectifs de cette séance de travaux pratiques sont :
— de savoir mettre en oeuvre des mécanismes d’interruptions et de les appliquer sur
un PIC16F,
— d’être capable de concevoir un programme simple basé sur des interruptions.
1 Pré-requis
Pour cela, il faudra être familiarisé avec le code assembleur et la documentation tech-
nique des PIC16, puis de connaitre les outils de développement de programmes en assem-
bleur. Même si l’implémentation est spécifique à ce micro-contrôleur, les démarches sont
transposables à des programmes écrit en C (seule la syntaxe sera différente) ainsi qu’aux
autres de micro-contrôleurs.
Un micro-contrôleur 16F887 du fabricant Microchip est utilisé, associé à un kit de
développement composé d’une interface PICKIT3 et d’une platine de prototypage rapide
PICKIT2 (Figure 1).
Cours liés :
2- IF3 - Informatique industrielle
2 Présentation du matériel
a. Logiciel MPLAB de Microchip
Il s’agit de l’environnement informatique de développement pour PIC fourni par le
constructeur Microchip. Il est gratuitement téléchargeable 1 . Le logiciel MPLAB permet :
— d’éditer le code assembleur (reconnaissance des instructions),
— de compiler le code (le lier à des librairies si besoin),
— de simuler le comportement d’un PIC : ceci permet de tester le bon fonctionnement
d’un programme par simulation (débogage),
— de piloter des outils de développement supplémentaires comme MPLAB ICD 2,
PICKITx,
et bien d’autres fonctionnalités encore.
c. Plateforme de prototypage
La plateforme de prototypage (Figure 5) est basée sur un kit fournit par MICROCHIP.
C’est sur cette carte que se trouve le PIC 16F887, sachant que cette plateforme est
compatible avec d’autres références de PIC selon le beoin. On trouve sur cette carte, dont
le schéma électrique est donné sur les Figures 6 et 7, les éléments suivant :
1. http ://www.microchip.com
2. PIKLAB, suite GPUTILS ...
Quatre boutons poussoirs ont été rajoutés sur la zone dite de développement (Figure
8). Vous trouverez les informations sur les liaisons entre le µC et les périphériques utiles
pour la séance de travaux pratiques dans le Tableau 1.
L’alimentation de la carte de prototypage se fait par un adaptateur externe 200V/5V.
L’ensemble de ces outils est disponible sur chaque PC de la salle de TP, les logiciels, sujets,
et support de cours étant également accessible sur la plateforme pédagogique MOODLE 3 .
3. http ://moodle2.insa-lyon.fr
Il y a trois parties à la séance. La première partie (30 minutes) vous permettra de reprendre
en main l’application et les outils de développement et de critiquer la réalisation initiale
(vu en 3GE). Ensuite, il s’agira de mettre en oeuvre une interruption. Ce travail sera
précédé d’un rappel sur les éléments techniques du micro-contrôleur. La dernière partie
sera consacrée à la conception (et à la mise en oeuvre) d’un programme basé sur deux
sources d’interruptions.
Vdd
R1 R2 R3 R4
RB3
RB0
Début
Initialisation E/S
Allumer éclairage
Eteindre éclairage
Attendre 1s
oui
Appui sur BP ?
non
Incrémenter tempo tempo=tempo+1
oui
2. Brancher le PicKit3
3. Lancement du projet MPLAB IDE
- Ouvrir le répertoire créé suite au dé-archivage
- Double cliquer sur le fichier TPuC_1.mcw se trouve dans le dossier
→ MPLAB se lance et charge les fichiers nécessaires au fonctionnement de l’appli-
cation.
5. Programmation, Exécution avec débogage sur les maquettes. Si votre "build" s’est
passé sans erreur, les projets sont paramétrés pour envoyer le code machine dans
le micro-contrôleur et lancer l’exécution du programme (Running apparait en bas
à gauche). Si le kit est correctement configuré et connecté, on obtient le message
de la figure 10 dans la fenêtre "Output" (sinon vérifier l’alimentation des cartes,
les connexions puis effectuer de nouveau la procédure). Le message de la Figure
11 peut apparaître, dans ce cas cochez "Don’t show me this again" et cliquez sur
"OK"
6. Programmer le PIC : au besoin, pour envoyer le code machine dans le PIC, procéder
ainsi :
- dans le menu "Degugger" → Program
3 Questions
Les interruptions, en bref : Rappelons tout d’abord que l’effet d’une instruction
exécutée est dépendant de l’état du microprocesseur et que l’état d’un microprocesseur
est donné par les valeurs de ses registres. Enfin, un micro-contrôleur contient un micro-
processeur.
Lors d’une interruption, le microprocesseur termine l’instruction en cours et sauve
l’adresse de l’instruction suivante, généralement dans la pile système. Il exécute ensuite
la routine d’interruption (ISR) qui commence par sauvegarder l’état du micro-contrôleur,
en se focalisant sur les registres qui vont être modifiés par la routine d’interruption,
puis continue par le traitement de l’interruption. Une fois le traitement de l’interrup-
tion effectué, la routine se termine par plusieurs instructions de retour d’interruption, qui
restaurent l’état sauvé et font repartir le processeur de l’endroit où il avait été interrompu.
6. Lors d’une interruption, quelles sont les actions effectuées par le micro-
contrôleur garantissant un comportement déterministe du programme ?
8. Dans le cas du PIC utilisé, détailler les actions effectuées par le micro-
contrôleur et les instructions à écrire dans la fonction d’interruption (cf.
Annexes).
Fin_Tempo =1
Tempo_Xs= 0
1 → Fin_Tempo
non
Arrêt du TIMER1
Restauration du contexte
1
14 - IF3 - Informatique industrielle
10. Estimer le temps d’exécution dans le pire des cas de la fonction d’in-
terruption. Quelle est la différence entre cette fonction d’interruption et
la fonction Tempo_Ws de la partie précédente ?
Modification du code
- Ouvrir le workspace : TPuC_1IRQ.mcw
- Repérer la fonction d’interruption.
11. Quel est le rôle du code org 0x0004 placé avant cette fonction ?
Conclusions
13. Quels sont les avantages et les inconvénients de la gestion par inter-
ruption, du points de vue de :
— la lisibilité de l’organigramme ?
— la lisibilité du programme ?
— la complexité de programmation ?
— l’utilisation des ressources micro-contrôleur ?
Allumer éclairage
Arrêter Tempo IRQ BOUTON
Démarrer tempo
non
Fin_Tempo =1
Arrêt du TIMER1
1 → Fin_Tempo
Restauration du contexte
1
1 Questions
2. A partir des documents en annexe, donner les bits des registres à mo-
difier ainsi que la valeur de ces bits pour obtenir le déclenchement d’une
interruption sur les fronts montants de RB0. Donner aussi les banques dans
lesquelles ces registres sont présents.
2 Modification du code
Procéder par étapes !
Mise au point Pour la mise au point, il est recommandé d’utiliser le simulateur (MPLAB
SIM) puis le déboggeur (MPLAB PICkit3). Veillez à bien configurer l’accès aux banques
des registres.
3 Questions
4 Conclusions
56 ; ******************************************************************
57 main:
58
74 main_prg:
75 ; init tempo
76 clrf tempo;
77 ; touche ?
78 btfsc PORTB, 0
79 goto main_prg
80 ; allumage
81 bsf PORTD,0
82
83 main_attente:
84 ; attendre 1s
85 movlw 1
86 call Tempo_Ws
87 ; touche ?
88 btfss PORTB, 0
89 goto main_eteindre
90 ; incrementer tempo : tempo = tempo + 1
91 incf tempo
92
93 ; fin tempo ?
94 movf tempo,w
95 sublw .10
96 btfss STATUS, Z
97 goto main_attente ; Z=0
98
99 main_eteindre:
100 ; eteindre LED
101 bcf PORTD, 0 ; LED eteinte
102 ; attendre 1s
103 movlw .1
104 call Tempo_Ws
105 bcf PORTD,0
106 ; retour au debut
107 goto main_prg
108 END ; directive ’end of program’
Fin de code
Notes
25 ;**********************************************************************
26 ORG 0x0000 ; vecteur reset
27 goto Main ; aller au début du programme
28
29 ;**********************************************************************
30 ; Fontion de gestion de l’interruption
31 ORG 0x0004 ; vecteur d’interruption
32 Routine_ISR:
33 ; Sauvegarde du contexte
34
35
40 ; detection IRQ
41 btfsc PIR1, TMR1IF ; dépassement de TIMER1 ?
42 goto T1_INT ; oui
43
47 T1_INT:
48 ; remise ? 0 du flag d’IRQ du TIMER1
49 bcf PIR1, TMR1IF
50
71 goto END_ISR
72
77
78
81 ; ******************************************************************
82 ; Lancer le TIMER 1 avec interruption
83 Start_TIMER1:
84 ; INIT IRQ
85 bsf STATUS, RP0 ; Bank1
86 bcf STATUS, RP1 ; Bank1
87 bcf PIE1, TMR1IE ; Disable TIMER1 interrupt
88 bcf STATUS, RP0 ; Bank0
89 clrf PIR1 ; Clear peripheral interrupts Flags
90
97 ; Initialisation du Timer1
98 movlw 0x00 ; Internal Clock source avec 1:1 prescaler
99 movwf T1CON ; Timer1 is stopped and T1 osc is disabled
100 movlw 0x7B ; valeur de départ (cf explication plus bas)
152 RB0_Relache:
153 btfss PORTB, 0
154 goto RB0_Relache
155 call Tempo_10ms
156 RETURN
157 ; ******************************************************************
158 ; ******************************************************************
159 ; PROGRAMME PRINCIPAL
160 Main:
161 ; INIT DES REGISTRES D’IRQ
162 clrf INTCON ; blocage
163 bsf INTCON, GIE ; activation des interruptions globales
164
187 Main_Boucle:
188 ; INIT des variables
189 clrf Fin_Tempo
190 ; Attendre BP enfoncé
191 call RB0_Enfonce
192
202 Main_Attente:
211 Main_Eteindre:
212 ; Arreter TIMER1 (cas de l’appuie sur le BP)
213 call Stop_TIMER1
214
Notes
Travaux pratiques
Micro-contrôleur PIC
Annexes techniques
MODULE IF3
Descriptif Page(s)
REGISTRES, PLAN MEMOIRE ET REGISTRES SPECIFIQUES 27-36
DESCRIPTION DES PORT B & D : schéma et registres 47-52 ;57-58
TIMER1 : schéma, fonctionnement et registres de configuration 76-80
INTERRUPTION : description et mise en oeuvre 216-219
JEU D’INSTRUCTIONS 226
PIC16F882/883/884/886/887
FIGURE 2-6: PIC16F886/PIC16F887 SPECIAL FUNCTION REGISTERS
File File File File
Address Address Address Address
Indirect addr. (1) 00h Indirect addr. (1) 80h Indirect addr. (1) 100h Indirect addr. (1) 180h
TMR0 01h OPTION_REG 81h TMR0 101h OPTION_REG 181h
PCL 02h PCL 82h PCL 102h PCL 182h
STATUS 03h STATUS 83h STATUS 103h STATUS 183h
FSR 04h FSR 84h FSR 104h FSR 184h
PORTA 05h TRISA 85h WDTCON 105h SRCON 185h
PORTB 06h TRISB 86h PORTB 106h TRISB 186h
PORTC 07h TRISC 87h CM1CON0 107h BAUDCTL 187h
PORTD(2) 08h TRISD(2) 88h CM2CON0 108h ANSEL 188h
PORTE 09h TRISE 89h CM2CON1 109h ANSELH 189h
PCLATH 0Ah PCLATH 8Ah PCLATH 10Ah PCLATH 18Ah
INTCON 0Bh INTCON 8Bh INTCON 10Bh INTCON 18Bh
PIR1 0Ch PIE1 8Ch EEDAT 10Ch EECON1 18Ch
PIR2 0Dh PIE2 8Dh EEADR 10Dh EECON2(1) 18Dh
TMR1L 0Eh PCON 8Eh EEDATH 10Eh Reserved 18Eh
TMR1H 0Fh OSCCON 8Fh EEADRH 10Fh Reserved 18Fh
T1CON 10h OSCTUNE 90h 110h 190h
TMR2 11h SSPCON2 91h 111h 191h
T2CON 12h PR2 92h 112h 192h
SSPBUF 13h SSPADD 93h 113h 193h
SSPCON 14h SSPSTAT 94h 114h 194h
CCPR1L 15h WPUB 95h 115h 195h
CCPR1H 16h IOCB 96h General 116h General 196h
CCP1CON 17h VRCON 97h Purpose 117h Purpose 197h
Registers Registers
RCSTA 18h TXSTA 98h 118h 198h
TXREG 19h SPBRG 99h 16 Bytes 119h 16 Bytes 199h
RCREG 1Ah SPBRGH 9Ah 11Ah 19Ah
CCPR2L 1Bh PWM1CON 9Bh 11Bh 19Bh
CCPR2H 1Ch ECCPAS 9Ch 11Ch 19Ch
CCP2CON 1Dh PSTRCON 9Dh 11Dh 19Dh
ADRESH 1Eh ADRESL 9Eh 11Eh 19Eh
ADCON0 1Fh ADCON1 9Fh 11Fh 19Fh
20h A0h 120h 1A0h
General
General General
3Fh Purpose
General Purpose Purpose
Registers
Purpose 40h Registers Registers
Registers 80 Bytes
80 Bytes 80 Bytes
96 Bytes 6Fh EFh 16Fh 1EFh
70h accesses F0h accesses 170h accesses 1F0h
7Fh 70h-7Fh FFh 70h-7Fh 17Fh 70h-7Fh 1FFh
Bank 0 Bank 1 Bank 2 Bank 3
Unimplemented data memory locations, read as ‘0’.
Note 1: Not a physical register.
2: PIC16F887 only.
Bank 0
00h INDF Addressing this location uses contents of FSR to address data memory (not a physical register) xxxx xxxx 37,213
01h TMR0 Timer0 Module Register xxxx xxxx 73,213
02h PCL Program Counter’s (PC) Least Significant Byte 0000 0000 37,213
03h STATUS IRP RP1 RP0 TO PD Z DC C 0001 1xxx 29,213
04h FSR Indirect Data Memory Address Pointer xxxx xxxx 37,213
05h PORTA(3) RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0 xxxx xxxx 39,213
06h PORTB(3) RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx 48,213
07h PORTC(3) RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 xxxx xxxx 53,213
08h PORTD(3,4) RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 xxxx xxxx 57,213
09h PORTE(3) — — — — RE3 RE2(4) RE1(4) RE0(4) ---- xxxx 59,213
0Ah PCLATH — — — Write Buffer for upper 5 bits of Program Counter ---0 0000 37,213
0Bh INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF(1) 0000 000x 31,213
0Ch PIR1 — ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF -000 0000 34,213
0Dh PIR2 OSFIF C2IF C1IF EEIF BCLIF ULPWUIF — CCP2IF 0000 00-0 35,213
0Eh TMR1L Holding Register for the Least Significant Byte of the 16-bit TMR1 Register xxxx xxxx 76,213
0Fh TMR1H Holding Register for the Most Significant Byte of the 16-bit TMR1 Register xxxx xxxx 76,213
10h T1CON T1GINV TMR1GE T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON 0000 0000 79,213
11h TMR2 Timer2 Module Register 0000 0000 81,213
12h T2CON — TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 -000 0000 82,213
13h SSPBUF Synchronous Serial Port Receive Buffer/Transmit Register xxxx xxxx 179,213
14h SSPCON(2) WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 0000 0000 177,213
15h CCPR1L Capture/Compare/PWM Register 1 Low Byte (LSB) xxxx xxxx 126,213
16h CCPR1H Capture/Compare/PWM Register 1 High Byte (MSB) xxxx xxxx 126,213
17h CCP1CON P1M1 P1M0 DC1B1 DC1B0 CCP1M3 CCP1M2 CCP1M1 CCP1M0 0000 0000 124,213
18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000x 159,213
19h TXREG EUSART Transmit Data Register 0000 0000 151,213
1Ah RCREG EUSART Receive Data Register 0000 0000 156,213
1Bh CCPR2L Capture/Compare/PWM Register 2 Low Byte (LSB) xxxx xxxx 126,213
1Ch CCPR2H Capture/Compare/PWM Register 2 High Byte (MSB) xxxx xxxx 126,214
1Dh CCP2CON — — DC2B1 DC2B0 CCP2M3 CCP2M2 CCP2M1 CCP2M0 --00 0000 125,214
1Eh ADRESH A/D Result Register High Byte xxxx xxxx 99,214
1Fh ADCON0 ADCS1 ADCS0 CHS3 CHS2 CHS1 CHS0 GO/DONE ADON 0000 0000 104,214
Legend: – = Unimplemented locations read as ‘0’, u = unchanged, x = unknown, q = value depends on condition, shaded = unimplemented
Note 1: MCLR and WDT Reset do not affect the previous value data latch. The RBIF bit will be cleared upon Reset but will set again if the
mismatch exists.
2: When SSPCON register bits SSPM<3:0> = 1001, any reads or writes to the SSPADD SFR address are accessed through the SSPMSK
register. See Registers • and 13-4 for more detail.
3: Port pins with analog functions controlled by the ANSEL and ANSELH registers will read ‘0’ immediately after a Reset even though the
data latches are either undefined (POR) or unchanged (other Resets).
4: PIC16F884/PIC16F887 only.
Bank 1
80h INDF Addressing this location uses contents of FSR to address data memory (not a physical register) xxxx xxxx 37,213
81h OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 30,214
82h PCL Program Counter’s (PC) Least Significant Byte 0000 0000 37,213
83h STATUS IRP RP1 RP0 TO PD Z DC C 0001 1xxx 29,213
84h FSR Indirect Data Memory Address Pointer xxxx xxxx 37,213
85h TRISA TRISA7 TRISA6 TRISA5 TRISA4 TRISA3 TRISA2 TRISA1 TRISA0 1111 1111 39,214
86h TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0 1111 1111 48,214
87h TRISC TRISC7 TRISC6 TRISC5 TRISC4 TRISC3 TRISC2 TRISC1 TRISC0 1111 1111 53,214
88h TRISD(3) TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISD0 1111 1111 57,214
89h TRISE — — — — TRISE3 TRISE2(3) TRISE1(3) TRISE0(3) ---- 1111 59,214
8Ah PCLATH — — — Write Buffer for the upper 5 bits of the Program Counter ---0 0000 37,213
8Bh INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF(1) 0000 000x 31,213
8Ch PIE1 — ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE -000 0000 32,214
8Dh PIE2 OSFIE C2IE C1IE EEIE BCLIE ULPWUIE — CCP2IE 0000 00-0 33,214
8Eh PCON — — ULPWUE SBOREN — — POR BOR --01 --qq 36,214
8Fh OSCCON — IRCF2 IRCF1 IRCF0 OSTS HTS LTS SCS -110 q000 62,214
90h OSCTUNE — — — TUN4 TUN3 TUN2 TUN1 TUN0 ---0 0000 66,214
91h SSPCON2 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN 0000 0000 177,214
92h PR2 Timer2 Period Register 1111 1111 81,214
93h SSPADD(2) Synchronous Serial Port (I2C mode) Address Register 0000 0000 185,214
93h SSPMSK(2) MSK7 MSK6 MSK5 MSK4 MSK3 MSK2 MSK1 MSK0 1111 1111 204,214
94h SSPSTAT SMP CKE D/A P S R/W UA BF 0000 0000 185,214
95h WPUB WPUB7 WPUB6 WPUB5 WPUB4 WPUB3 WPUB2 WPUB1 WPUB0 1111 1111 49,214
96h IOCB IOCB7 IOCB6 IOCB5 IOCB4 IOCB3 IOCB2 IOCB1 IOCB0 0000 0000 49,214
97h VRCON VREN VROE VRR VRSS VR3 VR2 VR1 VR0 0000 0000 97,214
98h TXSTA CSRC TX9 TXEN SYNC SENDB BRGH TRMT TX9D 0000 0010 158,214
99h SPBRG BRG7 BRG6 BRG5 BRG4 BRG3 BRG2 BRG1 BRG0 0000 0000 161,214
9Ah SPBRGH BRG15 BRG14 BRG13 BRG12 BRG11 BRG10 BRG9 BRG8 0000 0000 161,214
9Bh PWM1CON PRSEN PDC6 PDC5 PDC4 PDC3 PDC2 PDC1 PDC0 0000 0000 144,214
9Ch ECCPAS ECCPASE ECCPAS2 ECCPAS1 ECCPAS0 PSSAC1 PSSAC0 PSSBD1 PSSBD0 0000 0000 141,214
9Dh PSTRCON — — — STRSYNC STRD STRC STRB STRA ---0 0001 145,214
9Eh ADRESL A/D Result Register Low Byte xxxx xxxx 99,214
9Fh ADCON1 ADFM — VCFG1 VCFG0 — — — — 0-00 ---- 105,214
Legend: – = Unimplemented locations read as ‘0’, u = unchanged, x = unknown, q = value depends on condition, shaded = unimplemented
Note 1: MCLR and WDT Reset do not affect the previous value data latch. The RBIF bit will be cleared upon Reset but will set again if the
mismatch exists.
2: Accessible only when SSPCON register bits SSPM<3:0> = 1001.
3: PIC16F884/PIC16F887 only.
Bank 2
100h INDF Addressing this location uses contents of FSR to address data memory (not a physical register) xxxx xxxx 37,213
101h TMR0 Timer0 Module Register xxxx xxxx 73,213
102h PCL Program Counter’s (PC) Least Significant Byte 0000 0000 37,213
103h STATUS IRP RP1 RP0 TO PD Z DC C 0001 1xxx 29,213
104h FSR Indirect Data Memory Address Pointer xxxx xxxx 37,213
105h WDTCON — — — WDTPS3 WDTPS2 WDTPS1 WDTPS0 SWDTEN ---0 1000 221,214
106h PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx 48,213
107h CM1CON0 C1ON C1OUT C1OE C1POL — C1R C1CH1 C1CH0 0000 -000 88,214
108h CM2CON0 C2ON C2OUT C2OE C2POL — C2R C2CH1 C2CH0 0000 -000 89,214
109h CM2CON1 MC1OUT MC2OUT C1RSEL C2RSEL — — T1GSS C2SYNC 0000 --10 91,215
10Ah PCLATH — — — Write Buffer for the upper 5 bits of the Program Counter ---0 0000 37,213
10Bh INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF(1) 0000 000x 31,213
10Ch EEDAT EEDAT7 EEDAT6 EEDAT5 EEDAT4 EEDAT3 EEDAT2 EEDAT1 EEDAT0 0000 0000 112,215
10Dh EEADR EEADR7 EEADR6 EEADR5 EEADR4 EEADR3 EEADR2 EEADR1 EEADR0 0000 0000 112,215
10Eh EEDATH — — EEDATH5 EEDATH4 EEDATH3 EEDATH2 EEDATH1 EEDATH0 --00 0000 112,215
10Fh EEADRH — — — EEADRH4(2) EEADRH3 EEADRH2 EEADRH1 EEADRH0 ---- 0000 112,215
Legend: – = Unimplemented locations read as ‘0’, u = unchanged, x = unknown, q = value depends on condition, shaded = unimplemented
Note 1: MCLR and WDT Reset does not affect the previous value data latch. The RBIF bit will be cleared upon Reset but will set again if the
mismatch exists.
2: PIC16F886/PIC16F887 only.
Bank 3
180h INDF Addressing this location uses contents of FSR to address data memory (not a physical register) xxxx xxxx 37,213
181h OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 30,214
182h PCL Program Counter’s (PC) Least Significant Byte 0000 0000 37,213
183h STATUS IRP RP1 RP0 TO PD Z DC C 0001 1xxx 29,213
184h FSR Indirect Data Memory Address Pointer xxxx xxxx 37,213
185h SRCON SR1 SR0 C1SEN C2REN PULSS PULSR — FVREN 0000 00-0 93,215
186h TRISB TRISB7 TRISB6 TRISB5 TRISB4 TRISB3 TRISB2 TRISB1 TRISB0 1111 1111 48,214
187h BAUDCTL ABDOVF RCIDL — SCKP BRG16 — WUE ABDEN 01-0 0-00 160,215
188h ANSEL ANS7(2) ANS6(2) ANS5(2) ANS4 ANS3 ANS2 ANS1 ANS0 1111 1111 40,215
189h ANSELH — — ANS13 ANS12 ANS11 ANS10 ANS9 ANS8 --11 1111 99,215
18Ah PCLATH — — — Write Buffer for the upper 5 bits of the Program Counter ---0 0000 37,213
18Bh INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF(1) 0000 000x 31,213
18Ch EECON1 EEPGD — — — WRERR WREN WR RD x--- x000 113,215
18Dh EECON2 EEPROM Control Register 2 (not a physical register) ---- ---- 111,215
Legend: – = Unimplemented locations read as ‘0’, u = unchanged, x = unknown, q = value depends on condition, shaded = unimplemented
Note 1: MCLR and WDT Reset does not affect the previous value data latch. The RBIF bit will be cleared upon Reset but will set again if the
mismatch exists.
2: PIC16F884/PIC16F887 only.
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
bit 7 IRP: Register Bank Select bit (used for indirect addressing)
1 = Bank 2, 3 (100h-1FFh)
0 = Bank 0, 1 (00h-FFh)
bit 6-5 RP<1:0>: Register Bank Select bits (used for direct addressing)
00 = Bank 0 (00h-7Fh)
01 = Bank 1 (80h-FFh)
10 = Bank 2 (100h-17Fh)
11 = Bank 3 (180h-1FFh)
bit 4 TO: Time-out bit
1 = After power-up, CLRWDT instruction or SLEEP instruction
0 = A WDT time-out occurred
bit 3 PD: Power-down bit
1 = After power-up or by the CLRWDT instruction
0 = By execution of the SLEEP instruction
bit 2 Z: Zero bit
1 = The result of an arithmetic or logic operation is zero
0 = The result of an arithmetic or logic operation is not zero
bit 1 DC: Digit Carry/Borrow bit (ADDWF, ADDLW,SUBLW,SUBWF instructions)(1)
1 = A carry-out from the 4th low-order bit of the result occurred
0 = No carry-out from the 4th low-order bit of the result
bit 0 C: Carry/Borrow bit (ADDWF, ADDLW, SUBLW, SUBWF instructions)(1)
1 = A carry-out from the Most Significant bit of the result occurred
0 = No carry-out from the Most Significant bit of the result occurred
Note 1: For Borrow, the polarity is reversed. A subtraction is executed by adding the two’s complement of the
second operand. For rotate (RRF, RLF) instructions, this bit is loaded with either the high-order or low-order
bit of the source register.
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
Data
Memory
7Fh 1FFh
Bank 0 Bank 1 Bank 2 Bank 3
Note: For memory map detail, see Figures 2-2 and 2-3.
PORTB pins RB<7:0> on the device family device have A mismatch condition will continue to set flag bit RBIF.
an interrupt-on-change option and a weak pull-up Reading or writing PORTB will end the mismatch
option. The following three sections describe these condition and allow flag bit RBIF to be cleared. The latch
PORTB pin functions. holding the last read value is not affected by a MCLR nor
Brown-out Reset. After these Resets, the RBIF flag will
Every PORTB pin on this device family has an continue to be set if a mismatch is present.
interrupt-on-change option and a weak pull-up option.
Note: If a change on the I/O pin should occur when
the read operation is being executed (start of
the Q2 cycle), then the RBIF interrupt flag
may not get set. Furthermore, since a read
or write on a port affects all bits of that port,
care must be taken when using multiple pins
in Interrupt-on-Change mode. Changes on
one pin may not be seen while servicing
changes on another pin.
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
Note 1: Setting a pin to an analog input automatically disables the digital input circuitry, weak pull-ups, and
interrupt-on-change if available. The corresponding TRIS bit must be set to Input mode in order to allow
external control of the voltage on the pin.
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
only. WR CK Q Q D
IOCB
3.4.4.3 RB2/AN8/P1B(1) EN Q3
RD
Figure 3-9 shows the diagram for this pin. This pin is IOCB Q D
configurable to function as one of the following:
EN
• a general purpose I/O Interrupt-on-
Change
• an analog input for the ADC
• a PWM output(1) RD PORTB
Note 1: P1B is available on PIC16F882/883/886
only. RB0/INT
RB3/PGM
3.4.4.4 RB3/AN9/PGM/C12IN2- To A/D Converter
Figure 3-9 shows the diagram for this pin. This pin is
configurable to function as one of the following: To Comparator (RB1, RB3)
WR CK Q
WPUB RBPU
RD CCP1OUT Enable
WPUB VDD
D Q CCP1OUT
10
1
WR CK
PORTB Q
1
00 I/O Pin
D Q
WR CK VSS
TRISB Q
RD
TRISB Analog(1)
Input Mode
RD
PORTB
D Q
Q D ICSP™(2)
WR CK Q
IOCB
EN Q3
RD
IOCB Q D
EN
Interrupt-on-
Change
RD PORTB
To Timer1 T1G(3)
To A/D Converter
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
WR CK Q CCP1 1
0
PORTD
3.6.2 RD5/P1B(1)
0
1 I/O Pin
Figure 3-20 shows the diagram for this pin. This pin is
D Q
configurable to function as one of the following:
WR CK
• a general purpose I/O TRISD Q VSS
• a PWM output
RD
Note 1: RD5/P1B is available on PIC16F884/887 TRISD
only. See RB2/AN8/P1B for this function
on PIC16F882/883/886. RD
PORTD
PORTD RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 xxxx xxxx uuuu uuuu
PSTRCON — — — STRSYNC STRD STRC STRB STRA ---0 0001 ---0 0001
TRISD TRISD7 TRISD6 TRISD5 TRISD4 TRISD3 TRISD2 TRISD1 TRISD0 1111 1111 1111 1111
Legend: x = unknown, u = unchanged, – = unimplemented locations read as ‘0’. Shaded cells are not used by PORTD.
TMR1GE
T1GINV
TMR1ON
Set flag bit
TMR1IF on To C2 Comparator Module
Overflow Timer1 Clock
TMR1(2)
Synchronized
EN 0 clock input
TMR1H TMR1L
1
T1 OSC
(1) T1SYNC
T1OSI 1
1
Prescaler Synchronize(3)
0 1, 2, 4, 8
FOSC/4 det
T1OSO Internal 0
Clock 2
Sleep input
T1CKPS<1:0>
C2OUT 0
T1CKI
T1GSS
Note 1: ST Buffer is low power type when using LP oscillator, or high speed type when using T1CKI.
2: Timer1 register increments on rising edge.
3: Synchronize does not operate while in Sleep.
T1CKI = 1
when TMR1
Enabled
T1CKI = 0
when TMR1
Enabled
Legend:
R = Readable bit W = Writable bit U = Unimplemented bit, read as ‘0’
-n = Value at POR ‘1’ = Bit is set ‘0’ = Bit is cleared x = Bit is unknown
Note 1: T1GINV bit inverts the Timer1 gate logic, regardless of source.
2: TMR1GE bit must be set to use either T1G pin or C2OUT, as selected by the T1GSS bit of the CM2CON1
register, as a Timer1 gate source.
IOC-RB0
IOCB0
IOC-RB1
IOCB1
IOC-RB2 BCLIF
IOCB2 BCLIE
IOC-RB3 SSPIF
IOCB3 SSPIE
IOC-RB4 TXIF
IOCB4 TXIE
IOC-RB5 RCIF
IOCB5 RCIE Wake-up (If in Sleep mode)(1)
T0IF
IOC-RB6 TMR2IF T0IE
Interrupt to CPU
IOCB6 TMR2IE INTF
INTE
IOC-RB7 TMR1IF RBIF
IOCB7 TMR1IE
RBIE
C1IF
C1IE PEIE
C2IF GIE
C2IE
ADIF
ADIE
EEIF
EEIE
Note 1: Some peripherals depend upon the
OSFIF system clock for operation. Since the
OSFIE system clock is suspended during
Sleep, these peripherals will not wake
CCP1IF the part from Sleep. See Section 14.6.1
CCP1IE
“Wake-up from Sleep”.
CCP2IF
CCP2IE
ULPWUIF
ULPWUIE
Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4 Q1 Q2 Q3 Q4
OSC1
CLKOUT (3)
(4)
INT pin
(1)
(1)
INTF flag (5) Interrupt Latency (2)
(INTCON<1>)
GIE bit
(INTCON<7>)
INSTRUCTION FLOW
PC PC PC + 1 PC + 1 0004h 0005h
Instruction
Fetched Inst (PC) Inst (PC + 1) — Inst (0004h) Inst (0005h)
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000x
PIE1 — ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE -000 0000 -000 0000
PIE2 OSFIE C2IE C1IE EEIE BCLIE ULPWUIE — CCP2IE 0000 00-0 0000 00-0
PIR1 — ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF -000 0000 -000 0000
PIR2 OSFIF C2IF C1IF EEIF BCLIF ULPWUIF — CCP2IF 0000 00-0 0000 00-0
Legend: x = unknown, u = unchanged, — = unimplemented read as ‘0’, q = value depends upon condition.
Shaded cells are not used by the Interrupt module.