Está en la página 1de 85

PIC

16F87X
TRABAJO
EXPLICACIN

Sebastin Martn Garca


2 DPE

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

INDICE
DIFERENCIAS ENTRE PIC16F84 Y 16F87X ____________________________________ 4

PIC 16F87X_________________________________________________________________ 5
DIFERENCIAS ENTRE 16F84 Y 16F87X __________________________________________ 5
SENSORES ANALOGICOS MAS UTILIZADOS __________________________________ 6
SENSOR DE LUMINOSIDAD LDR _______________________________________________ 7
SENSOR DE TEMPERATURA LM35 _____________________________________________ 7
ORGANIZACIN DE LA MEMORIA__________________________________________ 8
MEMORIA DE PROGRAMA ____________________________________________________ 9
MEMORIA DE DATOS RAM ___________________________________________________ 9
INSTRUCCIONES _________________________________________________________ 10

REGISTROS ESPECFICOS_________________________________________________ 12
REGISTRO DE ESTADO (STATUS) _________________________________________ 13
REGISTRO DE OPCIONES (OPTION) _______________________________________ 14
REGISTRO PARA CONTROLAR LAS INTERRUPCIONES ____________________ 15
REGISTRO DE CONTROL DE INTERRUPCIONES (INTCON) __________________ 16
REGISTRO DE PERMISO DE INTERRUPCIONES 1 (PIE1) _____________________ 17
REGISTRO DE PERMISO DE INTERRUPCIONES 2 (PIE2) _____________________ 18
REGISTRO DE LOS SEALIZADORES DE INTERRUPCION 1 Y 2 (PIR1 PIR2) __ 19
LECTURA Y ESCRITURA EEPROM Y FLASH ________________________________ 21
LECTURA Y ESCRITURA DE LAS MEMORIAS EEPROM Y FLASH ____________ 22
PUERTAS E/S _____________________________________________________________ 23
PUERTAS DE E/S ____________________________________________________________ 24
PUERTA A _______________________________________________________________ 24
PUERTA B _______________________________________________________________ 25
PUERTA C _______________________________________________________________ 26
PUERTA D _______________________________________________________________ 26
PUERTA E _______________________________________________________________ 26

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

RECURSOS ESPECIALES __________________________________________________ 27


PALABRA DE CONFIGURACIN __________________________________________ 28
PALABRA DE IDENTIFICACIN __________________________________________ 29
REINICIALIZACIN O RESET ____________________________________________ 29
PERRO GUARDIAN (WDT: WATCHDOG TIMER) ___________________________ 30
MODO DE REPOSO O BAJO CONSUMO ____________________________________ 30
PROGRAMACIN DE LOS PIC 16F87X _____________________________________ 31
TEMPORIZADORES _______________________________________________________ 32
TIPOS Y CARACTERSTICAS GENERALES_________________________________ 33
ESTRUCTURA INTERNA Y FUNCIONAMIENTO DEL TMR1__________________ 34
REGISTRO DE CONTROL DEL TMR1 (T1CON)______________________________ 35
FUNCIONAMIENTO Y PROGRAMACION DEL TMR2 ________________________ 36
CAPTURA, COMPARACIN Y MODULACIN DE ANCHURA DE PULSOS______ 37
INTRODUCCIN A LOS MDULOS CCP ___________________________________ 38
MODO CAPTURA ________________________________________________________ 39
MODO COMPARACIN __________________________________________________ 40
MODO DE MODULACIN DE ANCHURA DE PULSOS (PWM)_________________ 41
EL CONVERSOR A/D ______________________________________________________ 42
PRESENTACIN DEL CONVERSOR ANALGICO / DIGITAL ________________ 43
REGISTROS DE TRABAJO ________________________________________________ 43
ESTRUCTURA INTERNA Y CONFIGURACIN DEL C A/D____________________ 45
PASOS A SEGUIR PARA REALIZAR UNA CONVERSIN CON EL MDULO C A/D__________ 46
MDULO DE COMUNICACIONES SERIE SNCRONA MSSP___________________ 47
INTRODUCCIN _________________________________________________________ 48
MODO SPI _______________________________________________________________ 49
MODO I2C _______________________________________________________________ 50
CONCEPTO DEL BUS I2C ___________________________________________________ 50
DIRECCIONAMIENTO DEL BUS I2C ___________________________________________ 51
BITS DE CONTROL DEL BUS I2C _____________________________________________ 51
USART (SCI) ______________________________________________________________ 54
COMUNICACIN SERIE ASNCRONA _____________________________________ 55
MODOS DE TRABAJO DEL USART ___________________________________________ 55
PROGRAMAS (ASM) _______________________________________________________ 56

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

DIFERENCIAS ENTRE
PIC16F84 Y 16F87X

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PIC 16F87X
Diferencias entre 16F84 y 16F87X
El PIC 16F84 ha sido precedido por el 16C84, prcticamente igual, con
excepcin de la memoria de programa que era de tipo EEPROM en lugar de FLASH. El
FLASH soporta 1.000 operaciones de Escritura/Borrado y el EEPROM 100.000.
El PIC 16F84 tiene una memoria FLASH de 1K palabras, solo un Timer y 13
lneas de E/S digitales y el modelo normal soporta una frecuencia de 10 MHz. Aunque
el A, llega a 20 MHz. Es un microcontrolador categorizado como gama baja por su
bajo coste y sencillez, pero que ha dado mucho que hablar.
La memoria RAM de datos de los PIC 16F87X posee una capacidad de 192
bytes en dos de los modelos y de 368 bytes en los otros dos. Aunque superan
ampliamente los 68 bytes del 16F84 mantienen la misma estructura bsica de 4 bancos
de 128 bytes cada uno, seleccionables por los bits RP0 y RP1 del registro de estado
(STATUS bits 5 y 6 respectivamente).
La memoria de datos no voltil de 64 bytes tipo EEPROM que tena el 16F84,
en los nuevos 16F87X de 28 patas sube a 128 bytes, y en los de 40 patas hasta 256
bytes.
Los 16F87X manejan hasta 14 posibles fuentes de interrupcin y 3 Timer, frente
a las 4 fuentes y 1 Timer del 16F84. El numero de puertas tambin se ha aumentado
considerablemente, con 3 puertas los de 28 patas y hasta 5 puertas los de 40.
Adems lo nuevos PICs, incorporan los siguientes mdulos, inexistentes en el
antiguo 16F84:
- Dos mdulos CCP:
Capaces de comparar y capturar impulsos. La captura se efecta con
una precisin de 12,5 ns y una resolucin de 16 bits, mientras que la
comparacin con igual resolucin alcanza una precisin de 200 ns.
Adems, la seccin PWM vara la anchura de los impulsos, tcnica muy
empleada en los motores.
-

Comunicacin Serie:
La tpica USART, orientada a la comunicacin entre subsistemas o
mquinas (RS-232) y la MSSP destinada a la comunicacin entre
diversos circuitos integrados y que admite el protocolo I2C y SPI.

Comunicacin en Paralelo:
Los PIC 16F874/7 de 40 patas est disponible el protocolo PSP, ms
rpido que la comunicacin serie pero hipoteca muchas minas de E/S, 8 de la
puerta D y 3 de control de la Puerta E.
-

Conversor A/D:
En todos los PIC 16F87X existe un conversor A/D de 10 bits, con 5
canales de entrada en los de 28 patas y 8 en los de 40.
DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

SENSORES ANALOGICOS
MAS UTILIZADOS

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

Sensores Analgicos ms utilizados


Aunque el PIC 16F84 sirve para un sinfn de aplicaciones, hay varias para las
que este microcontrolador no sirve. Un de ellas es la que vamos a tratar en este
apartado, se trata de aplicaciones en las que sea necesario un conversor A/D para su
tratamiento. Vamos a tratar un par de sensores analgicos, una LDR y un sensor de
temperatura NTC.
Sensor de Luminosidad LDR
Un sensor de luminosidad LDR es un elemento cuya resistencia entre bornes
vara en funcin de luz que incide sobre su superficie. Cuando no hay luz tiene
una resistencia infinita y segn va aumentando la luz, va disminuyendo hasta 0.
Es un elemento sin polaridad y se puede encontrar con diferentes dimetros
segn el rango de valores de luminosidad que sea capaz de diferenciar.
Sensor de Temperatura LM35
Otro sensor analgico ampliamente utilizado es el de temperatura. Existen
muchos modelos de sensores de temperatura y su eleccin depende de varios
parmetros, rango de temperaturas, precisin, el coste, resistencia, etc.,...
Uno de los sensores ms utilizados es el LM35 tambin llamado estndar.
Sus caractersticas son:
1. Su tensin de salida Vout es proporcional a la temperatura en una
proporcin de 10mV/C
2. Su rango de funcionamiento esta comprendido entre 0 y 100 C.
3. Su tensin de funcionamiento Vs est entre +4 VDC y +30 VDC.
4. Su precisin es de 0.9 C.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

ORGANIZACIN DE
LA MEMORIA

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

Organizacin de la Memoria
Memoria de Programa
La memoria FLASH en la que se graba el programa de aplicacin en los
PIC 16F87X, puede tener una capacidad de 4K u 8K palabras de 14 bits
cada una. Dicha memoria est dividida en pginas de 2K palabras y est
direccionada con el PC, que tiene un tamao de 13 bits. La pila que tiene 8
niveles de profundidad, es transparente para el usuario, es decir, funciona
automticamente y no dispone de instrucciones para guardar o sacar de
ella informacin. Con la instruccin CALL y con las interrupciones, el
valor se salva en el nivel superior. Con las instrucciones RETURN,
RETFIE Y RETLW, en valor contenido en el nivel superior de la pila, se
carga en el PC. Al poseer la pila solo 8 niveles, le corresponde al
programador preocuparse por los anidamientos en las subrutinas para
sobrepasar dicho valor. El vector de reset ocupa la direccin 0000h y el
vector de interrupcin la 0004h, igual que el PIC 16F84.
Memoria de Datos RAM
La memoria de datos tiene posiciones implementadas en RAM y otra en
EEPROM. En la seccin RAM, se alojan los registros operativos
fundamentales, en el funcionamiento del procesador y en el manejo de sus
perifricos, adems de registros que el programador puede usar para
informacin de trabajo propia de la aplicacin. La memoria EEPROM es
para guardar datos de forma no voltil y se considera un dispositivo
especial.
La RAM esttica consta de 4 bancos con 128 bytes cada uno. En las
posiciones iniciales de banco se ubican los registros especficos que
gobiernan el procesador y sus recursos. Dos modelos de 16F87X tienen 192
bytes de RAM y otros dos de 368 bytes.
Para seleccionar el banco al que se desea acceder en la RAM se emplean
los bits 6 y 5 del Registro de Estado (STATUS) RP1 y RP0
respectivamente, segn el cdigo siguiente:

BANCO
0
1
2
3

RP1
0
0
1
1

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

RP0
0
1
0
1

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

INSTRUCCIONES

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

10

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

Instrucciones
Los mismos formatos, iguales modos de direccionamiento y las mismas 35
instrucciones que tena el PIC 16F84 sirven para todos los modelos PIC 16F87X. No
obstante, en los nuevos PIC, al contener ms recursos, existen nuevos registros
especficos de control cuyos bits se debern escribir o leer para su gobierno.

INSTRUCCIONES QUE MANEJAN REGISTROS


ADDWF
ANDWF
CLRF
CLRW
COMF
DECF
DECFSZ
INCF
INCFSZ
IORWF
MOVF
MOVWF
NOP
RLF
RRF
SUBWF
SWAPF
XORWF

Suma W y F
AND W con F
Borra F
Borra W
Complementa F
Decrementa F
Decrementa F, si es 0 salta
Incrementa F
Incrementa F, si es 0 salta
OR entre W y f
Mueve f
Mueve W a f
No opera
Rota f a la izquierda, a travs del acarreo
Rota f a la derecha, a travs del acarreo
Resta a f el registro W
Intercambia f
XOR de W con f
INSTRUCCIONES QUE MANIPULAN BITS

BCF
BSF
BTFSC
BTFSS

Borra bit de f
Pone a 1 el bit de f
Testea un bit de f y salta si vale 0
Testea un bit de f y salta si vale 1

INSTRUCCIONES DE CONTROL Y DE OPERANDOS INMEDIATOS


ADDLW
ANDLW
CALL
CLRWDT
GOTO
IORLW
MOVLW
RETFIE
RETLW
RETURN
SLEEP
SUBLW
XORLW

Suma inmediata a W
AND inmediato con W
Llamada a subrutina
Borra el Perro guardin
Salto incondicional
OR inmediato con W
Mueve a W un valor inmediato
Retorno desde interrupcin
Retorno y carga de W
Retorno de subrutina
Pasa a estado de reposo
Resta W de un inmediato
OR Exclusiva a W

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

11

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTROS
ESPECFICOS

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

12

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

Registros
REGISTRO DE ESTADO (STATUS)
Este es el registro ms usado de todos pues sus bits estn destinado a
controlar las funciones vitales del procesador. Por ese motivo est
duplicado en las cuartas posiciones de cada banco (03h, 83h, 103h, 183h)
IRP

RP1 RP0 TO# PD# Z DC

Los tres bits de menos peso son los sealizadores de ciertas condiciones
en las operaciones lgico-aritmticas:
- Z: Sealizador de cero. Se pone 1 cuando el resultado es 0.
- C: Acarreo-llevada del 8 bit. Se pone a uno automticamente
cuando existe acarreo en el bit de ms peso en las
instrucciones de suma. Tambin acta como sealizador de
llevada en las instrucciones de resta, pero en este caso la
correspondencia es inversa, si vale 0 es llevada.
- DC: Acarreo-llevada en el cuarto bit. Funciona igual que el
sealizador C, pero para el 4 bit. Es muy til para las
operaciones en BCD.
Los sealizadores PD# y TO#, son activos por nivel bajo (#) y sirven
para indicar la causa que ha provocado la reinicializacin del procesador.
- PD#: Se activa a 0 al ejecutarse la instruccin SLEEP. Se
pone a uno automticamente tras la conexin de alimentacin
o bien al ejecutarse la instruccin CLRWDT
- TO#: Se activa a nivel bajo al desbordarse el perro guardin.
Toma el valor 1 tras la conexin de alimentacin o al
ejecutarse las instrucciones CLRWDT o SLEEP.
Los PIC se resetean al conectar la alimentacin (POR Power on Reset).
Tambin se resetean cuando la tensin de alimentacin baja de 4V (BOR
Brown on Reset), aunque esta funcin es factible desactivarla poniendo
a 0 el bit BODEM, presente en la palabra de configuracin, tanto en el
Reset POR como en el BOR los bits PD# y TO# toman el valor 1,
mientras que en los dems casos dependen de la causa que ha provocado
el Reset.
Finalmente los tres bits de ms peso del registro de estado se emplean
para seleccionar el banco de la RAM al que se desea acceder
RP1 RP0 BANCO SELECCIONADO
0
0 Banco 0 (00h 7Fh)
0
1 Banco 1 (80h FFh)
1
0 Banco 2 (100h 17Fh)
1
1 Banco 3 (180h 1FFh)
El bit IRP se usa conectado con el bit de ms peso del registro FSR para
elegir el banco de RAM en el direccionamiento indirecto.
DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

13

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTRO DE OPCIONES (OPTION)


Tiene las mismas funciones que tena en el PIC 16F84:
1: Asigna el divisor de frecuencias al TIMER0 o al perro
guardin.
2: Elige el rango en el que trabaja el divisor de frecuencia.
3: Selecciona el tipo de reloj del TIMER0, que puede ser interno
o externo a travs de la pastilla TOCKI. Tambin selecciona el
flanco activo.
4: Selecciona el flanco activo para la interrupcin externa por
RB0/INT
5: Activa o desactiva las resistencias de pull-up de la Puerta B
El registro OPTION toma el valor b11111111 (FF) en cualquier
tipo de reinicializacin que se produzca.
RBPU#
PS2
0
0
0
0
1
1
1
1

INTEDG

PS1
0
0
1
1
0
0
1
1

PS0
0
1
0
1
0
1
0
1

TOCS

TOSE

Divisin del TMR0


