You are on page 1of 157

Microcontrolador PIC16F876 Página 1

EL MICROCONTROLADOR PIC16F876

Características principales:

- CPU tipo RISCC de altas prestaciones.


- Repertorio de 35 instrucciones de una palabra.
- Todas las instrucciones son de un único ciclo, excepto las de salto, que llevan dos.
- Velocidad de trabajo de 20 Mhz, con un ciclo de instrucción de 200 ns.
- Memoria de programa tipo flash de 8 Kpalabras.
- Memoria de datos de 368 bytes.
- Memoria EEPROM de datos de 256 bytes.
- Patillaje compatible con PIC16C73B/74B/76/77.
- Hasta 14 fuentes de interrupción.
- Pila por hardware de 8 niveles.
- Modos de direccionamiento directo, indirecto y relativo.
- Reset de conexión (POR).
- Temporización de conexión y temporización de inicio de oscilación.
- Circuito supervisor (watchdog).
- Código de protección programable.
- Tecnología de alta velocidad y bajo consumo en la memoria CMOS
EEPROM/FLASH.
- Programación in-situ vía serie con dos patillas.
- Posibilidad de programación in-situ, vía serie, mediante tensión simple de 5 voltios.
- Acceso para lectura o escritura a la memoria de programa.
- Gran margen de alimentación entre 2 y 5,5 voltios.
- Corriente de salida de 25 mA.
- Bajo consumo:
 Menor de 2 mA a 5V y 4 Mhz.
 20 µ A a 3V y 32 Khz.
 Menor de 1 µ A en reposo.

Prestaciones de periféricos:

- Timer0: Temporizador-Contador de 8 bits, con Predivisor también de 8 bits.


- Timer1: Temporizador-Contador de 16 bits con Predivisor, que puede trabajar con
reloj externo en el modo reposo (sleep).
- Timer2: Temporizador-Contador de 8 bits con registro de período de la misma
longitud, con Predivisor y Postdivisor.
- Dos módulos de Captura y Comparación y uno PWM (modulación por ancho de
impulso:
 La captura es de 16 bits, con resolución máxima de 12,5 ns.
 La comparación es de 16 bits, con resolución máxima de 200 ns.
 El bloque PWM tiene una resolución máxima de 10 bits.
- Convertidor multicanal analógico digital de 10 bits.
- Puerto serie síncrono (SSP), con modo Maestro (SPI) e I2C (maestro/servidor).
- Transmisor Receptor Universal Síncrono Asíncrono (USART/SCI) con detección
de 9 bits y de dirección.
- Circuito de detección de BROWN-OUT (bajada de tensión).
Microcontrolador PIC16F876 Página 2

PRESTACIONES PIC16F876
PATILLAJE
Frecuencia de trabajo Continua- 20Mhz.
Borrados y retardos POR, BOR
(PWRT, OST)
Memoria de programa tipo flash 8K
(palabras de 14 bits)
Memoria de datos (bytes) 368
Memoria de datos EEPROM 256
Interrupciones 13
Puertos de entrada salida PUERTOS A, B, C
Temporizadores 3
Módulos Captura/Comparación/PWM 2
Comunicaciones serie MSSP y USART
Módulo CAD de 10 bits 5 canales
Repertorio de instrucciones 35
Microcontrolador PIC16F876 Página 3

TABLA 1-1: DESCRIPCIÓN DEL Patillaje DEL PIC16F873 Y PIC16F876

Nº Nº Tipo
Nombre de la patilla Familia Descripción
DIP SOIC I/O/P

OSC1/CLKIN 9 9 I ST/CMOS Entrada de cristal oscilador/entrada reloj externo.


Salida del oscilador. Esta patilla saca ¼ de la frecuencia de reloj de
OSC2/CLKOUT 10 10 O -
la patilla OSC1, e indica la duración del ciclo de instrucción.
Entrada de reset por nivel bajo, entrada de tensión de programación
-MCLR/Vpp/ THV 1 1 I/P ST
o alta tensión de prueba de control.
El puerto A es un puerto bidireccional
RA0/AN0 2 2 I/O TTL RA0 puede ser, también, la entrada analógica 0.
RA1/AN1 3 3 I/O TTL RA1 puede ser, también, la entrada analógica 1.
RA2 puede ser la entrada analógica 2 o la tensión negativa de
RA2/AN2/VREF- 4 4 I/O TTL
referencia analógica.
RA3 puede serla entrada analógica 3 o la tensión positiva de
RA3/AN3/VREF+ 5 5 I/O TTL
referencia analógica.
RA4 puede ser, también, la entrada de reloj del Temporizador 0.
RA4/T0CKI 6 6 I/O ST
La salida es en drenador abierto.
RA5 puede ser, también, la entrada analógica 4 o la selección de
RA5/-SS/AN4 7 7 I/O TTL
servidor para el puerto serie síncrono.
El puerto B es bidireccional y puede programarse la conexión interna de resistencias a +Vcc
RB0/INT 21 21 I/O TTL/ST RB0 puede ser, también, la interrupción externa.
RB1 22 22 I/O TTL
RB2 23 23 I/O TTL
RB3/PGM 24 24 I/O TTL RB3 puede ser, también, la entrada de programación.
RB4 25 25 I/O TTL Patilla de cambio de interrupción activa.
RB5 26 26 I/O TTL Patilla de cambio de interrupción activa.
RB6/PGC 27 27 I/O TTL/ST Cambio de interrupción activa o reloj para programación en serie.
RB7/PGD 28 28 I/O TTL/ST Cambio de interrupción activa o dato para programación en serie.
El puerto C es un puerto bidireccional
RC0 puede ser, también, la salida de oscilación del Timer1 o la
RC0/T1OSO/T1CKI 11 11 I/O ST
entrada de reloj del Timer1.
RC1 puede ser, también, la entrada de oscilación del Timer1, la
RC1/T1OSI/CCP2 12 12 I/O ST
entrada de Captura2, salida de Comparación2 o salida de PWM2.
RC2 puede ser, también, la entrada de Captura1, salida de
RC2/CCP1 13 13 I/O ST
Comparación1 o salida de PWM1.
RC3 puede ser, también, entrada de reloj síncrono serie o salida del
RC3/SCK/SCL 14 14 I/O ST
bloque SPI en modo I2C.
RC4 puede ser, también, el dato de entrada en modo SPI o el dato
RC4/SDI/SDA 15 15 I/O ST
de entada salida en modo I2C.
RC5/SDO 16 16 I/O ST RC5 puede ser, también, el dato de salida en modo SPI.
RC6/TX/CK 17 17 I/O ST RC6 puede ser también, el reloj de la USART.
RC7/RX/DT 18 18 I/O ST RC7 puede ser, también, el dato de la USART.
Vss 8,19 8,19 P - Conexión de 0V para circuitos lógicos y entradas/salidas.
VDD 20 20 P - Alimentación positiva para lógica y entradas/salidas.
I = Entrada; O = Salida; I/O = Entrada o salida; P = Alimentación
- = No utilizado; TTL = Entrada de ese tipo; ST = Entrada tipo Trigger de Schmitt

2.0 ORGANIZACIÓN DE LA MEMORIA


Microcontrolador PIC16F876 Página 4

Existen tres bloques de memoria: la Memoria de Programa, la Memoria de Datos y la EEPROM


de datos. Las dos primeras poseen buses separados, lo que permite el acceso simultáneo.

2.1 ORGANIZACIÓN DE LA MEMORIA DE PROGRAMA

El PIC16F876 tiene un Contador de Programa (PC) de 13 bits, capaz de direccionar una


memoria de 8K palabras, siendo cada palabra de una longitud de 14 bits.

El vector de Reset se encuentra en la dirección 0000h, queriendo esto decir que tras un reset al
dispositivo el PC se cargará con esa cantidad. El vector de la interrupción se encuentra situado
en la dirección 0004h. En la figura 2.1 se representa esquemáticamente el mapa de memoria del
chip.

Figura 2.1: Mapa de Memoria de Programa y Pila.

La Memoria de Datos se fracciona en cuatro bancos: banco 0, banco 1, banco 2 y banco 3.

Cada banco puede seleccionarse con los bits


RP0 y RP1 del Registro de Funciones
Especiales (SFR).

RP1:RP0 Banco
00 0
01 1
10 2
11 3

Cada banco tiene una extensión de 128 bytes


(7Fh). Las posiciones más bajas de cada banco
se reservan para el registro SFR. Tanto SFR
como el GPR (Registro de Propósito General)
se implementan como una RAM estática. Los
registros que son muy utilizados dentro del
SFR, se duplican en otros bancos para evitar los
continuos cambios de éstos en los programas.

2.2.1 FICHERO DE REGISTROS DE PROPÓSITO GENERAL

Al fichero de registros de propósito general se puede acceder directamente o indirectamente a


través del Fichero de Selección de Registros FSR. En la figura 2.3 se ofrece el mapa del fichero
de registros del PIC16F876.
Microcontrolador PIC16F876 Página 5

Figura 2.3: MAPA DEL FICHERO DE REGISTROS DEL PIC16F876.

Direc. de
fichero
Dir. ind.(*) 00h Dir. ind.(*) 80h Dir. ind.(*) 100h Dir. ind.(*) 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 105h 185h
PORTB 06h TRISB 86h PORTB 106h TRISB 186h
PORTC 07h TRISC 87h 107h 187h
PORTD(1) 08h TRISD(1) 88h 108h 188h
PORTE(1) 09h TRISE(1) 89h 109h 189h
PCLATH 0Ah PCLATH 8Ah PCLATH 10Ah PCLATH 18Ah
INTCON 0Bh INTCON 8Bh INTCON 10Bh INTCON 18Bh
PIR1 0Ch PIE1 8Ch EEDATA 10Ch EECON1 18Ch
PIR2 0Dh PIE2 8Dh EEADR 10Dh EECON2 18Dh
TMR1L 0Eh PCON 8Eh EEDATH 10Eh Reservado(2) 18Eh
TMR1H 0Fh 8Fh EEADRH 10Fh Reservado(2) 18Fh
T1CON 10h 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 95h 115h 195h
CCPR1H 16h 96h 16 bytes de 116h 16 bytes de 196h
CCP1CON 17h 97h Registros de 117h Registros de 197h
RCSTA 18h TXSTA 98h Propósito 118h Propósito 198h
TXREG 19h SPBRG 99h General 119h General 199h
RCREG 1Ah 9Ah 11Ah 19Ah
CCPR2L 1Bh 9Bh 11Bh 19Bh
CCPR2H 1Ch 9Ch 11Ch 19Ch
CCP2CON 1Dh 9Dh 11Dh 19Dh
ADRESH 1Eh ADRESL 9Eh 11Eh 19Eh
ADCON 1Fh ADCON1 9Fh 11Fh 19Fh
20h A0h 120h 1A0h
80 bytes de 80 bytes de
80 bytes de
Registros de Registros de
Registros de
Propósito Propósito
96 bytes de Propósito
General General
Registros de General
EFh 16Fh 1EFh
Propósito
F0h 170H 1F0h
General
Acceso Acceso Acceso
70h - 7Fh 70h - 7Fh 70h - 7Fh
7Fh FFh 17Fh 1FFh
Banco 0 Banco 1 Banco 2 Banco 3

Posiciones sin implementar. Al leerlas se obtiene 0.

* No es físicamente un registro.

Nota 1: Estos registros no se implementan en los dispositivos de 28 patillas.

Nota 2: Estos registros están reservados; hay que mantenerlos en 0.


Microcontrolador PIC16F876 Página 6

2.2.2 REGISTROS DE FUNCIÓN ESPECIAL (SFR)

Los Registros de Función Especial son registros usados por la CPU y módulos periféricos para
controlar las operaciones deseadas en el microcontrolador. Estos registros se implementan como
una RAM estática, y la lista se ofrece en la Tabla 2.1. El SFR puede clasificarse en dos grupos:
para la CPU y para los periféricos. Los registros asociados a operaciones de la CPU se describen
detalladamente en esta sección; los relacionados con operaciones periféricas se detallarán en
secciones posteriores.

TABLA 2-1: RESUMEN DEL REGISTRO DE FUNCIÓN ESPECIAL


Valor tras Valor tras
Direcc. Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 POR, BOR otros resets
Banco 0
00h(4) INDF No es un registro físico. Se usa para direccionamiento de la memoria de datos. 0000 0000 0000 0000
01h TMR0 Registro del módulo Timer 0. xxxx xxxx uuuu uuuu
02h(4) PCL Byte de menor peso del registro Contador de Programa (PC). 0000 0000 0000 0000
03h(4) STATUS IRP RP1 RP0 -TO -PD Z DC C 0001 1xxx 000q quuu
04h(4) FSR Puntero de direccionamiento indirecto de la memoria de datos. xxxx xxxx uuuu uuuu
05h PORTA -- -- Memoria de datos PORTA en escritura; patillas PORTA en lectura. - -0x 0000 - -0u 0000
06h PORTB Memoria de datos PORTB en escritura; patillas del PORTB cuando se lee. xxxx xxxx uuuu uuuu
07h PORTC Memoria de datos PORTC en escritura; patillas del PORTC cuando se lee. xxxx xxxx uuuu uuuu
08h(5) PORTD Memoria de datos PORTD en escritura; patillas del PORTD cuando se lee. xxxx xxxx uuuu uuuu
09h(5) PORTE -- -- -- -- -- RE2 RE1 RE0 - - - - -xxx - - - - -uuu
0Ah(1,4) PCLATH -- -- -- Buffer de escritura para los 5 bits de más peso del PC. - - -0 0000 - - -0 0000
0Bh(4) INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
0Ch PIR1 PSPIF(3) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
0Dh PIR2 -- (6) -- EEIF BCLIF -- -- CCP2IF - r -0 0- -0 - r -0 0- -0
0Eh TMR1L 8 bits de menor peso del registro de 16 bits TMR1. xxxx xxxx uuuu uuuu
0Fh TMR1H 8 bits de mayor peso del registro de 16 bits TMR1. xxxx xxxx uuuu uuuu
10h T1CON -- -- T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON - -00 0000 - -uu uuuu
11h TMR2 Registro del módulo TIMER 2. 0000 0000 0000 0000
12h T2CON -- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 - 000 0000 - 000 0000
13h SSPBUF Registro de transmisión y buffer de recepción del puerto serie síncrono. xxxx xxxx uuuu uuuu
14h SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 0000 0000 0000 0000
15h CCPR1L Byte de menor peso del registro de Captura, Comparación y PWM. xxxx xxxx uuuu uuuu
16h CCPR1H Byte de mayor peso del registro de Captura, Comparación y PWM. xxxx xxxx uuuu uuuu
17h CCP1CON -- -- CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 - -00 0000 - -00 0000
18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000x 0000 000x
19h TXREG Registro de dato a transmitir en la USART. 0000 0000 0000 0000
1Ah RCREG Registro de dato recibido en la USART. 0000 0000 0000 0000
1Bh CCPR2L Byte menos significativo del registro 2 de Captura/Comparación/PWM. xxxx xxxx uuuu uuuu
1Ch CCPR2H Byte más significativo del registro 2 de Captura/Comparación/PWM. xxxx xxxx uuuu uuuu
1Dh CCP2CON -- -- CCP2X CCP2Y CCP2M3 CCP2M2 CCP2M1 CCP2M0 - -00 0000 - -00 0000
1Eh ADRESH Byte de más peso del resultado de la conversión analógica digital (A/D) xxxx xxxx uuuu uuuu
1Fh ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/-DONE -- ADON 0000 00-0 0000 00-0
Explicación: x = Desconocido; u = Sin cambio; q = Depende de condición; r = Reservado
“---“ = Sin implementar (al leer da cero); “–“ delante de una referencia = Función negada
Las posiciones oscurecidas están sin implementar; su lectura proporciona un cero.
Nota 1: El byte más significativo del Contador de Programa está inaccesible. PCLATH es el registro de los 5
bits de más peso del PC (PC12 - PC8).
Nota 2: “Otros resets” incluye el externo (por la patilla -MCLR) y el debido al Watchdog.
Nota 3: Los bits PSPIE y PSPIF están reservados en los dispositivos de 28 patillas; se deben poner a cero.
Nota 4: Estos registros pueden direccionarse desde cualquier banco.
Nota 5: PORTD, PORTE, TRISD y TRISE no están implementados en los dispositivos de 28 patillas. Al
leerlos, siempre se obtiene cero.
Nota 6: PIR2<6> y PIE2<6> están reservados en dispositivos de 28 patillas; se deben mantener siempre a cero.

TABLA 2-1:RESUMEN DEL REGISTRO DE FUNCIÓN ESPECIAL (CONTINUACIÓN)


Valor tras Valor tras
Direcc. Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 POR, BOR otros resets
Microcontrolador PIC16F876 Página 7

Banco 1
80h(4) INDF No es un registro físico. Se usa para direccionamiento de la memoria de datos. 0000 0000 0000 0000
81h O P T I O N _GR E -RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
82h(4) PCL Byte menos significativo del Contador de Programa (PC). 0000 0000 0000 0000
83h(4) STATUS IRP RP1 RP0 -TO -PD Z DC C 0001 1xxx 000q quuu
84h(4) FSR Puntero de direccionamiento indirecto de la memoria de datos. xxxx xxxx uuuu uuuu
85h TRISA -- -- Registro de programación de dirección del puerto A. - -11 1111 - -11 1111
86h TRISB Registro de programación de dirección del puerto B. 1111 1111 1111 1111
87h TRISC Registro de programación de dirección del puerto C. 1111 1111 1111 1111
88h(5) TRISD Registro de programación de dirección del puerto D. 1111 1111 1111 1111
89h(5) TRISE IBF OBF IBOV PSPMODE -- Dirección de datos en puerto E. 0000 -111 0000 -111
8Ah(1,4) PCLATH -- -- -- Buffer de escritura para los 5 bits de más peso del PC. - - -0 0000 - - -0 0000
8Bh(4) INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
8Ch PIE1 PSPIE(3) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000
8Dh PIE2 -- (6) -- EEIE BCLIE -- -- CCP2IE -r -0 0- -0 -r -0 0- -0
8Eh PCON -- -- -- -- -- -- -POR BOR - - - - - -qq - - - - - -uu
8Fh -- Sin implementar. ---- ----
90h -- Sin implementar. ---- ----
91h SSPCON2 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN 0000 0000 0000 0000
92h PR2 Registro de programación del período del temporizador 2 (Timer 2). 1111 1111 1111 1111
93h SSPADD Registro de dirección del puerto serie síncrono en modo I2C. 0000 0000 0000 0000
94h SSPSAT SMP CKE D/-A P S R/-W UA BF 0000 0000 0000 0000
95h -- Sin implementar. ---- ----
96h -- Sin implementar. ---- ----
97h -- Sin implementar. ---- ----
98h TXSTA CSRC TX9 TXEN SYNC -- BRGH TRMT TX9D 0000 -010 0000 -010
99h SPBRG Registro generador de baudios de transmisión. 0000 0000 0000 0000
9Ah -- Sin implementar. ---- ----
9Bh -- Sin implementar. ---- ----
9Ch -- Sin implementar. ---- ----
9Dh -- Sin implementar. ---- ----
9Eh ADRESL Byte de menos peso del resultado de la conversión analógica digital (A/D) xxxx xxxx uuuu uuuu
9Fh ADCON1 ADFM -- -- -- PCFG3 PCFG2 PCFG1 PCFG0 0- - - 0000 0- - - 0000
Explicación: x = Desconocido; u = Sin cambio; q = Depende de condición; r = Reservado
“---“ = Sin implementar (al leer da cero); “–“ delante de una referencia = Función negada
Las posiciones oscurecidas están sin implementar; su lectura proporciona un cero.
Nota 1: El byte más significativo del Contador de Programa está inaccesible. PCLATH es el registro de los 5
bits de más peso del PC (PC12 - PC8).
Nota 2: “Otros resets” incluye el externo (por la patilla -MCLR) y el debido al Watchdog.
Nota 3: Los bits PSPIE y PSPIF están reservados en los dispositivos de 28 patillas; se deben poner a cero.
Nota 4: Estos registros pueden direccionarse desde cualquier banco.
Nota 5: PORTD, PORTE, TRISD y TRISE no están implementados en los dispositivos de 28 patillas. Al
leerlos, siempre se obtiene cero.
Nota 6: PIR2<6> y PIE2<6> están reservados en dispositivos de 28 patillas; se deben mantener siempre a cero.

TABLA 2-1: RESUMEN DE REGISTRO DE FUNCIÓN ESPECIAL (CONTINUACIÓN)


Valor tras Valor tras
Direcc. Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 POR, BOR otros resets
Microcontrolador PIC16F876 Página 8

Banco 2
100h(4) INDF No es un registro físico. Se usa para direccionamiento de la memoria de datos. 0000 0000 0000 0000
101h TMR0 Registro del módulo temporizador 0 (Timer 0). xxxx xxxx uuuu uuuu
102h(4) PCL Byte menos significativo del Contador de Programa (PC). 0000 0000 0000 0000
103h(4) STATUS IRP RP1 RP0 -TO -PD Z DC C 0001 1xxx 000q quuu
104h(4) FSR Puntero de direccionamiento indirecto de la memoria de datos. xxxx xxxx uuuu uuuu
105h -- Sin implementar. ---- ----
106h PORTB Memoria de datos PORTB en escritura; patillas del PORTB cuando se lee. xxxx xxxx uuuu uuuu
107h -- Sin implementar. ---- ----
108h -- Sin implementar. ---- ----
109h -- Sin implementar. ---- ----
10Ah(1,4) PCLATH -- -- -- Buffer de escritura para los 5 bits de más peso del PC. - - -0 0000 - - -0 0000
10Bh(4) INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
10Ch EEDATA Registro de datos de la EEPROM. xxxx xxxx uuuu uuuu
10Dh EEADR Registro de dirección de la EEPROM. xxxx xxxx uuuu uuuu
10Eh EEDATH -- -- Byte alto del registro de datos de la EEPROM xxxx xxxx uuuu uuuu
10Fh EEADRH -- -- -- Byte alto del registro de dirección de la EEPROM xxxx xxxx uuuu uuuu
Banco 3
180h(4) INDF No es un registro físico. Se usa para direccionamiento de la memoria de datos. 0000 0000 0000 0000
181h O P T I O N _GR E -RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
182h(4) PCL Byte menos significativo del Contador de Programa (PC). 0000 0000 0000 0000
183h(4) STATUS IRP RP1 RP0 -TO -PD Z DC C 0001 1xxx 000q quuu
184h(4) FSR Puntero de direccionamiento indirecto de la memoria de datos. xxxx xxxx uuuu uuuu
185h -- Sin implementar. ---- ----
186h TRISB Registro de programación de dirección del puerto B. 1111 1111 1111 1111
187h -- Sin implementar. ---- ----
188h -- Sin implementar. ---- ----
189h -- Sin implementar. ---- ----
18Ah(1,4) PCLATH -- -- -- Buffer de escritura para los 5 bits de más peso del PC. - - -0 0000 - - -0 0000
18Bh(4) INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
18Ch EECON1 EEPGD -- -- -- WRERR WREN WR RD x- - - x000 x- - - u000
18Dh EECON2 Registro 2 de control de EEPROM. No es físicamente un registro. ---- ---- ---- ----
18Eh -- Sin implementar. 0000 0000 0000 0000
18Fh -- Sin implementar. 0000 0000 0000 0000
Explicación: x = Desconocido; u = Sin cambio; q = Depende de condición; r = Reservado
“---“ = Sin implementar (al leer da cero); “–“ delante de una referencia = Función negada
Las posiciones oscurecidas están sin implementar; su lectura proporciona un cero.
Nota 1: El byte más significativo del Contador de Programa está inaccesible. PCLATH es el registro de los 5
bits de más peso del PC (PC12 - PC8).
Nota 2: “Otros resets” incluye el externo (por la patilla -MCLR) y el debido al Watchdog.
Nota 3: Los bits PSPIE y PSPIF están reservados en los dispositivos de 28 patillas; se deben poner a cero.
Nota 4: Estos registros pueden direccionarse desde cualquier banco.
Nota 5: PORTD, PORTE, TRISD y TRISE no están implementados en los dispositivos de 28 patillas. Al
leerlos, siempre se obtiene cero.
Nota 6: PIR2<6> y PIE2<6> están reservados en dispositivos de 28 patillas; se deben mantener siempre a cero.

2.2.2.1 REGISTRO DE ESTADO (STATUS REGISTER)


Microcontrolador PIC16F876 Página 9

El registro de estado contiene el estado después de operaciones aritméticas y lógicas en el


bloque de la ALU, el estado del RESET y los bits de selección de banco para la memoria de
datos.

El SR (Status Register) puede alterarse debido a algunas instrucciones o a algunos registros. Si


el SR es el destino de alguna instrucción que afecta a los indicadores Z, DC o C, la escritura
sobre estos tres bits se inhibe. Estos bits se activan o se borran de acuerdo a circuitos lógicos.
Además, los bits -TO y -PD no pueden modificarse, por tanto, el resultado de una instrucción
que tenga como destino el SR puede ser distinto de lo esperado. Por ejemplo, CLRF STATUS
borrará los tres bits de más peso y pondrá a 1 el bit Z. Esto dejará el SR como 000u u1uu, donde
u significa sin cambio.

Se recomienda, por lo tanto, que solamente se utilicen, para variar el SR, las instrucciones BCF,
BSF, SWAPF y MOVWF, porque éstas no afectan a los bits Z, C o DC del registro SR. En el
“Resumen de Instrucciones” se marcan las instrucciones que no afectan a los bits del registro
SR.

REGISTRO 2-1: REGISTRO DE ESTADO (SR). (DIRECCIONES 03h, 83h, 103h y 183h.)

R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x


IRP RP1 RP0 -TO -PD Z DC C R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da 0
en lectura
-n = Valor del reset POR
bit 7: IRP: Bit de selección de banco de registros (usado para direccionamiento indirecto).
1 = Bancos 2 y 3 (100h - 1FFh)
0 = Bancos 0 y 1 (00h - FFh)

bit 6-5: RP1:RP0: Bits de selección de banco de registros (usado para direccionamiento directo).
11 = Banco 3 (180h - 1FFh)
10 = Banco 2 (100h - 17Fh)
01 = Banco 1 (80h - FFh)
00 = Banco 0 (00h - 7Fh)
Cada banco dispone de 128 bytes.

bit 4: -TO: Bit de final de temporización.


1 = Después de conexión, instrucción CLRWDT, o instrucción
SLEEP.
0 = Cuando sucede el final de temporización del WDT.

bit 3: -PD: Bit de bajada de tensión.


1 = Después de la conexión o por la instrucción CLRWDT.
0 = Al ejecutar la instrucción SLEEP.

bit 2: Z: Bit de cero


1 = Después de una operación lógica o aritmética con resultado cero.
0 = Después de una operación lógica o aritmética con resultado distinto de cero.

bit 1: DC: Bit de acarreo o debe en las instrucciones ADDWF, ADDLM, SUBLW y SUBWF.
(El indicador de “debe” es de polaridad contraria.)
1 = Cuando hay acarreo en el cuarto bit.
0 = Cuando no hay acarreo en el cuarto bit.

bit 0: C: Bit de acarreo o debe en las instrucciones ADDWF, ADDLW, SUBLW y SUBWF.
1 = Cuando hay acarreo en el octavo bit (más significativo).
0 = Cuando no hay acarreo en el octavo bit.

Nota: Para el “debe”, la polaridad es contraria. La resta se realiza sumando el complemento a dos del segundo
operando. Para instrucciones de rotación (RRF y RLF), este bit se carga con el valor del bit de mayor o menor peso
del registro que se rota.
2.2.2.2 REGISTRO DE OPCIONES (DIRECCIONES 81h, 181h)
Microcontrolador PIC16F876 Página 10

El Registro de Opciones es un registro de lectura y escritura que contiene varios bits de control
para configurar el TMR0 (Temporizador0), valores del Predivisor, asignación de éste,
Interrupción Externa y Resistencias de Polarización del circuito de salida del Puerto B.

REGISTRO 2-2: REGISTRO DE OPCIONES (DIRECCIONES 81h Y 181h)

R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1


-RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da 0
en lectura
-n = Valor del reset POR
bit 7: -RBPU: Bit de habilitación de resistencias de polarización en salida del PUERTO B.
1 = Resistencias inhibidas.
0 = Resistencias habilitadas.

bit 6: INTEDG: Bits de selección de flanco de interrupción.


1 = Interrupción activa en el flanco positivo en la patilla RB0/INT.
0 = Interrupción activa en el flanco de bajada en la patilla RB0/INT.

T0CS: Bit de selección de fuente de reloj para TMR0


bit 5:
(Temporizador 0).
1 = Cambio en la patilla RA4/T0CKI.
0 = Reloj procedente del final del ciclo de instrucción (CLKOUT).

bit 4: T0SE: Bit de selección de flanco de reloj en el TMR0.


1 = Variación de nivel alto a bajo en la patilla RA4/T0CKI.
0 = Variación de nivel bajo a alto en la patilla RA4/T0CKI.

bit 3: PSA: Bit de asignación del PRESCALER (Divisor de Frecuencia).


1 = El Prescaler se asigna al WDT.
0 = El Prescaler se asigna al módulo TMR0.

bit 2-0: PS2:PS0: Bit de valor de división del prescaler.


1 = Después de una operación lógica o aritmética con resultado cero.
0 = Después de una operación lógica o aritmética con resultado distinto de cero.
Valor Divisor TMR0 Divisor WDT
000 1: 2 1:1
001 1: 4 1: 2
010 1: 8 1: 4
011 1 : 16 1: 8
100 1 : 32 1 : 16
101 1 : 64 1 : 32
110 1 : 128 1 : 64
111 1 : 256 1 : 128

Nota: Cuando se use la baja tensión de programación (LVP) y la polarización de la salida del PORTB esté
habilitada, el bit 3 del registro TRISB debe ponerse a 0 para inhibir la polarización en RB3 y asegurar la correcta
operación del dispositivo.

2.2.2.3 REGISTRO INTCON (CONTROL DE INTERRUPCIONES)


Microcontrolador PIC16F876 Página 11

El registro INTCON es un registro de lectura y escritura que contiene varios bits de señalización
y habilitación para el desbordamiento (overflow) del TMR0, cambio sobre el puerto RB e
interrupción externa en la patilla RB0/INT.

Nota: El bit indicador de interrupción se activa cuando ocurre una interrupción,


independientemente del estado de su correspondiente bit de habilitación o del bit de habilitación
general GIE (INTCON<7>). El programa debe asegurar que el bit indicador de interrupción
apropiado está borrado antes de habilitar una interrupción.

REGISTRO 2-3: REGISTRO INTCON (DIRECCIONES 0Bh, 8Bh, 10Bh Y 18Bh)

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x


GIE PEIE T0IE INTE RBIE T0IF INTF RBIF R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da 0
en lectura
-n = Valor del reset POR
bit 7: GIE: Bit de habilitación general de interrupciones.
1 = Habilita todas las interrupciones no enmascaradas.
0 = Inhibe todas las interrupciones.

bit 6: PEIE: Bit de habilitación de interrupción de periféricos.


1 = Habilita todas las interrupciones no enmascaradas de periféricos.
0 = Inhibe todas las interrupciones de periféricos.

bit 5: T0IE: Bit de habilitación de interrupción por desbordamiento del TMR0.


1 = Habilita la interrupción del TMR0.
0 = Inhibe la interrupción del TMR0.

bit 4: INTE: Bit de habilitación de interrupción externa en la patilla RB0/INT.


1 = Habilita la interrupción externa en la patilla RB0/INT.
0 = Inhibe la interrupción externa en la patilla RB0/INT.

bit 3: RBIE: Bit de habilitación de interrupción por variación en puerto RB.


1 = Habilita la interrupción cuando sucede una variación sobre el puerto RB.
0 = Inhibe la interrupción cuando sucede una variación sobre el puerto RB.

bit 2: T0IF: Bit indicador de interrupción por desbordamiento del TMR0 .


1 = El TMR0 ha terminado su tiempo (desbordamiento). Este indicador se debe borrar en el programa.
0 = Aún no ha sucedido el desbordamiento del TMR0.

bit 1: INTF: Bit indicador de interrupción externa en la patilla RB0/INT.


1 = Ha sucedido una interrupción externa en la patilla RB0/INT. Debe borrarse en el programa.
0 = No ha llegado una interrupción externa por la patilla RB0/INT.

bit 0: RBIF: Bit indicador de interrupción por variación sobre el puerto RB.
1 = Ha sucedido una interrupción por variación de nivel en el puerto RB. Se debe borrar por software.
0 = No ha habido variación sobre el puerto RB.

2.2.2.4 REGISTRO PIE1


Microcontrolador PIC16F876 Página 12

El registro PIE1 posee los bits de habilitación individual para las interrupciones de periféricos.
El bit PEIE del registro INTCON debe ser 1 para permitir la habilitación de cualquier
interrupción de periférico.

REGISTRO 2-4: REGISTRO PIE1 (DIRECCIÓN 8Ch).

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0


PSPIE (1)
ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da 0
en lectura
-n = Valor del reset POR
bit 7: PSPIE: Bit habilitador de interrupción por Lectura-Escritura en el Puerto Servidor Paralelo (PSP).
1 = Habilita la interrupción del PSP.
0 = Inhibe la interrupción del PSP.

bit 6: ADIE: Bit de habilitación de interrupción del Convertidor Analógico Digital (ADC).
1 = Habilita la interrupción del ADC.
0 = Inhibe la interrupción del ADC.

bit 5: RCIE: Bit de habilitación de interrupción de recepción del USART.


1 = Habilita la interrupción de recepción del USART.
0 = Inhibe la interrupción de recepción del USART.

bit 4: TXIE: Bit de habilitación de interrupción para la transmisión en el USART.


1 = Habilita la interrupción para la transmisión en el USART.
0 = Inhibe la interrupción para la transmisión en el USART.

bit 3: SSPIE: Bit de habilitación de interrupción para el Puerto Síncrono Serie (SSP).
1 = Habilita la interrupción del SSP.
0 = Inhibe la interrupción del SSP.

bit 2: CCP1IE: Bit de habilitación de interrupción del módulo de Captura /Comparación/PWM.


1 = Habilita la interrupción del módulo CCP1.
0 = Inhibe la interrupción del módulo CCP1.

bit 1: TMR2IE: Bit de habilitación de interrupción por coincidencia del TMR2 con el PR2.
1 = Habilita la interrupción cuando coincide los contenidos de TMR2 y PR2.
0 = Inhibe la interrupción por coincidencia de los contenidos de TMR2 y PR2

bit 0: TMR1IE: Bit de habilitación de interrupción por desbordamiento del TMR1.


1 = Habilita la interrupción cuando desborda el TMR1 (termina su tiempo programado).
0 = Inhibe la interrupción del TMR1.

Nota 1: PSPIE queda reservado en los dispositivos de 28 patillas; se debe mantener siempre a cero.

2.2.2.5 REGISTRO PIR1


Microcontrolador PIC16F876 Página 13

El registro PIR1 contiene los bits de señalización individual de las interrupciones de periféricos.
Nota: El bit indicador de interrupción se activa al ocurrir una interrupción, independientemente
del estado de su correspondiente bit de habilitación o del bit de habilitación general GIE
(INTCON<7>). El programa debe asegurar que el bit indicador de interrupción apropiado está
borrado antes de habilitar una interrupción.

REGISTRO 2-5: REGISTRO PIR1 (DIRECCIÓN 0Ch)


R/W-0 R/W-0 R-0 R-0 R/W-0 R/W-0 R/W-0 R/W-0
PSPIF (1)
ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF R = De lectura
W = De escritura
bit7 bit0 -n = Valor del reset POR
bit 7: PSPIF: Bit indicador de interrupción por Lectura-Escritura del Puerto Servidor Paralelo (PSP).
1 = Una operación de escritura o lectura ha tenido lugar. Debe borrarse por software.
0 = No ha ocurrido una operación de lectura o escritura.

bit 6: ADIF: Bit de señalización de interrupción del Convertidor Analógico Digital (ADC).
1 = Se ha completado la conversión del ADC.
0 = El ADC no ha terminado su conversión.

bit 5: RCIF: Bit de señalización de interrupción por recepción del USART.


1 = El buffer de recepción del USART está lleno.
0 = El buffer de recepción del USART está vacío.

bit 4: TXIF: Bit de señalización de interrupción para la transmisión en el USART.


1 = El buffer de transmisión del USART está vacío (USART preparado para una nueva trasmisión).
0 = El buffer de transmisión del USART está lleno (aún no se ha transmitido el byte).

bit 3: SSPIF: Bit de señalización de interrupción para el Puerto Síncrono Serie (SSP).
1 = Ha ocurrido la condición de interrupción del SSP, y debe ser borrada en el software antes de
retornar de la rutina de servicio de la interrupción. Las condiciones señaladas por este bit son:
SPI
Se ha producido una transmisión o recepción.
I2C Slave (servidor)
Se ha producido una transmisión o recepción.
I2C Master (maestro)
Se ha producido una transmisión o recepción.
El módulo SSP completó la condición de START (arranque).
El módulo SSP completó la condición de STOP (detención).
El módulo SSP completó la condición de RESTART (reinicio).
El módulo SSP completó la condición de ACK (Acknowledge = Reconocimiento).
Una condición de START ha ocurrido cuando el módulo está aislado (sistema Multimaestro).
Una condición de STOP ha ocurrido cuando el módulo está aislado (sistema Multimaestro).
0 = No ha sucedido la condición de interrupción del SSP.

bit 2: CCP1IF: Bit de señalización de interrupción del módulo de Captura /Comparación/PWM.


Modo Captura
1 = Ha ocurrido una captura en el registro TMR1. Debe borrarse por software.
0 = No ha sucedido una captura del registro TMR1.
Modo Comparación
1 = Ha ocurrido una coincidencia en la comparación del registro TMR1. Debe borrarse por software.
0 = No existe coincidencia de comparación en el registro TMR1.
Modo PWM
No se usa en este modo.

bit 1: TMR2IF: Bit de señalización de interrupción por coincidencia del TMR2 con el PR2.
1 = Ha ocurrido la coincidencia entre los contenidos de TMR2 y PR2. Debe borrarse por software.
0 = No hay coincidencia de los contenidos de TMR2 y PR2.

bit 0: TMR1IF: Bit de señalización de interrupción por desbordamiento del TMR1.


1 = Se ha producido el desbordamiento del TMR1 (termina su tiempo programado). Debe borrarse por
software.
0 = No ha finalizado su tiempo el TMR1.
Nota 1: PSPIF queda reservado en los dispositivos de 28 patillas; se debe mantener siempre a cero.
2.2.2.6 REGISTRO PIE2
Microcontrolador PIC16F876 Página 14

El registro PIE2 contiene los bits de habilitación de interrupción individual para los periféricos
CCP2, conflicto de bus de SSP y operación de escritura en la EEPROM.

REGISTRO 2-6: REGISTRO PIE2 (DIRECCIÓN 8Dh)

U-0 R/W-0 U-0 R/W-0 R/W-0 U-0 U-0 R/W-0


--- --- --- EEIE BCLIE --- --- CCP2IE R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da 0
en lectura
-n = Valor del reset POR

bit 7: Sin implementar: Da cero al leer.

bit 6: Reservado: Siempre se debe mantener este bit a cero.

bit 5: Sin implementar: Da cero al leer.

bit 4: EEIE: Bit de habilitación de interrupción por la operación de escritura en la EEPROM.


1 = Habilita la interrupción para la escritura en la EEPROM.
0 = Inhibe la interrupción para la escritura en la EEPROM.

bit 3: BCLIE: Bit de habilitación de interrupción por el conflicto de bus del Puerto Síncrono Serie (SSP).
1 = Habilita la interrupción de conflicto de bus del SSP.
0 = Inhibe la interrupción de conflicto de bus del SSP.

bit 2-1: Sin implementar: Da cero al leer.

bit 0: CCP2IE: Bit de habilitación del módulo CCP2.


1 = Habilita la interrupción de CCP2.
0 = Inhibe la interrupción de CCP2.

2.2.2.7 REGISTRO PIR2


Microcontrolador PIC16F876 Página 15

El registro PIR2 contiene los bits indicadores de las interrupciones de CCP2, conflicto de bus de
SSP y operación de escritura en EPROM.

Nota: El bit indicador de interrupción se activa cuando ocurre una interrupción,


independientemente del estado de su correspondiente bit de habilitación o del bit de habilitación
general GIE (INTCON<7>). El programa debe asegurar que el bit indicador de interrupción
apropiado está borrado antes de habilitar una interrupción.

REGISTRO 2-7: REGISTRO PIR2 (DIRECCIÓN 0Dh)

U-0 R/W-0 U-0 R/W-0 R/W-0 U-0 U-0 R/W-0


--- --- --- EEIF BCLIF --- --- CCP2IF R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da 0
en lectura
-n = Valor del reset POR

bit 7: Sin implementar: Da cero al leer.

bit 6: Reservado: Siempre se debe mantener este bit a cero.

bit 5: Sin implementar: Da cero al leer.

bit 4: EEIF: Bit de señalización de interrupción por la operación de escritura en la EEPROM.


1 = Se ha completado la operación de escritura en la EEPROM. Debe borrarse por software.
0 = No se ha completado la escritura en la EEPROM, o no se ha iniciado.

bit 3: BCLIF: Bit de señalización de interrupción por el conflicto de bus del Puerto Síncrono Serie (SSP).
1 = Un conflicto de bus ha ocurrido en el SSP cuando estaba configurado en modo Maestro I2C.
0 = No existe conflicto de bus del SSP.

bit 2-1: Sin implementar: Da cero al leer.

bit 0: CCP2IF: Bit de señalización de interrupción del módulo CCP2.


Modo Captura:
1 = Ha sucedido una captura en el registro TMR1. Debe borrarse por software.
0 = No hay captura en el registro TMR1.
Modo Comparación:
1 = Ha ocurrido la coincidencia en la comparación del registro TMR1. Debe borrarse por software.
0 = No hay coincidencia en la comparación del registro TMR1.
Modo PWM:
No se usa.

2.2.2.8 REGISTRO PCON


Microcontrolador PIC16F876 Página 16

El registro de control de alimentación PCON contiene los bits que permiten la diferenciación
entre el reset de conexión (POR), el reset Brown.Out (BOR), el reset Watch-Dog (WDT) y el
reset externo -MCLR.

Nota: BOR se ignora durante la conexión (POR). Lo debe activar el usuario y chequearlo en los
subsiguientes resets para ver si BOR está borrado, indicando, con ello, que ha ocurrido un reset
BOR. El bit de estado de BOR es indiferente y no predecible si el circuito de Brown-Out se
inhibe (borrando el bit BODEN en la palabra de configuración).

REGISTRO 2-8: REGISTRO PCON (DIRECCIÓN 8Eh)

U-0 U-0 U-0 U-0 U-0 U-0 R/W-0 R/W-1


--- --- --- --- --- --- -POR -BOR R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da 0
en lectura
-n = Valor del reset POR

bit 7-2: Sin implementar: Da cero al leer.

bit 1: -POR: Bit indicador del estado del reset de conexión (POR).
1 = No ha sucedido el reset de conexión
0 = Ha ocurrido un reset de conexión. Debe ponerse a 1 por software después de la conexión.

bit 0: -BOR: Bit indicador del estado del reset BOR


1 = No ha sucedido un reset tipo BOR.
0 = Ha ocurrido un reset tipo BOR. Debe activarse por software después del reset BOR.

2.3 PCL Y PCLATH


Microcontrolador PIC16F876 Página 17

El registro Contador de Programa (PC) tiene un tamaño de 13 bits. El byte de menor peso reside
en el registro PCL, que es un registro de lectura y escritura. Los 5 bits de mayor peso
(PC<12:8>) no se pueden leer, pero son susceptibles de escritura indirectamente a través del
registro PCLATH. Después de cualquier reset, los bits de mayor peso quedan borrados. En la
figura 2-5 se muestra las dos situaciones para cargar el PC. El ejemplo superior de la figura
muestra cómo se carga el PC con la escritura del PCL (PCLATH<4:0> PCH). El ejemplo
inferior de la figura muestra la carga del PC durante una instrucción CALL o GOTO
(PCLATH<4:3>  PCH).

FIGURA 2-5: CARGA DEL PC EN SITUACIONES DIFERENTES

2.3.1 CÁLCULO DEL


SALTO (GOTO)

El cálculo del salto se realiza sumando


un desplazamiento al contenido del PC
(ADDWF PCL). Cuando se realiza la
lectura de una tabla usando el método
del salto (GOTO), hay que tener
cuidado para no superar el límite de
memoria (cada bloque de 256 bytes)

2.3.2 PILA

El PIC16F876 posee una pila por hardware de 8 niveles, con un ancho de palabra de 13 bits. El
espacio ocupado por la pila no forma parte de la memoria de usuario, y el puntero de pila no se
puede leer ni escribir. El PC se salva en pila cuando se ejecuta una instrucción CALL o cuando
se va a producir un salto debido a una interrupción. Se extrae de la pila cuando se ejecuta una
instrucción RETURN, RETLW o RETFIE. El PCLATH no varía en operaciones de salvar o
recuperar de pila (operaciones PUSH o POP).

La pila opera como un buffer circular: después de ocho memorizaciones (entradas) en pila, la
novena, sobrescribirá su valor en la primera entrada, la décima, sobrescribirá en la que fue la
segunda entrada, y así sucesivamente.

Nota 1: No existe ningún bit de estado que indique condiciones de desbordamiento de pila.

Nota 2: No existen mnemónicos de instrucciones llamados PUSH o POP. Estas acciones


suceden al ejecutar instrucciones como CALL, RETURN, RETLW y RETFIE, o al vectorizarse
una interrupción.

2.4 PAGINANDO LA MEMORIA DE PROGRAMA

El PIC16F876 es capaz de direccionar un bloque continuo de 8k palabras de memoria de


programa. Las instrucciones CALL o GOTO proporcionan solamente 11 bits de dirección para
permitir el salto entre una extensión de memoria de 2k palabras. Cuando se realiza una
instrucción CALL o GOTO, los 2 bits de mayor peso de la dirección son suministrados por el
registro PCLATH, bits 4 y 3. Cuando ejecute una instrucción CALL o GOTO, el usuario debe
asegurarse que los bits de selección de página están programados de manera adecuada a la
Microcontrolador PIC16F876 Página 18

página de memoria deseada. Si se ejecuta un retorno de una instrucción CALL (o interrupción),


el total de los 13 bits del PC son devueltos desde la pila, por consiguiente, la manipulación de
los bits 4 y 3 del PCLATH no es necesaria para instrucciones de retorno.

El ejemplo 2-1 muestra la llamada de una subrutina en la página 1 de la memoria de programa.


Este ejemplo asume que el PCLATH es salvado y restaurado por la rutina de servicio de la
interrupción (si se usa interrupción).

Ejemplo 2-1: Llamada de una subrutina en página 1 desde la página 0.

ORG 0x500
BCF PCLATH,4
BSF PCLATH,3 ;Selecciona página 1 (800h - FFFh)
CALL SUB1_P1 :Llama a subrutina en página 1 (800h - FFFh)
:
:
ORG 0x900 ;Página 1 (800h - FFFh)
SUB1_P1
: ;Llamada a subrutina
: ;Página 1 (800h - FFFh)
:
RETURN ;Retorna a página 0 (000h - 7FF), de la llamada
de subrutina.
Microcontrolador PIC16F876 Página 19

2.5 Direccionamiento Indirecto: registros INDF y FSR.

El registro INDF no es un registro físico y se usa para conseguir el direccionamiento indirecto.


Cualquier instrucción que utilice el registro INDF, lo que hace es acceder a la dirección
apuntada por FSR. Si se efectúa una lectura sobre INDF, se leerá 0; si se escribe sobre INDF no
se ejecuta ninguna acción, aunque los bits de estado pueden resultar afectados. Se puede obtener
una dirección efectiva de 9 bits encadenando los 8 bits del registro FSR y el bit IRP del registro
de estado (STATUS<7>), como se muestra en la figura 2-6.

Un programa sencillo, para borrar las posiciones de memoria que van desde 20h a 2Fh, usando
direccionamiento indirecto, se expone en el ejemplo 2-2.

EJEMPLO 2-2 DIRECCIONAMIENTO INDIRECTO

movlw 0x20 ;Inicializa el puntero de RAM.


movwf FSR ; "
NEXT clrf INDF ;Borra posición de RAM.
incf FSR,1 ;Incrementa el puntero.
btfss FSR,4 ;Si se ha completado el borrado se salta la próxima
instrucción.
goto NEXT ;Si no se han borrado todas las posiciones se repite el
bucle.
:
:

FIGURA 2-6: DIRECCIONAMIENTO DIRECTO E INDIRECTO

3.0 PUERTOS DE ENTRADA SALIDA


Microcontrolador PIC16F876 Página 20

Algunas de las patillas destinadas a puertos de


entrada salida se multiplexan para obtener otras
funciones de periféricos del dispositivo. Como
regla general podemos decir que cuando un
periférico se habilita, la patilla respectiva no se
utilizará como puerto de entrada salida.

3.1 Registros PORTA y TRISA

PORTA es un registro de puerto bidireccional de


6 bits, cuyo registro de dirección de datos es
TRISA. Programando TRISA a 1 conseguiremos
que el puerto A quede como entrada, quedando
el circuito (driver) de salida en estado de alta
impedancia o desconexión. Si ponemos a 0 el
registro TRISA conseguiremos programar el
puerto A como salida, y, con ello, que el
contenido del latch correspondiente aparezca en
la patilla de salida.

Leyendo el registro PORTA leeremos el estado


en las patillas del puerto A, mientras que si
escribimos en PORTA, lo estaremos haciendo
en el latch de salida.

La patilla RA4 se multiplexa con la entrada de


reloj del Timer0, y se llama RA4/T0CKI. Esta
patilla, como entrada es de tipo Schmitt Trigger,
como salida es de tipo drenador abierto. Las
demás patillas del PORTA poseen niveles TTL
de entrada y salidas CMOS amplificadas.

Las demás patillas del PORTA se multiplexan


con entradas analógicas y con la tensión de
referencia analógica VREF. La operación de cada
patilla se selecciona activando o borrando los
bits de control en el registro ADCON1 (registro
1 de control del CAD).

Después de Reset, estas patillas se configuran


como entradas analógicas, y se leen como 0.

El registro TRISA controla la dirección de las


patillas del PORTA, incluso cuando se usan
como entradas analógicas. Por este motivo, el
usuario debe asegurarse que los bits del registro
TRISA están a 1 cuando se usen las patillas del
puerto como entradas analógicas.
Microcontrolador PIC16F876 Página 21

EJEMPLO 3.1: INICIALIZACIÓN DEL PORTA

BCF STATUS, RP0 ; Selecciona banco 0.


BCF STATUS, RP1 ; ”
CLRF PORTA ; Pone 0 en los latches de salida.
BSF STATUS, RP0 ; Selecciona banco 1.
MOVLW 0x06 ; Configura todas las patillas como entradas
MOVWF ADCON1 ; digitales.
MOVLW 0xCF ; Dato para configurar la dirección.
MOVWF TRISA ; Programa RA0-RA3 como entradas, y
; RA4-RA5 como salidas.
; TRISA (6-7) siempre se leerán como 0.

TABLA 3-1: FUNCIONES DEL PUERTO A (PortA)


Nombre Bit Buffer Función

RA0/AN0 Bit0 TTL Entrada-salida o entrada analógica 0.


RA1/AN1 Bit1 TTL Entrada-salida o entrada analógica 1.
RA2/AN2 Bit2 TTL Entrada-salida o entrada analógica 2.
RA3/AN3/VREF Bit3 TTL Entrada-salida, entrada analógica 3, o VREF.
Entrada-salida, o entrada externa de reloj de TIMER0.
RA4/T0CKI Bit4 ST
La salida es de tipo drenador abierto.
Entrada-salida, selección de “servidor” para el puerto
RA5/-SS/AN4 Bit5 TTL
serie síncrono, o entrada analógica 4.
TTL = Entrada tipo TTL; ST = Entrada tipo Schmitt Trigger.

TABLA 3-2: RESUMEN DE REGISTROS ASOCIADOS AL PORTA


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
POR, BOR otros resets

05h PORTA --- --- RA5 RA4 RA3 RA2 RA1 RA0 - - 0x 0000 - - 0u 0000

85h TRISA --- --- Registro de dirección de datos del PORTA - - 11 1111 - - 11 1111

9Fh ADCON1 ADFM --- --- --- PCFG3 PCFG2 PCFG1 PCFG0 - - 0 - 0000 - - 0 - 0000
x = Desconocido; u = Sin cambio; --- = sin implementar (se lee 0). Las celdas sombreadas no se utilizan en
PORTA.

Cuando se use el módulo SSP en modo “servidor” SPI, y –SS habilitado, el convertidor
A/D debe fijarse a uno de los siguientes valores de PCFG3 – PCFG0: 0100, 0101, 011x,
1101, 1110, 1111.
Microcontrolador PIC16F876 Página 22

3.2 REGISTROS PORTB Y TRISB

PORTB es un registro bidireccional de 8 bits que tiene su registro de dirección en TRISB.


Programando éste a 1, las líneas del PORTB quedan como entradas; borrando el registro
TRISB, las 8 líneas del puerto se programan como salidas (en este caso, el contenido de los
latches de salida aparecerá en las patillas correspondientes).

Tres patillas del PORTB se multiplexan con las funciones de Baja Tensión de Programación:
RB3/PGM, RB6/PGC y RB7/PGD. Estas funciones secundarias se describen en la sección
Características Especiales.

Cada patilla del PORTB posee polarización interna a VDD, que puede activarse mediante un bit
de control. En el registro OPTION_REG, borrando el bit 7, llamado RBPU , se activará la
polarización. Este bit se programa a 1, y por lo tanto se suprime la polarización, cuando el
puerto se configura como salida. Tras un reset de conexión (Power-On-Reset), la polarización
queda inhibida.

Cuatro patillas del PORTB, RB7 a RB4, poseen una característica especial por la que pueden
provocar interrupción si cambian de estado (Interrupción por Cambio), estando configuradas
como entradas. El estado de estas patillas se compara con su antiguo valor, memorizado en un
latch, de esta forma puede saber el circuito si ha habido un cambio de valor en la entrada. El
conjunto de salidas de RB7 a RB4 se conectan a una puerta OR, para, de esta forma, generar el
bit de petición de interrupción RBIF, cualquiera que sea la que cambie de valor.

Esta interrupción puede sacar al dispositivo del estado SLEEP (reposo). El programador, en la
rutina de servicio de la interrupción, puede borrar la interrupción de la siguiente manera:

a) Leyendo o escribiendo sobre PORTB. Esto terminará con la condición.


b) Borrando el bit indicador RBIF.
Microcontrolador PIC16F876 Página 23

Esta característica se recomienda en operaciones con teclados, donde el PORTB trabaja con
cambios de valor. No se recomienda la técnica de “Consultas Sucesivas” (Polling) del PORTB
cuando se aproveche la característica de Interrupción por Cambio.

RB0/INT es una patilla de interrupción externa, y se configura utilizando el bit INTEDG del
registro OPTION_REG (bit 6). Esta patilla se analizará con profundidad en la sección 12.10.1.

Cuando se use Programación Serie en Baja Tensión (LVP) y las polarizaciones del puerto
estén habilitadas, el bit 3 del registro TRISB debe borrarse para inhibir la polarización
sobre RB3 y asegurar la correcta operación del dispositivo.

TABLA 3-3: FUNCIONES DEL PORTB


Nombre Bit Buffer Función

Patilla de entrada-salida o entrada de interrupción externa.


RB0/INT Bit0 TTL/ST(1) Polarización programable.

RB1 Bit1 TTL Patilla de entrada-salida. Polarización programable.

RB2 Bit2 TTL Patilla de entrada-salida. Polarización programable.

Patilla de entrada-salida o modo de programación LVP. Polarización


RB3/PGM Bit3 TTL programable.

Patilla de entrada-salida (con Interrupción por Cambio). Polarización


RB4 Bit4 TTL programable.

Patilla de entrada-salida (con Interrupción por Cambio). Polarización


RB5 Bit5 TTL programable.

Patilla de entrada-salida (con Interrupción por Cambio) o depuración


RB6/PGC Bit6 TTL/ST(2) in-situ. Polarización programable. Reloj de programación en serie.

Patilla de entrada-salida (con Interrupción por Cambio) o depuración


RB7/ Bit7 TTL/ST(2) in-situ. Polarización programable. Dato de programación en serie.

TTL = Entrada con niveles TTL; ST = Entrada tipo Schmitt Trigger.


Nota 1: Este buffer es una entrada ST cuando se configura como interrupción externa.
Nota 2: Este buffer es una entrada ST cuando se usa en modo de programación serie.

TABLA 3-4: RESUMEN DE REGISTROS ASOCIADOS AL PORTB


Valor Valor tras
Direcció
Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 tras POR, otros
n
BOR Resets

06h, 106h PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu

86h, 186h TRISB Registro de dirección de datos del puerto B 1111 1111 1111 1111

81h, 181h OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111

x = Desconocido; u = Sin cambio. Las celdas oscurecidas no se emplean en el puerto B.


Microcontrolador PIC16F876 Página 24

3.3 REGISTROS PORTC Y TRISC

El puerto C es un puerto bidireccional de 8 bits cuyo registro de sentido de circulación de datos


es TRISC. Programando a 1 las líneas de TRISC, el sentido de esas líneas del puerto es de
entrada. En este momento, los amplificadores de salida están desconectados (alta impedancia).
Por el contrario, programando a 0 TRISC, las líneas del puerto que reciben esta programación
quedan conectadas como salidas y, por lo tanto, el contenido de los latches de salida aparecerá
en las patillas del dispositivo.

PORTC se multiplexa con varias funciones de periféricos (como se aprecia en la tabla 3-5), y
posee buffers de entrada tipo Schmitt Trigger.

Cuando se habilita el módulo I2C, las patillas 3 y 4 del PORTC pueden configurarse con niveles
normales I2C, o con niveles SMBUS, usando el bit CKE (SSPSTAT <6>).

Cuando se habiliten las funciones de periféricos hay que tener cuidado en definir la dirección de
cada bit del PORTC. Algunos periféricos anulan el bit de dirección para usar la patilla como
salida, mientras que otros hacen lo mismo para usarla como entrada. Ya que el bit anulado
(TRISC) está efectivo mientras que está habilitado el periférico, hay que evitar el uso de
instrucciones, tanto de lectura como de escritura, sobre el registro TRISC.
Microcontrolador PIC16F876 Página 25

TABLA 3-5: FUNCIONES DEL PORTC


Nombre Bit Buffer Función

Entrada-salida. Salida de oscilación de Timer1. Entrada de reloj del


RC0/T1OSO/T1CKI Bit0 ST
Timer1.
Entrada-salida. Entrada de oscilación externa para Timer1. Entrada
RC1/T1OSI/CCP2 Bit1 ST del módulo Capture2. Salida del módulo Compare2. Salida del
módulo PWM2.
Entrada-salida. Entrada de Capture1. Salida de Compare1. Salida de
RC2/CCP1 Bit2 ST
PWM1.

RC3/SCK/SCL Bit3 ST Entrada-salida. Reloj serie síncrono para los modos SPI y I2C.

Entrada-salida. Dato de entrada en modo SPI. Dato entrada/salida


RC4/SDI/SDA Bit4 ST
para el modo I2C.

RC5/SDO Bit5 ST Entrada-salida. Dato de salida del Puerto Serie Síncrono (SSP).

Entrada-salida. Reloj del USART (Transmisor Receptor Síncrono


RC6/TX/CK Bit6 ST
Asíncrono).

Entrada-salida. Dato del USART (Transmisor Receptor Síncrono


RC7/RX/DT Bit7 ST
Asíncrono).

ST = Entrada tipo Schmitt Trigger.

TABLA 3-6: RESUMEN DE REGISTROS ASOCIADOS AL PORTC


Valor tras Valor tras
Dirección Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
POR, BOR otros Resets

07h PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 xxxx xxxx uuuu uuuu

87h TRISC Registro de dirección de datos del puerto C 1111 1111 1111 1111

x = Desconocido; u = Sin cambio.

4.0 MEMORIA FLASH DE PROGRAMA Y EEPROM DE DATOS

Tanto la memoria de programa como la de datos son de lectura y escritura en operaciones


normales, en todo el rango de alimentación. No puede realizarse un borrado de una gran zona de
memoria por el programa de usuario (que incluye la supresión del código de protección). La
memoria de datos se direcciona por medio del Registro de Funciones Especiales (SFR).

Hay seis registros para leer o escribir en las memorias de programas y datos, que son:

• EECON1
• EECON2
• EEDATA
• EEDATH
• EEADR
• EEADRH
Microcontrolador PIC16F876 Página 26

La memoria de datos permite la lectura y escritura de bytes. Cuando se usa el bloque memoria
de datos, el registro EEDATA mantiene el byte para ser escrito, o que ha sido leído, y el registro
EEADR mantiene la dirección a la que estamos accediendo. Los registros EEDATH y
EEADRH no se utilizan para acceder a la memoria EEPROM de datos; estos dispositivos
poseen 256 bytes de memoria de datos, y con 8 bits para direccionamiento hay suficiente.

La memoria de datos se trata mediante ocho ciclos de borrado y escritura. El tiempo de escritura
se controla mediante un temporizador interno, que puede variar por temperatura, tensión de
alimentación y tolerancias entre dispositivos. Habrá que leer el apartado de especificaciones
técnicas para asegurar los proyectos.

La memoria de programa permite leer y grabar palabras de hasta 14 bits. Su acceso se controla
mediante cálculo y comprobación en una tabla almacenada. Al escribir un byte o una palabra
(14 bits), automáticamente se borra la palabra anterior y después se escribe la nueva. La
operación de escritura no termina hasta que se completa la palabra grabada. No se puede
acceder a la memoria de programa cuando está siendo escrita, por consiguiente, no puede
ejecutarse código alguno. Durante la operación de escritura, el oscilador sigue dando reloj a los
periféricos, continuando, por lo tanto, su operación. Posibles interrupciones se detectarán y se
pondrán en espera hasta que la escritura termine. Cuando esto suceda, la próxima instrucción en
curso se ejecutará, y se saltará a la dirección suministrada por el vector de interrupción.

Cuando se trabaja con la memoria de programa, los registros EEDATH:EEDATA forman una
palabra de dos bytes que permite los 14 bits de longitud de palabra de datos de la memoria. Los
registros EEADRH:EEADR forman un bloque de dos bytes cuya misión es contener los 13 bits
de dirección que permite la capacidad de la memoria de programa. Estos dispositivos poseen
una capacidad de memoria de programa de 8Kpalabras, con un rango de dirección desde 0000h
hasta 3FFFh. Los 2 bits de más peso del conjunto EEDATH:EEDATA, que sobran, se leerán
como 0.

El valor escrito en la memoria de programa no tiene que ser necesariamente una instrucción
válida. Números mayores de 14 bits pueden guardarse en la memoria, como parámetros de
calibración, números de serie, encapsulados de 7 bits ASCII, etc. Si se ejecuta un programa con
datos de códigos inválidos de instrucciones, el resultado es instrucciones NOP.

4.1 El registro EEADR

Este registro de dirección puede direccionar un máximo de 256 bytes de la memoria EEPROM
de datos, o un máximo de 8Kpalabras de la memoria FLASH de programa.

Cuando seleccionamos un valor de dirección en la memoria de programa, el bit más


significativo (MSB) de la dirección se graba en el registro EEADRH, y el bit menos
significativo (LSB) se escribe en el registro EEADR. Al seleccionar un valor de dirección en la
memoria de datos, solamente se escribe en EEADR el bit LSB.

4.2 Los registros EECON1 y EECON2

EECON1 es el registro de control para el acceso a la memoria.

EECON2 no es físicamente un registro. Si leemos EECON2 obtenemos todos 0. Este registro se


usa exclusivamente en la secuencia de escritura de la memoria.
Microcontrolador PIC16F876 Página 27

El bit de control EEPGD determina si el acceso debe producirse a la memoria de programa o a


la de datos. Cuando se borra, cualquier operación subsiguiente se realizará en la memoria de
datos; activándolo, las operaciones que sigan lo harán con la memoria de programa.

Los bits de control RD y WR inician las operaciones de lectura y escritura, respectivamente.


Estos bits se pueden activar por software pero no borrar; se borran por hardware cuando se
finaliza la operación de lectura o escritura. La inhabilitación del borrado por software del bit
WR evita una accidental prematura finalización de la operación de escritura.

El bit WREN, cuando se pone a 1, permite la operación de escritura. Al conectar el dispositivo,


este bit está a 0. El bit WRERR se activa cuando se interrumpe una operación de escritura
debido a un reset MCLR o WDT, durante una operación normal. En este caso, a continuación
del reset, el programador debe chequear el bit WRERR y volver a escribir la posición. El valor
del dato, del registro de dirección y del bit EEPGD permanecen sin cambio.

El bit indicador de interrupción EEIF, en el registro PIR2, se activa cuando se completa la


escritura. Debe borrarse por software.

REGISTRO 4-1: REGISTRO EECON1 (DIRECCIÓN 18Ch)

R/W-x U-0 U-0 U-0 R/W-x R/W-0 R/S-0 R/S-0


EEPGD --- --- --- WRERR WREN WR RD R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da 0
en lectura
-n = Valor del reset POR

bit 7: EEPGD: Bit de selección EEPROM Programa-Datos.


1 = Acceso a la memoria de Programa.
0 = Acceso a la memoria de Datos.
(Este bit no debe modificarse cuando está realizándose una operación de lectura o escritura).

bit 6-4: Sin implementar: Da cero al leer.

bit 3: WRERR: Bit indicador de error en EEPROM.


1 = Se ha finalizado prematuramente una operación de escritura.
(Si se produce un reset MCLR o WDT, durante una operación normal).
0 = Se ha completado con éxito la operación de escritura..

bit 2: WREN: Bit de habilitación de escritura en EEPROM.


1 = Permite ciclo de escritura.
0 = Inhibe el ciclo de escritura.

bit 1: WR: Bit de control de escritura.


1 = Inicia un ciclo de escritura. (Este bit se borra por hardware cuando se completa la escritura. Por
software, solamente puede activarse.
0 = Ciclo de escritura se ha completado correctamente.

bit 0: RD: Bit de control de lectura.


1 = Se inicia una lectura de EEPROM. Este bit se borra por hardware y se activa por software.
0 = No se inicia la lectura de la EEPROM.
Microcontrolador PIC16F876 Página 28

4.3 Lectura de la memoria EEPROM de datos

Para leer una posición de la memoria de datos, el usuario debe escribir en el registro EEADR la
dirección deseada, borrar el bit de control EEPGD (EECON1<7>) y, entonces, activar el bit de
control RD (EECON1<0>). El dato estará disponible, en el próximo ciclo de instrucción, en el
registro EEDATA, por consiguiente podrá leerse en la próxima instrucción. EEDATA
mantendrá este valor, hasta que se efectúe otra operación de lectura, o sea modificado
expresamente por el programador.

4.4 Escritura de la memoria EEPROM de datos

Para escribir en una posición de la memoria EEPROM de datos, primero hay que colocar la
dirección en el registro EEADR, y después el dato a escribir, en el registro EEDATA. Entonces
se iniciará la secuencia del ejemplo 4-2, que completará el ciclo de escritura.

Ejemplo 4-2: Escritura en la EEPROM de datos

1 BSF STATUS, RP1 ; Selección de banco 2.


2 BCF STATUS, RP0 ; “
3 MOVLW DATA_EE_ADDR ;
4 MOVWF EEADR ; Dirección de escritura.
5 MOVLW DATA_EE_DATA ;
6 MOVWF EEDATA ; Dato a escribir en memoria.
7 BSF STATUS, RP0 ; Selección de banco 3.
8 BCF EECON1, EEPGD ; Memoria de datos.
9 BSF EECON1, WREN ; Habilitación de escritura.
10 BCF INTCON, GIE ; Inhibe las interrupciones.
11 MOVLW 55h ; Escribe 55h en EECON2.
12 MOVWF EECON2 ; “
13 MOVLW AAh ;
14 MOVWF EECON2 ; Escribe AAh en EECON2.
15 BSF EECON1, WR ; Inicia la escritura.
16 BSF INTCON, GIE ; Habilita interrupciones.
17 SLEEP ; Espera hasta terminar la escritura.
18 BCF EECON1, WREN ; Inhibe la escritura.

La escritura no se iniciará si la secuencia no se sigue exactamente: escribir 55h en EECON2,


escribir AAh en EECON2, activar bit WR; esto para cada ciclo de escritura. Se recomienda muy
encarecidamente inhibir las interrupciones durante la operación.

Asimismo, el bit WREN debe activarse al inicio de la secuencia y borrarse al final. De esta
manera evitaremos escrituras accidentales durante la ejecución de programas.

Después de iniciada la secuencia de escritura, un borrado del bit WREN no afectará a la correcta
conclusión de la operación. El bit WR estará inhibido hasta después de que se active el bit
WREN. Ambos bits no deben activarse en la misma instrucción.

Al final del ciclo de escritura, el bit WR se borrará por hardware, y el bit indicador de
interrupción por finalización de ciclo de escritura (EEIF) se activará. Este bit debe borrarse por
software.
Microcontrolador PIC16F876 Página 29

4.5 Lectura de la memoria FLASH de Programa

Para leer una posición de la memoria de programa escribiremos los dos bytes de la dirección en
los registros EEADR y EEADRH, activaremos el bit de control EEPGD (EECON1<7>), para,
finalmente, activar el bit de control RD (EECON1<0>). Siempre que el bit de control de lectura
está activo, el microcontrolador utiliza los dos siguientes ciclos de instrucción para leer el dato.
Este dato queda disponible en los registros EEDATA y EEDATH después de la segunda
instrucción NOP. Durante estas instrucciones es cuando se efectúa la lectura de los dos bytes (se
recuerda que la longitud de la palabra, en la memoria de programa, es de 14 bits). Los registros
EEDATA y EEDATH mantendrán el valor leído hasta que se produzca otra lectura, o el
programador modifique su valor.

Ejemplo 4-3: Lectura de memoria FLASH

BSF STATUS, RP1 ; Selección de banco 2


BCF STATUS, RP0 ; “
MOVLW ADDRH ; Carga byte de dirección alta en el
MOVWF EEADRH ; registro EEADRH.
MOVLW ADDRL ; Carga byte de dirección baja en el
MOVWF EEADR ; registro EEADR.
BSF STATUS, RP0 ; Selecciona banco 3.
BSF EECON1, EEPGD ; Selecciona memoria de programa.
BSF EECON1, RD ; Lectura de la EEPROM.
NOP ; Durante esta instrucción y la siguiente,
NOP ; se produce la lectura de los dos bytes.
BCF STATUS, RP0 ; Selecciona banco 2.
MOVF EEDATA, W ; Carga lectura byte bajo, en W.
MOVF EEDATH, W ; Carga lectura byte alto, en W.

4.6 Escritura de la memoria FLASH de Programa

Solamente podrá escribirse una palabra en la memoria de programa si la palabra no es un código


de protección de área de memoria, y el bit de configuración WRT está activado. Para escribir en
una posición de esta memoria, primero deben estar grabados los dos bytes de la dirección en los
registros EEADR y EEADRH, posteriormente se grabarán los dos bytes del dato en los registros
EEDATA y EEDATH, después se activará el bit de control EEPGD (EECON1<7>), y,
finalmente, se activará el bit WR (EECON1<1>). La secuencia se detalla en el ejemplo 4-4.

El microcontrolador realizará diez operaciones internas detenido durante las próximas dos
instrucciones, para tener el tiempo necesario de la escritura. Este estado no es como el modo
SLEEP, en el que el oscilador de periféricos seguía funcionando. Por este motivo, las dos
siguientes instrucciones después del “BSF EECON1, WR” serán NOP. Después del ciclo de
escritura, el microcontrolador continuará con la tercera instrucción después de “BSF EECON1,
WR”.

Ejemplo 4-4: Escritura en la memoria FLASH de Programa

BSF STATUS, RP1 ; Selecciona banco 2.


BCF STATUS, RP0 ; “
MOVLW ADDRH ; Carga dirección alta.
MOVWF EEADRH ; “
MOVLW ADDRL ; Carga dirección baja.
MOVWF EEADR ; Carga dirección baja.
Microcontrolador PIC16F876 Página 30

MOVLW DATAH ; Carga byte alto a escribir.


MOVWF EEDATH ; “
MOVLW DATAL ; Carga byte bajo a escribir.
MOVWF EEDATA ; “
BSF STATUS, RP0 ; Selecciona banco 3.
BSF EECON1, EEPGD ; Selecciona memoria de programa.
BSF EECON1, WREN ; Habilita escritura.
BCF INTCON, GIE ; Inhibe interrupciones.
MOVLW 55h ; Carga código escritura.
MOVWF EECON2 ; “
MOVLW AAh ; “
MOVWF EECON2 ; “
BSF EECON1, WR ; Comienza la escritura.
NOP ; Tiempo para escritura.
NOP ; Tiempo para escritura.
; Ahora, el microcontrolador quedará a
; la espera de que finalice la escritura.
; Cuando esto suceda, continuará con
; la tercera instrucción desde la
; BSF EECON1, WR.
BSF INTCON, GIE ; Habilita interrupciones.
BCF EECON1, WREN ; Se inhibe la escritura.

4.7 Verificación de escritura

Dependiendo de la aplicación, puede necesitarse la seguridad de que la grabación corresponde


con el original. Esto se usa en aplicaciones en que excesivas escrituras pueden llevar a los datos
al límite de las especificaciones.

Generalmente, el fallo de un bit corresponde a la lectura 0 cuando se escribió un 1 (debido al


diseño interno del dispositivo).

4.8 Protección contra picos transitorios en escritura

4.8.1 Memoria EEPROM de Datos

Existen condiciones en las que el dispositivo no debe ser escrito en su memoria de datos. Para
que esto no ocurra accidentalmente se han dispuesto varios mecanismos internos. En la
conexión, el bit WREN queda borrado, y además, durante un tiempo de 72 milisegundos
después de la conexión, la escritura de la EEPROM está bloqueada.

La forma de iniciar la secuencia de escritura y los métodos de prevención, evitan escrituras


accidentales en casos de bajadas de tensión, picos de alimentación o errores en programas.

4.8.2 MEMORIA FLASH DE PROGRAMA

Para proteger la memoria de programa contra escrituras accidentales, el bit de configuración


WRT debe programarse a 0. La secuencia de escritura debe respetarse escrupulosamente. El bit
WRT y la palabra de configuración no pueden programarse con los códigos del usuario;
solamente a través de un programador externo.
Microcontrolador PIC16F876 Página 31

4.9 Código de protección durante la operación

Cada bloque de memoria reprogramable posee un código propio como mecanismo de


protección. Lecturas y escrituras externas se impiden si cada uno de estos mecanismos están
habilitados.

4.9.1 MEMORIA EEPROM DE DATOS

El microcontrolador, puede, por sí mismo, leer y escribir en la EEPROM interna de datos,


indiferentemente del estado del bit de configuración del código de protección.

4.9.2 MEMORIA FLASH DE PROGRAMA

El microcontrolador puede leer y ejecutar instrucciones, fuera de la memoria interna de


programa, indiferentemente del estado de los bits de configuración del código de protección. Sin
embargo, el bit de configuración WRT y los bits del código de protección, producen diferentes
efectos en la escritura de la memoria de programa. En la tabla 4-1 se muestran varias
configuraciones y estados de lecturas y escrituras. Para borrar el bit WRT, o el código de
protección, se requiere que el dispositivo esté totalmente borrado.

TABLA 4-1: ESTADO DE LECTURA-ESCRITURA DE LA MEMORIA FLASH DE PROGRAMA


Bits de configuración Lectura Escritura Lectura Escritura
Posiciones de memoria
CP1 CP0 WRT interna interna ICSP ICSP

0 0 X Toda la memoria de programa Sí No No No


0 1 0 Áreas desprotegidas Sí No Sí No
0 1 0 Áreas protegidas Sí No No No
0 1 1 Áreas desprotegidas Sí Sí Sí No
0 1 1 Áreas protegidas Sí No No No
1 0 0 Áreas desprotegidas Sí No Sí No
1 0 0 Áreas protegidas Sí No No No
1 0 1 Áreas desprotegidas Sí Sí Sí No
1 0 1 Áreas protegidas Sí No No No
1 1 0 Toda la memoria de programa Sí No Sí Sí
1 1 1 Toda la memoria de programa Sí Sí Sí Sí

TABLA 4-2: REGISTROS ASOCIADOS CON LA MEMORIA EEPROM FLASH DE PROGRAMA


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 POR, otros
BOR resets

0Bh, 8Bh, PEI


10Bh, 18Bh
INTCON GIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
E
10Dh EEADR Registro de dirección de la EEPROM xxxx xxxx uuuu uuuu
10Fh EEADRH --- --- --- Dirección alta de la EEPROM xxxx xxxx uuuu uuuu
10Ch EEDATA Registro de datos de la EEPROM xxxx xxxx uuuu uuuu
10Eh EEDATH --- --- Registro de datos de más peso xxxx xxxx uuuu uuuu
18Ch EECON1 EEPGD --- --- --- WRERR WREN WR RD x--- x000 x--- u000
18Dh EECON2 Registro2 de control de la EEPROM (no es un registro físico)
8Dh PIE2 --- (1) --- EEIE BCLIE --- --- CCP2IE -r-0 0--0 -r-0 0—0
0Dh PIR2 --- (1) --- EEIE BCLIE --- --- CCP2IE -r-0 0--0 -r-0 0—0
x = Desconocido; u = Sin cambio; r = Reservado; --- = Sin implementar (se lee 0). Las celdas sombreadas no se
utilizan durante el acceso a la memoria FLASH.
Nota 1: Estos bits están reservados; se deben mantener siempre a cero.
Microcontrolador PIC16F876 Página 32

5.0 MÓDULO TIMER 0 (TEMPORIZADOR 0)

El módulo Timer0 es un bloque que puede trabajar como temporizador o contador, con las
siguientes características:
• Temporizador o contador de 8 bits.
• Se puede leer y programar.
• Predivisor de 8 bits programable por software.
• Selección de reloj interno o externo.
• Provoca interrupción cuando desborda (cuando pasa de FFh a 00h).
• Selección de flanco para reloj externo.

La figura 5-1 representa el esquema a bloques del Timer0 y del Predivisor, compartido este
último con el WDT.

El modo temporizador se selecciona poniendo a 0 el bit T0CS (OPTION_REG <5>). En este


modo, y trabajando sin Predivisor, la cantidad cargada en TMR0 se incrementará con cada ciclo
de instrucción. Si se escribe sobre TMR0, el incremento de éste se inhibirá durante los dos
próximos ciclos de instrucción. El usuario puede trabajar con él escribiendo y ajustando el valor
del registro TMR0.

El modo contador se selecciona colocando a 1 el bit T0CS (OPTION_REG<5>). En este modo,


el Timer0 incrementa con cada flanco de subida o bajada que llega por la patilla RA4/T0CKI. El
tipo de flanco lo determina el bit T0SE (OPTION_REG<4>): 0 seleccionará flanco de subida, 1
lo contrario. En la sección 5.2 se analizan las restricciones de la entrada externa de reloj.
El módulo Predivisor está compartido entre el Timer0 y el WDT, y no se puede leer ni escribir.
En la sección 5.3 se ofrecen los detalles.
Microcontrolador PIC16F876 Página 33

5.1 Interrupción del Timer0

La interrupción de TMR0 se genera cuando el registro TMR0 desborda. Este desbordamiento


activa el bit T0IF (INTCON<2>). La interrupción puede enmascararse borrando el bit T0IE
(INTCON<5>). El bit T0IF debe borrarse por software en la rutina de servicio del Timer0 antes
de volver a habilitar esta interrupción. La interrupción TMR0 no puede sacar a la CPU del
estado SLEEP ya que el temporizador está bloqueado durante este estado.

5.2 Usando el Timer0 con reloj externo

Cuando no se usa el Predivisor, la entrada de reloj externo es la misma que la salida del
Predivisor. La sincronización de T0CKI con la fase de reloj interno se consigue capturando la
salida del Predivisor en los ciclos de reloj de fase interna Q2 y Q4. Por consiguiente, es
necesario para T0CKI: permanecer en alto al menos un tiempo igual al doble del período de
oscilador TOSC (y una pequeña red RC de retraso de 20 ns), permanecer en bajo el mismo
tiempo, y con la misma red RC. En el apartado de especificaciones eléctricas se ofrecen todos
los datos necesarios.

5.3 Predivisor

Solamente hay disponible un módulo Predivisor, que está compartido por Timer0 y WDT. Si se
asigna a uno de los módulos, no puede ser utilizado por el otro.

Los bits PSA y PS2:PS0 (OPTION_REG<3:0>) determinan la asignación del Predivisor, y la


división que se efectuará.

Cuando se asigna al módulo Timer0, todas las instrucciones que escriben sobre el registro
TMR0 (por ejemplo CLRF 1, MOVWF 1, BSF 1, x... etc.) borrarán el Predivisor. Cuando se
asigna al módulo WDT, una instrucción CLRWDT borrará el Predivisor y el Watchdog Timer.
El Predivisor no se puede leer ni escribir.

Nota: Escribiendo sobre TMR0, cuando el Predivisor está asignado al Timer0, se borrará la
cuenta del Predivisor pero no se cambiará la asignación de éste.

REGISTRO 5-1: REGISTRO OPTION_REG


Microcontrolador PIC16F876 Página 34

R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1


-RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da
0 en lectura
-n = Valor del reset POR

bit 7: -RBPU:

bit 6: INTEDG

bit 5: T0CS: Bit de selección de origen de reloj


1 = Transición en la patilla T0CKI.
0 = Reloj interno cada ciclo de instrucción (CLKOUT)

bit 4: T0SE: Bit de selección de flanco de reloj para TMR0.


1 = Incrementa con la transición de alto a bajo en la patilla T0CKI.
0 = Incrementa con la transición de bajo a alto en la patilla T0CKI.

bit 3: PSA: Bit de asignación de Predivisor.


1 = Predivisor asignado al WDT.
0 = Predivisor asignado al módulo Timer0.

bit 2-0: PS2:PS0: Bits de selección de división.

Valor de los bits División TMR0 División WDT

000 1:2 1:1


001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128

TABLA 5-1: REGISTROS ASOCIADOS AL TIMER0


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 POR, otros
BOR resets

01h, 101h, TMR0 Registro del módulo Timer0 xxxx xxxx uuuu uuuu
0Bh, 8Bh,
10Bh, 18Bh
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u

81h, 181h OPTION_REG -RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111

x = Desconocido; u = Sin cambio; r = Reservado. Las celdas sombreadas no se utilizan en el Timer0.

6.0 Módulo Timer1


Microcontrolador PIC16F876 Página 35

Este módulo es un temporizador-contador de 16 bits, formado por dos registros de lectura y


escritura de 8 bits llamados TMR1H y TMR1L. La pareja de registros TMR1H:TMR1L se
incrementan desde 0000h hasta FFFFh, volviendo a 0000h en el ciclo de reloj siguiente. A este
retorno a 0000h se llama desbordamiento, y si las interrupciones están habilitadas se producirá
una que advertirá a la CPU que el Timer1 ha llegado al final. El bit indicador de esta
interrupción es TMR1IF (PIR1<0>). La interrupción puede habilitarse o inhibirse activando o
borrando, respectivamente, el bit TMR1IE (PIE<0>).

El Timer1 puede trabajar en cualquiera de los dos modos siguientes:


• Como temporizador.
• Como contador.

El modo de operación lo determina el bit de selección de reloj TMR1CS (T1CON<1>).

En modo temporizador, el Timer1 se incrementa cada ciclo de instrucción, en modo contador, el


incremento se produce cada flanco de subida en la entrada de reloj externo. El Timer1 puede
habilitarse o inhibirse activando o borrando, respectivamente, el bit de control TMR1ON
(T1CON<0>). Timer1 posee, también, una entrada de reset interna, que puede activarla cada
uno de los dos módulos CCP. El registro 6.1 muestra el control del Timer1.

REGISTRO 6-1: T1CON: REGISTRO DE CONTROL DEL TIMER1 (DIRECCIÓN 10h)

U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0


--- --- T1CKPS1 T1CKPS0 T1OSCEN -T1SYNC TMR1CS TMR1ON R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da
0 en lectura
-n = Valor del reset POR

bit 7-6: Sin implementar: Se lee como 0.

bit 5-4: T1CKPS1:T1CKPS0: Bits de selección de predivisión de reloj de entrada a Timer1.


11 = 1:8 Valor de predivisión
10 = 1:4 Valor de predivisión
01 = 1:2 Valor de predivisión
00 = 1:1 Valor de predivisión

bit 3: T1OSCEN: Bit de control de habilitación de oscilador para TMR1.


1 = Oscilador habilitado.
0 = Oscilador anulado.

bit 2: -T1SYNC: Bit de control de sincronización de la entrada de reloj externo de Timer1.


TMR1CS = 1
1 = Entrada de reloj externo no sincronizada.
0 = Entrada de reloj externo sincronizada.
TMR1CS = 0
En esta circunstancia, Timer1 usa el reloj interno.

bit 1: TMR1CS: Bit de selección de origen de reloj para Timer1.


1 = Flanco de subida en la patilla RC0/T1OSO/T1CKI, o en la patilla RC1/T1OSI/CCP2.
0 = Reloj interno (Fosc/4).

bit 0: TMR1ON: Bit de conexión de Timer1.


1 = Timer1 habilitado.
0 = Timer1 detenido.

Cuando se habilita el oscilador del Timer1 (T1OSCEN = 1), las patillas RC1/T1OSI/CCP2 y
RC0/T1OSO/T1CKI quedan como entradas; o sea, que se ignora el valor de TRISC<1:0>.
6.1 Operación del Timer1 en modo temporizador
Microcontrolador PIC16F876 Página 36

El modo temporizador se selecciona borrando el bit TMRCS (T1CON<1>). En este modo, la


entrada de reloj es Fosc/4; el bit de sincronización T1SYNC (T1CON<2>) no tiene efecto en
este modo porque el reloj interno siempre está sincronizado.

6.2 Operación del Timer1 como contador

El Timer1 puede trabajar como contador asíncrono o síncrono, dependiendo de la programación


del bit TMR1CS.

Cuando el contador Timer1 va a incrementarse vía externa, los incrementos suceden en el flanco
de subida. Después de que el Timer1 se programe en modo contador, el módulo esperará un
flanco de bajada antes de comenzar los incrementos con los flancos de subida.

6.3 El Timer1 como contador sincronizado

El modo contador se selecciona poniendo a 1 el bit TMR1CS. En este modo, el Timer1


incrementará en cada flanco de subida de la entrada de reloj en la patilla RC1/T1OSI/CCP2,
cuando el bit T1OSCEN está a 1, o en la patilla RC0/T1OSO/T1CKI, cuando el bit T1OSCEN
esté a 0.

Si T1SYNC se borra, la entrada externa de reloj se sincroniza con la fase interna de reloj. La
sincronización se produce después de la etapa del Predivisor. Este bloque es un contador cíclico
asíncrono.

6.4 El Timer1 como contador asíncrono


Microcontrolador PIC16F876 Página 37

Si el bit de control T1SYNC (T1CON<2>) se activa, la entrada de reloj externa no queda


sincronizada. El temporizador continúa su incremento, totalmente asíncrono con la fase de reloj
interna. El temporizador continuará funcionando durante el estado de “alerta” (SLEEP), y puede
provocar una interrupción en su desbordamiento que saque de su “letargo” a la CPU. De
cualquier modo, es necesario tomar algunas precauciones en el software para leer o escribir en
el Timer1 (Sección 6.4.1).

6.4.1 LEYENDO Y ESCRIBIENDO EL TIMER1 COMO CONTADOR ASÍNCRONO

Al leer TMR1H o TMR1L cuando el Timer1 está funcionando como contador asíncrono, el
hardware garantiza la lectura correcta. Sin embargo, el usuario debe conocer la existencia de
ciertos problemas al leer el contenido de 16 bits, en dos bloques de 8 bits, como quiera que
puede producirse el desbordamiento del contador entre las dos lecturas.

En la escritura, se recomienda al usuario detener el temporizador, y, entonces, escribir el valor


deseado sobre el registro. Una escritura cuando el temporizador está siendo incrementado puede
provocar un valor impredecible en el registro.

6.5 Oscilador del Timer1

Se debe conectar un cristal de cuarzo entre las patillas T1OSI (entrada) y T1OSO (salida del
amplificador oscilador). El oscilador se habilita con el bit T1OSCEN (T1CON<3>), y
funcionará en bajo consumo a partir de 200 KHz. Este oscilador continúa funcionando aunque
la CPU entre en modo SLEEP (alerta), y está diseñado especialmente para trabajar a 32 KHz.
La tabla 6-1 la selección del condensador dependiendo de la frecuencia de trabajo; en la figura
6-3 se aprecia una aplicación del Timer1 como reloj de tiempo real.

Tabla 6-1: SELECCIÓN DE CONDENSADORES


PARA EL OSCILADOR DEL TIMER1

Tipo Frecuen-
C1 C2
Oscilador cia

32 KHz 33 pF 33 pF

LP 100 KHz 15 pF 15 pF

200 KHz 15 pF 15 pF

Estos valores son para guía de diseño

Cristales comprobados:

Epson C-
32,768 KHz +/- 20 PPM
001R32.768K-A

100 KHz Epson C-2 100.00KC-P +/- 20 PPM

200 KHz STD XTL 200.000KHz +/- 20 PPM

Nota 1: Una mayor capacidad aumenta la estabilidad


del oscilador pero también aumenta el tiempo de
arranque.

Nota 2: Ya que cada oscilador o resonador posee sus


propias características, el usuario debe consultar las
especificaciones del dispositivo a utilizar.

6.6 Reset del Timer1 usando la salida de disparo del CCP


Microcontrolador PIC16F876 Página 38

Si los módulos CCP1 o CCP2 se configuran en modo comparación para generar un “disparo por
suceso especial” (CCP1M3:CCP1M0 = 1011), esta señal provocará el reset del Timer1.

Nota: El “disparo por suceso especial” de los módulos CCP1 y CCP2 no activará el bit
indicador de interrupción TMR1IF (PIR<0>).

El Timer1 debe configurarse como temporizador o contador síncrono para disponer de esta
característica. Si Timer1 está funcionando en modo contador asíncrono, este reset no se
producirá.

En el caso de que coincida la escritura sobre Timer1, y un “disparo por suceso especial” desde
CCP1 o CCP2, la escritura tendrá preferencia.

En este modo de operación, la pareja de registros CCPRxH:CCPRxL produce el período para


Timer1.

6.7 Reset de la pareja de registros TMR1H:TMR1L, del Timer1

Los registros TMR1H y TMR1L no se ponen a 00h con la conexión del sistema (POR), o con
otros resets, exceptuando el reset del “disparo por suceso especial” de CCP1 o CCP2.

El registro T1CON se borra con los reset POR o BOR. Esto produce la detención del Timer1, y
pone el Predivisor a 1:1. Los demás resets no afectan a este registro.

6.7 Predivisor del Timer1

El contador Predivisor se borra al escribir sobre los registros TMR1H o TMR1L.

TABLA 6-2: REGISTROS ASOCIADOS AL TIMER1


Valor
Valor tras tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
POR, BOR otros
resets
0Bh, 8Bh,
10Bh, INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
18Bh
0Ch PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
8Ch PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000
0Eh TMR1L Byte de menor peso del registro de 16 bits TMR1 xxxx xxxx uuuu uuuu
0Fh TMR1H Byte de mayor peso del registro de 16 bits TMR1 xxxx xxxx uuuu uuuu
10h T1CON --- --- T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON --00 0000 --uu uuuu
x = Desconocido; u = Sin cambio; r = Reservado; --- = Sin implementar (se lee 0). Las celdas sombreadas no se utilizan en el
Timer1.
Nota 1: Los bits PSPIE y PSPIF se reservan en el PIC 16F873/876; se deben mantener siempre a 0.
Microcontrolador PIC16F876 Página 39

7.0 Módulo Timer2

El Timer2 es un temporizador de 8 bits con Predivisor y postdivisor. Puede utilizarse como base
de tiempos en modo PWM de los módulos CCP. El registro TMR2 es de lectura y escritura, y
puede borrarse con cualquier reset.

La entrada de reloj (Fosc/4) tiene la opción de predivisión por 1:1, 1:4 o 1:16, seleccionada por
los bits de control T2CKPS1:T2CKPS0 (T2CON<1:0>).

El módulo Timer2 posee el registro de período de 8 bits TMR2. Este temporizador incrementa
desde 00h hasta la coincidencia con PR2. En ese momento, se inicializará a 00h en el siguiente
ciclo de incremento. PR2 es un registro de lectura y escritura, y se inicializa a FFh tras un reset.

La salida de coincidencia de TMR2 se pasa a través de un postdivisor de 4 bits (ofreciendo una


división de frecuencia desde 1:1 hasta 1:16). Después de esto, se activará la interrupción de
TMR2, que queda memorizada en el bit indicador TMR2IF (PIR1<1>).

El Timer2 puede anularse, borrando el bit de control TMR2ON (T2CON<2>), para minimizar el
consumo del dispositivo.

El registro 7-1 muestra el registro de control del Timer2.

REGISTRO 7-1: T2CON: REGISTRO DE CONTROL DEL TIMER2 (DIRECCIÓN 12h)

U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0


--- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 R = De lectura
bit7 bit0 W = De escritura
U = Sin implementar. Da
0 en lectura
-n = Valor del reset POR

bit 7: Sin implementar: Se lee como 0.

bit 6-3: TOUTPS3:TOUTPS0: Bits de selección de postdivisión de Timer2.


0000 = 1:1 valor de postdivisión
0001 = 1:2 valor de postdivisión
0010 = 1:3 valor de postdivisión


1111 = 1:16 Valor de postdivisión

bit 2: TMR2ON: Bit de activación de TMR2.


1 = Timer2 está activado.
0 = Timer2 está desactivado.

bit 1-0: T2CKPS1:T2CKPS0: Bit de selección de predivisión para Timer2.


00 = 1:1 valor de predivisión.
01 = 1:4 valor de predivisión.
1X = 1:16 valor de predivisión.

7.1 Predivisión y postdivisión del Timer2


Microcontrolador PIC16F876 Página 40

Los contadores pre y postdivisores se borran con cualquiera de estos acontecimientos:


• Una escritura en el registro TMR2.
• Una escritura en el registro T2CON.
• Cualquier reset del dispositivo (POR, MCLR, WDT o BOR).

El registro TMR2 no se borra cuando se escribe en T2CON.

7.2 Salida de TMR2

La salida de TMR2, antes del postdivisor, sirve para dar reloj al puerto SSPort, quien utiliza esta
señal para crear su desplazamiento de datos serie. En la figura 7-1 se aprecia esto con detalle.

TABLA 7-1: REGISTROS ASOCIADOS AL TIMER2


Valor tras
Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 POR,BOR
otros
resets

0Bh,
8Bh, 0000
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x
10Bh, 000u
18Bh
0Ch PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000
0000
8Ch PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000

11h TMR2 Registro del módulo Timer2 0000 0000 0000 0000

12h T2CON --- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 -000 0000 -000 000

92h PR2 Registro de período del Timer2 1111 1111 1111 1111
x = Desconocido; u = Sin cambio; r = Reservado; --- = Sin implementar (se lee 0). Las celdas sombreadas no se
utilizan en el Timer1.
Nota 1: Los bits PSPIE y PSPIF se reservan en el PIC 16F873/876; se deben mantener siempre a 0.
Microcontrolador PIC16F876 Página 41

8.0 Módulos CAPTURA/COMPARACIÓN/PWM

Cada módulo Captura/Comparación/PWM (CCP) contiene un registro de 16 bits que puede


trabajar como:
• Registro de captura de 16 bits.
• Registro de comparación de 16 bits.
• Registro de relación de ciclo PWM.

El conjunto CCP1 y CCP2 son idénticos en el modo de operar, con la excepción de la


operación de “disparo por suceso especial”. La tabla 8-1 y 8-2 muestra los recursos e
interacciones del módulo CCP. En las secciones siguientes, la actividad de CCP se describe con
respecto a CCP1.

Módulo CCP1:

El registro CCPR1 está compuesto de dos registros de 8 bits: CCPR1L (byte bajo) y CCPR1H
(byte alto). El registro CCP1CON controla la operación de CCP1. El disparo por suceso
especial se genera cuando existe una coincidencia en la comparación, y se borrará el Timer1.

Módulo CCP2:

El registro CCPR2 está compuesto de dos registros de 8 bits: CCPR2L (byte bajo) y CCPR2H
(byte alto). El registro CCP2CON es el encargado de controlar la operación de CCP2. Un
disparo por suceso especial se genera por coincidencia en la comparación, se borrará el Timer1
y se arranca el convertidor A/D, si está habilitado.

Tabla 8-1: Modo CCP – Timer


Recursos
Modo CCP Temp. afectado

Captura Timer1
Comparación Timer1
PWM Timer2

Tabla 8-2: Interacción de los dos módulos CCP

Modo CCPx Modo CCPy Interacción

Captura Captura Misma base de tiempos que TMR1


El comparador se configurará para “dispara por
Captura Comparación
suceso especial”, que borrará a TMR1.
El comparador se configurará para “disparo por
Comparación Comparación
suceso especial, que borrará a TMR1.
El PWM tiene la misma frecuencia y ciclo de
PWM PWM
actualización (la interrupción de TMR2).
PWM Captura Ninguna
PWM Comparación Ninguna
Microcontrolador PIC16F876 Página 42

REGISTRO 8-1: REGISTRO CCP1CON/CCP2CON (DIRECCIÓN 17h/1Dh)

U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0


--- --- CCPxX CCPxY CCPxM3 CCPxM2 CCPxM1 CCPcM0
R = De lectura
bit7 bit0 W = De escritura
U = Sin implementar. Da
0 en lectura
-n = Valor del reset POR

bit 7-6: Sin implementar: Se lee como 0.

bit 5-4: CCPxX:CCPxY: Bits menos significativos de PWM.


Modo Captura: No usado.
Modo Comparación: No usado.
Modo PWM: Estos bits son los dos menos significativos de la relación de ciclo de PWM. Los ocho más
significativos se encuentran en el registro CCPRxL.

bit 3-0: CCPxM3:CCPxM0: Bits de selección de modo CCPx.


0000 = Captura/Comparación/PWM desconectados (reset del módulo CCPx).
0100 = Modo Captura, todos los flancos de bajada.
0101 = Modo Captura, todos los flancos de subida.
0110 = Modo Captura, cada 4 flancos de subida.
0111 = Modo Captura, cada 16 flancos de subida.
1000 = Modo Comparación, activa la salida con la coincidencia (se activa el bit CCPxIF).
1001 = Modo Comparación, borra la salida con la coincidencia (se activa el bit CCPxIF).
1010 = Modo Comparación, genera una interrupción cuando hay coincidencia (activa bit CCPxIF, sin
efecto en la patilla CCPx)
1011 = Modo Comparación, disparo por suceso especial (activa bit CCPxIF, patilla CCPx sin efecto);
CCP1 borra a TMR1; CCP2 borra TMR1 y arranca el convertidor A/D (si este módulo está
habilitado).
11xx = Modo PWM.

8.1 Modo Captura

En el modo Captura, CCPR1H:CCPR1L capturan los 16 bits del registro TMR1 cuando ocurre
un suceso sobre la patilla RC2/CCP1. Este suceso puede ser:
• Cada flanco de bajada.
• Cada flanco de subida.
• Cada cuatro flancos de subida.
• Cada dieciséis flancos de subida.

El suceso se selecciona con los bits de control CCP1M3:CCP1M0 (CCP1CON<3:0>). Cuando


se realiza una captura, el bit indicador de petición de interrupción CCP1IF (PIR1<2>) se activa,
debiendo borrarse en el programa este bit. Si ocurre otra captura antes de que se lea el valor
anterior en el registro CCPR1, el antiguo valor capturado se perderá.

8.1.1 CONFIGURACIÓN DE LA
PATILLA CCP

En modo Captura, la patilla RC2/CCP1 se


configurará como entrada activando el bit
TRISC<2>.

Nota: Si la patilla RC2/CCP1 se configura


como salida, una escritura en el puerto
puede provocar una condición de captura.
Microcontrolador PIC16F876 Página 43

8.1.2 SELECCIÓN DE MODO DE TIMER1

El Timer1 debe funcionar en modo temporizador o contador sincronizado para que el módulo
CCP pueda utilizar la característica de captura. En modo contador asíncrono, la captura no
puede producirse.

8.1.3 INTERRUPCIÓN POR SOFTWARE

Cuando se cambia el modo de captura, puede generarse una falsa interrupción de captura. El
usuario mantendrá borrado el bit CCP1IE (PIE1<2>) para evitar falsas interrupciones, y borrará
el bit indicador CCP1IF inmediatamente después de cualquier cambio en el modo de operación.

8.1.4 PREDIVISOR DE CCP

Existen cuatro posibles programaciones para el Predivisor, especificadas por los bits
CCP1M3:CCP1M0. Siempre que el módulo CCP se desconecta, o que el módulo CCP no está
en modo captura, el contador Predivisor está borrado. Cualquier reset borrará el contador
Predivisor.

El cambio de la predivisión de captura generará una interrupción. Pero el contador Predivisor no


se borrará, por lo que la primera captura no encontrará a cero al Predivisor. En el ejemplo 8-1 se
muestra el método recomendado para conmutar entre predivisores de captura. Este ejemplo
también borra el contador Predivisor y no generará una falsa interrupción.

EJEMPLO 8-1: CONMUTANDO PREDIVISIONES DE CAPTURA

CLRF CCP1CON ; Desconecta el módulo CCP.


MOVLW NEW_CAPT_PS ; Carga registro W con nueva predivisión
; y activa CCP.
MOVWF CCP1CON ; Carga CCP1CON con el nuevo valor.

8.2 Modo Comparación

En modo comparación, el valor del registro de 16 bits CCPR1 se compara constantemente con
el valor del par de registros de TMR1. Cuando hay coincidencia, la patilla RC2/CCP1 es:

• Puesta a 1.
• Puesta a 0.
• Sin cambio.

La acción sobre esta patilla la selecciona el valor de los bits de control CCP1M3:CCP1M0
(CCP1CON<3:0>). Al mismo tiempo, se activa el indicador de interrupción CCP1IF.
Microcontrolador PIC16F876 Página 44

8.2.1 CONFIGURACIÓN DE CCP

El usuario debe configurar la patilla


RC2/CCP1 como salida, borrando el bit
TRISC<2>.

Nota: Borrando el registro CCP1CON se


fuerza al latch de salida de comparación
RC2/CCP1 al nivel bajo por defecto.

8.2.2 SELECCIÓN EN MODO TIMER1

Si deseamos que el módulo CCP pueda


utilizar su característica de comparación, el
Timer1 sólo puede funcionar en modo Temporizador o en modo Contador Sincronizado; no se
debe operar en modo Contador Asíncrono.

8.2.3 MODO DE INTERRUPCIÓN POR SOFTWARE

Cuando se elige el modo de generar una interrupción por programa, la patilla CCP1 no queda
afectada. El bit CCPIF se activa provocando una interrupción en CCP (si está habilitado).

8.2.4 DISPARO POR SUCESO ESPECIAL

En este modo, se genera un disparo interno por hardware, que puede utilizarse para iniciar una
acción.

La salida de disparo por suceso especial de CCP1 borra el registro par TMR1. Esto lleva al
registro CCPR1 a ser, realmente, un registro programable de período de 16 bits para el Timer1.

La salida de disparo por suceso especial de CCP2 borra el registro par TMR1 y arranca el
convertidor A/D (si este módulo estuviese habilitado).

Nota: El disparo por suceso especial de los módulos CCP1 y CCP2 no activa el bit indicador de
interrupción TMR1IF (PIR<0>).

8.3 Modo PWM (PWM)

En modo Modulación por Ancho de Pulso


(PWM), la patilla CCPx produce una salida
PWM con 10 bits de resolución. Como quiera
que la patilla CCP1 está multiplexada con el
latch de datos del puerto C, el bit TRISC<2>
se borrará para programar como salida la
patilla CCP1.

Nota: Borrando el registro CCP1CON se


forzará al latch de salida PWM CCP1 al nivel
bajo por defecto. Esto no afecta al latch de
datos del puerto C.

La figura 8-3 muestra el diagrama


simplificado a bloques del módulo CCP en
modo PWM.
Microcontrolador PIC16F876 Página 45

Una salida PWM (figura 8-4) posee un período y un tiempo de alto (Duty Cycle). La frecuencia
de la onda PWM será la inversa del período.

8.3.1 PERÍODO PWM

El período PWM se especifica escribiendo el registro PR2. El período PWM puede calcularse
usando la siguiente relación:

Período(PWM) = [(PR2)+1]•4Tosc•(valor Predivisor TMR2); siendo Tosc=250 ns para 4 Mhz.

La frecuencia PWM será la inversa del período: f(PWM) = 1/Período(PWM)

Cuando TMR2 se iguala a PR2, suceden los siguientes tres sucesos en el próximo ciclo de
incremento:
• Se borra TMR2.
• Se activa la patilla CCP1 (siempre y cuando el duty cycle no sea igual al 0%).
• El duty cycle se carga desde CCPR1L a CCPR1H.

Nota: El postdivisor de Timer2 no se utiliza


en la determinación de la frecuencia PWM.
El postdivisor podría usarse para tener un
rango auto-actualizable de frecuencias de
salida PWM.

8.3.2 TIEMPO EN ALTO (DUTY


CYCLE) DE PWM

El duty cycle de PWM se especifica


escribiendo en el registro CCPR1L y en los
bits de CCP1CON<5:4>. Se dispone de 10 bits de resolución. El registro CCPR1L contiene los
ocho bits más significativos, y el registro CCP1CON<5:4> los dos de menos peso. Este valor de
10 bits se representa por la notación CCPR1L:CCP1CON<5:4>. La siguiente ecuación se utiliza
para calcular el duty cycle, en tiempo, de PWM:

PWM(duty cycle) = (CCPR1L:CCP1CON<5:4>)•Tosc•(TMR2(Predivisor))

CCPR1L y CCP1CON<5:4> pueden escribirse en cualquier momento, pero el valor del duty
cycle no se carga en CCPR1H hasta después de que ocurra la coincidencia entre PR2 y TMR2
(un período completo). En modo PWM, CCPR1H es un registro de sólo lectura.

El registro CCPR1H y un latch interno de 2 bits se utilizan como doble buffer del duty cycle
PWM. Este buffer doble es esencial para evitar los picos en la conmutación PWM.

Cuando CCPR1H y el latch de dos bits coinciden con TMR2 unido a dos bits procedentes del
Predivisor, o dos bits procedentes de F/F internos, se borra la patilla CCP1.

A título de ejemplo:

Cargamos CCPR1L con 210 (102) y ponemos “10” en los bits 5 y 4 de CCP1CON, el número
binario total será 1010. Como TMR2 ahora recibe los impulsos de una fase Q interna (cuyo
período será de 250 ns con un oscilador de 4 Mhz), la duración del impulso alto (duty cucle),
con predivisor a 1, será de 1010b x 250ns = 10d x 250 ns = 2,5 µ s.
Microcontrolador PIC16F876 Página 46

Nota: Si el valor del duty cycle es mayor que el período PWM, la patilla CCP1 no se pondrá a
cero.

8.3.3 PROGRAMACIÓN PARA OPERACIÓN PWM

Los siguientes pasos deben respetarse para configurar el módulo CCP como PWM:
1. Programar el período PWM, escribiendo en el registro PR2.
2. Programar el duty cycle, escribiendo en el registro CCPR1L y CCP1CON<5:4>.
3. Poner la patilla CCP1 como salida, borrando el bit 2 de TRISC (TRISC<2>).
4. Programar el valor Predivisor de TMR2 y habilitar Timer2, escribiendo T2CON.
5. Configurar el módulo CCP1 para operación como PWM.

TABLA 8-3: REGISTROS ASOCIADOS AL TIMER1, CAPTURA Y COMPARACIÓN


Valor tras
Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 POR,BOR
otros
resets

0Bh,
8Bh, INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
10Bh,
18Bh
0Ch PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000

0Dh PIR2 --- --- --- --- --- --- --- CCP2IF ---- ---0 ---- ---0

8Ch PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000

8Dh PIE2 --- --- --- --- --- --- --- CCP2IE ---- ---0 ---- ---0

87h TRISC Registro de dirección del puerto C. 1111 1111 1111 1111

0Eh TMR1L Byte menos significativo del registro TMR1 de 16 bits. xxxx xxxx uuuu uuuu

0Fh TMR1H Byte más significativo del registro TMR1 de 16 bits. xxxx xxxx uuuu uuuu

10h T1CON --- --- T1CKPS1 T1CKPS0 T1OSCEN -T1SYNC TMR1CS TMR1ON --00 0000 --uu uuuu

15h CCPR1L Byte menos significativo del registro1 de Captura-Comparación-PWM xxxx xxxx uuuu uuuu

16h CCPR1H Byte más significativo del registro1 de Captura-Comparación-PWM xxxx xxxx uuuu uuuu

17h CCP1CON --- --- CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 --00 0000 --00 0000

1Bh CCPR2L Byte menos significativo del registro2 de Captura-Comparación-PWM xxxx xxxx uuuu uuuu

1Ch CCPR2H Byte más significativo del registro2 de Captura-Comparación-PWM xxxx xxxx uuuu uuuu

1Dh CCP2CON --- --- CCP2X CCP2Y CCP2M3 CCP2M2 CCP2M1 CCP2M0 --00 0000 --00 0000

x = Desconocido; u = Sin cambio; r = Reservado; --- = Sin implementar (se lee 0). Las celdas sombreadas no se
utilizan en Captura y Timer1.
Nota 1: PSP no está implementado en el PIC 16F873/876; se debe mantener siempre a 0.
Microcontrolador PIC16F876 Página 47

TABLA 8-4: REGISTROS ASOCIADOS AL TIMER2 Y PWM


Valor
Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 POR,BOR
tras otros
resets

0Bh,
8Bh,
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
10Bh,
18Bh
0Ch PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000

0Dh PIR2 --- --- --- --- --- --- --- CCP2IF ---- ---0 ---- ---0

8Ch PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000

8Dh PIE2 --- --- --- --- --- --- --- CCP2IE ---- ---0 ---- ---0

87h TRISC Registro de dirección del puerto C. 1111 1111 1111 1111

11h TMR2 Registro de los módulos de TMR2. 0000 0000 0000 0000

92h PR2 Registro de período de los módulos TMR2. 1111 1111 1111 1111

12h T2CON --- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 -000 0000 -000 0000

15h CCPR1L Byte menos significativo del registro1 de Captura-Comparación-PWM xxxx xxxx uuuu uuuu

16h CCPR1H Byte más significativo del registro1 de Captura-Comparación-PWM xxxx xxxx uuuu uuuu

17h CCP1CON --- --- CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 --00 0000 --00 0000

1Bh CCPR2L Byte menos significativo del registro2 de Captura-Comparación-PWM xxxx xxxx uuuu uuuu

1Ch CCPR2H Byte más significativo del registro2 de Captura-Comparación-PWM xxxx xxxx uuuu uuuu

1Dh CCP2CON --- --- CCP2X CCP2Y CCP2M3 CCP2M2 CCP2M1 CCP2M0 --00 0000 --00 0000

x = Desconocido; u = Sin cambio; r = Reservado; --- = Sin implementar (se lee 0). Las celdas sombreadas no se
utilizan en PWM y Timer2.
Nota 1: Los bits PSPIE y PSPIF están reservados en el PIC 16F873/876; se deben mantener siempre a 0.

9.0 MÓDULO PUERTO SERIE SÍNCRONO MAESTRO (MSSP)

El módulo MSSP es un acoplamiento (interface) serie usada en comunicaciones con otros


periféricos o dispositivos microcontroladores. Estos dispositivos periféricos pueden ser
EEPROMs, registros de desplazamiento, controladores de displays, convertidores A/D, etc. El
módulo MSSP puede trabajar en uno de estos dos modos:
• Interface de Periférico Serie (SPI).
• Circuitos Inter-Integrados (I2C).

La figura 9-1 muestra un diagrama a bloques para el modo SPI; las figuras 9-5 y 9-9 muestran
los diagramas a bloques para dos diferentes modos de trabajar I2C.
Microcontrolador PIC16F876 Página 48

REGISTRO 9-1: SSPSTAT: REGISTRO DE ESTADO PUERTO SERIE SÍNCRONO


(DIRECCIÓN 94h)

R/W-0 R/W-0 R-0 R-0 R-0 R-0 R-0 R-0


SMP CKE D/-A P S R/-W UA BF R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da
0 en lectura
-n = Valor del reset POR

bit 7: SMP: Bit de captura.


SPI Modo Maestro
1 = Captura del dato de entrada al final del tiempo del dato de salida.
0 = Captura del dato de entrada en el centro del tiempo del dato de salida.
SPI Modo Servidor
SMP de borrarse cuando se use SPI en modo servidor.
En modo servidor, o maestro I2C:
1 = Inhibe control de velocidad para modo de velocidad estándar (100 KHz a 1 MHz).
0 = Habilita control de velocidad para modo de alta velocidad (400 KHz).
bit 6: CKE: Selección de flanco de reloj para SPI (figura 9-4, figura 9-5 y figura 9-6).
Modo SPI:
CKP = 0
1 = La transmisión sucede en la transición del estado de reloj activo al estado de reloj aislado.
0 = La transmisión sucede en la transición del estado de reloj aislado al estado de reloj activo.
CKP = 1
1 = El dato se transmite en el flanco de bajada de SCK.
0 = El dato se transmite en el flanco de subida de SCK.
En modo Servidor o Maestro I2C:
1 = Niveles de entrada conforme a las especificaciones SMBUS.
0 = Niveles de entrada conforme a las especificaciones I2C.
bit 5: D/A: Bit de selección de dato o dirección (Data/-Address), solamente en modo I2C.
1 = Indica que el último byte recibido o transmitido fue un dato.
0 = Indica que el último byte recibido o transmitido fue una dirección
bit 4: P: Bit de parada (stop)
(Solamente en modo I2C. Este bit se borra cuando se inhibe el módulo MSSP. SSPEN está a cero).
1 = Indica que un bit de stop se ha detectado en último lugar. (este bit se pone a cero con RESET).
0 = Indica que no se ha detectado en último lugar un bit de stop.
bit 3: S: Bit de arranque (Start).
(Solamente en modo I2C. Este bit se borra cuando se inhibe el módulo MSSP. SSPEN está a cero).
1 = Indica que un bit de start se ha detectado en último lugar. (este bit se pone a cero con RESET).
0 = Indica que no se ha detectado en último lugar un bit de start.
bit 2: R/W: Bit de información de lectura-escritura (solamente en modo I2C).
Este bit contiene la información de lectura-escritura de la última dirección tratada. Este bit solamente
es válido desde la última dirección tratada hasta el próximo bit de Start, Stop o no –ACK
En modo servidor I2C:
1 = Lectura.
0 = Escritura.
En modo maestro I2C:
1 = Transmisión en progreso.
0 = Transmisión detenida.
La función OR de este bit con SEN, RSEN, PEN, RCEN o ACKEN indicará si el MSSP está en modo
aislado.

bit 1: UA: Actualización de dirección (10 bits, solamente en modo I2C).


1= Indica que el usuario necesita actualizar la dirección en el registro SSPADD.
0 = Indica que la dirección no necesita ser actualizada.
bit 0: BF: Bit de estado de buffer lleno (buffer full).
Recepción (modos SPI e I2C).
1 = Recepción completa. SSPBUF está lleno.
0 = Recepción incompleta. SSPBUF está vacío.
Transmisión (modos SPI e I2C).
1 = Dato transmitido está en progreso (no incluye –ACK y bits de STOP). SSPBUF está lleno.
0 = Dato transmitido no está en progreso (no incluye –ACK y bits de STOP). SSPBUF está vacío.
Microcontrolador PIC16F876 Página 49

REGISTRO 9-2: SSPCON: REGISTRO DE CONTROL PUERTO SERIE SÍNCRONO


(DIRECCIÓN 14h)

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0


WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 R = De lectura
W = De escritura
bit7 bit0
U = Sin implementar. Da
0 en lectura
-n = Valor del reset POR

bit 7: WCOL: Bit detector de conflicto en escritura.


Modo Maestro
1 = Se intentó una escritura sobre SSPBUF cuando no eran válidas las condiciones I2C.
0 = No existe conflicto.
Modo Servidor
1 = Se escribió en SSPBUF cuando estaba transmitiendo la palabra anterior (se borra por software).
0 = No existe conflicto.
bit 6: SSPOV: Bit indicador de desbordamiento en recepción.
Modo entrada SPI:
1 = Se ha recibido un nuevo byte cuando SSPBUF aún mantenía el dato anterior. El dato en SSPSR se
pierde al desbordar. En modo Servidor, el usuario leerá el SSPBUF, aunque esté transmitiendo un dato,
para evitar desbordamiento. En modo maestro, el bit de desbordamiento no se activa para evitar éste,
ya que cada operación se inicia escribiendo en el registro SSPBUF. Debe borrarse por software.
0 = No hay conflicto.
En modo I2C:
1 = Se recibe un byte mientras SSPBUF mantiene el dato previo. SSPOV es indiferente en trasmisión.
Debe borrarse por software.
0 = No existe conflicto.
bit 5: SSPEN: Bit de habilitación de Puerto Serie Síncrono.
En modo SPI, cuando se habilite, estas patillas deberán ser convenientemente configuradas como
entradas o salidas.
1 = Habilita puerto serie y configura las patillas SCK, SDO, SDI y –SS como patillas del puerto serie.
0 = Inhibe puerto serie y configura estas patillas como líneas de puerto entrada-salida.
En modo I2C, cuando se habilite, estas patillas deberán ser convenientemente configuradas como
entradas o salidas.
1 = Habilita puerto serie y configura las patillas SDA y SCL como patillas del puerto serie.
0 = Inhibe puerto serie y configura estas patillas como líneas de puerto entrada-salida.
bit 4: CKP: Bit de selección de polaridad de reloj.
En modo SPI:
1 = Reloj desconectado queda en nivel alto.
0 = Reloj desconectado queda en nivel bajo.
En modo servidor I2C, control de SCK.
1 = Habilita reloj.
0 = Mantiene bajo el reloj (prolongación del reloj). El usuario asegura el tiempo de antelación de datos.
En modo maestro I2C:
No utilizado en este modo.
bit 3-0: SSPM3:SSPM0: Bits de selección de modo para Puerto Serie Síncrono
0000 = Modo Maestro SPI, reloj = Fosc/4.
0001 = Modo Maestro SPI, reloj = Fosc/16.
0010 = Modo Maestro SPI, reloj = Fosc/64.
0011 = Modo Maestro SPI, reloj = salida/2 de TMR2.
0100 = Modo Servidor SPI, reloj = patilla SCK. Patilla de control –SS habilitada.
0101 = Modo Servidor SPI, reloj = patilla SCK. Patilla de control –SS inhibida. Ésta puede usarse
como entrada o salida.
0110 = Modo Servidor I2C, con 7 bits de dirección.
0111 = Modo Servidor I2C, con 10 bits de dirección.
1000 = Modo Maestro I2C, reloj = Fosc / [4•(SSPADD+1)].
1011 = Modo Maestro controlado por el microprograma I2C (servidor desconectado).
1110 = Modo Maestro controlado por el microprograma I2C, dirección de 7 bits con bit de start y stop e
interrupciones habilitadas.
1111 = Modo Maestro controlado por el microprograma I2C, dirección de 10 bits con bit de start y stop,
e interrupciones habilitadas.
1001, 1010, 1100 y 1101 están reservadas.
Microcontrolador PIC16F876 Página 50

REGISTRO 9-3: SSPCON2: REGISTRO2 DE CONTROL PUERTO SERIE SÍNCRONO


(DIRECCIÓN 91h)

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0


GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar.
Da 0 en lectura
-n = Valor del reset POR

bit 7: GCEN: Bit de habilitación de llamada general (solamente en modo servidor I2C).
1 = Habilitación de interrupción cuando se recibe en SSPSR una dirección de llamada general.
0 = Inhibida la dirección de llamada general.
bit 6: ACKSTAT: Bit de estado de reconocimiento (solamente en modo maestro I2C).
Modo maestro transmisión:
1 = No se recibió el reconocimiento desde el servidor.
0 = Se recibió el reconocimiento desde el servidor.
bit 5: ACKDT: Bit de reconocimiento de dato (solamente en modo maestro I2C).
Recepción en modo maestro:
Valor que fue transmitido cuando el usuario inicia una secuencia de reconocimiento al final de una
recepción.
1 = No hay reconocimiento,
0 = Reconocimiento.
bit 4: ACKEN: Bit de habilitación de secuencia de reconocimiento (solamente en modo maestro I2C).
En modo maestro recepción:
1 = Inicia una secuencia de reconocimiento en las patillas SDA y SCL, y transmite un bit de datos
ACKDT. Automáticamente se borra por hardware.
0 = Detenida la secuencia de reconocimiento.
bit 3: RCEN: Bits de habilitación de recepción (solamente en modo maestro I2C).
1 = Habilita la recepción en modo I2C.
0 = Recepción detenida.
bit 2: PEN: Bit de habilitación de condición de parada (solamente en modo maestro I2C).
Control de SCK liberado
1 = Inicia la condición de parada (STOP) en las patillas SDA y SCL. Se borra automáticamente por
hardware.
0 = Detenida la condición de parada.
bit 1: RSEN: Bit de habilitación de la condición de repetición de arranque (solamente en modo maestro I2C).
1 = Inicia la condición de repetición de arranque en las patillas SDA y SCL. Se borra automáticamente
por hardware.
0 = Detenida la condición de repetición de arranque.
bit 0: SEN: Bit de habilitación de la condición de arranque (solamente en modo maestro I2C).
1 = Inicia la condición de arranque en las patillas SDA y SCL. Se borra automáticamente por hardware.
0 = Detenida la condición de arranque.
Nota: Para los bits ACKEN, RCEN, PEN, RSEN y SEN: Si el módulo I2C no está en modo detención, estos
bits no pueden programarse y el SSPBUF no puede escribirse.
Microcontrolador PIC16F876 Página 51

9.1 Modo SPI

El modo SPI permite que 8 bits de datos sean, simultáneamente, transmitidos y recibidos. Están
desarrollados los cuatro modos de SPI. Para llevar a cabo la comunicación, se usan tres patillas:
• Dato de salida serie (SDO).
• Dato de entrada serie (SDI).
• Reloj serie (SCK).

Adicionalmente, una cuarta patilla puede usarse cuando se opera en modo servidor:
• Selección de servidor ( SS ).

Al inicializar el SPI, dispondremos de varias opciones, que se consiguen programando los bits
de control (SSPCON<5:0> y SSPSTAT<7:6>). Estos bits permitirán lo siguiente:
• Modo maestro (SCK es el reloj de salida).
• Modo servidor (SCK es el reloj de entrada).
• Polaridad del reloj (estado desconectado de SCK).
• Fase de captura del dato de entrada (en el centro o al final del tiempo del dato de
salida).
• Flanco de reloj (dato de salida en el flanco de subida-bajada de SCK).
• Velocidad de reloj (solamente en modo maestro).
• Modo de selección de servidor (solamente en modo servidor).

La figura 9-1 muestra el diagrama a bloques


del módulos MSSP cuando está en modo
SPI.

Para habilitar el puerto serie (bit MSSP)


debe activarse SSPEN (SSPCON<5>). Para
borrar o reconfigurar el modo SPI, borrar el
bit SSPEN, reinicializar el registro
SSPCON, y, entonces, activar el bit SSPEN.
Esto configura las patillas SDI, SDO, SCK
y SS como patillas de puerto serie. Para
que las patillas se comporten como
funciones de puerto serie, hay que tener
debidamente programados los bits de
dirección de puerto (registro TRIS). O sea:
• SDI se controla automáticamente
por el módulo SPI.
• SDO debe tener borrado
TRISC<5>.
• SCK (modo maestro) debe tener
borrado TRISC<3>.
• SCK (modo servidor) debe tener en
1 el bit TRISC<3>.
• SS debe tener activado
TRISA<5>.

Cualquier función de puerto serie no


deseada debe anularse programando el
correspondiente registro de dirección de
datos (TRIS) con el valor opuesto.
Microcontrolador PIC16F876 Página 52

9.1.1 MODO MAESTRO

El maestro puede iniciar la transferencia de datos en cualquier momento porque es él quien


controla el reloj SCK. El maestro determina, por el protocolo de software, cuándo el servidor
(Procesador 2, figura 9-5) está transmitiendo datos.

En modo maestro, el dato se transmite o recibe tan pronto como el registro SSPBUF se carga. Si
el módulo SPI está preparado solamente para recibir, la salida SDO estará inhibida (programada
como entrada). El registro SSPSR continuará el desplazamiento con la señal presente en la
patilla SDI a la velocidad de reloj programada. Cuando el byte se recibe, se cargará en el
registro SSPBUF como una recepción normal de byte (se activará la interrupción y los bits
apropiados de datos).

La polaridad del reloj se selecciona programando adecuadamente el bit CKP (SSCON<4>). Esto
proporciona una formas de onda, para comunicaciones SPI, como se muestra en la Figura 9-2,
Figura 9-3 y Figura 9-4, donde el MSB se transmite en primer lugar. En modo maestro, la
velocidad del reloj SPI se programa por el usuario, de una de las siguientes formas:
• Fosc/4 (o TCY).
• Fosc/16 (o 4TCY).
• Fosc/64 (o 16TCY).
• (SalidaTimer2) : 2.

Esto permitirá una frecuencia máxima de reloj de bit (a 20 MHz) de 5 MHz.

En la figura 9-2 se muestra las formas de onda para el modo Maestro. Cuando CKE = 1, el dato
en SDO debe ser válido antes del flanco de reloj en SCK. El cambio en la captura de entrada se
muestra basándose en el estado del bit SMP. Se aprecia el instante en que se carga el registro
SSPBUF con el dato recibido.

9.1.2 MODO SERVIDOR


Microcontrolador PIC16F876 Página 53

En modo servidor, el dato se transmite y recibe cuando aparece el pulso externo de reloj en
SCK. Cuando se ha memorizado el último bit, el bit indicador de interrupción SSPIF (PIR<3>)
se activa.

En modo servidor, el reloj externo se suministra por la fuente externa de reloj en la patilla SCK.
Este reloj externo debe poseer un mínimo de tiempo en alto y bajo, tal y como indican las
características eléctricas.

En modo SLEEP, el servidor puede transmitir y recibir datos. Cuando se recibe un byte, el
dispositivo abandonará el estado SLEEP.

Nota: Cuando el módulo SPI está en modo servidor con la patilla SS habilitada
(SSPCON<3:0> = 0100), el módulo SPI inicializará si la patilla SS se coloca a VDD.
Nota: Si el módulo SPI se usa en modo servidor con CKE = 1, la patilla de control SS debe
habilitarse.

TABLA 9-1: REGISTROS ASOCIADOS A LA OPERACIÓN SPI


Microcontrolador PIC16F876 Página 54

Valor tras Valor tras


Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 POR,BOR otros resets

0Bh, 8Bh,
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
10Bh, 18Bh

0Ch PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
(1)
8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000

13h SSPBUF Registro de recepción y transmisión del Puerto Serie Síncrono xxxx xxxx uuuu uuuu

14h SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 0000 0000 0000 0000

94h SSPSTAT SMP CKE D/-A P S R/-W UA BF 0000 0000 0000 0000
x = Desconocido; u = Sin cambio; r = Reservado; --- = Sin implementar (se lee 0). Las celdas sombreadas no se
utilizan por SSP en modo SPI.
Nota 1: Estos bits se reservan en los dispositivos de 28 patillas; se deben mantener siempre a 0.

9.2 Operación del módulo MSSP en modo I2C

El módulo MSSP en modo I2C implementa las funciones de maestro y servidor (incluyendo el
soporte de la llamada general), y proporciona interrupciones por hardware en los bits de start y
stop para determinar la disponibilidad del bus (función multi-master). El módulo MSSP
implementa las especificaciones de modo estándar, así como direccionamiento de 7 bits y 10
bits.

Un filtro de transitorios está dispuesto en las patillas SCL y SDA cuando trabajan como
entradas. Este filtro opera en el rango de 100 a 400 KHz. En modo 100 KHz, cuando estas
patillas están como salidas, hay un control sobre la velocidad de subida de la patilla que es
independiente de la frecuencia del dispositivo.

Dos patillas se usan para transferencia de datos. Son las patillas SCL, que actúa como reloj, y la
patilla SDA, que es el dato. Estas patillas se configuran automáticamente cuando se habilita el
modo I2C. Las funciones del módulo SSP se habilitan activando SSPEN (SSPCON<5>).

El módulo MSSP tiene seis registros para la


operación I2C, que son:
• Registro de Control SSP
(SSPCON).
• Registro2 de Control SSP
(SSPCON2).
• Registro de Estado (SSPSTAT).
• Buffer de transmisión-recepción
serie (SSPBUF).
• Registro de Desplazamiento
(SSPSR). No es accesible
directamente.
• Registro de dirección SSP
(SSPADD).

El registro SSPCON permite el control de la


operación I2C. Cuatro bits de selección de
modo (SSPCON<3:0>) permiten seleccionar uno de los siguientes modos I2C:
Microcontrolador PIC16F876 Página 55

• Modo servidor I2C (dirección de 7 bits).


• Modo servidor I2C (dirección de 10 bits).
• Modo maestro I2C, reloj = OSC/4 (SSPADD + 1).

Antes de seleccionar cualquier modo I2C, las patillas SCL y SDA deben programarse como
entradas, activando los bits apropiados del registro TRIS. Al seleccionar un modo I2C,
programando el bit SSPEN, se habilitan las patillas SCL y SDA para ser usadas como líneas de
reloj y datos, respectivamente, en modo I2C.

El bit CKE (SSPSAT<6:7>) programa los niveles de las patillas SDA y SCL en los modos
maestro o servidor. Cuando CKE = 1, el nivel responderá a las especificaciones de SMBUS;
cuando CKE = 0, los niveles responderán a las especificaciones de I2C.

El registro SSPSTAT contiene el estado de la transferencia. Esta información incluye: la


detección de los bits de Start (S) o Stop (P), la especificación de si el byte recibido fue dato o
dirección, y si es esta última, si el próximo byte es el resto de la dirección de 10 bits, y, por
último, si habrá una lectura o escritura en la transferencia del dato.

SSPBUF es el registro donde se carga el dato a transferir, o donde está el dato recibido. Este
registro desplaza el dato hacia dentro o hacia fuera del dispositivo. En operaciones de recepción,
SSPBUF y SSPSR crean un doble buffer receptor. Esto permitirá la recepción del próximo byte
antes de comenzar a leer el último byte recibido. Cuando se ha recibido el dato completo, se
transfiere al registro SSPBUF y el bit indicador SSPIF se activa. Si se recibe algún otro byte
completo antes de leer el registro SSPBUF, se produce desbordamiento, y el bit SSPOV
(SSPCON<6>) se activa para indicar que se perdió el byte primero cargado en SSPBUF y no
leído.

El registro SSPADD mantiene la dirección del servidor. En modo de 10 bits de dirección, el


usuario necesita escribir el byte alto de la dirección (1111 0-A9-A8-0). A continuación, es
necesario cargar el byte bajo de la dirección (A7:A0).

9.2.1 MODO SERVIDOR

En este modo, las patillas SCL y SDA deben configurarse como entradas. El módulo MSSP
sustituirá el estado de la entrada con el dato de salida cuando se necesite (servidor-transmisor).

Cuando una dirección es reconocida, o se recibe un dato después de reconocer una dirección, la
circuitería generará un pulso de reconocimiento ACK . Entonces se produce la carga del
registro SSPBUF con el valor actual recibido, cargado en el registro SSPSR.

Existen ciertas condiciones por las que el módulo MSSP no producirá el pulso ACK , y son:
a) El bit de buffer lleno BF (SSPSAT<0>) se activó antes de que la transferencia fuese
recibida.
b) El bit de desbordamiento SSPOV (SSPCON<6>) se activó antes de que fuese recibida
la transferencia.

Si el bit BF está activado, el valor del registro SSPSR no se carga en el registro SSPBUF, pero
se activan los bits SSPIF y SSPOV. La tabla 9-2 muestra, en el estado de los bits BF y SSPOV,
lo que ocurre cuando no se recibe un byte de datos transferido. Las celdas sombreadas muestran
las condiciones donde el software del usuario no producen el borrado apropiado de la condición
de desbordamiento. El bit indicador BF se borra leyendo el registro SSPBUF, mientras que el
borrado de SSPOV será por software.
Microcontrolador PIC16F876 Página 56

La entrada de reloj SCL debe tener un mínimo de duración, tanto en alto como en bajo, para una
correcta operación. Los tiempos de alto y bajo de las especificaciones de I 2C, así como los
requisitos del módulo MSSP, se muestran en las especificaciones eléctricas.

9.2.1.1 DIRECCIONAMIENTO

Cada vez que el módulo MSSP ha sido habilitado, espera a que ocurra una condición de
arranque (Start). Seguidamente, se desplazan los 8 bits en el registro SSPSR. Todos los bits
entrantes se capturan con el flanco de subida de la línea de reloj SCL. El valor del registro
SSPSR<7:1> se compara con el valor del registro SSPADD. La dirección se compara en el
flanco de bajada del octavo pulso de reloj en SCL. Si la dirección se reconoce y los bits BF y
SSPOV están borrados, se suceden las siguientes operaciones:
a) El valor del registro SSPSR se carga en SSPBUF en el flanco de bajada del octavo pulso
de SCL.
b) El bit BF (buffer lleno) se activa en la bajada de reloj del octavo pulso en SCL.
c) Se genera un pulso de reconocimiento ACK .
d) El bit indicador de interrupción SSPIF (PIR1<3>) se activa en el flanco de bajada del
noveno pulso en SCL. Se producirá interrupción, si estuviese habilitada.

En modo de dirección a 10 bits, se necesitan dos bytes para recibir la dirección por el servidor.
Los cinco bits de mayor peso del primer byte de dirección, especifican si es una dirección a 10
bits. El bit R / W (SPSAT<2>) indicará una escritura sobre el dispositivo servidor que recibirá
el segundo byte de dirección. Para una dirección de 10 bits, el primer byte debe ser igual a
“1111 0-A9-A8-0”, donde A9 y A8 son los dos bits de mayor peso de la dirección de 10 bits.
La secuencia de operaciones para una dirección a 10 bits es la siguiente, con los pasos 7 a 9 para
servidor transmisor:
1. Recepción del primer byte (más peso) de la dirección (bits SSPIF, BF y UA
(SSPSTAT<1>) están activados).
2. Actualización del registro SSPADD con el segundo byte (menos peso) de la dirección
(borra bit UA y libera la línea SCL).
3. Lectura del registro SSPBUF (borra bit BF) y borrado del bit indicador SSPIF.
4. Recepción el segundo byte (bajo) de la dirección (se activan los bits SSPIF, BF y UA).
5. Actualiza del registro SSPADD con el primer byte (alto) de la dirección. Esto borrará el
bit UA y liberará la línea SCL.
6. Lectura del registro SSPBUF (borra bit BF) y borrado del bit SSPIF.
7. Recepción de la condición de Repetición de Arranque.
8. Recepción del primer byte (alto) de la dirección (se activan los bits SSPIF y BF).
9. Lectura del registro SSPBUF (se borra el bit BF) y borrado del bit indicador SSPIF.
Nota: A continuación de la condición de Repetición de Arranque (paso 7) en modo 10 bits, el
usuario sólo necesita encontrar los primeros 7 bits de la dirección, y no actualizará SSPADD
para la segunda mitad de la dirección.

9.2.1.2 RECEPCIÓN SERVIDOR


Microcontrolador PIC16F876 Página 57

Cuando el bit R / W del byte de dirección está borrado y sucede el reconocimiento de


dirección, el bit R / W del registro SSPSTAT se borra. La dirección recibida se carga en el
registro SSPBUF.

Cuando existe la condición de byte de dirección con desbordamiento, el pulso de


reconocimiento ACK no se produce. Entonces se define una condición de desbordamiento,
dada por el 1 del bit BF (SSPSTAT<0>) y el 1 del bit SSPOV (SSPCON<6>).

Se generará una interrupción SSP por cada byte de datos transferido. El bit indicador SSPIF
(PIR<3>) debe borrarse en el programa. El registro SSPSTAT se usa para determinar el estado
del byte recibido.

Nota: El registro SSPBUF debe cargarse si el SSPOV está a 1 y el indicador BF está a 0. Si se


produce una lectura de SSPBUF, pero el usuario no ha borrado el estado de SSPOV antes de
que ocurra la próxima recepción, ACK no se envía y el SSPBUF se cambia.

Tabla 9-2 ACCIONES DE BYTE RECIBIDO EN LA TRANSFERENCIA DE DATO


Bits de estado tal y como se SSPSR 
recibe la transferencia S Generación de Activación del bit SSPIF (Sucede la
S pulso ACK interrupción SSP si está habilitada)
BF SSPOV
P
0 0 Sí Sí Sí
1 0 No No Sí
1 1 No No Sí
0 1 Sí No Sí
Nota 1: Las celdas sombreadas muestran las condiciones donde el software del usuario no realizó adecuadamente el
borrado de la condición de desbordamiento.

9.2.1.3 TRANSMISIÓN SERVIDOR

Cuando el bit R / W del byte de la dirección entrante está activado y sucede un reconocimiento
de dirección, el bit R / W del registro SSPSTAT se activa. La dirección recibida se carga en el
registro SSPBUF. EL pulso ACK se enviará en el noveno bit, y la patilla SCL se mantendrá a
0. El dato transmitido debe cargarse en el registro SSPBUF, quien descargará, a su vez, sobre
SSPSR. En este momento, la patilla SCL se habilitará activando el bit CKP (SSPCON<4>). El
maestro debe vigilar la patilla SCL antes de asegurar otro impulso de reloj. El dispositivo
servidor se mantendrá desconectado del maestro, alargándose el reloj. Los ocho bits de datos se
desplazarán hacia fuera en el flanco de bajada de la entrada en SCL. Esto asegura que la señal
SDA es válida durante el tiempo en alto de SCL (Figura 9-7).

Se generará una interrupción por cada byte de dato transferido. El bit indicador SSPIF debe
borrarse por programa, y el registro SSPSTAT se usará para determinar el estado del byte
transferido. El bit indicador SSPIF se activa en el flanco de bajada del noveno impulso de reloj.
Microcontrolador PIC16F876 Página 58

Al igual que el servidor-transmisor, el pulso ACK desde el maestro receptor se memoriza en


el flanco de subida del noveno impulso en la entrada SCL. Si la línea SDA está en alto ( no
ACK ), la transferencia del dato es completa. Cuando el no ACK se memoriza por el
servidor, la lógica de éste se inicializa y el servidor espera otra aparición del bit de arranque
(start). Si la línea SDA está a 0 ( ACK ), el dato transmitido será cargado en el registro
SSPBUF, que, a su vez, se carga en el registro SSPSR. Entonces la patilla SCL se habilitará,
activando el bit CKP.

9.2.2 SOPORTE DE LA DIRECCIÓN DE LLAMADA GENERAL

El procedimiento de direccionamiento por el bus I2C es de tal manera que el primer byte
después de la condición de START determina qué dispositivo será el servidor seleccionado por
el maestro. La excepción es la dirección de llamada general, que puede seleccionar todos los
dispositivos. Cuando se usa esta dirección, todos los dispositivos deben, en teoría, responder
con un reconocimiento.

La dirección de llamada general es una de ocho direcciones reservadas para propuestas


específicas por el protocolo I2C. Consiste en todo ceros, con R / W también a 0.

La dirección de llamada general se reconoce cuando el bit de habilitación de llamada general


(GCEN) se habilita (SSPCON2<7> = 1). Siguiendo a la detección del bit de start, se
desplazarán 8 bits en SSPSR, y la dirección se compara con la de SSPADD. También se
compara con la dirección de llamada general fijada por hardware.
Microcontrolador PIC16F876 Página 59

Si la dirección de llamada general coincide, el SSPSR se transfiere al SSPBUF, el indicador BF


se activa (octavo bit), y en el flanco de bajada del noveno bit (bit ACK ) el indicador SSPIF se
activa.

Cuando se sirve una interrupción, la procedencia de la interrupción puede chequearse leyendo el


contenido de SSPBUF para determinar si la dirección fue específica del dispositivo o fue una
dirección de llamada general.

En modo 10-bit, el SSPADD se necesita para ser actualizado por la segunda mitad de la
dirección a reconocer, y el bit UA debe activarse (SSPSTAT<1>). Si se captura una dirección
de llamada general cuando GCEN está activo y el servidor está configurado en modo dirección
10-bit, la segunda mitad de la dirección no es necesaria, el bit UA no se activará, y el servidor
empezará recibiendo un dato después del reconocimiento (Figura 9-8).

9.2.3 OPERACIÓN SLEEP (ALERTA)

Aunque el dispositivo esté en modo SLEEP, el módulo I2C puede recibir datos o direcciones.
Cuando ocurra la transferencia de un byte completo, o dirección reconocida, se saca al
procesador del estado sleep (si está habilitada la interrupción SSP).

9.2.4 EFECTO DE UN RESET

Un reset inhibe al módulo SSP y determina la transferencia actual.


Microcontrolador PIC16F876 Página 60

TABLA 9-3: REGISTROS ASOCIADOS A LA OPERACIÓN I2C


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 POR, otros
BOR resets

0Bh,
8Bh,
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
10Bh,
18Bh
0Ch PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000

8Ch PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000

0Dh PIR2 --- (2) --- EEIF BCLIF --- --- CCP2IF -r-0 0--0 -r-0 0—0

8Dh PIE2 --- (2) --- EEIE BCLIE --- --- CCP2IE -r-0 0--0 -r-0 0—0

13h SSPBUF Registro de recepción y transmisión del Puerto Serie Síncrono xxxx xxxx uuuu uuuu

14h SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 0000 0000 0000 0000

91h SSPCON2 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN 0000 0000 0000 0000

94h SSPSTAT SMP CKE D/-A P S R/-W UA BF 0000 0000 0000 0000

x = Desconocido; u = Sin cambio; r = Reservado; --- = Sin implementar (se lee 0). Las celdas sombreadas no se
utilizan por SSP en modo I2C.
Nota 1: Estos bits se reservan en los dispositivos de 28 patillas; se deben mantener siempre a 0.
Nota2: Estos bits se reservan en estos dispositivos; se deben mantener a 0.

9.2.5 MODO MAESTRO

La operación del modo maestro está dirigida por la generación de interrupción en la detección
de las condiciones de START y STOP. Los bits de STOP (P) y START (S) se borran con un
reset o cuando el módulo MSSP está inhibido. El control del bus I2C puede acometerse cuando
el bit P está activado, o el bus está desconectado con el conjunto de los bits S y P borrados.

En modo maestro, las líneas SCL y SDA son manipuladas por el hardware de MSSP.

Los siguientes acontecimientos provocarán la activación del bit SSPIF, indicador de


interrupción de SSP, si la interrupción SSP está habilitada:
• Condición de START.
• Condición de STOP.
• Byte de transferencia de datos transmitido-recibido.
• Transmisión de reconocimiento.
• Repetición de arranque.

9.2.6 MODO MULTI-MAESTRO

En modo multi-maestro, la generación de la interrupción en la detección de las condiciones de


START y STOP permite la detección de la disponibilidad del bus. Los bits de STOP (P) y
START (S) se borran con un reset, o cuando se inhibe el módulo MSSP. El control del bus I 2C
se realiza cuando el bit P (SSPSTAT<4>) se activa, estando el bus desconectado con la pareja S
y P a 0. Cuando el bus está ocupado, habilitando la interrupción SSP se generará una
interrupción cuando llegue una condición de STOP.
Microcontrolador PIC16F876 Página 61

En operaciones multi-maestro, la línea SDA será chequeada para decidir si el nivel en la señal
es el nivel de salida esperado. Este chequeo se desarrolla por hardware, cuyo resultado lo tiene
el bit BCLIF.

Los estados en los que no existe toma de decisión, serán:


• Transferencia de dirección.
• Transferencia de dato.
• Condición de Start.
• Condición de repetición de Start.
• Condición de reconocimiento.

9.2.7 SOPORTE EN MODO I2C

El modo maestro se habilita, activando y borrando los bits apropiados SSPM, en el registro
SSPCON, y activando el bit SSPEN. Una vez que se habilita el modo maestro, el usuario tiene
seis opciones:
- Confirmar una condición start en SDA y SCL.
- Confirmar una condición de repetición de start en SDA y SCL.
- Escribir en el registro SSPBUF, iniciando así una transmisión de dato o dirección.
- Generar una condición de stop en SDA y SCL.
- Configurar el puerto I2C para recibir dato.
- Generar una condición de reconocimiento al final de la recepción del byte de datos.

Nota: El módulo MSSP, cuando se configura en modo maestro I 2C, no permite colas de espera
de sucesos. Por ejemplo, el usuario no puede iniciar una condición de start e, inmediatamente,
escribir el registro SSPBUF para iniciar una transmisión antes de completar la condición start.
En este caso, el registro SSPBUF no debe escribirse hasta que el bit WCOL esté activado. Éste
será el indicador de la escritura de SSPBUF.

9.2.7.1 OPERACIÓN EN MODO MAESTRO I2C

El dispositivo maestro genera toda una serie de impulsos de reloj y las condiciones de START y
STOP. Se finaliza una transferencia, con la condición de STOP o con la condición de repetición
de Start. Como quiera que la condición de Repetición de Start es también el comienzo de la
próxima serie transferida, el bus I2C no se desconectará.

En modo Maestro Transmisor, el dato serie se saca por SDA, mientras que la salida de reloj
serie es SCL. El primer byte transmitido contiene la dirección del dispositivo receptor servidor
(7 bits) y el bit de Lectura-Escritura ( R / W ). En este caso, el bit R / W será 0. El dato serie se
transmite en 8 bits en este instante. Después de transmitir cada byte, se recibe un bit de
reconocimiento. Se envían las condiciones de START y STOP para indicar el comienzo y el
final de la serie transmitida.

En modo Maestro Receptor, el primer byte transmitido contiene la dirección del servidor del
dispositivo transmisor (7 bits) y el bit R / W . En este caso, este bit deberá tener valor lógico 1.
Por esto, el primer byte transmitido es una dirección de servidor de 7 bits, seguido de un “1”
que indica bit de recepción. El dato serie se recibe vía SDA, y el reloj serie, por SCL. El dato
serie de 8 bits se recibe simultáneamente al reloj. Tras la recepción de cada byte, se transmite un
bit de reconocimiento. Las condiciones START y STOP indican el inicio y el final de la
transmisión.
Microcontrolador PIC16F876 Página 62

El generador de velocidad de transmisión (generador de baudios) utilizado para operación en


modo SPI, es ahora usado para programar la frecuencia de reloj de SCL, para 100 Khz., 400
Khz. o 1 Mhz , en operación I2C. El generador de baudios recarga el valor contenido en los 7
bits de menos peso del registro SSPADD. El generador de baudios comenzará,
automáticamente, contando con una escritura en SSPBUF. Una vez que la operación se
completa (p.e. transmisión del último bit de datos seguido por ACK), el reloj interno detiene
automáticamente la cuenta, y la patilla SCL permanece en su último estado.

Una secuencia típica de transmisión será


así:
a) El usuario genera la
Condición de Start
activando el bit de
habilitación de START
(SEN) en SSPCON2.
b) Se activa SSPIF. El módulo
esperará el tiempo
necesario de start antes
de que se produzca otra operación cualquiera.
c) El usuario carga SSPBUF con la dirección a transmitir.
d) La dirección se desplaza fuera de la patilla SDA hasta que son transmitidos los 8 bits.
e) El módulo MSSP da entrada al bit ACK proveniente del dispositivo servidor y escribe
este valor en el registro SSPCON2 (SSPCON2<6>).
f) El módulo genera una interrupción, al final del noveno ciclo de reloj, activando SSPIF.
g) El usuario carga el registro SSPBUF con los 8 bits de datos.
h) El dato se desplaza fuera de la patilla SDA hasta la transmisión completa de los 8 bits.
i) El módulo MSSP da entrada al bit ACK, proveniente del dispositivo servidor, y escribe
este valor en el registro SSPCON2 (SSPCON2<6>).
j) El módulo genera una interrupción al final del noveno ciclo de reloj, activando SSPIF.
k) El usuario genera una condición de STOP activando el bit de habilitación de STOP
(PEN) en el registro SSPCON2.
l) La interrupción se genera cada vez que se completa la condición de STOP.

9.2.8 GENERADOR DE BAUDIOS

En modo I2C, el valor de recarga para BRG se localiza en los 7 bits de menos peso del registro
SSPADD (Figura 9-10). Cuando se carga BRG con este valor, se inicia la cuenta atrás de BRG
hasta llegar a 0. En este momento, el contaje se detiene hasta que tiene lugar una nueva recarga.
El contador BRG se decrementa dos veces por ciclo de instrucción (T CY), en los relojes Q2 y
Q4.

En modo I2C, el contador BRG se recarga automáticamente. Si se produce arbitraje de reloj, por
ejemplo, el BRG se recargará cuando la patilla SCL se vea en alto (Figura 9-11).
Microcontrolador PIC16F876 Página 63

9.2.9 OSCILOGRAMAS DE LA CONDICIÓN DE START EN MODO MAESTRO I2C

Para iniciar una condición START, se activará el bit SEN, que habilita la condición de start,
registro SSPCON2<0>. Si las patillas SDA y SCL están en nivel alto, el generador de baudios
se recarga con el contenido de SSPADD<6:0> y se inicia el contaje. Si el grupo SCL y SDA
están en 1 cuando el generador de baudios termina (TBRG), la patilla SDA se pone a 0. La acción
de SDA, siendo puesta a 0 cuando SCL está a 1, es la condición de START, y hace que el bit S
se active (SSPSTAT<3> = 1). Después de esto, el generador de baudios se recarga con el
contenido del registro SSPADD<6:0> y continúa su contaje decremental. Cuando el generador
termina la cuenta (TBRG), el bit SEN (SSPCON2<0>) se borrará automáticamente por el
hardware. El generador de baudios se detiene, dejando la línea SDA a nivel bajo y completando
la condición de START.

Nota: Si al comienzo de la condición de START, las patillas SDA y SCL estaban ya en 0, o si


durante la condición de START la línea SCL se ve baja antes que la línea SDA, ocurre un
conflicto de bus. En este caso, se activa el indicador de conflicto de bus BCLIF, se suspende la
condición de START, y el módulo I2C se inicializa en su estado IDLE.

9.2.9.1 INDICADOR DE ESTADO WCOL

Si el usuario escribe el registro SSPBUF cuando está desarrollándose una secuencia START, se
activa WCOL, y el contenido del buffer permanece sin cambio.

Nota: Debido a que la cola de espera de acontecimientos no está permitida, escribiendo los
cinco bits de menor peso de SSPCON2 se inhibe hasta que la condición de START se complete.
Microcontrolador PIC16F876 Página 64

9.2.10 OSCILOGRAMAS DE LA CONDICIÓN DE REPETICIÓN DE START, EN MODO


MAESTRO I2C

Estamos ante una condición de Repetición de Start cuando el bit RSEN (SSPCON2<1>) se pone
en 1 y el módulo I2C está en estado desconectado. Cuando RSEN = 1, la patilla SCL se pone en
0. Cuando la patilla SCL se ve baja, el generador de baudios se carga con el contenido de
SSPADD<6:0> y comienza la cuenta. La patilla SDA se libera y se coloca a 1, y se convierte en

un contador generador de baudios (TBRG). Cuando este contador termina su tiempo, si SDA está
en alto, la patilla SCL se pondrá en alto. Cuando SCL se chequea en 1, el generador de baudios
se recarga con el contenido de SSPADD<6:0> y comienza la cuenta. SDA y SCL deben verse
en alto en un tiempo TBRG. Esta acción se sigue con la afirmación de la patilla SDA (SDA en
bajo) por un tiempo TBRG, mientras SCL está alta. A continuación de esto, el bit RSEN del
registro SSPCON2 se borrará automáticamente y el generador de baudios no se recargará,
dejando la patilla SDA en bajo. Tan pronto como se detecta la condición de start en las patillas
SDA y SCL, el bit S (SSPSTAT<3>) se activará. El bit SSPIF no se activará hasta que el
generador de baudios termine cuenta.

Nota 1: Si RSEN se programa mientras que otro suceso está desarrollándose, no se actualizará.

Nota 2: Sucede un conflicto de bus, durante la condición de Repetición de Start, si:


• Se detecta en bajo SDA cuando SCL pasa de cero a uno.
• SCL pasa a cero antes que SDA se estabilice en ese valor. Esto puede indicar que otro
maestro está intentando transmitir un dato “1”.

Inmediatamente a continuación de la puesta a 1 de SSPIF, el usuario puede escribir el SSPBUF


con los 7 bits de la dirección, en modo 7 bits, o la primera dirección prefijada en modo 10-bit.
Después de que se transmitan los primeros 8 bits, y se ha recibido ACK, el usuario puede,
entonces, transmitir ocho bits adicionales de dirección (en modo 10-bit), u ocho bits de datos
(en modo 7-bit).

9.2.10.1INDICADOR DE ESTADO WCOL

Si el usuario escribe el SSPBUF cuando una secuencia de Repetición de Start está en desarrollo,
WCOL se activa y el contenido del buffer no recibe el valor deseado (no se produce escritura).

Nota: A causa de que no se tolera la cola de sucesos, escribiendo los 5 bits de menor peso de
SSPCON2 se inhibe hasta que se completa la secuencia la condición de Repetición de Start.
Microcontrolador PIC16F876 Página 65

9.2.11 TRANSMISIÓN EN MODO MAESTRO I2C

La transmisión de un byte de datos, una dirección de 7 bits o cualquiera de las dos mitades de
una dirección de 10 bits, se consigue con una simple escritura del valor en el registro SSPBUF.
Esta acción activará el bit BF y llevará al generador de baudios a comenzar la cuenta y arrancar
la próxima transmisión. Cada bit de dirección-dato será desplazado fuera de la patilla SDA
después de la estabilización del flanco de bajada del reloj de SCL. Esta señal se mantendrá baja
durante una vuelta de contaje (TBRG) del generador de baudios. El dato será válido antes de que
SCL pase a nivel alto. Cuando la patilla SCL se pone a 1, se mantendrá de esa manera durante
un TBRG. El dato en la patilla SDA permanecerá estable durante ese tiempo, al que hay que
añadir el THOLD (que marcan las especificaciones eléctricas) después del próximo flanco de
bajada de SCL. Después de sacar los 8 bits fuera de la patilla SDA (en el flanco de bajada del
octavo reloj), el indicador BF se borra, y el maestro abandona SDA permitiendo al servidor
direccionado responder con un bit ACK , durante el noveno tiempo de bit, si existiese un
reconocimiento de dirección o si el dato se recibió correctamente. El estado de ACK se carga
en ACKDT en el flanco de bajada del noveno reloj. Si el maestro recibe un reconocimiento, el
estado del bit de reconocimiento (ACKSTAT) se borra. Si no, este bit estará a 1. Después del
noveno reloj, SSPIF se activa y el reloj maestro (generador de baudios) se suspende hasta que se
cargue el próximo byte de datos en SSPBUF, dejando SCL baja y SDA sin cambio (Figura 9-
14).

Después de la escritura de SSPBUF, cada bit de la dirección será desplazado fuera en el flanco
de bajada de SCL hasta completar los siete bits de dirección y el bit R / W . En el octavo flanco
de bajada, el maestro liberará la patilla SDA permitiendo al servidor responder con un
reconocimiento. En el noveno flanco de bajada, el maestro chequeará la patilla SDA para ver si
la dirección fue reconocida por el servidor. El estado del bit ACK se carga en el bit de estado
ACKSTAT (SSPCON2<6>). Después de que en el noveno reloj se transmita la dirección,
SSPIF se activa, el indicador BF se borra, y el generador de baudios se desconecta hasta que
otra escritura sobre SSPBUF tenga lugar, manteniendo SCL baja y llevando SDA a alta
impedancia (desconexión).

9.2.11.1INDICADOR DE ESTADO BF

En modo transmisión, el bit BF (SSPSTAT<0>) se activa cuando la CPU escribe en SSPBUF, y


se borra cuando los 8 bits han sido desplazados fuera.

9.2.11.2INDICADOR DE ESTADO WCOL


Microcontrolador PIC16F876 Página 66

Si el usuario escribe el SSPBUF cuando una transmisión todavía está en desarrollo (aún se está
sacando un byte de datos), WCOL se activa y el contenido del buffer no variará (no se produce
escritura). WCOL debe borrarse por software.

9.2.11.3INDICADOR DE ESTADO ACKSTAT

En modo transmisión, el bit ACKSTAT (SSPCON2<6>) se borra cuando el servidor ha enviado


un reconocimiento ( ACK = 0), y se activa cuando el servidor no hace el reconocimiento (
ACK = 1). Un servidor envía un reconocimiento cuando reconoce su dirección (incluso una
llamada general), o cuando el servidor ha recibido correctamente su dato.
Microcontrolador PIC16F876 Página 67
Microcontrolador PIC16F876 Página 68

9.2.12 RECEPCIÓN EN MODO MAESTRO I2C

La recepción en modo maestro se habilita programando el bit de habilitación de modo


recepción, RCEN (SSPCON2<3>).

Nota: El módulo SSP debe estar en estado desconectado antes de que el bit RCEN se active o el
bit RCEN se despreciará.

El generador de baudios comienza la cuenta, y, en cada pasada, el estado de la patilla SCL


cambiará y el dato se desplazará en el registro SSPSR. Después del octavo flanco de bajada, el
indicador de habilitación de recepción se borra automáticamente, el contenido de SSPSR se
carga en SSPBUF, el indicador BF se activa, el bit SSPIF se activa, y el generador de baudios se
detiene, manteniendo baja SCL. El SSP queda de nuevo en estado desconectado, esperando la
próxima orden. Cuando se lee el buffer SSPBUF por la CPU, el indicador BF se borra
automáticamente. El usuario puede ahora enviar un bit de reconocimiento, al final de la
recepción, activando el bit de habilitación de secuencia de reconocimiento ACKEN
(SSPCON2<4>).

9.2.12.1INDICADOR BF DE ESTADO

En operaciones de recepción, BF se activa cuando un byte de dirección o dato se carga en


SSPBUF desde SSPSR. Se borra cuando se lee SSPBUF.

9.2.12.2INDICADOR SSPOV DE ESTADO

En operaciones de recepción, SSPOV se activa cuando se han recibido los 8 bits en SSPSR y el
indicador BF está activado por una recepción previa.

9.2.12.3INDICADOR WCOL DE ESTADO

Si el usuario escribe SSPBUF cuando una recepción está desarrollándose, WCOL se activa y el
contenido del buffer no cambia (no se realiza la escritura).
Microcontrolador PIC16F876 Página 69
Microcontrolador PIC16F876 Página 70

9.2.13 OSCILOGRAMA DE LA SECUENCIA DE RECONOCIMIENTO

Para habilitar una secuencia de reconocimiento hay que activar el bit ACKEN (SSPCON2<4>),
de habilitación de la secuencia. Cuando este bit está activado, la patilla SCL se coloca a nivel
bajo y el contenido del bit de reconocimiento de dato aparece en la patilla SDA. Si el usuario
desea generar un reconocimiento, el bit ACKDT debe borrarse; si no, se activará el bit ACKDT
antes del inicio de la secuencia de reconocimiento. El generador de baudios desarrollará una
pasada, y la patilla SCL se libera (polarizada alta). Cuando la patilla SCL se escruta en alto, el
generador de baudios cuenta una vuelta (TBRG). La patilla SCL es ahora llevada a nivel bajo. A
continuación, el bit ACKEN se borra automáticamente, el generador de baudios se desconecta y
el módulo SSP va al modo desconectado (Figura 9-16).

9.213.1 INDICADOR WCOL DE ESTADO

Si el usuario escribe SSPBUF cuando una secuencia de reconocimiento no ha terminado,


WCOL se activa y el contenido del buffer no cambiará (la escritura se desprecia).

9.2.14 OSCILOGRAMA DE LA CONDICIÓN DE STOP

Un bit de stop se asegura en la patilla SDA, al final de la recepción-transmisión, programando el


bit PEN (SSPCON2<2>) de habilitación de la secuencia de Stop. Al final de la recepción-
transmisión, la línea SCL se mantiene baja después del noveno flanco de bajada. Cuando el bit
PEN se programa a 1, el maestro asegurará el nivel bajo de la línea SDA. Al verse en bajo la
línea SDA, el generador de baudios se recargará y comenzará su decremento hasta 0. Al
finalizar la cuenta, la patilla SCL se pondrá a nivel alto, y una vuelta del generador de baudios
después (TBRG) la patilla SDA será liberada. Cuando ésta se escrute en alto mientras SCL está en
1, el bit P (SSPSTAT<4>) se activará. Un tiempo TBRG después, el bit PEN se borra y el bit
SSPIF se activa (Figura 9-17).

Siempre que el microprograma decide tomar el control del bus, él primero determina si el bus
está ocupado, chequeando los bits S y P en el registro SSPSTAT. Si el bus está ocupado,
entonces la CPU puede ser interrumpida cuando se detecta un bit de Stop (indicador de bus
libre).
Microcontrolador PIC16F876 Página 71

9.2.14.1INDICADOR DE ESTADO WCOL

Si el usuario escribe SSPBUF cuando está desarrollándose una secuencia de STOP, el bit
WCOL se activa, y el contenido del buffer no cambia (se pierde la escritura).

9.2.15 ARBITRAJE DEL RELOJ

El arbitraje del reloj sucede cuando el maestro, durante una recepción, transmite, o repite
condición de start-stop, liberando la patilla SCL (SCL queda en estado flotante). En este
momento el generador de baudios (BRG) se suspende de contaje hasta que la patilla SCL se vea
realmente a nivel alto. Cuando esto suceda, el BRG se recarga con el contenido de
SSPADD<6:0> y comienza el contaje. Esto asegurará que el tiempo en alto de SCL será, al
menos, una vuelta de contaje de BRG, en el caso de que el reloj se fuerce a nivel bajo por un
dispositivo externo (Figura 9-18).
Microcontrolador PIC16F876 Página 72

9.2.16 OPERACIÓN SLEEP (ALERTA)

Mientras se está en modo sleep, el módulo I2C puede recibir direcciones o datos, y cuando
coincida la dirección o se complete una transferencia de byte, se saca al procesador del estado
sleep (si la interrupción SSP está habilitada).

9.2.17 EFECTOS DE UN RESET

Un reset inhibe al módulo SSP y determina la transferencia actual.

9.2.18 COMUNICACIONES MULTI-MAESTRO, CONFLICTO DE BUS Y ARBITRAJE


DE BUS

El funcionamiento del modo Multi-Maestro se consigue por arbitraje de bus. Cuando el maestro
saca bits de dirección o datos hacia la patilla SDA, el arbitraje se produce cuando el maestro
abandona SDA, dejándola flotante (alto). Si en este momento otro maestro coloca un 0 en esta
línea, como el dato esperado sobre SDA es un 1 y, se detectará conflicto de bus. El maestro
programará el indicador de interrupción por conflicto de bus, BCLIF, e inicializará el puerto I2C
llevándolo al estado desconectado (Figura 9-19).

Si está en desarrollo una transmisión cuando sucede el conflicto de bus, la transmisión se


detiene, el bit BF se borra, se liberan las líneas SDA y SCL, y SSPBUF puede volver a
escribirse. Cuando se utilice la rutina de servicio de interrupción de conflicto de bus, y esté libre
el bus I2C, el usuario puede continuar la comunicación confirmando una condición Start.

Si una condición Start, Repetición de Start, Stop, o Reconocimiento, está en desarrollo cuando
sucede el conflicto de bus, la condición se detiene, las líneas SDA y SCL se liberan, y los
respectivos bits de control, en el registro SSPCON2, se borran. Cuando el usuario entra en la
rutina de servicio de la interrupción del conflicto de bus, y el bus I2C está libre, puede continuar
la comunicación, asegurando una condición Start.

El maestro continuará la supervisión de las patillas SDA y SCL, y si sucede una condición de
Stop, se activará el bit SSPIF.

Una escritura sobre SSPBUF arrancará la transmisión del dato, con el primer bit de éste,
independientemente de donde se quedó el transmisor cuando se produjo el conflicto de bus.

En modo multi-maestro, la generación de la interrupción en la detección de las condiciones de


start o stop, permite determinar la disponibilidad del bus. El control del bus I2C puede realizarse
cuando se active el bit P, en el registro SSPSTAT, o se borren S y P, con el bus desconectado.
Microcontrolador PIC16F876 Página 73

9.2.18.1CONFLICTO DE BUS DURANTE UNA CONDICIÓN DE START

Durante una condición de START, un conflicto de bus se produce, si:


a) Las líneas SDA y SCL se ven en 0 al inicio de la condición de START (Figura 9-20).
b) SCL se detecta baja antes de asegurar el nivel bajo de SDA (Figura 9-21).

Durante una condición de Start, el conjunto de patillas SDA y SCL se supervisan si, la patilla SDA está
ya en bajo, o la patilla SCL está ya en bajo. Entonces: se suspende la condición de START, se
activa el bit indicador BCLIF, y se inicializa el módulo I2C, quedando en estado desconectado
(Figura 9-20).

La condición Start comienza con la liberación de las patillas SDA y SCL. Cuando la patilla
SDA se lee en 1, el generador de baudios se carga desde SSPADD<6:0> y comienza el contaje
decremental hasta 0. Si la patilla SCL se lee baja cuando SDA está en 1, sucede un conflicto de
bus porque está asumido que otro maestro está intentando enviar un 1 durante la condición de
Start.

Si la patilla SDA se lee baja durante este contaje, el generador de baudios se inicializa y la línea
SDA se libera enseguida (Figura 9-22). Si, no obstante, se lee un 1 en la patilla SDA, esta patilla
se pone baja al final de la cuenta de BRG. El generador de baudios se carga, entonces, y
comienza la cuenta a 0. Durante este tiempo, si la patilla SCL se lee en 0, el conflicto de bus no
se producirá. Al final de la cuenta de BRG, la patilla SCL se queda en nivel bajo.

Nota: La razón de que el conflicto de bus no sea un factor, durante la condición de START, es
que no pueden dos maestros, simultáneamente, asegurar una condición de START. Por
consiguiente, un maestro asegurará siempre la patilla SDA antes que el otro. Esta condición no
provoca conflicto de bus, porque los dos maestros estarán autorizados a decidir la primera
dirección siguiente a la condición de START. Si la dirección es la misma, la decisión será,
permitir continuar con la parte del dato, o condiciones de Repetición de START o STOP.
Microcontrolador PIC16F876 Página 74
Microcontrolador PIC16F876 Página 75

9.2.18.2CONFLICTO DE BUS DURANTE LA CONDICIÓN DE REPETICIÓN DE START.

Durante una condición de Repetición de Start, un conflicto de bus sucede si:


a) Se observa un nivel bajo en SDA cuando SCL va de bajo a alto.
b) SCL se pone en 0 antes que se asegure el 0 en SDA. Esto indicaría que otro maestro
esta intentando transmitir un 1.

Cuando el usuario deja la patilla SDA y ésta queda flotante, el generador de baudios se carga
con SSPADD<6:0> y comienza la cuenta a cero. La patilla SCL se libera entonces, y cuando se
observa en alto, la patilla SDA se memoriza. Si SDA es 0, ha ocurrido un conflicto de bus (por
ejemplo, que otro maestro esté intentando transmitir un “0”). Si, por otra parte, SDA se lee en 1,
el generador de baudios se recarga y comienza el contaje. Si SDA transita de alto a bajo antes
que el BRG termine su cuenta, no existirá conflicto de bus, porque no hay dos maestros
accediendo a SDA al mismo tiempo.

Sin embargo, si SCL cambia de alto a bajo antes que el BRG termine su cuenta, y SDA no está
estable, sucede un conflicto de bus. En cuyo caso, otro maestro está intentando transmitir un 1
durante la condición de Repetición de Start.

Si al final del tiempo de BRG, el conjunto SDA y SCL están todavía en alto, la patilla SDA se
pone a 0 y el BRG se recarga y comienza su cuenta. Al final de ésta, independientemente del
estado de la patilla SCL, ésta se pone a 0 y se completa la condición de Repetición de Start
(Figura 9-23).
Microcontrolador PIC16F876 Página 76

9.2.18.3CONFLICTO DE BUS DURANTE UNA CONDICIÓN DE STOP

Durante una condición de Stop, ocurre un conflicto de bus, si:


a) Después de que la patilla SDA ha sido liberada y puesta en estado flotante, SDA se
observa en 0 después del final de la cuenta de BRG.
b) Después de liberar la patilla SCL, ésta se lee en 0 antes de que SDA esté en 1.

La condición de STOP comienza fijando un 0 en SDA. Cuando ésta se lea en este valor, la
patilla SCL se deja flotante. Si esta patilla de observa en 1 (arbitraje de reloj), el BRG se carga
con SSPADD<6:0> y comienza el contaje. Al finalizar éste, se memoriza el valor de SDA. Si
estuviese en 0, un conflicto de bus ha tenido lugar. Esto habrá sucedido porque otro maestro
intenta enviar un 0. Si SCL se lee como 0 antes de que SDA quede flotante, no hay conflicto de
bus. Este es el caso de que otro maestro intente enviar un 0 (Figura 9-25).
Microcontrolador PIC16F876 Página 77

9.3 Consideraciones de conexión del bus I2C

Para dispositivos de modo estándar del bus I2C, los valores de resistores Rp y Rs, en la Figura
9-27, dependen de los siguientes parámetros:
• Tensión de alimentación.
• Capacidad del bus.
• Número de dispositivos conectados (corriente de entrada + corriente de fuga).

La tensión de alimentación limita el mínimo valor del resistor Rp, debido al mínimo valor
especificado de corriente de carga de 3 mA, para una tensión de salida especificada de V OL máx =
0,4V. Por ejemplo, con una tensión de alimentación de VDD = 5V +/- 10%, y una VOL máx = 0,4V
para 3 mA,

(5,5 − 0,4)
Rpmín = = 1,7 KΩ
0,003

VDD en función de Rp se muestra en la Figura 9-27. El margen de ruido deseado de 0,1•VDD para
el nivel bajo, limita el máximo valor de Rs. Opcionalmente se pueden agrupar en serie resistores
para mejorar la susceptibilidad a las descargas electrostáticas (ESD).

La capacidad del bus es la capacidad total del cableado, conectores y patillas. Esta capacidad
limita el valor máximo de Rp, debido al tiempo especificado de subida (Figura 9-27).

El bit SMP es el habilitador del control del tiempo de subida. Este bit está en el registro
SSPSTAT, y controla la velocidad de subida en las patillas de entrada-salida cuando se trabaja
en modo I2C (maestro o servidor).
Microcontrolador PIC16F876 Página 78

10.0 TRANSMISOR RECEPTOR ASÍNCRONO SÍNCRONO UNIVERSAL (USART)

El módulo USART es uno de los dos módulos de E-S serie. (La USART es también conocida
como Interface de Comunicaciones Serie (SCI).) La USART puede configurarse como sistema
asíncrono “full duplex”, que puede comunicarse con dispositivos periféricos como terminales
CRT y ordenadores personales, o puede configurarse como sistema síncrono “half duplex”, que
puede comunicarse con periféricos tales como circuitos integrados convertidores A/D y D/A,
EEPROMs serie, etc.

La USART puede configurarse en los siguientes modos:


• Asíncrono (full duplex).
• Síncrono-maestro (half duplex).
• Síncrono-servidor (half duplex).

El bit SPEN (RCSTA<7>) y los bits TRISC<7:6>) deben ser programados, en ese orden, para
configurar las patillas RC6/TX/CK y RC7/RX/DT como USART.

El módulo USART tiene, también, un multiprocesador de comunicación capaz de usar y


detectar 9 bits de dirección.

REGISTRO 10-1: TXSTA: REGISTRO DE CONTROL Y ESTADO DE TRANSMISIÓN


(DIRECCIÓN 98h)

R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0 R-1 R/W-0


CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D R = De lectura
W = De escritura
bit7 bit0
U = Sin implementar. Da 0 en
lectura
-n = Valor del reset POR

bit 7: CSRC: Bit de selección de origen de reloj.


Modo Asíncrono
Indiferente.
Modo Síncrono
1 = Modo Maestro (reloj interno procedente de BRG).
0 = Modo Servidor (reloj externo).
bit 6: TX9: Bit de habilitación de transmisión con 9 bits.
1 = Selección de transmisión con 9 bits.
0 = Selección de transmisión con 8 bits.
bit 5: TXEN: Bit de habilitación de transmisión.
1 = Transmisión habilitada.
0 = Transmisión inhibida.
Nota: SREN/CREN sustituyen a TXEN, en modo Síncrono.
bit 4: SYNC: Bit de selección de modo USART.
1 = Modo Síncrono.
0 = Modo Asíncrono.
bit 3: Sin implementar: Se lee como 0.
bit 2: BRGH: Bit de selección de velocidad de baudios.
Modo Asíncrono
1 = Alta velocidad.
0 = Baja velocidad.
Modo Síncrono
No usado en este modo.
bit 1: TRMT: Bit de estado del registro de desplazamiento de transmisión.
1 = TSR vacío.
0 = TSR lleno.
bit 0: TX9D: Noveno bit del dato transmitido. Puede ser el bit de paridad.
Microcontrolador PIC16F876 Página 79

REGISTRO 10-2: RCSTA: REGISTRO DE CONTROL Y ESTADO DE RECEPCIÓN


(DIRECCIÓN 18h)

R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R-0 R-0 R-x


SPEN RX9 SREN CREN ADDEN FERR OERR RX9D R = De lectura
W = De escritura
bit7 bit0 U = Sin implementar. Da 0 en lectura
-n = Valor del reset POR

bit 7: SPEN: Bit de habilitación de puerto serie.


1 = Puerto Serie habilitado (configurar RC7/RX/DT y RC6/TX/CK como patillas de puerto serie).
0 = Puerto Serie inhibido.
bit 6: RX9: Bit de habilitación de recepción con 9 bits.
1 = Selección de recepción con 9 bits.
0 = Selección de recepción con 8 bits.
bit 5: SREN: Bit de habilitación de recepción simple.
Modo Asíncrono
Irrelevante.
Modo Maestro Síncrono
1 = Recepción simple habilitada.
0 = Recepción simple inhibida.
Este bit se borra cuando se completa la recepción.
Modo Servidor Síncrono
No se usa en este modo.
bit 4: CREN: Bit de habilitación de recepción continua.
Modo Asíncrono
1 = Habilita la recepción continua.
0 = Inhibe la recepción continua.
Modo Síncrono
1 = Habilita recepción continua hasta borrado de CREN (éste sustituye a SREN).
0 = Inhibe la recepción continua.
bit 3: ADDEN: Bit de habilitación de detección de dirección.
Modo Asíncrono de 9 bits (RX9 = 1)
1 = Habilita la detección de la dirección, habilita la interrupción y carga el buffer receptor cuando
RSR<8> = 1
0 = Inhibe la detección de la dirección, todos los bytes se reciben, y el noveno bit puede usarse como
paridad
bit 2: FERR: Bit de error por inconcordancia (framing).
1 = Error de concordancia (bit STOP=0). Puede cambiarse leyendo el registro RCREG
y recibiendo un próximo byte válido
0 = No existe error.
bit 1: OERR: Bit de error por desbordamiento.
1 = Error de desbordamiento. Puede borrarse escribiendo 0 en el bit CREN.
0 = No existe error de desbordamiento.
bit 0: RX9D: Noveno bit del dato recibido. Puede ser el bit de paridad.
Microcontrolador PIC16F876 Página 80

10.1 Generador de baudios (BRG) de la USART

El BRG sirve a los modos síncrono y asíncrono de la USART. Es un contador de 8 bits,


especializado en generar la velocidad de circulación de los bits salientes o entrantes. El registro
SPBRG controla el período del temporizador independiente de 8 bits. En modo asíncrono, el bit
BRGH (TXSTA<2>) es el encargado de controlar la velocidad; en modo síncrono, este bit se
ignora. La tabla 10-1 muestra la fórmula para el cálculo de la velocidad de los baudios para
diferentes modos de la USART, solamente aplicada en modo maestro (reloj interno).

Elegidos una velocidad y Fosc dadas, el valor entero más próximo para SPBRG puede
calcularse usando la fórmula en la tabla 10-1, pudiendo, además, determinarse el valor del error
de velocidad existente para ese valor obtenido.

Será interesante el uso de alta velocidad (BRGH = 1), aun para menores valores de reloj. Esto
es así porque la ecuación Fosc / [16•(X + 1)] puede reducir el error de velocidad en ciertos
casos.

Escribir un nuevo valor en el registro SPBRG provoca el borrado del temporizador BRG. Esto
asegurará que el BRG no espere al final del tiempo antes de sacar una nueva velocidad.

10.1.1 CAPTURA

El dato en la patilla RC7/RX/DT se captura tres veces por un circuito detector de mayoría, que
determina el valor alto o bajo del dato presente en la patilla RX.

TABLA 10-1: FÓRMULA PARA CALCULAR LA VELOCIDAD


SYNC BRGH = 0 (Baja velocidad) BRGH = 1 (Alta velocidad)
0 Velocidad (Asíncrono) = Fosc / [64 • (X + 1)] Velocidad = Fosc / [16 • (X + 1)]
1 Velocidad (Síncrono) = Fosc / [4 • (X + 1)] No utilizado
X = valor en SPBRG (0 a 255)

TABLA 10-2: REGISTROS ASOCIADOS AL GENERADOR DE BAUDIOS


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
POR, BOR otros resets

98h TXSTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 -010 0000 -010
18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000x 0000 000x
99h SPBRG Registro Generador de Baudios 0000 0000 0000 0000
x = Desconocido; --- = Sin implementar (se lee 0). Las celdas sombreadas no se utilizan en el módulo BRG.
Microcontrolador PIC16F876 Página 81

TABLA 10-3: BAUDIOS EN MODO ASÍNCRONO (BRG = 0)


Fosc = 20 Mhz Fosc = 16 Mhz Fosc = 10 Mhz
BAUD Valor Valor Valor
% % %
(K) KBAUD decimal KBAUD decimal KBAUD decimal
ERROR ERROR ERROR
SPBRG SPBRG SPBRG
0,3 --- --- --- --- --- --- --- --- ---
1,2 1,221 1,75 255 1,202 0,17 207 1,202 0,17 129
2,4 2,404 0,17 129 2,404 0,17 103 2,404 0,17 64
9,6 9,766 1,73 31 9,615 0,16 25 9,766 1,73 15
19,2 19,531 1,72 15 19,231 0,16 12 19,531 1,72 7
28,8 31,250 8,51 9 27,778 3,55 8 31,250 8,51 4
33,6 34,722 3,34 8 35,714 6,29 6 31,250 6,99 4
57,6 62,500 8,51 4 62,500 8,51 3 52,083 9,58 2
ALTA 1,221 --- 255 0,977 --- 255 0,610 --- 255
BAJA 312,500 --- 0 250,000 --- 0 156,250 --- 0

BAUD Fosc = 4 Mhz Fosc = 3,6864 Mhz


(K) KBAUD % Valor KBAUD % Valor
ERROR decimal ERROR decimal
SPBRG SPBRG
0,3 0,300 0 207 0,301 0,33 185
1,2 1,202 0,17 51 1,216 1,33 46
2,4 2,404 0,17 25 2,432 1,33 22
9,6 8,929 6,99 6 9,322 2,90 5
19,2 20,833 8,51 2 18,643 2,90 2
28,8 31,250 8,51 1 --- --- ---
33,6 --- --- --- --- --- ---
57,6 62,500 8,51 0 55,930 2,90 0
ALTA 0,244 --- 255 0,218 --- 255
TABLA
BAJA 10-4:
62,500 BAUDIOS--- EN MODO
0 ASÍNCRONO
55,930 (BRG = 1)0
---
BAUD Fosc = 20 Mhz Fosc = 16 Mhz Fosc = 10 Mhz
(K) KBAUD % Valor KBAUD % Valor Valor
%
ERROR decimal ERROR decimal KBAUD decimal
ERROR
SPBRG SPBRG SPBRG
0,3 --- --- --- --- --- --- --- --- ---
1,2 --- --- --- --- --- --- --- --- ---
2,4 --- --- --- --- --- --- 2,441 1,71 255
9,6 9,615 0,16 129 9,615 0,16 103 9,615 0,16 64
19,2 19,231 0,16 64 19,231 0,16 51 19,531 1,72 31
28,8 29,070 0,94 42 29,412 2,13 33 28,409 1,36 21
33,6 33,784 0,55 36 33,333 0,79 29 32,895 2,10 18
57,6 59,524 3,34 20 58,824 2,13 16 56,818 1,36 10
ALTA 4,883 --- 255 3,906 --- 255 2,441 --- 255
BAJA 1250,00 --- 0 1000,00 --- 0
625,000 --- 0
0 0
Microcontrolador PIC16F876 Página 82

Fosc = 4 Mhz Fosc = 3,6864 Mhz


BAUD Valor Valor
% %
(K) KBAUD decimal KBAUD decimal
ERROR ERROR
SPBRG SPBRG
0,3 --- --- --- --- --- ---
1,2 1,202 0,17 207 1,203 0,25 185
2,4 2,404 0,17 103 2,406 0,25 92
9,6 9,615 0,16 25 9,727 1,32 22
19,2 19,231 0,16 12 18,643 2,90 11
28,8 27,798 3,55 8 27,965 2,90 7
33,6 35,714 6,29 6 31,960 4,88 6
57,6 62,500 8,51 3 55,930 2,90 3
ALTA 0,977 --- 255 0,874 --- 255
BAJA 250,000 --- 0 273,722 --- 0

10.2 USART en modo Asíncrono

En este modo, la USART emplea el formato estándar “no retorno a cero” (NRZ) (un bit de start,
ocho o nueve bits de datos y un bit de stop). El formato más común de datos es el de 8 bits. Se
utilizará un contador especializado, llamado generador de baudios, para obtener las frecuencias
del oscilador. La USART transmite y recibe, en primer lugar, el bit menos significativo (LSb).
Los bloques transmisor y receptor de la USART son funcionalmente independientes, pero usan
el mismo formato de datos y la misma velocidad de transferencia. El generador de baudios
produce una señal de reloj cada x16 o x64 de la velocidad de desplazamiento de bit,
dependiendo del bit BRGH (TXSTA<2>). La paridad no está soportada por el hardware, pero
puede implementarse por software (y almacenarse como el noveno bit del dato). El modo
Asíncrono se para durante el estado SLEEP, y se selecciona borrando el bit llamado SYNC
(TXSTA<4>).

El módulo Asíncrono USART consta de los siguientes elementos importantes:


• Generador de velocidad de baudios (generador de baudios o BRG).
• Circuito de captura.
• Transmisor asíncrono.
• Receptor asíncrono.

10.2.1 TRANSMISOR ASÍNCRONO USART

El diagrama a bloques del transmisor USART se muestra en la Figura 10-1. El corazón del
transmisor es el registro de desplazamiento de transmisión serie (TSR). El registro de
desplazamiento obtiene su dato del buffer de transmisión de lectura-escritura, TXREG. El
registro TXREG no se carga hasta que el bit de STOP, de la carga previa, ha sido transmitido.
Tan pronto como el bit de STOP se transmite, el TSR se carga con el nuevo dato proveniente
Microcontrolador PIC16F876 Página 83

del registro TXREG (si está disponible). Enseguida que el registro TXREG transmite su
contenido al registro TSR (sucede en un ciclo TCY), el registro TXREG queda vacío, y el bit
indicador TXIF (PIR1<4>) se activa. Esta interrupción puede habilitarse o inhibirse activando o
borrando, respectivamente, el bit de habilitación TXIE (PIE1<4>). El bit indicador se activará,
independientemente del estado del bit de habilitación TXIE, y no podrá borrarse por software.
Solamente se borrará cuando un nuevo dato se cargue en el registro TXREG. Mientras el bit
indicador TXIF señala el estado del registro TXREG, otro bit, TRMT (TXSTA<1>), muestra el

estado del registro TSR. El bit de estado TRMT es de lectura, y se activa cuando el registro TSR
está vacío. Ninguna interrupción está unida a este bit, de manera que el usuario debe consultar
este bit para determinar si el registro TSR está vacío.

Nota 1: El registro TSR no pertenece al mapa de memoria, por lo que no está disponible para el
usuario.
Nota 2: El indicador TXIF se activa cuando está activo el bit de habilitación TXEN. TXIF se
borra cargando el registro TXREG.

La transmisión se habilita activando el bit de habilitación TXEN (TXSTA<5>). La transmisión


actual no ocurrirá, hasta que el registro TXREG sea cargado con el dato, y el generador de
baudios (BRG) haya producido el reloj de desplazamiento (Figura 10-2). La transmisión puede
detenerse, primero cargando el registro TXREG, y activando después el bit de habilitación
TXEN. Normalmente, cuando la transmisión se ha iniciado primero, el registro TSR está vacío.
En este punto, transferir al registro TXREG dará como resultado una transferencia inmediata de
aquél a TSR, quedando un registro TXREG vacío. Por esto, es posible una transferencia en
oposición (back-to-back) (Figura 10-3). El borrado de TXEN durante una transmisión provocará
el abandono de ésta y la inicialización del transmisor. Como resultado, la patilla RC6/TX/CK
quedará en alta impedancia.

Para seleccionar una transmisión a 9 bits, el bit TX9 (TXSTA<6>) deberá activarse, y el noveno
bit deberá escribirse en TX9D (TXSTA<0>). El noveno bit se escribirá antes de cargar los 8 bits
de datos en el registro TXREG. Esto es necesario, porque al escribir un dato en el registro
TXREG puede tener lugar una transferencia inmediata del dato al registro TSR (si TSR está
vacío). En este caso, se habrá cargado un dato incorrecto de nueve bits en el registro TSR.

Los pasos a seguir para activar una transmisión Asíncrona, son:


1. Inicializar el registro SPBRG para la adecuada cadencia de bits. Si se desea un valor
alto, activar el bit BRGH. (Sección 10.1)
2. Habilitar el puerto serie asíncrono borrando el bit SYNC y activando el bit SPEN.
Microcontrolador PIC16F876 Página 84

3. Si se desea interrupción, activar el bit de habilitación TXIE.

TABLA 10-5: REGISTROS ASOCIADOS A LA TRANSMISIÓN ASÍNCRONA


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 POR, otros
BOR resets

OCh PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
18h RCSTA SPEN RX9 SREN CREN --- FERR OERR RX9D 0000 -00x 0000 -00x
19h TXREG Registro Transmisor USART 0000 0000 0000 0000
(1)
8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000
98h TXSTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 -010 0000 -010
99h SPBRG Registro Generador de Baudios 0000 0000 0000 0000
x = Desconocido; --- = Sin implementar (se lee 0). Las celdas sombreadas no se utilizan en transmisión asíncrona.
Nota 1: Los bits PSPIE y PSPIF se reservan en los PIC16F873/876; siempre han de mantenerse a cero.

4. Si se desea una transmisión en 9 bits, activar el bit TX9.


5. Habilitar la transmisión activando el bit TXEN, que también activará el bit TXIF.
6. Si se selecciona transmisión a 9 bits, el noveno bit se cargará en TX9D.
7. Cargar el dato en el registro TXREG (se inicia la transmisión).
Microcontrolador PIC16F876 Página 85

10.2.2 RECEPTOR ASÍNCRONO USART

En la Figura 10-4 se muestra el diagrama de bloques del receptor. El dato se recibe en la patilla
RC7/RX/DT y se conduce hasta el bloque Data Recovery (Recuperación de dato). Este bloque
es un circuito desplazador de alta velocidad que opera con una cadencia x16, considerando que
el desplazador del receptor serie principal opera a Fosc.

Al seleccionar el modo asíncrono, la recepción se habilita activando el bit CREN (RCSTA<4>).

El corazón del receptor es el registro de desplazamiento serie de recepción (RSR). Después de


la captura del bit de STOP, el dato recibido en el registro RSR se transfiere al registro RCREG
(si está vacío). Si la transferencia se completa, se activa el bit indicador RCIF (PIR1<5>). La
interrupción actual puede habilitarse-inhibirse, activando-borrando el bit de habilitación RCIE
(PIE1<5>). El bit RCIF es de lectura, y se borrará por hardware. Esto se producirá cuando el
registro RCREG se ha leído y queda vacío. El RCREG es un registro de doble buffer (una FIFO
de dos posiciones). Por esto es posible, simultáneamente, cargar RCREG desde la CPU,
transferir a RCREG desde el RSR, y comenzar a desplazar en RSR desde la patilla RX. Al
detectar el bit de STOP que entra por la patilla RX, si el registro RCREG está todavía lleno, se
activará el bit de error por desbordamiento OERR (RCSTA<1>). En este caso, la palabra
existente en RSR se perderá. El registro RCREG puede leerse dos veces seguidas para recuperar
los dos bytes de la FIFO. El bit OERR será borrado por software, borrando CREN. Si el bit
OERR está en 1, se inhibe la transferencia desde el registro RSR hasta el registro RCREG, por
lo que es vital borrar el bit OERR, si estuviese activado. El error de concordancia FERR
(RCSTA<2>) se activa si un bit de STOP se lee en nivel bajo. El bit FERR y el noveno bit
recibido se memorizan en el mismo canal que el dato recibido. Leyendo RCREG se cargarán los
bits RX9D y FERR con los nuevos valores. Por consiguiente, es necesario que el usuario lea el
registro RCSTA antes de leer el registro RCREG, para no perder los antiguos valores de FERR
y RX9D.

Para programar Recepción Asíncrona, hay que seguir los pasos siguientes:
1. Inicializar el registro SPBRG con la apropiada cadencia. Si se desea alta velocidad,
poner a 1 el bit BRGH. (Sección 10.1).
2. Habilitar el puerto serie asíncrono, borrando el bit SYNC y activando el bit SPEN.
3. Si se desea interrupción, activar el bit RCIE.
4. Si se desea recepción de 9 bits, activar RX9.
5. Habilitar la recepción, activando el bit CREN.
6. El indicador RCIF se activará cuando se complete la recepción. Esto generará una
interrupción, si está activado el bit RCIE.
7. Leer el registro RCSTA para obtener el valor del noveno bit (si está habilitado el modo)
y determinar si ha existido error durante la recepción.
8. Leer los 8 bits del dato recibido, leyendo el registro RCREG.
Microcontrolador PIC16F876 Página 86

9. Si ha ocurrido algún error, cancelar éste borrando el bit de habilitación CREN.

TABLA 10-6: REGISTROS ASOCIADOS A LA RECEPCIÓN ASÍNCRONA


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 POR, otros
BOR resets

OCh PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
18h RCSTA SPEN RX9 SREN CREN --- FERR OERR RX9D 0000 -00x 0000 -00x
1Ah RCREG Registro Receptor USART 0000 0000 0000 0000
(1)
8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000
98h TXSTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 -010 0000 -010
99h SPBRG Registro Generador de Baudios 0000 0000 0000 0000
x = Desconocido; --- = Sin implementar (se lee 0). Las celdas sombreadas no se utilizan en recepción asíncrona.
Nota 1: Los bits PSPIE y PSPIF se reservan en los PIC16F873/876; siempre han de mantenerse a cero.
Microcontrolador PIC16F876 Página 87

10.2.3 PROGRAMACIÓN DE MODO 9 BITS CON DETECCIÓN DE DIRECCIÓN

El µ C puede trabajar con varios servidores conectados a la misma línea serie. La forma de
seleccionar a uno cualquiera es por el envío de un byte, que será interpretado por el servidor
como una dirección identificativa debido a que en el envío de esta dirección el noveno bit estará
a 1. Así pues, los receptores deberán programarse inicialmente con recepción de 9 bits y
detección de dirección. Esto pondrá a 1 los bits RX9 y ADDEN de la figura 10.6. Cuando llegue
un byte en serie, si el bit noveno (RSR<8> de la figura 10.6) es 1, debido a la acción de la
puerta AND-3, el byte recibido en RSR se transferirá al registro RCREG. Esto provocará la
interrupción de recepción (si estuviese habilitada) y el software del receptor mirará el registro
RCSTA para ver si ha habido error y si el noveno bit es 1. Si es así, el byte recibido se interpreta
como el código de una dirección, y se comparará con el código intrínseco de ese receptor. Si
hay coincidencia, se borrará ADDEN para que los próximos bytes enviados a él puedan llegar
hasta RCREG por la puerta OR de ceros (ya que ahora el noveno bit enviado por el maestro será
un 0, indicativo de byte de datos). A partir de este momento, cada llegada de byte supondrá una
interrupción para el receptor, que se limitará a tomar los datos enviados.

Como a cada recepción el software receptor comprobará el nivel de RSR<8>, cuando éste sea 1
(porque el transmisor desea enviar dirección), el receptor comprobará que el byte recibido
corresponde o no a su dirección intrínseca. Si la dirección recibida es la suya, todo seguirá igual
y el receptor tomará los bytes enviados. Si al comprobar el byte de dirección ésta no coincidiese
con la suya, el receptor sabe que los próximos envíos de datos no van a ser para él. Pondrá su bit
ADDEN a 1 para impedir que se carguen en su RCREG bytes de datos que no son para él y, de
esta forma, se impide que se le interrumpa en cada dato recibido. (Obsérvese que si ponemos a 1
el bit ADDEN la puerta OR de ceros dará 0 de salida pero la NAND-3 puede dar 1, y con ello
permitir la entrada del byte a RCREG cuando se reciba un byte de dirección, que tendrá
RSR<8> a 1.) Con todo lo explicado se comprende que ahora, el receptor, solamente cargará un
byte en RCREG cuando aquél lleve el noveno bit a 1. Cuando esto ocurra, de nuevo se
comprobará el byte identificativo de dirección para ver si vuelve a ser seleccionado.

Cuando se programe Recepción Asíncrona con Habilitación de Detección de Dirección,


respétense los siguientes pasos:
1. Inicializar el registro SPBRG con la apropiada cadencia. Si se desea alta velocidad,
poner a 1 el bit BRGH. (Sección 10.1).
2. Habilitar el puerto serie asíncrono, borrando el bit SYNC y activando el bit SPEN.
3. Si se desea interrupción, activar el bit RCIE.
4. Si se desea recepción de 9 bits, activar RX9.
5. Activar ADDEN para habilitar la detección de la dirección.
6. Habilitar la recepción, activando el bit CREN.
7. El indicador RCIF se activará cuando se complete la recepción. Esto generará una
interrupción, si está activado el bit RCIE.
8. Leer el registro RCSTA para obtener el valor del noveno bit y determinar si ha existido
error durante la recepción.
9. Leer los 8 bits del dato recibido, leyendo el registro RCREG. Esto permitirá saber si el
dispositivo está siendo direccionado.
10. Si ha ocurrido algún error, cancelarlo, borrando el bit de habilitación CREN.
11. Si el dispositivo ha sido direccionado, borrar el bit ADDEN para permitir que sean
leídos los bytes de dato y dirección en el buffer receptor, e interrumpir a la CPU.
Microcontrolador PIC16F876 Página 88
Microcontrolador PIC16F876 Página 89

TABLA 10-7: REGISTROS ASOCIADOS A LA RECEPCIÓN ASÍNCRONA


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
POR, BOR otros resets

OCh PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000

18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000x 0000 000x

1Ah RCREG Registro Receptor USART 0000 0000 0000 0000


(1)
8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000

98h TXSTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 -010 0000 -010

99h SPBRG Registro Generador de Baudios 0000 0000 0000 0000

x = Desconocido; --- = Sin implementar (se lee 0). Las celdas sombreadas no se utilizan en recepción asíncrona.
Nota 1: Los bits PSPIE y PSPIF se reservan en los PIC16F873/876; siempre han de mantenerse a cero.

10.3 USART en modo Maestro Síncrono

En el modo Maestro Síncrono, el dato se transmite en half-duplex (no pueden darse,


simultáneamente, la transmisión y la recepción). Cuando se transmite un dato, la recepción
queda inhibida, y viceversa. El modo Síncrono se programa activando el bit SYNC
(TXSTA<4>). Además, hay que activar el bit de habilitación SPEN (RCSTA<7>) y, por este
orden, configurar las patillas RC6/TX/CK y RC7/RX/DT, la línea de reloj CK y la de dato DT.
El modo Maestro indica que el procesador transmite el reloj maestro en la línea CK. El modo
Maestro se programa activando el bit CSRC (TXSTA<7>).
Microcontrolador PIC16F876 Página 90

10.3.1 TRANSMISIÓN DE USART EN MODO MAESTRO SÍNCRONO

El diagrama de bloques del transmisor de la USART se muestra en la Figura 10-6. El corazón


del transmisor es el registro de desplazamiento de transmisión serie TSR. El registro de
desplazamiento obtiene su dato del buffer del registro TXREG, quien, a su vez, obtendrá el dato
por software. El registro TSR no se carga hasta que se ha transmitido el último bit del dato
previo. Tan pronto como sea transmitido el último bit, el TSR se cargará con el nuevo dato
procedente de TXREG (si está disponible). Mientras que TXREG transmite el dato a TSR (esto
sucede en un ciclo Tcycle), el TXREG se vacía, activándose el bit de petición de interrupción
TXIF (PIR1<4>). La interrupción puede habilitarse o inhibirse, activando o borrando,
respectivamente, el bit TXIE (PIE1<4>). El bit indicador TXIF se activará, independientemente
del estado del bit TXIE, y no podrá borrarse por software. Solamente se borra cuando un nuevo
dato se carga en el registro TXREG. Mientras que el bit TXIF indica el estado del registro
TXREG, otro bit, TRMT (TXSTA<1>), muestra el estado del registro TSR. TRMT es un bit de
lectura, que se activa cuando TSR queda vacío. Ninguna interrupción lógica va unida a este bit;
el usuario deberá consultarlo para determinar si TSR está vacío. TSR no pertenece al bloque
memoria de registros, por lo que no es utilizable por el usuario.

La transmisión se habilita activando el bit TXEN (TXSTA<5>. La transmisión actual no se


iniciará hasta que el registro TXREG haya sido cargado con un dato. El primer bit del dato, será
transmitido fuera de la patilla con la próxima subida de reloj disponible en la línea CK. El dato
saliente será estable con el flanco de bajada del reloj síncrono (Figura 10-9). La transmisión
puede detenerse, cargando primero el registro TXREG, y luego activando el bit TXEN (Figura
10-10). Esto es preferible cuando se selecciona baja velocidad, ya que el BRG está en reset
cuando los bits TXEN, CREN y SREN están a cero. Activando el bit TXEN arrancará BRG,
produciendo un reloj de desplazamiento inmediatamente. Normalmente, con la primera
transmisión, el registro TSR está vacío, así que una transferencia sobre TXREG dará como
resultado una inmediata transferencia a TSR, quedando vacío el TXREG. Será posible la
transferencia en oposición.

Borrando el bit TXEN durante la transferencia, se producirá que se cancel la transmisión y se


inicialice el transmisor. Las patillas DT y CK volverán al estado de alta impedancia. Si
cualquiera de los dos bits CREN o SREN se activan durante la transmisión, ésta se cancela y la
patilla DT vuelve al estado de alta impedancia (queda lista para recepción). La patilla CK
permanece como salida si el bit CSRC está activo (reloj interno). La lógica de transmisión, sin
embargo, no se inicializa, aunque se desconecta de las patillas. Para inicializar el transmisor, el
usuario ha de borrar el bit TXEN. Si SREN está activo, después de recibir una única palabra, el
bit SREN se borrará y el puerto serie retorna a transmisor, ya que el bit TXEN está todavía
activado. La línea DT conmuta inmediatamente desde alta impedancia en modo receptor, a
modo transmisor, y arranca la conducción. Para evitar esto, se borrará el bit TXEN.

Para seleccionar transmisión con 9 bits, TX9 (TXSTA<6>) se activará y el noveno bit se
escribirá en TX9D (TXSTA<0>). El noveno bit debe escribirse antes de escribir los 8 bits del
dato en el registro TXREG. Esto es porque el dato escrito en TXREG puede transferirse
inmediatamente al registro TSR (si éste estuviese vacío), dando como resultado la carga de los 8
bits del dato actual con el valor antiguo del noveno bit.

Los pasos a seguir para programar Maestro en Transmisión Síncrona, son:


1. Inicializar el registro SPBRG con la apropiada cadencia.
2. Habilitar el puerto serie como maestro síncrono, programando los bits SYNC, SPEN y
CSRC.
3. Si se desean interrupciones, programar el bit TXIE.
4. Si se desea transmisión en 9 bits, programar el bit TX9.
Microcontrolador PIC16F876 Página 91

5. Habilitar la transmisión activando el bit TXEN.


6. Si se ha seleccionado transmisión con 9 bits, cargar el noveno bit en TX9D.
7. Arrancar la transmisión cargando el dato en el registro TXREG.

TABLA 10-8: REGISTROS ASOCIADOS AL MAESTRO EN TRANSMISIÓN SÍNCRONA


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
POR, BOR otros resets

OCh PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000

18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 -00x 0000 -00x

19h TXREG Registro Transmisor USART 0000 0000 0000 0000


(1)
8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000

98h TXSTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 -010 0000 -010

99h SPBRG Registro Generador de Baudios 0000 0000 0000 0000

x = Desconocido; - = Sin implementar (se lee 0). Las celdas sombreadas no se utilizan en recepción asíncrona.
Nota 1: Los bits PSPIE y PSPIF se reservan en los dispositivos de 28 patillas; siempre han de mantenerse a cero.
Microcontrolador PIC16F876 Página 92

10.3.2 USART MAESTRO EN RECEPCIÓN SÍNCRONA

Una vez seleccionado el modo síncrono, la recepción se habilita programado cualquiera de los
dos bits SREN (RCSTA<5>) o CREN (RCST<4>). El dato se captura en la patilla RC7/RX/DT
en el flanco de bajada del reloj. Si está activado el bit SEN, solamente se recibirá una palabra; si
está habilitado el bit CREN, la recepción será continua hasta el borrado de CREN. Si se han de
activar ambos bits, el primero en hacerlo será CREN. Después de la entrada del último bit, el
dato recibido en el registro receptor RSR se transferirá al registro RCREG (si está vacío).
Cuando se complete la transferencia, se activará el indicador de interrupción RCIF (PIR1<5>).
La interrupción actual puede habilitarse o inhibirse, activando o borrando, respectivamente, el
bit RCIE (PIE1<5>). El indicador RCIF es sólo de lectura, y se borrará por hardware cuando se
lea el registro RCREG y éste quede vacío. El registro RCREG es de doble buffer (una FIFO de
dos posiciones). Por esto es posible, simultáneamente, cargar RCREG desde la CPU, transferir a
RCREG desde el RSR, y comenzar a desplazar en RSR desde la patilla RX. Al detectar el bit de

STOP que entra por la patilla RX, si el registro RCREG está todavía lleno, se activará el bit de
error por desbordamiento OERR (RCSTA<1>). En este caso, la palabra existente en RSR se
perderá. El registro RCREG puede leerse dos veces seguidas para recuperar los dos bytes de la

FIFO. El bit OERR se borrará por software borrando CREN. Si el bit OERR está en 1, se inhibe
la transferencia desde el registro RSR hasta el registro RCREG, por lo que es vital borrar el bit
Microcontrolador PIC16F876 Página 93

OERR, si estuviese activado. El noveno bit recibido se memoriza en el mismo latch que el dato
recibido. Leyendo RCREG se cargará el bit RX9D con el nuevo valor, por consiguiente, es
esencial para el usuario leer el registro RCSTA, antes de leer el registro RCREG, para no perder
la información en RX9D.

Los pasos a seguir cuando se programe Maestro en Recepción Síncrona, son:


1. Inicializar el registro SPBRG con la apropiada cadencia. (Sección 10.1).
2. Habilitar el puerto serie maestro síncrono programando los bits SYNC, SPEN y CSRC.
3. Asegurar el borrado de los bits CREN y SREN.
4. Si se desea interrupción, activar el bit RCIE.
5. Si se desea recepción de 9 bits, activar RX9.
6. Si se desea una recepción, activar el bit SREN; para recepción continua, activar CREN.
7. El indicador RCIF se activará cuando se complete la recepción. Esto generará una
interrupción, si está activado el bit RCIE.
8. Leer el registro RCSTA para tener el valor del noveno bit (si está habilitado el modo) y
determinar si ha existido error durante la recepción.
9. Leer los 8 bits del dato recibido, leyendo el registro RCREG.
10. Si ha ocurrido algún error, cancelarlo borrando el bit de habilitación CREN.

TABLA 10-9: REGISTROS ASOCIADOS AL MAESTRO EN RECEPCIÓN SÍNCRONA


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 POR, otros
BOR resets

OCh PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
18h RCSTA SPEN RX9 SREN CREN --- FERR OERR RX9D 0000 -00x 0000 -00x
1Ah RCREG Registro Receptor USART 0000 0000 0000 0000
(1)
8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000
98h TXSTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 -010 0000 -010
99h SPBRG Registro Generador de Baudios 0000 0000 0000 0000
x = Desconocido; --- = Sin implementar (se lee 0). Las celdas sombreadas no se utilizan en recepción asíncrona.
Nota 1: Los bits PSPIE y PSPIF se reservan en los dispositivos de 28 patillas; siempre han de mantenerse a cero.
Microcontrolador PIC16F876 Página 94

10.4 USART SERVIDOR EN MODO SÍNCRONO

El modo Servidor Síncrono difiere del modo Maestro en el hecho de que el reloj se suministra
externamente a la patilla RC6/TX/CK. Esto permite al dispositivo transferir o recibir datos,
incluso en el estado SLEEP. Se entra en modo servidor, borrando el bit CSRC (TXSTA<7>).

10.4.1 USART EN TRANSMISIÓN SÍNCRONA COMO SERVIDOR

La operativa en modo síncrono maestro y servidor es idéntica, excepto en el caso del estado
SLEEP.

Si se escriben dos palabras en TXREG, y se ejecuta entonces una instrucción SLEEP, ocurrirá
lo siguiente:
a) La primera palabra será inmediatamente transferida al registro TSR y transmitida.
b) La segunda palabra permanecerá en el registro TXREG.
c) El bit indicador TXIF no se activará.
d) Cuando la primera palabra haya salida de TSR, el registro TXREG transferirá la
segunda palabra al TSR, y el bit TXIF se activará por primera vez.
e) Si el bit de habilitación TXIE está activado, la interrupción saca el chip del estado
SLEEP, y si las interrupciones globales están habilitadas, el programa saltará al vector
de interrupción 0004h.

Los pasos a seguir para programar una Transmisión Síncrona como Servidor, son:

1. Habilitar el puerto serie síncrono servidor, activando los bits SYNC y SPEN, y
borrando CSRC.
2. Borrar los bits CREN y SREN.
3. Si se desea interrupción, activar el bit de habilitación TXIE.
4. Si se desea transmisión con 9 bits, activar el bit TX9.
5. Habilitar la transmisión, activando el bit TXEN.
6. Si se ha seleccionado 9 bits, el noveno bit se cargará en TX9D.
7. La transmisión comienza cargando el dato en el registro TXREG.

10.4.2 USART EN RECEPCIÓN SÍNCRONA COMO SERVIDOR

La operación como maestro y servidor síncronos es idéntica, excepto en el caso del modo
SLEEP. En modo servidor, el bit SREN es indiferente.

Si está habilitada la recepción, porque se activó el bit CREN antes de la instrucción SLEEP,
podrá recibirse una palabra aunque esté en estado SLEEP. A la completa recepción de esta
palabra, el registro RSR transferirá el dato en su poder al registro RCREG, y, si el bit de
habilitación de interrupción RCIE está activado, la interrupción generada sacará al dispositivo
del estado SLEEP. Si las interrupciones globales están habilitadas, el programa saltará al vector
de interrupción 0004h.

Los pasos a seguir para programar una Recepción Síncrona como Servidor, son:
1. Habilitar el puerto serie síncrono servidor, activando los bits SYNC y SPEN, y
borrando CSRC.
2. Si se desea interrupción, activar el bit de habilitación RCIE.
3. Si se desea recepción con 9 bits, activar el bit RX9.
4. Habilitar la recepción, activando el bit CREN.
Microcontrolador PIC16F876 Página 95

5. El indicador RCIF se activará cuando se complete una recepción. Se generará una


interrupción, si el bit RCIE se activó en su momento.
6. Leer el registro RCSTA para obtener el noveno bit (si se programó 9 bits) y determinar
si ha habido error durante la recepción.
7. Leer los 8 bits de datos, efectuando la lectura del registro RCREG.
8. Si hubiese algún error, borrar éste escribiendo 0 en CREN.

TABLA 10-10: REGISTROS ASOCIADOS AL SERVIDOR EN TRANSMISIÓN SÍNCRONA


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
POR, BOR otros resets

OCh PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000

18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000x 0000 000x

19h TXREG Registro Transmisor USART 0000 0000 0000 0000

8Ch PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000

98h TXSTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 -010 0000 -010

99h SPBRG Registro Generador de Baudios 0000 0000 0000 0000

x = Desconocido; --- = Sin implementar (se lee 0). Las celdas sombreadas no se utilizan en recepción asíncrona.
Nota 1: Los bits PSPIE y PSPIF se reservan en los dispositivos de 28 patillas; siempre han de mantenerse a cero.

TABLA 10-11: REGISTROS ASOCIADOS AL SERVIDOR EN RECEPCIÓN SÍNCRONA


Valor tras Valor tras
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
POR, BOR otros resets

OCh PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000

18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000x 0000 000x

1Ah RCREG Registro Receptor USART 0000 0000 0000 0000

8Ch PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000

98h TXSTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 -010 0000 -010

99h SPBRG Registro Generador de Baudios 0000 0000 0000 0000

x = Desconocido; --- = Sin implementar (se lee 0). Las celdas sombreadas no se utilizan en recepción asíncrona.
Nota 1: Los bits PSPIE y PSPIF se reservan en los dispositivos de 28 patillas; siempre han de mantenerse a cero.
Microcontrolador PIC16F876 Página 96

11.0 MÓDULO CONVERTIDOR ANALÓGICO-DIGITAL (CAD)

El módulo CAD posee cinco entradas para dispositivos de 28 patillas, y ocho para el resto de
dispositivos.

La entrada analógica carga un condensador de muestreo y retención. La salida de este circuito


de muestreo y retención es la entrada al convertidor. Éste, genera un resultado binario, función
del nivel analógico presente en la entrada, por medio de un CAD tipo aproximaciones sucesivas.
La conversión digital es un número de 10 bits. El módulo CAD posee entrada de referencia de
tensión baja y alta, que el software seleccionará en combinación con VDD, VSS, RA2 o RA3.

El CAD posee una característica única: está hábil para operar, incluso en el modo SLEEP. Para
trabajar en sleep, el reloj del CAD debe derivarse hacia el oscilador RC interno, expresamente
diseñado para él.

El módulo CAD posee cuatro registros, que son:


• Registro Alto del Resultado A/D (ADRESH).
• Registro Bajo del Resultado A/D (ADRESL).
• Registro 0 de Control A/D (ADCON0).
• Registro 1 de Control A/D (ADCON1).

El registro ADCON0, mostrado el REGISTER 11-1, controla la operación del módulo A/D. El
registro ADCON1, mostrado en REGISTER 11-2, configura la función de las patillas de los
puertos. Éstas, pueden configurarse como entradas analógicas (RA3 también puede ser la
tensión de referencia) o como entradas-salidas digitales.
Microcontrolador PIC16F876 Página 97

REGISTRO 11-2: REGISTRO ADCON1 (DIRECCIÓN 9Fh)

R/W-0 U- U- U- R/W-0 R/W-0 R/W-0 R/W-0


0 0 0 R = De lectura
ADFM --- --- --- PCFG3 PCFG2 PCFG1 PCFG0
W = De escritura
bit7 bit0 U = Sin implementar. Da 0 en
lectura
-n = Valor del reset POR

bit 7: ADFM: Bit de selección de formato de resultado A/D.


1 = Justificación derecha. Los 6 bits más significativos de ADRESH se leen como 0.
0 = Justificación izquierda. Los 6 bits menos significativos de ADRESL se leen como 0.
bit 6- Sin implementar: Se lee como 0.
bit 3- PCFG3:PCFG0: Bits de control de configuración de puerto A/D.
Esta en la tabla inferior

PCFG3: AN7(1) AN6(1) AN5(1) AN4 AN3 AN2 AN1 AN0 CHAN /
VREF+ VREF-
PCFG0 RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0 Rets(2)
0000 A A A A A A A A VDD VSS 8/0
0001 A A A A VREF+ A A A RA3 VSS 7/1
0010 D D D A A A A A VDD VSS 5/0
0011 D D D A VREF+ A A A RA3 VSS 4/1
0100 D D D D A D A A VDD VSS 3/0
0101 D D D D
REGISTRO 11-1: REGISTRO ADCON0 (DIRECCIÓN V REF + D 1Fh) A A RA3 VSS 2/1
011x D D D D D D D D VDD VSS 0/0
1000 A A A A VREF+ VREF- A A RA3 RA2 6/2
R/W-0
1001 R/W-0 D R/W-0D R/W-0 AR/W-0 A R/W-0 A U-A R/W-0 A A VDD VSS 6/0
0 RA = De lectura
1010 D D A
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/-DONE A V REF + A
--- ADON A RA3 VSS 5/1
W = De escritura
1011
bit7 D D A A V REF + V REF- bit0A A RA3 RA2
U = Sin implementar. Da
4/2
0 en
1100 D D D A VREF+ VREF- A A
lectura RA3 RA2 3/2
1101 D D D D VREF+ VREF- A -nA= ValorRA3
del reset RA2
POR 2/2
1110 D D D D D D D A VDD VSS 1/0
bit 7- ADCS1:ADCS0: Bit de selección de reloj para CAD.
1111 00 = Fosc
D / 2. D D D VREF+ VREF- D D RA3 RA2 1/2
A = Entrada analógica.
01 = Fosc / 8.
10 = Fosc / 32.
D = Entrada-salida digital.
Nota 1:11 = FRC
Estos (relojnoderivado
canales de un oscilador
están disponibles en losRC interno). de 28 patillas.
dispositivos
bitNota
5- 2:CHS2:CHS0:
Esta columna Bit
indica el númerode
de selección decanal
canales analógicos disponibles como entradas A/D, y el número de
analógico.
canales
000 analógicos
= Canal utilizados como entradas de referencia de tensión.
0 (RA0/AN0).
001 = Canal 1 (RA1/AN1).
010 = Canal 2 (RA2/AN2).
011 = Canal 3 (RA3/AN3).
100 = Canal 4 (RA4/AN4).
101
… No existen más canales en dispositivos de 28 patillas.
111
bit 2: GO/-DONE: Bit de estado de conversión A/D.
Si ADON = 1
1 = Conversión A/D en desarrollo (programando este bit, se inicia la conversión).
0 = Conversión detenida o finalizada (se borra por el hardware cuando finaliza la conversión A/D).
bit 1: No está implementado: Se lee como 0.
bit 0: ADON: Bit de inicio de conversión A/D.
1 = Módulo CA/D operativo.
0 = Modúlo CA/D desconectado (se reduce el consumo del chip).
Microcontrolador PIC16F876 Página 98

Los registros ADRESH:ADRESL contienen los 10 bits del resultado de la conversión A/D.
Cuando ésta se completa, el resultado binario se carga en esta pareja de registros del resultado,
el bit GO / DONE (ADCON0<2>) se borra, y el bit indicador de interrupción ADIF se activa.
El diagrama de bloques del módulo A/D se muestra en la Figura 11-1.

Después de configurar el módulo A/D como se desea, el canal seleccionado será leído antes de
iniciar la conversión. El canal analógico de entrada debe tener su correspondiente bit del
registro TRIS programado como entrada. Pasado el tiempo de adquisición, la conversión A/D
puede iniciarse. Los pasos siguientes deberán respetarse para realizar una conversión A/D:
1. Configuración del módulo A/D:
 Configurar las patillas analógicas, tensión de referencia y E/S digital
(ADCON1).
 Seleccionar el canal de entrada analógico (ADCON0).
 Seleccionar el reloj de conversión A/D (ADCON0).
 Conectar el módulo A/D (ADCON0).
2. Configurar la interrupción A/D, si se desea:
 Borrar el bit ADIF.
 Activar el bit ADIE.
 Activar el bit GIE.
3. Espera del tiempo necesario para la adquisición del valor analógico en la entrada.
4. Arranca la conversión:
 Activar el bit GO / DONE (ADCON0).
5. Esperar a la finalización de la conversión A/D:
 O bien leyendo el bit GO / DONE
 O bien esperando la interrupción A/D.
6. Leer la pareja de registros del resultado (ADRESH:ADRESL), y borrar el bit ADIF.
7. Para la próxima conversión, id al paso 1 o 2, según necesidades. El tiempo de
conversión A/D por bit está definido como TAD. Se necesita un mínimo de 2 • TAD antes
de iniciar la próxima adquisición.
Microcontrolador PIC16F876 Página 99

11.1 Requisitos para la adquisición A/D

Para que el convertidor A/D posea una precisión determinada, la carga del condensador de
adquisición (CHOLD) debe completarse para el nivel analógico presente en el canal de entrada
seleccionado. El modelo de la entrada analógica se muestra en la Figura 11-2. La impedancia de
la fuente (RS) y la impedancia del conmutador de captura interno (RSS) afectan directamente al
tiempo necesitado para cargar el condensador CHOLD. La impedancia del conmutador de captura
varía según la tensión del dispositivo (VDD) (ver Figura 11-2). La impedancia máxima
recomendada para la fuente analógica es de 10KΩ . Cuando la impedancia decrece, el
tiempo de adquisición también decrece. Después de la selección del canal analógico de entrada,
este tiempo de adquisición debe tenerse en cuenta antes de arrancar la conversión. Para calcular
el tiempo mínimo de adquisición, puede utilizarse la ecuación 11-1. Ésta, asume que existe un
error de ½ LSB (1024 combinaciones para el A/D). El error de ½ LSB es el máximo error
permitido por el módulo A/D, según las especificaciones técnicas.
Microcontrolador PIC16F876 Página 100

TACQ = Tiempo activación amplificador + Tiempo carga CHOLD + Coeficiente de temperatura =


= TAMP + TC + TCOFF =
= 2µ s + TC + [(Temperatura – 25ºC) • (0,05µ s/ºC)]
TC = CHOLD • (RIC + RSS + RS) • ln (1 /2047) =
= 120pF • (1KΩ + 7 KΩ + 10 KΩ ) • ln 0,0004885) =
= 16,47µ s.
TACQ = 2µ s + 16,47µ s + [(50ºC – 25•C) • 0,005µ s/ºC] =
= 19,72µ s.
Nota 1: La tensión de referencia no afecta a la ecuación.
Nota 2: El condensador CHOLD no se descarga después de cada conversión.
Nota 3: La impedancia máxima recomendada para la fuentes analógicas es de 10KΩ . Esto es
necesario para cumplir las especificaciones.
Nota 4: Después de completar la conversión, se debe esperar un tiempo de 2•T AD antes de

iniciar otra. Durante este tiempo, el condensador CHOLD no se conecta al canal de


entrada analógico seleccionado.

11.2 Selección del reloj de Conversión A/D

El tiempo por bit de la conversión A/D se define como TAD. La conversión A/D necesita un
mínimo de 12TAD por 10 bits de conversión. La fuente del reloj de conversión A/D se selecciona
por software. Cuatro opciones son posibles para TAD:
• 2Tosc
• 8Tosc
• 32Tosc
• Oscilador RC interno

Para una correcta conversión A/D, el reloj debe seleccionarse para asegurar un tiempo mínimo
de 1,6µ s.

La Tabla 11-1 muestra los tiempos resultantes TAD, derivados de la frecuencia de trabajo del
dispositivo y de la fuente de reloj seleccionada.
Microcontrolador PIC16F876 Página 101

Tabla 11-1: TAD para máximas frecuencias de trabajo del dispositivo [dispositivos estándar (c)]
Frecuencia máxima del dispositivo
Operación ADCS1:ADCS0 Máx.
2Tosc 00 1,25 Mhz
8Tosc 01 5 Mhz
32Tosc 10 20 Mhz
RC(1,2,3) 11 Nota 1
Nota 1: La fuente RS tiene un tiempo típico de 4µ s, pero puede variar entre 2 y 6 µ s.
Nota 2: Cuando las frecuencias del dispositivo son mayores que 1Mhz, la fuente de reloj RC se
recomienda solamente para la operación en modo SLEEP.
Nota 3: Para dispositivos de amplio margen de tensión (LC), mirar la sección de Especificaciones
Eléctricas.

11.3 Configuración de patillas del puerto analógico

Los registros ADDCON1 y TRIS controlan la operación de las patillas de puerto A/D. Las
patillas que se vayan a emplear como entradas analógicas, deben activarse como entradas, en los
bits correspondientes del registro TRIS. Si estos bits están a 0, las patillas actuarán como
salidas, y los niveles de salida lógicos (VOH o VOL) serán convertidos a código binario.

La operación A/D es independiente del estado de los bits CHS2:CHS0 y de los bits TRIS.

Nota 1: Al leer el registro del puerto, cualquier patilla configurada como canal de entrada
analógico se leerá como 0. Las patillas configuradas como entradas digitales convertirán en
binario sus valores de tensión lógica. Los niveles analógicos de las patillas configuradas como
entradas digitales, no afectarán a la precisión de la conversión.

Nota 2: Los niveles analógicos en cualquier patilla definida como entrada digital, puede hacer
que el buffer de entrada consuma más corriente de la especificada en las características del
dispositivo.

11.4 Conversiones A/D

Borrando el bit GO / DONE durante una conversión, se cancelará ésta. El resultado del
registro del resultado no se actualizará con una conversión parcial; esto es: ADRESH:ADRESL
contendrán el valor convertido de la última operación válida que se completó. Después de la
cancelación de la conversión, se necesita esperar un tiempo de 2TAD antes de iniciar la siguiente
conversión. Después de esta espera, la conversión del canal seleccionado arrancará
automáticamente. En la Figura 11-3, después de activar el bit GO, el primer segmento de tiempo
posee un mínimo de TCY y un máximo de TAD.

Nota: el bit GO / DONE no se activará en la misma instrucción que la activación de A/D.


Microcontrolador PIC16F876 Página 102

11.4.1 REGISTRO DE RESULTADO A/D

La pareja de registros ADRESH:ADRESL es el lugar donde se carga el resultado de la


conversión completa A/D de 10 bits. Este registro par tiene una capacidad de 16 bits. El módulo
A/D ofrece la posibilidad de alinear a la derecha o izquierda el resultado de 10 bits, en un
registro de 16 bits. El bit de selección de formato A/D (ADFM) controla esta alineación. La
Figura 11-4 muestra la operación de alineación del resultado de la conversión A/D. Los bits
sobrantes se cargan con 0. Cuando el resultado A/D no escriba en estas posiciones (inhibición
del módulo A/D), estos registros pueden utilizarse como dos registros de uso general de 8 bits
cada uno.

11.5 Operación A/D durante el estado SLEEP

El módulo A/D puede trabajar cuando el sistema se encuentra en modo SLEEP. Esto precisa
que la fuente de reloj de A/D debe ser la RC interna (ADCS1:ADCS0 = 11). Cuando se
selecciona la fuente de reloj RC interna, el módulo A/D espera un ciclo de instrucción antes de
iniciar la conversión. Esto permitirá la ejecución de la instrucción SLEEP, que elimina todo el
ruido de conmutación digital para la conversión. Cuando ésta se complete, el bit GO / DONE
se borrará, y el resultado se cargará en el registro de resultado. Si está habilitada la interrupción
A/D, el dispositivo abandonará el estado SLEEP; si la interrupción A/D estuviese inhibida, el
módulo A/D se desconectará, aunque el bit ADON permanece activado.

Cuando la fuente de reloj A/D es otra opción (no la RC interna), la instrucción SLEEP provoca
que la conversión presente se cancele y el módulo A/D se desconecte, a pesar de que el bit
ADON permanezca activado.

Desconectando el módulo A/D conseguimos poner al dispositivo en el estado de menor


consumo.

Nota: Para que el módulo A/D opere en estado SLEEP, la fuente de reloj del A/D debe ser la
RC interna (ADCS1:ADCS0 = 11). Para conseguir que la conversión suceda durante SLEEP,
hay que asegurar que la instrucción SLEEP siga, inmediatamente, a la instrucción que activa el
bit GO/-DONE.

11.6 Efecto de un Reset

Un reset en el dispositivo, fuerza a todos los registros a su estado de reset. Esto hará que el
módulo A/D se desconecte y se cancele cualquier conversión.
Microcontrolador PIC16F876 Página 103

El valor de los registros ADRESH:ADRESL no se altera con un reset tipo –MCLR o WDT, y
contendrán datos desconocidos después de un POR o BOR.

TABLA 11-2: REGISTROS/BITS ASOCIADOS CON A/D


POR, -MCLR,
Dir. Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
BOR WDT

OBh INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
(1)
0Ch PIR1 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
(1)
8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000

1Eh ADRESH Registro de resultado para byte alto. xxxx xxxx uuuu uuuu

9Eh ADRESL Registro de resultado para byte bajo. ----- -----

1Fh ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/- --- ADON 0000 00-0 0000 00-0
DONE
9Fh ADCON1 ADFM --- --- --- PCFG3 PCFG2 PCFG1 PCFG0 --0- 0000 --0- 0000

85h TRISA --- --- Registro de dirección del puerto A --11 1111 --11 1111

05h PORTA --- --- Latch de datos de PORTA en escritura; patillas de PORTA al --0x 0000 --0u 0000
leer.
89h TRISE IBF OBF IBOV PSPMODE --- Bits de dirección de PORTE 0000 -111 0000 –111

09h PORTE --- --- --- --- --- RE2 RE1 RE0 ---- -xxx ---- -uuu

x = Desconocido; --- = Sin implementar (se lee 0). Las celdas sombreadas no se utilizan en conversión A/D.
Nota 1: Los bits PSPIE y PSPIF se reservan en los dispositivos de 28 patillas.

11.0 CARACTERÍSTICAS ESPECIALES DE LA CPU

Estos dispositivos poseen un conjunto de características proyectadas, para aumentar al máximo


las posibilidades del sistema, minimizar costos eliminando componentes externos, y
proporcionar potencia ahorrando modos de operación y ofreciendo códigos de protección. Estas
características son:
• Selección de oscilador.
• Reset:
- De conexión (POR).
- Retardo a la conexión (PWRT).
- Retardo de arranque de oscilación (OST).
- Bajada de alimentación (BOR).
• Interrupciones.
• Temporizador supervisor (WDT).
• SLEEP.
• Código de protección.
• Posiciones ID.
• Circuito de entrada para programación serie.
• Circuito de entrada de baja tensión para programación serie.
• Circuito de entrada depurador.
Microcontrolador PIC16F876 Página 104

Estos circuitos poseen un supervisor, que puede anularse, solamente, a través de los bits de
configuración. En desconexión, posee su propio oscilador RC para aumentar las posibilidades.
Existen dos temporizadores, que ofrecen los retardos necesarios a la conexión: uno es el
temporizador de inicio de oscilación (OST), diseñado para mantener el dispositivo en reset hasta
la estabilización de la oscilación del cristal; el otro es el temporizador de conexión (PWRT), que
proporciona un retraso fijo de 72 ms desde la conexión. Está diseñado para mantener una parte
en reset mientras se estabiliza la alimentación. Con estos dos temporizadores en el chip, muchas
aplicaciones no necesitan circuitería externa de reset.

El modo SLEEP se ha diseñado para ofrecer una forma de operación de muy bajo consumo. El
usuario, puede sacar del modo SLEEP al dispositivo, a través de un reset externo, final de
temporización del supervisor, o a través de una interrupción. Varias opciones de oscilación
están también disponibles para permitir aplicaciones a medida. La opción de oscilación RC
ahorra costos al sistema, mientras que la opción de cristal LP ahorra consumo. Un conjunto de
bits de configuración se usan para seleccionar estas opciones.

12.1 Bits de configuración

Los bits de configuración, pueden programarse (se leen como 0) o dejarse sin programar (leídos
como 1), para seleccionar varias configuraciones de dispositivos. Estos bits se guardan en la
posición 2007h de memoria de programa.

El usuario notará que la dirección 2007h está fuera del espacio de la memoria de programa. En
fábrica, se crea una zona especial de memoria (2000h – 3FFFh), reservada a configuración y
pruebas, que solamente es accesible en el momento de la programación del dispositivo.
Microcontrolador PIC16F876 Página 105

REGISTRO 12-1: PALABRA DE CONFIGURACIÓN (DIRECCIÓN 2007h)

______
CP1 CP0 DEBUG --- WRT CPD LVP BODEN CP1 CP0 _ WDTE FOSC1 FOSC0
PWRTE
bit1
bit0
3

bits 13-12:
bits 5-4: CP1:CP0: Bits de protección del código de memoria de Programa FLASH(2)
11 = Sin código de protección.
10 = 1F00h a 1FFFh zona protegida para PIC16F876 y 877
10 = 0F00h a 0FFFh zona protegida para PIC16F873 y 874
01 = 1000h a 1FFFh zona protegida para PIC16F876 y 877
01 = 0800h a 0FFFh zona protegida para PIC16F873 y 874
00 = 0000h a 1FFFh zona protegida para PIC16F876 y 877

bit 11: DEBUG: Modo de depuración en dispositivo.


1 = Inhibido el depurador. RB6 y RB7 son patillas de uso general de puerto E/S.
0 = Habilitado el depurador. RB6 y RBy se dedican a depuración.

bit 10: Sin implementar: Se lee como 0.

bit 9: WRT: Bit de habilitación de escritura en la Memoria Flash de Programa


1 = La memoria de programa sin proteger se puede escribir mediante el control de EECON.
0 = La memoria de programa sin proteger no se puede escribir mediante el control de EECON.

bit 8: CPD: Protección de códigos de la memoria de datos


1 = Sin protección.
0 = Los códigos de la memoria de datos están sin protección.

bit 7: LVP: Bit de habilitación de Bajo Voltaje en circuito para Programación serie.
1 = La patilla RB3/PGM tiene la función PGM, que habilita la baja tensión de programación.
0 = La patilla RB3 es un canal digital de E/S de puerto. HV, en –MCLR, puede usarse para
programación.

bit 6: BODEN: Bit de habilitación de Reset Brown.Out (BOR = descenso de tensión)(1)


1 = Habilitado BOR
0 = Inhibido BOR.

bit 3: -PWRTE: Bit de habilitación de retardo a la conexión (PWRT)(1)


1 = Inhibido el PWRT.
0 = Habilitado el PWRT.

bit 2: WDTE: Bit de habilitación de Supervisor (Watchdog).


1 = Habilitado WDT (Watchdog).
0 = Inhibido el WDT.

bit 1:0: FOSC1:FOSC0: Bits de selección del Oscilador.


11 = Oscilador RC.
10 = Oscilador HS.
01 = Oscilador XT.
00 = Oscilador LP.

Nota 1: Habilitando BOR, automáticamente se habilita PWRT, independientemente del valor del bit –PWRTE.
Hay que asegurarse que PWRT está habilitado junto con BOR.
Nota 2: Las patillas CP1:CP0 deben tener el valor ofrecido en la lista, para habilitar el código de protección.
Microcontrolador PIC16F876 Página 106

12.2 Configuraciones del oscilador

12.2.1 Tipos de osciladores

TABLA 12-1: RESONADORES CERÁMICOS Este dispositivo puede trabajar en


Rangos Probados cuatro diferentes modos de
Modo Frec. OSC1 OSC2 oscilación. El usuario puede
programar dos bits (Fosc1 y Fosc0)
455 KHz 68 – 100 pF 68 – 100 pF para seleccionar uno de estos cuatro
XT 2,0 MHz 15 – 68 pF 15 – 68 pF modos:
4,0 MHz 15 – 68 pF 15 – 68 pF
8,0 HMS 10 – 68 pF 10 – 68 pF • LP Cristal, con
HS bajo consumo.
16,0 MHz 10 – 22 pF 10 – 22 pF
Estos valores son solamente, como guía para diseño • XT Cristal-
Resonadores utilizados Resonador cerámico.
455 KHz Panasonic EFQ-A455K04B +/- 0,3% • HS Cristal-
2,0 MHz Murata Erie CSA2.00MG +/- 0,5% Resonador, en alta velocidad.
4,0 MHz Murata Erie CSA4.00MG +/- 0,5% • RC Resistor-
8,0 MHz Murata Erie CSA8.00MT +/- 0,5%
16,0 MHz Murata Erie CSA16.00MX +/- 0,5%
Todos los resonadores utilizados no llevan, integrados,
los condensadores de oscilación

Condensador.

12.2.2 OSCILADOR DE CRISTAL O


RESONADOR CERÁMICO

En los modos XT, LP o HS, un cristal de


cuarzo, o un resonador cerámico, se conectan
a las patillas OSC1/CLKIN y
OSC2/CLKOUT para establecer la necesitada oscilación (Figura 12-1). El oscilador diseñado en
el PIC16F87X necesita el uso de un cristal de corte paralelo. Si se usa un cristal de corte serie,
puede oscilar a una frecuencia fuera de las especificaciones del

fabricante del cristal. En los modos XT, LP y HS, el dispositivo puede alimentarse de una fuente
externa de reloj, conectada a la patilla OSC1 (Figura 12-2).

12.2.3 OSCILADOR RC

Para aplicaciones en las que el tiempo no requiera precisión, el oscilador RC ofrece la opción
más económica. La frecuencia del oscilador RC es función, del voltaje de alimentación, de los
valores de resistencia (REXT) y capacidad (CEXT), y de la temperatura de trabajo. Además de
esto, la frecuencia del oscilador ira variando conforme lo hagan los parámetros normales.
Además, las diferencias de capacidad de las patillas del condensador, según el tipo de
encapsulado, afectarán a la frecuencia del oscilador, especialmente para valores pequeños de
Microcontrolador PIC16F876 Página 107

capacidad CEXT. El usuario también necesita tener en cuenta la variación debido a la tolerancia
de los componentes externos usados R y C. En la Figura 12-3 se muestra cómo está conectada al
PIC16F87X la combinación R/C.

Nota1: Capacidades mayores incrementan la estabilidad del oscilador pero también


incrementan el tiempo de arranque.

Nota 2: Como cada cristal-resonador posee sus propias características, el usuario consultará al
fabricante del elemento oscilador para conseguir los valores apropiados de componentes
externos.

Nota 3: RS es necesaria, en modos HS y XT, para evitar sobreoscilaciones del cristal con
niveles de conducción muy bajos.

Nota 4: Cuando se cambie a otros dispositivos PIC, las características de oscilación se


revisarán.

TABLA 12-2: SELECCIÓN DE CONDENSADORES PARA


OSCILADOR DE CRISTAL
Tipo de Osc. Frec. Cristal C1 C2

32 KHz 33 pF 33 pF
LP
200 KHz 15 pF 15 pF
200 KHZ 47-68pF 47-68pF
XT 1 MHz 15 pF 15 pF
4 MHz 15 pF 15 pF
4 MHz 15 pF 15 pF
HS 8 MHz 15-33pF 15-33pF
20 MHz 15-33pF 15-33pF
Estos valores son orientativos para el diseño
Obsérvense las notas de arriba.
Cristales usados
32 Khz Epson C-001R32.768K-A +/- 20 PPM
200 Khz STD XTL 200.000KHz +/- 20 PPM
1 Mhz ECS ECS-10-13-1 +/- 50 PPM
4 Mhz ECS ECS-40-20-1 +/- 50 PPM
8 Mhz EPSON CA-301 8.000M-C +/- 30 PPM
20 Mhz EPSON CA-301 20.000M-C +/- 30 PPM
Microcontrolador PIC16F876 Página 108

12-3 Reset

Los PIC16F87X poseen varios tipos de reset:


• Reset a la conexión (POR).
• Reset MCLR durante el trabajo normal.
• Reset MCLR durante el modo SLEEP.
• Reset WDT durante el trabajo normal.
• Reset WDT para salir del modo SLEEP (wake-up).
• Reset por bajada de tensión (BOR).

Algunos registros no son afectados por ninguno de estos reset. Su estado es desconocido con
POR, y sin cambio con cualquier otro reset. Pero otros muchos registros se borran con el reset
tipo POR, MCLR , WDT, MCLR durante el modo SLEEP y BOR. Los bit –TO y –PD se
activan o borran, dependiendo de la situación de reset encontrada, como se muestra en la Tabla
12-4. Estos bits se usan en software para determinar la naturaleza del reset. Ver tabla 12-6 para
una completa descripción de los estados de reset para todos los registros.

En la figura 12-4 se muestra un esquema a bloques simplificado de la circuitería de reset que


contiene el dispositivo. Éste, posee un filtro de ruido en la entrada de MCLR que detectará e
ignorará los pulsos muy cortos.

Hay que resaltar que el reset WDT no pone a cero a la patilla MCLR .
Microcontrolador PIC16F876 Página 109

12.4 Reset de conexión (POR)

Se genera un impulso POR cada vez que se detecta la subida de V DD entre 1,2V y 1,7V. Para
conceder prioridad a POR, conectar MCLR directamente, o a través de un resistor, al nivel
VDD. Esto eliminará componentes externos RC, normalmente necesitados para crear un reset de
conexión. El máximo tiempo de subida se detalla en el apartado de Especificaciones Eléctricas.

Cuando el dispositivo arranca en operación normal (sale de la condición de reset), los


parámetros de trabajo del chip (tensión, frecuencia, temperatura,...) deben ser estables para
asegurar la operación. Si estas condiciones no están aseguradas, el dispositivo debe mantenerse
en reset hasta la correcta estabilidad de las condiciones de trabajo. BOR puede utilizarse para
conseguir las condiciones de arranque.

12.5 Temporizador de conexión (PWRT)

EL PWRT proporciona un retardo de 72 ms para la conexión. El PWRT opera con una red RC
interna de oscilación. El chip se mantiene en reset tanto tiempo como dura la activación de
PWRT. Este retardo permite a VDD subir hasta el nivel aceptable de trabajo. Existe un bit de
configuración para habilitar o inhibir el PWRT. El tiempo de retardo de PWRT variará de uno a
otro chip debido a tolerancias entre ellos.

12.6 Temporizador de inicio de oscilación (OST)

Este temporizador proporciona un retardo de 1024 ciclos de oscilación (desde la entrada OSC1)
desde que el retardo de PWRT terminó. Esto asegura que el oscilador de cristal o resonador ha
arrancado y está estabilizado. La Temporización de OST se aplica solamente a los modos XT,
LP y HS, en reset POR o abandono de SLEEP.
Microcontrolador PIC16F876 Página 110

12.7Reset por caída de tensión (Brown-Out_Reset)(BOR)

El bit BODEN, de configuración, puede habilitar o inhibir el circuito de BOR. Si V DD desciende


por debajo de VBOR (alrededor de 4V), por un tiempo mayor de 100µ s (TBOR), la situación
Brown-Out inicializará al dispositivo. Si VDD baja más de VBOR, pero la duración de la bajada es
menor de TBOR, no sucede reset alguno.

Mientras que sucede el BOR, el dispositivo permanecerá en reset BOR hasta que VDD suba por
encima de VBOR. El temporizador de conexión mantendrá en reset al dispositivo, un tiempo
TPWRT (72 ms, aproximadamente). Si VDD bajase de VBOR durante la Temporización TPWRT, el
proceso de BOR se iniciará cuando VDD suba por encima de VBOR, con el temporizador de
conexión en reset. Este temporizador siempre está habilitado cuando se habilita el circuito BOR,
independientemente del estado del bit de configuración de PWRT.

12.8Secuencia de finalización de Temporización

En la conexión, la secuencia de temporización es así: el retardo de PWRT arranca (si está


habilitado) cuando ocurra el reset POR. Arranca OST, contando 1024 ciclos de reloj desde que
finalizó PWRT (modos LP, XT o HS). Cuando termine OST, se abandona el estado de reset.

Si MCLR mantiene un 0 suficientemente largo, la temporización terminará. Devolviendo el


nivel alto a MCLR , iniciará la ejecución inmediatamente. Esto se usa para el chequeo, o para
sincronizar varios dispositivos PIC que trabajan en paralelo.

La Tabla 12-5 muestra las condiciones de reset para los registros STATUS, PCON y PC,
mientras que la Tabla 12-6 muestra las condiciones de reset para todos los registros.

12.9Registro PCON (Control de conexión/Registro de estado)

El registro PCON posee dos bits, bit0 y bit1, dependiendo del dispositivo. Bit0 es el bit del
estado de BOR. El bit BOR no se reconoce en el reset POR. Debe activarse por el usuario, y
chequearse en subsiguientes resets para ver si está borrado, indicando con ello la existencia de
BOR. EL bit BOR es indiferente, y no es necesariamente previsible si el circuito de BOR está
inhibido (por el borrado del bit de configuración BODEN). El bit1 corresponde a POR . Se
borra con el reset POR, y queda sin efecto en otros casos. El usuario debe activar este bit
después del POR.

TABLA 12-3: TEMPORIZACIÓN EN VARIAS SITUACIONES


Configuración Conexión
Brown-out Salida de SLEEP
del oscilador -PWRTE = 0 -PWRTE = 1
XT, HS, LP 72ms + 1024Tosc 1024Tosc 72ms + 1024Tosc 1024Tosc
RC 72 ms --- 72 ms ---

TABLA 12-4: BITS DE ESTADO Y SU SIGNIFICADO


POR BOR TO PD
0 X 1 1 Reset de conexión (Power-On-Reset).
0 X 0 X Código ilegal, TO se activa con POR.
0 X X 0 Código ilegal, PD se activa con POR.
1 0 1 1 Reset de caída de tensión (Brown-Out-Reset).
1 1 0 1 Reset de supervisor (Watch-Dog-Timer).
1 1 0 0 Abandono de WDT.
1 1 u u -MCLR durante operación normal.
1 1 1 u Reset MCLR durante SLEEP, o interrupción de abandono de SLEEP.
Microcontrolador PIC16F876 Página 111

TABLA 12-5: CONDICIÓN DE RESET PARA REGISTROS ESPECIALES


Contador de Registro de
Condición Registro PCON
Programa Estado
Reset POR 000h 0001 1xxx ---- --0x
Reset –MCLR durante operación normal 000h 000u uuuu ---- --uu
Reset –MCLR durante SLEEP 000h 0001 0uuu ---- --uu
Reset WDT 000h 0000 1uuu ---- --uu
Abandono WDT PC + 1 uuu0 0uuu ---- --uu
Reset BOR 000h 0001 1uuu ---- --u0
Abandono de SLEEP por interrupción PC + 1(1) uuu10uuu ---- --uu
u = sin cambio; x = desconocido; --- = sin implementar (se lee como 0).
Nota 1: Cuando el abandono de SLEEP se debe a una interrupción, y GIE está activada,
el PC se carga con el vector de interrupción 0004h.
Microcontrolador PIC16F876 Página 112

TABLA 12-6: CONDICONES DE INICIALIZACIÓN PARA TODOS LOS REGISTROS


Reset POR, Reset –MCLR, Abandono SLEEP por
Registros Dispositivos
Reset BOR Reset WDT WDT o Interrupción
W 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
INDF 873 874 876 877 N/A N/A N/A
TMR0 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
PCL 873 874 876 877 0000h 0000h PC + 1(2)
(3)
STATUS 873 874 876 877 0001 1xxx 000q quuu uuuq quuu(3)
FSR 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
PORTA 873 874 876 877 --0x 000 --0u 000 --uu uuuu
PORTB 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
PORTC 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
PORTD 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
PORTE 873 874 876 877 ---- -xxx ---- -uuu ---- -uuu
PCLATH 873 874 876 877 ---0 0000 ---0 0000 ---u uuuu
INTCON 873 874 876 877 0000 000x 0000 000u uuuu uuuu(1)
873 874 876 877 r000 0000 r000 0000 ruuu uuuu(1)
PIR1
873 874 876 877 0000 0000 0000 0000 uuuu uuuu(1)
PIR2 873 874 876 877 -r-0 0--0 -r-0 0--0 -r-u u—u(1)
TMR1L 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
TMR1H 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
T1CON 873 874 876 877 --00 0000 --uu uuuu --uu uuuu
TMR2 873 874 876 877 0000 0000 0000 0000 uuuu uuuu
T2CON 873 874 876 877 -000 0000 -000 0000 -uuu uuuu
SSPBUF 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
SSPCON 873 874 876 877 0000 0000 0000 0000 uuuu uuuu
CCPR1L 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
CCPR1H 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
CCP1CON 873 874 876 877 --00 0000 --00 0000 --uu uuuu
RCSTA 873 874 876 877 0000 000x 0000 000x uuuu uuuu
TXREG 873 874 876 877 0000 0000 0000 0000 uuuu uuuu
RCREG 873 874 876 877 0000 0000 0000 0000 uuuu uuuu
CCPR2L 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
CCPR2H 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
CCP2CON 873 874 876 877 0000 0000 0000 0000 uuuu uuuu
ADRESH 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
ADCON0 873 874 876 877 0000 00-0 0000 00-0 uuuu uu-u
OPTION_REG 873 874 876 877 1111 1111 1111 1111 uuuu uuuu
TRISA 873 874 876 877 --11 1111 --11 1111 --uu uuuu
TRISB 873 874 876 877 1111 1111 1111 1111 uuuu uuuu
TRISC 873 874 876 877 1111 1111 1111 1111 uuuu uuuu
TRISD 873 874 876 877 1111 1111 1111 1111 uuuu uuuu
TRISE 873 874 876 877 0000 -111 0000 -111 uuuu –uuu
873 874 876 877 r000 0000 r000 0000 ruuu uuuu
PIE1
873 874 876 877 0000 0000 0000 0000 uuuu uuuu
PIE2 873 874 876 877 -r-0 0--0 -r-0 0--0 -r-u u—u
PCON 873 874 876 877 ---- --qq ---- --uu ---- --uu
PR2 873 874 876 877 1111 1111 1111 1111 1111 1111
SSPADD 873 874 876 877 0000 0000 0000 0000 uuuu uuuu
SSPSTAT 873 874 876 877 --00 0000 --00 0000 --uu uuuu
TXSTA 873 874 876 877 0000 -010 0000 -010 uuuu –uuu
SPBRG 873 874 876 877 0000 0000 0000 0000 uuuu uuuu
ADRESL 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
ADCON1 873 874 876 877 0--- 0000 0--- 0000 u--- uuuu
EEDATA 873 874 876 877 0--- 0000 0--- 0000 u--- uuuu
EEADR 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
EEDATH 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
EEADRH 873 874 876 877 xxxx xxxx uuuu uuuu uuuu uuuu
EECON1 873 874 876 877 x--- x000 u--- u000 u--- uuuu
EECON2 873 874 876 877 ---- ---- ---- ---- ---- ----
u = Sin cambio; x = Desconocido; --- = Sin implementar (se lee como 0); q = Depende de la condición;
r = Reservado (mantener a 0).
Nota 1: Uno o más bits en INTCON, PIR1 y/o PIR2 serán afectados (a causa del abandono).
Nota 2: Cuando el abandono se debe a una interrupción, y el bit GIE está activado, el PC se carga
con el vector de interrupción 0004h.
Nota 3: Ver Tabla 12-5 para valores de reset de condiciones específicas.
Microcontrolador PIC16F876 Página 113
Microcontrolador PIC16F876 Página 114

12.10 Interrupciones

La familia PIC16F87X tiene más de 14 fuentes de interrupción. El registro de control de


interrupciones (INTCON) posee, los bits de petición de interrupción de forma individual, los
bits de habilitación individual, y el bit de habilitación global (de todo el conjunto).

Nota: Los bits de habilitación individual pueden activarse, independientemente del estado de
sus correspondientes bits de máscara, o del bit GIE (habilitación global).

El bit de habilitación global GIE (INTCON<7>), habilita, si está programado a 1, todas las
interrupciones enmascarables, o inhibe, si está en 0, a todas ellas. Cuando se habilita GIE, y un
bit indicador de interrupción y su máscara están a 1, la interrupción se atenderá inmediatamente.
Las interrupciones individuales pueden inhibirse a través de sus correspondientes bits de
habilitación, contenidos en varios registros. Los bits de interrupción individual se activarán,
independientemente del estado del bit GIE. Este último se borra con reset.

La instrucción de retorno de interrupción, RETFIE, estará contenida en la rutina de interrupción,


así como la activación del bit GIE, que habilitará una nueva interrupción.

Los bits indicadores de petición de interrupción de la patilla RB0/INT, la interrupción por


cambio en puerto RB y la interrupción por desbordamiento del TMR0, están contenidos en el
registro INTCON.
Microcontrolador PIC16F876 Página 115

Los indicadores de interrupción de periféricos están contenidos en los registros de función


especial PIR1 y PI2. Los bits correspondientes de habilitación de estas interrupciones están
contenidos en los registros de función especial PIE1 y PIE2, y el bit de habilitación de
interrupción de periféricos, en el registro de función especial INTCON.

Cuando se responde a una interrupción, el bit GIE se borra para impedir cualquier otra
interrupción, la dirección actual del PC (la de retorno) se mete en la pila, y el PC se carga con la
dirección 0004h. Ésta es la dirección llamada vector de interrupción. Cada vez que se desarrolla
la rutina de interrupción, la fuente de interrupción se determina consultando el bit de petición de
interrupción. Este bit debe borrarse por software antes de volver a habilitar las interrupciones,
para impedir atenciones recurrentes de la misma interrupción.

Para interrupción por acontecimientos externos, como la patilla de interrupción INT o


interrupción por cambio de estado en PORTB, el retraso en captar la interrupción es de tres o
cuatro ciclos de instrucción. El retraso exacto depende de cuándo ocurra la interrupción. El
retraso es el mismo para instrucciones de uno o dos ciclos. Los bits señalizadores de
interrupción individual se activan, independientemente del estado de su correspondiente bit de
máscara o del bit GIE.

12.10.1 INTERRUPCIÓN INT

La interrupción externa en la patilla RB0/INT se dispara por flanco de subida, si está activado el
bit INTEDG (OPTION_REG<6>), o de bajada, si está borrado este bit. Cuando un flanco válido
aparece en la patilla RB0/INT, el indicador INTF (INTCON<1>) se activa. Esta interrupción
puede inhibirse borrando el bit INTE (INTCON<4>). El bit indicador debe borrarse por
software en la rutina de servicio de interrupción antes de volver a habilitar las interrupciones. La
interrupción INT puede sacar al procesador del SLEEP, si el bit INTE fue activado antes de
entrar en el estado SLEEP. El estado del bit GIE decide si el procesador salta o no al vector de
interrupción siguiente al abandono de SLEEP. En la sección 12.13 se ofrecen los detalles del
modo SLEEP.

12.10.2 INTERRUPCIÓN TMR0

Un desbordamiento (paso de FFh a 00h) en el registro TMR0 activará el bit indicador T0IF
(INTCON<2>). La interrupción puede habilitarse o inhibirse activando o borrando,
respectivamente, el bit de habilitación T0IE (INTCON<5>).

12.10.3 INTERRUPCIÓN POR CAMBIO EN PORTB

Un cambio de estado lógico en la entrada del PORTB<7:4> activa el indicador RBIF


(INTCON<0>). La interrupción puede habilitarse o inhibirse activando o borrando,
respectivamente, el bit RBIE del registro INTCON<4>. Ver Sección 3.2.

12.11 Salvando valores durante las interrupciones

Durante una interrupción, solamente se salva en pila, de forma automática, el PC. Normalmente,
el usuario deseará salvar algún registro durante una interrupción (por ejemplo el registro
STATUS); esto deberá implementarlo en el programa con las instrucciones adecuadas.

Para los dispositivos PIC16F873/874, el registro W_TEMP estará definido en el conjunto de


bancos 0 y 1, y será definido en la misma dirección relativa para ambos bancos (por ejemplo: si
Microcontrolador PIC16F876 Página 116

W_TEMP se define en la dirección 020h en el banco 0, en el banco 1 su dirección será 0A0h


(080h + 020h). Los registros PCLATH_TEMP y STATUS_TEMP están definidos solamente en
el banco 0.
Puesto que los 16 bits más altos de cada banco son comunes en los dispositivos PIC16F876/877,
los registros temporales W_TEMP, STATUS_TEMP y PCLATH_TEMP estarán situados aquí.
Estas 16 posiciones no necesitan dividirse en bancos y, por consiguiente, se hace más fácil para
el programa la guarda y restauración. En el Ejemplo 12-1 tenemos unos códigos básicos.

EJEMPLO 12-1: GUARDANDO EN RAM LOS REGISTROS STATUS, W Y PCLATH

MOVWF W_TEMP ;Copiar W en el registro temporal TEMP.


SWAPF STATUS,W ;Conmuta STATUS con W.
CLRF STATUS ;Selecciona banco 0. Borra IRP, RP1, RP0.
MOVWF STATUS_TEMP ;Salva STATUS de banco 0 en el registro
;STATUS_TEMP.
MOVF PCLATH,W ;Solamente requerido si se usa páginas 1,2
;y/0 3.
MOVWF PCLATH_TEMP ;Salva PCLATH en PCLATH_TEMP.
CLRF PCLATH ;Página 0, independientemente de la página
;actual.
:
: (ISR)
:
MOVF PCLATH_TEMP,W ;Restaura PCLATH a través de W.
MOVWF PCLATH ; “
SWAPF STATUS_TEMP,W ;Conmuta STATUS_TEMP con W (coloca
;el valor original del banco de trabajo.
MOVWF STATUS ;Carga W al registro STATUS.
SWAPF W_TEMP,F ;Devuelve el valor original a W. Se realiza
SWAPF W_TEMP,W ;pasando por el registro F y W_TEMP.

12.12 Temporizador supervisor (WDT)

El temporizador supervisor es un oscilador RC independiente que no necesita componente


externo alguno. Este oscilador RC está separado del oscilador RC de la patilla OSC1/CLKIN.
Este recurso permite funcionar al WDT aunque el reloj de OSC1/CLKIN y OSC2/CLKOUT
esté detenido, por ejemplo, por la ejecución de una instrucción SLEEP.

Durante la operación normal, la finalización del tiempo de WDT genera un RESET al


dispositivo (Watchdog Timer Reset). Si el micro estuviese en modo SLEEP, el desbordamiento
de WDT provoca el abandono de SLEEP y la continuación con la operación normal de
funcionamiento. El bit TO , en el registro STATUS, quedará en 0 cuando el WDT finalice su
cuenta.

El WDT puede inhibirse permanentemente borrando el bit de configuración WDTE (Sección


12.1).

El período del WDT, que puede encontrarse en las Especificaciones Eléctricas, tiene un valor
típico de 18 ms. y un mínimo de 7 ms. Los valores para el Predivisor de WDT (realmente es un
postdivisor, aunque es el mismo bloque que el Predivisor de Timer0) se asignarán usando el
registro OPTION_REG.

Nota: Las instrucciones CLRWDT y SLEEP borran el WDT y su postdivisor, si éste estuviese
asignado al WDT, y evitan la condición de reset cuando se cumpla el tiempo de supervisión.
Microcontrolador PIC16F876 Página 117

Nota: Cuando se ejecuta una instrucción CLRWDT, y el divisor está asignado al WDT
(postvisor), la cuenta de éste se borra pero la asignación del divisor no varía.

FIGURA 12-11: RESUMEN DE REGISTROS DEL WATCHDOG


Dirección Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0

2007h Bits de Config. (1) BODEN(1) CP1 CP0 -PWRTE(1) WDTE FOSC1 FOSC0

81h, 181h OPTION_REG -RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
Las celdas sombreadas no se utilizan en el WDT.
Nota 1: Ver Registro 12-1 para operación de estos bits.

12.13 Modo de bajo consumo (SLEEP)

Se entra en modo de bajo consumo ejecutando la instrucción SLEEP.

Si está habilitado, el Temporizador Supervisor (WDT) se inicializará, pero seguirá funcionando,


el bit PD (STATUS<3>) se borra, TO (STATUS<4>) se activa, y el oscilador principal se
desconecta. Las patillas de puertos E/S mantienen el estado que poseían antes de que la
instrucción SLEEP se ejecutase (alto, bajo o alta impedancia).

Para el menor consumo en este modo, situar las patillas E/S en VDD o VSS, asegurándose de que
ningún circuito exterior conduce con este nivel, desconectar el convertidor A/D e inhibir los
relojes externos. Poner todas las patillas de E/S, que tienen entrada de alta impedancia, en alto o

bajo, para evitar corrientes de conmutación por entradas en estado flotante. La entrada T0CKI
también debe conectarse a VDD o VSS, para obtener un consumo mínimo. La contribución de las
polarizaciones internas en el PORTB serán tenidas en cuenta.

La patilla MCLR se deberá poner a nivel lógico alto (VIHMC).

12.13.1 ABANDONO DEL ESTADO SLEEP


Microcontrolador PIC16F876 Página 118

El dispositivo puede salir del estado SLEEP por una de las siguientes acciones:
1. Entrada de reset externo por la patilla MCLR .
2. Por final de temporización en WDT (si éste estuviese habilitado).
3. Interrupción en la patilla INT, interrupción por cambio en PORTB o interrupción de
algún periférico.

El reset externo MCLR provocará el reset del dispositivo. Los bits TO y PD , en el registro
de estado, pueden utilizarse para determinar la causa del reset. EL bit PD , que se pone a uno
en la conexión (POR), se borra cuando se entra en estado SLEEP. El bit TO se borra, si se
consume el tiempo WDT y se provoca el abandono del estado.

La interrupción de los siguientes periféricos pueden ser la causa del abandono del estado
SLEEP:
1. Escritura o lectura de PSP.
2. Interrupción de TMR1. Timer1 debe trabajar como contador asíncrono.
3. Interrupción en modo captura CCP.
4. Disparo por suceso especial (Timer1 en modo asíncrono usando reloj externo).
5. Interrupción por detección de bit SSP (Start/Stop).
6. Recepción o transmisión de SSP en modo servidor (SPI/I2C).
7. RX o TX de la USART (modo servidor síncrono).
8. Conversión A/D (cuando la fuente de reloj de A/D es RC).
9. Operación completa de escritura en EEPROM.

Otros periféricos no podrán generar interrupción porque durante el estado SLEEP no es efectivo
el oscilador interno.

Cuando ha sido ejecutada la instrucción SLEEP, la próxima instrucción (PC + 1) se captura.


Para que el dispositivo abandone SLEEP por una interrupción, el correspondiente bit de
habilitación de interrupción debe estar activo. La salida se produce, independientemente del
estado del bit GIE. Si éste estuviese borrado, el dispositivo continuará la ejecución de la
instrucción siguiente al SLEEP. Si el bit GIE está activado, el dispositivo ejecuta la instrucción
siguiente al SLEEP y, después, salta al vector de interrupción 0004h. En casos en los que no se
desee la ejecución siguiente al SLEEP, el usuario pondrá una instrucción NOP (no operar)
después del SLEEP.

12.13.2 SALIDA USANDO INTERRUPCIONES

Cuando las interrupciones globales estén inhibidas (GIE borrado), y cualquier fuente de
interrupción tenga activados los bits de habilitación individual y señalización de interrupción,
sucede algo de los siguiente:
• Si la interrupción ocurre antes de la ejecución del SLEEP, ésta se completa como una
instrucción NOP. Por consiguiente, el WDT y su postdivisor no se borrarán, el bit TO
no se activará, y el bit PD no se borrará.
• Si la interrupción sucede antes o durante la ejecución de SLEEP, el dispositivo
abandonará inmediatamente el estado SLEEP. La instrucción SLEEP se ejecutará
completamente antes de producirse el abandono. De este modo, el WDT y su
postdivisor se borrarán, el bit TO se activará, y el bit PD se borrará.

Dependiendo del momento en que se chequearon los bits indicadores antes de ejecutar la
instrucción SLEEP, puede que éstos se activen antes de que se complete la instrucción SLEEP.
Microcontrolador PIC16F876 Página 119

Para determinar si se ejecutó la instrucción SLEEP, hay que mirar el bit PD . Si éste es 1, la
instrucción se ejecutó como una NOP. Para asegurar que el WDT está borrado, hay que ejecutar
una instrucción CLRWDT antes de la instrucción SLEEP.

12.14 Circuito interno de depuración

Cuando se programa a 0 el bit DEBUG, en la palabra de configuración, se habilita el circuito


interno de Depuración. Esta función permite acciones sencillas de depuración cuando se usa el
MPLAB. Cuando el microcontrolador tiene esta función habilitada, algunos de los recursos no
quedan disponibles para uso general. La Tabla 12-7 muestra las características consumidas por
el Depurador.

TABLA 12-7: RECURSOS DEL DEPURADOR


Patillas de E/S RB6 y RB7
Dirección 0000h contendrá NOP
Memoria de Programa
Últimas 100h palabras
0x070(0x0F0, 0x170, 0x1F0)
Memoria de Datos
0x1EB – 0x1EF

Para usar la función interna de Depuración del microcontrolador, el diseño debe implementar
las conexiones del circuito de Programación Serie a –MCLR/VPP, VDD, GND, RB7 y RB6. Esto
hace de interconexión para el módulo del Depurador interno.

12.15 Verificación del Programa/Código de Protección

Si los bits del código de protección no han sido programados, la Memoria de Programa interna
puede extraerse (leerse) para verificaciones.

12.16 Posiciones ID

Cuatro posiciones de memoria (2000h – 2003h) se han previsto como posiciones ID, donde el
usuario puede almacenar códigos de comprobación o números de identificación. Estas
posiciones no son accesibles durante la ejecución normal, pero pueden leerse y escribirse en el
proceso de programación y verificación. Se recomienda que solamente se usen los 4 bits menos
significativos de la posición ID.

12.17 Circuito de Programación Serie interno (ICSP)


Microcontrolador PIC16F876 Página 120

Los microcontroladores PIC16F87X pueden programarse en serie. Es tan sencillo como dejar
dos líneas para datos y reloj, y otras tres para alimentación, masa y tensión de programación.

Cuando se utilice el ICSP, hay que suministrar 4,5V a 5,5V, si se ejecutaran una gran cantidad
de borrados, incluyendo reprogramación de los códigos de protección desde el estado de
conexión al de desconexión. En todos los demás casos de ICSP, se programará a la tensión
normal de trabajo.

12.18 Programación ICSP en baja tensión

El bit LVP, de la palabra de configuración, habilita la programación ICSP en baja tensión. Este
modo permite al microcontrolador ser programado vía ICSP, usando la tensión VDD como
tensión base de programación. Para esto se necesita que VPP no se ponga a VIHH, pero puede, en
cambio, quedarse a la tensión normal de trabajo. En este modo, la patilla RB3/PGM se dedica a
la función de programación, y deja de ser una patilla general de puerto E/S. Durante la
programación, VDD se aplica a la patilla MCLR . Para entrar en modo programación, VDD se
aplica a la patilla RB3/PGM, y se pondrá a uno el bit LVP. Por defecto (de fábrica), el bit LVP
está a 1.

Nota 1: La programación con alta tensión siempre está disponible, independientemente del
estado del bit LVP, aplicando VIHH a la patilla MCLR .
Nota 2: Mientras se está en modo ICSP de baja tensión, la patilla RB3 no puede utilizarse como
puerto de E/S.
Nota 3: Cuando se use programación ICSP en baja tensión y las resistencias de polarización del
PORTB estén habilitadas, el bit 3 del registro TRISB debe borrarse para inhibir la polarización
de RB3 y asegurar la debida operación del dispositivo.

Si no se utiliza la programación en baja tensión, el bit LVP puede programarse a 0 y RB3/PGM


podrá utilizarse como una patilla de puerto E/S. Sin embargo, el bit LVP será programado,
únicamente, cuando se entre en modo programación con VIHH en la patilla MCLR . El bit LVP
se cargará solamente cuando se use alta tensión sobre MCLR .

Cada vez que se programa a 0 el bit LVP, solamente se dispone de programación en alta
tensión, y solamente este modo podrá usarse para programar el dispositivo.
13.0RESUMEN DEL CONJUNTO DE INSTRUCCIONES

Cada instrucción en los PIC16F87X se compone de una palabra de 14 bits, dividida en un


Código de Operación (OPCODE), que especifica el tipo de instrucción, y uno o más operandos
que especifican la operación de la instrucción. El conjunto de instrucciones de la Tabla 13-2
lista las operaciones orientadas a bit, orientadas a byte, literales y de control. La Tabla 13-1
muestra el campo de descripciones del Código de Operación.

Para instrucciones orientadas a byte, “f” representa la designación de un registro del fichero, y
“d” representa la designación del destino. La designación del registro fichero especifica qué
registro fichero está usando la instrucción.

La designación del destino, especifica dónde se situará el resultado de la operación: si “d” es 0,


el resultado se sitúa en el registro W, si “d” es 1, el resultado se coloca en el registro fichero
especificado en la propia instrucción.

Para instrucciones orientadas a byte, “b” representa un bit, cuyo número indica la posición del
bit afectado por la operación, en la que “f” es el registro en que se localiza el bit designado.
Microcontrolador PIC16F876 Página 121

Para operaciones literales, “k” representa un valor constante de 8 bits; en operaciones de


control, “k” es un número de 11 bits.

TABLA 13-1: DESCRIPCIÓN DE


INDICADORES DEL CÓDIGO DE
OPERACIÓN
Indicador Descripción
Registro fichero. Dirección 0x00 a
f
0x7Fh.
W Registro de trabajo (acumulador).
Número de bit en un registro de 8 El conjunto de instrucciones está en orden alfabético y
b
bits agrupadas en tres categorías básicas:
k Dato constante o etiqueta.
Cualquier valor (0 o 1). • Operaciones orientadas a byte.
El ensamblador generará códigos • Operaciones orientadas a bit.
con x = 0. Es la forma de uso
• Operaciones literales y de control.
x recomendada para la
compatibilidad con todas las
herramientas de desarrollo de Todas las instrucciones se ejecutan en un único ciclo
Microchip. de instrucción, menos las de comparación-
Selección de destino; d = 0: coincidencia, o las de cambio del Contador de
resultado se guarda en W,
d d = 1: resultado se almacena en el
Programa como resultado de una instrucción. En estos
registro f. casos, la ejecución supone dos ciclos de instrucción.
Por defecto, f = 1. Un ciclo de instrucción consiste en cuatro períodos
PC Contador de Programa. del oscilador. Por esto, para una
TO Bit de fin de temporización. frecuencia del oscilador de 4 Mhz, la
PD Bit de bajo consumo.
ejecución de una instrucción normal
supone un tiempo de 1 µ s. Si se trata de
instrucciones de comparación-
coincidencia, o de cambio del valor del
Contador de Programa como resultado
de una instrucción, el tiempo necesario
será el doble.

En la Tabla 13-2 se detallan las


instrucciones reconocidas por el
ensamblador MPASM.

En la Figura 13-1 se muestra el formato


general que puede tener una instrucción.

Nota: Para mantener la compatibilidad


con futuros dispositivos PIC, no usar las
instrucciones OPTION y TRIS.

Todos los ejemplso usan el formato 0xhh


para representar cantidades
hexadecimales, donde hh representan las
cifras hexadecimales.
Microcontrolador PIC16F876 Página 122

TABLA 13:2 CONJUNTO DE ISTRUCCIONES DEL PIC16F87X Descripción:


Mnemotécnicos, Código de operación 14 bits Status
Descripción Ciclos Notas
Operandos MSb LSb afectado
OPERACIONES ORIENTADAS A BYTE
ADDWF f, d Suma W y f 1 00 0111 dfff ffff C, DC,Z 1, 2
ANDWF f, d Función AND de W con f 1 00 0101 dfff ffff Z 1, 2
CLRF f Borra f 1 00 0001 1fff ffff Z 2
CLRW Borra W 1 00 0001 0 xxx xxxx Z
COMF f, d Complementa f 1 00 1001 dfff ffff Z 1, 2
DECF f, d Decrementa f 1 00 0011 dfff ffff Z 1, 2
DECFSZ f, d Decrementa f y salta si cero 1 (2) 00 1011 dfff ffff 1, 2, 3
INCF f, d Incrementa f 1 00 1010 dfff ffff Z 1, 2
INCFSZ f, d Incrementa f y salta si cero 1 (2) 00 1111 dfff ffff 1, 2, 3
IORWF f, d Función OR de W con f 1 00 0100 dfff ffff Z 1, 2
MOVF f, d Mueve f 1 00 1000 dfff ffff Z 1, 2
MOVWF f Mueve W a f 1 00 0000 1fff ffff
NOP No opera 1 00 0000 0xx0 0000
RLF f, d Rotación a izda. de f a través de Carry 1 00 1101 dfff ffff C 1, 2
RRF f, d Rotación a dcha. de f a través de Carry 1 00 1100 dfff ffff C 1, 2
SUBWF f, d Resta W de f 1 00 0010 dfff ffff C, DC, Z 1, 2
SWAPF f, d Conmuta cuartetos en f 1 00 1110 dfff ffff 1, 2
XORWF f, d Función OREX de W con f 1 00 0110 dfff ffff Z 1, 2
OPERACIONES ORIENTADAS A BIT
BCF f, b Borra bit b de f 1 01 00bb bfff ffff 1, 2
BSF f, b Activa bit b de f 1 01 01bb bfff ffff 1, 2
BTFSC f, b Comprueba bit b de f y salto si 0 1 (2) 01 10bb bfff ffff 3
BTFSS f, b Comprueba bit b de f y salto si 1 1 (2) 01 11bb bfff ffff 3
OPERACIONES LITERALES Y DE CONTROL
ADDLW k Suma W y k. 1 11 111x kkkk kkkk C, DC, Z
ANDLW k Función AND de W y k 1 11 1001 kkkk kkkk Z
CALL k Llamada a subrutina 2 10 0kkk kkkk kkkk
CLRWDT Borra el WDT 1 00 0000 0110 0100 -TO, -PD
GOTO k Salto a la dirección k 2 10 1kkk kkkk kkkk
IORLW k Función OR de W y k 1 11 1000 kkkk kkkk Z
MOVLW k Mover k a W 1 11 00xx kkkk kkkk
RETFIE Retorno de interrupción 2 00 0000 0000 1001
RETLW k Retorno cargando k en W 2 11 01xx kkkk kkkk
RETURN Retorno de subrutina 2 00 0000 0000 1000
SLEEP Va a modo reposo 1 00 0000 0110 0011 -TO, -PD
SUBLW k Resta W de k 1 11 110x kkkk kkkk C, DC, Z
XORLW k Función OREX de W y k 1 11 1010 kkkk kkkk Z
Nota 1: Cuando se modifica un registro de E/S en función de él mismo (por ejemplo MOVF PORTB,1), el valor
usado será el valor presente en las mismas patillas. Por ejemplo, si el valor del latch de datos es 1 para una
patilla configurada como entrada, y se pone a 0 por una señal externa, el dato que se escribirá será un 0.
Nota 2: Si esta instrucción se ejecuta en el registro TMR0 (y cuando se aplique d = 1), el Predivisor se borrará si
está asignado al módulo Timer0.
Nota 3: Si se modifica el Contador de Programa (PC), o es verdadero el resultado de una comparación, la instrucción
requiere dos ciclos. EL segundo ciclo se ejecuta como un NOP (no se realiza trabajo aparente alguno).

13.1 Descripción de instrucciones El contenido del registro W se


suma al registro ”f”. Si “d” es 0,
el resultado se almacena en W; si
ADDLW Suma W y Literal “d” es 1, el resultado se guarda en
el registro “f”.
Sintaxis: ADDLW k
Operandos: 0 ≤ k ≤ 255
Operación: (W) + k → (W)
Estado afdo.: C, DC, Z ANDLW AND de W con Literal
Descripción: El contenido del registro W se
suma al byte de ”k”, y el resultado Sintaxis: ANDLW k
se guarda en W. Operandos: 0 ≤ k ≤ 255
Operación: (W) AND (k) → (W)
Estado afdo.: Z
ADDWF Suma W y f Descripción: Se realiza la función AND del
contenido de W con la palabra
Sintaxis: ADDWF f, d literal “k”. El resultado queda en
Operandos: 0 ≤ f ≤ 127 W.
d ∈ [0,1]
Operación: (W) + (f) → (destino)
Estado afdo.: C, DC, Z
Microcontrolador PIC16F876 Página 123

instrucción. Se invierten en total 2


ANDWF AND de W con f ciclos de instrucción.

Sintaxis: ANDWF f, d
Operandos: 0 ≤ f ≤ 127 CALL Llamada a Subrutina.
d ∈ [0,1]
Operación: (W) AND (f) → (destino) Sintaxis: CALL k
Estado afdo.: Z Operandos: 0 ≤ k ≤ 2047
Descripción: And de W con el registro ”f”. Si Operación: (PC) + 1 → TOS,
“d” es 0, el resultado se almacena k → PC<10:0>,
en W; si “d” es 1, el resultado se (PCLATH<4:3>)→PC<12:11>
guarda en el registro “f”. Estado afdo.: Ninguno
Descripción: Salta a ejecutar el programa
(subrutina) que se encuentra en la
dirección dada por el contenido
BCF Borra un bit del registro f de “k” (11 bits de menor peso) y
el PCLATH (bits de mayor peso).
Sintaxis: BCF f, b Antes de cargar PC con la nueva
Operandos: 0 ≤ f ≤ 127 dirección, guarda en pila el PC
0≤ b≤ 7 actual, para poder regresar cuando
Operación: 0 → (f<b>) se lo mande el programa. EL PC
Estado afdo.: Ninguno actual será la dirección donde se
Descripción: Se borra el bit numerado “b” del ubica el CALL más uno.
registro “f”.

CLRF Borrado de f

BSF Activa un bit del registro f Sintaxis: CLRF f


Operandos: 0 ≤ f ≤ 127
Sintaxis: BSF f, b Operación: 00 → (f)
Operandos: 0 ≤ f ≤ 127 1→ Z
0≤ b≤ 7 Estado afdo.: Z
Operación: 1 → (f<b>) Descripción: Se borra el contenido del registro
Estado afdo.: Ninguno “f”, activándose el indicador Z.
Descripción: Se activa el bit numerado “b” del
registro “f”.
CLRW Borrado de W

Sintaxis: CLRW
Operandos: Ninguno
Operación: 00 → (W)
BTFSS Chequea el bit “b” del registro 1→ Z
f, y salta si es “1”. Estado afdo.: Z
Descripción: Se borra el contenido del registro
Sintaxis: BTFSS f, b “W”. Se activa el indicador Z.
Operandos: 0 ≤ f ≤ 127
0≤ b≤ 7
Operación: Salta si (f<b>) = 1 CLRWDT Borrado del Watchdog Timer
Estado afdo.: Ninguno
Descripción: Si el bit “b” del registro “f” es Sintaxis: CLRWDT
uno, se salta la próxima Operandos: Ninguno
instrucción. Se invierten en total 2 Operación: 00 → WDT
ciclos de instrucción (2TCY). 0 → Predivisor WDT
1 → -TO
1 → -PD
BTFSC Chequea el bit “b” del registro Estado afdo.: -TO, -PD
f, y salta si es “0”. Descripción: Se borra el contenido del registro
WDT y de su Predivisor. Se
Sintaxis: BTFSC f, b activan los bits indicadores de
Operandos: 0 ≤ f ≤ 127 estado –TO y –PD.
0≤ b≤ 7
Operación: Salta si (f<b>) = 0
Estado afdo.: Ninguno COMF Complementa el registro f
Descripción: Si el bit “b” del registro “f” es
cero, se salta la próxima Sintaxis: COMF f, d
Operandos: 0 ≤ f ≤ 127
Microcontrolador PIC16F876 Página 124

d ∈ [0,1] Descripción: Se incrementa el contenido del


Operación: (f) → (destino) registro “f”. Si “d” es cero, el
Estado afdo.: Z resultado se almacena en W; si es
Descripción: Se complementa el contenido del uno, en el propio registro “f”.
registro “f”. Si “d” es cero, el
resultado se almacena en W; si es INCFSZ Incrementa f, y salto si = 0
uno, en el propio registro “f”.
Sintaxis: INCFSZ f, d
Operandos: 0 ≤ f ≤ 127
DECF Decrementa el registro f d ∈ [0,1]
Operación: (f) + 1 → (destino);
Sintaxis: DECF f, d salto si resultado = 0.
Operandos: 0 ≤ f ≤ 127 Estado afdo.: ninguno
d ∈ [0,1] Descripción: Se incrementa el contenido del
Operación: (f) - 1 → (destino) registro “f”. Si “d” es cero, el
Estado afdo.: Z resultado se almacena en W; si es
Descripción: Se decrementa el contenido del uno, en el propio registro “f”.
registro “f”. Si “d” es cero, el Si el resultado es 1, la próxima
resultado se almacena en W; si es instrucción se ejecutará; si el
uno, en el propio registro “f”. resultado es 0, se ejecutará una
instrucción NOP, invirtiendo 2
ciclos de instrucción en ese caso.

DECFSZ Decrementa f, y salto si = 0 IORLW Función OR de Literal con W

Sintaxis: DECFSZ f, d Sintaxis: IORLW k


Operandos: 0 ≤ f ≤ 127 Operandos: 0 ≤ k ≤ 255
d ∈ [0,1] Operación: (W) OR k → (W)
Operación: (f) - 1 → (destino); Estado afdo.: Z
salto si resultado = 0. Descripción: Se realiza la función OR entre el
Estado afdo.: ninguno contenido del registro W y la
Descripción: Se decrementa el contenido del palabra literal “k”. El resultado
registro “f”. Si “d” es cero, el queda en W.
resultado se almacena en W; si es
uno, en el propio registro “f”.
Si el resultado es 1, la próxima
instrucción se ejecutará; si el IORWF Función OR entre W y f
resultado es 0, se ejecutará una
instrucción NOP, invirtiendo 2 Sintaxis: IORWF f, d
ciclos de instrucción en ese caso. Operandos: 0 ≤ f ≤ 127
d ∈ [0,1]
GOTO Salto incondicional Operación: (W) OR f → (destino)
Estado afdo.: Z
Sintaxis: GOTO k Descripción: Se realiza la función OR con los
Operandos: 0 ≤ k ≤ 2047 contenidos de los registros W y
Operación: k → PC<10:0> “f”. El resultado quedará en W si
PCLATH<4:3> → PC<12:11> “d” = 0; en caso contrario, el
Estado afdo.: ninguno resultado se almacena en “f”.
Descripción: Salto incondicional a la dirección
así conseguida:
Se carga PC, en sus 11 bits de
menor peso (PC<10:0>), con el MOVF Mueve f
contenido de “k”. Los 2 bits de
más peso de PC se toman de Sintaxis: MOVF f, d
PCLATH. Esta instrucción se Operandos: 0 ≤ f ≤ 127
ejecuta en 2 ciclos de instrucción. d ∈ [0,1]
Operación: (f) → (destino)
INCF Incrementa el registro f Estado afdo.: Z
Descripción: Se lleva el contenido de “f” al
Sintaxis: INCF f, d destino, que dependerá del valor
Operandos: 0 ≤ f ≤ 127 de “d”: si éste es 0, el contenido
d ∈ [0,1] de “f” va a parar a W; en caso
Operación: (f) + 1 → (destino) contrario, el contenido de “f” se
Estado afdo.: Z carga sobre sí mismo. Esta última
Microcontrolador PIC16F876 Página 125

operación, aparentemente inútil, Estado afdo.: Ninguno


puede servir para comprobar el Descripción: Retorno desde una subrutina. Se
valor cero de “f”. extrae el último valor que entró en
pila, para cargarse en el PC. De
esta forma se regresa al programa
principal en donde se abandonó
MOVLW Mueve Literal a W para saltar a subrutina. Esta
instrucción tiene 2TCY.
Sintaxis: MOVLW k
Operandos: 0 ≤ k ≤ 255
Operación: (k) → (W)
Estado afdo.: Ninguno RLF Rotación a izquierda a través de
Descripción: Los ocho bits de la palabra “k” se Carry
cargan en el registro W.
Sintaxis: RLF f, d
Operandos: 0 ≤ f ≤ 127
d ∈ [0,1]
MOVWF Mueve W a f Operación: Ver descripción abajo
Estado afdo.: C
Sintaxis: MOVWF f Descripción: El contenido del registro “f” se
Operandos: 0 ≤ f ≤ 127 rota a la izquierda a través del
Operación: (W) → (f) Carry, en quien se cargará el bit
Estado afdo.: Ninguno de más peso de “f”. El resto de
Descripción: Mueve el dato de W al registro bits de “f” se desplazan desde
“f”. menor a mayor peso.
NOP No Operar
RRF Rotación a derecha a través de
Sintaxis: NOP Carry
Operandos: Ninguno
Operación: No opera Sintaxis: RRF f, d
Estado afdo.: Ninguno Operandos: 0 ≤ f ≤ 127
Descripción: No se realiza operación alguna. d ∈ [0,1]
Operación: Ver descripción abajo
Estado afdo.: C
Descripción: El contenido del registro “f” se
RETFIE Retorno desde interrupción rota a la derecha a través del
Carry, en quien se cargará el bit
Sintaxis: RETFIE de menos peso de “f”. El resto de
Operandos: Ninguno bits de “f” se desplazan desde
Operación: TOS → PC; 1 → GIE mayor a menor peso.
Estado afdo.: Ninguno
Descripción: Al cargar PC con el contenido de
la última posición de pila, se
retornará al programa principal, SLEEP Estado vigilante
que se abandonó para atender la
interrupción. Sintaxis: SLEEP
Operandos: Ninguno
Operación: 00 → WDT
RETLW Retorno con Literal en W 0 → Predivisor WDT
1 → -TO
Sintaxis: RETLW k 0 → -PD
Operandos: 0 ≤ k ≤ 255 Estado afdo.: -TO, -PD
Operación: k → (W); TOS → PC Descripción: Se borra el bit de estado de bajo
Estado afdo.: Ninguno consumo –PD y se activa el bit
Descripción: El registro W se carga con la indicador de final de tiempo, -TO.
palabra “k”. El contador de Se borra el registro WDT y su
programa se carga con el Predivisor. El procesador se lleva
contenido último de la pila. Esta al modo SLEEP, con el oscilador
instrucción tiene 2TCY. parado.

RETURN Retorno de Subrutina


SUBLW Resta W a Literal
Sintaxis: RETURN
Operandos: Ninguno Sintaxis: SUBLW k
Operación: TOS → PC Operandos: 0 ≤ k ≤ 255
Microcontrolador PIC16F876 Página 126

Operación: (k) – (W) → (W) Operandos: 0 ≤ k ≤ 255


Estado afdo.: C, DC, Z Operación: (W) XOR k → (W)
Descripción: El contenido del registro W se Estado afdo.: Z
resta del byte contenido en ”k”; el Descripción: Se realiza la función OR
resultado se guarda en W. EXCLUSIVA entre el contenido
C = 1  Resultado positivo del registro W y la palabra literal
C = 0  Resultado negativo “k”. El resultado queda en W.

SUBWF Resta W de f
XORWF XOR entre W y f
Sintaxis: SUBWF f, d
Operandos: 0 ≤ f ≤ 127 Sintaxis: XORWF f, d
d ∈ [0,1] Operandos: 0 ≤ f ≤ 127
Operación: (f) - (W) → (destino) d ∈ [0,1]
Estado afdo.: C, DC, Z Operación: (W) XOR f → (destino)
Descripción: El contenido del registro W se Estado afdo.: Z
resta del contenido del registro Descripción: Se realiza la función OR
”f”, por el método del EXCLUSIVA con los contenidos
complemento a dos. Si “d” es 0, de los registros W y “f”. El
el resultado se almacena en W; si resultado quedará en W si “d” =
“d” es 1, el resultado se guarda en 0; en caso contrario, el resultado
el registro “f”. se almacena en “f”.
C = 1  Resultado positivo.
C = 0  Resultado negativo.
SWAPF Conmuta cuartetos de f

Sintaxis: SWAPF f, d
Operandos: 0 ≤ f ≤ 127
d ∈ [0,1]
Operación: (f<3:0>) → (destino<7:4>)
(f<7:4>) → (destino<3:0>)
Estado afdo.: Ninguno
Descripción: Se permutan los dos cuartetos
(nibbles) del byte del registro “f”.
Si “d” = 0, el resultado de la
permuta se sitúa en el registro W;
si “d” = 1, el resultado se coloca
en “f”.

XORLW XOR de Literal con W

Sintaxis: XORLW k
15.0 CARACTERÍSTICAS ELÉCTRICAS

Rango Máximo Absoluto

Temperatura ambiente en polarización......................................................................................-55 a +125 ºC


Temperatura de almacenamiento.................................................................................................-65 a 150 ºC
Tensión en cualquier patilla respecto a VSS (excepto VDD, -MCLR y RA4)..................-0,3V a (VDD + 0,3V)
Tensión en VDD con respecto a VSS..............................................................................................-0,3 a +7,5V
Tensión en –MCLR con respecto a VSS ...........................................................................................0 a +14V
Tensión en RA4 con respecto a VSS...................................................................................................0 a 8,5V
Disipación total de potencia (Nota 1)......................................................................................................1,0W
Máxima corriente de salida de la patilla VSS.......................................................................................300 mA
Máxima corriente en la patilla VDD.....................................................................................................250 mA
Corriente de entrada de protección, IIK (VI < 0 o VI > VDD)............................................................+/- 20 mA
Corriente de salida de protección, IOK (VO < 0 o VO > VDD)............................................................+/- 20 mA
Máxima corriente de salida de cualquier patilla E/S a VSS...................................................................25 mA
Máxima corriente de salida de cualquier patilla E/S a VDD..................................................................25 mA
Microcontrolador PIC16F876 Página 127

Máxima corriente a VSS por PORTA, PORTB y PORTE (combinada) (Nota 3)...............................200 mA
Máxima corriente a VDD por PORTA, PORTB y PORTE (combinada) (Nota 3)..............................200 mA
Máxima corriente a VSS por PORTC y PORTD (combinada) (Nota 3)..............................................200 mA
Máxima corriente a VDD por PORTC y PORTD (combinada) (Nota 3).............................................200 mA

Nota 1: La potencia disipada se calcula así: Pdis = VDD • (IDD - Σ IOH) + Σ [(VDD – VOH) • IOH] +
Σ (VOL • IOL).

Nota 2: Los picos de tensión por debajo de VSS en la patilla –MCLR, que induzcan corrientes mayores
de 80 mA, pueden bloquear al dispositivo. Por esto se conecta un resistor en serie, de valor
óhmico ente 50 y 100Ω , cuando se aplique un nivel bajo a la patilla –MCLR, y algo mayor
cuando se conecte directamente a VSS.

Nota 3: PORTD y PORTE no están implementados en los dispositivos de 28 patillas.

IMPORTANTE: Valores por encima de los listados en “Rango Máximo Absoluto” pueden causar daños
en el dispositivo. Asimismo, exposiciones prolongadas de las condiciones arriba indicadas, pueden
afectar a la fiabilidad del dispositivo.
Microcontrolador PIC16F876 Página 128
Microcontrolador PIC16F876 Página 129
Microcontrolador PIC16F876 Página 130

Tabla 15-1: PIC16F873/874/876/877-04 (Comercial, Industrial)


PIC16F873/874/876/877-20 (Comercial, Industrial)
Condiciones de trabajo Estándar (salvo indicación en contra)
CARACTERÍSTICAS DC Temperatura de trabajo –40ºC ≤ TA ≤ +85ºC para industrial y
0ºC ≤ TA ≤ +70ºC para comercial
Parám.
Características Símbolo Mín. Típ.† Máx. Unid. Condiciones

Configuración de oscilación
4,0 --- 5,5
XT, RC y LP.
D001 Tensión de Configuración de oscilación
VDD 4,5 --- 5,5 V
D001A alimentación HS.
BOR habilitado, Fmáx = 14
VBOR* --- 5,5
Mhz (Nota 7)
Tensión de retención
D002* VDR --- 1,5 --- V
datos RAM (Nota 1)
VDD arranque para
Ver sección “Reset de
D003 asegurar la señal de VPOR --- VSS --- V
conexión” para los detalles.
Reset interno (POR)
Velocidad de subida
Ver sección “Reset de
D004* de VDD para asegurar SVDD 0,05 --- --- V/ms
conexión” para los detalles.
el reset interno (POR)
Habilitado bit BODEN en
D005 Tensión de reset BOR VBOR 3,7 4,0 4,35 V
configuración.
Oscilación XT, y RC
D010 --- 1,6 4
Fosc = 4 Mhz, VDD = 5,5 V
Corriente alimentación
(Nota 4)
(Nota 2, 5) IDD mA
Oscilación HS
D013 --- 7 15
Fosc = 20 Mhz, VDD = 5,5 V
D015* Corriente BOR (Nota 6) ∆ IBOR --- 85 200 µ A BOR habilitado, VDD=5,0V
VDD=4,0V, WDT habilitado,
D020 --- 10,5 42
-40 ºC a 85 ºC
Corriente bajo consumo VDD=4,0V, WDT inhibido,
D021 IPD --- 1,5 16 µ A
(Nota 3, 5) 0 ºC a 70 ºC
VDD=4,0V, WDT inhibido,
D021A --- 1,5 19
-40 ºC a 85 ºC
Corriente BOR
D023* ∆ IBOR --- 85 200 µ A BOR habilitado, VDD = 5,0V
(Nota 6)
Símbolo: * Parámetros característicos, pero no probados.
† Dato en columna “Típ” es a 5V, 25ºC, salvo otra especificación. Estos parámetros son para guía de diseño,
pero no están probados.
Nota 1: Este es el límite al que puede bajar VDD sin perder los datos de la RAM.
2: La corriente de alimentación es, principalmente, función de la tensión de trabajo y de la frecuencia. Otros
factores, como la carga de las patillas E/S, la velocidad de conmutación, tipo de oscilador, modelo del
código interno de ejecución y temperatura, también tienen efecto sobre la corriente consumida.
Las condiciones de prueba para todas las medidas de IDD, en modo activo de operación, son:
OSC1 = Onda cuadrada externa; todas las patillas triestado, conectadas a VDD.
-MCLR = VDD; WDT habilitado o inhibido, según se especifique.
3: La corriente en modo SLEEP no depende del tipo de oscilador. Esta corriente se mide con el bloque en
modo SLEEP, con todas las patillas E/S en alta impedancia y conectadas a VDD y VSS.
4: Para configuración de oscilador RC, no se incluye la corriente a través de la R externa. Ésta puede
estimarse con la fórmula Ir = VDD/2Rext (mA), con Rext en KΩ .
5: El oscilador del Timer1, cuando se habilita, añade 20 µ A a la corriente especificada. Este valor sirve
como guía de diseño, pero no está probado.
6: La corriente ∆ es la corriente adicional consumida cuando este periférico está habilitado. Esta corriente se
añadirá a la base IDD o IPD medida.
7: Cuando se habilita BOR, el dispositivo operará correctamente hasta alcanzar el punto de caída de tensión
marcado como VBOR.
Microcontrolador PIC16F876 Página 131

Tabla 15-2: Características DC: PIC16F873/874/876/877-04 (Comercial, Industrial)


Condiciones de trabajo Estándar (salvo indicación en contra)
CARACTERÍSTICAS DC Temperatura de trabajo –40 ºC ≤ TA ≤ +85 ºC para industrial y
0 ºC ≤ TA ≤ +70 ºC para comercial
Parám.
Características Símbolo Mín. Típ.† Máx. Unid. Condiciones

Tensión de Configuración de oscilación
D001 VDD 2,0 --- 5,5 V
alimentación XT, RC y LP (DC – 4 Mhz).
Tensión de retención
D002* VDR --- 1,5 --- V
datos RAM (Nota 1)
VDD arranque para
Ver sección “Reset de
D003 asegurar la señal de VPOR --- VSS --- V
conexión” para los detalles.
Reset interno (POR)
Velocidad de subida
Ver sección “Reset de
D004* de VDD para asegurar SVDD 0,05 --- --- V/ms
conexión” para los detalles.
el reset interno (POR)
Habilitado bit BODEN en
D005 Tensión de reset BOR VBOR 3,7 4,0 4,35 V
configuración.
--- 0,6 2,0 mA Oscilación XT, y RC
D010
Fosc = 4 Mhz, VDD = 3,0V
(Nota 4)
Corriente alimentación
(Nota 2, 5) IDD
Oscilación LP
Fosc = 32 Khz, VDD = 3,0V,
D010A
--- 20 35 µ A WDT inhibido.
Corriente BOR
D015 *
∆ IBOR --- 85 200 µ A Habilitación BOR, VDD = 5,0V
(Nota 6)
VDD = 3,0V, WDT habilitado,
D020 --- 7,5 30
-40 ºC a 85 ºC
Corriente bajo consumo VDD = 3,0 V, WDT inhibido,
D021 IPD --- 0,9 5 µ A
(Nota 3, 5) 0 ºC a 70 ºC
VDD = 3,0 V, WDT inhibido,
D021A --- 0,9 5
-40 ºC a 85 ºC
Corriente BOR
D023* ∆ IBOR --- 85 200 µ A Habilitación BOR, VDD = 5,0V
(Nota 6)
Símbolo: * Parámetros característicos, pero no probados.
† Dato en columna “Típ” es a 5V, 25ºC, salvo otra especificación. Estos parámetros son para guía de diseño,
pero no están probados.
Nota 1: Este es el límite al que puede bajar VDD sin perder los datos de la RAM.
2: La corriente de alimentación es, principalmente, función de la tensión de trabajo y de la frecuencia. Otros
factores como la carga de las patillas E/S, la velocidad de conmutación, tipo de oscilador, modelo del
código interno de ejecución y temperatura, también tienen efecto sobre la corriente consumida.
Las condiciones de prueba para todas las medidas de IDD, en modo activo de operación, son:
OSC1 = Onda cuadrada externa; todas las patillas triestado, conectadas a VDD.
-MCLR = VDD; WDT habilitado o inhibido, según se especifique.
3: La corriente en modo SLEEP no depende del tipo de oscilador. Esta corriente se mide con el bloque en
modo SLEEP, con todas las patillas E/S en alta impedancia y conectadas a VDD y VSS.
4: Para configuración de oscilador RC, no se incluye la corriente a través de la R externa. Ésta puede
estimarse con la fórmula Ir = VDD/2Rext (mA), con Rext en KΩ .
5: El oscilador del Timer1, cuando se habilita, añade 20 µ A a la corriente especificada. Este valor sirve
como guía de diseño, pero no está probado.
6: La corriente ∆ es la corriente adicional consumida cuando este periférico está habilitado. Esta corriente se
añadirá a la base IDD o IPD medida.
Microcontrolador PIC16F876 Página 132

Tabla 15-3: Características DC: PIC16F873/874/876/877-04 (Comercial, Industrial)


PIC16F873/874/876/877-20 (Comercial, Industrial)
PIC16L873/874/876/877-04 (Comercial, Industrial)
Condiciones de trabajo Estándar (salvo indicación en
contra)
CARACTERÍSTICAS DC
Temperatura de trabajo –40 ºC ≤ TA ≤ +85 ºC para industrial y
0 ºC ≤ TA ≤ +70 ºC para comercial
Parám.
Características Símbolo Mín. Típ.† Máx. Unid. Condiciones

Tensión entrada baja
Puertos E/S
D030 con buffer TTL VSS 0,15VDD En todo el rango VDD
D030A VSS 0,8V 4,5 V ≤ VDD ≤ 5,5 V
D031 con buffer ST VSS 0,2VDD
VIL V
D032 -MCLR, OSC1 (modo RC) VSS 0,2VDD
---
D033 OSC1 (en XT, HS y LP) VSS 0,3VDD Nota 1
Puertos RC3 y RC4
D034 con buffer ST VSS 0,3VDD En todo el rango VDD
D034A con SMBus -0,5 0,6 para VDD = 4,5 a 5,5 V
Tensión entrada alta
Puertos E/S
D040 con buffer TTL 2,0 En todo el rango VDD
D040A 0,25VDD VDD 4,5 V ≤ VDD ≤ 5,5 V
+0,8 VDD
VDD
D041 con buffer ST VIH 0,8VDD VDD En el rango de VDD
D042 -MCLR 0,8VDD --- VDD V
D042A OSC1 (XT, HS y LP) 0,7VDD VDD Nota 1
D043 OSC1 (en modo RC) 0,9VDD VDD
Puertos RC3 y RC4 VDD
D044 con buffer ST 0,7VDD 5,5 En todo el rango VDD
D044A con SMBus 1,4 para VDD = 4,5 a 5,5 V
PORTB con pequeña
D070 IPURB 50 250 400 µ A VDD = 5 V, VPIN = VSS
corriente de polarización
I de fuga en entrada
(Notas 2 y 3)
VSS ≤ VPIN ≤ VDD,
D060 Puertos E/S +/- 1
patilla en alta imped.
IIL --- --- µ A
VSS ≤ VPIN ≤ VDD
D061 -MCLR, RA4/T0CKI +/- 5
D063 OSC1 +/- 5 VSS ≤ VPIN ≤ VDD,
config. XT, HS y LP.
Voltaje salida baja
D080 Puertos E/S IOL=8,5mA, VDD=4,5V
VOL --- --- 0,6 V de -40º C a 85 ºC
D083 OSC2/CLKOUT (config. IOL=1,6mA, VDD=4,5V
en modo RC) de -40º C a 85 ºC
Símbolo: * Parámetros característicos, pero no probados.
† Dato en columna “Típ” es a 5V, 25ºC, salvo otra especificación. Estos parámetros son para guía de diseño,
pero no están probados.
Nota 1: En configuración de oscilador RC, la patilla OSC1/CLKIN es una entrada Schmitt Trigger (ST). No se
recomienda que el PIC16F87X se conecte con reloj externo en modo RC.
2: La corriente de fugas en la patilla –MCLR es muy dependiente del nivel de tensión aplicado. Los niveles
expresados representan condiciones normales de trabajo. Corrientes mayores de fuga se obtendrán con
diferentes tensiones de entrada.
3: Una corriente negativa quiere expresar la corriente saliente de la patilla.
Microcontrolador PIC16F876 Página 133

Condiciones de trabajo Estándar (salvo indicación en contra)


CARACTERÍSTICAS DC Temperatura de trabajo –40 ºC ≤ TA ≤ +85 ºC para industrial y
0 ºC ≤ TA ≤ +70 ºC para comercial
Parám.
Características Símb. Mín. Típ.† Máx. Unid. Condiciones

Tensión salida alta
D090 Puertos E/S (Nota 3) IOH=-3,0mA. VDD=4,5V,
VOH VDD - 0,7 --- --- V de –40 ºC a +85 ºC
D092 OSC2/CLKOUT (config. IOH=-1,3mA. VDD=4,5V,
modo RC) de –40 ºC a +85 ºC
Tensión alta drenador
D150 VOD --- --- 8,5 V Patilla RA4
abierto
Capacidad de carga en
patillas de salida
D100 Patilla OSC2 COSC2 15
En modos XT, HS y LP, cuando
--- --- pF
se usa reloj externo en OSC1.
D101 Todas las patillas E/S y OSC2 CIO 50
D102 (modo RC), SCL SDA en CB 400
modo I2C
Memoria EEPROM de datos
D120 Duración ED 100K --- --- E/W 25 ºC a 5V
D121 VDD para lectura-escritura VDRW Vmín --- 5,5 V Usando EECON para leer/escribir

D122 Ciclo de borrado-escritura TDEW --- 4 8 ms Vmín= mínima tensión de trabajo


Memoria de Programa
FLASH
D130 Duración EP 1000 --- --- E/W 25 ºC a 5 V
D131 VDD para lectura VPR Vmín --- 5,5 V Vmím = Mín. tensión de trabajo
D132a VDD para borrado-escritura Vmín --- 5,5 V usando EECON para leer-escribir

D133 Ciclo de borrado-escritura TPEW --- 4 8 ms Vmím = Mín. tensión de trabajo


Símbolo: * Parámetros característicos, pero no probados.
† Dato en columna “Típ” es a 5V, 25ºC, salvo otra especificación. Estos parámetros son para guía de diseño,
pero no están probados.
Nota 1: En configuración de oscilador RC, la patilla OSC1/CLKIN es una entrada Schmitt Trigger (ST). No se
recomienda que el PIC16F87X se conecte con reloj externo en modo RC.
2: La corriente de fugas en la patilla –MCLR es muy dependiente del nivel de tensión aplicado. Los niveles
expresados representan condiciones normales de trabajo. Corrientes mayores de fuga se obtendrán con
diferentes tensiones de entrada.
3: Una corriente negativa quiere expresar la corriente saliente de la patilla.
Microcontrolador PIC16F876 Página 134

Tabla 15-1: REQUISITOS DE TEMPORIZACIÓN DE RELOJ EXTERNO


Parám.
Símb. Características Mín. Típ.† Máx. Unid. Condiciones

DC --- 4 MHz
Frecuencia CLKIN externo DC --- 4 MHz Modos XTy RC
(Nota 1) DC --- 20 MHz Modo
DC --- 200 MHz
FOSC
DC --- 4 MHz Modo RC
Frecuencia del oscilador 0,1 --- 4 MHz Modo XT
(Nota 1) 4 --- 20 MHz Modo HS
5 --- 200 KHz Modo LP
250 --- --- ns Modo XT y RC
Período externo CLKIN 250 --- --- ns Modo HS
(Nota 1) 50 --- --- ns Modo HS
5 --- --- µ s Modo LP
1 TOSC 250 --- --- ns Modo RC
250 --- 10,0 ns Modo XT
Período del oscilador
250 --- 250 ns Modo HS (-04)
(Nota 1)
50 --- 250 ns Modo HS (-20)
5 --- --- µ s Modo LP
Duración ciclo instrucción
2 TCY 200 TCY DC ns TCY = 4 / FOSC
(Nota 1)
100 --- --- ns Oscilador XT
TOSL, Duración entrada reloj externo
3 2,5 --- --- µ s Oscilador LP
TOSH (OSC1) alta o baja
15 --- --- ns Oscilador HS
--- --- 25 ns Oscilador XT
TOSR, Tiempos de subida y bajada de la
4 --- --- 50 ns Oscilador LP
TOSF entrada externa de reloj (OSC1)
--- --- 15 ns Oscilador HS
Símbolo: † Dato en columna “Típ” es a 5V, 25ºC, salvo otra especificación. Estos parámetros son para guía de
diseño, pero no están probados.
Nota 1: Período del ciclo de instrucción (TCY) igual a cuatro períodos de la entrada de oscilación. Todos los valores
especificados se basan en la caracterización de los datos para un tipo de oscilador particular, bajo
condiciones de trabajo estándar, con el dispositivo en ejecución de códigos. Exceder estos límites
especificados puede generar oscilaciones inestables y consumos de corriente mayores que los ofrecidos.
Todos los dispositivos se han probado trabajando con los valores “Mín.”, y con un reloj externo aplicado
a la patilla OSC1/CLKIN. Cuando se usa una entrada de reloj externo, el límite de período “Máx.” es DC
(sin reloj) para todos los dispositivos.
Microcontrolador PIC16F876 Página 135

TABLA 15-2: NECESIDADES DE TEMPORIZACIÓN DE CLKOUT Y E/S


Parám
. Símbolo Características Mín. Típ.† Máx. Unid. Condicio.

10* TosH2ckL OSC1↑ a CLKOUT↓ --- 75 200 ns Nota 1
11* TosH2ckH OSC1↑ a CLKOUT↑ --- 75 200 ns Nota 1
12* TckR Tiempo subida CLKOUT --- 35 100 ns Nota 1
13* TckF Tiempo bajada CLKOUT --- 35 100 ns Nota 1
14* TckL2ioV CLKOUT↓ a salida válida Puerto --- --- 0,5TCY+20 ns Nota 1
15* TioV2ckH Entrada Puerto válida antes de CLKOUT↑ Tosc+200 --- --- ns Nota 1
16* TckH2ioI Mantenimiento entrada puerto después CLKOUT↑ 0 --- --- ns Nota 1
17* TosH2ioV OSC1↑ (ciclo Q1) a salida puerto válida --- 100 255 ns
OSC1↑ (ciclo Q2) a entrada puerto Estándar (F) 100 --- ns
18* TosH2ioI válida (tiempo manten. entrada Extendida(LF
200 --- ns
puerto) )
19* TioV2osH Entrada válida puerto a OSC1↑ 0 --- --- ns
Estándar (F) --- 10 40 ns
Tiempo de subida de salida de
20* TioR
puerto
Extendida(LF
--- --- 145 ns
)
Estándar (F) --- 10 40 ns
Tiempo de bajada de salida de
21* TioF
Puerto
Extendida(LF
--- --- 145 ns
)
22†† Tinp Tiempo en bajo o alto en patilla INT TCY --- --- ns
Tiempo en bajo o alto para INT por cambio en
23†† Trbp
patilla RB7 – RB4
TCY --- --- ns
* Estos parámetros son característicos pero no están probados.
† Dato en columna “Típ.” es a 5V, 25 ºC, salvo especificación en contra. Estos parámetros sirven como guía de
diseño pero no están verificados.
†† Estos parámetros son sucesos asíncronos no relacionados con ningún flanco de reloj interno.
Nota 1: Las medidas se han realizado en modo RC, donde la salida CLKOUT es 4Tosc.
Microcontrolador PIC16F876 Página 136

TABLA 15-2: NECESIDADES DE TEMPORIZACIÓN DE CLKOUT Y E/S


Parám.
Símb. Características Mín. Típ.† Máx. Unid. Condicio.

VDD = 5V,
30* TmcL Ancho pulso -MCLR 2 --- --- µ s
-40 ºC a + 85 ºC
VDD = 5V,
31* Twdt Período temporiz. WDT 7 18 33 ms
-40 ºC a + 85 ºC
32* Tost Período arranque oscilación --- 1024Tosc --- --- Tosc = perío. OSC1
VDD = 5V,
33* Tpwrt Período conexión 28 72 132 ms
-40 ºC a + 85 ºC
Tiempo de alta impedancia desde
34* TIOZ --- --- 2,1 µ s
bajada –MCLR o reset WDT
35* TBOR Ancho pulso de reset BOR 100 --- --- µ s VDD ≤ VBOR (D005)
* Estos parámetros son característicos pero no están probados.
† Dato en columna “Típ.” es a 5V, 25 ºC, salvo especificación en contra. Estos parámetros sirven como guía de
diseño pero no están verificados.
Microcontrolador PIC16F876 Página 137

TABLA 15-4: NECESIDADES DE RELOJ EXTERNO PARA TIMER1 Y TIMER2


Parám. Unid
Símb. Características Mín Típ† Máx Condiciones
Nº .
Sin Prediv. 0,5TCY+20 --- --- ns Debe coincidir
40* Tt0H Ancho pulso alto T0CKI
Con Prediv. 10 --- --- ns param. 42
Sin Prediv. 0,5TCY+20 --- --- ns Debe coincidir
41* Tt0L Ancho pulso bajo T0CKI
Con Prediv. 10 --- --- ns param. 42
Sin Prediv. TCY + 40 --- --- ns
Mayor que:
42* Tt0P Período T0CKI N=valor Prediv.
Con Prediv. 20 ó --- --- ns
(2, 4,... 256)
(TCY+40)/N
Síncrono, Predivisor = 1 0,5TCY+20 --- --- ns
Síncr., Prediv. = Estándar(F) --- --- --- ns Debe coincidir
Tiempo alto
45* Tt1H 2, 4 y 8 Extendida(LF) --- --- --- ns también el
T1CKI
Estándar(F) --- --- --- ns parámetro 47
Asíncrono
Extendida(LF) --- --- --- ns
Síncrono, Predivisor = 1 0,5TCY+20 --- --- ns
Síncr., Prediv. = Estándar(F) 15 --- --- ns Debe coincidir
Tiempo bajo
46* Tt1L 2, 4 y 8 Extendida(LF) 25 --- --- ns también el
T1CKI
Estándar(F) 30 --- --- ns parámetro 47
Asíncrono
Extendida(LF) 50 --- --- ns
Mayor que:
N=valor Prediv.
Estándar(F) 30 ó --- --- ns
(1, 2, 4, 8)
(TCY+40)/N
Síncrono
Período de Mayor que:
47* Tt1P N=valor Prediv.
entrada T1CKI Extendida(LF) 50 ó --- --- ns
(1, 2, 4, 8)
(TCY+40)/N
Estándar(F) 60 --- --- ns
Asíncrono
Extendida(LF) 100 --- --- ns
Margen de frecuencia de entrada oscilador
Ft1 Timer1 DC --- 200 KHz
(Oscilador habilitado activando el bit T1OSCEN)
Retardo de increm. de Timer con respecto al
48 TCKEZtmr1 2Tosc --- 7Tosc ---
flanco de reloj externo
* Estos parámetros son característicos pero no están probados.
† Dato en columna “Típ.” es a 5V, 25 ºC, salvo especificación en contra. Estos parámetros sirven como guía de
diseño pero no están verificados.
Microcontrolador PIC16F876 Página 138

TABLA 15-5: NECESIDADES DE CAPTURA/COMPARACIÓN/PWM (CCP1 Y CCP2)


Parám
. Símb. Características Mín Típ† Máx Unid. Condiciones

Tiempo bajo Sin Predivisor 0,5TCY+20 --- --- ns
50* TLC entrada CCP1 y Con Estándar(F) 10 --- --- ns
CCP2 Predivisor Extendida(LF) 20 --- --- ns
Tiempo alto Sin Predivisor 0,5TCY+20 --- ns
51* TccH entrada CCP1 y Con 10 10 --- --- ns
CCP2 Predivisor 20 20 --- --- ns
3Tcy + 40 N=Valor del
52* TccP Período de entrada CCP1 y CCP2 --- --- ns Predivisor
N (1, 4 o 16)
Tiempo de subida de la salida Estándar(F) --- 10 25 ns
53* TccR
de CCP1 y CCP2 Extendida(LF) --- 25 50 ns
Tiempo de bajada de la salida Estándar(F) --- 10 25 ns
54* TccF
de CCP1 y CCP2 Extendida(LF) --- 25 45 ns
* Estos parámetros son característicos pero no están probados.
† Dato en columna “Típ.” es a 5V, 25 ºC, salvo especificación en contra. Estos parámetros sirven como guía de
diseño pero no están verificados.
Microcontrolador PIC16F876 Página 139

TABLA 15-6: NECESIDADES PUERTO SERVIDOR PARALELO (DISPOSITIVOS DE 40 PATILLAS)


Parám
. Símb. Características Mín Típ† Máx Unid. Condiciones

20 --- --- ns
TdtV2wr Dato válido en la entrada antes de –WR↑ o –CS↑
62 25 --- --- ns Sólo rango
H (tset-up)
extendido
Mantenimiento dato entrada Estándar(F) 20
63* TwrH2dtI
después de –WR↑ o –CS↑ (thold) Extendida(LF) 35
--- --- 80 ns
64 TrdL2dtV --- --- 90 ns Sólo rango
extendido
65 TrdH2dtI 10 --- 30 ns
* Estos parámetros son característicos pero no están probados.
† Dato en columna “Típ.” es a 5V, 25 ºC, salvo especificación en contra. Estos parámetros sirven como guía de
diseño pero no están verificados.
Microcontrolador PIC16F876 Página 140
Microcontrolador PIC16F876 Página 141
Microcontrolador PIC16F876 Página 142

TABLA 15-7: NECESIDADES MODO SPI


Parám
. Símb. Características Mín Típ† Máx Unid. Cond.

70* TssL2scH Entrada –SS↓ a SCK↓ o SCK↑ TCY --- --- ns
71* TscH Tiempo en alto de la entrada SCK (modo servidor) TCY+20 --- --- ns
72* TscL Tiempo en bajo de la entrada SCK (modo servidor) TCY+20 --- --- ns
TdiV2scH, Tiempo de anticipación de SDI respecto flanco
73* 100 --- --- ns
TdiV2scL SCK
TscH2diL,
74* Tiempo estable de SDI respecto a flanco de SCK 100 --- --- ns
TscL2diL
Tiempo de subida del dato de Estándar (F) --- 10 25 ns
75* TdoR
salida SDO Extendida (LF) --- 25 50 ns
76* TdoF Tiempo de bajada del dato de salida SDO --- 10 25 ns
77* TssH2doZ -SS↑ a salida alta impedancia de SDO 10 --- 50 ns
Tiempo de subida de salida SCK Estándar (F) --- 10 25 ns
78* TscR
en modo maestro Extendida (LF) --- 25 50 ns
79* TscF Tiempo de bajada salida SCK modo maestro --- 10 25 ns
TscH2doV, Dato de salida SDO válido Estándar (F) --- --- 50 ns
80*
TscL2doV después de flanco SCK Extendida (LF) --- --- 145 ns
TdoV2scH,
81* Tiempo de bajada del dato de salida SDO TCY --- --- ns
TdoV2scL
82* TssL2doV -SS↑ a salida alta impedancia de SDO --- --- 50 ns
TscH2ssH,
83* -SS↑ después de flanco SCK 1,5TCY+40 --- --- ns
TscL2ssH
* Estos parámetros son característicos pero no están probados.
† Dato en columna “Típ.” es a 5V, 25 ºC, salvo especificación en contra. Estos parámetros sirven como guía de
diseño pero no están verificados.

TABLA 15-8: NECESIDADES DE LOS BITS DE START Y STOP DEL BUS I2C
Parám
. Símb. Características Mín Típ Máx Unid. Cond.

470
Modo 100KHz --- --- Solamente en condición
90 TSU:STA Antelación bit START 0 ns
repetición de START
Modo 400KHz 600 --- ---
400
Modo 100KHz --- --- Después de este período
91 THD:STA Tiempo estable bit START 0 ns
se genera el primer reloj
Modo 400KHz 600 --- ---
Microcontrolador PIC16F876 Página 143

92 TSU:STO Antelación bit STOP Modo 100KHz 470 --- --- ns


0
Modo 400KHz 600 --- ---
93 THD:STO Tiempo estable bit STOP Modo 100KHz 400 --- --- ns
0
Modo 400KHz 600 --- ---
Microcontrolador PIC16F876 Página 144

TABLA 15-9: NECESIDADES DE LOS DATOS DEL BUS I2C


Parám.
Símbolo Características Mín Máx Unid. Condiciones

TABLA 15-10: NECESIDADES DE TRANSMISIÓN SÍNCRONA USART
Mínima operación
Parám. Símbolo 100KHz
Características 4,0 Mín Típ† Máx Unid. Cond.
1,5MHz
Nº Tiempo alto de µ s
100 THIGH --- Mínima operación
reloj 400KHz 0,6
120 TckH2dtV SYNC XMIT (Maestro y Servidor) Estándar (F) --- --- 10MHz
80 ns
Módulo
Dato salida válido respecto a relojSSP 1,5TCY (LF)
alto Extendida 100
121 Tckrf Tiempos de subida y bajada de reloj Estándar Mínima operación
4,7 (F) --- --- 45 ns
100KHz
(modo Maestro) Extendida (LF) 1,5MHz
50
Tiempo bajo de µ s
101 Tdtrf TLOW Tiempos de subida y bajada del dato
122 Estándar --- --- Mínima operación
reloj 400KHz 1,3 (F) --- 45 ns
de salida Extendida (LF) 10MHz
50
† Dato en columna “Típ.” es a 5V, 25 ºC, salvoMódulo SSP
especificación1,5T
en contra.
CY Estos parámetros sirven como guía de
diseño pero no estánTiempo de subida
verificados. 100KHz --- 1000
102 TR de ns
400KHz 20+0,1Cb 300 Cb entre 10 y 400 pF
SDA y SCL
Tiempo de bajada 100KHz ---
103 TF de 300 ns
400KHz 20+0,1Cb Cb entre 10 y 400 pF
SDA y SCL
100KHz 4,7 Solamente en
Antelación bit
90 TSU:STA --- µ s condición
START 400KHz 0,6
repetición de START
100KHz 4,0 Después de este
Tiempo estable del período
91 THD:STA --- µ s
bit START 400KHz 0,6 se genera el primer
reloj
Tiempo estable 100KHz 0 --- ns
106 THD:DAT dato de
400KHz 0 0,9 µ s
entrada
Antelación del dato 100KHz 250
107 TSU:DAT de --- ns Nota 2
400KHz 100
entrada
Antelación bit 100KHz 4,7
92 TSU:STO --- µ s
STOP 400KHz 0,6
Salida válida desde 100KHz --- 3500 Nota 1
109 TAA ns
reloj 400KHz --- ---
100KHz 4,7 Tiempo bus libre antes
de
110 TBUF Tiempo de bus libre --- µ s
400KHz 1,3 inicio nueva
transmisión
Cb Capacidad de carga del bus --- 400 pF
Nota 1: Como transmisor, el dispositivo proporciona un retardo mínimo para saltar la región indefinida del flanco de
bajada de SCL para evitar generaciones indeseadas de condición de START y STOP.
2: Un dispositivo de modo rápido (400KHz) de bus I2C puede usarse en modo estándar de 100KHz, pero debe
respetarse el requisito de TSU:DAT ≥ 250 ns. Esto se producirá automáticamente en caso de que el dispositivo
no alargue el período bajo de la señal SCL. Si el dispositivo alarga el período de la señal SCL, sacará el bit de
datos próximo en la línea SDA TRmáx + TSU:DAT = 1000 + 250 = 1250 ns, antes de abandonar la línea SCL.
Microcontrolador PIC16F876 Página 145

TABLA 15-11: NECESIDADES DE RECEPCIÓN SÍNCRONA USART


Parám.
Símbolo Características Mín Típ† Máx Unid. Cond.

SYNC RCV (Maestro y Servidor)
125 TdtV2ckL 15 --- --- ns
Antelación de dato respecto a CK↓
Tiempo estable del dato después de
126 TckL2dtI 15 --- --- ns
CK↓
† Dato en columna “Típ.” es a 5V, 25 ºC, salvo especificación en contra. Estos parámetros sirven como guía de
diseño pero no están verificados.

TABLA 15-12: PIC16F873/874/876/877-04 (COMERCIAL, INDUSTRIAL)


PIC16F873/874/876/877-20 (COMERCIAL, INDUSTRIAL)
PIC16LF873/874/876/877-04 (COMERCIAL, INDUSTRIAL)
Parám
. Símb. Características Mín Típ† Máx Unid. Condiciones

VREF=VDD=5,12V
A01 NR Resolución --- --- 10bits bit
VSS ≤ VAIN ≤ VREF
VREF=VDD=5,12V
A03 EIL Error linealidad integral --- --- < +/- 1 LSB
VSS ≤ VAIN ≤ VREF
VREF=VDD=5,12V
A04 EDL Error linealidad diferencial --- --- < +/- 1 LSB
VSS ≤ VAIN ≤ VREF
VREF=VDD=5,12V
A06 EOFF Error desplazamiento (offset) --- --- < +/- 2 LSB
VSS ≤ VAIN ≤ VREF
VREF=VDD=5,12V
A07 EGN Error de ganancia --- --- < +/- 1 LSB
VSS ≤ VAIN ≤ VREF
A10 --- Monotonicidad(3) --- garantizado --- --- VSS ≤ VAIN ≤ VREF
Mínimo para
Voltaje de referencia
A20 VREF 2,0 --- VDD+0,3 V aseguarar 10 bits
(VREF+ - VREF-)
de precisión
A21 VREF+ Tensión alta de referencia AVDD-2,5 AVDD+0,3 V
A22 VREF- Tensión baja de referencia AVSS-0,3 VREF+ - 2 V
A25 VAIN Tensión de entrada analógica VSS – 0,3 --- VREF +0,3 V
Impedancia recomendada para
A30 ZAIN --- --- 10,0 KΩ
la fuente de tensión analógica
A40 IAD Corriente de Estándar --- 220 --- µ A Corriente media
Microcontrolador PIC16F876 Página 146

cuando A/D es
conversión A/D Extendida --- 90 --- µ A
efectivo (Nota 1)
Durante adquisición
de VAIN. Basada en
la diferencia entre
10 --- 1000 µ A
Corriente de la entrada VREF VHOLD y VAIN, que
A50 IREF
(Nota 2) carga CHOD. Ver
Sección 11.1.
Durante el ciclo de
--- --- 10 µ A
conversión A/D
* Estos parámetros son característicos pero no están probados.
† Dato en columna “Típ.” es a 5V, 25 ºC, salvo especificación en contra. Estos parámetros sirven como guía de
diseño pero no están verificados.
Nota 1: Cuando A/D está desactivado, solamente consume la pequeña corriente de fuga.
Las especificaciones de bajo consumo incluyen cualquier fuga desde el módulo A/D.
Nota 2: La corriente VREF se refiere a la patilla RA3 o VDD, la que esté seleccionada como entrada de referencia.
Nota 3: El resultado de la conversión A/D nunca disminuye con el incremento de tensión en la entrada, y no
pierde códigos.
Microcontrolador PIC16F876 Página 147

TABLA 15-13: NECESIDADES DE CONVERSIÓN A/D


Parám.
Símb. Características Mín Típ† Máx Unid. Condiciones

Estándar 1,6 --- --- µ s Basado TOSC, VREF ≥ 3,0V
Extendida 3,0 --- --- µ s Basado TOSC, VREF ≥ 2,0 V
130 TAD Período reloj A/D
Estándar 2,0 4,0 6,0 µ s Modo RC A/D.
Extendida 3,0 6,0 9,0 µ s Modo RC A/D.
Tiempo de conversión (no incluido
131 TCNV --- 12 TAD
el tiempo S/H) (Nota 1)
Nota2 40 --- µ s
El tiempo mínimo es el de
programación del amplifi-
cador. Éste se usará si la
nueva tensión de entrada no
132 TACQ Tiempo de adquisición
10* --- --- µ s ha cambiado más de 1 LSB
(p. e., 20,0 mV a 5,12 V)
desde la última tensión cap-
turada (mientras está activo
CHOLD.
Si se selecciona reloj RC
como fuente de A/D, se aña-
TOSC/2 de un tiempo TCY antes del
134 TGO Q4 a incio del reloj A/D --- --- ---
ξ inicio del reloj A/D. Esto
permite la ejecución de la
instrucción SLEEP.
* Estos parámetros son característicos pero no están probados.
† Dato en columna “Típ.” es a 5V, 25 ºC, salvo especificación en contra. Estos parámetros sirven como guía de
diseño pero no están verificados.
ξ Garantizada, esta especificación, para el diseño.
Nota 1: El registro ADRES se leerá en el siguiente ciclo TCY.
Nota 2: Para condiciones mínimas ver Sección 11.1

Leyenda: MM...M Información del número particular de Microchip.


XX...X Información específica del fabricante.
AA Código de año (últimas 2 cifras del año del calendario).
BB Código de semana (la primera semana de Enero será “01”)
Microcontrolador PIC16F876 Página 148

C Código que facilita la planta de fabricación de la base de silicio.


O = Vendedor extranjero.
C = Línea de 5”.
S = Línea de 6”.
H = Línea de 8”.
D Número de revisión de máscara.
E= Código de la planta de montaje, o región de origen en la que se montó el bloque.

Nota: En el caso de que no esté marcado el número particular de Microchip en una línea, se habrá
juntado en la siguiente, para limitar el número de caracteres disponible por la especificación
del fabricante.

• La marcación estándar en dispositivos OTP consiste en un número particular de Microchip, código


de año, código de semana, código de planta, revisión de máscara y código de montaje.
Microcontrolador PIC16F876 Página 149
Microcontrolador PIC16F876 Página 150

Unidades PULGADAS MILÍMETROS


Límites dimensión MÍN NOM MÁX MÍN NOM MÁX
Distancia entre filas 0,300 7,62
Número de patillas n 28 28
Paso entre patillas p 0,100 2,54
0,01
Ancho patilla B 0,019 0,022 0,41 0,48 0,56
6
0,04
Ancho parte alta de patilla B1 0,053 0,065 1,02 1,33 1,65
0
0,00
Radio de taladro en placa R 0,005 0,010 0,00 0,13 0,25
0
0,00
Grosor de patilla c 0,010 0,012 0,20 0,25 0,30
8
0,14
Altura desde plano de placa A 0,150 0,160 3,56 3,81 4,06
0
0,07
Altura desde placa a centro A1 0,090 0,110 1,78 2,29 2,79
0
0,01
Separación de la placa base A2 0,020 0,025 0,38 0,51 0,64
5
0,12
Largo de patilla en taladro L 0,130 0,135 3,18 3,30 3,43
5
1,34 34,1
Longitud de encapsulado D 1,365 1,385 34,67 35,18
5 6
0,28
Ancho hasta doblado de patillas E 0,288 0,295 7,11 7,30 7,49
0
0,27
Ancho de cápsula plástica E1 0,283 0,295 6,86 7,18 7,49
0
0,32
Distancia extrema entre filas de patillas eB 0,350 0,380 8,13 8,89 9,65
0
Ángulo de biselado de cápsula α 5 10 15 5 10 15
Microcontrolador PIC16F876 Página 151

Ángulo de biselado inferior de cápsula β 5 10 15 5 10 15

Unidades PULGADAS MILÍMETROS


Límites dimensión MÍN NOM MÁX MÍN NOM MÁX
Paso entre patillas p 0,050 1,27
Número de patillas n 28 28
0,09
Altura desde plano de placa A 0,099 0,104 2,36 2,50 2,64
3
0,04
Altura desde placa a centro A1 0,058 0,068 1,22 1,47 1,73
8
0,00
Separación de la placa base A2 0,008 0,011 0,10 0,19 0,28
4
0,70 17,7
Longitud de encapsulado D 0,706 0,712 17,93 18,08
0 8
0,29
Ancho hasta doblado de patillas E 0,296 0,299 7,42 7,51 7,59
2
0,39 10,0
Ancho de cápsula plástica E1 0,407 0,419 10,33 10,64
4 1
0,01
Biselado superior indicativo X 0,020 0,029 0,25 0,50 0,74
0
Radio de doblado superior R1 0,00 0,005 0,010 0,13 0,13 0,25
Microcontrolador PIC16F876 Página 152

5
0,00
Radio de doblado inferior R2 0,005 0,010 0,13 0,13 0,25
5
0,01
Largo de apoyo en placa, de patilla L 0,016 0,021 0,28 0,41 0,53
1
Ángulo de apoyo en placa φ 0 4 8 0 4 8
0,01
Distancia desde cápsula hasta inicio de doblado superior L1 0,015 0,020 0,25 0,38 0,51
0
0,00
Grosor de patilla c 0,011 0,012 0,23 0,27 0,30
9
0,01
Ancho patilla B 0,017 0,019 0,36 0,42 0,48
4
Ángulo de biselado de cápsula α 0 12 15 0 12 15
Ángulo de biselado inferior de cápsula β 0 12 15 0 12 15

Unidades PULGADAS MILÍMETROS


Límites dimensión MÍN NOM MÁX MÍN NOM MÁX
Distancia entre filas 0,600 15,24
Número de patillas n 40 40
Microcontrolador PIC16F876 Página 153

Paso entre patillas p 0,100 2,54


0,01
Ancho patilla B 0,018 0,020 0,41 0,46 0,51
6
0,04
Ancho parte alta de patilla B1 0,050 0,055 1,14 1,27 1,40
5
0,00
Radio de taladro en placa R 0,005 0,010 0,00 0,13 0,25
0
0,00
Grosor de patilla c 0,010 0,011 0,23 0,25 0,28
9
0,11
Altura desde plano de placa A 0,160 0,160 2,79 4,06 4,06
0
0,07
Altura desde placa a centro A1 0,093 0,113 1,85 2,36 2,87
3
0,02
Separación de la placa base A2 0,020 0,040 0,51 0,51 1,02
0
0,12
Largo de patilla en taladro L 0,130 0,135 3,18 3,30 3,43
5
2,01 51,1
Longitud de encapsulado D 2,018 2,023 51,26 51,38
3 3
0,53 13,4
Ancho hasta doblado de patillas E 0,535 0,540 13,59 13,72
0 6
0,54 13,8
Ancho de cápsula plástica E1 0,565 0,585 14,35 14,86
5 4
0,63 16,0
Distancia extrema entre filas de patillas eB 0,610 0,670 15,49 17,02
0 0
Ángulo de biselado de cápsula α 5 10 15 5 10 15
Ángulo de biselado inferior de cápsula β 5 10 15 5 10 15
Microcontrolador PIC16F876 Página 154

Unidades PULGADAS MILÍMETROS


Límites dimensión MÍN NOM MÁX MÍN NOM MÁX
Paso entre patillas p 0,031 0,80
Número de patillas n 44 44
Ancho hasta centro de patillas extremas n1 11 11
0,03
Altura desde plano de placa A 0,043 0,047 1,00 1,10 1,20
9
0,01
Altura desde placa a centro A1 0,025 0,035 0,38 0,64 0,89
5
0,00
Separación de la placa base A2 0,004 0,006 0,05 0,10 0,15
2
0,00
Radio de doblado superior R1 0,003 0,010 0,08 0,08 0,25
3
0,00
Radio de doblado inferior R2 0,006 0,008 0,08 0,14 0,20
3
0,00
Largo de apoyo en placa, de patilla L 0,010 0,015 0,13 0,25 0,38
5
Ángulo de apoyo en placa φ 0 3,5 7 0 3,5 7
0,00
Distancia desde cápsula hasta inicio de doblado superior L1 0,008 0,013 0,08 0,20 0,33
3
0,00
Grosor de patilla c 0,006 0,008 0,09 0,15 0,20
4
0,01
Ancho patilla B 0,015 0,018 0,30 0,38 0,45
2
0,46 11,7
Longitud entre extremos de patillas extremas lado 1 D1 0,472 0,482 12,00 12,25
3 5
0,46 11,7
Longitud entre extremos de patillas extremas lado 2 E1 0,472 0,482 12,00 12,25
3 5
0,39
Longitud de encapsulado lado 1 D 0,394 0,398 9,90 10,00 10,10
0
0,39
Longitud de encapsulado lado 2 E 0,394 0,398 9,90 10,00 10,10
0
0,02
Biselado esquina indicativo de patilla 1 X 0,035 0,045 0,64 0,89 1,14
5
Ángulo de biselado de cápsula α 5 10 15 5 10 15
Ángulo de biselado inferior de cápsula β 5 12 15 5 12 15
Microcontrolador PIC16F876 Página 155

Unidades PULGADAS MILÍMETROS


Límites dimensión MÍN NOM MÁX MÍN NOM MÁX
Paso entre patillas p 0,031 0,80
Número de patillas n 44 44
Ancho hasta centro de patillas extremas n1 11 11
0,07
Altura desde plano de placa A 0,086 0,093 2,00 2,18 2,35
9
0,03
Altura desde placa a centro A1 0,044 0,056 0,81 1,11 1,41
2
0,00
Separación de la placa base A2 0,006 0,010 0,05 0,15 0,25
2
0,00
Radio de doblado superior R1 0,005 0,010 0,13 0,13 0,25
5
0,00
Radio de doblado inferior R2 0,012 0,015 0,13 0,30 0,38
5
0,01
Largo de apoyo en placa, de patilla L 0,020 0,025 0,38 0,51 0,64
5
Ángulo de apoyo en placa φ 0 3,5 7 0 3,5 7
0,01
Distancia desde cápsula hasta inicio de doblado superior L1 0,016 0,021 0,28 0,41 0,53
1
0,00
Grosor de patilla c 0,007 0,009 0,13 0,18 0,23
5
0,01
Ancho patilla B 0,015 0,018 0,30 0,37 0,45
2
0,51 12,9
Longitud entre extremos de patillas extremas lado 1 D1 0,520 0,530 13,20 13,45
0 5
0,51 12,9
Longitud entre extremos de patillas extremas lado 2 E1 0,520 0,530 13,20 13,45
0 5
0,39
Longitud de encapsulado lado 1 D 0,394 0,398 9,90 10,00 10,10
0
0,39
Longitud de encapsulado lado 2 E 0,394 0,398 9,90 10,00 10,10
0
0,02
Biselado esquina indicativo de patilla 1 X 0,035 0,045 0,64 0,89 1,14
5
Ángulo de biselado de cápsula α 5 10 15 5 10 15
Ángulo de biselado inferior de cápsula β 5 12 15 5 12 15
Microcontrolador PIC16F876 Página 156

Unidades PULGADAS MILÍMETROS


Límites dimensión MÍN NOM MÁX MÍN NOM MÁX
Número de patillas n 44 44
Paso entre patillas p 0,050 1,27
0,16
Altura desde plano de placa A 0,173 0,180 4,19 4,38 4,57
5
0,09
Altura desde placa a centro A1 0,103 0,110 2,41 2,60 2,79
5
0,01
Separación de la placa base A2 0,023 0,030 0,38 0,57 0,76
5
0,02
Altura del bisel del lado 1 A3 0,029 0,034 0,61 0,74 0,86
4
0,04
Achaflanado de la esquina 1 CH1 0,045 0,050 1,02 1,14 1,27
0
0,00
Achaflanado de cualquier otra esquina CH2 0,005 0,010 0,00 0,13 0,25
0
0,68 17,4
Longitud entre extremos de patillas extremas lado 2 E1 0,690 0,695 17,53 17,65
5 0
0,68 17,4
Longitud entre extremos de patillas extremas lado 1 D1 0,690 0,695 17,53 17,65
5 0
0,65 16,5
Longitud de encapsulado lado 2 E 0,653 0,656 16,59 16,66
0 1
Microcontrolador PIC16F876 Página 157

0,65 16,5
Longitud de encapsulado lado 1 D 0,653 0,656 16,59 16,66
0 1
0,61 15,4
Ancho de base E2 0,620 0,630 15,75 16,00
0 9
0,61 15,4
Distancia centros de curvatura de patillas extremas D2 0,620 0,630 15,75 16,00
0 9
Ancho hasta centro de patillas extremas n1 11 11
0,00
Grosor de patilla c 0,010 0,012 0,20 0,25 0,30
8
0,02
Ancho superior de patilla B1 0,029 0,032 0,66 0,74 0,81
6
0,01
Ancho inferior de patilla B 0,018 0,021 0,38 0,46 0,53
5
0,05
Largo parte superior de patilla L 0,058 0,065 1,27 1,46 1,65
0
0,00
Radio de doblado superior R1 0,005 0,010 0,08 0,13 0,25
3
0,01
Radio de doblado inferior R2 0,025 0,035 0,38 0,64 0,89
5
Ángulo de biselado de cápsula α 0 5 10 0 5 10
Ángulo de biselado inferior de cápsula β 0 5 10 0 5 10

You might also like