Nothing Special   »   [go: up one dir, main page]

Manual Pic16f87x PDF

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 79

Microcontroladores FLASH CMOS de 8 bits de 28/40 pines

Dispositivos incluidos en este manual:


• PIC16F873
• PIC16F874
• PIC16F876
• PIC16F877
Características principales del uC
• CPU RISC de alto desempeño
• Sólo 35 instrucciones
• Todas las instrucciones son de ciclo simple excepto para ramificaciones las cuales son de dos ciclos
• Velocidad de operación:
- entrada de reloj DC-20MHz
- ciclo de instrucción DC-200ns
• Hasta 8K x 14 words de Memoria de Programa FLASH
• Hasta 368 bytes de Memoria de Datos (RAM).
• El PIC16F873 contiene 192 bytes de memoria de datos tipo RAM
• Hasta 256 bytes de memoria de datos EEPROM
• Salida de pines compatible a PIC16C738/74B/76/77
• Capacidad de interrupción (hasta 14 fuentes)
• Pila de hardware de profundidad de ocho niveles
• Modos de direccionamiento directo e indirecto
• Reset de encendido
• Temporizador de power-up (PWRT) y Temporizadores de arranque de oscilador (OST)
• Temporizador guardián (WDT) con su oscilador RC on-chip propio para operación confiable
• Código de protección programable
• Modo SLEEP para ahorro de energía
• Opciones de oscilador seleccionable
• Tecnología FLASH/EEPROM CMOS de alta velocidad, de baja potencia
• Diseño completamente estático
• Programación TM Serial in-circuit (ICSP) vía dos pines
• Capacidad de Programación Serial in-circuit de 5V simple
• Acceso de lectura/escritura del procesador a la memoria de programa
• Rango de voltaje de operación ancho: 2.0V a 5.5V
• Corriente de Fuente/Sink alta: 25mA
• Rangos de temperatura Industrial y Comercial
• Consumo de baja potencia:
- <2 mA típico @5V, 4 MHz
- 20 uA típico @3V, 32 kHz
- <1uA de corriente de standby típico

Características Periféricas
• Timer0: Temporizador/contador de 8 bits con preescalador de 8 bits
• Timer1: Temporizador/contador de 16 bits con preescalador, puede ser incrementado durante sleep vía un
cristal/reloj externo
• Timer2: Temporizador/contador de 8 bits con un registro, preescalador y postescalador de periodo de 8 bits
• Dos módulos Captura, Comparación y PWM
- Captura es de 16 bits, max. resolución es 12.5 ns
- Comparación es de 16 bits, max resolución es 200 ns
- PWM max. resolución es de 10 bits
• Conversor Análogo Digital multicanal de 10 bits
• Puerto Serial Síncrono (SSP) con SPI (Modo Master) y I2C (Master/Slave)
• Transmisor Receptor Asíncrono Síncrono Universal (USART/SCI) con detección de dirección de 9 bits
• Puerto Esclavo Paralelo (PSP) de 8 bits de ancho con controles /RD, /WR y /CS exterior (sólo 40/44 pines)
• Brown-out Reset: Se produce un reset ante un fallo de alimentación (BOR)
Presentación de los encapsulados

Tipos de encapsulado del PIC16F873/6

FIGURA 01

Tipos de encapsulado del PIC16F874/7

FIGURA 02
Tipos de encapsulado del PIC16F874/7

FIGURA 03

FIGURA 04
TABLA 01: Características Periféricas

Características de referencia de
PIC16F873 PIC16F874 PIC16F876 PIC16F877
los PICmicro de rango medio
Frecuencia de operación DC - 20 MHz DC - 20 MHz DC - 20 MHz DC - 20 MHz
Resets (y retardos) POR, BOR POR, BOR POR, BOR POR, BOR
(PWRT, OST) (PWRT, OST) (PWRT, OST) (PWRT, OST)
Memoria de Programa FLASH 4K 4K 8K 8K
(words de 14 bits)
Memoria de Datos (bytes) 192 192 368 368
Memoria de Datos EEPROM 128 128 256 256
Interrupciones 13 14 13 14
Puertos I/O Puertos A,B,C Puertos Puertos A,B,C Puertos
A,B,C,D,E A,B,C,D,E
Temporizadores 3 3 3 3
Módulos 2 2 2 2
Captura/Comparación/PWM
Comunicaciones Seriales MSSP,USART MSSP,USART MSSP,USART MSSP,USART
Comunicaciones Paralelas - PSP - PSP
Módulo Análogo Digital de 10 bits 5 canales de 8 canales de 5 canales de 8 canales de
entrada entrada entrada entrada
Set de Instrucciones 35 instrucciones 35 instrucciones 35 instrucciones 35 instrucciones

Apreciación global del dispositivo

Este manual contiene información específica del dispositivo.


Hay cuatro dispositivos (PIC16F873, PIC16F874, PIC16F876 y PIC16F877) cubiertos en este manual. Los dispositivos
PIC16F876/873 vienen en empaques de 28 pines y los dispositivos PIC16F877/874 vienen en empaques de 40 pines.
Los dispositivos de 28 pines no tienen implementado el Puerto Paralelo Esclavo.
Las siguientes dos figuras son diagramas de bloques del dispositivo clasificados por el número de pines; Figura 5 para
28 pines y Figura 6 para el de 40 pines. Las salidas de pines de 28 pines y 40 pines están enlistadas en la Tabla 2 y en
la Tabla 3 respectivamente.
Diagrama de bloques del PIC16F873/6

FIGURA 05
Diagrama de bloques del PIC16F874/7

FIGURA 06
TABLA 02: Descripción de los pines del PIC16F873 y PIC16F876
Nombre del Pin DIP SOIC Tipo Tipo Descripción
Pin# Pin# I/O/P Buffer
OSC1/CLKIN 9 9 I ST/CMOS(3) Entrada de cristal oscilador /Entrada de fuente de reloj externo
OSC2/CLKOUT 10 10 O - Salida de cristal oscilador. Conecta al cristal o resonador en el
modo oscilador de cristal. En el modo RC el pin OSC2 sale
CLKOUT, la cual tiene 1/4 de la frecuencia de OSC1, y denota
la tasa de ciclo de instrucción.
/MCLR/Vpp/THV 1 1 I/P ST Entrada del master clear o entrada del voltaje de programación o
control de modo de prueba de alto voltaje. Este pin es un reset
activo en bajo para el dispositivo.
El puerto A es un puerto I/O bidireccional
RA0/AN0 2 2 I/O TTL RA0 puede ser también entrada análoga 0
RA1/AN1 3 3 I/O TTL RA1 puede ser también entrada análoga 1
RA2/AN2/VREF- 4 4 I/O TTL RA2 puede ser también entrada análoga 2 o voltaje de
referencia análogo negativo
RA3/AN3/VREF+ 5 5 I/O TTL RA3 puede ser también entrada análoga 3 o voltaje de
referencia análogo positivo
RA4/T0CKI 6 6 I/O ST RA4 puede ser también entrada de reloj al módulo
Timer 0. La salida es de tipo drenaje abierto.
RA5//SS/AN4 7 7 I/O TTL RA5 puede ser también entrada análoga 4 o el selector
esclavo para el puerto serial asíncrono
El puerto B es un puerto I/O bidireccional. El Puerto B puede ser
El puerto B es un puerto I/O bidireccional. El Puerto B puede ser
programado por software para pull-ups débiles internas en todas
las entradas.
RB0/INT 21 21 I/O TTL/ST(1) RB0 puede ser también pin de interrupción externa
RB1 22 22 I/O TTL
RB2 23 23 I/O TTL
RB3/PGM 24 24 I/O TTL RB3 puede ser también entrada de programación de
bajo voltaje
RB4 25 25 I/O TTL Pin de interrupción por cambio
RB5 26 26 I/O TTL Pin de interrupción por cambio

RB6/PGC 27 27 I/O TTL/ST(2) Pin de interrupción por cambio o pin de Debugger In-
Circuit. Reloj de programación serial.
RB7/PGD 28 28 I/O TTL/ST(2) Pin de interrupción por cambio o pin de Debugger In-
Circuit. Data de programación serial.
El Puerto C es un puerto I/O bidireccional
RC0/T1OSO/T1CKI 11 11 I/O ST RC0 puede ser también salida del oscilador de Timer 1
la entrada de reloj de Timer 1.
RC1/T1OSI/CCP2 12 12 I/O ST RC1 puede ser también la entrada del oscilador de
Timer 1 o la entrada Captura 2/salida Compare 2/ salida
PWM 2.
RC2/CCP1 13 13 I/O ST RC2 puede ser también la entrada Captura 1/ salida
Compare 1/ salida PWM 1.
RC3/SCK/SCL 14 14 I/O ST RC3 puede ser también la entrada/salida de reloj serial
síncrono para ambos modos SPI e I2C.
RC4/SDI/SDA 15 15 I/O ST RC4 puede ser también la Data entrante SPI (modo SPI)
o la data I/O (modo I2C).
RC5/SDO 16 16 I/O ST RC5 puede ser también la Data de salida SPI (modo
SPI).
RC6/TX/CK 17 17 I/O ST RC6 puede ser también el Reloj Síncrono o
Transmisión Asíncrona USART.
RC7/RX/DT 18 18 I/O ST RC7 puede ser también la Recepción Asíncrona o la
Data Síncrona USART.
VSS 8,19 8,19 P - Referencia de tierra para pines lógicos e I/O
VDD 20 20 P - Fuente positiva para pines lógicos e I/O

Leyenda: I = entrada O = salida I/O = entrada/salida P = energía


- = no usado TTL = entrada TTL ST = entrada Schmitt Trigger
Nota 1: Este buffer es una entrada Schmitt Trigger cuando es configurada como interrupción externa
2: Este buffer es una entrada Schmitt Trigger cuando es usado en el modo de programación serial
3: Este buffer es una entrada Schmitt Trigger cuando es configurado en el modo oscilador RC y entrada CMOS de otra
manera

TABLA 03: Descripción de los pines del PIC16F874 y PIC16F877


Nombre del Pin DIP PLCC Tipo Tipo Descripción
Pin# Pin# I/O/P Buffer
OSC1/CLKIN 13 14 I ST/CMOS Entrada de cristal oscilador /Entrada de fuente de reloj externo
OSC2/CLKOUT 14 15 O - Salida de cristal oscilador. Conecta al cristal o resonador en el
modo oscilador de cristal. En el modo RC el pin OSC2 sale
CLKOUT, la cual tiene 1/4 de la frecuencia de OSC1, y denota
la tasa de ciclo de instrucción.
/MCLR/Vpp/THV 1 2 I/P ST Entrada del master clear o entrada del voltaje de programación o
control de modo de prueba de alto voltaje. Este pin es un reset
activo en bajo para el dispositivo.

El puerto A es un puerto I/O bidireccional

RA0/AN0 2 3 I/O TTL RA0 puede ser también entrada análoga 0


RA1/AN1 3 4 I/O TTL RA1 puede ser también entrada análoga 1
RA2/AN2/VREF- 4 5 I/O TTL RA2 puede ser también entrada análoga 2 o voltaje de
referencia análogo negativo
RA3/AN3/VREF+ 5 6 I/O TTL RA3 puede ser también entrada análoga 3 o voltaje de
referencia análogo positivo
RA4/T0CKI 6 7 I/O ST RA4 puede ser también entrada de reloj al módulo
Timer 0. La salida es de tipo drenaje abierto.
RA5//SS/AN4 7 8 I/O TTL RA5 puede ser también entrada análoga 4 o el selector
esclavo para el puerto serial asíncrono
El puerto B es un puerto I/O bidireccional. El Puerto B puede ser
programado por software para pull-ups débiles internas en todas
las entradas.

RB0/INT 33 36 I/O TTL/ST(1) RB0 puede ser también pin de interrupción externa
RB1 34 37 I/O TTL
RB2 35 38 I/O TTL
RB3/PGM 36 39 I/O TTL RB3 puede ser también entrada de programación de
bajo voltaje
RB4 37 41 I/O TTL Pin de interrupción por cambio
RB5 38 42 I/O TTL Pin de interrupción por cambio

RB6/PGC 39 43 I/O TTL/ST(2) Pin de interrupción por cambio o pin de Debugger In-
Circuit. Reloj de programación serial.
RB7/PGD 40 44 I/O TTL/ST(2) Pin de interrupción por cambio o pin de Debugger In-
Circuit. Data de programación serial.
El Puerto C es un puerto I/O bidireccional
RC0/T1OSO/T1CKI
15 16 I/O ST RC0 puede ser también salida del oscilador de Timer 1
la entrada de reloj de Timer 1.

RC1/T1OSI/CCP2 16 18 I/O ST RC1 puede ser también la entrada del oscilador de


Timer 1 o la entrada Captura 2/salida Compare 2/ salida
PWM 2.

RC2/CCP1 17 19 I/O ST RC2 puede ser también la entrada Captura 1/ salida


Compare 1/ salida PWM 1.

RC3/SCK/SCL 18 20 I/O ST RC3 puede ser también la entrada/salida de reloj serial


síncrono para ambos modos SPI e I2C.

RC4/SDI/SDA 23 25 I/O ST RC4 puede ser también la Data entrante SPI (modo SPI)
o la data I/O (modo I2C).

RC5/SDO 24 26 I/O ST RC5 puede ser también la Data de salida SPI (modo
SPI).

RC6/TX/CK 25 27 I/O ST RC6 puede ser también el Reloj Síncrono o


Transmisión Asíncrona USART.

RC7/RX/DT 26 29 I/O ST RC7 puede ser también la Recepción Asíncrona o la


Data Síncrona USART.

Puerta D

RD0/PSP0 19 21 I/O ST/TTL(3)

RD1/PSP1 20 22 I/O ST/TTL(3)

RD2/PSP2 21 23 I/O SST/TTL(3)

RD3/PSP3 22 24 I/O SST/TTL(3)

RD4/PSP4 27 30 I/O SST/TTL(3)

RD5/PSP5 28 31 I/O SST/TTL(3)

RD6/PSP6 29 32 I/O SST/TTL(3)

RD7/PSP7 30 33 I/O SST/TTL(3)

Puerta E
RE0//RD/AN5 8 9 I/O ST/TTL(3)

RE1//WR/AN6 9 10 I/O ST/TLL(3)

RE2//CS/AN7 10 11 I/O ST/TLL(3)

Vss 12,31 13,34 P _ Referencia de tierra para pines lógicos e I/O

VDD 11,32 12,35 P _ Fuente positiva para pines lógicos e I/O

NC _ 1,17, _ Estos pines no están conectados internamente


28,40
Leyenda: I = entrada O = salida I/O = entrada/salida P = energía
- = no usado TTL = entrada TTL ST = entrada Schmitt Trigger
Nota 1: Este buffer es una entrada Schmitt Trigger cuando es configurada como interrupción externa
2: Este buffer es una entrada Schmitt Trigger cuando es usado en el modo de programación serial
3: Este buffer es una entrada Schmitt Trigger cuando es configurado en el modo oscilador RC y entrada CMOS de otra
manera

Organización de la Memoria
Hay tres bloques de memoria en cada uno de estos PICmicro.
La memoria de programa y la Memoria de Datos, tienen buses separados de manera que el acceso concurrente puede
ocurrir.
Estos PIC tienen un bloque de memoria de datos EEPROM.

Organización de la Memoria de Programa


Los dispositivos PIC16F87X tienen contador de programa de 13 bits capaz de direccionar un espacio de memoria de
programa de 8K x 14. Los dispositivos PIC16F877/876 tienen palabras de 8K x 14 de memoria de programa FLASH y
los dispositivos PIC16F873/874 tienen 4K x 14.
El vector de reset está en 0000h y el vector de interrupción está en 0004h.

FIGURA 07: Memoria de Programa PIC16F876/7


FIGURA 08: Memoria de Programa PIC16F873/4

Organización de la Memoria de Datos


La memoria de datos está particionada en múltiples bancos los que contienen los Registros de Propósito General y los
Registros de Función Especial. Los bits RP1 (STATUS<6>) y RP0 (STATUS<5>) son los bits de selección de banco.

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

Cada banco se extiende hasta 7Fh (128 bytes). Las posiciones más bajas de cada banco están reservadas para Registros
de Función Especial. Sobre los Registros de Función Especial están los Registros de Propósito General, implementados
como RAM estática. Todos los bancos implementados contienen Registros de Función Especial. Algunos Registros de
Función Especial de "alto uso" de un banco pueden ser reflejados en otro banco para reducción de código y acceso más
rápido.
ARCHIVOS DE REGISTRO DE PROPÓSITO GENERAL
El archivo de registro puede ser accesado directa o indirectamente a través de Registro de Selección de Archivo FSR.

FIGURA 09: Mapa de Registros PIC17F877/6


FIGURA 10: Mapa de Registros PIC17F874/3
Registros de Función Especial
Los Registros de Función Especial son registros usados por el CPU y módulos periféricos para controlar una operación
deseada del dispositivo. Estos registros están implementados como RAM estática. Una lista de estos registros es dada
en la Tabla 05.Los Registros de Función Especial pueden ser clasificados en dos partes: principales (CPU) y
periféricos. Aquellos registros asociados con las funciones principales son describen a continuación:

TABLA 05
Valor en
Valor en
todos los
Direccion Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 POR,
demás
BOR
resets
Banco 0
00h (4) INDF El direccionado a esta locación usa el contenido de FSR para direccionar a la memoria de datos 0000 0000 0000 0000
01h TMR0 Registro del módulo Timer 0 xxxx xxxx uuuu uuuu
02h (4) PCL Byte menos significativo del Contador de Programa (PC) 0000 0000 0000 0000
03h (4) STATUS IRP RP1 RP0 /TO /PD Z DC C 0001 1xxx 000q quuu
(4) FSR Puntero de dirección de memoria indirecto xxxx xxxx uuuu uuuu
04h
05h PORTA - - Latch de datos de PORTA cuando escrito; pines de PORTA cuando leído --0x 0000 --0u 0000
06h PORTB Latch de datos de PORTB cuando escrito; pines de PORTB cuando leído xxxx xxxx uuuu uuuu
07h PORTC Latch de datos de PORTC cuando escrito; pines de PORTC cuando leído xxxx xxxx uuuu uuuu
(5) PORTD Latch de datos de PORTD cuando escrito; pines de PORTD cuando leído xxxx xxxx uuuu uuuu
08h
(5) PORTE - - - - - RE2 RE1 RE0 ---- -xxx ---- -uuu
09h
(1,4) PCLATH - - - Buffer de escritura para los 5 bits superiores de PC ---0 0000 ---0 0000
0Ah
(4) INTCON GIE PEIE T0IE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u
0Bh
0Ch PIR1 PSPIF (3) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
0Dh PIR2 - (6) - EEIF BCLIF - - CCP2IF - r- 0 0 - -0 - r- 0 0 - -0
0Eh TMR1L Registro de Retención para el Byte Menos Significativo del registro TMR1de 16 bits xxxx xxxx uuuu uuuu
0Fh TMR1H Registro de Retención para el Byte Más Significativo del registro TMR1de 16 bits xxxx xxxx uuuu uuuu
10h T1CON - - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON --00 0000 --uu uuuu
11h TMR2 Registro del módulo Timer 2 0000 0000 0000 0000
12h T2CON - TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 -000 0000 -000 0000
13h SSPBUF Registro de Buffer de Recepción/ Transmisión de Puerto Serial Síncrono xxxx xxxx uuuu uuuu
14h SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 0000 0000 0000 0000
15h CCPR1L Registro Captura/Compare/PWM 1 (LSB) xxxx xxxx uuuu uuuu
16h CCPR1H Registro Captura/Compare/PWM 1 (MSB) xxxx xxxx uuuu uuuu
17h CCP1CON - - CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 --00 0000 --00 0000
18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000x 0000 000x
19h TXREG Registro de Data Transmitida USART 0000 0000 0000 0000
1Ah RCREG Registro de Data Recibida USART 0000 0000 0000 0000
1Bh CCPR2L Registro Captura/Compare/PWM 2 (LSB) xxxx xxxx uuuu uuuu
1Ch CCPR2H Registro Captura/Compare/PWM 2 (MSB) xxxx xxxx uuuu uuuu
1Dh CCP2CON - - CCP2X CCP2Y CCP2M3 CCP2M2 CCP2M1 CCP2M0 --00 0000 --00 0000
1Eh ADRESH Byte alto del Registro Resultado de A/D xxxx xxxx uuuu uuuu
GO-
1Fh ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 - ADON 0000 00-0 0000 00-0
/DONE

TABLA 05
Valor en
Valor en
todos los
Direccion Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 POR,
demás
BOR
resets
Banco 1
80h (4) INDF El direccionado a esta locación usa el contenido de FSR para direccionar a la memoria de datos 0000 0000 0000 0000
81h OPTION_R /RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 1111 1111 1111 1111
EG
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
(4) FSR Puntero de dirección de memoria indirecto xxxx xxxx uuuu uuuu
84h
85h TRISA - - Registro de configuración de PORTA --11 1111 --11 1111
86h TRISB Registro de configuración de PORTB 1111 1111 1111 1111
87h TRISC Registro de configuración de PORTC 1111 1111 1111 1111
(5) TRISD Registro de configuración de PORTD 1111 1111 1111 1111
88h
(5) TRISE IBF OBF IBOV PSPMODE - 0000 -111 0000 -111
89h
(1,4) PCLATH - - - Buffer de escritura para los 5 bits superiores de PC ---0 0000 ---0 0000
8Ah
(4) INTCON GIE PEIE T0IE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u
8Bh
(3)
8Ch PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000
8Dh PIE2 - (6) - EEIF BCLIF - - CCP2IF - r- 0 0 - -0 - r- 0 0 - -0
8Eh PCON - - - - - - /POR BOR ---- --qq ---- --uu

8Fh - No implementado - -
90h - No implementado - -
91h SSPCON2 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN 0000 0000 0000 0000
92h PR2 Registro Periodo Timer2 1111 1111 1111 1111
93h SSPADD 2 0000 0000 0000 0000
Registro de dirección del Puerto Serial Síncroco (modo I C)
94h SSPSTAT SMP CKE D//A P S R//W UA BF 0000 0000 0000 0000
95h - No implementado - -
96h - No implementado - -
97h - No implementado - -
98h TXSTA CSRC TX9 TXEN SYNC - BRGH TRMT TX9D 0000 -010 0000 -010
99h SPBRG Registro Generador de razón de Baudio 0000 0000 0000 0000
9Ah - No implementado - -
9Bh - No implementado - -
9Ch - No implementado - -
9Dh - No imlementado - -
9Eh ADRESL Byte bajo del Registro Resultado de A/D xxxx xxxx uuuu uuuu
9Fh ADCON1 ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0 0--- 0000 0--- 0000
Valor en
Valor en
todos los
Direccion Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 POR,
demás
BOR
resets
Banco 2
(4) INDF El direccionado a esta locación usa el contenido de FSR para direccionar a la memoria de datos 0000 0000 0000 0000
100h
101h TMR0 Registro del módulo Timer 0 xxxx xxxx uuuu uuuu
(4) PCL Byte menos significativo del Contador de Programa (PC) 0000 0000 0000 0000
102h
(4) STATUS IRP RP1 RP0 /TO /PD Z DC C 0001 1xxx 000q quuu
103h
(4) FSR Puntero de dirección de memoria indirecto xxxx xxxx uuuu uuuu
104h
105h - No implementado - -
106h PORTB Latch de datos de PORTB cuando escrito; pines de PORTB cuando leído xxxx xxxx uuuu uuuu
107h - No implementado - -
108h - No implementado - -
109h - No implementado - -
(1,4) PCLATH - - - Buffer de escritura para los 5 bits superiores de PC ---0 0000 ---0 0000
10Ah
(4) INTCON GIE PEIE T0IE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u
10Bh
10Ch EEDATA Registro de datos EEPROM xxxx xxxx uuuu uuuu
10Dh EEADR Rgistro de dirección EEPROM xxxx xxxx uuuu uuuu
10Eh EEDATH - - Byte más significativo de datos EEPROM
xxxx xxxx uuuu uuuu
10Fh EEADRH - - - Byte mas significativo de dirección EEPROM xxxx xxxx uuuu uuuu
Bank 3