1:2
1:4
1:8
1:16
1:32
1:64
1:128
1:256

PSA PS2 PS1 PS0


Divisin del WDT
1:1
1:2
1:4
1:8
1:16
1:32
1:64
1:128

PSA:

Asignacin de divisor de frecuencias.


1 = El divisor de frecuencias se le asigna al WDT.
0 = El divisor de frecuencias se le asigna al TIMER0.

TOSE:

Tipo de flanco en TOCKI.


1 = Incremento del TIMER0 cada flanco descendente.
0 = Incremento del TIMER0 cada flanco ascendente.

TOCS:

Tipo de reloj para el TIMER0


1 = Pulsos introducidos a travs del TOCKI (contador)
0 = Pulsos de reloj internos FOSC/4 (Temporizador)

INTEDG:
Flanco activo de la interrupcin externa.
1 = Flanco ascendente
0 = Flanco descendente
RBPU#:
Resistencias de pull-up de la Puerta B
1 = Desactivadas
0 = Activadas
DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

14

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTRO PARA CONTROLAR LAS INTERRUPCIONES


Los PIC 16F87X tienen muchas causas que pueden originar una
interrupcin, 13 posibles causas los de 28 patas y 14 los de 40. Al
aceptarse una interrupcin se salva el valor del PC en la Pila y se carga
aquel con el valor 0004h, que es el vector de interrupciones.
El PIC 16F84 tena 4 causas que generaban interrupcin: desbordamiento
del TMR0, activacin de la pata de interrupcin RB0/INT, cambio de
estado de una de las cuatro patas de ms peso de la Puerta B y
finalizacin de la escritura de un byte en la EEPROM. Los nuevos PIC,
adems de las causas que producen interrupcin en el 16F84, tienen las
siguientes:
1 Desbordamiento del Timer 1
2 Desbordamiento del Timer 2
3 Captura o comparacin del mdulo CCP1.
4 Captura o comparacin del mdulo CCP2.
5 Transferencia en la Puerta serie sncrona.
6 Colisin de bus en la Puerta serie sncrona.
7 Fin de transmisin en el USART.
8 Fin de recepcin en el USART.
9 Fin de la conversin en el conversor A/D
10 Transferencia en la puerta paralela esclava (solo en los de 40
patas)

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

15

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

1. REGISTRO DE CONTROL DE INTERRUPCIONES (INTCON)


Se trata de un registro leble y escribible, para facilitar su acceso
se ha duplicado en los cuatro bancos. Tiene la misin de controlar
las interrupciones provocadas por TMR0, cambio de estado en las
cuatro lneas de ms peso de la Puerta B y activacin en la patilla
RB0/INT. Es muy parecido al registro que con el mismo nombre
exist en el 16F84, solo cambia el bit 6 en los nuevos PIC que es
el PIE (permiso de interrupcin de lo perifricos) en lugar del
EEIE que tena de 16F84 para permitir la interrupcin cuando
finalice la escritura de un byte en la EEPROM. El bit PEIE acta
como una segunda llave parcial de permiso o prohibicin de las
causas de interrupcin que no est complementadas en INTCON
y que las provocan los restantes perifricos del microcontrolador.
GIE es el bit de permiso global de todas las interrupciones.
GIE PEIE TOIE INT RBIE TOIF INTF RBIF
GIE:

Bit de permiso global de interrupciones.


1 = Permitido
0 = Prohibido

PEIE:

Bit de permiso de los perifricos que no se


controlan con INTCON

TOIE:

Bit de permiso de interrupcin del TMR0.

INTE:

Bit de permiso de la interrupcin externa por


RB0/INT

RBIE:

Bit de permiso de la interrupcin por cambio en


RB4-RB7

TOIFF:

Sealizador de desbordamiento en TMR0.

INTF:

Sealizador de activacin de la patilla RB0/INT

RBIF:

Sealizador de cambio en RB4-RB7

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

16

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

2. REGISTRO DE PERMISO DE INTERRUPCIONES 1 (PIE1)


Contiene los bits que permiten o prohiben las interrupciones
provocadas por los perifricos internos del microcontrolador y
que no estaban contempladas en INTCON.
Ocupa la direccin 8Ch y para que cumplan su funcin, los bits de
PIE1, es necesario que el PIE sea igual a 1 en INTCON, 6. El bit
PSPIE solo es vlido solo es vlido en los modelos de 40 patas,
mantenindose a 0 en los de 28 patas.
PSPIE ADIE RCIE TXIE SPIE CCP1IE TMR2IE

TMR1IE

PSPIE: Permiso de interrupcin para la puerta paralela esclava al


realizar una operacin de lectura/escritura. En modelos de 40 patas.
ADIE:

Permiso de interrupcin para el conversor A/D al finalizar


la conversin.

RCIE:

Permiso de la interrupcin para el receptor de USART


cuando el buffer se llena.

TXIE:

Permiso de la interrupcin para el transmisor de USART


cuando el buffer se vaca.

SSPIE:

Permiso de interrupcin para la puerta serie sncrona.

CCP1IE:

Permiso de interrupcin para el mdulo CCP1 cuando se


produce una captura o comparacin.

TMR2IE: Permiso de interrupcin para el TMR2 con su


desbordamiento.
TMR1IE: permiso de interrupcin para el TMR1 con su
desbordamiento.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

17

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

3. REGISTRO DE PERMISO DE INTERRUPCIONES 2 (PIE2)


Contiene los bits de permiso de interrupcin de las tres causas que
no figuraban en el PIE1. La de fin de escritura de la EEPROM,
colisin de bus en el modo de SSP y produccin de una captura o
comparacin en el mdulo CCP2. El bit 6 es un bit reservado y su
valor es siempre 0. Cuando se leen los bit que no tienen asignada
funcin, se obtiene 0.
-

EEIE BCLIE

CCP2IE

EEIE:

Permiso de interrupcin por fin de escritura en la


EEPROM de datos.

BCLIE:

Permiso de interrupcin por colisin de bus en el SSP


cuando dos o ms maestros tratan de transferir al mismo
tiempo.

CCP2IE:

Permiso de interrupcin el mdulo CCP2.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

18

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTRO DE LOS SEALIZADORES DE INTERRUPCION 1 Y 2


(PIR1 y PIR2)
En correspondencia con los bits de permiso/prohibicin de las causas de
interrupcin recogidas en el registro PIE1 y PIE2, existen otros dos registros,
el PIR1 y PIR2, cuyos bits actan de sealizadores del momento en el que se
origina la causa que provoca la interrupcin, independientemente de si est
permitida o prohibida. Ocupan las direcciones 0Ch y 0Dh.
REGISTRO PIR1
PSPIF ADIF RCIF TXIF SSPIF CCPIF TMR2IF

TMR1IF

REGISTRO PIR2
-

EEIF BCLIF

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

CCP2IF

19

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

DISTRIBUCION MEMORIA RAM

INDF
TMR0
PCL
STATUS
FSR

100h
101h
102h
103h
104h
105h
106h
107h
108h
109h
10Ah
10Bh
10Ch
10Dh

INDF
OPTION_REG
PCL
STATUS
FSR

10Eh
10Fh
110h

Reservado
Reservado

INDF
TMR0
PCL
STATUS
FSR
PORTA
PORTB
PORTC
PORTD
PORTE
PCLATH
INTCON
PIR1
PIR2

00h
01h
02h
03h
04h
05h
06h
07h
08h
09h
0Ah
0Bh
0Ch
0Dh

INDF
OPTION_REG
PCL
STATUS
FSR
TRISA
TRISB
TRISC
TRISD
TRISE
PCLATH
INTCON
PIE1
PIE2

80h
81h
82h
83h
84h
85h
86h
87h
88h
89h
8Ah
8Bh
8Ch
8Dh

TMR1L
TMR1H
T1CON

0Eh
0Fh
10h

PCON

8Eh
8Fh
90h

TMR2
T2CON
SSPBUF
SSPCON
CCPR1L
CCPR1H
CCP1CON
RCSTA
TXREG
RCREG
CCPR2L
CCPR2H
CCP2CON
ADRESH

11h
12h
13h
14h
15h
16h
17h
18h
19h
1Ah
1Bh
1Ch
1Dh
1Eh

SSPCON2
PR2
SSPADD
SSPSTAT

ADRESL

91h
92h
93h
94h
95h
96h
97h
98h
99h
9Ah
9Bh
9Ch
9Dh
9Eh

ADCON0

1Fh

ADCON1

9Fh

11Fh

19Fh

A0h

120h

1A0h

TXSTA
SPBRG

20h

Registros
Propsito
General
96 Bytes

Registros
Propsito
General
80 Bytes
accesses
70h-7Fh
7Fh

Banco 0

EFh
F0h

PORTB

PCLATH
INTCON
EEDATA
EEADR
EEDATH
EEADRH

Propsito
General
16 Bytes

Registros
Propsito
General
80 Bytes
accesses
70h-7Fh

FFh
Banco 1

111h
112h
113h
114h
115h
116h
117h
118h
119h
11Ah
11Bh
11Ch
11Dh
11Eh

16Fh
170h

TRISB

PCLATH
INTCON
EECON1
EECON2

Propsito
General
16 Bytes

Registros
Propsito
General
80 Bytes
accesses
70h - 7Fh

17Fh
Banco 2

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

180h
181h
182h
183h
184h
185h
186h
187h
188h
189h
18Ah
18Bh
18Ch
18Dh
18Eh
18Fh
190h
191h
192h
193h
194h
195h
196h
197h
198h
199h
19Ah
19Bh
19Ch
19Dh
19Eh

1EFh
1F0h
1FFh

Banco 3

20

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

LECTURA Y ESCRITURA
EEPROM Y FLASH

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

21

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

LECTURA Y ESCRITURA DE LAS MEMORIAS EEPROM Y FLASH


En el PIC 16F84 se poda leer y escribir la memoria de datos
EEPROM. En los PIC 16F87X tambin se puede leer y escribir la memoria de
cdigo FLASH. Esto significa que un programa dinmicamente puede generar
informacin que se puede grabar en la FLASH directamente sin necesidad de
grabador externo.
Para manejar la memoria EEPROM de 64 bytes del PIC 16F84,
bastaban 2 registros, para proporcionar la direccin de la memoria a consultar y
para grabar el dato de 8 bits, sin embargo, en los PIC 16F87X, no basta con un
solo registro para proporcionar la direccin de memoria, ya que esta alcanza los
13 bits, y lo mismo sucede con el dato, que a su vez alcanza los 14bits. Para
cubrir esta necesidad el registro EEADR se concatena con el EEADRH, que
contiene los 5 bits de ms peso de la direccin. Por otra parte, el registro
EEDATAH se concatena con EEDATA y tiene los 6 bits de ms peso de la
palabra leda o a escribir en la FLASH.
Para controlar la operacin lectura/escritura de las memorias
EEPROM y FLASH hay dos registros denominados EECON1 Y EECON2. El
EECON2, no esta implementado fsicamente y slo se utiliza en la delicada
operacin de escritura, que tiene la elevada duracin de 2 milisegundos. Antes
de iniciar la escritura de una palabra se escribe en EECON2 primero el dato 55h
y luego el Aah.
Para evitar escrituras indeseadas en la EEPROM, se controla el bit
WREN, prohibiendo cualquier operacin de escritura mientras duran los 72
milisegundos que temporiza el Timer de Power-Up. Para realizar la misma
proteccin en la memoria FLASH, se debe poner a 0 el bit WRT de la Palabra de
Configuracin, que solo puede escribirse desde un grabador externo.
Dependiendo del valor y los bits de proteccin de cdigo CP1 y CP0,
ubicados en la palabra de configuracin, se consiguen varias alternativas de
proteccin contra lectura y escritura de la FLASH. A continuacin:
CONFIGURACION DE
BIT

CP1
0
0
0
0
0
1
1
1
1
1
1

CP2
0
1
1
1
1
0
0
0
0
1
1

WRT
X
0
0
1
1
0
0
1
1
0
1

POSICIONES DE
FLASH
Memoria de prog.
reas no protegidas
reas protegidas
reas no protegidas
reas protegidas
reas no protegidas
reas protegidas
reas no protegidas
reas protegidas
Memoria de prog.
Memoria de prog.

LECTURA ESCRIT. LECTURA ESCRIT.


INTERNA INTERNA
ICSP
ICSP
S
S
S
S
S
S
S
S
S
S
S

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

No
No
No
S
No
No
No
S
No
No
S

No
S
No
S
No
S
No
S
No
S
S

No
No
No
No
No
No
No
No
No
S
S

22

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PUERTAS E/S

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

23

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

Puertas de E/S
Los microcontroladores PIC 16F87X encapsulados con 28 patas, disponen de 3
puertas de E/S (A,B,C) mientras que los de 40 patas, alcanzan 5 (A,B,C,D,E).
1. PUERTA A
Solo dispone de 6 lneas (RA0-RA5), son bidireccionales y se configuran
a travs del registro TRISA, situado en el Banco 1. En cada bit del registro
TRISA de la Puerta se configura la correspondiente lnea. Si el bit es 0, la
lnea est configura como salida, a su vez, si se pone a 1, la lnea se
configura como entrada.
El registro PORTA, es el de la Puerta A, que recoge el estado de cada
lnea de la Puerta, independientemente de cmo estn configuradas.
Las lneas R0/AN0, R1/AN1 y R2/AN2, adems de lneas de E/S
digitales, tambin pueden actuar como los canales 0, 1 y 2 por los que se
puede aplicar una seal analgica al conversor A/D. La pata
RA3/AN3/Vref+, tambin puede actuar como entrada de Tensin de
Referencia para los perifricos que la precisan. La pata RA4/TOCKI acta
adems de E/S digital, como entrada de seal de reloj para el Timer 0. La
pata RA5/AN5/SS# tiene multiplexadas tres funciones: E/S digital, canal 4
para el conversor A/D y seleccin del modo esclavo cuando se trabaja con
la comunicacin serie sncrona.
Para seleccionar si las lneas de la Puerta A van a trabajar como E/S
digitales o como canales de entrada para el conversor A/D, hay que
escribir el valor adecuado sobre el registro ADCON1. Si se carga en dicho
registro el valor 011x en sus 4 bits de menos peso, todas las lneas de
puertas funcionan como E/S digitales.

DIRECCION

NOMBRE

BIT 7

BIT 6

BIT 5

BIT 4

05h
85h
9Fh

PORTA
TRISA
ADCON1

ADFM

RA5

RA4
RA3
RA2
RA1
RA0
Registro de configuracin de la Puerta A
PCFG3 PCFG2 PCFG1 PCFG0

x
u
-

BIT 3

BIT 2

BIT 1

BIT 0

VALOR
EN POR
BOR
-0x 000
-11 1111
-0- 0000

significa desconocido
significa que no cambia
significa que no est implementado y se lee como 0

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

24

VALOR EN
EL RESTO
DE RESETS
-0u 000
-11 1111
-0- 0000

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

2. PUERTA B
Dispone de 8 lneas bidireccionales cuya funcin se elige mediante la
programacin del TRISB. Todas las patas de la puerta B disponen de una
resistencia interna de pull-up al positivo de la alimentacin. Esta va
conectada cuando el bit RBPU# (es bit 7 del registro OPTION), tiene valor
0. La resistencia de pull-up se conecta automticamente siempre que la
lnea est configurada como salida. Cuando se produce un Reset por
conexin de la alimentacin (POR) se desconectan todas las resistencias de
pull-up.
Las lneas RB<7-4> pueden programarse para generar una interrupcin
cuando una de ellas cambia de estado. Se deben configurar como entradas
y el valor que se introduce por ellas se compara con el anterior para si no
coinciden generar una interrupcin, siempre que lo autorice el bit de
permiso situado en el INTCON.
La pata RB0/INT tambin puede programarse como peticin de
interrupcin externa, el bit de permiso tambin est ubicado en el
INTCON.

DIRECCION

NOMBRE

BIT 7

BIT 6

06h
86h
81h

PORTB
TRISB
OPTION

RB7

RB6

x
u
-

BIT 5

BIT 4

BIT 3

BIT 2

BIT 1

BIT 0

