Professional Documents
Culture Documents
EL MICROCONTROLADOR PIC16F876
Características principales:
Prestaciones de periféricos:
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
Nº Nº Tipo
Nombre de la patilla Familia Descripción
DIP SOIC I/O/P
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.
RP1:RP0 Banco
00 0
01 1
10 2
11 3
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
* No es físicamente un registro.
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.
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.
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.
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.)
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 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.
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.
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.
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.
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.
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 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 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
Nota 1: PSPIE queda reservado en los dispositivos de 28 patillas; se debe mantener siempre a cero.
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.
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 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 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.
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.
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.
El registro PIR2 contiene los bits indicadores de las interrupciones de CCP2, conflicto de bus de
SSP y operación de escritura en EPROM.
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.
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).
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.
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).
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.
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
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.
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
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:
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.
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
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
RC3/SCK/SCL Bit3 ST Entrada-salida. Reloj serie síncrono para los modos SPI y I2C.
RC5/SDO Bit5 ST Entrada-salida. Dato de salida del Puerto Serie Síncrono (SSP).
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
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.
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.
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.
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.
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
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.
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”.
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.
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.
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.
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.
bit 7: -RBPU:
bit 6: INTEDG
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
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
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.
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.
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.
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.
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
Cristales comprobados:
Epson C-
32,768 KHz +/- 20 PPM
001R32.768K-A
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.
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.
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.
El Timer2 puede anularse, borrando el bit de control TMR2ON (T2CON<2>), para minimizar el
consumo del dispositivo.
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.
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
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.
Captura Timer1
Comparación Timer1
PWM Timer2
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.
8.1.1 CONFIGURACIÓN DE LA
PATILLA CCP
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.
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.
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.
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
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).
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>).
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.
El período PWM se especifica escribiendo el registro PR2. El período PWM puede calcularse
usando la siguiente relación:
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.
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.
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.
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
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.
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
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
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).
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.
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.
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.
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.
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>).
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.
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.
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.
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.
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
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.
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).
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).
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.
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.
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.
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.
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
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
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.
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
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á.
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
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
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.
Nota: El módulo SSP debe estar en estado desconectado antes de que el bit RCEN se active o el
bit RCEN se despreciará.
9.2.12.1INDICADOR BF 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.
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
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).
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
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).
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
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).
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 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.
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
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
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
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
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.
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.
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.
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
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 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.
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.
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.
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.
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
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
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.
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
98h TXSTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 -010 0000 -010
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.
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.
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
98h TXSTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 -010 0000 -010
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
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.
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
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>).
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.
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
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
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
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.
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
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
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
El módulo CAD posee cinco entradas para dispositivos de 28 patillas, y ocho para el resto de
dispositivos.
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 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
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
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
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.
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.
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.
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.
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.
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.
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
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.
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.
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
______
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 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.
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
Condensador.
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.
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.
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
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.
Hay que resaltar que el reset WDT no pone a cero a la patilla MCLR .
Microcontrolador PIC16F876 Página 109
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.
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.
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
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.
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.
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.
12.10 Interrupciones
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.
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.
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.
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>).
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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
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.
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
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
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
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”.
Sintaxis: XORLW k
15.0 CARACTERÍSTICAS ELÉCTRICAS
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.
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-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.
Nº
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
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
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.
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
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