180h (4) INDF El direccionado a esta locación usa el contenido de FSR para direccionar a la memoria de datos 0000 0000 0000 0000
181h OPTION_R /RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 1111 1111 1111 1111
EG
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 dirección de memoria indirecto xxxx xxxx uuuu uuuu
185h - No implementado - -
186h TRISB Registro de configuración de PORTB 1111 1111 1111 1111
187h - No implementado - -
188h - No implementado - -
189h - No implementado - -
(1,4) PCLATH - - - Buffer de escritura para los 5 bits superiores de PC ---0 0000 ---0 0000
18Ah
(4) INTCON GIE PEIE T0IE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u
18Bh
18Ch EECON1 EEPGD - - - WRERR WREN WR RD x--- x000 x--- x000
18Dh EECON2 Registro 2 de control de la EEPROM (registro no físico) ---- ---- ---- ----
18Eh - Reservado 0000 0000 0000 0000
18Fh - Reservado 0000 0000 0000 0000
Registros de Función Especial

Registro STATUS
El registro STATUS contiene el estado aritmético del ALU, el estado RESET y los bits de selección de banco de la
memoria de datos.
El registro STATUS puede ser también el destino para cualquier instrucción como cualquier otro registro. Si el registro
STATUS es el destino de una instrucción que afecta a Z, los bits DC o C, luego la escritura a estos bits es deshabilitada.
Estos bits son puestos a uno o borrados de acuerdo con la lógica del dispositivo. Más allá, los bits /TO y /PD no son
escribibles.
Por ejemplo, CLRF STATUS borrará los tres bits superiores y pondrá a uno el bit Z. Esto deja al registro STATUS
como 000u u1uu (donde u = sin cambio).
Es recomendado, sin embargo, que sólo las instrucciones BCF, BSF, SWAP y MOVF sean usadas para alterar el
registro STATUS, porque estas instrucciones no afectan a los bits Z, C o DC del registro STATUS. Para otras
instrucciones que no afectan a los bits de estado, ver "Sumario de Set de Instrucciones".
Nota: Los bits C y DC operan como bits de /préstamo y /préstamo de dígito, respectivamente, en la resta.

REGISTRO: Registro STATUS (DIRECCIÓN 03h, 83h, 103h, 183h)


R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x
IRP RP1 RP0 /TO /PD Z DC C
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
U = Bit no implementado,
leído como '0'
-n = Valor en reset POR

bit 7: IRP: bit de Selección de Banco de Registros (usado para direccionamiento indirecto)
1 = Banco 2, 3 (100h - 1FFh)
0 = Banco 0, 1 (00h - FFh)
bit 6-5: RP1:RP0: bits de Selección del 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 es de 128 bytes
bit 4: /TO: bit de Time-out
1 = Después de energizado, instrucción CLRWDT o instrucción SLEEP.
0 = Al rebasar el tiempo del WDT
bit 3: /PD: bit de Power-down
1 = Después de energizado, instrucción CLRWDT
0 = Por ejecución de la instrucción SLEEP
bit 2: Z: bit Zero
1 = El resultado de una operación aritmética o lógica es cero
0 = El resultado de una operación aritmética o lógica no es cero
bit 1: DC: bit de acarreo-/préstamo de dígito (instrucciones ADDWF, ADDLW, SUBLW, SUBWF)
1 = Un carry-out del 4to bit de orden bajo del resultado ocurrió
0 = Ningún carry-out del 4to bit de orden bajo del resultado ocurrió
bit 0: C: bit de acarreo-/préstamo (instrucciones ADDLW, ADDLW, SUBLW, SUBWF)
1 = Un carry-out del bit más significativo del resultado ocurrió
0 = Ningún carry-out del bit más significativo del resultado ocurrió
Nota: Para /préstamo la polaridad está reservada. Una substracción es ejecutada por la adición del
complemento a dos del segundo operando. Para las instrucciones de rotación (RRF, RLF), este bit es cargado
con cualquier bit de orden alto o bajo del registro fuente.
Registro OPTION_REG
El registro OPTION_REG es un registro leíble y escribíble, el cual contiene varios bits de control para configurar el
prescalador de TMR0/prescalador de WDT (registro de asignación simple conocido también como prescalador), las
Interrupciones Externas INT, el TMR0 y las pull-ups débiles en PORTB.

Nota: Ejecutar una asignación de 1:1 al prescalador para el registro TRM0, asigna el prescalador al Temporizador de
Watchdog.

REGISTROS: Registro OPTION_REG (DIRECCIÓN 81h, 181h)


R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
/RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
U = Bit no implementado,
leído como '0'
-n = Valor en reset POR

bit 7 : /RBPU: Bit de Habilitación de Pull-up de PORTB


1 = Pull-ups de PORTB están deshabilitadas
0 = Pull-ups de PORTB están habilitadas por valores de latch de puerto individuales
bit 6: INTEDG: Bit de Selección de Flanco de Interrupción
1 = Interrupción en flanco de subida del pin RB0/INT
0 = Interrupción en flanco de bajada del pin RB0/INT
bit 5: T0CS: Bit de Selección de Fuente de Reloj de TMR0
1 = Transición en pin RA4/T0CKI
0 = Reloj de Ciclo de Instrucción Interno (CLKOUT)
bit 4: T0SE: Bit de Selección de Flanco de Fuente de TRM0
1 = Incremento en transición de alto a bajo en el pin RA4/T0CKI
0 = Incremento en transición de bajo a alto en el pin RA4/T0CKI
bit 3: PSA: Bit de Asignación del Prescalador
1 = Prescalador es asignado al WDT
0 = Prescalador es asignado al módulo Timer0
bit 2-0: PS2:PS0: Bits de Selección de rango del Prescalador

Valor de Bit Rango del TMR0 Rango del WDT


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

Registro INTCON
El registro INTCON es un registro leíble y escribíble, que contiene varios bits de habilitación y flags para el
desbordamiento del registro TMR0, cambio de Puerto B e interrupciones externas de pin RB0/INT

Nota: Los bits de flag de interrupción se ponen a uno cuando ocurre una condición de interrupción, indiferente del
estado del bit de habilitación correspondiente o el bit de habilitación global GIE (INTCON<7>). El software de usuario
debe asegurarse que los bits de flag de interrupción apropiados sean borrados previos a habilitar una interrupción.
REGISTROS: Registro INTCON (DIRECCIÓN 0Bh, 8Bh, 10Bh, 18Bh)
R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
U = Bit no implementado,
leído como '0'
-n = Valor en reset POR

bit 7: GIIE: Bit de Habilitación de Interrupción Global


1 = Habilita las interrupciones no enmascaradas
0 = Deshabilita todas las interrupciones
bit 6: PEIE: Bit de Habilitación de Interrupción Periféricas
1 = Habilita todas las interrupciones periféricas no enmascaradas
0 = Deshabilita todas las interrupciones periféricas
bit 5: T0IE: Bit de Habilitación de Interrupción de Desbordamiento de TMR0
1 = Habilita la interrupción de TMR0
0 = Deshabilita la interrupción de TMR0
bit 4: INTE: Bit de Habilitación de Interrupción Externa de RB0/INT
1 = Habilita la interrupción externa de RB0/INT
0 = Deshabilita la interrupción externa de RB0/INT
bit 3: RBIE: Bit Habilitación de Interrupción de Cambio del Puerto RB
1 = Habilita la interrupción de cambio del puerto RB
0 = Deshabilita la interrupción de cambio del puerto RB
bit 2: T0IF: Bit de Flag de Interrupción de Desbordamiento de TMR0
1 = El registro TMR0 se ha desbordado (debe ser borrado por software)
0 = El registro TMR0 no se ha desbordado
bit 1: INTF: Bit de Flag de Interrupción Externa de RB0/INT
1 = La interrupción externa RB0/INT ocurrió (debe ser borrado por software)
0 = La interrupción externa RB0/INT no ocurrió
bit 0: RBIF: Bit de Flag de Interrupción de Cambio de Puerto RB
1 = Al menos uno de los pines RB7:RB4 cambió de estado (debe ser borrado por software)
0 = Ninguno de los pines RB7:RB4 cambió de estado.

Registro PIE1
El registro PIE1 contiene los bits de habilitación individual para las interrupciones periféricas

Nota: El bit PEIE (INTCON<6>) debe ser puesto a uno para habilitar cualquier interrupción periférica.

REGISTROS: Registro PIE1 (DIRECCIÓN 8Ch)