RB5
RB4
RB3
RB2
RB1
Registro de configuracin de la Puerta B
RBPU# INTEDG TOCS TOSE
PSA
PS2
PS1

RB0
PS0

VALOR
VALOR EN
EN POR EL RESTO
BOR
DE RESETS
xxxx xxxx uuuu uuuu
1111 1111 1111 1111
1111 1111 1111 1111

significa desconocido
significa que no cambia
significa que no est implementado y se lee como 0

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

25

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

3. PUERTA C
Consta de 8 lneas bidireccionales cuyo sentido se configura mediante el
registro TRISC. Todas las patas de esta puerta tienen multiplexadas
diferentes funciones:
-

RC0/T1OSO/T1CKI: Esta lnea puede actuar como E/S digital,


como salida del Timer 1 o como entrada de impulsos para el
Timer 1.
RC1/T1OSI/CCP2: E/S digital, entrada al oscilador del Timer 1,
entrada del modulo de Captura 2, Salida del comparador 2,
salida del PWM2.
RC2/CCP1: E/S digital, entrada Captura 1, Salida de comparador
uno, salida del PWM1.
RC3/SCK/SCL: E/S digital, Seal de reloj modo SPI, Seal de
reloj modo I2C.
RC4/SDI/SDA: E/S digital, Seal de datos modo SPI, Seal de
datos modo I2C.
RC5/SDO: E/S digital, Salida de datos en modo SPI.
RC6/TX/CK: E/S digital, Lnea de transmisin en USART, Seal
de reloj sncrona en transmisin serie.
RC7/RX/DT: E/S digital, Lnea de recepcin USART, Lnea de
datos en transmisin serie sncrona.

4. PUERTA D
Consta de 8 lneas bidireccionales. Solo la tienen los PIC encapsulados
con 40 patas (16F877). Se configura mediante el registro TRISD. Todas
las patas disponen en su entrada de un Trigger Schmitt.
Adems de usarse como lneas de E/S digitales normales, implementan
una puerta paralela esclava de 8 lneas (PSP), que sirve para permitir la
comunicacin en paralelo con otros elementos del sistema.
Las patas se denominan RD0/PSP0-RD7/PSP7, y para que funcionen
como puerto de comunicacin esclava en paralelo, es preciso poner el bit
PSP MODE=1.
5. PUERTA E
Solo la tienen los PIC de 40 patas. Dispone de tres patas multifuncin,
que se configuran como entrada o salida, segn el valor de los tres bits de
menos peso del registro TRISE
-

RE0/RD#/AN5: E/S digital, Seal de lectura en modo puerta


paralela esclava, Canal 5 de conversor A/D.
RE1/WR#/AN6: E/S digital, Seal de escritura en modo PSP,
Canal 6 de conversor A/D.
- RE2/CS#/AN7: E/S digital, Seleccin de chip en modo PSP,
Canal 7 de conversor A/D.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

26

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

RECURSOS
ESPECIALES

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

27

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

Recursos especiales
PALABRA DE CONFIGURACIN
Es una posicin reservada de la memoria de programa FLASH que ocupa la
direccin 2007h y que solo es accesible durante la programacin del PIC
CP1

CP0 DEBUG

CP1:CP0

CP1
0
0
0
0
1
1
1

WRT

CPD

LVP

BODEN CP1 CP0

PWRTE#

WDTE

FOSC1

FOSC0

Cdigo de proteccin de la memoria del programa. Estn repetidos en los bits 13:12 y
5:4. Si los bits de cdigo de proteccin no se programan, las protecciones de la memoria
de cdigo pueden ser ledas para verificacin
CP0
0
0
1
1
0
0
1

Proteccin desde...
...hasta
Modelo PIC
0000h
0FFFh
16F873/4
0000h
1FFFh
16F876/7
0800h
0FFFh
16F873/4
1000h
1FFFh
16F876/7
0F00h
0FFFh
16F873/4
1F00h
1FFFh
16F876/7
No hay cdigo protegido en la memoria FLASH

DEBUG

Modo Depurador en Circuito


1 = Desactivado. RB7:RB6 actan como lneas de E/S.
0 = Activado. RB7:RB6 actan en modo depurado. La depuracin se puede hacer desde
el MPLAB.

WRT

Permiso de escritura en la memoria FLASH


1 = Se puede escribir en la parte no protegida de la FLASH
0 = Prohibicin de escritura

CPD

Cdigo de Proteccin de la Memoria EEPROM de Datos


1 = No hay proteccin en la EEPROM
0 = Proteccin del cdigo en la EEPROM

LVP

Bit de Permiso para Programacin de Bajo Voltaje


1 = RB3/PGM tiene permitida la grabacin en bajo voltaje
0 = RB3/PGM funciona como E/S digital. La programacin se realiza en alto voltaje.

BODEN

Bit de Permiso para el Reset por Cada de Tensin


1 = BOR activada
0 = BOR desactivada

PWRTE#

Bit de permiso para el Timer de Conexin de Alimentacin


1 = PWRT desactivado
0 = PWRT activado

WDTE

Bit de Permiso del Timer de perro guardin


1 = WDT activado
0 = WDT desactivado

FOSC1:0

Tipo de oscilador

FOSC1
0
0
1
1

FOSC0
0
1
0
1

Tipo
LP (Baja Potencia. De 35 a 200 kHz)
XT (Estndar. De 100 kHz a 4 MHz)
HS (Alta velocidad. Ms de 4 MHz)
RC (Resistencia-Condensador)

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

28

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PALABRA DE IDENTIFICACIN
Se trata de cuatro palabras de la memoria de programa que se hallan
comprendidas entre la direccin 2000h y la 2003h y estn reservadas para que
el usuario las pueda emplear en funciones de comprobaciones o checksums,
cdigos de identificacin, nmeros de serie, fecha, modelo, lote, nmeros
secuenciales o aleatorios, etc. Estas cuatro posiciones solo son accesibles en la
lectura y escritura durante la operacin de programacin/ verificacin. Solo se
deben emplear los cuatro bits de menos peso de las palabras de identificacin.
REINICIALIZACIN O RESET
Los PIC 16F87X disponen de diversa maneras de reinicializarse.
1 Reset por conexin de alimentacin. (POR: Power on Reset) El valor de
tensin de alimentacin Vdd sube entre 1,2 a 1,7 V.
2 Activacin de la pata MCLR#. (nivel bajo en dicha pata durante una
operacin normal)
3 Activacin de la pata MCLR# estando el PIC en reposo (SLEEP)
4 Reset provocado por desbordamiento del Perro Guardin en una
operacin normal.
5 Reset provocado por el desbordamiento del Perro Guardia durante el
estado de reposo (SLEEP)
6 Reset provocado por una cada de voltaje (BOR: Brown out Reset) Vdd
baja entre 3,8 y 4,2 V.
Los bits TO# y PD# del registro de Estado toman un valor determinado en
cada tipo de reset. Tambin los bits 0 y 1 del registro PCON, llamados BOR#
y POR# respectivamente, sirven para especificar las causas de un reset.
POR#
0
0
0
1
1
1
1
1

BOR#
x
x
x
0
1
1
1
1

TO#
1
0
x
1
0
0
u
1

PD#
1
x
0
1
1
0
u
0

TIPO DE RESET
Conexin de alimentacin POR
Ilegal
Ilegal
Por cada de tensin BOR
Por WDT (operacin normal)
Por WDT (modo SLEEP)
Activacin normal MCLR#
MCLR# en SLEEP o interrupcin para despertar de SLEEP

Tras un Reset, el contador de programa queda cargado con el valor 000h en


todos los casos, menos cuando se produce el desbordamiento del WDT o
cuando se despierta del modo SLEEP por una interrupcin, en cuyos casos,
PC se carga con el valor PC+1.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

29

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PERRO GUARDIAN (WDT: WATCHDOG TIMER)


El WDT de los PIC16F87X es similar al del 16F84. Se trata de un
contador que funciona con los impulsos de su propio oscilador y que
provoca un Reset cuando se desborda en funcionamiento normal. Si el
desbordamiento se produce cuando el microcontrolador se halla en estado
de Reposo, se despierta y sigue su comportamiento normal.
Las instrucciones CLRWDT y SLEEP borran o ponen a cero el valor del
WDT y el del Postdivisor. Si se ejecuta la instruccin CLRWDT y el
Predivisor de Frecuencia est asignado al perro guardin, se borra, pero no
cambia su configuracin.
MODO DE REPOSO O BAJO CONSUMO
Este funcionamiento se ejecuta con la instruccin SLEEP, igual que con
el 16F84. Esta manera de trabajo se caracteriza por su bajo consumo, las
lneas de E/S que se utilizaban mantienen su estado, las que no se
empleaban reducen al mnimo su consumo, se detienen los temporizadores y
tampoco opera el conversor A/D.
Al entrar en modo de reposo, si estaba funcionando, el WDT se borra,
pero sigue trabajando. Existen varias formas de despertar del modo SLEEP,
y seguir ejecutando la instruccin PC+1:
1- Activacin externa de la pata MCLR#.
2- Desbordamiento del WDT, que sigue trabajando en reposo.
3- Generacin de interrupcin por activacin de la pata RB0/INT, o por
cambio de estado en las cuatro patas de menos peso de la Puerta B.
4- Interrupcin originada por alguno de los nuevos perifricos de los
PIC 16F87X tales como:
a) Lectura o escritura en la puerta paralela PSP.
b) Interrupcin del Timer 1.
c) Interrupcin del mdulo CCP en modo captura.
d) Disparo especial de Timer 1 funcionando en modo asncrono
con reloj externo.
e) Interrupcin en el mdulo de comunicacin SSP (Start/Stop).
f) Transmisin o recepcin del MSSP modo esclavo (SPI/I2C).
g) Transmisin o recepcin del USART.
h) Fin de la conversin en el conversor A/D.
i) Fin de operacin.
j) Fin de escritura sobre EEPROM.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

30

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMACIN DE LOS PIC 16F87X


La posibilidad de programar a esta subfamilia de PIC en serie, permite
grabar en la memoria de cdigo el programa de trabajo, estando colocado el
Pic sobre el circuito o producto de aplicacin final. Esta caracterstica
permite a los fabricantes construir y montar completamente la tarjeta de
circuito impreso y dejar pendiente la grabacin del programa.
La programacin en serie tpica, que se realiza con un Voltaje Alto de 12
a 14 V aplicado por la pata MCLR#/Vpp requiere el uso de 5 patas del PIC:
a)
b)
c)
d)
e)

VDD = 5V
GND o Tierra
Vpp = 12 a 14 V que se introducen por la pata MCLR#/Vpp
RB6 : Recibe los impulsos de reloj.
RB7 : Lnea de datos con los bits en serie.

Una gran aportacin esta gama de PIC es la programacin con Voltaje


Bajo (LVP : Low Voltage Programming), que no requiere la tensin de 12 a
14V. Para grabar en este modo hay que poner el bit LVP = 1, que reside en
la Palabra de Configuracin y la pata RB3/PGM se debe conectar a nivel
alto. Entonces por la pata MCLR#/Vpp se aplica la tensin VDD de 5V
mientras dura la operacin de grabado. Cuando no se opera en este modo de
programacin se puede usar la pata RB3 como una lnea de E/S digital.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

31

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

TEMPORIZADORES

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

32

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

TIPOS Y CARACTERSTICAS GENERALES


En la familia de los PIC 16F87X, disponen de tres temporizadores. El
TMR0, el TMR1 y el TMR2.
En TMR0 es idntico al del 16F84, sus funciones ms representativas son:
1 TMR0 es un Contador/Temporizador de 8 bits.
2 Leble y escribible.
3 Reloj interno o externo.
4 Seleccin de flanco en el reloj externo.
5 Predivisor de la frecuencia del reloj programable.
6 Generacin de interrupcin opcional en el desbordamiento.
El TMR1 se caracteriza por:
1 TMR1 es un Contador/Temporizador de 16 bits.
2 Leble y escribible.
3 Seleccin de reloj interno o externo.
4 Interrupcin opcional por desbordamiento de FFFFh a 0000h.
5 Posible reinicializacin desde los mdulos CCP.
El TMR2 tiene las siguientes caractersticas fundamentales:
1 TMR2 es un Temporizador de 8 bits.
2 Dispone de un Registro de Perodo de 8 bits (PR2)
3 Leble y escribible.
4 Predivisor de Frecuencia programable.
5 Postdivisor de frecuencia programable.
6 Interrupcin opcional al coincidir TMR2 y PR2.
7 Posibilidad de generar impulsos al modo SSP.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

33

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

ESTRUCTURA INTERNA Y FUNCIONAMIENTO DEL TMR1


El TMR1 es el nico Temporizador/Contador ascendente con un tamao de
16bits, lo que requiere el uso de 2 registros concatenados de 8 bits: TMR1h :
TMR1L, que son los encargados de guardar el valor del montaje en cada
momento, cuando el valor llega hasta FFFFh se activa el sealizador TMR1IF y se
regresa al valor inicial 0000h. Tambin si se desea se puede provocar una peticin
de interrupcin.
El valor contenido en TMR1H: TMR1L puede ser ledo o escrito y los impulsos
que originan el contaje pueden provenir del exterior o de la frecuencia de
funcionamiento del microcontrolador:
El TMR1 es capaz de funcionar de 3 formas:
1 Como temporizador
2 Como contador sncrono
3 Como contador asncrono

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

34

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTRO DE CONTROL DEL TMR1 (T1CON)


-

T1CKPS1 T1CKPS0 T1OSCEN T1SYNC#

TMR1CS TMR1ON

El funcionamiento del TMR1 esta gobernado por el valor con el que se


programan los bits del registro T1CON que ocupa la direccin 10h de la memoria
RAM.
El bit TMR1ON gobierna el permiso o la prohibicin de funcionamiento del
TMR1. Este bit es activo a nivel alto.
El bit TMR1C selecciona la fuente de los impulsos de contage. Si vale 0 elige el reloj
interno y si vale 1 elige el reloj externo que se aplica por las patas RC0 y RC1.
Cuando los impulsos dependen de un reloj externo es preciso que el bit T1OSCEN
tenga el valor 1, en cuyo caso las patas RC0 y RC1 actan como entradas del
Oscilador externo. Si T1OSCEN vale = 0 los impulsos vendrn a travs de RC0.En
ambos casos, el TIMER1 funciona como contados de elementos externos.
El predivisor de frecuencia (preescaler) es un simple divisor de la frecuencia de los
impulsos que se aplican al TMR1 por 1, 2, 4 u 8. El rango de divisin lo eligen los
bits T1CKPS1 y T1CKS0:
T2CKPS1 T2CKPS0
0
0
0
1
1
0
1
1

RANGO DEL PREDIVISOR


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

El bit T1SYNC# determina la posible sincronizacin o no de los impulsos del


reloj externo con los del reloj interno, segn valga 0 o 1 respectivamente.
El TMR1 Puede generar una peticin de interrupcin cuando se produce el
sobrepasamiento del contaje. En esta situacin se pone automticamente a 1 el flag
TMR1F, que es el bit 0 del registro especifico PIR1. El permiso de la prohibicin de
interrupcin del TMR1 est controlada por el bit TMR1IE del PIE1.
Cuando el modulo de CCP est configurado como comparador para generar un
disparo especial, dicha seal resetea el TMR1. Para aprovechar esta caracterstica el
TMR1 debe estar configurado en modo temporizador o contador sncrono. En otro caso
no se produce el Reset.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

35

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

FUNCIONAMIENTO Y PROGRAMACION DEL TMR2


Se trata de un temporizador ascendente de 8 bits, que leer y escribir, y que
tambin puede realizar funciones especiales para la puerta serie sncrona
(SPP) y para los mdulos de captura y comparacin (CCP)
La seal de TMR2 es interna con valor de Fosc/4, y antes de ser aplicada
pasa por un predivisor de frecuencia con rangos de 1:1, 1:4, 1:16. La salida pasa por un
postdivisor con rangos de 1:1 a 1:16.
Al entrar el microcontrolador en SLEEP, el TMR2 deja de funcionar porque no
existe Fosc al pararse el oscilador.
Para controlar el funcionamiento de TMR2 se utiliza el registro T2CON.
-

