Manual Pic16f87x PDF
Manual Pic16f87x PDF
Manual Pic16f87x PDF
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
FIGURA 01
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
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
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.
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).
Puerta D
Puerta E
RE0//RD/AN5 8 9 I/O ST/TTL(3)
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.
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.
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.
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.
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
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.
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.
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.
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 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
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.
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.
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.
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.
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
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
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
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
9Fh ADCON1 ADFM - - - PCFG3 PCFG2 PCFG1 PCFG0 --0- 0000 --0- 0000
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.
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
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.
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
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
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:
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
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
1Dh CCP2CON - - CCP2X CCP2Y CCP2M3 CCP2M2 CCP2M1 CCP2M0 --00 0000 --00 0000
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.
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.
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
17h CCP1CON - - CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 --00 0000 --00 0000
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.
.
.
.
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.
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:
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.
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
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:
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.
4. Comenzar la conversión:
• Poner a uno el bit GO//DONE (ADCON0)
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.
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.
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
• 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
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
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.
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.
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
17h CCP1CON - - CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 --00 0000 --00 0000
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.
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.
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
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:
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.
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.
SSPM3-SSPMO
Con los 4 bits de menos peso del registro SSSPCON se establece el modo de trabajo del módulo MSSP.
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.
goto BUCLE ;El buffer aún no está lleno y hay que esperar.
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.
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.
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
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.
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.
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.
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.
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.
MSB LSB
S Dirección de esclavo 1 R/W#
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.
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:
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.
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.
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.
En el siguiente cuadro muestra la distribución de los bits del registro de control 2 SSPCON2.
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:
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:
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.
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 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.
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:
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.
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.
Modo Síncrono:
0 = Habilita recepción continua hasta que el bit CREN es borrado
1 = habilita recepción continua
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.
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.
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.
[] Opciones
() Contenido
→ Se asigna a
<> Campo de bits de un registro
∈ Pertenece al conjunto
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
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
BIBLIOGRAFÍA
Bibliografía escrita.
Microcontroladores.
Vicente Torres.
Servicio Publicaciones UPV.
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