R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
PSPIE (1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
U = Bit no implementado,
leído como '0'
-n = Valor en reset POR

bit 7 : PSPIE(1) : Bit de Habilitación de Interrupción de Lectura/Escritura de Puerto Esclavo Paralelo


1 = Habilita la interrupción de lectura/escritura PSP
0 = Deshabilita la interrupción de lectura/escritura de PSP
bit 6: ADIE: Bit de Habilitación de Interrupción de Conversor A/D
1 = Habilita la interrupción del conversor A/D
0 = Deshabilita la interrupción del conversor A/D
bit 5: RCIE: Bit de Habilitación de Interrupción de Recepción USART
1 = Habilita la interrupción de recepción USART
0 = Deshabilita la interrupción de recepción USART
bit 4: TXIE: Bit de Habilitación de Interrupción de Transmisión USART
1 = Habilita la interrupción de transmisión USART
0 = Deshabilita la interrupción de transmisión USART
bit 3: SSPIE: Bit Habilitación de Interrupción del Puerto Serial Síncrono
1 = Habilita la interrupción de SSP
0 = Deshabilita la interrupción de SSP
bit 2: CCP1IE: Bit de Habilitación de Interrupción de CCP1
1 = Habilita la interrupción de CCP1
0 = Deshabilita la interrupción de CCP1
bit 1: TMR2IE: Bit de Habilitación de Interrupción de Match de PR2 y TMR2
1 = Habilita el TMR2 para interrupción de match a PR2
0 = Deshabilita el TMR2 para interrupción de match a PR2
bit 0: TMR1IE: Bit de Habilitación de Interrupción de Desbordamiento de TMR1
1 = Habilita la interrupción de desbordamiento de TMR1
0 = Deshabilita la interrupción de desbordamiento de TMR1

Nota 1: PSPIE está reservado en los dispositivos de 28 pines; siempre mantener este bit a cero.

Registro PIR1
El registro PIR1 contiene bits de flags individuales para interrupciones periféricas.

Nota: Los bits de flag de interrupción se ponen a uno cuando una condición de interrupción ocurre, indiferente del
estado del bit de habilitación correspondiente o el bit de habilitación global GIE (INTCON<7>). El software de usuario
debe asegurarse que los bits de flag de interrupción apropiados sean borrados previos a habilitar una interrupción.

REGISTRO: Registro PIR1 (DIRECCIÓN 0Ch)


R/W-0 R-0 R-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
PSPIF (1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
-n = Valor en reset POR

bit 7: PSPIF(1): Bit de Flag de Interrupción de Lectura/Escritura de Puerto Esclavo Paralelo


1 = Una operación de lectura o escritura ha tenido lugar (debe ser borrado por software)
0 = Ninguna lectura o escritura ha ocurrido
bit 6: ADIF: Bit de Flag de Interrupción de Conversor A/D
1 = Una conversión A/D completada
0 = La conversión A/D no está completa
bit 5: RCIF: Bit de Flag de Interrupción de Recepción USART
1 = El buffer de recepción USART está lleno
0 = El buffer de recepción USART está vacío
bit 4: TXIF: Bit de Flag de Interrupción de Transmisión USART
1 = El buffer de transmisión USART está vacío
0 = El buffer de transmisión USART está lleno
bit 3: SSPIF: Flag de Interrupción del Puerto Serial Síncrono (SSP)
1 = La condición de interrupción de SSP ha ocurrido, y debe ser borrado por software antes de retornar desde
la rutina de interrupción. Las condiciones que pondrán a uno este bit son:
SPI
Una transmisión/recepción ha tenido lugar
I2C Esclavo
Una transmisión/recepción ha tenido lugar
I2C Maestro
Una transmisión/recepción ha tenido lugar
La condición de comienzo inicializada fue completada por el módulo SSP.
La condición de parada inicializada fue completada por el módulo SSP.
La condición de recomienzo inicializada fue completada por el módulo SSP.
La condición de reconocimiento inicializada fue completada por el módulo SSP.
Una condición de comienzo ocurrió mientras que el módulo SSP estaba inactivo (Sistema Multimaestro).
Una condición de parada ocurrió mientras que el módulo SSP estaba inactivo (Sistema Multimaestro).
0 = Ninguna condición de interrupción SSP ha ocurrido.
bit 2: CCP1IF: Bit de Flag de Interrupción de CCP1
Modo Captura
1 = Una captura del registro TMR0 ocurrió (debe ser borrado por software)
0 = Ninguna captura del registro TMR0 ocurrió
Modo Compare
1 = Un match de comparación de registro TMR1 ocurrió (debe ser borrado por software)
0 = Ningún match de comparación de registro TMR1 ocurrió
Modo PWM
No usado en este modo
bit 1: TMR2IF: Bit de Flag de Interrupción de Match de PR2 a TMR2
1 = Match del TMR2 y PR2 ocurrió (debe ser borrado por software)
0 = Ningún match de TMR2 y PR2 ocurrió
bit 0: TMR1IF: Bit de Flag de Interrupción de Desbordamiento de TMR1
1 = Registro TMR1 se desbordó (debe ser borrado por software)
0 =Registro TMR1 no se desbordó

Nota 1: PSPIF está reservado en los dispositivos de 28 pines; siempre mantener este bit a cero.

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

REGISTRO: Registro PIE2 (DIRECCIÓN 8Dh)


U-0 R/W-0 U-0 R/W-0 R/W-0 U-0 U-0 R/W-0
- - - EEIE BCLIE - - CCP2IE
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
U = Bit no implementado,
leído como '0'
-n = Valor en reset POR

bit 7: No implementado: Leído como '0'


bit 6: Reservado: Siempre mantener este bit en cero
bit 5: No implementado: Leído como '0'
bit 4: EEIE: Habilitación de Interrupción Operación de Escritura de EEPROM
1 = Habilita la interrupción de Escritura de EE
0 = Deshabilita la interrupción de Escritura de EE
bit 3: BCLIE: Habilitación de Interrupción de Colisión de Bus
1 = Habilita la interrupción de Colisión de Bus
0 = Deshabilita la interrupción de Colisión de Bus
bit 2-1: No implementado: Leído como '0'
bit 0: CCP2IE: Bit de Habilitación de Interrupción CCP2
1 = Habilita la interrupción CCP2
0 = Deshabilita la interrupción CCP2
Registro PIR2
El registro PIR2 contiene los bits de flag para la interrupción CCP2, la interrupción de colisión de bus SSP y la
interrupción de operación de escritura de EEPROM.

Nota: Los bits de flag de interrupción se ponen a uno cuando una condición de interrupción ocurre, indiferente del
estado del bit de habilitación correspondiente o el bit de habilitación global GIE (INTCON<7>). El software de usuario
debe asegurarse que los bits de flag de interrupción apropiados sean borrados previos a habilitar una interrupción.

REGISTRO: Registro PIR2 (DIRECCIÓN 0Dh)


U-0 R/W-0 U-0 R/W-0 R/W-0 U-0 U-0 R/W-0
- - - EEIF BCLIF - - CCP2IF
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
U = Bit no implementado,
leído como '0'
-n = Valor en reset POR

bit 7: No implementado: Leído como '0'


bit 6: Reservado: Siempre mantener este bit en cero
bit 5: No implementado: Leído como '0'
bit 4: EEIF: Bit de flag de Interrupción Operación de Escritura de EEPROM
1 = La operación de escritura completada (debe ser borrado por software)
0 = La operación de escritura no está completa o no ha sido comenzada
bit 3: BCLIF: Flag de Interrupción de Colisión de Bus
1 = Una colisión de bus ha ocurrido en el SSP, cuando configurado para el módulo maestro I2C
0 = Ninguna colisión de bus ha ocurrido
bit 2-1: No implementado: Leído como '0'
bit 0: CCP2IF: Bit de Flag de Interrupción CCP2
Modo Captura
1 = Una captura de registro TMR1 ocurrió (debe ser borrado por software)
0 = Ninguna capture de registro TMR0 ocurrió
Modo Campara
1 = Un match de comparación del registro TMR1 ocurrió (debe ser borrado por software)
0 = Ningún match de comparación de registro TMR1 ocurrió
Modo PWM
No usado

Registro PCON
El registro Control de Energía (PCON) contiene bits de flag para permitir diferenciación entre un Reset Power-on, un
Reset Brown-out (BOR), un Reset de Watch-dog (WDT) y un Reset externo /MCLR.

Nota: /BOR es desconocido en POR. Debe ser puesto a uno por el usuario y revisado en resets subsecuentes para ver si
BOR está borrado, indicando que un brown-out ha ocurrido. El bit de estado de BOR es un don't care y no es predecible
si el circuito de brown-out está deshabilitado (por limpiar el bit BODEN en la word de configuración).
REGISTROS: Registro PCON (DIRECCIÓN 8Eh)
U-0 U-0 U-0 U-0 U-0 U-0 R/W-0 R/W-1
- - - - - - /POR /BOR
Bit 7 bit 0
R = Bit leíble
W = Bit escribible
U = Bit no implementado,
leído como '0'
-n = Valor en reset POR

bit 7-2: No implementado: Leído como '0'


bit 1: /POR: Bit de Estado de Reset de Power-on
1 = Ningún Reset de Power-on ocurrió
0 = Un Reset de Power-on ocurrió (debe ser puesto a uno por software después que un Reset de Power-on
ocurre)
bit 0: /BOR: Bit de Estado de Reset de Brown-out
1 = Ningún Reset de Brown-out ocurrió
0 = Un Reset de Brown-out ocurrió (debe ser puesto a uno por software después que un Reset de Brown-out
ocurre)

PCL y PCLATH
El Contador de programa (PC) es de 13 bits de ancho. El byte bajo viene del registro PCL, el cual es un registro leíble y
escribíble. Los bits superiores (PC<12:8>) no son leíbles, pero son indirectamente escribibles a través del registro
PCLATH. En cualquier reset, los bits superiores del PC serán borrados. La Figura 11 muestra las dos situaciones para
el cargado de PC. El ejemplo superior en la figura muestra como el PC es cargado en una escritura de PCL
(PCLATH<4:3> => PCH). El ejemplo inferior en la figura muestra como el PC es cargado durante una instrucción
CALL o GOTO (PCLATH<4:3> =>PCH).

FIGURA 11
GOTO calculado
Un GOTO calculado es realizado por la adición de un offset al contador de programa (ADDWF PCL). Cuando se hace
una lectura de tabla usando un método de GOTO calculado, se debe tener cuidado si la posición de la tabla cruza un
límite de memoria de PCL (cada bloque de 256 bytes).

PILA
La familia PIC16CXX tiene pila de hardware de 8 niveles de profundidad por 13 bits de ancho. El espacio de la pila no
es parte ni del espacio de programa o de datos y el puntero de pila no es leíble o escribible. El PC es empujado (PUSH)
hacia la pila cuando una instrucción CALL es ejecutada o una interrupción causa una ramificación. La pila es sacada
(POP) en el evento de ejecución de instrucción de RETURN, RETLW o RETFIE. El PCLATH no es afectado por una
operación de PUSH o POP.
La pila opera como un buffer circular. Esto significa que después que la pila ha sido empujada ocho veces, el noveno
push sobrescribe el valor que fue almacenado del primer push. El décimo push sobrescribe el segundo push (así en
adelante).
Nota 1: No hay bits de estado para indicar condiciones de desbordamiento o underflow de pila.
2: No hay instrucciones/mnemónicos llamados PUSH o POP. Estas son acciones que ocurren de la ejecución
de una instrucción CALL, RETURN, RETLW y RETFIE o el vectorizado a una dirección de interrupción.

Paginado de la Memoria de Programa


Los dispositivos PIC16CXX son capaces de direccionar un bloque continuo de 8k de word de la memoria de programa.
Las instrucciones CALL y GOTO proveen sólo 11 bits de dirección para permitir la ramificación dentro de cualquier
página de programa de memoria de 2K. Cuando se realiza una instrucción CALL o GOTO, los 2 bits superiores de la
dirección son provistos por PCLATH<4:3>. Cuando se realiza una instrucción CALL o GOTO el usuario se debe
asegurar que los bits de selección de página están programados de manera que la página de memoria de programa
deseada es direccionada. Si un retorno desde una instrucción CALL (o interrupción) es ejecutada, el PC de 13 bits
entero es sacado de la pila. Por consiguiente, la manipulación de los bits PCLATH<4:3> no es requerida para las
instrucciones de retorno (las cuales sacan la dirección de la pila).
El Ejemplo 1 muestra el llamado de una subrutina en la página 1 de la memoria de programa. Este ejemplo asume que
el PCLATH está guardado y realmacenado por la rutina de servicio de interrupción (si la interrupción es usada)

Ejemplo 1: Llamado de una subrutina en la página 1 desde la página 0


org 0x500
BCF PCLATH,4
BSF PCLATH,3 ; Selecciona página 1 (8000h - FFFh)
CALL SUB1_P1 ; Llama a subrutina en
; página 1 (8000h - FFFh)
---
---
org 0x900 ; página 1 (800h - FFFh)
SUB1_P1
--- ; subrutina llamada
--- ; página 1 (800h - FFFh)
---
RETURN ; retorna
; en página 0 (000h - 7FFh)

Direccionamiento Indirecto, registros INDF Y FSR


El registro INDF no es un registro físico. Direccionar al registro INDF causará un direccionamiento indirecto.
El direccionamiento indirecto es posible usando el registro INDF. Cualquier instrucción que use el registro INDF
realmente accede al registro apuntado por el Registro de Selección de Archivos, FSR. Leer del registro INDF
indirectamente así mismo (FSR = '0') se leerá 00h. Escribir al registro INDF indirectamente resulta una no-operación
(aunque los bits de estado pueden ser afectados). Una dirección de 9 bits efectiva es obtenida concatenando el registro
FSR de 8 bits y el bit IPR (STATUS<7>). Un programa simple para borrar las posiciones 20h - 2Fh de RAM usando
direccionamiento indirecto es mostrado en el Ejemplo 2.

Ejemplo 2: Direccionamiento Indirecto


movlw 0x20 ; inicializa el puntero
movwf FSR ; a RAM
NEXT clrf INDF ; borra el registro INDF
incf FSR,F ; incrementa el puntero
btfss FSR,4 ; terminado?
goto NEXT ; no, borra el siguiente
CONTINUA
-. ; si, continúa

FIGURA 12: Direccionamiento Directo/Indirecto

Puertos I/O
Algunos pines para estos puertos I/O están multiplexados con una función alterna para características periféricas en el
dispositivo. En general, cuando un periférico es habilitado, ese pin no puede ser usado como un pin I/O de propósito
general.

FIGURA 13: Diagrama de bloques del pin RA3:0 Y RA5


FIGURA 14: Diagrama de bloques del pin RA4 Y T0CKI

Registros PORTA y TRISA


PORTA es un puerto bidireccional de 6 bits de ancho. El registro de dirección de data correspondiente es TRISA.
Poniendo a uno un bit de TRISA volverá el pin de PORTA correspondiente una entrada (i.e., poner el manejador de
salida correspondiente en modo alta impedancia). Borrando un bit de TRISA (=0) volverá el pin de PORTA
correspondiente una salida (i.e., poner los contenidos del latch de salida en el pin seleccionado).
El pin RA4 está multiplexado con la entrada de reloj del módulo Timer0 para volverse el pin RA4/T0CKI. El pin
RA4/T0CKI es una entrada Schmitt Trigger y una salida drenaje abierto. Todas los demás pines de PORTA tienen
niveles de entrada TTL y manejadores de salida todos CMOS.
Otros pines de PORTA están multiplexados con entradas análogas y entrada VREF análoga. La operación de cada pin es
seleccionada por borrar o establecer los bits de control en el registro ADCON1 (Registro de Control A/D 1).

Nota: En un Reset de Power-on, estos pines son configurados como entradas análogas y leídas como '0'.

El registro TRISA controla la dirección de los pines RA, aún cuando ellos están siendo usados como entradas análogas.
El usuario se debe asegurar que los bits en el registro TRISA estén mantenidos a uno cuando se usan como entradas
análogas.

Ejemplo 3: Inicializando PORTA

BCF STATUS, RP0 ;


BCF STATUS, RP1 ; Selecciona Banco 0
CLRF PORTA ; Inicializa PORTA borrando los latches de data de salida
BSF STATUS, RP0 ; Selecciona Banco 1
MOVLW 0x06 ; Configura todos los pines
MOVWF ADCON1 ; como salidas digitales
MOVLW 0xCF ; Valor usado para inicializar la dirección de data
MOVWF TRISA ; Establece RA<3:0> como entradas
; RA<5:4> como salidas
; TRISA<7:6> son siempre leídos como '0'

TABLA 06: Funciones de PORTA


Nombre Bit# Buffer Función
RA0/AN0 bit0 TTL Entrada/salida o entrada análoga
RA!/AN1 bit1 TTL Entrada/salida o entrada análoga
RA2/AN2 bit2 TTL Entrada/salida o entrada análoga
RA3/AN3/VREF bit3 TTL Entrada/salida o entrada análoga o VREF
Entrada/salida o entrada de reloj externo para Timer0
RA4/T0CKI bit4 ST
La salida es de tipo drenaje abierto
RA5//SS/AN4 bit5 TTL Entrada/salida o entrada de selección de esclavo para puerto serial síncrono o entrada análoga

Leyenda: TTL 0 = entrada TTL, ST = entrada Schmitt Trigger

TABLA 07: Sumario de registros asociados con PORTA

Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en: Valor en
POR, BOR todos los
otros resets
05h PORTA - - RA5 RA4 RA3 RA2 RA1 RA0 --0x 0000 ''0u 0000
85h TRISA - - Registro de Dirección de Data de PORTA --11 1111 --11 1111
9Fh ADCON1 ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0 --0- 0000 --0- 0000

Leyenda: x = desconocido, u = sin cambio, - = posiciones no implementadas leídas como '0'. Las celdas sombreadas no son usadas
por PORTA

Nota: Cuando se usa el módulo SSP en el modo SPI esclavo y /SS habilitado, el conversor A/D debe ser establecido a uno de los
siguientes modos donde PCF3:PCF0 = 0100, 0101, 011x, 1110, 1111.

Registros PORTB y TRISB


PORTB es un puerto bidireccional de 8 bits de ancho. El registro de dirección de data correspondiente es
TRISB. Poniendo a uno un bit de TRISB volverá el pin de PORTB correspondiente una entrada (i.e., poner el
manejador de salida correspondiente en modo alta impedancia). Borrando un bit de TRISB (=0) volverá el pin de
PORTB correspondiente una salida (i.e., poner los contenidos del latch de salida en el pin seleccionado).
Tres pines de PORTB están multiplexados con funciones de Programación de Bajo Voltaje; RB3/PGM, RB6,/PGC y
RB7/PGD. Las funciones alternas de estos pines están descritas en la Sección de Características Especiales.
Cada uno de los pines de PORTB tiene una pull-up interna débil. Un bit de control simple puede encender todas las
pull-ups. Esto es desempeñado borrando el bit /RBPU (OPTION_REG<7>). Las pull-up débil es automáticamente
apagada cuando el pin del puerto es una salida. Las pull-ups son deshabilitadas en un Reset de Power-on.
Cuatro de los pines de PORTB, RB7:RB4 tienen una característica de cambio en interrupción. Sólo los pines
configurados como entradas pueden causar esta interrupción ocurra (i.e., cualquier pin RB7:RB4 configurado como
salida está excluído de la comparación de interrupción en cambio). Los pines de entrada (de RB7:RB4 son comparados
con el valor anterior latcheado en la última lectura de PORTB. Las salidas no concordantes de RB7:RB4 generan la
Interrupción en Cambio de Puerto RB con el bit de flag RBIF (INTCON<0>).
Esta interrupción puede levantar el dispositivo del SLEEP. El usuario, en la rutina del servicio de interrupción, puede
borrar la interrupción de la siguiente manera:
a) Cualquier lectura o escritura de PORTB. Esto terminará la condición de no concordancia.
b) Borrar el bit de flag RBIF.
Una condición de no concordancia continuará para poner a uno el bit de flag RBIF. Leyendo PORTB terminará la
condición de no concordancia y permitirá el bit de flag RBIF ser borrado.
La característica de interrupción al cambio es recomendada para operaciones de levantar a la presión de tecla y
operaciones donde PORTB es sólo usado para características de interrupción al cambio.
Esta característica de interrupción en no concordancia, junto con las pull-ups configurables por software en estos cuatro
pines, permiten una interface fácil a un teclado y lo hace posible para levantar a la presión de tecla.
RB0/INT es un pin de entrada de interrupción externa y es configurable usando el bit INTEDG (OPTION_REG<0>).
Nota: Cuando se usa la Programación ICSP de Bajo Voltaje y las pull-ups en PORTB están habilitadas, el bit 3 en el
registro TRISB debe ser borrado para deshabilitar la pull-up en RB3 y asegurar la operación apropiada del dispositivo.
FIGURA 15: Diagrama de bloques del pin RB3:0

FIGURA 16: Diagrama de bloques del pin RB7:4


TABLA 08: Sumario de registros asociados con PORTB

Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en: Valor en
POR, BOR todos los
otros resets
06h, PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu
106h
86h, TRISB Registro de Dirección de Data de PORTB 1111 1111 1111 1111
186h
81h, OPTION_ /RBPU INTEDG TOCS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
REG
181h

Leyenda: x = desconocido, u = sin cambio, - = posiciones no implementadas leídas como '0'. Las celdas sombreadas no son usadas
por PORTB

Registros PORTC y TRISC


Consta de 8 líneas bidireccionales cuyo sentido se configura mediante el registro TRISC.

TABLA 09: Funciones de PORTC


Nombre Bit# Buffer Función
RC0/T1OSO/T1CKI bit0 ST Esta línea puede actuar como I/O digital, como salida del Timer1 o como entrada de impulsos
Para el Timer1
RC1/T1OSI/CCP2 bit1 ST I/O digital /Entrada al Oscilador del Timer 1/Entrada del Módulo de Captura 2; Salida del
Comparador 2; Salida del PWM 2
RC2/CCP1 bit2 ST I/O digital/Entrada Captura 1; Salida Comparador 1; Salida PWM 1
RC3/SCK/SCL bit3 ST I/O digital/Señal de reloj en modo SPI/Señal de reloj en modo I2C
RC4/SDI/SDA bit4 ST I/O digital/Entrada de datos en modo SPI/Línea de datos en modo I2C
RC5/SDO bit5 ST I/O digital/Salida de datos en modo SPI

RC6/TX/CK bit6 ST I/O digital/línea de transmisión en USART/Señal de reloj síncrona en transmisión serie

RC7/RX/DT bit7 ST I/O digital/Línea de transmisión en USART/Línea de datos en transmisión serie síncrona

Leyenda: ST = entrada Schmitt Trigger

TABLA 10: Sumario de registros asociados a PORTC

Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en: Valor en
POR, BOR todos los
otros Resets
07h PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 xxxx xxxx uuuu uuuu
87h TRISC Registro de Dirección de Data de PORTC 1111 1111 1111 1111

Leyenda: x = desconocido, u = sin cambio

Registros PORTD y TRISD


Consta de 8 líneas bidireccionales cuyo sentido se configura mediante el registro TRISD.
Sólo se encuentra en los PIC de 40 pines. Ocupa la dirección 08h, mientras que su registro de configuración TRISD
ocupa la dirección 88h.
Todas las patitas disponen en su entrada de un Trigger Schmitt.
Además de usarse como líneas de I/O digital, implementan una Puerta Paralela Esclava de 8 líneas (PSP), que sirve
para establecer la comunicación paralelo con otros elementos del sistema.
FIGURA 17: Diagrama de bloques de PORTD

TABLA 11: Funciones de PORTD


Nombre Bit# Buffer Función
RD0/PSP0 bit0 ST/TTL (1) Pin de I/O digital o bit0 de la Puerta paralela Esclava
RD1/PSP1 bit1 ST/TTL (1) Pin de I/O digital o bit1 de la Puerta paralela Esclava
RD2/PSP2 bit2 ST/TTL (1) Pin de I/O digital o bit2 de la Puerta paralela Esclava
RD3/PSP3 bit3 ST/TTL (1) Pin de I/O digital o bit3 de la Puerta paralela Esclava
RD4/PSP4 bit4 ST/TTL (1) Pin de I/O digital o bit4 de la Puerta paralela Esclava
RD5/PSP5 bit5 ST/TTL (1) Pin de I/O digital o bit5 de la Puerta paralela Esclava
RD6/PSP6 bit6 ST/TTL (1) Pin de I/O digital o bit6 de la Puerta paralela Esclava
RD7/PSP7 bit7 ST/TTL (1) Pin de I/O digital o bit7 de la Puerta paralela Esclava

Leyenda: ST = entrada Schmitt Trigger TTL = entrada TTL

TABLA 12: Sumario de registros asociados con PORTD

Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en: Valor en
POR, BOR todos los
otros resets
08h PORTD RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 xxxx xxxx uuuu uuuu
88h TRISD Registro de Dirección de Data de PORTD 1111 1111 1111 1111
89h TRISE IBF OBF IBOV PSPMODE - Bits de dirección de PORTE 0000 -111 0000 -111

Leyenda: x = desconocido, u = sin cambio -= no implementado y se lee como “0”


Registros PORTE y TRISE
Ocupa la dirección 09h y sólo la tienen los PIC16F87X de 40 pines.
Dispone de 3 patitas multifunción, que se configuran como entrada o salida, según el valor de los tres bits menos
significativos del registro TRISE, ubicado en la dirección 89h.

FIGURA 18: Diagrama de bloques de PORTE

TABLA 13: Funciones de PORTE


Nombre Bit# Buffer Función
RE0//RD/AN5 bit0 ST/TTL (1) I/O digital/Señal de lectura en el modo de Puerta Paralela Esclava/Canal 5 del CAD
RE1//WR/AN6 bit1 ST/TTL (1) I/O digital/Señal de escritura en modo PSP/Canal 6 del conversor A/D
RE2//CS/AN7 bit2 ST/TTL (1) I/O digital/Selección de Chip en l modo PSP/Canal 7 del Conversor A/D

Leyenda: ST = entrada Schmitt Trigger TTL = entrada TTL

TABLA 14: Sumario de registros asociados con PORTE


Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en: Valor en
POR, BOR todos los
otros resets
09h PORTE - - - - - RE2 RE1 RE0 ---- -xxx ---- -uuu
89h TRISE IBF OBF IBOV PSPMODE - Registro de Dirección de Data de PORTE 0000 -111 0000 -111

9Fh ADCON1 ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0 --0- 0000 --0- 0000

Leyenda: x = desconocido, u = sin cambio -= no implementado y se lee como “0”


Módulo Timer0
El módulo temporizador/contador Timer0 tiene las siguientes características:
• Temporizador/contador de 8 bits
• Leíble y escribíble
• Prescalador programable por software de 8 bits
• Selección de reloj externo o interno
• Interrupción en desbordamiento desde FFh a 00h
• Selección de flanco para reloj externo
La Figura 19 es un diagrama de bloques del módulo Tiemr0 y el prescalador es compartido con el WDT.
El modo temporizador es seleccionado borrando el bit T0CS (OPTION_REG<5>). En el modo temporizador, el
modulo Timer0 se incrementará todo ciclo de instrucción (sin prescalador). Si el registro TMR0 es escrito, el
incremento es inhibido para las siguientes dos ciclos de instrucción. El usuario puede trabajar alrededor de esto
escribiendo un valor ajustado al registro TMR0.
El modo contador es seleccionado poniendo a uno el bit T0CS (OPTION_REG<5>). En el modo contador, el Timer0 se
incrementará o en cada flanco de subida o de bajada del pin RA4/T0CKI. El flanco incremento es determinado por el
bit de Selección de Fuente de Timer0 T0SE (OPTION_REG <4>). Borrando el bit T0SE se selecciona el flanco de
subida. Las restricciones en la entrada de reloj externa son discutidas
El prescalador es mutua y exclusivamente compartido entre el módulo Timer0 y el temporizador watchdog. El
prescalador no es escribíble o leíble.

FIGURA 19: Diagrama de bloques de TMR0/WDT

Interrupción de TMR0
La interrupción TMR0 es generada cuando el registro TMR0 se desborda desde FFh a 00h. Este desbordamiento pone
en 1 el bit T0IF (INTCON<2>). La interrupción puede ser enmascarada borrando el bit T0IE (INTCON<5>). El T0IF
debe ser borrado por software por la rutina de servicio de interrupción del módulo Timer0 antes de rehabilitar esta
interrupción.
Usando el Timer0 con un reloj externo
Cuando el prescalador no es usado, la entrada de reloj externo es la misma que la salida del prescalador. La
sincronización de T0CKI con los relojes de fase interna accomplished muestreando la salida del prescalador en los
ciclos Q2 y Q4 de los relojes de fase interna. Sin embargo, es necesario el T0CKI ser alto para al menos 2*Tosc (y un
retardo RC pequeño de 20nseg).
Preescalador
Sólo hay un preescalador disponible, el cual es mutua y exclusivamente compartido entre el módulo Timer0 y el
temporizador watchdog. Una asignación del prescalador del módulo Timer0 significa que no hay prescalador para el
temporizador watchdog y viceversa. Este prescalador no es leíble y escribíble (ver figura19).
Los bits PSA y PS2:PS0 (OPTION_REG<3:0>) determinan la selección del prescalador y la razón de prescala.
Cuando es asignado al Timer0, todas las instrucciones escritas al registro TMR0 (p.j CLRF 1, MOVF 1, BSF 1, x...
etc.) borrarán el prescalador. Cuando es asignado al WDT, una instrucción CLRWDT borrará el prescalador a lo largo
con el Temporizador Watchdog. El prescalador no es leíble ni escribíble.
Nota: Escribiendo al TMR0 cuando el prescalador es asignado al Timer0, borrará la cuenta del prescalador, pero no
cambiará la asignación del prescalador.

REGISTRO: REGISTRO OPTION_REG


R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
/RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
U = Bit no implementado,
leído como '0'
-n = Valor en reset POR

bit 7 : /RBPU
bit 6: INTEDG
bit 5: TOCS: Bit de selección de fuente de reloj TMR0.
1 = Transición en el pin T0CKI.
0 = Reloj de ciclo de instrucción interno (CLKOUT).
bit 4 : T0SE: Bit de selección de flanco de fuente TMR0.
1 = Incremento en una transición de alto a bajo en el pin T0CKI.
0 = Incremento en una transición de bajo a alto en el pin T0CKI.
bit 3 : PSA: Bit de asignación del prescalador.
1 = Prescalador es asignado al WDT.
0 = Prescalador es asignado al módulo Timer0.
bit 2-0 : PS2:PS0: Bit de selección de razón de prescalador.
1 = Una colisión de bus ha ocurrido en el SSP, cuando configurado para el módulo maestro I2C
0 = Ninguna colisión de bus ha ocurrido

Valor de Bit Rango del TMR0 Rango del WDT


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

TABLA 15: Sumario de registros asociados con Timer0


Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en: Valor en todos
POR, BOR los otros resets
01h,101h TMR0 Registro del módulo Timer0 xxxx xxxx uuuu uuuu
0Bh, 8Bh,
10Bh, 18Bh
INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
81h, 181h OPTION_REG /RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
Módulo Timer1
El módulo Timer1 es un temporizador/Contador de 16 bits consistente en 2 registros de 8 bits (TMR1H y
TMR1L) los cuales son leíbles y escribíbles. El par de registros TMR1 (TMR1H:TMR1L) se incrementa
desde 0000h a FFFFh y rota alrededor de 0000h. La interupción de TMR1, si es habilitado es generada en un
desbordamiento, el cual es latcheado en un bit de flag de interrupción TMR1IF (PIR1<0>). Esta interrupción
puede ser habilitada/deshabilitada poniendo a 1/0 el bit de habilitación de interrupción de TMR1, TMR1IE
(PIE1<0>).
El Timer1 puede operar en dos modos.
• Como temporizador.
• Como contador.
El modo de operación es determinado por el bit de selección de reloj TMR1CS (T1CON<1>).
En el modo temporizador, Timer1 se incrementa cada ciclo de instrucción. En el modo contador, se incrementa
en cada flanco de subida de la entrada de reloj externa.
El Timer1 puede ser habilitado/deshabilitado poniendo 1/0 el bit de control TMR1ON (T1CON<0>).
El Timer1 tiene también “una entrada reset” interna. Este reset puede ser generado por cualquiera de los dos
módulos CCP.
Cuando el oscilador de Timer1 es habilitado (T1OSCEN es 1), los pines RC1/T1OSI/CCP2 y
RC0/T1OSO/T1CKI se vuelven entradas. Esto es, el valor de TRISC<1:0> es ignorado.

REGISTRO: T1CON: Registro de control de Timer1(DIRECCIÓN 10h)


U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
- - T1CKPS1 T1CKPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
U = Bit no implementado,
leído como '0'
-n = Valor en reset POR

bit 7-6 : No implementado: Leído como '0'


bit 5-4 : T1CKPS1:T1CKPS0: Bit de selección del prescalador del reloj de entrada de Timer1.
11 = 1:8 Valor del prescalador.
10 = 1:4 Valor del prescalador.
01 = 1:2 Valor del prescalador.
00 = 1:1 Valor del prescalador.
bit 3: T1OSCEN: Bit de control de habilitación del oscilador de Timer1.
1 = El oscilador esta habilitado
0 = El oscilador esta shut off (el inversor del oscilador es apagado para eliminar el drenaje de energía).
bit 2 : /T1SYNC: Bit de control de sincronización de entrada de reloj externa del Timer1.
TMR1CS =1.
1 = No sincroniza la entrada de reloj externo.
0 = Sincroniza la entrada de reloj externo.
TMR1CS = 0
Este bit es ignorado. El Timer1 usa el reloj interno cuando TMR1CS = 0.
bit 1 : TMR1CS: Bit de selección de fuente de reloj de Timer1.
1 = Reloj externo del pin RC0/T1OSO/T1CKI (en el flanco de subida).
0 = Reloj interno (Fosc/4)
bit 0: TMR1ON: Bit de on de Timer1.
1 = Habilita Timer1.
0 = Para Timer0.

Registro de control del Timer1 (T1CON)


El funcionamiento del TMR1 está gobernado por el valor con el que se programan los bits del registro T1CON, que
ocupa la dirección 10h de la memoria de datos RAM.
El bit TMR1ON gobierna el permiso o la prohibición de funcionamiento del Timer1. En caso de poner un 0 en dicho
bit el TMR1 no funciona.
El bit TMR1CS selecciona la fuente de los impulsos de contaje. Si vale 0 elige el reloj interno (Fosc/4) y si vale 1 el
reloj externo que se aplica por las patitas RC0 y RC1.
Cuando los impulsos proceden de un reloj externo, es preciso que el bit T1OSCEN tenga valor 1, en cuyo caso las
patitas RC0/T1OSO/T1CKI y RC1/T1OSI/CCP2 actúan como entradas del oscilador externo.
Si T1OSCEN vale 0 los impulsos vendrán a través de RC0/T1OSO/T1CKI. En ambos casos, el TMR1 funciona como
contador de eventos externos y los bits 1 y 0 del registro TRISC carecen de significado, ya que una o ambas patitas
RC1 y RC0 no pueden actuar al mismo tiempo como entrada de impulsos y como líneas de entrada/salida.
Entre las patitas RC1 y RC0 se puede poner un cristal de hasta una frecuencia de 200 Khz.
El Predivisor de frecuencia es un simple divisor de la frecuencia de los impulsos que se aplican al TMR1 por 1,2,4 u 8.
El rango de división lo eligen los bits T1CKPS1 y T1CKPS0 según la tabla siguiente:

T2CKPS1 T2CKPS0 RANGO DEL DIVISOR


0 0 1:1
0 1 1:2
1 0 1:4
1 1 1:8

El bit T1SYNC# determina la posible sincronización o no de los impulsos del reloj externo con los del reloj interno,
según valga 0 o 1 respectivamente.
Cuando el módulo CCP está configurado como comparador para generar un “disparo especial” (CCP1M3:CCP1M0 =
1011), dicha señal resetea el TMR1. para aprovechar esta característica, el TMR1 debe estar configurado en modo
temporizador o contador síncrono. En otro caso se produce el Reset.

TABLA 16: Sumario de registros asociados con TMR1 como Temporizador/Contador

Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en: Valor en
POR, BOR todos los
otros resets
0Bh, 8Bh,
10Bh, INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
18Bh
(1)
OCh PIR1 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000

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

0Eh TMR1L Registro de Retención para el Byte Menos Significativo del registro TMR1de 16 bits xxxx xxxx uuuu uuuu
0Fh TMR1H Registro de Retención para el Byte Más Significativo del registro TMR1de 16 bits xxxx xxxx uuuu uuuu
10h T1CON - - T1CKPS1 T1CKPS0 T1OSCEN /T1SYNC TMR1CS TMR1ON --00 0000 --uu uuuu

Módulo Timer2
Se trata de un temporizador ascendente de 8 bits, que se puede leer y escribir, y que también puede realizar funciones
especiales para la Puerta Serie Síncrona (SSP) y con los módulos de captura y comparación. Ocupa la dirección 11h del
mapa de los registros especiales.
La señal de reloj del TMR2 es interna Fosc/4, y antes de ser aplicada pasa por un predivisor de frecuencia con rango de
1:1, 1:4 y 1:16.
La salida del TMR2 atraviesa un postdivisor de frecuencia con rangos de división desde 1:1 hasta 1:16, pasando por los
16 valores posibles.
Al entrar el µC en modo de reposo o SLEEP, se detiene el oscilador interno y al no existir la señal Fosc/4 deja de
funcionar el TMR2.
Para controlar el funcionamiento del TMR2 se usa el registro T2CON, que ocupa la dirección 12h del mapa de los
registros específicos.
REGISTRO: T2CON: Registro de control de Timer2(DIRECCIÓN 12h)
U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
U = Bit no implementado,
leído como '0'
-n = Valor en reset POR

bit 7-6 : No implementado: Leído como '0'


bit 6-3 : TOUTPS3:TOUTPS0: Bit de selección del rango por el que divide la frecuencia el postdivisor
0000= 1:1 Valor del postdivisor.
0001= 1:2 Valor del postdivisor
0010= 1:3 Valor del postdivisor
.
.
.

1111 = 1:16 Valor del postdivisor


bit 2: TMR20N: Bit de control para permitir o prohibir el funcionamiento del TMR2
1 = Timer2 en ON
0 = Timer2 en OFF

bit 1-0: T2CKPS1:T2CKPS0: Seleccionar el rango de división del predivisor


00 = Prescaler es 1
01 = Prescaler es 4
1x = Prescaler es 16

TABLA 17: Sumario de registros asociados con Timer2 como temporizador/Contador

Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en: Valor en
POR, BOR todos los
otros resets
0Bh, 8Bh,
10Bh, INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
18Bh
OCh 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 Timer 2 0000 0000 0000 0000
12h T2CON - TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 -000 0000 -000 0000
92h PR2 Registro de Periodo del Timer2 1111 1111 1111 1111

Módulos de Captura, Comparación y Modulación de anchura de pulsos


Módulos CCP
Los µC PIC16F87X disponen de dos módulos CCP, llamados CCP1 y CCP2, que son idénticos excepto en lo referente
a la modalidad de “Disparo Especial”.
Dada esta similitud, la descripción hacia el módulo CCP1. Estos módulos pueden realizar tres funciones principales:
1. Modo Captura: una pareja de registros de un módulo CCPx captura el valor que tiene el TMR1 cuando ocurre
un evento especial en la patita RC2/CCP1 (para el módulo CCP1) o en la RC1/T1OSI/CCP2.
2. Modo Comparación: se compara el valor de 16 bits de TMR1 con otro valor cargado en una pareja de registros
de un módulo CCPx y cuando coinciden se produce un evento en la/s patita/s RC2/CCP1 y/o
RC1/T1OSI/CCP2.
3. Modo Modulación de Anchura de Pulsos (PWM): dentro del intervalo del periodo de un impulso controla la
anchura en que la señal vale nivel alto.
El módulo CCP1 utiliza un registro de trabajo de 16 bits que esta formado por la concatenación de los registros
CCPR1H-CCPR1L (direcciones 16h y 15h). El registro de control del módulo CCP1 es el CCP1CON, que ocupa la
dirección 17h.
El módulo CCP2 tiene como registros de trabajo a CCPR2H-CCPR2L (direcciones 1Ch y 1Bh) y como registro de
control a CCP2CON en la dirección 1Dh.
Las parejas de registros son las encargadas de capturar el valor del TMR1, de comparar el valor que tienen con el de
TMR1 o, en el modo PWM, de modular la anchura de impulso.

Modo Captura
En este modo, la pareja de registros CCPxH-L del módulo CCPx captura el valor de 16 bits que contiene el TMR1
cuando sucede un evento en la patita RCy/CCPx de la Puerta C, que previamente ha sido configurada como entrada
poniendo a 1 el bit correspondiente del registro TRISC.
Los eventos posibles que pueden ocurrir sobre la patita RCy/CCPx para producir la captura del valor del TMR1 sobre
la pareja de registros CCPxH-L son:
1. Un flanco ascendente
2. Un flanco descendente
3. Cada 4 flancos ascendentes
4. Cada 16 flancos ascendentes

Los cuatro bits CCP1M3-0 del registro CCP1CON seleccionan el evento adecuado en el módulo CCP1 y otro tanto
sucede en el módulo CCP2.
Al efectuar la captura, se activa el señalizador CCP1IF del registro PIR1. Además, si se pone a 1 el bit de permiso de
interrupción PIE1<CCP1IE>, se genera una petición de interrupción cuando se carga en CCPR1H-L el valor de
TMR1.
Cuando se emplea el módulo CCP1 en modo captura, el TMR1 debe estar configurado para trabajar como temporizador
o como contador síncrono. Nunca de modo asíncrono.
Si se van a cambiar las condiciones de funcionamiento en el modo captura, conviene detener o desactivar al módulo
CCP para evitar que se produzcan falsas interrupciones durante la operación.
Si no se ha leído el contenido de los registros CCPR1H-L y se produce una nueva captura, dichos registros pasan a
contener el nuevo valor.
Cuando se desactiva el módulo CCP o deja de funcionar en modo captura se borra la codificación del predivisor de
frecuencia que determinan los bits CCP1M3-0.

Modo Comparación
En esta forma de trabajo, la pareja de registros CCPR1H-L compara su contenido, de forma continua, con el valor del
TMR1.
Cuando coinciden ambos valores, a la patita RC2/CCP1, que se halla configurada como salida, la acontece uno de los
siguientes eventos, de acuerdo con la programación de los bits CCP1M3-0:

 Pasa a nivel alto


 Pasa a nivel bajo
 No cambia su estado pero se produce una interrupción

Al coincidir los valores del TMR1 con los de la pareja de registros CCPR1H-L se pone a 1 el señalizador CCP1IF.
El TMR1 debe trabajar en modo temporizador o contador síncrono, nunca en modo asíncrono.
Si el bit de permiso de interrupción está a 1, cuando coinciden los valores mencionados se origina una petición de
interrupción.
Si con los bits CCP1M3-0 se selecciona el modo de trabajo de “disparo especial”, el módulo CCP1 pone a 0 el TMR1 y
el CCPR1 funciona como un Registro de Período, capaz de provocar periódicamente interrupciones. En este modo de
disparo especial, el CCP2 pone a 0 el TMR1 y, además,. Inicia una conversión en el conversor A/D, con lo que también
y, con carácter periódico, puede realizar conversiones analógico/digitales sin el control del programa de instrucciones.
TABLA 18: Sumario de registros asociados al Módulo Captura, Comparación y Timer1

Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en: Valor en
POR, BOR todos los
otros resets
0Bh, 8Bh,
10Bh, INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
18Bh
0Ch PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000

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


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

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


87h TRISC Registro de configuración de PORTC 1111 1111 1111 1111
0Eh TMR1L Registro de Retención para el Byte Menos Significativo del registro TMR1de 16 bits xxxx xxxx uuuu uuuu

0Fh TMR1H Registro de Retención para el Byte Más Significativo del registro TMR1de 16 bits xxxx xxxx uuuu uuuu

10h T1CON - - T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON --00 0000 --uu uuuu
15h CCPR1L Registro Captura/Compare/PWM 1 (LSB) xxxx xxxx uuuu uuuu

16h CCPR1H Registro Captura/Compare/PWM 1 (MSB) xxxx xxxx uuuu uuuu

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

Modo de Modulación de anchura de pulsos (PWM)


Con este modo de trabajo, se consiguen impulsos lógicos cuya anchura de del nivel alto es de duración variable.
Son de mucha utilidad en el control de dispositivos como los motores y los triacs.
La patita RC2/CCP1 está configurada como salida y bascula entre los niveles lógicos 0 y 1 a intervalos variables de
tiempo. Lo que se intenta es obtener un impulso cuyo nivel alto tenga una anchura variable(Duty Cycle) dentro del
intervalo del período de trabajo.
Para lograr el basculado de la patita de salida RC2/CCP1 se usa un comparador que pone a 1 un flip-flop cuando el
valor del registro PR2 coincide con la parte alta del TMR2, momento en que l TMR2 toma el valor 00h. Luego el flip-
flop se resetea cuando otro comparador detecta la coincidencia del valor existente en CCPR1H con el de la parte alta
del TMR2.
De esta manera, variando los valores que se cargan en PR2 y en CCPR1L (que luego se traspasa al CCPR1H) se varía
el intervalo de tiempo en el que la patita de salida está a 1 y a 0.
Cuando se trabaja con una precisión de 10 bits, los 2 bits CCP1CON<5:4> se concatenan con los 8 de CCPR1L y, de la
misma forma, los 8 bits de más peso del TMR2 se concatenan con los dos bits de menos peso del reloj interno,
haciendo que el TMR2 cuente cada Tosc en vez de cada 4*Tosc.
El tiempo que dura el período de la onda depende del valor cargado en PR2, según la siguiente fórmula:

Periodo = [(PR2) + 1]*4*Tosc*Valor Predivisor TMR2

Cuando el valor del TMR2 coincide con el del PR2 suceden tres acontecimientos:
1. Se borra el TMR2
2. La patita RC2/CCP1 se pone a 1
3. El valor de CCPR1L, que es el que determina la anchura del impulso, se carga en CCPR1H.

El tiempo que la patita de salida está a nivel alto, que es la anchura del impulso, depende del contenido cargado en
CCPR1L y de los dos bits 5 y 4 del CCP1CON, cuando se trabaja con una precisión de 10 bits.

Anchura Impulso = (CCPR1L:CCP1CON<5:4>) *Tosc*Valor Predivisor TMR2

El valor CCPR1L:CCP1CON<5:4> puede cargarse en cualquier momento, puesto que el mismo no se traspasa a
CCPR1H y se compara hasta que coincidan PR2 con TMR2. En el modo PWM el registro CCPR1L sólo puede ser
leído.
Los pasos a seguir para realizar la configuración del modo PWM son los siguientes:
1. Asignar el periodo cargando el oportuno valor en PR2
2. Asignar la anchura del pulso cargando el registro CCPR1L y los bits 5 y 4 del CCP1CON
3. Configurar la línea RC2/CCP1 como salida
4. Asignar el valor del predivisor y activar el TMR2 escribiendo en T2CON
5. Configurar el Módulo CCP1 en modo PWM.

TABLA 19: Sumario de registros asociados al Módulo PWM y Timer2

Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en: Valor en
POR, BOR todos los
otros resets
0Bh, 8Bh,
10Bh, INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
18Bh
OCh PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000

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


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

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


87h TRISC Registro de configuración de PORTC 1111 1111 1111 1111
11h TMR2 Registro del módulo Timer 2 0000 0000 0000 0000
92h PR2 Registro Periodo Timer2 1111 1111 1111 1111
12h T2CON - TOUTPS3 TOUTPS TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 -000 0000 -000 0000
2
15h CCPR1L Registro Captura/Compare/PWM 1 (LSB) xxxx xxxx uuuu uuuu

16h CCPR1H Registro Captura/Compare/PWM 1 (MSB) xxxx xxxx uuuu uuuu

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

1Bh CCPR2L Registro Captura/Compare/PWM 2 (LSB) xxxx xxxx uuuu uuuu


1Ch CCPR2H Registro Captura/Compare/PWM 2 (MSB) xxxx xxxx uuuu uuuu
1Dh CCP2CON - - CCP2X CCP2Y CCP2M3 CCP2M2 CCP2M1 CCP2M0 --00 0000 --00 0000

PWM, una solución por software para los PIC16CXX

Acá se provee una solución por software para una más exacta y flexible salida PWM, la cual se caracteriza por lo
siguiente:
1. Frecuencia PWM hasta 19.KHz (cristal de 20 MHz).
2. Duty cicle variable desde 0% hasta 100%.
3. Resolución de 8 bits.
4. Tamaño de paso de PWM de 1 Tcy (Tiempo de Ciclo de Instrucción).
5. Generación simultánea de un relog de tiempo del sistema.

Métodos
Antes de que la solución sea revelada, debemos primero examinar los métodos varios por software usados para generar
pulsos de longitud variable.
En las explicaciones siguientes, la unidad de tiempo será la longitud de un Ciclo de Instrucción (Tcy). Usaremos Tcy
porque una instrucción (si el contador de programa no es cambiado) se ejecuta en un Tcy y Timer0 se incrementa cada
Tcy. Esto nos provee con un método para controlar una secuencia de temporizado potencialmente complejo.
Haciendo uso del tiempo necesitado para ejecutar una instrucción brinda un método muy simple de generar un pulso. El
Ejemplo 3 (Método A) muestra una secuencia de instrucción, la cual genera un pulso alto de 99 Tcy en pin 3 del puerto
A. La longitud del pulso es controlado por el valor del registro LENGTH en pasos de 3 Tcy. Éste es el tiempo de
cómputo necesitado por un lazo de programa.
Las desventajas de esto método son el uso del tiempo de cómputo y una resolución pobre de PWM.
Ejemplo 3: Usando Tcy como base de tiempo para la generación de un pulso (Método A)

.
.
.
PORTA equ 04h
LENGTH equ 0ch
COUNTER equ 0dh
.
.
.
movlw 34 ; valor para la longitud del pulso de 99Tcy
movwf LENGTH
.
.
.
movf LENGTH,W ; escritura de valor al contador de lazo
movf COUNTER
bsf PORTA,3 ; comienzo del pulso alto
LOOP
decfsz COUNTER,F ; contando longitud del pulso
goto LOOP
bcf PORTA,3 ; fin del pulso alto
.
.
.

Sin embargo, las características de arquitecturas de los microcontroladores de rango medio de Microchip nos permiten
proceder en otra dirección. El Ejemplo 4 muestra una secuencia de instrucción (Método B), el cual nos habilita para
generar un pulso alto con longitudes variables entre 1 a 5 Tcy. La adición de cualquier número al registro de archivo
PCL incrementa el contador de programa y brinca un número predeterminado de instrucciones (dependiendo del
número añadido a PCL). La longitud del pulso alto es la misma que que el tiempo de cálculo consumido por el número
de instrucciones BSF ejecutdas y controlado por el valor del registro de archivo LENGTH. Si LENGTH es establecido
a 4, 4 instrucciones BSF seran brincadas y un pulso alto de 1 Tcy será generado. Si LENGTH es establecido a =,
ninguna instrucción será brincada y la longitud del pulso permanece en 5 Tcy. Un efecto especial da lugar que
LENGTH sea establecido a 5. Todas las instrucciones BSF son brincadas y por consiguiente ningún pulso alto ocurre.
Esta secuencia de instrucción es capaz de generar pulsos de varias longitudes incluyendo la longitud de 0 Tcy. Este
método generará un pulso largo si LENGTH es establecido a un valor pequeño, y un pulso corto si LENGTH es
establecido a un valor grande.
La desventaja de este método es que es ajustable sólo para pulsos cortos. Pulsos largos requieren una cantidad excesiva
de ROM y tiempo calculado.

Ejemplo 4: Generación de pulso optimizado por arquitectura del dispositivo (Método B)

.
.
.
PORTA equ 04h
LENGTH equ 0ch
.
.
.
movlw 4 ; valor de la longitud de pulso de 1 Tcy
movwf LEGTH
.
.
.
movf LENNGTH,W
addwf PCL,W
bsf PORTA,3 ; comienza pulso alto en 5 Tcy
bsf PORTA,3 ; comienza pulso alto en 4 Tcy
bsf PORTA,3 ; comienza pulso alto en 3 Tcy
bsf PORTA,3 ; comienza pulso alto en 2 Tcy
bsf PORTA,3 ; comienza pulso alto en 1 Tcy
bsf PORTA,3 ; fin de pulso alto
.
.
.

Un tercer método (Método C) usa la Interrupción de Timer0. Después que el puerto es establecido, el temporizador es
cargado con un número ajustado correspondiente a la longitud de pulso deseado. Si el temporizador se desborda, la
rutina de servicio de interrupción comienza y resetea el puerto. El número, el cual tiene que ser cargado, es definido por
los siguientes factores:
* la dirección de cuenta del temporizador (up/down)
* el tiempo entre la carga del temporizador y el establecimiento del puerto
* los ciclos de reloj del temporizador necesarios para escribir al temporizador
* el tiempo de cálculo entre el desbordamiento del temporizador y la ejecución de la primera instrucción de la rutina de
servicio de interrupción
* el tiempo de cálculo de la rutina de servicio de interrupción hasta que el puerto es reseteado
* la longitud de pulso deseado
* un número de corrección adicional, el cual es relacionado al método de cálculo

El método C es capaz de generar longitudes de pulso muy diferentes sin gastar algún tiempo de cálculo. Este método es
especialmente útil para generar pulsos largos. Cuando el prescalador no es usado, el tamaño de paso disponible es de 1
Tcy. Pero este procedimiento es inajustable para generar pulsos muy cortos, porque cada rutina de servicio de
interrupción necesita un mínimo de tiempo de cálculo para su ejecución, lo cual define la longitud de pulso mínimo.
Cada señal PWM es una sucesión continua de pulsos altos y bajos. La longitud de cada pulso es definido por duty cicle
deseado. Sumando la longitud de un pulso alto y bajo nos da la frecuencia PWM, la cual debe ser constante.
El método C sólo trabajará si cada uno de los pulsos no son más largos que el tiempo de cálculo mínimo de la rutina de
servicio de interrupción. La rutina de servicio de interrupción tiene que encontrar el pulso requerido y poner a uno o
borrar el puerto. En adición a la rutina de servicio de interrupción tiene que calcular el número requerido por el
temporizador y escribir ese valor al temporizador.
Por consiguiente es factible usar la interrupción del temporizador dependiendo de la longitud del pulso deseado
conociendo el tiempo mínimo calculado de la rutina de servicio de interrupción. Si el método C no da la señal PWN
deseada uno tiene que echar mano de los métodos A o B descritos en el Ejemplos 3 y en el Ejemplo 4
Cada método tiene sus ventajas y desventajas. Debido a que los tres métodos están basados en software, es posible
cambiar los métodos en cualquier momento. Así mismo, el microcontrolador puede determinar aun durante la rutina
de servicio de interrupción, cual método es el que mejor se ajusta para generar el siguiente pulso.
El módulo PWM por software usa los métodos B C, los cuales son mostrados en la Tabla A. Si es posible, ambos
pulsos son generados por la interrupción del temporizador y dos interrupciones del temporizador ocurre durante un
periodo de PWM. Si un pulso muy corto es necesitado, la rutina de servicio de interrupción generará un pulso corto
usando el método B. Después en adelante escribe un nuevo número correspondiente al pulso de longitud siguiente al
temporizador. Aquí, sólo un interrupción ocurre durante un periodo de PWM. Conociendo el tiempo calculado de cada
parte de la rutina de servicio de interrupción asegura que el cambio de métodos no afectará visiblemente a la señal
PWM o variará la frecuencia PWM.
Ahora demos un vistazo a una aplicación simple de este módulo PWM por software. El diagrama del circuito es
mostrado en la Figura 20.
El potenciómetro R1 ajusta el voltaje desde 0V a VDD. Un PIC16C71 convierte este voltaje a un valor de 8 bits
trentaitres veces por segundo y lo manda por el PORTB. Los ocho leds conectados al PORTB muestran el resultado.
El valor de la señal PWM, el cual es sacado por el pin RA3, es mostrado por la intensidad del LED conectado. Si el
valor es igual a cero, se genera una señal baja continua. Si el valor es igual a 255 se genera una señal alta.
El método de operación del programa es el mismo que el descrito en el procedimiento, el cual es mostrado en la tabla
A.El registro de archivo COUNTER es el registro de reloj del sistema. Es incrementado por el módulo PWM en el
flanco de subida de la señal PWM. El bit 7 es alternado cada 255*128*Tcy y es usado como bit de reloj del sistema.
El registro de archivo PWMDESIRED contiene el valor PWM deseado en el rango de 0 a 255. Los registros
PWMMAX y PWMHELP son necesitados por el módulo PWM. Ellos no deben ser modificados por ninguna otra parte
del programa excepto durante la inicialización.
La constante PWMADJUSTVAL, contiene los factores descritos previamente, los cuales tienen que ser tomados en
cuenta mientras se calcula el valor del temporizador ajustable. La constante PWMMAZVAL controla la longitud de
pulso máximo, el cual es generado haciendo uso del tiempo necesitado para ejecutar las instrucciones BSF/BCF. Si la
rutina de servicio de interrupción es modificada, luego ambas constantes también tienen que ser modificadas.

Conclusión
El módulo PWM basado en software es capaz de generar una frecuencia de PWM de hasta 19.6 KHz con un duty cycle
variable desde 0% hasta 100%. El consumo de la RAM es de 3 bytes, el consumo de la ROM es menor que 10% (casi
100 instrucciones) y el consumo de tiempo cálculo, en el peor caso, asciende a 57/266 = 22.4%, el tiempo de cálculo
restante es más que el total de tiempo de cálculo disponible de un microcontrolador 8051 con un cristal de 12 MHz.

TABLA A: Modos de operación del Módulo PWM por software


Rango del Duty Cycle Pulso Alto Pulso Bajo
0% … 10% Método B Interrupción del Timer
10% … 90% Interrupción del Timer Interrupción del Timer
90% … 100% Interrupción del Timer Método B

FIGURA 20: Circuito para visualizar


Conversor Analógico/Digital
Módulo conversor Análogo Digital (A/D)

El módulo Conversor Análogo Digital (A/D) tiene cinco entradas para los dispositivos de 28 pines y ocho para los
dispositivos de 40 pines.
La entrada análoga carga una muestra y el capacitor de retención. La salida de la muestra y del capacitor de retención
es la entrada en el conversor. El conversor luego genera un resultado digital de este nivel análogo vía aproximaciones
sucesivas. La conversión A/D de la señal de entrada análoga resulta en un correspondiente número de 10 bits. El
módulo A/D tiene entradas de referencia altas y bajas que son seleccionables por software para algunas combinaciones
de VDD, Vss, RA2 o RA3.
El conversor A/D tiene una única característica de ser capaz de operar mientras está en el modo SLEEP. Para operar en
SLEEP, el reloj A/D debe ser derivado de oscilador RC interno del A/D.
El módulo A/D tiene cuatro registros. Estos registros son:

• Registro del Resultado Alto del A/D (ADRESH)


• Registro del Resultado Bajo del A/D (ADRESL)
• Registro0 de Control del A/D (ADCON0)
• Registro1 de Control del A/D (ADCON1)

El registro ADCON0, controla la operación del módulo A/D. El registro ADCON1, configura las funciones de los pines
del puerto. Los pines del puerto pueden ser configurados como entradas análogas (RA3 puede ser también el voltaje de
referencia), o como I/O digitales.

REGISTRO: Registro ADCON0 (DIRECCIÓN: 1Fh)


R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0
ADSC1 ADSC0 CHS2 CHS1 CHS0 GO/DONE# - ADON
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
U = Bit no implementado,
leído como '0'

Bits 7-6: ADCS1:ADCS0:Bits de Selección del Reloj de Conversión A/D


00= Fosc/2.
01= Fosc/8
10= Fosc/32
11= FRC (Reloj derivado del oscilador RC interno del módulo)

bit 5-3: CHS2:CHS0: Bits de Selección del Canal Analógico


000 = channel 0, (RA0/AN0)
001 = channel 1, (RA1/AN1)
010 = channel 2, (RA2/AN2)
011 = channel 3, (RA3/AN3)
100 = channel 4, (RA5/AN4)
101 = channel 5, (RE0/AN5) (1)
110 = channel 6, (RE1/AN6) (1)
111 = channel 7, (RE2/AN7) (1)

bit 2: GO/DONE#: Bits de Estado de la Conversión A/D


Si ADIN = 1:
1 = Conversión A/D en progreso (poniendo a uno este bit comienza la conversión)
0 = Conversión A/D no está en progreso (este bit es automáticamente borrado por hardware cuando la
conversión A/D es completada)
bit 1: No implementado: Leer como ‘0’
bit 0: ADON: Bit de encendido del A/D
1 = Módulo conversor A/D está operando
0 = Módulo conversor A/D está apagado y no consume corriente de operación.

Nota 1: Estos canales no están disponibles en los dispositivos PIC16F873/876

Leyenda
R = bit leíble W = bit escribíble U = Bit no implementado, leído como ‘0’
-n = Valor en POR ‘1’ = Bit es puesto a uno ‘0’ = Bit es borrado x = Bit es desconocido

REGISTRO: Registro ADCON1 (DIRECCIÓN 9Fh)

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


ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0
Bit 7 bit 0
R = Bit leíble
W = Bit escribíble
U = Bit no implementado,
leído como '0'

Bit 7: ADFM: Bit de Selección de Formato de Resultado A/D


1 = Justificado a la Derecha. Los 6 bits más significativos de ADRESH son leídos como “0”
0 = Justificado a la Izquierda. Los 6 bits menos significativos de ADRESL son leídos como “0”

bit 6-4: No Implementados: Leídos como “0”

bit 3-0: PCFG3:PCFG0: bits de Control de Configuración del Puerto A/D

PCFG3: AN7(1) AN6(1) AN5(1) AN4 AN3 AN2 AN1 AN0 VREF+ VREF- CHAN/
PCFG0 RE2 RE1 RE0 RA5 RA3 RA2 RA1 RA0 Refs
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 VREF+ D 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
1001 D D A A A A A A VDD VSS 6/0
1010 D D A A VREF+ A A A RA3 VSS 5/1
1011 D D A A VREF+ VREF- A A RA3 RA2 4/2
1100 D D D A VREF+ VREF- A A RA3 RA2 3/2
1101 D D D D VREF+ VREF- A A RA3 RA2 2/2
1110 D D D D D D D A VDD VSS 1/0
1111 D D D D VREF+ VREF- D A RA3 RA2 1/2
Los registros ADRESH:ADRESL contienen el resultado de 10 bits de la conversión A/D. Cuando la conversión A/D es
completada, el resultado es cargado es este par de registros del A/D, el bit GO//DONE es borrado y el bit de
señalización de interrupción del A/D ADIF es puesto a uno. El diagrama de bloques del módulo A/D es mostrado en la
siguiente Figura 21:

FIGURA 21: Diagrama de bloques del A/D

Después que el módulo A/D ha sido configurado como se desea, el canal seleccionado debe ser adquirido antes que la
conversión sea comenzada. Los canales de entrada análoga deben tener sus correspondientes bits TRIS seleccionados
como entradas.
Después que el tiempo de adquisición ha culminado, la conversión puede ser comenzada.

Estos pasos se deben seguir para hacer una Conversión A/D:

1. Configurar el módulo A/D


• Configurar los pines análogos/referencias de voltaje y I/O digitales
• Seleccionar el canal de entrada del A/D (ADCON0)
• Seleccionar el reloj de conversión del A/D (ADCON0)
• Encender el módulo A/D (ADCON0)
2. Configurar la interrupción por A/D (si se desea):
• Borrar el bit ADIF
• Poner a uno el bit ADIE
• Poner a uno el bit PEIE
• Poner a uno el bit GIE

3. Esperar el tiempo de adquisición requerido

4. Comenzar la conversión:
• Poner a uno el bit GO//DONE (ADCON0)

5. Esperar que la conversión A/D sea completada tanto por:


• Verificando que el bit GO//DONE sea borrado; o
• Esperando por la interrupción A/D

6. Leer el par de registros de resultado del A/D (ADRESH:ADRESL), borrar el bit ADIF si es requerido

7. Para la siguiente conversión, ir al paso 1 ó paso 2, como se requiera. El tiempo de conversión A/D por bit es definido
como TAD. Una espera mínima de 2 TAD es requerida antes que la siguiente adquisición comience.

Requerimientos de la Adquisición A/D

Para que el conversor A/D alcance una exactitud especificada, el capacitor de retención de carga (CHOLD) debe ser
permitido de cargar completamente el nivel de voltaje de canal de entrada. El modelo de entrada análoga es mostrada
en la Figura 22. La impedancia de fuente (Rs) y la impedancia del interruptor de muestreo interno (Rss) directamente
afectan al tiempo requerido para cargar el capacitor CHOLD. La impedancia del interruptor de muestreo (Rss) varía sobre
el voltaje (VDD) del dispositivo. Impedancia máxima recomendada para fuentes análogas es 10k. Asi como la
impedancia decrece, el tiempo de adquisición puede decrecer.

Después que el canal de entrada análogo es seleccionado (cambiado) la adqusición debe ser hecha antes que la
conversión pueda comenzar.
Para calcular el tiempo de adquisición mínimo, se usa la ecuación Q Esta ecuación asume que un error de 1/2 LSB es
usado (1024 pasos para el A/D). El error de 1/2 LSB es el máximo error permitido para el A/D alcance su resolución
especificada.

Ecuación Q tiempo de adquisición

TACQ = Tiempo de Establecimiento del Amplificador + Tiempo de Carga del Capacitor de Retención + Coeficiente de
Temperatura
= TAMP + TC + TCOFF
= 2µs + TC + [(Temperatura – 25 C)(0.05µs/C)]
TC = CHOLD (RIC + RSS + RS)ln(1/2047)
= -120pF (1kΩ + 7 kΩ + 10 kΩ)ln(0.0004885)
= 16.47 µs
TACQ = 2 µs + 16.47 µs + [(50 C – 25 C)(0.05 µs/C)]
= 19.72 µs

Nota:
1. El voltaje de referencia (VREF) no tiene efecto en la ecuación.
2. El capacitor de retención de carga (CHOLD) no es descargado después de cada conversión
3. La impedancia máxima para fuentes análogas es de 10k. Esto se requiere para alcanzar la especificación de
leakage de pin.
4. Luego que una conversión se ha completado, un retardo de 2.0 TAD debe completarse antes que la
adquisición pueda comenzar nuevamente.
FIGURA 22: Modelo de entrada análoga

Seleccionando el Reloj de Conversión A/D


El tiempo de conversión A/D por bit es definido como T AD. La conversión A/D requiere un mínimo de 12 TAD
por conversión de 10 bits. La fuente del reloj de conversión es seleccionable por software. Las cuatro posibles
opciones para TAD son:

• 2 Tosc
• 8 Tosc
• 32 Tosc
• Oscilador RC interno del módulo A/D (2-6us)

Para conversiones A/D correctas, el reloj de conversión A/D (TAD) debe ser seleccionado para asegurar un tiempo
mínimo TAD de 1,6 us.
La Tabla 20 muestra los tiempos TAD resultantes derivados de las frecuencias de operación y la fuente de operación de
reloj seleccionada.

Tabla 20: TAD vs. Frecuencias máximas de operación del dispositivo (dispositivo erstandar)
AD Clock Source (TAD) Maximun Device Frequency
Operación ADCS1:ADCS0 Max.
2TOSC 00 1.25MHz
8TOSC 01 5MHz
32TOSC 10 20MHz
RC(1,2,3) 11 (Note 1)

Nota: 1. La fuente FC tiene un tiempo TAD típico de 4us, pero puede variar entre 2-6 us
2. Cuando las frecuencias del dispositivo son mayores que 1 MHz, la fuente RC del reloj de conversión
A/D es recomendada solo para el modo de operación SLEEP
3. Para dispositivos de voltaje extendido (LC), referirse a Características Eléctricas

Configuración los Pines del Puerto Análogo

Los registros ADCON! Y TRIS controlan la operación de los pines del puerto A/D. Los pines del puerto que son
deseados como entradas análogas deben tener sus correspondientes bits TRIS puestos a uno (entrada). Si el bit TRIS es
puesto a uno (salida), el nivel de salida (VOH o VOL) será convertido.
La operación A/D es independiente del estado de los bits CHS2:CHS0 y los bits TRIS.
Nota: 1. Cuando se lee el registro del puerto, cualquier pin configurado canal de entrada análogo será leído
como cero (un nivel bajo). Los pines configurados como entradas digitales se convertirán en entradas
análogas. Los niveles análogos en una entrada configurada digitalmente no afectaran la exactitud de la
conversión.

2. Los niveles análogos en cualquier pin que es definido como una entrada digital (incluyendo los pines
AN7:AN0) puede causar que el buffer de entrada consuma corriente que està fuera de las
especificaciones del dispositivo.

Nota: El bit GO/DONE Nº NO debe ser puesto a uno en la misma instrucción que se prende el A/D

FIGURA 23: Ciclos TAD de conversión A/D

Registros del resultado A/D

El par de registros ARDESH: ADRESL es la locación donde A/D de 10 bits es cargado en la culminación de la
conversión A/D. Este par de registros es de 16 bits de largo. El módulo A/D brinda la flexibilidad de justificar a la
derecha o a la izquierda el resultado de 10 bits en el registro de resultado de 16 bits. El bit de Selección de Formato
A/D (ADFM) controla esta justificación. La Figura 24 muestra la operación de la justificación del resultado A/D. Los
bits extra son cargados con “0”s”.Cuando un resultado A/D sobrescribirá estas posiciones (A/D deshabilitado), estos
registros pueden ser usados como dos registros de 8 bits de propósito general.

FIGURA 24: Justificación del resultado A/D


Operación del A/D Durante SLEEP

El modulo A/D puede operar durante el modo SLEEP. Este requiere que la fuente de reloj del A/D sea puesta a RC
(ADCS1:ADCSO =11).Cuando la fuente de reloj es seleccionada, el módulo A/D espera un ciclo de instrucción antes
de comenzar la conversión. Esto permite que la instrucción SLEEP sea ejecutada, lo cual elimina todo el ruido de
switching digital de la conversión. Es completada, el bit GO/DONE será borrado y el resultado cargado en el registro
ADRES. Si la interrupción A/D está habilitada, el dispositivo se levantará del SLEEP. Si la interrupción A/D no está
Habilitada, el módulo A/D entonces se apagará, a pesar que bit ADON permanece en uno.
Cuando la fuente de reloj del A/D es otra opción del reloj (no RC), una instrucción SLEEP causará que la presente
Conversión sea abortada y el módulo A/D sea apagado aunque el bit ADON permanecerá en uno.
Apagando el A/D ubica al módulo A/D en el estado de consumo de corriente más bajo.
Nota: Para que el módulo A/D opere durante SLEEP, la fuente de reloj del A/D debe ser puesta en RC
(ADSC1: ADSCO =11). Para permitir que la conversión ocurra durante SLEEP, asegúrese que la instrucción
SLEEP inmediatamente siga a la instrucción que pone a uno el bit GO/DONE.

Efectos de un RESET

Un RESET del dispositivo fuerza todos los registros a su estado de RESET. Esto fuerza al módulo A/D a ser apagado,
Y cualquier conversión es abortada. Todos los pínes de entrada A/D son configurados como entradas análogas.
El valor que esta en los registros ADRESH:ADRESL no es modificado por un Reset de Power-on. Los registros
ADRESH:ADRESL contendrán datos desconocidos después de un Reset de Power-on.

TABLA 20: Registros/bits asociados con A/D

Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en: Valor en
POR, BOR todos los
otros resets
0Bh, 8Bh,
10Bh, INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
18Bh
OCh 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

87h TRISC Registro de configuración de PORTC 1111 1111 1111 1111


11h TMR2 Registro del módulo Timer 2 0000 0000 0000 0000
92h PR2 Registro Periodo Timer2 1111 1111 1111 1111
12h T2CON - TOUTPS3 TOUTPS TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 -000 0000 -000 0000
2
15h CCPR1L Registro Captura/Compare/PWM 1 (LSB) xxxx xxxx uuuu uuuu

16h CCPR1H Registro Captura/Compare/PWM 1 (MSB) xxxx xxxx uuuu uuuu

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

1Bh CCPR2L Registro Captura/Compare/PWM 2 (LSB) xxxx xxxx uuuu uuuu


1Ch CCPR2H Registro Captura/Compare/PWM 2 (MSB) xxxx xxxx uuuu uuuu
1Dh CCP2CON - - CCP2X CCP2Y CCP2M3 CCP2M2 CCP2M1 CCP2M0 --00 0000 --00 0000
Módulo de Comunicación Serie Síncrona: MSSP

Introducción
La comunicación serie es una forma muy apreciada de transferir datos digitales entre sistemas y circuitos
integrados, dada la reducida cantidad de líneas que precisa.

En el PIC16F84, cuando se quería comunicarle en serie con otro dispositivo, había que destinar varias de sus
patitas generales de E/S a soportar las líneas de datos y de reloj.

También había que desarrollar un programa específico para soportar el protocolo de comunicación.
En los PIC16F87x. Microchip ha implantado en el silicio de sus chips el módulo MSSP (Master Synchronous
Serial Port), que proporciona un excelente interfaz de comunicación de microcontroladores con otros
microcontroladores y diversos periféricos, entre los que destacan las memorias EEPROM serie, los
conversores A/D, los controladores de displays, etc. De esta forma, el usuario dispone de algunas patitas de la
Puerta C, que correctamente programas sirven para manejar directamente la comunicación serie. Además, el
modulo MSSP, admite dos de las alternativas más usadas en la comunicación serie síncrona.

1° SPI (Serial Peripheral Interface).


2° I2C (Inter. Integral Ciurcuit).

La comunicación serie en modo SPI la utilizan principalmente las memorias (RAM y EEPROM) y utiliza tres
líneas para llevarla a cabo. En el modo 12C sólo se emplean dos líneas y, recientemente, ha conseguido una
importante implantación en la comunicación de circuitos integrados, existiendo en el mercado todo tipo de
periféricos capaces de trabajar con este protocolo (memorias, controladores, relojes, conversores, etc.).

El funcionamiento del módulo MSSP es muy sencillo. En transmisión, el byte que se quiere transmitir se
carga el registro SSPBUF a través del bus de datos interno y automáticamente traspasa el registro SSPSR, que
va desplazando bit a bit el dato, sacándolo ordenadamente al interior al ritmo de los impulsos de reloj. En
recepción, los bits van entrando al ritmo e reloj por una patita y se han desplazando en el SSPBUF, donde
queda lista para su lectura. Este doble almacenamiento del dato recibido permite iniciar la recepción de un
nuevo dato antes de que se haya leído el último.

Cuando se han recibido 8 bits durante la recepción en SSPSR, se traspasa dicha información SSPBUF y
entonces el bit señalizador BF (Buffer Full) se pone a 1, al igual que el flag de interrupción SSPIF. Cualquier
escritura en el SSPBUF se ignora durante una transferencia de información y se señaliza poniendo a 1 el bit
WCOL, que advierte de este tipo de colisiones. Recae en la responsabilidad del programador pasar el bit
WCOL a 0 una vez completada la escritura en SPBUF.

Modo SPI
Permite la transferencia de datos de 8 bits en serie, que pueden ser transmitidos y recibidos de forma sincronía
y simultánea. Para el establecimiento de la comunicación se utilizan tres líneas.

1° SDO (Serial Data Out): salida de datos en serie.


2° SDI (Serial Data (n):entrada datos en serie
3° SCK (Serial Clock): reloj de sicronización.

Puede ser necesaria una cuarta línea de control más cuando el PIC que se utiliza trabaja de modo esclavo. En
este caso, la patita SS# (Selección de esclavo) se debe activar a tierra. en la figura 25, la línea SDO del
maestro se corresponde con la SDI de los esclavos y la línea SDO del maestro se corresponde con la SDI de
los esclavos y la línea SCK, por la que circulan los impulsos de reloj siempre parte del maestro que es el
encargado de generar y controlar la sincronización.

Si, por ejemplo, actuarse como esclavo un chip de memoria RAM de 256x8 de tamaño, la comunicación SPI la
iniciaría el maestro enviando por la línea SDO un byte con la dirección de la memoria a acceder, seguido de
otro byte que especificaría la operación (lectura/escritura) y un tercero que contendría e dato a escribir en caso
de que se tratase de una operación de escritura. En el caso que se tratase de una lectura de una operación de
escritura. En el caso del byte que sacaría el esclavo por su línea SDO y que se introduciría al Maestro por su
línea SDI. Si fuese una memoria con más posiciones, la dirección se tendrá que especificar con más de un
byte.

Cuando el PIC trabaja como maestro hay que programar la línea RC3/SDO como salida, la línea RC4/SDI
como entrada y la línea RC5/SCK también como salida. Si actuase como esclavo, la línea RC5/SCK debería
configurarse como entrada y la RA5/SS# debería conectarse a tierra.

FIGURA 25: Comunicación SPI entre PIC Maestro y otros dos esclavos

Manejo y programación en el modo SPI


En la figura 26 se muestra la estructura del módulo MMSP cuando funciona en modo SPI.

FIGURA 26: Estructura interna del Módulo MSSP cuando trabaja en modo SPI
Al comenzar el funcionamiento en el modo SPI, es necesario establecer las condiciones de trabajo
programando adecuadamente, los bits <5-0> del registro SSPCON y los <7:6> del registro SSPSTAT, para
determinar la siguientes especificaciones:

1° Si trabaja en modo maestro SCK debe ser salida.


2° Sí trabaja en modo esclavo la línea SCK del reloj debe ser entrada.
3° Se debe precisar el momento en el que se toma la muestra del dato de entrada, que puede ser un la
mitad o al final del impulso.
4° Se debe precisar el momento en el que se toma la muestra del dato de entrada que puede ser en la
mitad o al final del impulso.
5° Flanco de reloj activo que puede ser el descendente o descendente o descendente de SCK.
6° Rango de trabajo del reloj en el modo maestro.
7° Selección del modo esclavo, en caso de trabajar de esta forma.

El cuadro correspondiente al registro SSPSTAT se presenta la distribución y nomenclatura de los bits del
registro SSPSTAT, que ocupa la dirección 94h y es uno de los que seleccionan las características
mencionadas.

REGISTRO: Registro SSPSTAT


SMP CKE DA P S RW UA DI
Estructura interna del registro SSPSTAT para la configuración del modo SPI a DC.

De describe la misión de tres de los bits del registro SSPSTAT que se participan en la configuración del modo
SPI. También estos bits participan en la configuración del modo 12C junto a los restantes.
SMP
El bit 7 del registro SSPSTAT determina el momento del bit de entrada.
En modo maestro SPI si SMP=1 el dato de entrada se muestra al final del impulso de reloj y si vale 0
en la mitad del mismo.
En modo esclavo del bit SMP no tiene cometido y debe valer 0.
CKE
Con este bit se selecciona el flanco de reloj activo.
Si el bit CKP=0 en el registro SSSPCON significa que el estado de inactividad en la señal de reloj es
el bajo l y entonces si CKE=1 el dato se transmite en el flanco ascendente de SCK y si CKE=0 en el
flanco descendente.
Si CKP=1, lo que supone que es el estado alto el de inactividad en la señal de reloj, cuando CKE=1 el
dato se transmite en el flanco descendente de SCK y si CKE=0 en el ascendente.
BF
Indica cuando vale 1 que el registro SSPBUF está lleno.

A continuación se presenta la distribución de los bits del registro SSPCON, que ésta ubicado en la dirección
14h y sirve par programar el módulo MSSP en los dos modos que pueden trabajar.

REGISTRO: Registro SSPCON


WCUL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0
Estructura interna del registro SSPCON.

SSPM3-SSPMO
Con los 4 bits de menos peso del registro SSSPCON se establece el modo de trabajo del módulo MSSP.

SSPM3-0 Modo de trabajo

0000 Modo maestro SPI, con reloj a Fosc/4


0001 Modo maestro SPI, con reloj a Fosc/16
0010 Modo maestro SPI, con reloj a Fosc/64
0011 Modo maestro SPI, con reloj igual a la salida del TMR2/2
0100 Modo esclavo SPI, con reloj igual a la partida SSCK y SS# a nivel
bajo.
0101 Modo esclavo SSPI, con reloj al igual que la patita SSCK, SS# no
activo y libre para usarse como E/S.
0110 Modo esclavo 12C, con dirección de 7 bits
0111 Modo esclavo 12C, con dirección de 10 bits
1000 Modo 12C, maestro con reloj=fosc/(4 (SSPAD + 1))
1011 Modo 12C, maestro controlado por firmware.
1110 Modo 12C, maestro controlado por firmware, con bits inicio y
stop activada interrupción, dirección de 7 bits.
1111 Modo 12C, maestro controlado por firmware, con bits inicio y
stop, activada interrupción, dirección de 10 bits.

CKP
Determina la polaridad o el estado de inactividad del reloj.
En elmodo SPI si CKP=1 dicho estado de inactividad es el alto y si CKP=0 es el bajo.

SSPEN
Bit de activación del módulo MSSP.
Si SSPEN=1 queda activada la puerta en modo SPI y las patitas SSCK, SDO, SDI y SS# realizan la
labor correspondiente. Si SSPEN=0 no funciona el modo SSPI y las patitas anteriores se utilizan para
EE/S digitales.

SSPOV
Al ponerse a 1 indica sobre pasamiento lo que significa que la información recibida en SSPSR y que
ha pasado al SSPBUF, cuando llega otro yte al SSPSR aún no se ha leído y se machacará la
información existente en el SSUPBUF.

WCOL
Cuando este bit se pone a 1 indica que se ha producido una colisión. El dato a transmitir que se ha
almacenado en el SSPSR para irlo sacando en serie. Cuando el SSP-BUF se traspasa al SSPSR un
byte sin haber dado tiempo a salir al anterior, se producse una colisión.

El registro SSPSR no es direccionmable directamente y en los programas que acceder a él a través del
SSPBUF, tal como expone en el siguiente programa de transferencia de información.

Bsf STATUS.RPO :Banco 1


bcf STATUS.RP1

BUCLE btfss SSPSTAT.BF :¿Buffer lleno? ¿BF =1?

goto BUCLE ;El buffer aún no está lleno y hay que esperar.

bcf STATUS,RP0 ;El buffer está lleno y se accede al banco 0.

movf SSPBUF,0 ;El contenido del Buffer se carga en W.


movwf RXDATA :EL dato se guarda en un Registro temporal de la RAM.
movf TXDATA,0 ;Un Nuevo dato a transmitir en TXDATA se carga en W.
movwf SSPBUF ;El dato a transmitir se carga en SSPBUF y de allí
;automáticamente pasará al SSPSR desde donde saldrá
;en serie.

Módulo MSSP trabajando en modo I2C.


El protocolo de comunicación RRC fue desarrollado por Philips para cubrir sus propias necesidades en la
implementación de diversos productos electrónicos que requerían una elevada interconexión de circuitos
integrados. El protocolo I2C (Inter.-Integrated Circuit), utiliza únicamente dos líneas para la transferencia de
información entre los elementos que se acoplan al bus. Una de dichas líneas se dedica a soportar los datos es
bidireccional y se llama SDA, la otra lleva los impulsos de reloj para la sincronización es unidireccional y
recibe el nombre de SCL. Los impulsos de reloj siempre los genera el maestro y tienen la función de
sincronizar las transferencias con todos los esclavos colgados a las dos líneas (Ver figura 27).
FIGURA 27: El maestro se conecta con todos los esclavos en el bus I2C con sólo dos líneas. Por SDA
circula los datos en serie y por SCL el maestro envía los impulsos de reloj que genera

Conceptos fundamentales sobre el bus 12C


En algunas aplicaciones, especialmente las que emplean microcontroladores mono-chip, se deben establecer
ciertos criterios.
• Cierto tipo de microcontroladores no son ampliables desde el exterior, por lo que la aplicación se
tiene que ceñir al tipo de cantidad de elementos que contenga en su interior, memoria RAM de datos,
EEPROM, líneas de E/S, temporizadores, contadores, etc. Si éstos no son suficientes habrá que elegir
otro modelo de microcontrolador con más prestaciones a emplear un sistema ampliable externamente.
• Normalmente un sistema completo del microcontrolador necesita de otros circuitos periféricos como
memorias, ampliación de las líneas de E/S convertidores MMD y D/A relojes en tiempo real
controladores de Display de LCD, etc.
• El coste de conexión de todos estos periféricos con el microcontrolador debe reducirse al mínimo.
• Normalmente la aplicación no requiere una gran velocidad de transferencia entre el microcontrolador
y los distintos dispositivos.
• La eficacia general el sistema depende de la versatilidad de los dispositivos conectados al mismo.

Estos criterios se pueden implementar con una estructura de bus serie. Este tipo de bus no puede alcanzar
velocidades similares a las conseguidas con una estructura de bus paralelo, pero requiere mucho menos
cableado y el hardware es mucho más sencillo.

Los distintos dispositivos conectados al bus, serie deben comunicarse entre sí mediante un protocolo que evite
el bloqueo de la información y garantice la comunicación entre todos ellos.

El sistema debe ser independiente de los dispositivos conectados al bus, con objeto de poder realizar futuras
ampliaciones y/o modificaciones. Mediante el protocolo adecuado se decide que dispositivo se hace cargo del
bus y cuando.

Todos estos conceptos se contemplan en las especificaciones del bus 12C.

Conceptos del Bus 12C


Dos líneas, SDA (datos) y SCL (reloj) transportan la información entre los diferentes dispositivos conectados
al bus. Cada dispositivo se identifica por una única dirección y puede transmitir o recibir dependiendo de la
operación que se vaya a realizar. Un controlador de LCD, por ejemplo, sólo recibe mientras que una memoria
de tipo RAM puede transmitir o recibir datos en función de que se vaya a leer o a escribir.

Los dispositivos pueden clasificarse en maestro (master o principal) o esclavo (slave o secundario). El
maestro es el que inicia la transferencia de datos y genera la señal de reloj. Cualquiera de los dispositivos
direccionados por un maestro se considera un esclavo.
El 12C es un bus multi-maestro puede haber más de un maestro conectado y controlando el bus. Normalmente
se trata de microcontroladores o microcomputadores.

FIGURA 28: Conexiones al bus

Supongamos que en un momento dado el microcontrolador A actúa como maestro:

1° caso envía información al B


A emisor, direcciona a B.
A emisor, envía el dato a B receptor.
A termina la transformación.

2° caso recibe información desde el B


A emisor, direcciona a B.
A receptor recibe el dato desde el B transmisor.
A termina la transferencia.

Esta configuración puede no ser permanente. En otro momento puede ser el 8 quien actúe de maestro. Todo
depende de la dirección de la dirección del dato a transferir en un momento dado.
Dada la posibilidad de que existieran varios maestros, podría ocurrir que más de uno inicie la transferencia en
un mismo instante de tiempo. Para evitar el caos que puede producir esta situación, se ha desarrollado un
sistema de arbitraje del bus. El procedimiento consiste en una conexión tipo AND entre todos los dispositivos
conectados al bus.
Cuando uno o mas maestros colocan información en la línea SDA, verifican si el bit que ellos sacan coincide
con el nivel lógico de dicha línea. Si un maestro saca un 1 pero la línea SDA está a 0 coincidiendo con un
pulso de reloj, pierde la posesión del bus cancelando desde ese momento la transmisión. El nivel lógico 0 (bit
dominante) presente en la línea SDA procederá de un maestro distinto.
Las señales de reloj durante el arbitraje de bus son una combinación entre las señales de clock de los distintos
maestros conectadas entre sí a la línea SCL mediante una conexión tipo AND.
Terminología del Bus 12C

RECEPTOR Dispositivo que recibe información por la línea SDA

Dispositivo que inicia la transferencia genera la señal de


MAESTRO reloj y finaliza la transferencia.

ESCLAVO Dispositivo seleccionado por el maestro.

MULTI-MAESTRO Cuando mas de un maestro puede hacerse con el control


del bus sin corromper la información

ARBITRAJE Procedimiento que garantiza que, si más de un maestro


accede simultáneamente al bus, únicamente uno de ellos se
hace cargo del mismo con objeto de no alterar la
información.

SINCRONIZACIÓN Procedimiento para sincronizar la señal de reloj en un


sistema multi-maestro

Características generales
Tanto las líneas SDA como SCL son líneas bidireccionales que se conectan a + VDD mediante resistencias de
carga pull-up tal y como se muestra en la Figura 29.

Cuando el bus está libre, ambas líneas están a nivel lógico 1 los transistores de salida conectados a las líneas
del bus 12C deben ser de colector abierto para que todos ellos se puedan conectar entre sí formando una
conexión tipo AND.

FIGURA 29: Conexión de SDA y SCL al bus


Los bits de datos sobre el bus pueden transferirse a una velocidad de 100 k bits/s. La capacidad máxima en el
bus es de 400 pF y el número de dispositivos conectados no debe superarla.

Transferencias del bit


Debido a la variedad de tecnologías empleados en los dispositivos diseñados para conectarse al bus 12C
(CMOS, NMOS, TTL.etc) los niveles lógicos 0 y 1 e los bits transferidos no tienen una tensión fija, sino que
dependen de la tensión Vdd de alimentación. Cada bit que se transfiere por la línea SDA debe ir a
acompañado de un pulso de reloj por la línea SCL.

Validez del bit


El bit de datos transferidos por la línea SDA debe mantenerse establece durante el periodo en que la señal de
reloj esta a nivel 1. La línea de datos SDA solo puede cambiar de estado durante el periodo en que la señal de
reloj este a 0 tal y como se muestra en la Figura 30.

FIGURA 30: Validez del bit de datos

Condiciones de inicio (Start) y parada (Stop)


Existen dos situaciones únicas que son definidas como las condiciones de inicio y parada, que determinan el
inicio y final de toda transferencia de datos entre el maestro y el esclavo (Ver figura 31).

FIGURA 31: Condiciones de inicio y parada


Una transición de 1 a 0 (flanco descendente) en la línea SDA al tiempo que SCL, está a nivel lógico 1
determina la condición de inicio. Una transición de 0 a 1 (flanco ascendente) sobre la línea SCL, permanece a
nivel 1 determina la condición de parada.

Ambas condiciones son siempre generadas por el maestro que en todo momento inicia y finaliza toda
transferencia. El bus se considera ocupado (BUSY, tras la condición de inicio y se considera libre, cierto
tiempo después de la condición de parada.

Transferencia de datos
Formato de Byte.
Todos los bytes colocados sobre la línea SDA deben constar de 8 bits. Cada byte va seguido de un bit de
reconocimiento ACK, y comienza siempre por el bit de más peso (MSB), y comienza siempre por el bit de
más peso (MSB), tal y como se muestra en la figura 32.

FIGURA 32: Formato del byte

Entre un byte y el siguiente puede haber un tiempo t de espera que se puede aprovechar para, por ejemplo dar
servicio a una interrupción. En este caso, la línea SCL se mantiene a “0” para forzar al transmisor a un estado
de espera.
Un mensaje cualquiera puede finalizar mediante la generación de la condición de parada durante la
transferencia de un byte. En este caso no se generará el bit de reconocimiento ACK.

Reconocimiento
El bit de reconocimiento ACK es obligatorio en la transferencia de cada byte. El pulso de reloj asociado a este
bit n. 9 lo genera el maestro. El transmisor pone la línea SDA a 1 durante dicho pulso de reloj.
El receptor por su parte pone a 0 la línea SDA durante el pulso de reloj correspondiente al ACK y lo mantiene
estable durante todo el periodo de dicho pulso.
En la línea SDA prevalece por tanto el nivel 0 como se aprecia en la figura 33.
Normalmente el receptor que ha sido direccionado esta obligado a generar el ACK después de recibir cada
byte. Cuando un receptor esclavo no genera el bit ACK (NACK) al ser direccionado (por ejemplo cuando está
realizando una función interna y no está dispuesto a recibir), debe mantener la línea SDA a nivel 1 durante la
parada y abortar así la transferencia.
Igualmente, si un esclavo receptor reconoce ser direccionado pero no está dispuesto a recibir más bytes, el
maestro debe a abortar la transferencia. Esta situación se identifica porque el esclavo tampoco genera el ACK
en el siguiente byte que recibe. En su lugar pone la línea SDA a 1 (NACK) y el maestro genera la condición
de parada.
Si un maestro está recibiendo debe generar ACK tras cada byte enviado por el esclavo excepto en el último, en
el bit ACK lo mantiene a 1 (NACK) y genera la condición de parada.

FIGURA 33: El reconocimiento

Arbitraje sin sincronización de reloj


La ética necesaria por la cual, en un sistema donde existen varios maestros se evitan conflictos en el bus y
pérdidas de información.
Sincronización
Todos los maestros generan una señal de reloj sobre la línea SCL, para transferir mensajes sobre el 12C. Los
bits de información son válidos cuando dicha señal de reloj está a nivel lógico 1.
La sincronización del reloj se realiza mediante una conexión tipo ADN de todos los maestros existentes en el
bus (Ver figura 34).
Cuando un maestro cualquiera por ejemplo el 1, genera un flanco descendente en CLK1, la SCL para a 0.
todos los dispositivos comienzan a temporizar sus respectivos periodos bajos reloj.
Sin embargo un flanco ascendente en CLK1 no cambia el estado de SCL, ya que ese instante CLK2 está a 0.
La línea SCL se mantiene 0 durante el periodo de aquel dispositivo cuyo nivel 0 sea más. El resto de
dispositivos entran en estado de espera.
Cuando todos los dispositivos finalizan su periodo bajo, SCL pasa a 1. De esta forma, todos decían el periodo
alto al mismo tiempo. El primer dispositivo en finalizar este periodo alto pone a SCL a “0” y el proceso se
repite.

FIGURA 34: Sincronización del reloj


La señal de reloj presente en la línea SCL queda sincronizada y…

El periodo bajo: Se determina por aquel cuyo periodo sea el de mayor duración.

El periodo alto: Es determinado por aquel dispositivo cuyo periodo alto sea el de menor duración.

Arbitraje
El arbitraje consiste en determinar que maestro se hace cargo del bus en un sistema multi-maestro.
Cada maestro debe comparar si el bit de datos que transmite junto con su pulso de reloj en un momento dado,
coincide con el nivel lógico presente en la línea de datos SDA. De no ser así, pierde el acceso del bus. Si un
maestro saca en un nivel lógico al tiempo en que otro saca un 0 en la línea hasta que se detecte la condición de
parada generada por el maestro que se hizo cargo de dicho bus.
La figura 35 muestra el caso de dos maestros. En el omento en que hay diferencias entre el nivel lógico
interno del maestro que genera el DATO1 y el nivel actual presente en la línea SDA, este pierde el derecho a
usar el bus y su nivel interno pasa a 1 liberando así la línea SDA.
La comparación para determinar el arbitraje puede continuar en varios bits hasta que haya una falta de
coincidencia.
El maestro que pierde el arbitraje puede seguir generando pulsos de reloj hasta que finalice el byte en que lo
perdió.
Sin un maestro pierde el arbitraje en el momento en que está direccionando precisamente a él. Es por ello que
el maestro perdedor, se debe poner inmediatamente en modo receptor y como esclavo.

FIGURA 35: Arbitraje del bus


Formato.
Los datos que se transfieren el formato mostrado en la figura 36.
Tras la condición de inicio, el maestro envía la dirección del esclavo, es posible que el maestro “ganador” lo
estuviera direccionando precisamente a él. Es por ello que el maestro envía la dirección del esclavo al que se
quiere dirigir. Esta dirección es de 7 bits más el bit R/W# = que indica lectura (R/W#=1) o escritura (R
W#=0) del esclavo. Toda transferencia de datos finaliza con la condición de parada, también generada por el
maestro. A pesar de todo, si un maestro aun desea comunicar por el bus, puede otra condición de inicio y
direccionar a otro esclavo sin general previamente la condición de parada.

En figuras 37, 38 y 39 se muestran posibles formatos de transferencia.

FIGURA 36: Formato de datos transferidos

S DIRECCIÓN DE R/W#= 0 A DATO A DATO A P


ESCLAVO
ESCRITURA DATOS TRANSFERIDOS
(n BYTES + ACK)
FIGURA 37: El maestro transmite al esclavo receptor. No cambia el byte de dirección

S DIRECCIÓN DE R/W#= 1 A DATO A DATO A P


ESCLAVO
ESCRITURA DATOS TRANSFERIDOS
(n BYTES + ACK)
FIGURA 38: El maestro recibe desde el esclavo después de enviarle a éste la dirección

S DIRECCIÓN R/W# A DATO A S DIRECCIÓN R/W# A DATO A P


DE DE
ESCLAVO 1 ESCLAVO 2
1= LECTURA DATOS TRANSFERIDOS 1= LECTURA DATOS
TRANSFS
0= ESCRITURA (n BYTES + ACK) 0= ESCRITURA (n BYTES + ACK)
FIGURA 39: El maestro cambia el byte de dirección y selecciona un esclavo distinto

Tras el primer ACK enviado por el esclavo, el maestro transmisor se convierte en receptor y el esclavo
receptor en transmisor.

El formato combinado de la figura 39 permite seleccionar un esclavo para leerlo, por ejemplo, y luego para
escribirlo. En el caso de dispositivo 12C de tipo memoria RAM puede ser útil.

El tipo de datos o comandos que se envían pueden servir para realizar distintos tipos de operaciones según el
dispositivo 12C empleado. Habrá que consultar las características y posibilidades de cada cual.

Direccionamiento
El proceso de direccionamiento del bus 12C consiste en que el primer byte que envía el maestro tras la
condición de inicio es un código que determina y selecciona a un determinado esclavo. Existe una excepción
en el código denominada “llamada general”. Cuando un maestro realiza una “llamada general” (código 0000
000) todos los esclavos existentes deben responder con el bit ACK. Puede darse el caso de dispositivos que
ignoren esta llamada. El siguiente byte tras la misma indicará la operación a realizar.

Definición del primer byte


Los 7 bits de más peso del primer byte se emplean para direccionar a un determinado esclavo. El de menos,
peso, el octavo enviado, determina si se realizará una operación de lectura o de escritura (R/W#) sobre el
esclavo direccionando, tal y como se muestra en cuadro siguiente:

MSB LSB
S Dirección de esclavo 1 R/W#

Dirección R/W# Función


0000 000 0 Dirección de llamada general (1)
0000 000 1 Byte de inicio (2)
0000 001 Dirección CBUS (3)
0000 010 x Reservada para un formato diferente (4)
0000 011 x No definida
0000 100 x No definida
0000 101 x No definida
0000 110 x No definida
0000 111 x No definida

1. Para aquellos dispositivos que la admitan y/o necesiten.


2. No está permitido el bit ACK tras la recepción del byte. Empleado por ciertos dispositivos
3. La dirección CBUS está reservada para permitir la combinación de dispositivos I2C y CBUS en un
mismo sistema. Los dispositivos I2C no responden a esta dirección.
4. Esta dirección está reservada para combinar el formato I2C con otros protocolos. Únicamente los
dispositivos I2C que estén diseñados para trabajar con esos formatos y protocolos responden a esta
dirección.

Cuando el maestro envía una dirección por el bus, todos los esclavos conectados las comparan con la suya
propia interna. Aquel en que coincida se considerará seleccionado por el maestro.
De los 7 bits que forman una dirección hay una parte que son fijos y ya están definidos internamente por el
propio dispositivo esclavo, y otra parte que son programables. De esta forma, es posible conectar al mismo
bus dispositivos idénticos cuya parte fija de dirección es la misma pero la programable es diferente.

El bus 12C y los PIC16F87X


En los PIC16F87X, el bus I2C está implementado en silicio tanto en el modo maestro (master) como en el
esclavo (slave). Como en general e el modo maestro el más usado, todos los ejercicios los hemos realizado de
esta forma y las explicaciones también se refieren a dicho modo.
Recuérdese que en modo maestro es el dispositivo, en este caso el PIC16F87 x, el que inicia y finaliza la
transferencia y genera los impulsos de reloj. También selecciona l esclavo al que se destina la información
(Ver figura 40).
Como ya se ha comentado al hablar del bus I2C, en general, cada transferencia comienza con la condición de
inicio (start) y termina con la condición de parada (stop). Ambas condiciones las genera el maestro, y la
primera consiste en un flanco descendente en SDA mientras SCL tienen nivel alto. La condición de parada es
un flanco ascendente mientras SCL tiene nivel alto.
Los datos que se colocan sobre la línea SDA son bytes de 8 bit, que comienza con el MSB y termina con el bit
de menos peso, al cual sigue en el noveno bit la condición de Reconocimiento (ACK). Para este caso, el
transmisor pone SDA = 1, mientras que el receptor pone SDA = 0 en dicho impulso de reloj, prevaleciendo
sobre la línea el nivel bajo.
El primer byte que envía el maestro tras la condición de inicio contiene la dirección del esclavo con el que se
desea realizar la comunicación. El código 0 se usa para realizar una "llamada general" sobre todo los esclavos.
La dirección en realidad consta de 7 bits, estando destinado el octavo a indicar la operación a realizar (R/W#:
Lectura/Escritura). Tras este byte inicial de direccionamiento se manda otro byte que especifica las
características de la operación a realizar.

Para activar el bus 12C hay que poner el bit SSPEN = 1 que es el bit 5 del registro SSPCON (SSPCON>5>). A
partir de ese momento las patitas SDA y SCL quedan configuradas para soportar configuradas como entradas
mediante la escritura de los bits correspondientes del registro TRISC.
Como se aprecia en la Figura 40 hay seis registros para controlar el bus I2C:

1. SSPCON: Registro de control.


2. SSPCON 2: Registro de control 2.
3. SSPSTAT: Registro del estado.
4. SSPBUF: Bufler para los datos.
5. SSPSR: Registro de desplazamiento no accesible directamente.
6. SSPADD: Registro de dirección

FIGURA 40: Estructura general de los registros que controlan la transferencia por las patitas
SDA, y SCL en el modo maestro del bus 12C.

Mediante el bit CKE se ponen a nivel altos las patitas SDA y SCL en el modo maestro y esclavo. Cuando CKE
= 0 los niveles de dichas patitas se configuran según las especificaciones del bus 12C. Los 4 bit de menos peso
del registro SSPCON sirven para seleccionar el modo de trabajo entre estos tres posibles:
1º Modo I2C maestro Reloj = (SPADD + 1)ºOSC/4
2º Modo I2C esclavo con 7 bits para la dirección
3º Modo I2C esclavo con 10 bits para la dirección.

El registro de Estado SSPSTAT contiene la información que representa el estado de la transferencia de datos.
Detecta las condiciones de inicio y parada, así como la recepción del byte de la dirección.
SSPBUF es el registro que actúa como buffer y soporta el datos que se va a transmitir o que se ha recibido. El
registro de desplazamiento SSPSR realiza la conversión serie (/paralelo y viceversa junto al SSPBUF. Cuando
se ha completado la llegada del byte, que se recibe en el registro SSPSR, se traspasa a SSPBUF y se activa el
señalizador SSPIF. Si se recibe otro byte antes de haber leído al SSPBUF, se activa el señalizador de
desbordamiento SSPOV (SSPCO N<6>).
El registro SSPADD guarda la dirección del esclavo. Cuando se emplean direcciones de 10 bits, el usuario
debe escribir el byte alto de la dirección con el siguiente código donde A9:A8 son los dos Bits de más peso:
1-1-1-1-0-A9-A8-0.
En el siguiente cuadro se muestra la distribución de los bits del registro SSPSTAT, que ocupa la dirección 94h
de los registros específicos de la memoria RAM.

REGISTRO: Registro SSPSTAT


SMP CKE D/A# P S R/W# UA BF
Distribución de los bits del registro de Estado SSPSTAT. Todos los bits son leíbles, siendo sólo
escribibles los dos de más peso. Tras un reset todos se ponen a 0

El bit SMP se SSPSTAT en el modo maestro es un bit de muestreo que vale 1 cuando los bits de datos se
muestrean al final del periodo. El bit CKE selecciona los niveles de las patitas SCL y SDA en el modo maestro
o multimaestro. El bit D/A# (Dato/Dirección#) indica si el dato recibido es de información (1) o es una
dirección (0). La llegada del bit o condición de Stop la detecta el bit P, que se pone a 1. El bit S detecta la
condición de inicio o Stara. R/W# indica si se trata de una Lectura/Escritura#. El bit UA cuando vale indica
que la dirección es de 10 bits y que hay que cargar el byte alto, según la codificación antes expresada, en el
registro SSPADD. Si es 0 la dirección es de 7 bits. Finalmente el bit BF actúa como señalizador del buffer de
datos. Si BF = Indica que tiene un dato y la transmisión está en progreso sin termina.

En el siguiente cuadro se muestra la estructura del registro de control SSPCON, que ocupa la dirección 14h
del mapa de memoria.

REGISTRO: Registro SSPCON


WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0
Registro de control SSPCON. Todos sus bits son leíbles y escribibles y se ponen a 0 tras un Reset

El bit WCOL es un detector de colisiones en escritura y cuando vale 1 significa que se ha intentado escribir en
SSPBUF en condiciones no válidas para el protocolo. El bit SSPON si vale 1 indica desbordamiento, o sea,
que llega un byte a SSPBUF sin haberse leído el anterior. Si SSPEN = 1 la Puerta Serie queda configurada con
las patrias SCL y SDA. Si SSPEN = 0 las patitas RC3/SCL y RC4/5DA funcionan como línea de E/S digitales.
El bit CKP sirve para activar el reloj en el modo esclavo, no usándose en el modo maestro. Mediante los 4 bits
de menos peso de SSPCON se selecciona la frecuencia de reloj. Se indican los códigos más interesantes para
el modo maestro.

SSPCON 3-0 FRECUENCI DE RELOJ


0000 Reloj = Fosc/4
0001 Reloj = Fosc/16
0010 Reloj = Fosc/61
0011 Reloj = Salida del TMR2/2
1000 Reloj =( SSPADD+1)*Fosc/4

En el siguiente cuadro muestra la distribución de los bits del registro de control 2 SSPCON2.

REGISTRO: Registro SSPCON2


GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN
Registro del control 2SSPCON2. Todos sus bits son leíbles y escribibles y quedan a 0 tras un Reset.

El bit GCEN sólo se usa en el modo esclavo. Cuando se pone el bit ACKSTAT = 1 significa que se ha
recibido el bit de reconocimiento ACK del esclavo. ACKDT es el bit ACKSTAT = 1 significa que se ha
recibido el bit de reconocimiento ACK del espesor ACKDT es el bit de reconocimiento en el modo maestro en
recepción. Si ACKDT = 0 el maestro ha transmitido el bit de Reconocimiento, pero si vale 1 no lo ha hecho.
Cuando se pone ACKEN = 1 se inicia la secuencia de generación de la condición de reconocimiento. Este bit
se borra automáticamente por hardware.
Para habilitar el modo de recepción del maestro hay que poner el bit RCEN = 1 . Para generar la condición de
parada en la líneas SCL y SDA hay que poner PEN = 1 El bit RSEN cuando se pone a 1 inicia repetición de la
condición de la condición de inicio. Finalmente, para iniciar la condición de inicio hay que poner SEN = 1.
Funcionamiento del modo maestro
El trabajo en el modo maestro se pone en marcha escribiendo los valores adecuados en los bits del registro de
control SSPCON y SSPEN = 1, una vez puesto en funcionamiento este modo, el usuario tiene 6 opciones:

1. Generar la condición de inicio


2. Generar la condición de repetición de inicio.
3. Escribir sobre SSPBUF para iniciar la transmisión de unos datos o una dirección.
4. Generar la condición de parada
5. Configurar el modo 12C en recepción.
6. Generar la condición de reconocimiento final de la recepción de un byte de datos.

El maestro es el encargado de generar los impuestos de reloj y las condiciones de inicio y parada en cada byte
transferido. Cuando el maestro es receptor, el primer byte indica la dirección del esclavo (7 bits más el bit
R7W#). Por cada byte recibido por el maestro se transmite un bit de reconocimiento ACK.
A continuación, se describe la secuencia de pasos que hay que realizar en una transmisión del maestro:

1. El usuario general la condición de inicio poniendo SEN = 1 EN EL REGISTRO SSPCON2


2. Se pone SSPIF = 1 El módulo esperará a que finalice la operación de inicio antes de empezar otra.
3. Se carga SSPBUF, la dirección de esclavo a transmitir.
4. Se saca por SDA la dirección del esclaro.
5. El esclavo genera el bit de reconocimiento ACK, y en el maestro se escribe en SSPCON2<6>
6. Se genera una interrupción al final del noveno impulso de reloj y SSPF
7. El usuario carga en SSPBUF un dato de 8 bits.
8. Se transmiten los 8 bits por SDA.
9. Se recoge el bit de reconocimiento del esclavo y se escribe el bit ACKSTAT del SSPCON1
10. El módulo genera una interrupción en el noven o impulso de reloj y pone SSPIF = 1
11. Se genera la condición de parada con PEN =1 en SSPCON2.
12. Una vez completada la condición de parada, se genera una interrupción.

En el modo maestro el valor usado en la generación de la frecuencia se escribe en SSPADD, según los 4 bits
de menos peso. Después, este valor se carga en el contador descendente BRG, que lo ha decrementado hasta
llegar a 0, donde se para hasta que se vuelve a recargar. El BRG se decrementa 2 unidades por cada ciclo de
instrucción.
Condición de inicio (start)
Para generar la condición de Stara, el usuario debe escribir el bit SEN = 1 en SSPCON2. Si SDA y SCL se
mantiene a nivel alto, el cantador BGR se carga con el valor de 7 bits de SSPADD. Cuando termina el contaje
de BRG la línea SDA pasa a nivel bajo. La condición de inicio consiste en un flanco descendente de SDA
mientras SCL permanece con nivel alto. Pone el bit S =1 deñ regiostro SSPSTAT. Luego se recarga el BGR
con el valor SSPADD<6:0>y vuelve a decrementarse. Al llegar a 0 el contador el bit SEN pasa a 0
automáticamente.

Condición de repetición de inicio (start)


Esta situación se produce cuando RSEN = 1. Entonces SCL pasa a nivel bajo y el contador BRG se carga con
los 7 bits de menos peso de SSPADD y comienza el contaje. Al finalizar el contaje CL pasa de nivel bajo a
nivel alto mientras SDA sigue en nivel bajo. Luego nuevamente SCL =1 y SDA = 1 y se vuelve a cargar BRG.

Modo de maestro en transmisión


Transmisión de un byte de datos debe ir precedida de la transmisión de la dirección del esclavo, cual debe
cargarse en el registro SSPBUF. En cuyo momento se pone el bit BF=1 y se pone en marcha el reloj y el
inicio de la transmisión. Cada bit que sale por la línea SDA lo hace en el flanco ascendente del impulso de
reloj en SCL. Tras sacar los 8 bit se borra el bit BF en el noveno y el esclavo debe generar la condición del
reconocimiento en el noveno impulso de autom. El bit ACK se coloca en el ACKDT en el flaco descendente
de SCL. Tras el noveno impulso SSPIF=1 y se detiene el generador de frecuencia hasta que no se cargue otro
dato en SSPBUF.
En transmisión BF=1 cuando la CPU escribe en el SSPBUF y BF pasa a 0 cuando han salido los 8 bits. El
señalizador WCOL vale 1 cuando el usuario escribe sobre el SSPBUF estando una transmisión del dato previo
en progreso. Este bit hay que pasarlo a 0 por software.
El bit ACLSTAT pasa a 0 cuando el esclavo a enviado al bit de reconocimiento.
Modo maestro en recepción
Para poner en marcha el modo maestro en recepción, hay que poner el BIT RCEN=1 estando en reposo el
módulo MSSP. El generador de secuencia empieza a funcionar y SCL cambia de estado en cada período
controlado por el decreto del contador BRG. Entonces el dato empieza a desplazarse sobre el registro SSPSR.
Al final del octavo clock se ponen BF=SSPIF=1 Y se transfiere el contenido de SSPSR al SSPBUF, con lo
que RCEN=0. El módulo que en estado de reposo a la espera de un nuevo comando. Cuando el buffer es leído
por la CPU BF se pone a 0 automáticamente. El usuario puede enviar un BIT de reconocimiento al finalizar la
recepción, escribiendo ACKEN=1 (SSPCON2<4>).
Cuando un dato o una recepción se carga en SSPBUF desde SSPSR, el BIT BF = 1 y este BIT pasa a 0 cuando
la CPU lee SSPBUF. Él señalizador de desbordamiento SSPOV es 1 cuando se recibe un byte en SSPSR y aún
no ha leído la CPU un dato anterior.
Si el usuario escribe en SSPBUF mientras hay una recepción en progreso, el BIT WCOL se pone al y el
contenido del buffer no cambia.

Secuencia de reconocimiento
Se produce Automáticamente en cuanto se pone ACKEN =1 Entonces la patita SCL. Pasa a nivel bajo y
aparece en SDA el BIT de reconocimiento al finalizar el dato. Al poner ACKEN = 1 y ACKDT = 0 la patita
SCL queda a nivel bajo mientras el generador de frecuencia cuenta un período (TRRG). Luego SCL pasa a
nivel y al completarse otro periodo SCL, vuelve a pasar a nivel bajo y ACKEN =0. El flag SSPIF = 1 cuando
finaliza la secuencia de reconocimiento (Figura 41).

FIGURA 41: Diagrama de tiempos de una secuencia de reconocimiento

Condición de parada (stop)


Se genera la condición o bit de stop al final de la transmisión/recepción, poniendo el bit PEN = 1
(SSPCON2<2>). En el descendente del noveno impulso de reloj la línea SCL queda a nivel bajo. Entonces si
PEN = 1 la línea SDA pasa a nivel y el generador cuenta un periodo, tras el cual SCL pasa a nivel alto. Tras
otro periodo TBRG, la línea SDA pasa a nivel alto y P = 1. Tras otro periodo PEN, SE PONE a 0
automáticamente (Ver figura 42).
El impulso de reloj SCL se produce cuando es muestreada dicha línea cada ciclo Tosc 4, y está a nivel alto, en
cuyo momento se carga el contador BRG con los 7 bits de menos peso de SSPADD y comienza a contar otro
periodo, pasando SCL a 0 al completarlo.
FIGURA 42: Diagrama de tiempos de la condición de parada

FIGURA 43-1
FIGURA 43-2: En el modo asíncrono la comunicación serie del USART en los PIC16F87x está
soportada por las línes RC-RX/DT por las que se mueven los bits a la frecuencia interna de reloj. En el
miedo sincrono, los bits de información circulum en ambos sentidos por la línea DT a la frecuencia de
los impulsos que genera el maestro por la línea CK.

por un bit de START (INICIO) y detrás de ello se coloca un bit de STOP (parada), de acuerdo con las normas
del formato estándar NRZ (NonRetun-to-Zero). (Figura 37) Los bits se transfieren a una frecuencia fija y
normalizada.
Los cuatro bloques que configuran la arquitectura del USART en modo asíncrono son:
1º Circuito de muestreo.
2º Generador de baudios
3º Transmisor asíncrono
4º Receptor asíncrono

El circuito de muestreo actúa sobre la patita RC7/RX/DT, que es por donde se recibe el bit de información o
control y se encarga de muestrear tres veces su valor, para decidir éste por mayoría.

Generador de baudios
En el protocolo asíncrono RS-232-C, la frecuencia en baudios (bits por segundo) a la que se realiza la
transferencia se debe efectuar a un valor normalizado: 330, 600, 1200, 2400, 4800, 9600, 19200, 38400, etc.
Para generar esta frecuencia, el USART dispone de un Generador de Frecuencia en Baudios. BRG, cuyo valor
es controlado por el contenido grabado en el registro SPBRG.
Además del valor X cargado en el registro SPBRG, l frecuencia en baudios del generador depende del b it
BRGH del registro TXSTA <2>. En el cso de que BRGH sea 0 se trabaja en baja velocidad y si BRGH = 1 se
trabaja en alta velocidad. Según ESTE bit se obtendrá el valor de una constante K necesaria en la
determinación de la frecuencia de funcionamiento.

Frecuencia en Baudios = Fosc/(Kº (X + 1)

X es el valor cargado en el registro SBRG

Si BRGH = 0 baja velocidad y K = 64


Si BRGH = 0 baja velocidad y K = 16

De donde se desprende que: X = Fosc/Frecuencia/K-1


Ejemplo
Si en un PIC 16F873 funcionando con un Fosc = 16 MHz se desea trabajar con el USART en modo asíncrono y
baja velocidad, con una frecuencia de 9600 baudios, calcular el valor X que hay que cargar en el registro
SPBRG y el error que se origina.
(Baja velocidad) K = 64
Frecuencia = Fcoc/(64 ∑ (X + 1))
9600 = 16 000000/(64 ∑ (X + 1)
X = 25

Si se carga el registro SPBRG con 25 la frecuencia real de trabajo será:


Frecuencia = 16000000/(64∑ (25 + 1)) = 9615 baudios

El error que se origina cargando 25 en el SPBRG será:


Error = (9615 - 9600)/9600 = 0.16%

En el siguiente cuadro se presenta la estructura interna junto otros datos de interés de los registros que
intervienen en la determinación de la frecuencia en baudios a la que transfiere información el SART:

TABLA 21: Características relevantes de los registros que intervienen en la determinación de la


frecuencia en baudios de la transferencia de información en el modo asíncrono del USART
DIRECCION NOMBRE BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 VALOR EN VALOR EN
PORBOR EL RESTO DE
RESETS
98 h TXSTA CSRC TX9 TXEN XYNC --- BRGH TRMT TX90 0000.010 0000.010
18 h RCSTA SPEN RX9 SREN CREN A-- FERR RX9D RX9D 0000 000x 0000 000x
ADDEN
99 h SPBRG Registro Generador de Baudios 0000 0000 0000 0000

Transmisor asíncrono
En la Figura 44, se muestra un esquema simplificado de la comunicación entre un USART transmisor y otro
receptor, contenidos en sus respectivos microcontroladores.
El dato que se desea transmitir por el USART transmisor se deposita en l registro TXREG y a continuación se
traspasa al registro de desplazamiento TSR, que va sacando los bits secuencialmente y a la frecuencia
establecida. Además, antes de los bits del dato de información incluye un bit de INICIO y después de sacar
todos los bits añade un bit de PARADA. El USART receptor recibe, uno a uno, los bits, elimina los dos de
control y los de información una vez que han llamado el registro de desplazamiento RSR los traslada
automáticamente al registro RCREG; donde quedan disponibles para su posterior procesamiento.

El diagrama por bloques de la sección transmisora del USART. El núcleo está constituido por el registro de
desplazamiento TSR, que obtiene el dato desde el Registro TXREG y luego lo va desplazando y sacando bit a
bit, en serie, por la patita RC6/TX/CK. El primer bit que sale es el de menos peso. el dato a transferir se carga
por software en TXREG y se transfiere al TSR en cuanto se haya transmitido el bit de parada del dato anterior
el bit de parada del dato anterior. La transferencia entre los dos registros se realiza en un ciclo y entonces el
señalizador TXIF se pone a 1, para advertir que el registro de transmisión se ha vaciado. También en este
momento puede producirse una interrupción si ha posibilitado PROGRAMANDO El bit =1. en el registro (4):
Cuando se escribe otro dato sobre TXREG, el señalizador TIXF se pon a 0 . el bit TRMT sirve para indicar el
estado del registro TSR y vale 1 cuando esté vacío.

La secuencia de paso a seguir para implementa una transmisión en el USART es la siguiente


1. Hay que configurar las líneas RC6/TX/CK como salida y RG7/RX/DT como entrada
2. Poner SYNC = 0 y SPEN = 1 para activar el USART en modo asíncrono
3. Si se desea trabajar con interrupción poner TXIE =1. Además de habilitar las interrupciones en
general
4. Si el dato consta de 9 bs, en lugar de los 8 típicos, poner el bit TX9= 1 El noveno bit se colocará en
TX9D(TXSTA).
5. Se carga el valor X adecuado n el registro SPBRG, para producir la frecuencia de trabajo deseada.
Hay que controlar el bit BRGH (alta y baja velocidad)
6. Activar la transmisión con TXEN = 1. El bit TXIF tendrá valor 1, ya que TREG se encuentra vacío
7. Cargar TXREG el dato a transmitir. Comienza la transmisión.
El siguiente ejemplo muestra una posible configuración

clrf PORTC ;Se borran los bits de puerta C


bsf STATUS, RP0 ;Banco 1
bcf STATUS, RP1 ;RC7/RXDT,entrada y
movlw b’1011111’ ;RC6/TX/CK, Salida
movwf TRISC
bcf STATUS, RPO ;Banco 0
bsf RCTA,SPEN ;Se activa el USART
movlw b’00100100’ ;Se elige el modo asíncrono
movwf TXSTA ;(SYNC = 0).
movlw 25 ;dato de 8 bits y alta velocidad
movwf SPBRG (BRGH=1)
bsf TXSTA,TXEN ;se carga 25w
movlw 48 ;Se carga 25 en el registro SPBRG,
movwf TXREG on lo
;Que trabaja a 9,600 baudios
;Se activa la transmisión
;Se mueve a TXREG el dato a
transmitir
;Comienza la transmisión

REGISTRO: Registro TXSTA


CSRC TX9 TXEN SYNC - BRGH TRMT TX9D

CSRC: Bit de selección el reloj


Modo asíncrono no influye
Modo síncrono:
1 = Modo maestro (Reloj generado internamente desde BRG)
0= Modo eslavo (Reloj generado por una fuete externa
TX9: Habilita el bit 9 de transmisión
1= Selecciona transmisión de 9 bits
0= Selecciona transmisión de 8 bits
TXEN: Activa la Transmisión
1= Transmisión Activada
0= Transmisión Desactivada
SYNC: Bit de selección del modo del USART.
1= Modo síncrono
0= Modo asíncrono

BRGH: Bit de selección de la velocidad de baudios


Modo asíncrono
1 = Alta velocidad
0 = Baja velocidad
Modo síncrono no utilizado

TRMT: Bit de estado del registro de desplazamiento de transmisión


1= TSR vacío
0= TSR no vacío

TX9D: Bit 9 del dato a transmitir (puede ser el bit de paridad)

Receptor asíncrono
Los datos se reciben en serie, bit a bit, por la patita RC7/RX/DT y se van introduciendo secuencialmente en el
registro desplazamiento RSR (Figura 9.4), que funciona a una frecuencia 16 veces más rápida que la de
trabajo. Cuando el dato consta de 9 bits hay que programar el bit RX9 = 1 y el noveno bit de información se
colocará en el bit RX9D. Obsérvese en la figura 9.8 el control sobre el noveno con las puertas de control y las
señales que se aplican (ADDEN = 1). Cuando REN = 1 en el registro RCA<4>, Se habilita la recepción.
Cuando un procesador maestro intenta enviar información a uno de los esclavos, primero envía un byte de
dirección que identifica al destinatario. El byte de dirección se identifica porque el bit RX9D que llega vale 1.
Si el bit ADDEN = 1 en el esclavo se ignoran todos los bytes de datos. Pero si el noveno bit que se recibe vale
1, quiere decir que se trata de una dirección y el esclavo provocará una interrupción, y se transferirá el
contenido del registro RSR al buffer de recepción. Tras la interrupción, el esclavo deberá examinar la
dirección y se coincide con la suya poner ADDEN=0 para poder recibir datos del maestro.
Si ADDEN = 1 como los datos son ignorados, el bit de PARAD no se carga en RSR, por lo que este hecho no
produce interrupción.
Los pasos a seguir en el modo de recepción son los siguientes:
Se carga con el valor X al registro SPBRG para trabajar con la frecuencia deseada controlando además el valor
de BRGH
Se habilita l USART n modo asíncrono con SPEN = 1 y SYNC = 0
Si se desea que se genera una interrupción con la llegada del bit PARADA, se une RCIE = 1 además de
habilitar las interrupciones en general
Poner RX9= 1 para permitir la recepción del bit 9
Para detectar la dirección, poner ADDEN = 1
Se habilita la recepción poniendo CREN = 1
Al completarse la recepción RCIF se pondrá a 1 y se produce una interrupción si se había permitido
Se lee el registro resta y se averigua si se averigua si se ha producido algún error.
leer los 8 bits del registro RCREG para determinar si el dispositivo ha sido el direccionado
si se ha producido algún error. Poner CREN = 0
Si ha sido direccionado el dispositivo, poner ADDEN=0 para permitir la recepción del la información

A continuación se muestra la estructura interna y la asignación de funciones de los bits del registro RCSTA.

REGISTRO: Registro RCSTA


SPEN RX9 SREN CREN ADDEN RERR OERR RX9D
0
SPEN Habilitación del puerto serie
1= Puerto serie habilitado (se configuran las patitas RC7/RX/DT y RC6/TX/CK)
0 = Puerto serie deshabilitado

RX9 Habilita el bit 9 de recepción


0 = Selecciona recepción de 9 bits
1 =Selección recepción de 8 bits
SREN Configura LA recepción sencilla
Modo asíncrono. No influye
Modo sincrono maestro:
0 = Habilita recepción sencilla
1 = deshabilita recepción sencilla
Modo sincrono esclavo: no se utiliza

CREN Configura la recepción continua


Modo asíncrono:
0 = habilita modo de recepción continua
1 = Deshabilita recepción continua.

Modo Síncrono:
0 = Habilita recepción continua hasta que el bit CREN es borrado
1 = habilita recepción continua

ADDEN Detección de dirección

Modo asíncrono con 9 bits (RX9=1)


1 = activa la detección de dirección, activa la interrupción y descarga el buffer de recepción al activarse
RSR<8>
0 = desactiva la detección de dirección, todos los bits son recibidos y el bit 9 puede ser utilizado como bit de
paridad.
FERR Bit de error de trama
1 = error de trama (puede ser actualizado leyendo el registro RCREG y recibir el siguiente) dato válido
0 = no hay error de trama

OERR Bit de error de sobrepasamiento


1 = error de sobrepasamiento (puede ser borrado escribiendo un 0 en el bit CREN)
0 = no hay error de sobrepasamiento

RX9D Bit 9 del dato recibido (puede ser el bit de paridad)

REPERTORIO DE INSTRUCCIONES

Características generales

Habiendo escogido los diseñadores de PIC la filosofía RISC, su juego de instrucciones es reducido (33 instrucciones en
la gama baja), siendo éstas, además, sencillas y rápidas, puesto que casi todas se ejecutan en un único ciclo de máquina
(equivalente a 4 del reloj principal). Sus operandos son de gran flexibilidad, pudiendo actuar cualquier objeto como
fuente y como destino.

Posee tres tipos bien diferenciados de direccionamiento, estos son:

1º Inmediato: El valor del dato está incluido en el propio código OP, junto a la instrucción.

2º Directo: La dirección del dato está incluido en el propio código OP, junto a la instrucción.

3º Indirecto: La dirección de la memoria de datos que guarda el operando está contenida en un registro.

Nosotros nos centraremos en la gama media, que tiene 35 instrucciones. La mayoría son idénticas a las de la gama baja,
si bien las diferencias serán convenientemente explicadas.

4.2 Definiciones y abreviaturas

Ante todo es conveniente que usted tenga clara la estructura interna del micro, puesto que las instrucciones la
referencian, y puesto que en cualquier micro la comprensión de la nomenclatura de sus componentes es esencial. De
este modo hemos creado la siguiente tabla para ayudarle a comprender las abreviaturas:
Abreviatura Descripción
PC Contador de Programa que direcciona la memoria de instrucciones.
Tiene un tamaño de 11 bits en la gama baja, de los cuales los 8 de
menos peso configuran el registro PCL que ocupa el registro 0x02
del área de datos.

TOS Cima de la pila, con 2 niveles en la gama baja y 8 en la media

WDT Perro guardián (Watchdog)

W Registro W, similar al acumulador

F Suele ser un campo de 5 bits (fffff) que contiene la dirección del


banco de registros, que ocupa el banco 0 del área de datos.
Direcciona uno de esos registros.

D Bit del código OP de la instrucción, que selecciona el destino. Si


d=0, el destino es W, y si d=1 el destino es f.

Dest Destino (registro W o f)

TO Bit “Time Out” del registro de estado

PD Bit “Power Down” del registro de estado

b Suele ser un campo de 3 bits (bbb) que determinan la posición de


un bit dentro de un registro de 8 bits

k Se trata, normalmente, de un campo de 8 bits (kkkkkkkk) que


representa un dato inmediato. También puede constar de 9 bits en
las instrucciones de salto que cargan al PC

x Valor indeterminado (puede ser un 0 o un 1). Para mantener la


compatibilidad con las herramientas software de Microchip
conviene hacer x = 0

label Nombre de la etiqueta

[] Opciones
() Contenido
→ Se asigna a
<> Campo de bits de un registro
∈ Pertenece al conjunto

Z Señalizador de cero en W. Pertenece al registro de estado

C Señalizador de acarreo en el octavo bit del W. Pertenece al registro


de estado

DC Señaliza el acarreo en el 4 bit del W. Pertenece al registro de


estado

Itálicas Términos definidos por el usuario


Repertorio de instrucciones de la gama media

ADDLW Suma un ADDWF W+F ANDLW W AND literal


literal
Sintaxis: [label] Sintaxis: [label] ANDLW k
Sintaxis: [label] ADDLW k ADDWF f,d Operandos: 0 ≤ k ≤ 255
Operandos: 0 ≤ k ≤ 255 Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: : (W) AND (k)⇒
Operación: : (W) + (k)⇒ (W) Operación: (W) + (f) ⇒ (dest) (W)
Flags afectados: C, DC, Z Flags afectados: C, DC, Z Flags afectados: Z
Código OP: 11 111x kkkk kkkk Código OP: 00 0111 dfff ffff Código OP: 11 1001 kkkk kkkk

Descripción: Suma el contenido Descripción: Suma el contenido Descripción: Realiza la


del registro W y k, guardando el del registro W y el registro f. Si d operación lógica AND entre el
resultado en W. es 0, el resultado se almacena en contenido del registro W y k,
W, si d es 1 se almacena en f. guardando el resultado en W.
Ejemplo: ADDLW 0xC2
Ejemplo: ADDWF REG,0 Ejemplo: ADDLW 0xC2
Antes: W = 0x17
Después: W = 0xD9 Antes: W = 0x17., REG = 0xC2 Antes: W = 0x17
Después: W = 0xD9, REG = 0xC2 Después: W = 0xD9

ANDWF W AND F BCF Borra un bit BSF Activa un bit

Sintaxis: [label] ANDWF f,d Sintaxis: [label] BCF f,b Sintaxis: [label] BSF f,b
Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operandos: 0 ≤ f ≤ 127, 0 ≤ b ≤ Operandos: 0 ≤ f ≤ 127, , 0 ≤ b ≤
Operación: (W) AND (f) ⇒ (dest) 7 7
Flags afectados: Z Operación: : 0 ⇒ (f<b>) Operación: 1 ⇒ (f<b>)
Código OP: 00 0101 dfff ffff Flags afectados: Ninguno Flags afectados: Ninguno
Descripción: Realiza la Código OP: 01 00bb bfff ffff Código OP: 01 01bb bfff ffff
operación lógica AND entre los
registros W y f. Si d es 0, el Descripción: Borra el bit b del Descripción: Activa el bit b del
resultado se almacena en W, si d registro f registro f
es 1 se almacena en f.
Ejemplo: : ANDWF REG,0
Ejemplo: : BCF REG,7 Ejemplo: : BSF REG,7
Antes: W = 0x17., REG = 0xC2
Después: W = 0x17, REG = Antes: REG = 0xC7 Antes: REG = 0x0A
0x02 Después: REG = 0x47 Después: REG = 0x8A

BTFSC Test de bit y BTFSS Test de bit y CALL Salto a


salto salto subrutina

Sintaxis: [label] Sintaxis: [label] Sintaxis: [label]


BTFSC f,d BTFSS f,d CALL k
Operandos: d ∈ [0,1], 0 ≤ f ≤ Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operandos: 0 ≤ k ≤ 2047
127 Operación: Salto si (f<b>) = 1 Operación: PC ⇒ Pila; k ⇒ PC
Operación: Salto si (f<b>) = 0 Flags afectados: Ninguno Flags afectados: Ninguno
Flags afectados: Ninguno Código OP: 01 11bb bfff ffff Código OP: 10 0kkk kkkk
Código OP: 01 10bb bfff ffff kkkk
Descripción: Si el bit b del
Descripción: Si el bit b del registro f es 1, se salta una Descripción: Salto a una
registro f es 0, se salta una instrucción y se continúa con la subrutina. La parte baja de k se
instrucción y se continúa con la ejecución. En caso de salto, carga en PCL, y la alta en
ejecución. En caso de salto, ocupará dos ciclos de reloj. PCLATCH. Ocupa 2 ciclos de
ocupará dos ciclos de reloj. Ejemplo: BTFSS REG,6 reloj.
Ejemplo: BTFSC REG,6 GOTO Ejemplo:ORIGEN CALL
GOTO NO_ES_0 DESTINO
NO_ES_0 SI_ES_0 Instrucción
SI_ES_0 Instrucción NO_ES_0 Instrucción Antes: PC = ORIGEN
NO_ES_0 Instrucción Después: PC = DESTINO
CLRF Borra un CLRW Borra el registro CLRWDT Borra el
registro W WDT
Sintaxis: [label] CLRF f Sintaxis: [label] CLRW Sintaxis: [label] CLRWDT
Operandos: 0 ≤ f ≤ 127 Operandos: Ninguno Operandos: Ninguno
Operación: : 0x00 ⇒ (f), 1 ⇒ Z Operación: : 0x00 ⇒ W, 1 ⇒ Z Operación: 0x00 ⇒ WDT, 1 ⇒
Flags afectados: Z Flags afectados: Z /TO
Código OP: 00 0001 1fff ffff Código OP: 00 0001 0xxx 1 ⇒
xxxx /PD
Descripción: El registro f se Flags afectados: /TO, /PD
carga con 0x00. El flag Z se Descripción: El registro de Código OP: 00 0000 0110
activa. trabajo W se carga con 0x00. El 0100
flag Z se activa.
Descripción: Esta instrucción
Ejemplo: : CLRF REG borra tanto el WDT como su
Ejemplo: : CLRW preescaler. Los bits /TO y /PD del
Antes: REG = 0x5A registro de estado se ponen a 1.
Después: REG = 0x00, Z = 1 Antes: W = 0x5A
Después: W = 0x00, Z = 1
Ejemplo: : CLRWDT
Después: Contador WDT = 0,
Preescales WDT = 0,
/TO = 1, /PD = 1

COMF Complemento de DECF Decremento de f DECFSZ Decremento y


f Sintaxis: [label] DECF f,d salto
Sintaxis: [label] COMF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Sintaxis: [label]
Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operación: : (f ) – 1 ⇒ (dest) DECFSZ f,d
Operación: : (/ f), 1 ⇒ (dest) Flags afectados: Z Operandos: d ∈ [0,1], 0 ≤ f ≤ 127
Flags afectados: Z Código OP: 00 0011 dfff ffff Operación: (f) -1 ⇒ d; Salto si
Código OP: 00 1001 dfff ffff R=0
Descripción: Decrementa en 1 el Flags afectados: Ninguno
Descripción: El registro f es contenido de f. Si d es 0, el Código OP: 00 1011 dfff ffff
complementado. El flag Z se resultado se almacena en W, si d
activa si el resultado es 0. Si d es es 1 se almacena en f. Descripción: Decrementa el
0, el resultado se almacena en W, contenido del registro f. Si d es 0,
si d es 1 se almacena en f.. el resultado se almacena en W, si
d es 1 se almacena en f. Si la
Ejemplo: : DECF CONT,1 resta es 0 salta la siguiente
instrucción, en cuyo caso costaría
Antes: CONT = 0x01, Z = 0 2 ciclos.
Ejemplo: : COMF REG,0
Después: CONT = 0x00, Z = 1
Ejemplo: DECFSC REG,0
Antes: REG = 0x13
GOTO
Después: REG = 0x13, W =
NO_ES_0
0XEC
SI_ES_0 Instrucción
NO_ES_0 Salta instrucción
anterior

GOTO Salto incondicional INCF Decremento de f INCFSZ Incremento y salto


Sintaxis: [label] Sintaxis: [label] INCF f,d Sintaxis: [label] INCFSZ f,d
GOTO k Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operandos: d ∈ [0,1], 0 ≤ f ≤ 127
Operandos: 0 ≤ k ≤ 2047 Operación: : (f ) + 1 ⇒ (dest) Operación: (f) -1 ⇒ d; Salto si R=0
Flags afectados: Ninguno
Operación: k ⇒ PC <8:0> Flags afectados: Z Código OP: 00 1111 dfff ffff
Flags afectados: Ninguno Código OP: 00 1010 dfff ffff
Código OP: 10 1kkk kkkk Descripción: Incrementa el contenido
kkkk Descripción: Incrementa en 1 el del registro f. Si d es 0, el resultado se
contenido de f. Si d es 0, el almacena en W, si d es 1 se almacena
Descripción: Se trata de un salto resultado se almacena en W, si d en f. Si la resta es 0 salta la siguiente
incondicional. La parte baja de k es 1 se almacena en f. instrucción, en cuyo caso costaría 2
ciclos.
se carga en PCL, y la alta en
PCLATCH. Ocupa 2 ciclos de Ejemplo: INCFSC REG,0
reloj. Ejemplo: : INCF CONT,1 GOTO
NO_ES_0
Ejemplo: ORIGEN GOTO DESTINO Antes: CONT = 0xFF, Z = 0 SI_ES_0 Instrucción
Después: CONT = 0x00, Z = 1 NO_ES_0 Salta instrucción
Antes: PC = ORIGEN anterior
Después: PC = DESTINO
IORLW W OR literal IORWF W AND F MOVLW Cargar literal en
Sintaxis: [label] IORLW k Sintaxis: [label] IORWF f,d W
Operandos: 0 ≤ k ≤ 255 Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Sintaxis: [label]
Operación: : (W) OR (k)⇒ (W) Operación: (W) OR (f) ⇒ (dest) MOVLW f
Flags afectados: Z Flags afectados: Z Operandos: 0 ≤ f ≤ 255
Código OP: 11 1000 kkkk kkkk Código OP: 00 0100 dfff ffff Operación: (k) ⇒ (W)
Flags afectados: Ninguno
Descripción: Se realiza la Descripción: Realiza la Código OP: 11 00xx kkkk
operación lógica OR entre el operación lógica OR entre los kkkk
contenido del registro W y k, registros W y f. Si d es 0, el
guardando el resultado en W. resultado se almacena en W, si d Descripción: El literal k pasa al
es 1 se almacena en f. registro W.

Ejemplo: : IORLW 0x35 Ejemplo: : IORWF REG,0

Antes: W = 0x9A Antes: W = 0x91, REG = 0x13 Ejemplo: MOVLW


Después: W = 0xBF Después: W = 0x93, REG = 0x5A
0x13 Después: REG = 0x4F, W =
0x5A

MOVF Mover a f MOVWF Mover a f NOP No operar


Sintaxis: [label] Sintaxis: [label] Sintaxis: [label] NOP
MOVF f,d MOVWF f Operandos: Ninguno
Operandos: d ∈ [0,1], 0 ≤ f ≤ Operandos: 0 ≤ f ≤ 127 Operación: No operar
127 Operación: W ⇒ (f) Flags afectados: Ninguno
Operación: (f) ⇒ (dest) Flags afectados: Ninguno Código OP: 00 0000 0xx0
Flags afectados: Z Código OP: 00 0000 1fff ffff 0000
Código OP: 00 1000 dfff ffff
Descripción: El contenido del Descripción: El contenido del Descripción: No realiza
registro f se mueve al destino d. registro W pasa el registro f. operación alguna. En realidad
Si d es 0, el resultado se consume un ciclo de instrucción
almacena en W, si d es 1 se sin hacer nada.
almacena en f. Permite verificar el
registro, puesto que afecta a Z. Ejemplo: MOVWF
REG,0 Ejemplo: : CLRWDT
Ejemplo: MOVF
REG,0 Antes: REG = 0xFF, W = Después: Contador WDT = 0,
0x4F Preescales WDT = 0,
Después: W = REG Después: REG = 0x4F, W = /TO = 1, /PD = 1
0x4F

RETFIE Retorno de RETLW Retorno, carga W RETURN Retorno de rutina


interrup.
Sintaxis: [label] RETFIE Sintaxis: [label] RETLW k Sintaxis: [label] RETURN
Operandos: Ninguno
Operandos: 0 ≤ k ≤ 255 Operandos: Ninguno
Operación: : 1 ⇒ GIE; TOS⇒PC
Flags afectados: Ninguno Operación: : (k)⇒ (W); Operación: : TOS ⇒ PC
Código OP: 00 0000 0000 1001 TOS⇒PC Flags afectados: Ninguno
Flags afectados: Ninguno Código OP: 00 0000 0000
Descripción: El PC se carga con el Código OP: 11 01xx kkkk kkkk 1000
contenido de la cima de la pila (TOS):
dirección de retorno. Consume 2 Descripción: El registro W se Descripción: El PC se carga con
ciclos. Las interrupciones vuelven a el contenido de la cima de la pila
ser habilitadas.
carga con la constante k. El PC
se carga con el contenido de la (TOS): dirección de retorno.
cima de la pila (TOS): dirección Consume 2 ciclos.
Ejemplo: : RETFIE de retorno. Consume 2 ciclos.
Ejemplo: :
Después: PC = dirección de retorno Ejemplo: : RETLW 0x37 RETURN
GIE = 1
Después: PC = dirección de retorno Después: PC = dirección de
W = 0x37 retorno
RLF Rota f a la izquierda RRF Rota f a la derecha SLEEP Modo bajo consumo
Sintaxis: [label] RLF Sintaxis: [label] Sintaxis: [label] SLEEP
f,d RRF f,d Operandos: Ninguno
Operandos: d ∈ [0,1], 0 ≤ f ≤ Operandos: d ∈ [0,1], 0 ≤ f ≤ Operación: 0x00⇒WDT, 1 ⇒ /
127 127 TO
Operación: Rotación a la Operación: Rotación a la 0 ⇒ WDT Preescaler, 0 ⇒ /
izquierda derecha PD
Flags afectados: C Flags afectados: C Flags afectados: / PD, / TO
Código OP: 00 1101 dfff ffff Código OP: 00 1100 dfff ffff Código OP: 00 0000 0110
0011
Descripción: El contenido de f se Descripción: El contenido de f se
rota a la izquierda. El bit de rota a la derecha. El bit de menos Descripción: El bit de energía se
menos peso de f pasa al carry peso de f pasa al carry (C), y el pone a 0, y a 1 el de descanso. El
(C), y el carry se coloca en el de carry se coloca en el de mayor WDT y su preescaler se borran.
mayor peso. Si d es 0, el peso. Si d es 0, el resultado se El micro para el oscilador, llendo
resultado se almacena en W, si d almacena en W, si d es 1 se al modo “durmiente”.
es 1 se almacena en f. almacena en f.

Ejemplo: :
Ejemplo: RRF REG,0 Ejemplo: RRF REG,0 SLEEP
Antes: REG = 1110 0110, C = Antes: REG = 1110 0110, C =
0 1 Preescales WDT = 0,
Después: REG = 1110 0110, Después: REG = 1110 0110, /TO = 1, /PD = 1
W = 1100 1100, C = 1 W = 01110 0011, C = 0

SUBLW Resta Literal - W SUBWF Resta f – W SWAPF Intercambio de f

Sintaxis: [label] Sintaxis: [label] Sintaxis: [label] SWAPF f,d


SUBLW k SUBWF f,d Operandos: d ∈ [0,1], 0 ≤ f ≤ 127
Operandos: 0 ≤ k ≤ 255 Operandos: d ∈ [0,1], 0 ≤ f ≤ Operación: : (f <3: 0>)⇔ (f
Operación: ( k ) - (W) ⇒ (W) 127 <7:4>)
Flags afectados: Z, C, DC Operación: ( f ) – (W )⇒ Flags afectados: Ninguno
Código OP: 11 110x kkkk (dest) Código OP: 00 1110 dfff ffff
kkkk Flags afectados: C, DC, Z
Descripción: Mediante el método Código OP: 00 0010 dfff ffff Descripción: Los 4 bits de más
del complemento a dos el Descripción: Mediante el método peso y los 4 de menos son
contenido de W es restado al del complemento a dos el intercambiados. Si d es 0, el
literal. El resultado se almacena contenido de W es restado al de f. resultado se almacena en W, si d
en W. . Si d es 0, el resultado se es 1 se almacena en f.
almacena en W, si d es 1 se
almacena en f. Ejemplo: : SWAPF REG,0
Ejemplos: SUBLW
0x02 Ejemplos: SUBWF Antes: REG = 0xA5
REG,1 Después: REG = 0xA5, W =
Antes:W=1,C=?. Después: W=1, Antes: REG = 0x03, W = 0x02, C 0x5A
C=1 =?
Antes:W=2,C=?. Después: W=0, Después:REG=0x01, W = 0x4F,
C=1 C=1
Antes:W=3,C=?.Después:W=FF, Antes: REG = 0x02, W = 0x02, C
C=0 =?
(El resultado es negativo) Después:REG=0x00, W =0x02,
C= 1
Antes: REG= 0x01, W= 0x02, C=
?
Después:REG=0xFF, W=0x02,
C= 0
(Resultado negativo)
XORWF W AND F XORLW W OR literal

Sintaxis: [label] XORWF f,d Sintaxis: [label] XORLW k


Operandos: d ∈ [0,1], 0 ≤ f ≤ 127 Operandos: 0 ≤ k ≤ 255
Operación: (W) XOR (f) ⇒ Operación: : (W) XOR (k)⇒
(dest) (W) La gama media tiene un total
Flags afectados: Z Flags afectados: Z de 35 instrucciones, cada una
Código OP: 00 0110 dfff ffff Código OP: 11 1010 kkkk kkkk de las cuales ocupan 14 bits.
Descripción: Realiza la Descripción: Se realiza la
operación lógica XOR entre los operación lógica XOR entre el
registros W y f. Si d es 0, el contenido del registro W y k,
resultado se almacena en W, si d guardando el resultado en W.
es 1 se almacena en f.
Ejemplo: : XORLW 0xAF
Ejemplo: : XORWF REG,0
Antes: W = 0xB5
Antes: W = 0xB5, REG = 0xAF Después: W = 0x1A
Después: W = 0xB5, REG =
0x1A

BIBLIOGRAFÍA

Bibliografía escrita.

Microcontroladores PIC. La Solución en un Chip.


J. Mª. Angulo Usategui, E. Martín Cuenca, I. Angulo Martínez
Ed. Paraninfo. ( 1997 )

Microcontroladores PIC. Diseño práctico de aplicaciones.


J. Mª. Angulo Usategui, I. Angulo Martínez
Mc Graw Hill [ 1999 ]

Microcontroladores.
Vicente Torres.
Servicio Publicaciones UPV.

Programming and Customizing the Pic Microcontroller


Myke Predko
Mc Graw Hill [ 1999 ]

Electrónica. Microcontroladores y Microprocesadores.


Fascículos coleccionables. Editorial Multipress SA.

PIC16/17 Microcontroller Data Book.


Microchip Technology Inc. ( 1995 – 96 )

Technical Training Workbook de Microchip


Microchip Technology Inc. ( 1999 )

Embedded Control Handbook


Microchip Technology Inc. (1995 - 96 )

July 1999 Technical Library CD-ROM


Microchip Technology Inc. ( 1999 )

Microchip Technical CD-ROM First Edition 2000


Microchip Technology Inc. ( 2000 )

MPSIM Simulator Quick Reference Guide


Microchip Technology Inc. ( 1996 )

MPASM Assembler Quick Reference Guide


Microchip Technology Inc. ( 1996 )

MPSIM Simulator User’s guide


Microchip Technology Inc. ( 1995 )

MPASM Assembler User’s Guide


Microchip Technology Inc. ( 1995 )
Bibliografía electrónica.

Microchip. http://www.microchip.com
Parallax. http://www.parallaxinc.com
Página Web de CX2FW: Información y Links. http://www.angelfire.com/tx/cx2fw/cx2fw.html
Página de Javier Alzate: Microcontroladores http://www.geocities.com/CapeCanaveral/Lab/9827
PIC16CXX. /microcon.htm
Private Users System: Programador de Pics. http://www.lokekieras.es/personales/mgsanz/progra
ma.htm
El Rincón del Pic. http://members.es.tripod.de/~InfoE/infop.htm
Microsystems Engineering: Los autores de los http://www.arrakis.es/~msyseng
libros de Pics en castellano.
Links sobre Pics de David Tait. http://www.man.ac.uk/~mbhstdj/piclinks.html
Archivos sobre Pics de David Tait. http://www.labyrinth.net.au/~donmck/dtait/index.ht
ml
De todo un poco (Electrónica): Algunos circuitos. http://www.arrakis.es/~ldr2000/manny/circuitos
Rei Project: Mod Chip: Algunos proyectos. http://chip.aeug.org
NewFound Electronics: Programador de Pics. http://www.new-elect.com
Dontronics. http://www.dontronics.com
The Picmicro Ring. http://members.tripod.com/~mdileo/pmring.html
Microcontoladores: Información, Herramientas y http://www.geocities.com/TheTropics/2174/micro.h
Programador. tml
Microcontrollers: Enlaces. http://www.us-epanorama.net/microprocessor.html
NOPPP, the "No-Parts" PIC Programmer. http://www.CovingtonInnovations.com/noppp/nopp
p-sp.html
Parallel Port PIC16C5X/XX Programmer. http://www.labyrinth.net.au/~donmck/dtait/upp.htm
l
Microchip Net resources. http://www.geocities.com/SiliconValley/Way/5807
PIC16/17 Microcontroller & Basic Stamp: Con http://www.doc.ic.ac.uk/~ih/doc/pic
algunos proyectos.
La página del autor de Programming and http://www.myke.com/PICMicro
Customizing the Pic Microcontroller: Con algunos
circuitos.
Pic Programming. Getting Started: 4 pasos para http://www.pp.clinet.fi/~newmedia/pic/index.html
empezar con los Pic.
Pic Programmer 2. http://www.jdm.homepage.dk/newpic.htm
GNUPic “Free Microcontroller Software Tools http://huizen.dds.nl/~gnupic/index.html
Propic2: Programador de Pics. http://www.propic2.com
PicProg Home Page: Programador de Pics. http://virtuaweb.com/picprog
Mundo Electrónico: Enlaces. http://www.geocities.com/CapeCanaveral/Campus/
9468/mundo.htm
The Electronic Projects Page: Algunos proyectos. http://www.blichfeldt.dk
Bengt Lindgrens HomePage: Programador y http://home5.swipnet.se/~w-53783
archivos.
The ultimate source for Pic and SX Tools http://www.adv-transdata.com
P16PRO & PICALL PIC programmers: Otro http://www.geocities.com/SiliconValley/Peaks/962
programador 0
Proyecto de Gaspar Vidal que utiliza los Pic como http://www.geocities.com/CapeCanaveral/Campus/
soporte hardware. 8775/proyecto/pfc.htm
Diseño de sistemas con microcontroladores: http://www.info-ab.uclm.es/~amartine
Enlaces.
Los Microcontroladores: Información sobre algunos http://www.gherson.homepage.com
modelos.
Free PIC 16x84 programmer with margining http://www.ise.pw.edu.pl/~wzab/picprog/picprog.ht
support. ml
FlashPIC Developer for PIC16F84 and PIC16F87x http://www.cybermedix.co.nz/flashpic
Series PIC Microcontrollers.
Sagitron: Distribuidor de Microchip en España. http://www.sagitron.es
Indicadores y controles basados en micros pic: Otro http://chasque.chasque.apc.org/franky/pics.htm
proyecto.
EDU-PIC: PIC Microcontrollers in education. http://pages.hotbot.com/edu/edu-pic
Programmer for PIC-processors. http://www.qsl.net/lz2rr/pic.html

MANUAL DESARROLADO POR:


JESUS COTRINA MATTA
CRHISTIAN ALMEYDA ORELLANA
CURSO PIC16F87X

También podría gustarte