TOUTPS3

TOUTPS2

TOUTPS1

TOUTPS0

TMR2ON

T2SCKPSI

T2SCKPSO

Los bits 1 y 0 del T2CON sirven para seleccionar el rango de divisin del predivisor de
impulsos de la siguiente forma:
T2CKPS1 T2CKPS0
0
0
0
1
1
x

RANGO DEL PREDIVISOR


1:1
1:4
1:16

El bit TMR2CON sirve para permitir o prohibir el funcionamiento del TMR2. El


bit de ms peso no es significativo y los cuatro bits restantes determinan el rango por el
que divide la frecuencia el postdivisor:
TOUTPS3-TOUTPS0
0000
0001
0010
....
1111

RANGO DEL POSTDIVISOR


1:1
1:2
1:3
....
1:16

El sealizador de desbordamiento del TMR2 es el bit 1 del registro PIR1. El


predivisor y el postdivisor se ponen a 0 al escribir el T2CON o con un Reset. Sin
embargo, al escribir en T2CON no se borra el TMR2, pasa a valer 0 al hacer un Reset.
El TMR2 tiene asociado un registro de periodo PR2. Cuando el valor del contaje del
TMR2 coincide con el valor cargado en PR2 se genera un impulso en la salida EQ y se
resetea el TMR2.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

36

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

CAPTURA, COMPARACIN
Y MODULACIN DE
ANCHURA DE PULSOS

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

37

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

INTRODUCCIN A LOS MDULOS CCP


Los microcontroladores PIC 16F87X disponen de dos mdulos CCP,
llamados CCP1 y CCP2, que solo se diferencian en el Disparo Especial.
Realizan tres funciones especiales:
1 Modo captura: una pareja de registros de un mdulo CCPx captura el
valor que tiene el TMR1 cuando ocurre un evento especial en la pata
RC2/CCP1 o en la RC1/T1OSCI/CCP2.
2 Modo comparacin: se compara el valor de 16 bits del TMR1 con otro
valor cargado en una pareja de registros de un mdulo CCPx y cuando
coinciden se produce un evento en la pata RC2/CCP1 o en la
RC1/T1OSCI/CCP2.
3 Modo modulacin de anchura de pulsos (PWM): dentro del intervalo
del periodo de un impulso controla la seal en que la salida vale nivel
alto.
El mdulo CCP1 utiliza un registro de trabajo de 16 bits, que est
formado con la concatenacin de los registros CCPR1H, CCPR1L. El registro de
control del mdulo CCP1 es el CCP1CON. El modulo CCP2 tiene como registros de
trabajo a CCPR2H-CCPR2L y como registro de control a CCP2CON. Las parejas de
registros son las encargadas de capturar el valor del TMR1, de comparar el valor que
tiene con el TMR1 o, en el PWM, de modular la anchura del impulso.
REGISTRO CCPxCON (x puede ser 1 0 2)
-

CCPxX

CCPxY

CCPxM3

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

CCPxM2

CCPxM1

CCPxM0

38

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

MODO CAPTURA
La pareja CCPxH-L del mdulo CCPx captura el valor de 16 bits que contiene el
Timer1 cuando sucede un evento en la pata RC/CCPx de la Puerta C, que previamente
ha sido configurada como entrada poniendo a 1 el bit del registro TRISC.
Los eventos que pueden ocurrir sobre la pata 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 4 bits CCP1M3-0 del registro CCP1CON seleccionan el evento adecuado en


el mdulo CCP1 y o a su vez en el CCP2.
Al efectuar la captura se activa el sealizador CCP1IF en el registro PIR1.
Adems, si se pone a 1 el permiso de interrupcin PIE1 <CCP1IE>, se genera una
peticin de interrupcin cuando se carga CCPR1H-L el valor del Timer1.
Cuando se emplea el mdulo CCP1 en modo Captura, el Timer1 debe estar
configurado para trabajar como temporizador o como contador sncrono. Nunca en
modo asncrono.
Si se fueran a cambiar las configuraciones del modulo de captura, convendra
detener o desactiva este antes para as evitar que se produzcan falsas interrupciones
durante la operacin.
Cuando se desactiva el mdulo CCP o deja de funcionar en modo captura se
borra la codificacin del predivisor de frecuencia que determinan los bits CCP1M3-0.
Una aplicacin muy interesante del modo captura puede ser la medicin de los
intervalos de tiempo que existen entre los impulsos que llegan a la pata RC2/CCP1, que
se halla configurada como entrada. El TMR1 debe trabajar como entrada de reloj
externo sincronizada.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

39

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

MODO COMPARACIN
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,
la Pata Rc2/CCP1, que se halla configurada como salida, le acontece uno de los
siguientes eventos de acuerdo con la programacin del los bits CCP1M3-0:

1 Pasa a nivel alto


2 Pasa a nivel bajo
3 No cambia su estado pero se produce una interrupcin.

Al coincidir los valores TMR1 con la pareja de registros CCPR1H-L se pone a 1


el sealizador CCP1IF.
El TMR1 debe trabajar en modo temporizador o contador sncrono, nunca en
modo asncrono.
Si el bit de permiso de interrupcin est a 1, cuando coinciden los valores
mencionados, se origina una peticin de interrupcin.
Si con los bits CCP1M3-0 se selecciona el modo de trabajado de Disparo
especial, el mdulo CCP1 pone a 0 el TMR1 y el CCPR1 funciona como un registro de
periodo capaz de provocar peridicamente interrupciones. En ese modo de disparo
especial, el CCP2 se pone a 0 y el TMR1 y, adems, inicia una conversin en el
conversor A/D, con lo que tambin y con carcter peridico, pueden realizarse
conversiones A/D sin el control del programa de instrucciones.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

40

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

MODO DE MODULACIN DE ANCHURA DE PULSOS (PWM)


Con este modo de trabajo, se consiguen impulsos lgicos cuya anchura del nivel
alto es de duracin variable, que son de enorme aplicacin en el control de dispositivos
tan populares como los motores y los triacs.
La pata RC2/CCP1 est configurada como salida y bascula entre los niveles lgicos 0 y
1 a intervalos variables de tiempo. Lo que se intenta es obtener un pulso cuyo nivel alto
tenga una anchura variable dentro del intervalo del periodo de trabajo.
Cuando se trabaja con una precisin 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 ms peso del
TMR2 se concatenan con los 2 bits de menos peso del reloj interno.
El tiempo que dura el perodo de la onda depende del valor cargado en PR2,
segn la frmula siguiente:
Perodo = [(PR2) + 1] 4 Tos Valor Predivisor TMR2
Cuando el valor del TMR2 coincide con el del PR2 suceden 3 acontecimientos:
1 Se borra el TMR2
2 La pata RC2/CCP1, se pone a 1.
3 El valor de CCPR1L, se carga en CCPR1H
El tiempo que la pata de salida est a nivel alto, que es la anchura del impuso,
depende del contenido cargado en CCP1R y de los 2 bits del CCP1CON <5:4>, cuando
se trabaja con una precisin de 10 bits.
Anchura de impulsos = (CCPR1L:CCP1CON<5:4>) Tosc Valor Predivisor TMR2
El valor CCPR1:CCP1CON<5:4> puede cargarse en cualquier momento, puesto
que el mismo no se traspasa a CCPR1H y se compara hasta que coinciden PR2 con
TMR2. En el modo PWM el registro CCPR1L solo puede ser ledo.
Los pasos a seguir para realizar la configuracin 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 CCP1R y CCP1CON<5:4>
3 Configurar la lnea RC2/CCP1 como salida.
4 Asignar el valor del predivisor y activar el TMR2 escribiendo el T2CON.
5 Configurar el Mdulo CCP1 en modo PWM

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

41

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

EL CONVERSOR
A/D

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

42

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PRESENTACIN DEL CONVERSOR ANALGICO / DIGITAL


Los microcontroladores PIC 16F87x poseen un conversor A/D de 10 bits
de resolucin y 5 canales de entrada en los modelos con 28 patas y 8 canales
para los de 40 patas.
La resolucin que tiene cada bit procedente de la conversin tiene un
valor que es funcin de la tensin de referencia de acuerdo con la siguiente
frmula:
Resolucin = (Vref+ - Vref-) / 1.024 = Vref / 1.024
Por ejemplo, si Vref+ es 5V y Vref- es 0V, la resolucin ser de 4,8 mV
por bit. La tensin de referencia determina los lmites mximo y mnimo de la
tensin analgica que se puede convertir. El voltaje diferencial mnimo es de 2V
A travs del canal de entrada seleccionado, se aplica la seal analgica a
un condensador de captura y mantenimiento y luego se introduce al conversor, el
cual proporciona un resultado digital de 10 bits de longitud usando la tcnica de
aproximaciones sucesivas.
El conversor A/D es el nico dispositivo que puede funcionar en reposo,
para ello el reloj del conversor deber conectarse al oscilador RC interno.
REGISTROS DE TRABAJO
El funcionamiento del conversor A/D requiere la manipulacin de 4
registros:
1 ADRESH: Parte alta del resultado de la conversin.
2 ADRESL: Parte baja del resultado de la conversin.
3 ADCON0: Registro de control 0.
4 ADCON1: Registro de control 1.
En la pareja ADRESH:ADRESL, se deposita el resultado de la
conversin, que al estar compuesta por 10 bits, solo son significativos 10 de los
bits de dicha pareja.
El registro ADCON0 controla la operacin del C A/D, mientras el
ADCON1 sirve para configurar las patas de la Puerta como entradas analgica o
E/S digitales.
REGISTRO ADCON0
ADCS1

ADCS0

CHS2

CHS1

CHS0

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

GO/DONE#

ADON

43

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

REGISTRO ADCON1
ADFM

PCFG3

PCFG2

PCFG1

PCFG0

Los bits ACON<7:6> sirven para seleccionar la frecuencia reloj que se


emplea en la conversin, con la siguiente asignacin:
ADCS1:0
00
01
10
11

FRECUENCIA
Fosc/2
Fosc/8
Fosc/32
FRC (Procede del oscilador RC interno)

Se designa como TAD el tiempo que dura la conversin de cada bit en el


caso de trabajar con valores digitales de 10 bits. Se requiere un tiempo mnimo
de 12TAD. El valor de TAD se selecciona por software mediante los bits
ADCS1:ADCS0 y en los PIC 16F87x nunca debe ser menor de 1,6
microsegundos.
ADCS1:0
00
01
10
11

TAD
2 Tosc
8 Tosc
32 Tosc
Oscilador RC interno en el C A/D

Los bits CHS2-0 seleccionan el canal por el que se introduce la seal a


convertir, de acuerdo con el siguiente cdigo:
CHS2-0
000
001
010
011
100
101
110
111

CANAL
Canal 0 (RA0/AN0)
Canal 1 (RA1/AN1)
Canal 2 (RA2/AN2)
Canal 3 (RA3/AN3)
Canal 4 (RA5/AN4)
Canal 5 (RE0/AN5). Los PIC de 28 patas no la tienen
Canal 6 (RE1/AN6). Los PIC de 28 patas no la tienen
Canal 7 (RE2/AN7). Los PIC de 28 patas no la tienen

El bit GO/DONE# es el bit de estado de la conversin. Ponindolo a 1


se inicia la conversin y mientras est a 1 est realizndose la conversin.
Cuando GO/DONE# pasa a 0 confirma el final de la conversin y la puesta del
resultado en la pareja de registros ADRESH:L.
El bit ADON sirve para activar el C A/D ponindolo a 1 y para
desactivar su funcionamiento, ponindolo a 0.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

44

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

ESTRUCTURA INTERNA Y CONFIGURACIN DEL C A/D


El bit de menos peso (ADFM) del registro ADCON1 selecciona el
formato del resultado de la conversin. Si vale 1, el resultado est justificado en
el registro ADRESH, que tiene sus 6 bits de ms peso a 0; mientras que si vale 0
la justificacin se hace sobre el registro ADRESL, que tiene sus 6 bits de menos
peso a 0. Esto significa que los 16 bits que forman la unin de los dos registros,
unas veces tienen a 0 los 6 bits de ms peso y otras los 6 bits de menos peso.

ADFM=1

07

ADRESH

ADMF=0

RESULTADO DE 10 BITS

ADRESL

07

ADRESH

ADRESL

Los restantes 4 bits (PCFG3-0) de ADCON1 se usan para configurar las


patitas de los canales de entrada al conversor como analgicas o como E/S
digitales, de acuerdo con la siguiente tabla:

PCFG3-0
0000
0001
0010
0011
0100
0101
011x
1000
1001
1010
1011
1100
1101
1110
1111

AN7/
RE2
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D

AN6/
RE1
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D

AN5/
RE0
A
A
D
D
D
D
D
A
A
A
A
D
D
D
D

AN4/
RA5
A
A
A
A
D
D
D
A
A
A
A
A
D
D
D

AN3/
RA3
A
VREF+
A
VREF+
A
VREF+
D
VREF+
A
VREF+
VREF+
VREF+
VREF+
D
VREF+

AN2/
RA2
A
A
A
A
D
D
D
VREFA
A
VREFVREFVREFD
VREF-

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

AN1/
RA1
A
A
A
A
A
A
D
A
A
A
A
A
A
D
D

AN0/
RA0
A
A
A
A
A
A
D
A
A
A
A
A
A
A
A

VREF+

VREF-

VDD
RA3
VDD
RA3
VDD
RA3
VDD
RA3
VDD
RA3
RA3
RA3
RA3
VDD
RA3

VSS
VSS
VSS
VSS
VSS
VSS
VSS
RA2
VSS
VSS
RA2
RA2
RA2
VSS
RA2

CHAN/
REFS
8/0
7/1
5/0
4/1
3/0
2/1
0/0
6/2
6/0
5/1
4/2
3/2
2/2
1/0
1/2

45

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

Pasos a seguir para realizar una conversin con el mdulo C A/D:

1. Configurar el mdulo C A/D

Configurar las patas que actuarn como entradas analgicas, las que
trabajan como E/S digitales y las usadas para la tensin de referencia
(ADCON1).
Seleccionar el reloj de la conversin (ADCON0)
Seleccionar el canal de entrada A/D (ADCON0)
Activar el mdulo A/D (ADCON0)

2. Activar, si desea, la interrupcin escribiendo sobre PIE1 y PIR1

Borrar el sealizador ADIF.


Poner a 1 el bit ADIE
Poner a 1 los bits habilitadores GIE y PIE

3. Tiempo de espera para que transcurra el tiempo de adquisicin


4. Inicio de la conversin

Poner a 1 el bit GO/DONE# (ADCON0)

5. Tiempo de espera para completar la conversin A/D que puede detectarse

Por la exploracin del bit GO/DONE#, que al completarse la conversin


pasa a valer 0.
Esperando a que se produzca la interrupcin si se ha programado, al
finalizar la conversin.
Aunque no se permita interrupcin, el sealizador ADIF se pondr a 1 al
finalizar la conversin.

6. Leer el resultado de los 10 bits vlidos de ADRSH:L y borrar el flag ADIF


7. Para una nueva conversin regresar al paso 1 o al 2. El tiempo de
conversin por bit est definido por TAD. Se exige esperar un mnimo de 2
TAD para reiniciar una nueva conversin

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

46

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

MDULO DE COMUNICACIONES
SERIE SNCRONA MSSP

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

47

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

INTRODUCCIN
La comunicacin serie es una forma muy apreciada de transferir datos
digitales entre sistemas y circuitos integrados, dada la reducida cantidad de
lneas que precisa.
En los PIC16F87X se ha implantado el mdulo MSSP (Master
Synchronous Serial Port), que proporciona una excelente interfaz de
comunicacin de los microcontroladores con otros microcontroladores y
diversos perifricos, entre los que destacan la memoria EEPROM serie, los
conversores A/D, los controladores de displays, etc.
Adems el mdulo MSSP admite dos de las alternativas ms usadas en la
comunicacin serie sncrona:
1 SPI (Serial Peripheral Interface).
2 I2C (Inter Integrated Circuit).
La comunicacin serie en modo SPI la utilizan principalmente las
memorias (RAM y EEPROM) y utiliza tres lneas para llevarla a cabo. En el
modo I2C slo se emplean dos lneas y, recientemente, ha conseguido una
importante implantacin en la comunicacin de circuitos integrados, existiendo
en el mercado todo tipo de perifricos capaces de trabajar con este protocolo.
El mdulo MSSP consta bsicamente de dos registros: el SSPSR, que es un
registro de desplazamiento que transforma la informacin serie en paralelo
y viceversa, y el registro SSPBUF, que acta como buffer de la informacin
que se recibe o transmite.
El funcionamiento del mdulo MSSP es muy sencillo. En transmisin, el
byte que se quiere transmitir se carga en el registro SSPBUF a travs del bus de
datos interno y automticamente se pasa al registro SSPSR, que va desplazando
bit a bit el dato, sacndolo ordenadamente al exterior al ritmo de los impulsos
del reloj. En recepcin, los bits van entrando al ritmo del reloj por una pata y se
van desplazando en el SSPSR hasta que lo llenan, en cuyo momento la
informacin se traspasa al SSPBUF, donde queda lista para su lectura. Este
doble almacenamiento de datos recibidos, permite iniciar la recepcin de un
nuevo dato antes de que se haya ledo el ltimo.
Cuando se han recibido 8 bits durante la recepcin en SSPSR, se traspasa
dicha informacin a SSPBUF y entonces el bit sealizador BF (Buffer-Full) se
pone a 1, al igual que el flag de interrupcin SSPIF. Cualquier escritura en el
SSPBUF se ignora durante la transferencia de informacin y se sealiza
poniendo a 1 el bit WCOL. Recae la responsabilidad del programador pasar el
bit WCOL a 0 una vez completada la escritura en SSPBUF.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

48

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

MODO SPI
Permite la transferencia de datos de 8 bits en serie, que pueden ser
transmitidos y recibidos de forma sncrona y simultnea. Para el establecimiento
de la comunicacin se utilizan tres lneas:
1 SDO (Serial Data Out): Salida de datos en serie.
2 SDI (Serial Data In): Entrada de datos en serie.
3 SCK (Serial Clock): Reloj de sincronizacin.

Puede ser necesario utilizar una cuarta lnea de control ms cuando el


PIC que se utiliza trabaja en modo esclavo. En este caso, la pata SS# (seleccin
de esclavo) se debe activar a tierra. Las 4 lneas que utilizan se corresponden con
las patas multifuncin RC3/SDO, RC4/SDI, RC5/SDK y RA5/SS#.
La conexin habitual de PIC maestro se suele realizar con circuitos de
memoria con el objeto de ampliar su capacidad. La lnea SDO del maestro se
corresponde con las SDI de los esclavos y la lnea SCK por la que circulan los
impulsos de reloj, siempre parten del maestro, que es el encargado de generar y
controlar la sincronizacin.
Si, por ejemplo, actuase como esclavo un chip de memoria RAM de
256x8 de tamao, la comunicacin SPI la iniciara el maestro enviando por la
lnea SDO un byte con la direccin de la memoria a acceder, seguido de otro
byte que especificara la operacin lectura/escritura y un tercero que contendra
el dato a escribir en caso de que se tratase de una operacin de escritura. En caso
de que se tratase de una de lectura, despus de enviar los dos bytes iniciales,
quedara a la espera del byte que sacara el esclavo por su lnea SDO y que se
introducira al maestro por su lnea SDI. Si fuese una memoria con ms
posiciones, la direccin se tendra que especificar en ms de un byte.
Cuando el PIC trabaja como maestro hay que programar la lnea
RC3/SDO como salida, la lnea RC4/SDI como entrada y la lnea RC5/SCK
tambin como salida. Si actuase como esclavo, la lnea RC5/SCK debera
configurarse como entrada y la RA5/SS# debera conectarse a tierra.
SS

SS

RA5/SS#
PIC esclavo 1
SDI
SDO CLK

RA5/SS#
PIC esclavo 1
SDI
SDO CLK

PIC MAESTRO

PIC 16F87x

RC3/SDO

SDO

RC4/SDI

SDI

RC5/SCK

SCK

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

49

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

MODO I2C
El protocolo I2C fue desarrollado por Philips para cubrir sus propias
necesidades en la implementacin de diversos productos electrnicos que
requeran una elevada interconexin de circuitos integrados. El protocolo I2C
(Inter-Integrated Circuits) utiliza nicamente dos lneas para la transferencia de
informacin entre los elementos que se acoplan al bus. Una de dichas lneas se
dedica a soportar los datos, es bidireccional y se llama SDA; la otra lleva los
impulsos de reloj para la sincronizacin, es unidireccional y recibe el nombre de
SCL. Los impulsos de reloj siempre los genera el maestro y tienen la funcin de
sincronizar las transferencias con todos los esclavos colgados a las dos lneas.
SS

SS

PIC MAESTRO

PIC 16F87x

PIC esclavo 1
SDA
SCL

PIC esclavo 1
SDA
SCL

RC4/SDA

SDA

RC3/SCL

SCL

Concepto del bus I2C


Dos lneas, SDA (datos) y SCL (reloj), transportan la informacin entre
los diferentes dispositivos conectados al bus. Cada dispositivo se identifica por
una nica direccin y puede transmitir o recibir dependiendo de la funcin que
se vaya a realizar. Un controlador de LCD, por ejemplo, slo recibe mientras
que una memoria de tipo RAM puede transmitir o recibir datos en funcin 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 seal de reloj. Cualquiera de los dispositivos direccionados por
un maestro se considera esclavo.
El I2C es un bus multi-maestro; puede haber ms de un maestro
conectado y controlando el bus. Normalmente se trata de microcontroladores o
microcomputadores.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

50

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

Direccionamiento del bus I2C


-

El primer byte que enva el maestro tras la condicin de inicio, es


el cdigo que determina el esclavo (7 bit de mas peso)

Cdigo 0000 0000 de llamada general

Bit de menos peso (R/W#), determina si se realiza una operacin


de lectura o escritura

Para activar el bus I2C, poner el bit SSPEN = 1, que es el bit 5 del
registro SSPCON

Previamente, configurar RC3/SCL y RC4/SDA como entradas

Bits de Control del bus I2C


1.

SSPCON

Registro de control

2.

SSPCON2

Registro de control 2

3.

SSPSTAT

Registro de estado

4.

SSPBUF

Buffer para los datos

5.

SSPSR

Registro de desplazamiento (no accesible)

6.

SSPADD

Registro de direccin

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

51

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

SSPCON
WCOL SSPOV

SSPEN

CKP

SSPM3

SSPM2

SSPM1

SSPM0

WCOL

se pone a 1 si se intenta escribir en SSPBUF en


condiciones no vlidas.

SSPOV

se pone a 1 si hay desbordamiento en SSPBUF

SSPEN

configuracin de la patas RC3/SCL y RC4/SDA


1 = la puerta serie queda configurada con SCL y SDA
0 = RC3 y RC4 como entradas y salidas digitales

CKP

para activar el reloj en modo esclavo

SSPM3-0

seleccin de la frecuencia del reloj

SSPM3-0
0000
0001
0010
0011
1000

FRECUENCIA DEL RELOJ


Reloj = FOSC/4
Reloj = FOSC/16
Reloj = FOSC/61
Reloj = salida del TMR2/2
Reloj = (SSPADD + 1) FOSC

SSPCON2
GCEN ACKSTAT ACKDT ACKEN RCEN

PEN

RSEN

SEN

GCEN

solo se usa en modo esclavo

ACKSTAT

si se pone a 1 indica que se ha recibido el bit ACK

ACKDT

bit de reconocimiento de recepcin en modo maestro


1 = el maestro NO ha trasmitido el dato
0 = el maestro SI ha trasmitido el dato

ACKEN

si vale 1 se inicia la secuencia de generacin de la


condicin de reconocimiento

RCEN

si vale 1 se habilita el modo de recepcin del maestro

PEN

si vale 1 se genera la condicin de parada de SCL y SDA

RSEN

si vale 1 se inicia la repeticin de la condicin de inicio

SEN

si vale 1 se inicia la condicin de inicio

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

52

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

SSPSTAT
SMP CKE

D/A#

R/W#

UA

BF

SMP

bit de muestreo
1 = los bits de datos se muestran al final del periodo
0 = los bits de datos se muestran a mitad del periodo

CKE

nivel de SCL y SDA en modo multimaestro


1 = a nivel alto SCL y SDA en modo maestro y esclavo
0 = se configuran segn especificaciones del I2C

D/A#

indica si el dato recibido es de informacin o direccin


1 = de informacin
0 = de direccin

se pone a 1 cuando detecta la llegada del bit STOP

se pone a 1 cuando detecta la llegada del bit START

R/W#

bit de seleccin de lectura o escritura


1 = lectura (READ)
0 = escritura (WRITE)

UA

BF

tipo de direccionamiento
1 = direccin de 10 bits
0 = direccin de 7 bits
sealizador del buffer de datos
1 = tiene un dato y la transmisin est en proceso
0 = no tiene ningn dato

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

53

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

USART (SCI)

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

54

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

COMUNICACIN SERIE ASNCRONA


Los PIC 16F87x contienen un mdulo MSSP con dos puertas para
comunicacin serie sncrona, o sea, con seal de reloj. Tambin disponen de
un mdulo USART, capaz de soportar la comunicacin serie sncrona y
asncrona.
El USART, llamado SCI (Serial Comunication Interface), puede
funcionar como un sistema de comunicacin full-duplex o bidireccional
asncrono, adaptndose a multitud de perifricos y dispositivos que transfieren
informacin de esta forma, tales como el monitor CRT o el ordenador PC.
Tambin puede trabajar en modo sncrono unidireccional o half-duplex para
soportar perifricos como memorias, conversores, etc.
Modos de trabajo del USART:
1. ASNCRONA (Full duplex, bidireccional).
2. SNCRONA-MAESTRO (Half duplex, unidireccional).
3. SNCRONA-ESCLAVO (Half duplex, unidireccional).
En el modo asncrono las transferencias de informacin se realizan sobre
dos lneas TX (transmisin) y RX (recepcin), saliendo y entrando los bits por
dichas lneas al ritmo de una frecuencia controlada internamente por el USART.
En el modo sncrono, la comunicacin se realiza sobre dos lneas, la DT que
traslada en los dos sentidos los bits a la frecuencia de los impulsos de reloj que
salen por la lnea CK desde el maestro. En ambos modos, las lneas de
comunicacin son las dos de ms peso de la Puerta C: RC6/TX/CK y
RC7/RX/DT.
En esta forma de comunicacin serie, se usa la norma RS-232-C, donde
cada palabra de informacin o datos se enva independientemente de los dems.
Suele constar de 8 o 9 bits y van precedidos por un bit de START (inicio) y
detrs de ellos se coloca un bit de STOP (parada), de acuerdo con las normas del
formato estndar NRZ (NonReturn-to-Zero). Los bits se transfieren a una
frecuencia fija y normalizada.
Los cuatro bloques que configuran la arquitectura de USART en modo
asncrono son:
1 Circuito de muestreo.
2 Generador de baudios.
3 Transmisor asncrono.
4 Receptor asncrono.
El circuito de muestreo acta sobre la pata RC7/RX/DT, que es por
donde se recibe el bit de informacin o control y se encarga de muestrear tres
veces su valor, para decidir este por mayora.

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

55

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMAS (ASM)

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

56

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 1
Lee el estado de los 6 interruptores del entrenador (RA5-RA0) y reflejar el nivel
lgico de los mismos sobre los leds RB5-RB0 conectados a la puerta B

Inicio

Aqui

List
include

p=16F876
"P16F876.INC"

org

0x05

clrf
bsf
clrf
movlw
movwf
movlw
movwf
bcf

PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00111111'
TRISA
STATUS,RP0

movf
movwf
goto

PORTA,W
PORTB
Aqui

;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida
;Puerta A configurada como digital
;Puerta A se configura como entrada
;Selecciona banco 0
;Leer las entradas RA0-RA5
;Reflejar en las salidas
;Bucle de lectura

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

57

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 2
Control de los leds RB0 y RB1 desde el interruptor RA0. RB0 refleja el estado de RA0,
RB1 el complemento de RA0
List
include

p=16F876
"P16F876.INC"

org

0x05

clrf
bsf
clrf
movlw
movwf
movlw
movwf
bcf

PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00011111'
TRISA
STATUS,RP0

Aqui

btfsc
goto
bcf
bsf
goto

PORTA,0
RA0_es_1
PORTB,0
PORTB,1
Aqui

;RA0 = 1 ??
;Si
;No, desconecta RB0
;Conecta RB1
;Buble

RA0_es_1

bsf
bcf
goto

PORTB,0
PORTB,1
Aqui

;Activa RB0
;Activa RB1
;Bucle

Inicio

;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida
;Puerta A como entrada digital
;Puerta A se configura como entrada
;Selecciona banco 0

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

58

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 3
Se trata de realizar una rotacin secuencial en el encendido de cada led conectados a la
puerta B del entrenador. Si RA0 = 0, la rotacin ser de derecha a izquierda y viceversa.
Cada led permanece encendido 0.25 segundos (250 mS)

Contador

List
include

p=16F876
;Tipo de procesador
"P16F876.INC" ;Definiciones de registros internos

equ

0x20

org
goto

0x05
Inicio

;Variable para la temporizacin

;-------------------------------------------------------------------------------------------------------------------;Delay es una rutina que realiza una temporizacin de 250 mS que es el tiempo en que han
;de permanecer encendido cada uno de los leds. Se basa en repetir 25 veces la temporizacin
;de 10mS que se emple en el ejercicio anterior.
Delay
Delay_0

Delay_1

movlw
movwf
bcf

b10
Contador
INTCON,T0IF

;Carga el contador con 10


;Desconecta el flag del TMR0

movlw
movwf
btfss
goto
decfsz

b195
TMR0
INTCON,T0IF
Delay_1
Contador,F

;carga el TMR0 con 195


;Rebosamiento del TMR0 ??
;No. Todava no han pasado los 1* mS
;Decrementa contador.

goto
Delay_0
;Todava no, temporiza otros 10 ms
return
;Ahora si
;-------------------------------------------------------------------------------------------------------------------Inicio

Loop
A_Izda
A_Dcha

clrf
bsf
clrf
movlw
movwf
movlw
movwf
movlw
movwf
bcf

PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00011111'
TRISA
b'00000111'
OPTION_REG
STATUS,RP0

bsf
call
btfsc
goto
rlf
goto
rrf
goto

STATUS,C
Delay
PORTA,0
A_Dcha
PORTB,F
Loop
PORTB,F
Loop

;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida
;Puerta A digital
;Puerta A se configura como entrada
;Preescaler de 256 para el TMR0
;Selecciona banco 0
;Activa el carry
;Temporiza 250mS
;Est a 0 RA0 ??
;No, rotacin a derecha
;Si, rotacin a izquierda
;Rotacin a derecha

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

59

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 4
La interrupcin del TMR0.
Se trata de comprobar la interrupcin provocada por el TMR0. El programa lee el
estado de los interruptores conectados a RA0 y RA4 para reflejarlo en los leds conectados a RB0
y RB4 respectivamente. Al mismo tiempo el TMR0 genera una interrupcin cada 0.05 seg. (10
mS) que se repetir 50 veces con objeto de hacer intermitencia de 500 mS sobre el led conectado
a RB7.

Contador

Inter

Con_si_0

Seguir

Inicio

List
include

p=16F876
;Tipo de procesador
"P16F876.INC" ;Definiciones de registros internos

equ

0x020

;Variable para la temporizacin

org
goto

0x04
Inter

;Vector de interrupcin

org
goto

0x05
Inicio

bcf
decfsz

INTCON,T0IF
Contador,F

goto
movlw
movwf

Seguir
b50
Contador

movlw
xorwf
movlw
movwf
retfie

b'10000000'
PORTB,F
b195
TMR0

clrf
bsf
clrf
movlw
movwf
movlw
movwf
movlw
movwf
bcf

PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00111111'
TRISA
b'00000111'
OPTION_REG
STATUS,RP0

;Repone flag del TMR0


;Decrementa el contador. Ha habido 50
interrupciones ??
;No, no han pasado los 500 mS
;Repone el contador nuevamente para
;contar 50 interrupciones
;RB0 cambia de estado
;Repone el TMR0 con 195
;Retorno de interrupcin
;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida
;Puerta A digital
;Puerta A se configura como entrada
;Preescaler de 256 para el TMR0
;Selecciona banco 0

;El TMR0 se carga con 195. Con un preescaler de 256 y a una frecuencia de 20MHz se obtiene
;una interrupcin cada 10mS. Se habilita la interrupcin del TMR0.
movlw
movwf
movlw
movwf
movlw
movwf

b195
TMR0
b50
Contador
b'10100000'
INTCON

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

;Carga el TMR0 con 195


;N de veces a repetir la interrupcin
;Activa la interrupcin del TMR0

60

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

;Este es el cuerpo principal del programa. Consiste en leer constantemente el estado de RA0 y
;RA1 para visualiza sobre RB0 y RB1.
Loop

RA0_ES_1
TEST_RB1

RA1_ES_1

btfsc
goto
bcf
goto
bsf
btfsc
goto
bcf
goto
bsf
goto

PORTA,0
RA0_ES_1
PORTB,0
TEST_RB1
PORTB,0
PORTA,1
RA1_ES_1
PORTB,1
Loop
PORTB,1
Loop

;Testea el estado de RA0


;Desactiva RB0
;Activa RB0
;Testea el estado de RA1
;Desactiva RB1
;Activa RB1

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

61

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 5
La interrupcin externa RBO/INT.
Se trata de comprobar la interrupcin externa que se aplica a travs del pin RBO/INT.
El programa principal est en un ciclo cerrado en modo SLEEP (standby de bajo consumo).
Cada vez que se detecta un flanco descendente en RB0 se provoca una interrupcin cuyo
tratamiento hace iluminar las salidas RB7-RB1 durante 1 seg.
List
include

p=16F876
;Tipo de procesador
"P16F876.INC" ;Definiciones de registros internos

equ

0x20

;Variable para la temporizacin

org
goto

0x04
Inter

;Vector de interrupcin

org
goto

0x05
Inicio

Inter

bcf
movlw
movwf
movlw
movwf

Seguir

bcf
movlw
movwf
btfss
goto
decfsz
goto
clrf
retfie

INTCON,INTF ;Repone flag de la interrupcin exetrna


b'11111110'
PORTB
;Activa las salidas
b100
Contador
;Inicia contador de temporizaciones de 10
;ms con 100 (1")
INTCON,T0IF ;Reponer flag del TMR0
b195
TMR0
;Repone el TMR0 con 195
INTCON,T0IF ;Han transcurrido 10 mS ??
Delay_10ms
;No, esperar
Contador,F
;Decrementa el contador.
Seguir
;No
PORTB
;Si, han pasado 1", se desconecta la salida
;Retorno de interrupcin

clrf
bsf
movlw
movwf
movlw
movwf
bcf
movlw
movwf

PORTB
STATUS,RP0
b'00000001'
TRISB
b'00000111'
OPTION_REG
STATUS,RP0
b'10010000'
INTCON

Contador

Delay_10ms

Inicio

;Borra el Puerto B
;Selecciona banco 1
;RB7-RB1 salidas, RB0/INT entrada
;Preescaler de 256 para el TMR0
;Selecciona banco 0
;Activa la interrupcin externa RB0/INT

;Este es el cuerpo del programa principal. Se mantiene en estado SLEEP hasta que se produce
;interrupcin
Loop

sleep
nop
goto

Loop

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

62

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 6
El Display de 7 segmentos del entrenador. Decodificador hex. BCD a 7 segmentos.
Mediante los cuatro interruptores RA0-RA3 se introduce un valor hexadecimal de 4 bits que
debe visualizarse sobre el display.
List
include

p=16F876
;Tipo de procesador
"P16F876.INC" ;Definiciones de registros internos

org
goto

0x05
Inicio

;-------------------------------------------------------------------------------------------------------------------;Tabla: Esta rutina convierte el cdigo binario presente en los 4 bits de menos peso del reg. W en
;su equivalente a 7 segmentos. Para ello el valor de W se suma al valor actual del PC. Se obtiene
;un desplazamiento que apunta al elemento deseado de la tabla.El cdigo 7 segmentos retorna
;tambin en el reg. W.
Tabla:

addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

PCL,F
b'00111111'
b'00000110'
b'01011011'
b'01001111'
b'01100110'
b'01101101'
b'01111101'
b'00000111'
b'01111111'
b'01100111'
b'01110111'
b'01111100'
b'00111001'
b'01011110'
b'01111001'
b'01110001'

;Desplazamiento sobre la tabla


;Dgito 0
;Dgito 1
;Dgito 2
;Dgito 3
;Dgito 4
;Dgito 5
;Dgito 6
;Dgito 7
;Dgito 8
;Dgito 9
;Dgito A
;Dgito B
;Dgito C
;Dgito D
;Dgito E
;Dgito F

Inicio

clrf
bsf
clrf
movlw
movwf
movlw
movwf

PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00111111'
TRISA

;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida

bcf

STATUS,RP0

;Selecciona banco 0

movf
andlw
call
movwf
goto

PORTA,W
b'00001111'
Tabla
PORTB
Loop

;Lee el cdigo de RA0-RA3


;Convierte a 7 segmentos
;Visualiza sobre el display

Loop

;Puerta A digital
;Puerta A se configura como entrada

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

63

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 7
La memoria EEPROM de datos
Se trata de imitar el funcionamiento de las mquinas tipo "SU TURNO" habituales en mltiples
comercios. Sobre el display se visualizar el nmero del turno actual. Este se incrementa a cada pulso
aplicado por RA0. En la memoria EEPROM del PIC16F876 se almacena el ltimo nmero visualizado,
de forma que, en caso de haber un fallo de alimentacin, se reanude la cuenta en el ltimo nmero.
Si se parte de que el sistema se emplea por vez primera , se visualiza el 0

Contador

List
p=16F876
include "P16F876.INC"

;Tipo de procesador
;Definiciones de registros internos

equ

0x20

;Variable para el contador

org
goto

0x05
Inicio

;-----------------------------------------------------------------------------------------------------------------------------;EE_Write: Graba un byte en la EEPROM de datos. La direccin ser la contenida en EEADR y el dato
;se le supone previamente metido en EEDATA
EE_Write

Wait

bsf
bsf
bcf
bsf
movlw
movwf
movlw
movwf
bsf
btfsc
goto
bcf
bcf
bcf
bcf
return

STATUS,RP0
STATUS,RP1
EECON1,EEPGD
EECON1,WREN
b'01010101'
EECON2
b'10101010'
EECON2
EECON1,WR
EECON1,WR
Wait
EECON1,WREN
EECON1,EEIF
STATUS,RP0
STATUS,RP1

;Selecciona banco 3
;Acceso a EEPROM de datos
;Permiso de escritura

;Secuencia establecida por Microchip


;Orden de escritura
;Testear flag de fin de escritura
;Desconecta permiso de escritura
;Reponer flag de fin de escritura
;Selecciona banco 0

;-----------------------------------------------------------------------------------------------------------------------------;EE_Read: Leer un byte de la EEPROM. Se supone al registro EEADR cargado con la direccin a leer.
;En EEDATA aparecer el dato ledo.
EE_Read

bsf
bsf
bcf
bsf
bcf
bcf
return

STATUS,RP0
STATUS,RP1
EECON1,EEPGD
EECON1,RD
STATUS,RP0
STATUS,RP0

;Seleccin de banco 3
;Selecciona EEPROM de datos
;Orden de lectura
;Seleccin de banco 0

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

64

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

;-----------------------------------------------------------------------------------------------------------------------------;Tabla: Esta rutina convierte el cdigo BCD presente en los 4 bits de menos peso del reg. W en su
;equivalente a 7 segmentos. El cdigo 7 segmentos retorna tambin en el reg. W
Tabla:

addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

PCL,F
b'00111111'
b'00000110'
b'01011011'
b'01001111'
b'01100110'
b'01101101'
b'01111101'
b'00000111'
b'01111111'
b'01100111'

;Desplazamiento sobre la tabla


;Dgito 0
;Dgito 1
;Dgito 2
;Dgito 3
;Dgito 4
;Dgito 5
;Dgito 6
;Dgito 7
;Dgito 8
;Dgito 9

;-----------------------------------------------------------------------------------------------------------------------------;Delay_10_ms: Esta rutina de temporizacin tiene por objeto eliminar rebote.


Delay_10_ms:

bcf
INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw b195
movwf TMR0
;carga el TMR0 con 195
Delay_10_ms_1 btfss
INTCON,T0IF ;Rebasamiento del TMR0 ??
goto
Delay_10_ms_1 ;Todava no
bcf
INTCON,T0IF ;Ahora si, reponer el flag
return
;-----------------------------------------------------------------------------------------------------------------------------Inicio

Ini_0
Ini_1

clrf
bsf
clrf
movlw
movwf
movlw
movwf
movlw
movwf
bcf

PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00111111'
TRISA
b'00000111'
OPTION_REG
STATUS,RP0

;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida

;Preescaler de 256 para el TMR0


;Selecciona banco 0

bsf
clrf

STATUS,RP1
EEADR

;Selecciona banco 2
;Selecciona direccin 00 de EEPROM

call
bsf
movlw
subwf
btfsc
goto
goto
bcf
clrf
goto
movf
bcf
movwf

EE_Read
STATUS,RP1
0x09
EEDATA,W
STATUS,C
Ini_0
Ini_1
STATUS,RP1
Contador
Loop
EEDATA,W
STATUS,RP1
Contador

;Lee byte de la EEPROM


;Selecciona banco 2

;Puerta A digital
;Puerta A se configura como entrada

;Mayor de 9 ??
;Si, poner a 0 el contador
;No
;Banco 0
;Poner a 0 el contador
;Banco 0
;Iniciar contador

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

65

TRABAJO Y EXPLICACIN PIC 16F87X


Loop

2 DPE

movf Contador,W
call
Tabla
movwf PORTB

;Convierte contador a 7 segmentos


;Visualiza sobre el display

Wait_0

btfss
goto
call

PORTA,0
Wait_0
Delay_10_ms

;RA0 est a "1" ??


;No, esperar
;Eliminar rebotes

Wait_1

btfsc
goto
call

PORTA,0
Wait_1
Delay_10_ms

;RA0 est a "0" ??


;No, esperar
;Eliminar rebotes. Ha habido un pulso

incf
movlw
subwf
btfsc
clrf
movf
bsf
movwf
call
goto

Contador,F
b10
Contador,W
STATUS,Z
Contador
Contador,W
STATUS,RP1
EEDATA
EE_Write
Loop

;Incrementa contador
;Contador mayor de 9 ??
;Si, vuelta a 00
;Selecciona el Banco 2
;Graba el nuevo valor del contador en la EEPROM

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

66

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 8
El manejo de la pantalla LCD
Este ejemplo pretende introducirnos en el manejo de la pantalla LCD, para la visualizacin
de diferentes mensajes.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Lcd_var
Delay_Cont
Temporal_1
Temporal_2

equ
equ
equ
equ

0x20
0x22
0x23
0x24

org
goto

0x05
Inicio

;Variables (2) de las rutinas de manejo del LCD


;Variable para la temporizacin
;Variable temporal
;Variable temporal

include "LCD_Cxx.inc" ;Incluye las rutinas de manejo del LCD


;-----------------------------------------------------------------------------------------------------------------------------;Segn el valor contenido en el registro W, se devuelve el carcter a visualizar
Tabla_Mensajes movwf PCL

;Calcula el desplazamiento sobre la tabla

;-----------------------------------------------------------------------------------------------------------------------------;La directiva dt genera tantas intsrucciones retlw como bytes o caracteres contenga
Mens_0

equ
dt

$
"Trabajo / Explic",0x00

Mens_1

equ
dt

$
"PIC 16F87x",0x00

Mens_2

equ
dt

$
"Sebastian Martin",0x00

Mens_3

equ
dt

$
" Andoni Beraza",0x00

;-----------------------------------------------------------------------------------------------------------------------------;Delay_var: Esta rutina de propsito general realiza una temporizacin variable entre 10 mS y 2.5". Se
;emplea un preescaler de 256 y al TMR0 se le carga con 195. La velocidad de trabajo es de 20Mhz y por
;tanto el TMR0 se incrementa cada 200nS. De esta forma, el TMR0 debe contar 195 eventos que, con un
;preescaler de 256 hace un intervalo total de 10000 uS (195 * 256 * 0,2). Este intervalo de 10 mS se repite
;tantes veces como indique la variable "Delay_cont", es por ello que el delay mnimo es de 10 mS
;("Delay_cont=1) y el mximo de 2.5" (Delay_cont=255).
Delay_var:
Intervalo

bcf
movlw
movwf
btfss
goto
decfsz
goto
return

INTCON,T0IF
b195
TMR0
INTCON,T0IF
Intervalo
Delay_Cont,F
Delay_var

;Desconecta el flag de rebosamiento


;carga el TMR0 con 195
;Rebasamiento del TMR0 ??
;Todava no
;Decrementa contador de intervalos
;Repite el intervalo de 10 mS

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

67

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

;Mensaje: Esta rutina visualiza en el LCD el mensaje cuyo inicio est indicado en el acumulador. El fin
;de un mensaje se determina mediante el cdigo 0x00
Mensaje
Mensaje_1

No_es_ultimo

Inicio

movwf
movf
call
movwf
movf
btfss
goto
return
call
incf
goto

Temporal_1
Temporal_1,W
Tabla_Mensajes
Temporal_2
Temporal_2,F
STATUS,Z
No_es_ultimo

;Salva posicin de la tabla


;Recupera posicin de la tabla
;Busca caracter de salida
;Guarda el caracter

LCD_DATO
Temporal_1,F
Mensaje_1

;Visualiza en el LCD
;Siguiente caracter

clrf
bsf
clrf
movlw
movwf
movlw
movwf
movlw
movwf
bcf

PORTB
STATUS,RP0
TRISB
0x06
ADCON1
b'00110001'
TRISA
b'00000111'
OPTION_REG
STATUS,RP0

;Borra el Puerto B
;Selecciona banco 1
;Puerta B se configura como salida

call
LCD_INI
movlw b'00001100'
call
LCD_REG
Loop

movlw
call
movlw
call
movlw
call
movlw
call
movlw
movwf
call
movlw
call
movlw
call
movlw
call
movlw
call
movlw
movwf
call
goto

b'00000001'
LCD_REG
Mens_0
Mensaje
b'11000000'
LCD_REG
Mens_1
Mensaje
b200
Delay_Cont
Delay_var
b'00000001'
LCD_REG
Mens_2
Mensaje
b'11000000'
LCD_REG
Mens_3
Mensaje
.200
Delay_Cont
Delay_var
Loop

;Mira si es el ltimo

;Puerta A digital
;RA1-RA3 salidas
;Preescaler de 256 para el TMR0
;Selecciona banco 0
;Secuencia de inicio del LCD
;Enva instruccin: LCD ON, Cursor OFF y blink OFF
;Borra LCD y Home (colocar cursor en 1 posicin)
;Visualiza el mensaje 0
;Coloca cursor en 2 fila del LCD
;Visualiza mensaje 1
;Temporiza 2 segundos
;Borra LCD y Home (colocar cursor en 1 posicin)
;Visualiza el mensaje 2
;Coloca cursor en 2 fila del LCD
;Visualiza el mensaje 3
;Temporiza 2 segundos

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

68

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 9
Introduccin al manejo del teclado
Haciendo uso de las rutinas incluidas en el fichero TECLADO.INC, se trata de leer el teclado y,
visualizar sobre los leds de la puerta B el cdigo BCD de la tecla pulsada. La visualizacin se mantiene
estable durante dos segundos hasta una nueva pulsacin.
Se trata de un ejemplo en el que la Puerta B se reconfigura dinmicamente. Inicialmente es
configurada como salida para presentacin del resultado. Posteriormente, la rutina de exploracin del
teclado reconfigura RB0-RB3 como salidas y RB4-RB7 como entradas.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Key_var
del teclado
Delay_Cont

equ

0x20

;Inicio de las 6 variables empleadas por las rutinas de manejo

equ

0x26

;Variable para la temporizacin

org
goto

0x05
Inicio

include "TECLADO.INC"

;Incluye rutinas de manejo del teclado

;-----------------------------------------------------------------------------------------------------------------------------Delay_var:
bcf
INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw b195
movwf TMR0
;carga el TMR0 con 195
Intervalo
btfss
INTCON,T0IF ;Rebasamiento del TMR0 ??
goto
Intervalo
;Todava no
decfsz Delay_Cont,F ;Decrementa contador de intervalos
goto
Delay_var
;Repite el intervalo de 10 mS
return
;-----------------------------------------------------------------------------------------------------------------------------Inicio

Loop

clrf
bsf
clrf
movlw
movwf
bcf

PORTB
STATUS,RP0
TRISB
b'00000111'
OPTION_REG
STATUS,RP0

;Borra los latch de salida


;Selecciona banco 1
;Puerta B se configura como salida

call
movlw
subwf
btfsc
goto

Key_Scan
0x80
Tecla,W
STATUS,Z
Loop

;Explora el teclado

movf
movwf
movlw
movwf
call
clrf
goto

Tecla,W
PORTB
b200
Delay_Cont
Delay_var
PORTB
Loop

;Preescaler de 256 para el TMR0


;Selecciona banco 0

;Hay alguna pulsada ??


;No
;Lee el cdigo de la tecla pulsada
;Lo visualiza sobre los leds de la Puerta B
;Temporiza 2 segundos
;Desactiva visualizacin

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

69

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 10
El teclado y el LCD.
Haciendo uso de las rutinas incluidas en los ficheros TECLADO.INC y LCD_CXX.INC, se trata
de leer el teclado y, visualizar sobre el mdulo LCD la tecla pulsada.
El ejemplo pretende mostrar la interrupcin por cambio de estado en cualquiera de las lneas
RB4-RB7 del PIC el sistema se mantiene en el modo SLEEP de bajo consumo y slo reacciona cuando
tiene lugar la pulsacin de cualquier tecla.

Lcd_var
Key_var
Temporal_1
Temporal_2
Temporal_3

List
p=16F876
include "P16F876.INC"

;Tipo de procesador
;Definiciones de registros internos

equ
equ
equ
equ
equ

0x20
0x22
0x28
0x29
0x2a

;Inicio de las variables para el LCD


;Inicio de las variables del teclado
;Variable temporal n 1
;Variable temporal n 2
;Variable temporal n 3

org
goto
org
goto

0x04
Interrupcion
0x05
Inicio

include "LCD_CXX.INC"
include "TECLADO.INC"
Tabla_Mensajes movwf PCL
Mens_0

equ
dt

;Vector de interrupcin

;Incluir rutinas de manejo del LCD


;Incluir rutinas de manejo del teclado
;Desplazamiento sobre la tabla

$
"Se ha pulsado: ",0x00

;-----------------------------------------------------------------------------------------------------------------------------;Mensaje: Esta rutina visualiza en el LCD el mensaje cuyo inicio est indicado en el acumulador. El fin
;de un mensaje se determina mediante el cdigo 0x00
Mensaje
Mensaje_1

No_es_ultimo

movwf
movf
call
movwf
movf
btfss
goto
return
call
incf
goto

Temporal_1
Temporal_1,W
Tabla_Mensajes
Temporal_2
Temporal_2,F
STATUS,Z
No_es_ultimo

;Salva posicin de la tabla


;Recupera posicin de la tabla
;Busca caracter de salida
;Guarda el caracter

LCD_DATO
Temporal_1,F
Mensaje_1

;Visualiza en el LCD
;Siguiente caracter

;Mira si es el ltimo

;Se incluye una temporizacin de 10mS para eliminar los rebotes de las teclas
Delay_10ms
Delay_1

bcf
movlw
movwf
btfss
goto
return

INTCON,T0IF
b195
TMR0
INTCON,T0IF
Delay_1

;Desactiva flag del TMR0


;Carga el TMR0 con 195
;Han transcurrido 10mS ??
;No, esperar

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

70

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

;Programa de tratamiento de la interrupcin por cambio de estado


Interrupcion

Inter_1

bcf
call
movf
movwf
call

INTCON,RBIE
Key_Scan
Tecla,W
Temporal_3
Delay_10ms

;Desactiva mascara RBIE


;Explora el teclado

call
movlw
subwf
btfss
goto
call

Key_Scan
0x80
Tecla,W
STATUS,Z
Inter_1
Delay_10ms

;Se ha liberado la tecla pulsada ?


;No, esperar que se libere
;Eliminar rebotes

call

UP_LCD

;Configura Puertas A y B como salidas para manejo

movlw
call
movf
sublw
btfss
goto
movf
addlw
call
goto

0x8f
LCD_REG
Temporal_3,W
b9
STATUS,C
Mayor_que_9
Temporal_3,W
0x30
LCD_DATO
Inter_Fin

movf
addlw
call

Temporal_3,W
0x37
LCD_DATO

;Salva la tecla temporalmente


;Elimina rebotes
;Explora el teclado

del LCD

Mayor_que_9

Inter_Fin

;Es mayor que 9 (A, B,C,D,E,F)?


;Si
;No
;Ajuste ASCII de los caracteres del 0 al 9
;Visualizar sobre el LCD

;Ajuste ASCII de los caracteres de la A a la F


;Visualiza sobre el LCD

clrf
PORTA
PORTB
STATUS,RP0
b'11110000'
TRISB

;RB0-RB3 salidas, RB4-RB7 entradas

STATUS,RP0

;Tiempo de espera para estabilizar la puerta B


;Selecciona banco 0

bcf
movf
bcf
bsf
retfie

INTCON,RBIE
PORTB,W
INTCON,RBIF
INTCON,RBIE

;Desconecta mscara de interrupcin RBIE


;Lee estado actual de reposo de las entradas
;Reponer el flag de interrupcin
;Activa mscara de interrupcin RBIE

bsf
movlw
movwf
movlw
movwf
bcf

STATUS,RP0
0x06
ADCON1
b'00000111'
OPTION_REG
STATUS,RP0

;Selecciona pgina 1 de datos

call
call
movlw
call
movlw

UP_LCD
LCD_INI
b'00001100'
LCD_REG
b'00000001'

;Configura Puerta A y B como salidas


;Rutina de inicializacin del LCD

clrf
bsf
movlw
movwf
nop
nop
bcf

Inicio:

;Posiciona el cursor del LCD


;Recupera la tecla que se puls

;Selecciona banco 1

;Puerta A digital
;Activa Pull-Up para las entradas de la puerta B
;Selecciona pgina 0 de datos

;LCD en ON

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

71

TRABAJO Y EXPLICACIN PIC 16F87X


call

LCD_REG

2 DPE
;Borra LCD y HOME

;Salida del mensaje "Tecla pulsada:"


movlw Mens_0
call
Mensaje

Loop

;Visualiza el mensaje

clrf
clrf
bsf
movlw
movwf
nop
nop
bcf

PORTA
PORTB
STATUS,RP0
b'11110000'
TRISB

;RB0-RB3 salidas, RB4-RB7 entradas

STATUS,RP0

;Tiempo de espera para estabilizar la puerta B


;Selecciona banco 0

bcf
movf
bcf
bsf
bsf

INTCON,RBIE
PORTB,W
INTCON,RBIF
INTCON,RBIE
INTCON,GIE

;Desconecta mscara de interrupcin RBIE


;Lee estado actual de reposo de las entradas
;Reponer el flag de interrupcin
;Activa mscara de interrupcin RBIE
;Activa interrupciones

sleep
nop
goto

Loop

;Selecciona banco 1

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

72

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 11
El TMR1 en el modo contador. Frecuencmetro
Mediante un generador de onda cuadrada, se aplican pulsos por la lnea RC0/T1CKI.
El TMR1 cuenta los pulsos durante un intervalo de 1s. Al resultado de la cuenta representa el
nmero de pulsos por segundo o herzios.
Dicha frecuencia se visualiza por la pantalla LCD del entrenador
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Lcd_var
Byte_L
Byte_H
BCD_2
BCD_1
BCD_0
Contador
Temporal
Delay

equ
equ
equ
equ
equ
equ
equ
equ
equ

0x20
0x22
0x23
0x24
0x25
0x26
0x27
0x28
0x29

;Inicio de variables de las rutinas LCD


;Parte baja del byte a convertir
;Parte alta del byte a convertir
;Byte 2 de conversin a BCD
;Byte 1 de conversin a BCD
;Byte 0 de conversin a BCD
;Variable de contaje
;Variable temporal
;Variable para la temporizacin

org
goto

0x04
Inter

;Vector de interrupcin

org
goto

0x05
Inicio

include "LCD_CXX.INC"

;Incluye rutinas de manejo del LCD

;Visualizar: Visualiza sobre la pantalla LCD los cinco dgitos situados en las variables BCD_0, BC_1 y
;BCD_2
Visualizar

Visual_loop

movlw
call
movlw
movwf
movlw
movwf
swapf
andlw
iorlw
call
movf
andlw
iorlw
call
decf
decfsz
goto
return

0x80
LCD_REG
3
Contador
BCD_0
FSR
INDF,W
0x0f
0x30
LCD_DATO
INDF,W
0x0f
0x30
LCD_DATO
FSR,F
Contador,F
Visual_loop

;Posiciona el cursor
;Inicia contador de bytes a convertir
;Inicia puntero ndice
;Convierte a ASCII el nible de ms peso
;Lo visualiza
;Convierte a ASCII el nible de menos peso
;Lo visualiza
;Siguiente byte

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

73

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

;16Bits_BCD: Esta rutina convierte un nmero binario de 16 bits situado en Cont_H y Cont_L y, lo
;convierte en 5 dgitos BCD que se depositan en las variables BCD_0, BCD_1 y BCD_2, siendo esta
;ltima la de menos peso.
Bits16_BCD

Loop_16

Ajuste

Ajuste_BCD

bcf
clrf
bsf
clrf
clrf
clrf

STATUS,C
Contador
Contador,4
BCD_0
BCD_1
BCD_2

rlf
rlf
rlf
rlf
rlf
decfsz
goto
return

Byte_L,F
Byte_H,F
BCD_2,F
BCD_1,F
BCD_0,F
Contador,F
Ajuste

movlw
movwf
call
incf
call
incf
call
goto

BCD_2
FSR
Ajuste_BCD
FSR,F
Ajuste_BCD
FSR,F
Ajuste_BCD
Loop_16

movf
addlw
movwf
btfsc
movwf
movf
addlw
movwf
btfsc
movwf
return

INDF,W
0x03
Temporal
Temporal,3
INDF
INDF,W
0x30
Temporal
Temporal,7
INDF

;Carga el contador con 16


;Puesta a 0 inicial

;Desplaza a izda. (multiplica por 2)

;Inicia el ndice
;Ajusta el primer byte
;Ajusta el segundo byte

;Mayor de 7 el nibble de menos peso ??


;Si, lo acumula

;Mayor de 7 el nibble de menos peso ??


;Si, lo acumula

;Programa de tratamiento de la interrupcin que se provoca cuando el TMR0 temporice 10mS.


;Trabajando a 20MHz el TMR0 evoluciona cada 0.2 uS. Con un preescaler de 256, hay que cargar el
;valor 195 para provocar una interrupcin cada 10 mS. Esta se repite 100 veces para obtener una
;temporizacin total de 1"
Inter
Si_1000_mS

decfsz
goto
bcf
bcf
movf
movwf
movf
movwf
call
call
movlw
movwf
movlw
movwf

Delay,F
No_1000_mS
T1CON,0
STATUS,C
TMR1L,W
Byte_L
TMR1H,W
Byte_H
Bits16_BCD
Visualizar
b195
TMR0
b100
Delay

;Ha pasado 1000mS (1") ??


;No
;TMR1 en Off, cuenta de pulsos externos detenida
;Salva parte baja del contador
;Salva parta alta del contador
;Convierte a BCD el resultado de la cuenta
;Visualiza el resultado en el LCD
;Repone el TMR0 para temporizar 10 ms
;Repone variable para temporizar otro segundo

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

74

TRABAJO Y EXPLICACIN PIC 16F87X


bcf
clrf
clrf
bsf
retfie
No_1000_mS

INTCON,2
TMR1L
TMR1H
T1CON,0

movlw b195
movwf TMR0
bcf
INTCON,2
retfie

2 DPE
;Repone flag del TMR0
;Borra el TMR1
;TMR1 en On, se inicia la nueva cuenta de pulsos externos

;Repone para temporizar otros 10mS


;Repone el flag del TMR0

;-----------------------------------------------------------------------------------------------------------------------------Inicio

clrf
clrf
bsf
movlw
movwf
clrf
clrf
movlw
movwf
movwf
bcf

PORTB
PORTA
STATUS,RP0
b'00000110'
ADCON1
TRISB
TRISA
b'11000111'
OPTION_REG
TRISC
STATUS,RP0

;Borra los latch de salida


;Borra los latch de salida
;Selecciona banco 1
;Puerta A E/S digitales
;Puerta B se configura como salida
;Puerta A se configura como salida
;Preescaler de 256 asociado al TMR0
;Puerta C como entrada
;Selecciona banco 0

;El TMR1 acta como contador externo asncrono y con un preescaler de 1:1

Loop

movlw b'00000010'
movwf T1CON

;TMR1 Off

clrf
clrf

TMR1L
TMR1H

;Puesta a 0 del TMR1

call
call
movlw
call

UP_LCD
LCD_INI
b'00001100'
LCD_REG

movlw
movwf
movlw
movwf

b100
Delay
b195
TMR0

;Configura puerto para el LCD


;Inicia el LCD
;LCD On, cursor y blink Off
;Prepara temporizacin total de 1000mS (1")
;TMR0 comienza a temporizar 10 ms

bsf
T1CON,0
movlw b'10100000'
movwf INTCON

;Habilita interrupcin del TMR0

nop
goto

;Bucle

Loop

;TMR1 en On, comienza la cuenta de pulsos externos

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

75

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 12
El TMR2. Temporizacin simple, segundero
El TMR2 provoca una interrupcin cada 10 mS. Transcurridas 100 interrupciones, el tiempo
total transcurrido es de 1 segundo.
El display conectado a la puerta B, cuenta intervalos de 1 segundo.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Delay
Contador

equ
equ

0x20
0x21

;Variable de temporizacin
;Variable del contador de segundos

org
goto

0x04
Inter

;Vector de interrupcin

org
goto

0x05
Inicio

;-----------------------------------------------------------------------------------------------------------------------------;Tabla: Esta rutina convierte el cdigo binario presente en los 4 bits de menos peso del reg. W en su
;equivalente a 7 segmentos. El cdigo 7 segmentos retorna tambin en el reg. W
Tabla:

addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

PCL,F
b'00111111'
b'00000110'
b'01011011'
b'01001111'
b'01100110'
b'01101101'
b'01111101'
b'00000111'
b'01111111'
b'01100111'

;Desplazamiento sobre la tabla


;Dgito 0
;Dgito 1
;Dgito 2
;Dgito 3
;Dgito 4
;Dgito 5
;Dgito 6
;Dgito 7
;Dgito 8
;Dgito 9

;Programa de tratamiento de la interrupcin que provoca el TMR2 cada 10mS.


Inter

No_es_1_seg

decfsz
goto
incf
movlw
subwf
btfsc
clrf
movf
call
movwf
movlw
movwf
bcf
retfie

Delay,F
No_es_1_seg
Contador,F
b10
Contador,W
STATUS,Z
Contador
Contador,W
Tabla
PORTB
b100
Delay
PIR1,TMR2IF

;Ha pasado un segundo ??


;No
;Si, incrementa el contador de segundos
;Contador > 9 ??
;Si, ponerlo a 0
;Convierte a 7 segmentos
;Visualiza sobre el display
;Reinicia variable delay
;Repone el flag del TMR2

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

76

TRABAJO Y EXPLICACIN PIC 16F87X


Inicio

clrf
bsf
clrf
bsf
movlw
movwf
bcf

PORTB
STATUS,RP0
TRISB
PIE1,TMR2IE
b195
PR2
STATUS,RP0

2 DPE
;Desconecta salidas
;Selecciona banco 1
;Puerta B se configura como salida
;Habilita interrupcin del TMR2
;Carga registro de periodos con 195
;Selecciona banco 0

;El TMR2 emplea un preescaler y un postcaler de 1:16 (total 1:256). Trabajando a una frecuencia de 20
;MHZ el TMR2 evoluciona cada 3.2uS (preescaler 1:16). La cuenta avanza hasta alcanzar el valor del
;registro de periodos (195), con lo que el tiempo transcurrido es de 624 uS. Este lapsus se repite 16 veces
;(postcaler 1:16) antes de provocar la interrupcin (al de 9984 uS).

Loop

movlw b'01111111'
movwf T2CON
clrf
TMR2

;TMR2 On, preescaler/postcaler = 1:16


;Inicia el TMR2

movlw b100
movwf Delay

;Inicia variable de delay

movlw b'11000000'
movwf INTCON

;Habilita interrupciones

clrf

Contador

;Inicia el contador de segundos

nop
goto

Loop

;Bucle

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

77

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 13
Los mdulos CCPx. Modo de Captura.
Medida del tiempo entre un pulso y el siguiente.
El ejemplo emplea el mdulo CCP1 y trata de capturar el valor del TMR1 cada vez que lleguen
un flanco descendente y otro ascendente por la lnea RC2/CCP1. Conocida la velocidad a la que
evoluciona el TMR1, se puede determinar el lapsus de tiempo transcurrido entre ambos flancos, lo que
nos dar el tiempo transcurrido entre el final de un pulso y el comienzo del siguiente.
La pantalla LCD visualiza dicho lapsus de tiempo expresado en microsegundos.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Lcd_var
Byte_L
Byte_H
BCD_2
BCD_1
BCD_0
Contador
Temporal
Captura
Cap_1_L
Cap_1_H

equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ

0x20
0x22
0x23
0x24
0x25
0x26
0x27
0x28
0x29
0x2a
0x2b

org
goto

0x04
Inter

org
goto

0x05
Inicio

;Variables para las rutinas de manejo del LCD


;Parte baja del byte a convertir
;Parte alta del byte a convertir
;Byte 2 de conversin a BCD
;Byte 1 de conversin a BCD
;Byte 0 de conversin a BCD
;Variable de contaje
;Variable temporal
;N de capturas
;Variables temporales para las capturas
;Vector de interrupcin

include "LCD_CXX.INC"

;Incluye rutinas de manejo del LCD

;Visualizar: Visualiza sobre la pantalla LCD los cinco dgitos situados en las variables
;BCD_0, BC_1 y BCD_2
Visualizar

Visual_loop

movlw
call
movlw
movwf
movlw
movwf
swapf
andlw
iorlw
call
movf
andlw
iorlw
call
decf
decfsz
goto
movlw

0x80
LCD_REG
3
Contador
BCD_0
FSR
INDF,W
0x0f
0x30
LCD_DATO
INDF,W
0x0f
0x30
LCD_DATO
FSR,F
Contador,F
Visual_loop
''

;Posiciona el cursor
;Inicia contador de bytes a convertir
;Inicia puntero ndice
;Convierte a ASCII el nible de ms peso
;Lo visualiza
;Convierte a ASCII el nible de menos peso
;Lo visualiza
;Siguiente byte

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

78

TRABAJO Y EXPLICACIN PIC 16F87X


call
movlw
call
movlw
call
return

LCD_DATO
0xe4
LCD_DATO
'S'
LCD_DATO

2 DPE
;Visualiza ' '
;Visualiza micro
;Visualiza 'S'

;16Bits_BCD: Esta rutina convierte un nmero binario de 16 bits situado en Byte_H y Byte_L y, en 5
;dgitos BCD que se depositan en las variables BCD_0, BCD_1 y BCD_2, siendo esta ltima la de menos
;peso.
Bits16_BCD

Loop_16

Ajuste

Ajuste_BCD

bcf
clrf
bsf
clrf
clrf
clrf

STATUS,C
Contador
Contador,4
BCD_0
BCD_1
BCD_2

rlf
rlf
rlf
rlf
rlf
decfsz
goto
return

Byte_L,F
Byte_H,F
BCD_2,F
BCD_1,F
BCD_0,F
Contador,F
Ajuste

movlw
movwf
call
incf
call
incf
call
goto

BCD_2
FSR
Ajuste_BCD
FSR,F
Ajuste_BCD
FSR,F
Ajuste_BCD
Loop_16

movf
addlw
movwf
btfsc
movwf
movf
addlw
movwf
btfsc
movwf
return

INDF,W
0x03
Temporal
Temporal,3
INDF
INDF,W
0x30
Temporal
Temporal,7
INDF

;Carga el contador con 16


;Puesta a 0 inicial

;Desplaza a izda. (multiplica por 2)

;Inicia el ndice
;Ajusta el primer byte
;Ajusta el segundo byte

;Mayor de 7 el nibble de menos peso ??


;Si, lo acumula

;Mayor de 7 el nibble de menos peso ??


;Si, lo acumula

;Programa de tratamiento de la interrupcin que provoca el mdulo CCP1 cada vez que se detecta,
;primero un flanco descendente y, luego un ascendente por la lnea RC2/CCP1.
Inter

bcf
btfsc
goto
incf
movf
movwf
movf
movwf
bsf

PIR1,CCP1IF
Captura,0
Medir
Captura,F
CCPR1L,W
Cap_1_L
CCPR1H,W
Cap_1_H
CCP1CON,0

;Repone el flag del mdulo CCP1


;Es la captura del flanco ascendente ??
;Si, medir el tiempo transcurrido entre ambas
;No, ha sido la captura del flanco descendente

;Salvar, temporalmente, el 1er valor capturado


;Capturar al flanco ascendente

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

79

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

retfie
Medir

movf
subwf
movwf
btfss
incf
movf
subwf
movwf
call
incf
call
bcf
retfie

Cap_1_L,W
CCPR1L,W
Byte_L
STATUS,C
Cap_1_H,F
Cap_1_H,W
CCPR1H,W
Byte_H
Bits16_BCD
Captura,F
Visualizar
CCP1CON,0

;Es la captura del flanco ascendente

;Restar el tiempo entre la 2 captura y la 1


;Convertir a BCD
;Capturar el 1er. flanco
;Salida a pantalla LCD
;Captura al flanco descendente

;-----------------------------------------------------------------------------------------------------------------------------Inicio

clrf
clrf
bsf
movlw
movwf
clrf
clrf
movlw
movwf
bsf
bcf

PORTB
PORTA
STATUS,RP0
b'00000110'
ADCON1
TRISB
TRISA
b'11111111'
TRISC
PIE1,CCP1IE
STATUS,RP0

call
call
movlw
call

UP_LCD
LCD_INI
b'00001100'
LCD_REG

;Desconecta salidas
;Selecciona banco 1
;Puerta A E/S digitales
;Puerta B se configura como salida
;Puerta A salidas
;Puerta C entrada
;Habilita interrupcin del mdulo CCP1
;Selecciona banco 0
;Configura puertos para el LCD
;Inicia el LCD
;LCD On, cursor y blink Off

;El TMR1 acta en el modo temporizador con reloj interno y un preescaler 1:8 evoluciona cada 1.6uS.
;Segn esto, el periodo mximo que se puede medir ser en torno a los 100mS (10Hz). El periodo mnimo
;estar en torno a los 1.6 uS (62KHz). Para otros rangos se debe seleccionar un preescaler diferente.
movlw b'00110001'
movwf T1CON

;TMR1 en On, preescaler 1:8

movlw b'11000000'
movwf INTCON

;Habilita interrupciones

;El mdulo CCP1 acta en modo de captura al flanco descendente

Loop

movlw b'00000100'
movwf CCP1CON

;Mdulo CCP en On

clrf

Captura

;Inicia captura en el 1er. flaco descendente

nop
goto

Loop

;Bucle

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

80

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 14
Los mdulos CCPx. Modo de Comparacin.
El TMR1 cuenta tantos pulsos externos como se indique mediante los interruptores RA5-RA0.
Cada vez que se alcanza el valor fijado, la salida RB0 cambia de estado.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
org
goto
org
goto

0x04
Inter
0x05
Inicio

;Vector de interrupcin

;Programa de tratamiento de la interrupcin que provoca el mdulo CCP1 cada vez que el TMR1 cuenta
;tantos pulsos externos como los prefijados mediante las entradas RA5-RA0.
Inter

bcf
bcf
clrf
clrf
movlw
xorwf
bsf
retfie

PIR1,CCP1IF
T1CON,TMR1ON
TMR1L
TMR1H
b'00000001'
PORTB,F
T1CON,TMR1ON

;Repone el flag del mdulo CCP1


;TMR1 en Off
;Puesta a 0 del TMR1
;RB0 cambia de estado
;TMR1 en On

;-----------------------------------------------------------------------------------------------------------------------------Inicio

clrf
clrf
bsf
movlw
movwf
clrf
movlw
movwf
movwf
bsf
bcf

PORTB
PORTA
STATUS,RP0
b'00000110'
ADCON1
TRISB
b'00111111'
TRISA
TRISC
PIE1,CCP1IE
STATUS,RP0

;Desconecta salidas
;Selecciona banco 1
;Puerta A E/S digitales
;Puerta B se configura como salida
;Puerta A entradas
;RC0 entrada
;Habilita interrupcin del mdulo CCP1
;Selecciona banco 0

;El TMR1 acta en el modo contador de pulsos externos sensible al flanco ascendente y con un preescaler
;de 1:1. Estos pulsos pueden ser suministrador por el generador del entrenador
movlw b'00000010'
movwf T1CON

;TMR1 en Off

movlw b'11000000'
movwf INTCON

;Habilita interrupciones

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

81

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

;El mdulo CCP1 acta en modo de comparacin e interrupcin al coincidir


movlw b'00001010'
movwf CCP1CON

Loop

;Mdulo CCP en modo comparacin

clrf
clrf
clrf

CCPR1H
TMR1L
TMR1H

;Puesta a 0 de la parte alta del valor a comparar


;Puesta a 0 del TMR1

bsf

T1CON,TMR1ON

;TMR1 en On, comienza a contar

clrf
movf
andlw
movwf
goto

CCPR1H
PORTA,W
b'00111111'
CCPR1L
Loop

;Pone a 0 la parte alta del valor a comparar


;Lee las entradas RA5-RA0
;Ajusta la parte baja del valor a comparar
;Bucle

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

82

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 15
Los mdulos CCPx. Modo PWM. Modulacin de anchura de pulsos.
Consiste en generar una seal de onda cuadrada por la lnea RC2/CCP1 cuyo periodo puede
ser modificado as como la anchura del pulso (Duty Cycle). El periodo se determina segn la frmula
T=(PR2+1)*4*Tosc*TMR2 preescaler. La duracin del pulso o "Duty Cycle" (d) se determina segn
d=(CCPR1L:CCPCON1<5:4>)*Tosc*TMR2 preescaler.
El ejemplo emplea al mdulo CCP1 con salida de seal por la lnea RC2/CCP1 y un preescaler
de 16. La seal de salida tiene un periodo de 640uS. La anchura del ciclo "Duty" es variable y se
determina, segn el valor binario de los interruptores del entrenador (RA5-RA0)
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Temporal

equ

0x20

;Variable temporal

Periodo

equ

b200

;Periodo 640uS (200*Preescaler de 16*0.2)

org

0x05

;-----------------------------------------------------------------------------------------------------------------------------Inicio

clrf
bsf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
bcf

PORTC
STATUS,RP0
0x06
ADCON1
b'00111111'
TRISA
b'11111011'
TRISC
Periodo-1
PR2
STATUS,RP0

;Borra salidas
;Selecciona banco 1
;Puerta A digital
;Puerta A entrada
;RC2 salida
;Carga el registro de periodos
;Selecciona banco 0

;El mdulo CCP1 acta en el modo PWM con salida de seal por RC2/CCP1
movlw b'00001100'
movwf CCP1CON
;El TMR2 trabaja con un preescaler 1:16 por lo que con una frecuencia de 20MHz evoluciona
;cada 3.2uS ((4*Tosc)*16)

Loop

movlw b'00000111'
movwf T2CON

;T2 en On

movf
andlw
movwf
goto

;Carga la anchura del pulso (n*8*Prescaler de 16)


;Bucle infinito

PORTA,W
b'00111111'
CCPR1L
Loop

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

83

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

PROGRAMA 16
El mdulo conversor ADC.
Los dispositivos PIC16F87X disponen de un convertidor A/D de 10 bits de resolucin y 5 u 8
canles de entrada analgica. Con 5 Vref=4.8 mV/Bit; con 2.5 Vref=2.4 mV/Bit
El ejemplo propone realizar la conversin de la tensin presente en el canal RA0/AN0. Esta se
puede variar con el potencimetro P1 del entrenador. El resultado de la conversin se visualiza, en
binario, sobre la pantalla LCD.
List
p=16F876
;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
Lcd_var
Temporal_1

equ
equ

0x20
0x22

org
goto

0x05
Inicio

;Variables de las rutinas LCD


;Variable temporal

include "LCD_CXX.INC"

;Incluye rutinas de manejo del LCD

;Visualiza: Esta rutina coge los 10 bits resultantes de la conversin, presentes en ADRESH y ADRESL,
;los convierte a caracteres ACII (0 o 1) y los visualiza sobre el LCD.
Visualiza:

Visual_loop

Bit_1
Visu_1

movlw
call
movlw
movwf
bsf
rlf
bcf
rlf
btfsc
goto
movlw
goto
movlw
call
decfsz
goto
return

0x80
LCD_REG
b9
Temporal_1
STATUS,RP0
ADRESL,F
STATUS,RP0
ADRESH,F
STATUS,C
Bit_1
'0'
Visu_1
'1'
LCD_DATO
Temporal_1,F
Visual_loop

;Sita el cursor del LCD


;N de caracteres a visualizar

;Rotacin del siguiente bit


;Testea el bit a visualizar
;Est a 1

;Visualiza el "0" o el "1" sobre el LCD


;Siguiente caracter

;-----------------------------------------------------------------------------------------------------------------------------Inicio

clrf
clrf
bsf
movlw
movwf
clrf
clrf
bcf

PORTA
PORTB
STATUS,RP0
b'00000110'
ADCON1
TRISB
TRISA
STATUS,RP0

call
call
movlw
call

UP_LCD
LCD_INI
b'00001100'
LCD_REG

;Selecciona banco 1
;Puerta A E/S digitales
;Puerta B se configura como salida
;RA5-RA0 salidas
;Selecciona banco 0
;Configura E/S para el LCD
;Secuencia de inicio del LCD
;LCD On, cursor y blink Off

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

84

TRABAJO Y EXPLICACIN PIC 16F87X

2 DPE

;Se activa el ADC y se selecciona el canal RA0/AN0. Frecuencia de trabajo Fosc/32


movlw b'10000001'
movwf ADCON0
Loop

ADC_Wait

;ADC en On, seleciona canal AN3

bsf
movlw
movwf
clrf
bcf
bcf
nop
bsf

STATUS,RP0
b'00111111'
TRISA
ADCON1
STATUS,RP0
PIR1,ADIF

;Selecciona pgina 1
;Puerta A entradas
;Puerta A entradas analgicas
;Selecciona pgina 0
;Restaura el flag del conversor AD

ADCON0,GO

;Inicia la conversin

btfss
goto

PIR1,ADIF
ADC_Wait

;Fin de conversin ??
;Todava no

;Las lneas de la Puerta A se reconfiguran como salidas digitales para la visualizacin


bsf
movlw
movwf
bcf
call
call
goto

STATUS,RP0
b'11000111'
ADCON1
STATUS,RP0
UP_LCD
Visualiza
Loop

;Selecciona banco 1
;Puerta A digital
;Selecciona banco 0
;Reconfigura E/S para el LCD
;Visualiza el resultado de la conversin

end

DESARROLLO PROYECTOS Y PROTOTIPOS ELECTRNICOS

85

También podría gustarte