Está en la página 1de 43

CURSO DE MICROCONTROLADORES

PIC16F87X Fernando Remiro Domínguez


Profesor de Sistemas Electrónicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

Equipos de desarrollo para


trabajar con la familia de
microcontroladores PIC16F87X.

✦ Procesador de arquitectura
RISC avanzada
✦ Juego de solo 35 instruccio-
nes de 14 bits de longitud.
Todas ellas se ejecutan en
un ciclo de instrucción,
menos las de salto que tar-
dan dos.
NOVEDADES

✦ Hasta 8K palabras de 14 bits


para la Memoria de Progra-
ma, tipo FLASH en los
modelos 16F876 y 16F877
y 4KB de memoria para los
omenzamos este formas se recomienda a los lec- PIC 16F873 y 16F874.
72
RESISTOR
C nuevo curso des-
pués de la acepta-
ción que han
teniendo los ante-
riores relacionados con el mun-
do de los microcontroladores
PIC. En esta Revista se han
tores que vayan a seguir este
curso que consigan el software
MPLAB que se puede bajar de
la web de Arizona Microchip
www.microchip.com, así mis-
mo, se necesitará un programa-
dor para los microcontrolado-
✦ Hasta 368 Bytes de memoria
de Datos RAM.
✦ Hasta 256 Bytes de memoria
de Datos EEPROM.
✦ Pines de salida compatibles
para el
16C73/74/76/77.
PIC

publicado con anterioridad el res, es valido cualquiera de los ✦ Hasta 14 fuentes de interrup-
“Curso de aplicaciones con publicados en esta Revista, ción internas y externas.
microcontroladores PIC” basa- pero como ya hemos dicho a lo ✦ Pila de 8 niveles.
do en el microcontrolador PIC largo del curso plantearemos ✦ Modos de direccionamiento
16F84, escrito por el Dr. Euge- alguno de bajo costo. Espera- directo e indirecto.
nio Martín Cuenca, (revistas nº mos que os guste el curso y lo ✦ Power-on Reset (POP).
161 a 171), y el “Curso de pro- disfrutéis. ✦ Temporizador Power-on
gramación de Microcontrola- (POP) y Oscilador Tempori-
dores PIC: El MPLAB”, escri- El corazón de los zador Start-Up (OST).
to por el profesor Fernando Microcontroladores ✦ Perro Guardián (WDT).
Remiro Domínguez (revistas nº PIC16F87X ✦ Código de protección pro-
179-187). En el número 189 gramable.
hemos publicado un “Módulo La mejor forma de comen- ✦ Debugger In-Circuit
de aprendizaje sobre microcon- zar a estudiar un microcontrola- ✦ Modo SLEEP de bajo con-
troladores PIC” diseñado por el dor, en este caso una familia de sumo.
profesor Juan de Dios Calle, microcontroladores es la de ver ✦ Programación serie en cir-
sobre el que se podrán realizar sus características más relevan- cuito con dos pines.
las prácticas que se diseñare- tes, y es justamente lo que ✦ Solo necesita 5V para pro-
mos para este curso. No obs- vamos a hacer en las siguientes gramarlo en este modo.
tante, iremos planteando a lo líneas: ✦ Voltaje de alimentación com-
largo de este curso, la realiza- prendido entre 2 y 5,5 V.
ción practica de herramientas Principales Características ✦ Bajo consumo:
de fácil desarrollo y bajo coste, Enumeramos las prestaciones y < 2 mA valor para 5 V y 4 Mhz
para hacer verdaderamente dispositivos especiales que 20 µA para 3V y 32 Mhz
práctico este curso. De todas rodean a los PIC16F87X.. <1 µA en standby
Dispositivos Periféricos
✦ Tirner0: Temporizador-con-
tador de 8 bits con preesca-
ler de 8 bits
✦ Timerl: Temporizador-conta-
dor de 16 bits con preesca-
ler que puede incrementarse
en modo sleep de forma
externa por un cristal/clock.
✦ Timer2: Temporizador-con-

NOVEDADES
tador de 8 bits con preesca-
ler y postescaler.
✦ Dos módulos de Captura,
Comparación, PWM
(Modulación de Anchura de
Impulsos).
✦ Conversor A/D de 10 bits.
✦ Puerto Serie Síncrono Mas-
ter (MSSP) con SPI e I2C
(Master/Slave). Encapsulado DIP,SOIC de 28 pines.
✦ USART/SCI (Universal
Syncheronus Asynchronous
Receiver Transmitter) con 9
bit.
73
RESISTOR
✦ Puerta Paralela Esclava
(PSP) solo en encapsulados
con 40 pines
Diferencias entre los
modelos de 28 y los
de 40 patitas

El PIC 1 6F873 y el 876 tie-


nen 28 pines, mientras que el
PIC 16F874 y 877 tienen 40.
Nos centraremos en el PIC
16F873 y las diferencias que
tiene con sus hermanos son
mínimas y se detallan a conti-
nuación:

1. Los modelos de 40 pines


disponen de 5 Puertos de E/S:
A, B, C, D y E, mientras que
los de 28 solo tienen 3 Puer-
tos: A, B y C.
2. Los modelos de 40 pines
tienen 8 canales de entrada al
Conversor A/D, mientras que
los de 28 solo tienen 5 canales.
3. Sólo poseen la Puerta Para-
lela Esclava los PIC 16F87X
de 40 pines. Encapsulado PDIP de 40 pines.
Características 16F873 16F874 16F876 16F877

Frecuencia Máxima DC-20Mhz DX-20Mhz DX-20Mhz DX-20Mhz


Memoria de programa 4KB 4KB 8KB 8KB
FLASH Palabra de 14 bits
Posiciones RAM de datos 192 192 368 368
Posiciones EEPROM de datos 128 128 256 256
Ports E/S A, B y C A, B, C y D A, B y C A, B, C y D
Nº de Pines 28 40 28 40
Interrupciones 13 14 13 14
Timers 3 3 3 3
NOVEDADES

Módulos CCP 2 2 2 2
Comunicaciones Serie MSSP, USART MSSP,USART MSSP,USART MSSP, USART
Comunicación Paralelo - PSP - PSP
Líneas de entrada en 5 8 5 8
Convertidor A/D de 10 bits
Juego de Instrucciones 35 instrucciones 35 instrucciones 35 instrucciones 35 instrucciones
Longitud de la instrucción 14 bits 14 bits 14 bits 14 bits

Tabla 1.- Comparación de entre los PIC de la Familia 16F87X.

74
RESISTOR
Los PIC 16F87X
Bajo el nombre de esta sub-
En la Tabla 1 se muestran las
características comparativas
Ejercicio Práctico
Para todos aquellos que ya
familia de microcontroladores, más relevantes de esta familia habéis trabajado con algún
actualmente encontramos cua- de microcontroladores : microcontrolador de Micro-
tro modelos: EL PIC chip, como por ejemplo el
16F873/4/6 y 7. Estos micro- Descripción global PIC16F84 o ya disponéis de
controladores disponen de una del dispositivo un programador para este
memoria de programa FLASH La familia consta de cuatro tipo de microcontroladores,
de 4 a 8 KBytes de 14 bits, con- dispositivos (PIC16F873, os proponemos un primer
siderablemente superior frente PIC16F874, PIC16F876 y programa que será muy fácil
al PIC 16F84 en el que solo dis- PIC16F877). Los PIC de seguir, ya que el juego de
poníamos de l Kbyte de 14 bits. 16F876/873 entran en el blo- instrucciones es exactamente
Esta característica, junto con la que de dispositivos encapsula- el mismo que para el
posibilidad de realizar, con las dos en 28 pines y los PIC PIC16F84. Se trata de leer el
herramientas adecuadas, un 16F877/874 entran en el blo- valor de las líneas del POR-
debugger en circuito, nos han que de dispositivos encapsula- TA, que conectaremos a unos
parecido de lo más interesante dos en 40 pines. Los dispositi- interruptores que nos den un
para el aprendizaje de esta fami- vos de 28 pines no tienen “0” o un “1”, y mostrar dicho
lia de microcontroladores y pos- implementado el puerto para- valor sobre unos diodos
terior desarrollo de proyectos. lelo esclavo. LED’s conectados al PORTB.
De los microcontroladores Las siguientes figuras Hay que tener en cuenta
indicados, el 16F873 y el corresponden a los diagramas que las entradas del PORTA
16FS76 son de 28 pines, mien- de bloque de los dispositivos. se configuran como entradas
tras que 16F874 y el 16F877 Los de 28 pines en la Figura 3 analógicas, al hacer un reset,
tienen 40 patillas, lo que les y los de 40 pines en la Figura por lo tanto, lo primero que
permite disponer de hasta 33 4, y en la Tabla 2 se muestra tendremos que hacer, es con-
líneas de E/S. En su arquitectu- un listado de cada uno de los figurar estas entradas en el
ra además incorporan: pines corresponden a los dis- registro ADCON1 como
✦ Varios Timer positivos de 40 que tienen su entradas. Esto lo veremos en
✦ USART correspondiente ptilla en los su momento cuando estudie-
✦ Bus 12C dispositivos de 28 pines. mos los registros de configu-
INFORMÁTICA
75
RESISTOR

Diagrama de bloques del PIC16F873 Y del PIC16F876.


Nombre Pin DIP PLCC QFP I/O/P Buffer Descripción
Pin# Pin# Pin# Tipo Tipo
OSC1/CLKIN 13 14 30 I ST/CMOS(4) Entrada externa de reloj
OSC2/CLKOUT 14 15 31 O — Salida oscilador de cristal. Conexión a
cristal o resonador en modo oscilador
a cristal. En modo RC, la salida OSC2 es
1/4 de la frecuencia de OSC1,
es el ciclo de instrucción.
MCLR/Vpp/THV 1 2 18 I/P ST Entrada Master Clear (reset) o entrada de
voltaje de programación o alto voltaje de
prueba en modo control. El Reset se activa
con nivel bajo.
PORTA es bidireccional de Entrada/Salida
RA0/AN0 2 3 19 I/0 TTL RA0 puede ser entrada analógica 0
RA1/AN1 3 4 20 I/O TTL RA1 puede ser entrada analógica 1
RA2/AN2/VREF- 4 5 21 I/O TTL RA2 puede ser entrada analógica 2 o
voltaje negativo de referencia.
RA3/AN3/VREF+ 5 6 22 I/O TTL RA3 puede ser entrada analógica
RA4/TOCKI 6 7 23 I/O ST RA4 puede ser entrada de reloj a TMR0.
La salida es de tipo “Drenador Abierto”
RA5/SS/AN4 7 8 24 I/O TTL RA5 puede ser entrada analógica 4 o
NOVEDADES

la selección del puerto esclavo síncrono.


PORTB es bidireccional de Entrada/Salida.
Puede programarse con polarización
interna “Pull-up”
RB0/INT 33 36 8 I/O TTL/ST(1) RB0 puede ser entrada externa de interrupción
RB1 34 37 9 I/O TTL
RB2 35 38 10 I/O TTL
RB3/PGM 36 39 11 I/O TTL RB3 puede ser entrada de bajo voltaje
de programación
RB4 37 41 14 I/O TTL Interrupciones por cambio de estado en la patilla
RB5 38 42 15 I/O TTL Interrupciones por cambio de estado en la patilla

76
RESISTOR
RB6/PGC 39 43 16 I/O TTL/ST(2) Interrupciones por cambio de estado en la patilla
o patilla In-Circuit Debugger o reloj serie para
programación.
RB7/PGD 40 44 17 I/O TTL/ST(2) Interrupciones por cambio de estado en la patilla
o patilla In-Circuit Debugger o datos serie
para programación.
PORTC es bidireccional de Entrada/Salida
RC0/T1OSO/T1CKI 15 16 32 I/O ST RC0 puede ser salida oscilador Timer1
o entrada de reloj para Timer1
RC1/T1OSI/CCP2 16 18 35 I/O ST RC0 puede ser entrada oscilador Timer1
o Captu2/COMP2 Salida/PWM2.
RC2/CCP1 17 19 36 I/O ST RC2 Puede ser Captu1 Entrada/Comp1
salida/PWM1.
RC3/SCK/SCL 18 20 37 I/O S/T RC3 puede ser entrada/salida del reloj síncrono
para los modos SPI e I2C.
RC4/SDI/SDA 23 25 42 I/O ST RC4 puede ser datos de entrada SPI (modo SPI)
o datos I/O (modo I2C).
RC5/SDO 24 26 43 I/O ST RC5 puede ser datos de salida SPI (modo SPI).
RC6/TX/CK 25 27 44 I/O ST RC6 Puede ser transmisión asíncrona USART
o reloj Síncrono.
RC7/RX/DT 26 29 1 I/O ST RC7 puede ser recepción Asíncrona USART
o datos Síncronos.
PORTD es bidireccional de Entrada/Salida
o puerto esclavo paralelo
RD0/PSP0 19 21 38 I/O ST/TTL(3)
RD1/PSP1 20 22 39 I/O ST/TTL(3)
RD2/PSP2 21 23 40 I/O ST/TTL(3)
RD3/PSP3 22 24 41 I/O ST/TTL(3)
RD4/PSP4 27 30 2 I/O ST/TTL(3)
RD5/PSP5 28 31 3 I/O ST/TTL(3)
RD6/PSP6 29 32 4 I/O ST/TTL(3)
RD7/PSP7 30 33 5 I/O ST/TTL(3)
Nombre Pin DIP PLCC QFP I/O/P Buffer Descripción
Pin# Pin# Pin# Tipo Tipo
PORTE es bidireccional de Entrada/Salida
RE0/RD/AN5 8 9 25 I/O ST/TTL(3) RE0 puede ser control de lectura del puerto
paralelo, 0 entrana analógica 5
RE1/WR/AN6 9 10 26 I/O ST/TTL(3) RE1 puede ser control de escritura del
puerto paralelo o entrada analógica 6
RE2/CS/AN7 10 11 27 I/O ST/TTL(3) RE2 puede ser control de selección del
puerto paralelo, entrana analógica 7
VSS 12,31 13,34 6,29 P –– Masa lógica y patillas de Entrada/Salida
VDD 13,31 12,35 7,28 P –– Positivo para lógica y patillas
de Entrada/Salida
NC –– 1,17,28, 12,13, –– No tienen conexión interna.
40 33,34 Deben mantenerse sin conexión.
Leyenda: I = Entrada O = Salida I/O = Entrada/Salida P = Alimentación
–– = No usada TTL = Entrada TTL ST = Entrada Trigger Schmitt
Notas.-
1: Este buffer es una entrada Trigger Schmitt cuando se configura como interrupción externa
2: Este buffer es una entrada Trigger Schmitt en modo programación
3: Este buffer es una entrada Trigger Schmitt cuando se configura como I/O y entrada TTL en modo puerto paralelo

INFORMÁTICA
4: Este buffer es una entrada Trigger Schmitt cuando se configura en modo oscilador RC y entrada CMOS en otros casos
Descripción de los Pines del PIC 16F874 y PIC16F877.

77
RESISTOR

Diagrama de Bloques del PIC16F874 y 16F877.


ración del convertidor Analó-
gico/Digital, pero vale la
pena que lo comentemos
aquí.

El organigrama del progra-


ma es el que se muestra en la
Figura 5 y el programa es el
de la Tabla 3. Por supuesto que
este programa también pode-
mos simularlo en el programa
MPLAB, que como ya hemos
comentado en números ante-
riores es gratuito y de libre
distribución.
NOVEDADES

Organigrama del Programa ES1.

;***************************************************************************************************
; Programa ES1.ASM Fecha : 11- Febrero-2002
; Este programa configura las entradas del PORTA como entradas digitales y lee el
; contenido del PORTA y muestra su valor sobre los diodos LED conectados al PORTB
; Revisión : 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instrucción: 1 MHz = 1 uS
; Perro Guardián: habilitado Tipo de Reloj : XT

78
RESISTOR
; Protección del código: OFF
;****************************************************************************************************
List p=16F876 ;Tipo de procesador
include “P16F876.INC” ;Definiciones de registros internos

ORG 0x00 ;Vector de Reset


goto INICIO

ORG 0x05 ;Salva el vector de interrupción

INICIO clrf PORTB ;Borra los latch de salida del PORTB


bsf STATUS,RP0 ;Selecciona banco 1
movlw b’00000110’
movwf ADCON1 ;PORTA E/S digitales
clrf TRISB ;Configura PORTB como salida
movlw b’00011111’
movwf TRISA ;Configura PORTA como entrada
bcf STATUS,RP0 ;Selecciona banco 0

BUCLE movf PORTA,W ;Lee el PORTA sobre W


movwf PORTB ;Escribe el valor de W en el PORTA
goto BUCLE ;Salta a BUCLE

END

Programa ES1.asm.
CURSO DE MICROCONTROLADORES
PIC16F87X (...Y II)
NUESTROS CURSOS

44
RESISTOR

ORGANIZACIÓN dispositivos de PIC16F877/876 Funciones Especiales (FSR). Los


DE LA MEMORIA tienen 8K x 14 posiciones de bits RP1 (STATUS <6>) y RP0
memoria de programa tipo (STATUS <5> ) seleccionan cada
FLASH y el PIC 16F873/874 uno de estos Bancos, de acuerdo a
Esta familia de microcontrolado- tienen 4Kx 14. Acceder a una la Tabla1.
res, al igual que el PIC16F84, posición de memoria no
dispone den de tres bloques de implementada, provoca la lectura RP1 RP0 Banco
memoria. La Memoria de 0 0 Banco 0
o escritura de la posición de
Programa y la Memoria de Datos 0 1 Banco 1
RAM que tienen los buses sepa- memoria envolvente.
1 0 Banco 2
rados para poder permitir el El vector de Reset está en la 1 1 Banco 3
acceso simultáneo a estos dos posición de memoria 0000h y el
bloques y la Memoria de datos vector de Interrupción está en la Tabla 1.- Selección de los
EEPROM. posición de memoria 0004h. Bancos de memoria RAM con
RP0 y RP1
Organización de la Organización de la
Memoria de programa Memoria de datos En cada Banco hay 7Fh posi-
Los dispositivos de PIC 16F87X La memoria de los datos se divide ciones de memoria (128 bytes).
Las posiciones más bajas están,
tienen un contador de programa de en los cuatro Bancos que contiene
reservadas para los Registros de
13 bits capaz de direccionar 8Kxl4 los Registros de Propósito Funciones Especiales. Por enci-
posiciones de memoria. Los Generales y los Registros de la ma de los Registros de Funciones
Las Figuras 1 y 2 muestran el mapa de memoria y Stack de los PIC16F876/7 y PIC16F873/4

NUESTROS CURSOS
45
RESISTOR

Figura 1.- Mapa de Memoria y Figura 2.- Mapa de Memoria y


STACK del PIC16F876/877 SACK del PIC16F873/874

Especiales se encuentran los tienen disponibles 80 bytes de en la Figura 4 en la que se presenta


Registros de Propósito General, memoria para datos (Registros la definición de los Bancos, tienen
que se utilizan como posiciones de Propósito General) que son disponibles 96 bytes en el Banco 0,
de memoria RAM estática. independientes los unos de los que son conjuntamente accedidos a
Todos están estructurados en otros. Los Bancos 2 y 3 tienen 16 través del Banco 2. El Banco 1
Bancos. Algunos Registros de bytes adicionales, que son tam- tiene igualmente 96 bytes, que tam-
Funciones Especiales están refle- bién independientes. Sin embar- bién son accesibles desde a través
jados en varios Bancos para go, los 16 bytes superiores de del Banco 3, lo que hace un total
reducir el código y tener un acce- memoria en cada Banco tienen de 96+96= 192 bytes.
so más rápido. Se puede ver el una “raiz” común. Accediendo a (Nota.- La memoria EEPROM
mapa de la memoria de datos y cualquiera de los 16 bytes en de Datos se describe en el aparta-
los registros especiales en las cualquier Banco, automática- do 3 de estos apuntes sobre las
Figuras 3 y 4. Si analizamos mente nos da acceso a los mis- hojas de características.)
estas figuras podemos ver como mos en el Banco 0 (70h a 7Fh).
efectivamente después de cada Esta forma de acceder puede ser REGISTROS DE
grupo de registros especiales de muy ventajosa en algunos casos. PROPÓSITO GENERAL
cada Banco están las posiciones Para los PIC16F876/7, la memo-
de memoria que pueden ser usa- ria disponible para datos en total Se puede acceder a cualquier
das para el almacenamiento de es de 96+80+16+80+16+80 = registro utilizando el direcciona-
datos. 368 bytes. miento directo o indirecto, en
En el caso de los Para el caso de los este último caso a través del
PIC16F876/7, los Bancos 0 a 3 PIC16F873/4, como puede verse registro FSR.
46
RESISTOR
47
RESISTOR
REGISTROS DE FUNCIONES zados como RAM estática. Un los periféricos. Los registros que
ESPECIALES listado de estos registros con afectan directamente a la CPU se
Los Registros de Funciones cada uno de sus bits es el que se describen seguidamente con
Especiales (SFR) son registros muestra en la Tabla 2. detalle. Aquellos registros rela-
usados por la CPU y los módulos Los Registros de Función cionados con el funcionamiento
periféricos para hacer trabajar el Especiales podemos clasificarlos de los periféricos se describen en
dispositivo como nosotros quere- en dos tipos, los correspondien- el apartado correspondiente al
mos. Estos registros están reali- tes a la CPU y los que controlan periférico.
NUESTROS CURSOS

50
RESISTOR

Seguidamente pasamos a describir cada uno de los bits de los Registros Especiales FSR.

REGISTRO DE STATUS (Direcciones 03h, 83h,103h, 183h)

" " " " "


R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x
IRP RP1 RP0 #T0 #PD Z DC C
Bit 7 Bit 0

bit 7: IRP: Selección de Bancos para el direccionamiento 1= Después de conectar VDD o al ejecutar la instrucción CLRWDT
indirecto 0 = Al ejecutar la instrucción SLEEP
1 = Bancos 2 y 3 (1 00h- 1 FFh) bit 2: Z: Flag de Cero
0= Bancos 0 y 1 (00h-FFh) 1= El resultado de la última operación aritmética o lógica
bit 6-5: RP1:RP0: Selección del Banco para el direcciona- es Cero
miento directo 0= El resultado de la última operación aritmética o lógica
11 = Banco 3 (1 80h- 1 FFh) es distinto cero
10 =Banco 2(100h-17Fh) bit 1: DC: Flag de acarreo en el 4º bit de menos peso
01 =Banco 1 (80h-FFh) 1 = Acarreo en la suma
00 = Banco 0 (00h-7Fh) 0 = No acarreo en la suma
Cada Banco es de 128 bytes En la resta es al contrario
bit 4:#TO: Flag de Timer Out bit 0:C: Flag de acarreo en el octavo bit
1= Después de conectar VDD o ejecutar CLRWDT o SLEEP 1 = Se ha producido un acarreo en la suma y no en la resta
0= Al desbordarse el temporizador de WDT 0= Se ha producido un acarreo en la resta y no en la suma
bit 3:#PD:Flag de Power Down Este bit también se utiliza en las instrucciones de rotación
REGISTRO OPTION u OPTION_REG (Dirección 81h,181h)

El Registro de OPTION_REG es un registro que puede ser leído o escrito y que contiene varios bits de
control para configurar la asignación del preescaler al TMR0 o al WDT, la interrupción externa, el TMR0 y
las resistencias de pull-up del PORTB.

Nota.- Asignar el preescaler como 1: 1 al registro TMR0, asigna el preescaler al Watchdog.

NUESTROS CURSOS
R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1 R/W-1
RBPU INTED T0CS T0SE PSA PS2 PS1 PS0
Bit 7 Bit 0

bit 7:#RBPU: Resistencia de Pull-up en, el PORTB 1 = El preescaler se le asigna al WDT


1=Resistencia de Pull-up desactivada 0 = El preescaler se le asigna al TMR0
0= Resistencia de Pull-up activada bit 2-0:PS2:PS0: Rango de actuación del preescaler
bit6 1:INTEDG:, Flanco, de control de interrupciones
1:Interrupción por flanco ascendente en el pin RB0/INT,
0:Interrupción por flanco: descendente en el pin RB0/INT PS2 PS1 PS0 Divisor de TMR0 Divisor de WDT
bit 5:T0SC. Selección del tipo de Reloj para TMRO 0 0 0 1:2 1:1
1 = Los pulsos se introducen a través del, pin RA4/TOCK1 0 0 1 1:4 1:2
0 = Los Pulsos de reloj internos- Fosc/4 0 1 0 1:8 1:4
bit 4:T0SE: Tipo de flanco para TMR0 0 1 1 1:16 1:8
1 = Incremento de TMR0 en cada flanco, descendente por 1 0 0 1:32 1:16
el pin RA4/TOCKI 1 0 1 1:64 1:32
0 = Incremento de TMR0 en cada flanco ascendente por el 1 1 0 1:128 1:64
pin RA4/TOCKI 1 1 1 1:256 1:128
bit 3:PSA: Asignación del Preescaler
51
RESISTOR
REGISTRO INTCON (Dirección 0Bh, 8Bh, l0Bh, 18Bh)

El registro INTCON es un registro de lectura y escritura que contiene los bit de habilitación de interrupcio-
nes por desbordamiento de TMR0 por cambio de nivel en el PORTB e interrupciones externas por la línea
RBO/INT.

" " "


R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
Bit 7 Bit 0

bit 7:GIE: bit de habilitación global de Interrupciones de nivel en el PORTB


1= Habilita el permiso de interrupciones 1= Habilita la interrupción
0= Inhabilita todas las interrupciones 0= Inhabilita la interrupción
bit 6:PEIE: bit de habilitación de interrupciones de los bit 2:T0IF: flag de indicación de desbordamiento de
periféricos que no se controla con el registro INTCON TMR0
1= Habilita el permiso de interrupciones de los periféri- 1= El TMR0 se ha desbordado. Se borra por software
cos 0= El TMR0 no se ha desbordado
0= Inhabilita las interrupciones de los periféricos bit 1:INTF: flag de estado de la interrupción externa INT
bit 5:T0IE: bit de habilitación de la interrupción por des- 1= La interrupción externa se ha producido. Se borra
bordamiento del TMR0 por software
1= Habilita la interrupción 0= La interrupción externa no se ha producido
0= Inhabilita la interrupción bit 0:RBIF: flag de indicación de interrupción por cambio
bit 4:INTE: bit de habilitación de la interrupción externa de nivel en PORTB
por el pin RB0/INT 1= Se ha producido un cambio de nivel en los pines
1= Habilita la interrupción RB7:RB4. Se borra por software.
0= Inhabilita la interrupción 0= No se ha producido un cambio de nivel en los pines
bit 3:RBIE: bit de habilitación de interrupción por cambio RB7:RB4
REGISTRO PIE1 (Dirección 8Ch)

Este registro contiene los bits individuales de habilitación de interrupciones de los periféricos.

Nota.—El bit PEIE (INTCON <6>) debe esta a uno para habilitar las interrupciones de
cualquiera de los periféricos.

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


NUESTROS CURSOS
PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
Bit 7 Bit 0

bit 7:PSPIE: bit de habilitación de inte- 1 = Habilita interrupción por recepción produce una captura o una comparación.
rrupción por lectura / escritura en el en el USAR 1= Habilita la interrupción del CCPI
Puerto Paralelo Esclavo. Para los 0 = Inhabilita interrupción por recep- 0=. Inhabilita la interrupción del CCPI
modelos de 40 pines. ción en el USAR bit 1:TMR2IE: bit de habilitación de inte-
1 = Habilita la interrupción por bit 4:TXIE: bit de interrupción al trans- rrupción por desbordamiento de TMR2
lectura/escritura en el PSP mitir por el USAR, cuando se vacía el que
0= inhabilita la interrupción por lectu- buffer. está emparejado con el registro PR2
ra/escritura en el PSP 1 = Habilita la interrupción de transmi- (92h)
bit 6:ADIF: bit de habilitación de inte- sión por el USAR 1= Habilita la interrupción por desborda-
rrupción por finalización de la conver- 0 = Inhabilita la interrupción de trans- miento de TMR2 emparejado a PR2
sión A/D misión por el USAR 0= Inhabilita la interrupción de TMR2
l = Habilita la interrupción del converti- bit 3:SSPIE: bit de habilitación de inte- emparejado a PR2
dor A/D rrupción por el Puerto Serie Síncrono bit 0:TMR1IE: bit de habilitación de inte-
0 = Inhabilita la interrupción del con- (SSP) rrupción por desbordamiento del TMRI
vertidor A/D 1= Habilita la interrupción del SSP 1= Habilita la interrupción por desborda-

52
RESISTOR
bit 5:RCIE: bit de habilitación de inte-
rrupción en recepción por el USAR,
cuando se llena el buffer,
0= Inhabilita la interrupción del SSP
bit 2:CCP1IE: bit de habilitación de inte-
rrupción del módulo CCPI cuando se
miento de TMR1
0= Inhabilita la interrupción por desbor-
damiento de TMR1

Nota 1.- PSPIE para los dispositivos de 28 pines, siempre mantiene este bit a cero

REGISTRO PIE2 (Dirección 8Dh)

El registro de PIE2 contiene los bit individuales que habilita las interrupciones del periférico CCP2,. la inte-
rrupción por colisión del SSP y la ininterrupción de escritura en la EEPROM.

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


--- 0 --- EEIE BCLIE -- -- CCP2IE
Bit 7 Bit 0

bit 7:No implementado: se lee como “0’ bit 3:BCLIE: Habilita la interrupción por colisión en el bus
bit 6: Reservado, Mantiene este bits a cero SSP cuando dos o más maestros tratan de transferir al
bit 5:No implementado: se lee como “0” mismo tiempo.
bit 4:EEIE: Habilita la interrupción por escritura en la 1 = Habilita la interrupción por colisión de bus SSP
EEPROM de datos 0 = Deshabilita la interrupción por colisión en el bus SSP.
1= Habilita la interrupción por escritura de la EEPROM de bit 2-1No implementados, se leen como “0”
datos bit 0:CCP2IE: Habilita la interrupción del modulo CCP2
0 =Deshabilita la interrupción por escritura en la EEPROM 1 = habilita la interrupción de CCP2
de datos 0 = inhabilita la interrupción de CCP2
REGISTRO PIR1 (Dirección 0Ch)
El registro de PIRI contiene los flags individuales que indican las interrupciones provocadas por los periféricos.

" " " " " " " "


R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-x
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR21F TMR1IF
Bit 7 Bit 0
bit 7:PSPIF: Flag de Lectura/Escritura por 1= La condición del SSP ha ocurrido, bit 2:CCP1IF: Flag de interrupción de
el Puerto Paralelo esclavo debe ponerse a cero por software antes CCPI
1= Concedido el permiso de interrupción de volver del programa de atención a la
para la puerta paralela esclava al realizar interrupción. Las condiciones que sopor- Modo Captura
una operación de Lectrura/Escritura. En ta este bit son 1= Ocurrió una captura de TMR1 (debe
los modelos de 40 pines. SPI ponerse a cero por software)
0= No está permitida la interrupción Ha tenido lugar una Transmisión / 0= No ocurrió ninguna captura de TMR1

NUESTROS CURSOS
bit 6:ADIF: Flag de final de conversión del Recepción Modo Comparación
convertidor A/D I2C Slave 1= Se ha realizado una comparación de
1= El convertidor A/D ha finalizado la Ha tenido lugar una Transmisión / TMR1 Con el registro emparejado /debe
conversión Recepción ponerse a cero por Software)
0= El convertidor A/D no ha finalizado la I2C Master 0= No se ha realizado comparación
conversión Ha tenido lugar una Transmisión / Modo PWM
bit 5:RCIF: Flag de recepción por el USAR Recepción Este modo no se utiliza
1= El buffer de datos recibidos por el La condición de salida iniciada se com- bit 1:TMR2IF: Flag de interrupción de
USAR está lleno pletó por el módulo de SSP. TMR2 emparejado con PR2
0= El buffer de datos recibidos por el La condición de parada inicio se comple- 1= TMR2 emparejado con PR2 ocurrió
USAR no está lleno tó por el módulo de SSP. (debe ponerse a cero por software)
bit 4:TXIF: Flag de transmisión el USAR La condición de reinicialización se com- 0= No ha ocurrido el emparejamiento de
1= El buffer de datos a transmitir no está pleto por el módulo SSP TMR2 con PR2
lleno Una condición de la salida se ha realizado bit 0: TMR1IF: Flag de desbordamiento
0= El buffer de daos a transmitir está mientras el módulo de SSP estaba en de TMRI
lleno estado de espera (sistema de Multimaster). 1 =el registro se desbordo (debe ponerse
bit 3: SSPIF: Flag de interrupción del 0 = no ha ocurrido ninguna condición de a cero por software)
Puerto Serie Síncrono (SSP) interrupción del módulo SSP 0 = el registre¡ de TMRI no se desbordo

Nota 1.- PSPIF está reservado para los dispositivos de 28 pines; se mantiene siempre a cero.

REGISTRO PIR2 (Dirección 0Dh)


El registro de PIR2 contiene los flags que indican la interrupción del CCP2, de la colisión del bus SSP y la inte-
53
RESISTOR
rrupción de la escritura en la EEPROM

" " " " " " " "


U-0 R/W-0 U-0 R/W-0 R/W-0 U-0 U-0 R/W-x
---(1) --- EEIF BCLIF --- --- CCP2IF
Bit 7 Bit 0
bit 7:No implementado: se lee como “0” bit 2-1:No implementados: se leen como “0”
bit 6:Reservado: Mantiene este bit siempre a cero bit 0: CCP21F: Flag de ininterrupción de CCP2
bit 5:No implementado: se lee como “0” Modo Captura
bit 4:EEIF: Flag que indica si se ha producido escritura en al 1 = Ha ocurrido una captura del registro TMR1 (debe ponerse a
EEPROM cero por software)
1 = Se ha completado la escritura en la EEPROM (Se pone a cero 0= No se ha producido captura
por software) Modo Comparación
0 = No se ha finalizado la escritura o no se ha comenzado 1 = Se ha producido una comparación de TMR1 con su pareja
bit 3:BCLIF: Flag que indica la colisión en el bus (debe ponerse a cero por software).
1 = Se ha producido una colisión en el bus SSP, cuando se confi- 0 = No se ha producido comparación
gura en el modo I2C Master. Modo PWM
0 = No se ha producido colisión en el bus No se utiliza

REGISTRO PCON (Dirección 8Eh)


El registro PCON (Power Control) Control de Alimentación, contiene los flags que permiten diferenciar entre un
Power-on Reset (POP), un Brown-out Reset (BOR), un Reset por Watchdog (WDT) y un Reset externo por MCLR.

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


--- 0 --- --- --- --- #POR #BOR
Bit 7 Bit 0
bit 7-2:No implementado: se lee como “0” bit 0:#BOR: bit de estado de Borwn-out Reset
bit 1:#POR: bit de estado Power-on Reset 1 = No se ha producido ningún Brown-out Reset
1 = No se ha producido un Power-on Reset 0= Se ha producido un Brown-out Reset (debe reestablecerse
0= Se ha producido un Power-on Reset (debe reestablecerse por software)
por software)
Curso microcontroladoresPAGS 27/12/02 10:01 Página 54

CURSO DE
MICROCONTROLADORES
MICROCONTROLADORES
PIC16F87X (...y III)
Fernando Remiro Domínguez
Profesor de Sistemas Electrónicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

54
RESISTOR

Programador para PIC16F87X con bootloader.

S
i habéis utilizado un hexadecimal del programa que DESCRIPCIÓN DEL CIRCUITO
programador por el queremos que se ejecute. Esto El circuito consta de un
puerto serie del ordena- reduce considerablemente el microcontrolador PIC16F876 al
dor para programar los tiempo de programación ya que que se le han conectado un cristal
PIC16F87X, utilizando solo carga los códigos del pro- de cuarzo de 4MHz y los
el maravilloso software libre IC- grama que queremos cargar. condensadores de desacoplo de 27
Prog, habréis comprobado que el La placa que hemos diseñado pF y un pulsador que cuando se
tiempo de carga del PIC16F876, además de utilizarla como pro- activa pone un nivel bajo en la
por ejemplo, que tiene 8K es de gramadora, se puede utilizar entrada MCLR para provocar un
varios minutos que se hacen como placa de desarrollo, ya que RESET del sistema. Además para
interminables, sobretodo cuando se dispone de acceso a todos y poder conectar la USART del
estamos programando y depu- cada uno de los pines del micro- microcontrolador al ordenador, se
rando programas. controlador a través de la tira de ha utilizado un circuito adaptador
Lo que presentamos en este postes para circuito impreso de niveles MAX232, tal y como
curso es un circuito que a través macho acodados y dispone de un indica el fabricante en sus notas
de la USAR de los PIC 16F87X circuito oscilador a cristal en de aplicación, y por último se le
es capaz de ponerse en comuni- nuestro caso a 4 MHz, tal y como ha dotado de un conector
cación con ellos y cargar en la se puede ver en el circuito de la acodado DB-9 macho para poder
memoria de programa el código Figura 1. conectar el circuito al puerto serie
Curso microcontroladoresPAGS 27/12/02 10:01 Página 55

VCC

P1
DB9 C1 C2
1uF U1
1uF
1 9
C1+ 9

6
5
9
4
8
3
7
2

1
2 10
E1 V+ 10
3 11 RC6
C1- T1IN
RXPC 4 12 RC7
C2+ R10UT
ESP 5 13 RXPC
C2- R1IN
TXPC C3 6 14 TXPC
1uF V- T1OUT
7 15
7 GND
8 16
8 VCC
C4
VCC C5 MAX232
1uF
1uF

R1
SW1 10K
U2 VCC
R2
MCLR 1 28 RB7
MCLR/VPP RB7
RESET RA0 2 27 RB6
100 RA0/AN0 RB6
RA1 3 26 RB5
RA1/AN1 RB5
RA2 4 25 RB4 VSS VCC
RA2/AN2 RB4
RA3 5 24 RB3
RA3/AN3/VREF RB3
RA4 6 23 RB2
RA4/TOCKI RB2
C6 27pF RA5 7 22 RB1 VCC
RA5/SS/AN4 RB1
8 21 RB0
VSS VSS RB0/INT
9 20
X1 OSC1/CLKIN VDD
10 19
OSC2/CLKOUT VSS
4MHz 18 RC7
RC7/RX/DT
C7 27pF 17 RC6
RC6/TX/CK
RC0 11 VDD
RC0/T1OS0/T1CKI
RC1 12
RC1/T1OS1/CCP2
RC2 13 16 RC5 VCC
RC2/CCP1 RC5/SDO
RC3 14
RC3/SCK/SCL
15 RC4
RC4/SDI/SDA
J1
PIC16F873
MCLR
6
C8
5
4
RB7 0.1u
3
VCC RB6
2
RB3
1

CONECTOR RJ11
CON6 DEBUGE
MCLR
RA2
RA3
RA4

RA0
RA1

RA5
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7

RC0
RC1
RC2
RC3
RC4
RC5
RC6
RC7

J2
1
2
3
4
5
6
7
8
9

12
13
14
15
16
17
18
19
20
21
22
23
24
25
10
11

CON25

Figura 1.- circuito de la placa de desarrollo y de programación con el bootloadaer


que conectada al PC y en el
mismo entorno del MPLAB,
permite la visualización de los
registros del microcontrolador
en los puntos de ruptura que se
establezcan. Pudiéndose ejecutar
los programas en tiempo real o
en modo paso a paso.
Figura 2.- Conexión del ICD a
la placa de desarrollo.

del ordenador. El cable de


conexión debe ser un modem
nulo, es decir, un cable que solo
necesita la línea de masa
conectada al terminal 5 de los dos
conectores y se cruzan las líneas 2
de un extremo (RxD) con la 3 del
otro (TxD) y viceversa. Ver el
diagrama de conexión de la
Figura 3.
Además la placa dispone de
un conector ARJ11, conectado a
las líneas MCLR, RB3, RB6 y
RB7 del microcontrolador, lo
que permite realizar la conexión
a un módulo ICD (Depurador en
circuito), que como veremos es Figura 3 .- Cable de conexión MODEM nulo para la conexión de la placa de desarrollo
una herramienta de bajo costo con el PC.
Curso microcontroladoresPAGS 27/12/02 10:01 Página 56

;============================ Sección fijada por el usuario ==========================

list p=16f876 ; <<< fijar el tipo de microcontrolador

;Poner el mismo microcontrolador en el proyecto


MICROCONTROLADORES
#include <p16f876.inc> ; <<< poner el archivo *.inc del microcontrolador seleccionado

#define FOSC D'4000000' ;<<< Poner la frecuencia del cuarzo (Hz), max. 20 MHz
#define BAUD D'9600' ;<<< poner la velocidad de transmisión (Bd)
#define BAUD_ERROR D'4' ;<<< Poner la tasa de error (%)
#define TIME ;<<< Poner el método inicio del bootloader PIN/TIME/AUTO

;Disparo por puesta a nivel bajo de la señal de disparo


;TIME Inicia la recepción del byte de IDENT después el RESET
#define POR PORTB ;<<< solo para el PIN – del puerto en juego
PORTB/PORTC/PORTD/PORTE
#define PORT_BIT 7 ; <<< solo para el pin PIN – poner el bit de la línea
seleccionada 0/1/2/3/4/5/6/7
#define TIMEOUT D'3' ; <<< solo para el TIME – fijar el tiempo(0.1 s), max. 25.5 s

;============ Fin de la sección fijada por el usuario ====================================

Tabla 1.- Sección del programa bootloader que debe fijar el usuario.
COMO UTILIZAR
aclaratorio es ver un ejemplo
56
RESISTOR
EL PROGRAMA
BOOTLOADER
1. En primer lugar debemos
3. Si se modifica alguno de los
parámetros anteriores, debe-
mos de volver a compilar el
con un programa que utiliza
este método de carga del pro-
grama de usuario en el micro-
obtener el programa en la programa bootldr.asm. controlador.
siguiente web http://www.ehl.cz/ 4. Programar el microcontrola- El programa TMR0_1.asm es
pic/pic_e.htm , donde también se dor con el archivo bootldr.hex un programa ejemplo que uti-
puede obtener el PIC donwloa- utilizando cualquier progra- liza una temporización utili-
der V1.8. mador de los que ya se han zando TMR0 sin utilizar las
visto en esta Revista, por interrupciones. Realiza una
2. Abrir el proyecto bootldr.pjt ejemplo el que el que aparece temporización de 32,77 ms
utilizando el programa en el módulo de aprendizaje que se emplea para hacer par-
Microchip MPLAB y cambiar de microcontroladores PIC padear los diodos LED pares
los parámetros de la sección que apareció en el número o impares respectivamente
de usuario marcados dentro 189. Poniendo los bits de con- conectados al PORTB. En el
del ensamblador con las mar- figuración para que el micro- código de este programa con
cas <<<, tal y como se muestra controlador trabaje en la apli- separados por un ";" (es decir,
en la Tabla 1, en la que hemos cación. como un comentario) se
fijado el microcontrolador 5. Recompilar el programa de la encuentran las instrucciones
PIC16F876, con un oscilador aplicación para que no borre el de salto a INICIO que utiliza-
de 4MHz, una velocidad de bootloader. El bootloader usa ríamos con un programador
transmisión de 9600 baudios y los 256 bytes de la parte alta de convencional. Y al final del
utiliza el pin 7 del PORTB memoria de programa programa, en la posición
como señal de disparo para (0x1F04-0x1FFF). de memoria 0x1F00 hemos
ejecutar el bootloader cuando Llegado a este punto lo más escrito:
está a nivel bajo y correr el
programa de usuario cuando
está a nivel alto. Por tiempo
entra en el programa de usua- ORG 0x1F00
rio después de haber pasado bcf PCLATH,4 ;Selecciona el banco 0 de memoria
0,3 segundos sin recibir la bcf PCLATH,3
palabra de IDENTIFICA- goto INICIO
CIÓN.
Curso microcontroladoresPAGS 27/12/02 10:01 Página 57

;****************************************************************************
; Programa TMR0_1.ASM Fecha : 7- Mayo-2002
; Este programa utiliza una temporización utilizando TMR0 sin utilizar las interrupciones.
;Se realiza una temporización de 32,77 ms que se emplea para hacer parpadear los diodos LED
; pares o impares respectivamente conectados al PORTB
; Programa preparado para cargar con el PIC downlader

MICROCONTROLADORES
; Revisión : 0.1 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instrucción: 1 MHz = 1 uS
; Perro Guardián: Deshabilitado Tipo de Reloj : XT
; Protección del código: OFF
;*****************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos

;ORG 0x00 ; Inicio del programa en


;goto INICIO

ORG 0x05 ;salva el vector de Interrupciones


INICIO bcf STATUS,RP1
bsf STATUS,RP0 ; Banco 1
movlw b'11010111' ; Valor a cargar en OPTION_REG
movwf OPTION_REG ; predivisor 256 asignado a TMR0
clrf TRISB ; PORTB como salida
bcf STATUS,RP0 ; Banco 0
clrf PORTB ; Apaga los LEDS del PORTB

BUCLE
movwf
call
movlw
PORTB
RETARDO
b'01010101'
; Enciende los LED impares del PORTB
; Llamada a subrutina de RETARDO
57
RESISTOR
movlw b'10101010'
movwf PORTB ; Enciende los LED pares del PORTB
call RETARDO
goto BUCLE

RETARDO
clrf TMR0 ; TMR0 = 0 y empieza su incremento
EXPLORA
btfss TMR0,7 ; Es el bit 7 de TMR0=1?
goto EXPLORA ; No ha llegado TMR0 a 128 Decial
return ; Ha llegado TMR0 al valor 128D y retorna
; al programa principal
ORG 0x1F00
bcf PCLATH,4 ;Selecciona el banco 0 de memoria
bcf PCLATH,3
goto INICIO ;Salta a INICIO
END

Tabla 2.- Programa TMR0-1.asm para cargar con el bootloader.

Es decir, en las posiciones de 6. Recompilar el programa de la nulo, tal y como se comento


memoria 0x1F00-0x1F03, escri- aplica anteriormete.
bimos un salto largo de 14 bits a 2. Para realizar la carga del pro-
la posición de memoria INICIO, COMO REALIZAR LA CARGA grama de usuario, vamos a
que está en el banco cero de EN EL MICROCONTROLADOR utilizar un programa de
memoria de programa. Esto últi- 1. En primer lugar se conecta la "carga" freware, se trata del
mo debe verificarse si se utiliza placa de desarrollo al PC PIC downloader de Petr
un compilador en C. mediante un cable de modem Kolomaznik y que hemos con-
Curso microcontroladoresPAGS 27/12/02 10:01 Página 58

0x0000
El Bootloader utiliza las
Salto al Bootloader 4 primeras posiciones
0x0004 (0x0000-0x0003)
MICROCONTROLADORES
Espacio disponible
Espacio de memoria, para el programa
para cargar los del usuario
programas transmitidos (0x0004-0x1EFF)

Figura 5.- Apariencia de la


pantalla que aparece al ejecutar el
programa PIC dowloader.

seguido en la web
0x1F00
Salto al programa Primeras 4 posiciones http://www.microchipc.com/ .
de usuario para el usuario Una vez instalado, al ejecutar-
0x1F04 (0x1F00-0x1F03)
lo, aparece una pantalla
como la que se muestra en la
Código del Bootloader Código del programa
Figura 5.

58
RESISTOR 0x1FFF
Bootloader
(0x1F04-0x1FFF) 3. Seleccionamos la velocidad de
transmisión en baudios, en
nuestro caso 9600, el puerto
serie de comunicación, en el
Figura 4.- Mapa de memoria del Bootloader para un microcontrola- ejemplo hemos seleccionado
dor de 8KBytes. el COM2 y buscamos el nom-
bre del programa en código
Características del programa PIC dowloader 1.8 : hexadecimal que queremos
cargar en el microcontrolador,
● Compatible con el bootloader de HI-TECH's o de Shane Tolmie TMR0-1.hex.
para los microcontroladores PIC16F87x Este programa tiene las
● Funcionamientos bajo Windows 9x/ME/NT/2000 siguientes teclas de función
● Selección de la velocidad a partir del 2400 a 56000 Bd
rápida:
F2 - Búsqueda
● Selección del puerto serie entre el COM1-6
F4 - Escribir
● Trabaja con datos de EEPROM en el archivo hexadecimal
ESC - Cancelación
● No envía la palabra de los configuración a la posición 0x2007 o F10 - Salida
palabra de la identificación desde el bootloader 4. Seguidamente se pulsa el
● Mantiene las últimas configuraciones botón de RESET y el progra-
● Se incluye el código de fuente ma se carga en el microcon-
● El downloader del PIC se controla al realizar una señal de dispa- trolador PIC. Según se va rea-
lizando la carga, aparece un
ro del RESET en el microcontrolador
indicador de carga (línea
● Se trabaja en ensamblador para todos aquellos programadores
azul) y al finalizar la carga
que no utilizan el lenguaje C. El bootloader es muy fácil de recom- suena una señal acústica.
pilar para otros microcontroladores actualizando el pin/tieme y la 5. Si volvemos a actuar manual-
frecuencias del cristal de cuarzo. Solo se necesita el programa mente sobre el pulsador de
MPLAB de Microchip que también es gratuito. RESET, se ejecutará el pro-
● Se puede obtener en las siguientes webs: (http://www.ehl.cz/pic/) grama de usuario.
(http://www.microchipc.com/)
Curso microcontroladoresPAGS 21/1/04 10:14 Página 56

CURSO DE
MICROCONTROLADORES
MICROCONTROLADORES
PIC16F87X (...y IV)
Fernando Remiro Domínguez
Profesor de Sistemas Electrónicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

LOS REGISTROS PCL correctamente los bits PCLATH La pila funciona como un buf-
y PCLATH <4:3> que seleccionan el Banco. fer circular. Esto significa que
El contador del programa Es labor del programador después de que se han guardado 8
(PC) está formado por 13 bit que modificar el valor de dichos bits valores en ella, el noveno borra el
sirven para direccionar la en las instrucciones CALL y valor que se guardó en primer
memoria de código, estos bits se GOTO. lugar, el décimo borra el que se
encuentran en dos registros La familia de los PIC 16F87X guardo en segundo lugar, etc.
específicos. El byte bajo viene del dispone de una pila de 8 niveles
registro de PCL que puede ser de profundidad para un tamaño Paginación de la Memoria
leído y escrito. Los bits superiores de PC de 13 bits. Esta pila es de Programa
56
RESISTOR
(PC<12:8>). Están alojados en el
registro PCH , sobre el que no se
puede leer ni escribir, pero se
transparente al programador, es
decir, funciona automáticamente
y no dispone de instrucciones
Los dispositivos de la familia
PIC 16F87X son capaces de
direccionar un bloque de hasta
puede acceder a él indirectamente para guardar o sacar de ella 8K de memoria continua. Las
a través del registro PCLATH. información. instrucciones CALL y GOTO
Las instrucciones de salto Con la Instrucción CALL y proporcionan solo 11 bits de la
CALL y GOTO sólo con las interrupciones el valor de dirección de memoria, lo que
proporcionan 11 bits de la PC se salva en el nivel superior. permite un salto de bifurcación
dirección a saltar. Esto limita el Con las instrucciones RETURN, dentro de una página de 2K de la
salto dentro de cada Banco de 2K. RETLW y RETFIE el valor con- memoria de programa.
Cuando se desea salir del Banco tenido en el valor superior de la Al hacer un CALL o una ins-
actual hay que programar pila se carga en el PC. trucción GOTO, dos 2 bit supe-
riores de la dirección son pro-
PCH PCL porcionados por el PCLATH
<4:3>. Al hacer un CALL o un
12 8 7 0 GOTO, el usuario debe asegu-
Instrucciones con rarse de que la página se han
PC destino en el PCL seleccionados con los bit corres-
pondientes a la página que se
desea llamar. Hay que tener pre-
caución en los retornos de subru-
5 PCLATH<4:0> tinas y retornos de ininterrup-
ción para no salirse con el valor
8 almacenado en la PILA.
ALU
Por consiguiente, manipula-
ción del PCLATH <4:3> no se
requieren los bits para las ins-
trucciones del retorno. Este es el
caso del ejemplo Inter.asm, en el
PCLATH que el programa principal, que
consiste en encender y apagar un
Figura 1.- Estructura del Contador de Programa LED, conectado a través de una
Curso microcontroladoresPAGS 21/1/04 10:14 Página 57

;***********************************************************************************
; Programa INTER.asm Fecha : 24- Enero-2003
; Este programa genera una intermitencia en un lED conectado a la línea RB0. El programa principal
; está en la pagina 0 de memoria de programa y la subrutina en la página 1 de programa
; Revisión 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instrucción: 1 MHz = 1 uS
; Perro Guardián :deshabilitado Tipo de Reloj : XT
; Protección del código : OFF
;**********************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
;__config _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF & _LVP_OFF & _XT_OSC & _WDT_OFF
; org 0x00 ;Vector de Reset
; goto INICIO
CONTA1 EQU 0x20
CONTA2 EQU 0x21
PCLATH_TEMP EQU 0x22

org 0x05 ;Salva el vector de interrupción


INICIO clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
movlw b'00000110'
movwf ADCON1 ;Puerta A E/S digitales
clrf TRISB ;Puerta B se configura como salida
bcf STATUS,RP0 ;Selecciona banco 0
BUCLE bsf PORTB,0
movf PCLATH,W ;Salvamos valor de PCLARH en un registro temporal
movwf PCLATH_TEMP
bsf PCLATH,3 ;Selecciona la Página 1
bcf PCLATH,4
call TEMPO
bcf PORTB,0
movf PCLATH,W
movwf PCLATH_TEMP
bsf PCLATH,3 ;Selecciona la Página 1
bcf PCLATH,4
call TEMPO
goto BUCLE

ORG 0x0800 ;Dirección de Inicio de la Página 1


TEMPO clrf CONTA1 ;Borra el contenido de counter1
clrf CONTA2 ;Borra el contenido de counter2
BUCLE_1 decfsz CONTA1,f ;resta 1 al contenido de CONTA1.si CONTA1 llega a
;cero: salta la instrucción GOTO BUCLE1
;Si counter1 no llega a cero: ejecuta la siguiente instrucción
goto BUCLE_1 ;Cierra el primer bucle de retardo
decfsz CONTA2,f ;Lo mismo que el caso anterior, pero esta vez aplicado a CONTA2
goto BUCLE_1 ;Cierra el segundo bucle de retardo
movf PCLATH_TEMP,W ;Repone el valor de PCLATH antes de la subrutina
movwf PCLATH
return ;Retorno de subrutina

ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la página 0
goto INICIO
end ;Fin del programa fuente
Programa Inter1.asm
Curso microcontroladoresPAGS 21/1/04 10:14 Página 58

resistencia de 330 W a la línea instrucciones CALL y GOTO o un programador con el IC-


RB0, cada cierto tiempo, el pro- proporcionan solo 11 bits de la PROG, tal y como está es valido
grama principal se ejecuta en la dirección de memoria, lo que para los primeros y si se quitan
página cero y la subrutina de permite un salto de bifurcación los ";", se puede cargarse direc-
temporización se encuentra en la dentro de una página de 2K de la tamente utilizando cualquiera de
página 1 de memoria de progra- memoria de programa. los demás programadores, estas
MICROCONTROLADORES
ma. Al hacer un CALL o una ins- líneas de programa se han mar-
trucción GOTO, dos 2 bit supe- cado en azul. En rojo se han mar-
EL STACK riores de la dirección son propor- cado las líneas de programa utili-
La familia de los PIC 16F87X cionados por el PCLATH <4:3>. zadas para salvar el valor de
dispone de una pila de 8 niveles Al hacer un CALL o un GOTO, registro PCLATH en un registro
de profundidad para un tamaño el usuario debe asegurarse de temporal, antes de manipular
de PC de 13 bits. Esta pila es que la página se han selecciona- PCLATH <4:3>, cargando en el
transparente al programador, es dos con los bit correspondientes bit 4 y 3 del mismo, respectiva-
decir, funciona automáticamente a la página que se desea llamar. mente los valores 0 y 1, que
y no dispone de instrucciones Hay que tener precaución en los seleccionan la página 1 de
para guardar o sacar de ella retornos de subrutinas y retornos memoria de programa.
información. de ininterrupción para no salirse Por último, en la subrutina
Con la Instrucción CALL y con el valor almacenado en la que empieza en la página 1, en la
con las interrupciones el valor de PILA. dirección 8000h, se ha marcado
PC se salva en el nivel superior. Por consiguiente, manipula- en verde las instrucciones que
Con las instrucciones RETURN, ción del PCLATH <4:3> no se reponen el valor que tenía el
RETLW y RETFIE el valor con- requieren los bits para las ins- PCLATH antes de saltar a la
tenido en el valor superior de la trucciones del retorno. Este es el subrutina.
pila se carga en el PC. caso del ejemplo Inter.asm, en el
La pila funciona como un buf- que el programa principal, que Direccionamiento indirecto,
fer circular. Esto significa que consiste en encender y apagar un los registros INDF y FSR
después de que se han guardado LED, conectado a través de una El registro INDF no es un
8 valores en ella, el noveno borra resistencia de 330 Ω a la línea registro físico, que ocupa la
58
RESISTOR
el valor que se guardó en primer
lugar. El décimo borra el que se
guardo en segundo lugar, etc.
RB0, cada cierto tiempo, el pro-
grama principal se ejecuta en la
página cero y la subrutina de
dirección 0 en todos los
Bancos, este registro se utiliza
cuando queremos realizar un
temporización se encuentra en direccionamiento indirecto.
Paginación de la Memoria la página 1 de memoria de Cuando se hace referencia al
de Programa programa. registro, se accede realmente a la
Los dispositivos de la familia El programa está diseñado dirección de un Banco de registro
PIC 16F87X son capaces de para aquellos que utilicen el boo- especificada con los 7 bits de
direccionar un bloque de hasta tloader con el circuito que pre- menor peso del registro FSR. El
8K de memoria continua. Las sentamos en el número anterior bit de más peso del FSR junto al
Direccionamiento Directo Direccionamiento Indirecto

Código de operación instrucción


RP1:RP0 6 0 IRP Registro FSR

Selección de Banco Dirección dentro del Banco Selección de Banco Dirección dentro del Banco

00 01 10 11
00h 80h 100h 180h

Memoria
de datos

FFh 17Fh 1FFh


7Fh

Banco 0 Banco 1 Banco2 Banco3

Figura 2.-Forma de seleccionar el Banco y la dirección de la RAM en los direccionamientos directo e


indirecto.
Curso microcontroladoresPAGS 21/1/04 10:14 Página 59

bit IRP de registro de STATUS se


encarga de seleccionar el Banco a
acceder, mientras que los 7 bits de
menos peso apuntan a la posición.

LOS PUERTOS DE E/S Y

MICROCONTROLADORES
RECURSOS ESPECIALES DEL
PROCESADOR
Alguno de los pines de los
puertos de E/S están multiplexa-
dos con una o unas funciones
alternativas para la utilización de
los periféricos internos. En gene-
ral, cuando un periférico se habi-
lita el pin correspondiente no
puede utilizarse como pin de E/S.
Los microcontroladores
PIC16F87X que están encapsula-
dos en 28 pines, disponen de tres
puertos (PORTA, B y C) mien-
tras que los microcontroladores
de 40 pines disponen de cinco
puertos (PORA, B, C, D y E).

PORTA y el registro TRISA


Este puerto dispone de 6
pines bidireccionales denomina-
dos RA0 - RA5 cuyo sentido
está controlado por el registro
TRISA, cuando se pone a 1 el bit
correspondiente del registro
59
RESISTOR
TRISA, la línea correspondiente
del PORTA se comporta como
una entrada, mientras que si se
pone a 0 se comporta como
salida.
Al leer el registro del PORTA
se está leyendo el estado de los Figura 3.-Diagrama de conexión de los pines RA0-RA3 y RA5 que
pines, que es, el que se halla multiplexan la función de E/S digital con la del canal de entrada de
escrito en el biestable de datos, una señal analógica para el Conversor A/D
La función de escritura implica
la operación de lectura, modifi- entrada de reloj para el del convertidor A/D y entrada de
cación y escritura. Es decir, le lee TIMER0. la tensión de referencia para los
el pin, se modifica su valor y por Los pines RA0/AN0, periféricos que la necesitan.
último se escribe en el biestable RA1/AN1, RA2/AN2, además de El pin RA5/AN4/SS# tiene
el dato. Todos los pines del E/S digital también pueden multiplexada tres funciones: E/S
PORTA entregan niveles TTL. actuar como los canales 0, 1 y 2 digital, entrada del canal 4 del
El pin RA4 está multiplexado del convertidor A/D. convertidor A/D y selección del
con el módulo de reloj TIMER0, El pin RA3/AN3/VREF+ modo esclavo cuando trabaja con
por lo tanto el pin RA4/TOCKI tiene multiplexadas tres funcio- la comunicación serie síncrona.
actúa como E/S digital y como nes: E/S digital, entrad del canal 3 Cuando se produce un Reset al

RELACIÓN DE REGISTROS RELACIONADOS CON EL PORTA


Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Valor en Valor en
POR,BOR el resto
de Reset
05 h PORTA -- -- RA5 RA4 RA3 RA2 RA1 RA0 --0x 0000 --0u 0000
85 h TRISA -- -- Registro de direccionamiento del PORTA --11 1111 --11 1111
97 h ADDCON1 ADFM -- -- -- PCFG3 PCFG2 PCFG1 PCFG0 --0- 0000 --0- 0000
Curso microcontroladoresPAGS 21/1/04 10:14 Página 60

conectar la tensión de alimenta- se quiere configurar el PORTA EL PORTB y el registro TRISB


ción (POR: Power-on Reset) como E/S digitales bastará con El PortB es está formado por
todos los pines del PORTA que- escribir en los 4 bit menos signi- 8 líneas bidireccionales controla-
dan configurados corno canales ficativos del registro ADCON1 das por el registro de direcciona-
de entrada para el convertidor el valor 011x. miento TRISB, poniendo un "1"
A/D y son leídas como 0. El registro TRISA que confi- en un bit del registro TRISB se
Para seleccionar el modo de gura los pines deL PORTA, debe direcciona la línea correspon-
MICROCONTROLADORES
funcionamiento como E/S digita- configurarse como entrada cuan- diente como entrada, mientras
les o analógicas para el converti- do se utilizan las entradas que los bit que se ponen a "0" en
dor A/D hay que configurar el analógicas. el registro de direccionamiento
registro ADCON1 que se expli- Ejemplo de inicialización del TRISB, se configuran como
cará con detalle más adelante. Si PORTA salida.
Los PIC16F87X pueden ser
bcf STATUS,RP0 programados en modo bajo vol-
bcf STATUS,RP1 ;Selecciona el Banco 0 de memoria taje o alto voltaje, en el primero
clrf PORTA ;inicializa el PORTB, borrando de los casos se puede programar
;todas las basculas de datos con VDD=5V. El modo alto vol-
bsf STATUS,RP0 ;Selecciona el Banco 1 de memoria taje es el modo que utiliza el
movlw b’00000110’ ;Configura el PORTA como PIC16F84, en este caso se intro-
movwf ADCON1 ;E/S digitales duce por el pin MCLR#Vpp una
tensión entre 12 y 14V. En el
movlw b’00001111’ ;Direcciona las líneas de– RA0-RA3
modo de programación de bajo
movwf TRISA ;como salida RA4-RAS como entrada voltaje se pone el pin
MCLR#Vpp 5V y por los pines
RB3/PGM se pone a nivel alto.
Como la programación en cual-
quiera de los casos se realiza sin-
cronaménte en serie, por el pin
RB6/PGC se introducen los
impulsos de reloj y por
60
RESISTOR
RB7/PGD los bit de datos serie.
Las líneas RB7-RB4 pueden
programarse para generar una
interrupción cuando una de ellas
cambia de estado. Se deben con-
figurarse como entradas y el
valor que se introduce por ellas
se compara con el anterior de tal
forma que si no coinciden se
genere una interrupción, siempre
que esta esté autorizada. De
todas forma el bit RBIF, que es
el bit 0 del registro INTCON, se
pondrá a 1.
El pin RB0/INT también
puede programarse como peti-
ción de interrupción externa, si
se autoriza con el correspondien-
te bit de permiso de ininterrup-
ción, que corresponde con el bit
(4) INTE del registro INTCON y
con el bit INTEDG del registro
OPTION_REG se programa el
flanco de disparo.
Los pines del PORTB tienen
una resistencia de pull-up a posi-
tivo de alimentación programa-
ble, esta se conecta cuando el bit
7 del OPTION REG, es decir
RBPU# tiene un cero. La resis-
tencia de pull-up realmente es un
Figura 4.- Diagrama interno de las líneas RB7-RB4 del PORTB transistor CMOS tipo P, tal y
Curso microcontroladoresPAGS 21/1/04 10:14 Página 61

RELACIÓN DE REGISTROS RELACIONADOS CON EL PORTB


Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en
POR,BOR el resto
de Reset
06 h 106 h PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu
86 h 186 h TRISB Registro de direccionamiento del PORTB 1111 1111 1111 1111
81 h 181 h OPTION_REG RBPU# INTEDG T0SC T0SC PSA PS2 PS1 PS0 1111 1111 1111 1111
Leyenda
x = desconocido, u = inalterado. Las celdas sombreadas no son usadas por el PORTB

como puede verse en la Figura 4, El PORTD y el registro TRISD Para que trabaje como puerto
que se conecta siempre que la Este puerto solo existe en los de comunicación esclavo, hay
línea está configurada como sali- microcontroladores de la familia que poner a 1 el bit PSPMODE,
da. Cuando se produce un Reset 16F87X de 40 pines. El PORTD que se encuentra en el registro
por conexión de alimentación está formado por 8 líneas TRISE.
(POP) se desconectan todas las bidireccionales denominadas
resistencias de pull-up. RD0/PSP0-RD7/PSP7 controla- El PORTE y el registro TRISE

INFORMÁTICA
das por el registro de direcciona- Este puerto solo existe en los
EL PORTC y el Registro TRISC miento TRISD. Poniendo un 1 microcontroladores de la familia
El PORTC está formado por 8 en un bit del registro TRISD se 16F87X de 40 pines. Está forma-
líneas bidireccionales controladas direcciona le línea correspon- do por 3 pines multifunción
por el registro de direccionamien- diente como entrada. Mientras R E 0 / R D # / A N 5 ,
to TRISC, Poniendo un 1 en un que los bit que se ponen a 0 en el R E 1 / W R # / A N 6 , y
bit del registro TRISC se direc- registro de direccionamiento RE2/CS#/AN7, que se configu-
ciona la línea correspondiente TRISD, se configuran como sali- ran individualmente como entra-
como entrada. Mientras que los da. En este puerto todas las da o salida a través de los tres bit
bit que se ponen a 0 en el registro entradas disponen de un Trigger de menor peso del registro
de direccionamiento TRISC, se Schmitt. TRISE (TRISE <2:0>).
configuran como salida. Además los pines de E/S digi- Las E/S del PORTE se con-
Las líneas del PORTC están
multiplexadas con varias funcio-
nes de los periféricos. En la
tales de este puerto, pueden mul-
tiplexarse como una puerta para-
lela de 8 líneas (PSP), que sirve
vierten en entradas de control
(RD#, WR# y CS#)para el puerto
PSP cuando el bit PSPMODE que
61
RESISTOR
Tabla 1, se muestra los pines del para permitir la comunicación en corresponde con el bit 4 del regis-
PORTC y las distintas funciones paralelo con otros elementos del tro TRISE. Los pines de E/S digi-
multiplexadas que tienen. sistema. tal del PORTD están multiplexa-

Nombre bit Función


RC0/T1OSO/TICK1 bit 0 E/S digital. Salida Timer 1. Entrada de impulsos para el Timer1
RC1/T1OSI/CCP2 bit 1 E/S digital, entrada al oscilador del Timer1. Entrada del módulo de
Captura 2. Salida del Comparador 2; Salida del PWM2
RC2/CCP1 bit 2 E/S digital. Entrada Captura 1; Salida Comparador 1; Salida PWM 1
RC3/SCK/SCL bit 3 E/S digital. Señal de reloj en modo SPI. Señal de reloj en modo I2C
RC4/SDI/SDA bit 4 E/S digital. Entrada de datos en modo SPI. Línea de datos en modo I2C
RC5/SDO bit 5 E/S digital. Salida de datos en modo SPI
RC6/TX/CK bit 6 E/S digital. Línea de transmisión en USART. Señal de reloj síncrona en
transmisión serie.
RC7/RX/DT bit 7 E/S digital. Línea de transmisión en USART. Línea de datos en transmisión serie
síncrona.
Tabla 1

RELACIÓN DE REGISTROS RELACIONADOS CON EL PORTC


Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en
POR,BOR el resto
de Reset
07 h PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 xxxx xxxx uuuu uuuu
87 h TRISC Registro de direccionamiento del PORTC 1111 1111 1111 1111
Leyenda: x = desconocido, u = inalterado
Curso microcontroladoresPAGS 21/1/04 10:14 Página 62

RELACIÓN DE REGISTROS RELACIONADOS CON EL PORTD


Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en
POR,BOR el resto
de Reset
08 h PORTD RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 xxxx xxxx uuuu uuuu
88 h TRISC Registro de direccionamiento del PORTC 1111 1111 1111 1111
89 h TRISE IBF OBF IBOV PSPMODE -- Registro de 0000 –111 0000 -111
MICROCONTROLADORES
direccionamiento
del PORTE
Leyenda: x = desconocido, u = inalterado; Las celdas sombreadas no son usadas por el PORTD

RELACIÓN DE REGISTROS RELACIONADOS CON EL PORTE


Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en
POR,BOR el resto
de Reset
09 h PORTE --- --- --- --- --- RE2 RE1 RE0 ---- -xxx ---- -uuu
89 h TRISE IBF OBF IBOV PSPMODE --- Registro de
direccionamiento
del PORTE
97 h ADCON1 ADFM --- --- --- PCFG3 PCFG1 PCFG0 --0- 0000 --0- 0000
Leyenda: x = desconocido, u = inalterado; - = no implementado se lee como ‘0’. Las celdas sombreadas no son usadas por el PORTE

das con las entradas digitales. Nota.- Después de un Power- xadas de los bit del PORTD son
Cuando se seleccionan las entra- on-Reset, estos pines quedan las siguientes:
das analógicas los bit de control configurados como entradas ana- Para aclarar el concepto del
del TRISE deben ponerse a 0. lógicas. Las funciones multiple- manejo de los puertos vamos a

62
RESISTOR
Nombre
RE0/#RD/AN5
Bit
Bit 0
Función
E/S digital. Señal de lectura en el modo de puerta paralelo esclava. Canal 5 del
Conversor A/D
RE1/WR#/AN6 Bit 1 E/S digital. Señal de escritura PSP. Canal 6 del Conversor A/D
RE2/CS#/AN7 Bit 2 E/S digital. Señal de Chip Select en el modo PSP. Canal 7 del Conversor A/D

Descripción del registro TRISE


" " "
R-0x R-0 R/W-0 R/W-0 U-1 R/W-1 R/W-1 R/W-1
IBF OBF IBOV PSPMODE --- Bit2 Birt1 Bit0
Bit 7 Bit 0

bit 7: IBF: Flag de buffer de entrada lleno


1 = Una palabra se ha recibido y esta esperando a ser leída por la CPU
0 = No se ha recibido ninguna palabra
bit 6: OBF: Flag de buffer salida lleno
1 = El buffer de salida todavía tiene la palabra previamente escrita
0 = El buffer de salida ha sido leído
bit 5 IBOV: La entrada de desbordamiento de buffer de entrada detecta bit ( en modo
microprocesador).
1 = Se ha producido una escritura antes de que la palabra de entrada se haya leído (debe ponerse a cero
por software).
0 = No ha ocurrido desbordamiento
bit 4: PSPMODE: bit de selección de modo de Puerto Paralelo Esclavo
1 =Seleccionado el modo puerto paralelo esclavo
0 = Seleccionado el modo de E/S digital de propósito general
bit 3 :No implementado se lee como "0"
bit 2 :Bit2:bit de selección del modo de direccionamiento del pin RE2/CS#/AN7
1 = Entrada
0 = Salida
bit 1: Bit1: bit de selección del modo de direccionamiento del pin RE1 /WR#/AN6
1= Entrada
0 = Salida
bit 0: Bit0: bit de selección del modo de direccionamiento del pin RE0/RD#/AN5
1 = Entrada
0 = Salida
Curso microcontroladoresPAGS 21/1/04 10:14 Página 63

;**********************************************************************************
; Programa Display.asm Fecha : 27- Enero-2003
; Este programa lee el estado de cuatro interruptores conectados al PORTA <RA3:RA0>
; y representa sobre un display conectado al PORTB, el valor hexadecimal correspondiente
; Revisión 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instrucción: 1 MHz = 1 uS
; Perro Guardián :deshabilitado Tipo de Reloj : XT
; Protección del código : OFF
;**********************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
;__config _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_ON & _CPD_OFF & _LVP_OFF & _XT_OSC & _WDT_OFF
; org 0x00 ;Vector de Reset
; goto Inicio
org 0x05
INICIO clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b'00000110' ;Configura PORTA como E/S Digitales
movwf ADCON1
movlw b'00001111' ;Configura RA3:RA0 como entradas
movwf TRISA
bcf STATUS,RP0 ;Selecciona banco 0
BUCLE movf PORTA,W
andlw b'00001111' ;Lee el código de RA0-RA3
call Tabla ;Convierte a 7 segmentos
movwf PORTB ;Visualiza sobre el display
goto BUCLE
;**********************************************************************************
Tabla: addwf PCL,F ;Desplazamiento sobre la tabla
retlw b'00111111' ;Dígito 0
retlw b'00000110' ;Dígito 1
retlw b'01011011' ;Dígito 2
retlw b'01001111' ;Dígito 3
retlw b'01100110' ;Dígito 4
retlw b'01101101' ;Dígito 5
retlw b'01111101' ;Dígito 6
retlw b'00000111' ;Dígito 7
retlw b'01111111' ;Dígito 8
retlw b'01100111' ;Dígito 9
retlw b'01110111' ;Dígito A
retlw b'01111100' ;Dígito b
retlw b'00111001' ;Dígito C
retlw b'01011110' ;Dígito d
retlw b'01111001' ;Dígito E
retlw b'01110001' ;Dígito F
;**********************************************************************************
ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la página 0
goto INICIO
end

realizar un sencillo ejercicio que El circuito de aplicación es el tal y como está es valido para
consiste en la lectura de unos que se muestra en la Figura 5. El los primeros y si se quitan los ";",
interruptores conectados al programa está diseñado para se puede cargarse directamente
PORTA y la representación de aquellos que utilicen el bootloa- utilizando cualquiera de los
dicho valor binario en hexadeci- der con el circuito que presenta- demás programadores, estas
mal sobre un display de 7 seg- mos en el número anterior o un líneas las hemos marcado en
mentos conectado en el PORTB. programador con el IC-PROG, azul.

Vcc= 5V
Figura 5.- Circuito de aplicación del programa
Display.asm utilizando el PIC 16F876.

R3 R4 R5 R6 R1
10K 10K 10K 10K 10K R7 300
g a
Reset R8 300
R2 100 f
MCLR RB7 R9 300 f b
e
RA0 RA0 R10 300 g
RA1 RB6 d
RA2 R11 300
RA1 RA3 c
RA4 RB5 R12 300 e c
b
RA2 RA5 RB4
Vss RB3 R13 300 d
RB2 a
C1 27 pF
RB1
RA3 RB0
OSC1
XT 4Mhz
OSC2/CKOUT Vcc=5V
VDD

VSS
C2 27 pF
RC0 RC7
RC1 RC6
RC2 RC5
RC3 RC4
Curso microcontroladoresPAGS 29/4/03 10:38 Página 52

CURSO DE
MICROCONTROLADORES
MICROCONTROLADORES
PIC16F87X (...y V)
Fernando Remiro Domínguez
Profesor de Sistemas Electrónicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

MODULO TIMER0 de referencia de los <4>). Poniéndose a cero T0SE se


El módulo TIMER0 es un microcontroladores de la escala selecciona el flanco ascendente.
temporizador/contador con las media (DS33023). El preescaler se comparte
siguientes características: El modo temporizador se exclusivamente entre el TIMER0 y
● El temporizador / contador selecciona poniendo a cero el bit el WDT. Y además no es de
dispone de 8 bits T0CS (registro OPTION_REG lectura/escritura.
● Puede escribirse y leerse <5>). En el modo temporizador, el
● Preescaler programable por módulo Timer0 se incremento en INTERRUPCIÓN DEL TIMER0
software de 8 bits cada ciclo de instrucción (sin el La interrupción de TMR0 se

52
● Puede trabajar con el reloj preescaler). Si el registro TMR0 se produce cuando el registro TMR0
interno o con una señal de reloj escribe, el incremento se inhibe se desborda al pasar de FFh a 00h.
externa durante los siguientes dos ciclos de Este desbordamiento pone a
RESISTOR ● Dispone de una interrupción por instrucción. EL usuario puede uno el bit T0IF (INTCON<2>).
desbordamiento al pasar de FFh trabajar teniendo en cuenta esto y La ininterrupción puede
a 00h ajustando el valor a cargar en el enmascararse poniendo a cero el
● Selección de flanco ascendente o TMR0. bit T0IE (INTCON <5>). EL bit
descendente para el flaco del El modo contador se selecciona T0IF debe ponerse a cero por
reloj externo poniendo a uno el bit T0CS software al finalizar la rutina de
(registro OPTION_REG <5>). El atención a la interrupción del
En la Figura 1 se muestra un modo contador, Timer0 se desbordamiento de TMR0. La
diagrama de bloques del TIMER0 incremento en cada flaco de subida interrupción de TMR0 no saca al
y el preescaler que comparte con el o de bajada de la señal que le llega microcontrolador del estado de
WDT. Puede encontrarse por RA4/TOCK1. El flanco de SLEEP, debido a que el
información adicional sobre incremento se determina por el bit temporizador está desactivado
el módulo Timer0 en el manual T0SE (registro OPTION_REG durante el modo SLEEP
Bus de datos
Figura 1.- Diagrama de bloques del TIMER 0

8
Foosc/4 0
RA4/T0CKI Sincronización
1 PSout con el reloj
pin TMR0
1 interno
Preescaler 0 PSout
Programable (Retardo de 2 ciclos)
T0SE
El bit T0IF se
3 pone a 1 si hay
overflow
T0CS PS2,PS1,PS0 PSA

Notas:
1. El preescaler es compartido con el WDT (En la Figura 2 se puede ver un diagrama de bloques detallado
2. TOCS, TOSE, PSA, PS2:PS0 (OPTION_REG<5:0>)
Curso microcontroladoresPAGS 29/4/03 10:38 Página 53

Bus de datos
CLKOUT (=Foosc/4)

8
0 M 1 Retardo
RA4/T0CKI U M

MICROCONTROLADORES
U de 2 Registro TMRO
pin 1 X
0 X ciclos

T0SE
T0CS PSA

0
M Preescaler de 8 bits
Perro 1 U El bit T0IF se
Guardián X 8 pone a 1 si hay
overflow
3
Multiplexor 1-8 PS2:PS0
PSA
WDT bit de habilitación
0 1
MUX PSA

WDT Figura 2.- Diagrama de bloques del TMR0


time-out

TABLA DE REGISTROS ASOCIADOS AL TIMER0


Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en el
POR,BOR resto de Reset
53
RESISTOR
01h 101h TMR0 Módulo del registro del TMR0 xxxx xxxx uuuu uuuu
0bh, 8Bh
10Bh,18Bh INTCON GIE PEIE T0IE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000x
81h,181h OPTION_REG RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 1111 1111 1111 1111
85h TRISA --- --- Registro de direccionamiento de datos del PORTA --11 1111 --11 1111
Leyenda: x = desconocido, u = inalterado; - = no implementado se lee como ‘0’. Las celdas sombreadas no son usadas
por el TIMER0

UTILIZACIÓN DEL TIMER0 puede asignarse indistintamente al WDT. EL preescaler no se puede


CON UN RELOJ EXTERNO moduló de TIMER0 y el al WDT. leer ni escribir.
Cuando no se utiliza el La asignación del preescaler al Nota.- Escribir en TMR0,
preescaler, la entrada de reloj Timer0 hace que no haya ningún cuando el preescaler es asignado a
externa es igual a la salida del preescaler para el WDT, y viceversa. TIMER0, limpia la cuenta del
preescaler. La sincronización de Este preescaler no se puede leer ni preescaler, pero no cambia la
TOCKI con los relojes de fase escribir (ver la Figura 2). configuración del preescaler.
interior se acopla, a la salida del El bit PSA y PS2:PS0
preescaler en los ciclos Q2 y Q4 de (OPTION_REG <3:0>) PROGRAMA EJEMPLO DE
los relojes de fase internos. Por determinan la asignación del FUNCIONAMIENTO DEL
consiguiente, es necesario que preescaler y el rango del preescaler. TIMER0
TOCKI está a nivel alto por al Cuando se le asigna al módulo del Para comprobar el
menos durante 2Tosc (y un Tirner0 , todas las instrucciones, que funcionamiento de este programa
pequeño retardo de 20ns) y a nivel escriben en el registro TMR0 (por debemos de montar un circuito
bajo por lo menos 2Tosc (y un ejemplo CLRF TMR0, MOVWF como el que se muestra en la Figura
retardo RC de 20ns). TMR0, BSF TMR0,x... etc.) ponen 3, en el que se ha conectado un
a cero el preescaler. Cuando se le display del tipo cátodo común al
PREESCALER asigna al WDT, una instrucción PORTB de PIC16F876. Una vez
Hay sólo un preescaler CLRWDT limpia el preescaler cargado el programa TMR0_2.asm,
disponible que está compartido y junto con el temporizador del en el display se irán representado
Curso microcontroladoresPAGS 29/4/03 10:38 Página 54

Vcc= 5V

R1
10K R7 300
g a
Reset R8 300
R2 100 f
MICROCONTROLADORES
MCLR RB7 R9 300 f b
e
RA0 R10 300 g
RA1 RB6 d
RA2 R11 300
RA3 c
RA4 RB5 R12 300 e c
b
RA5 RB4
Vss RB3 R13 300 d
RB2 a
C1 27 pF
RB1
RB0
OSC1
XT 4Mhz
OSC2/CKOUT Vcc=5V
VDD
VSS
C2 27 pF
RC0 RC7
RC1 RC6
RC2 RC5
RC3 RC4

Figura 3.- Circuito de aplicación para el programa TMR0_2 utilizando el PIC16F876

los números del 0 al 9 con una


cadencia de aproximadamente un
TMR0_2.asm INT_TMR0
segundo.
El organigrama del programa es
el que se muestra en la Figura 4 y
INICIALIZA
en el programa que está pensado
54 PORTB-->SALIDA Guardar W y
R STATUS
PREESCALER--> 256 TMRO
Reg.TEMPORALES para cargarlo con el bootloader, se
han separado con un ";" y se han
RESISTOR marcado en azul, las líneas que
16-->CONTA 0 -->TMR0
habría que cargar si se utiliza un
programador como el ic-prog. En
este programa al TIMER0 se le
hace trabajar como temporizador,
que genera una interrupción
0-->TMR0 CONTA-1 --> CONTA
cuando se desborda TMR0.

EL MÓDULO DE TIMER1
El módulo de TIMER1 es un
0-->DIGITO ¿CONTA=0? temporizador/contador de 16 bits,
formado por dos registros de 8 bits
SI SI cada uno TMR1H y TMR1L, que
son de lectura y escritura y que son
LEETABL DIGITO+1-->DIGITO los que guardan el valor de la
A cuenta en cada momento. El valor
NO
de los registros TMR1H y TMR1L
se incrementan desde 0000H hasta
NO
DIGITO=10?
16 -->CONTA FFFFH, en cuyo instante se vuelve
a poner a 0000h y se activa el
flag TMR1IF (PIR1<0>). La
REPONER W
ininterrupción de TMR1 puede ser
Y habilitada/deshabilitada según este
STATUS
a uno/cero el bit TMR1IE (PIE1
<0>).
EL TIMERl tiene los siguientes
1 -->TOIF modos de trabajo:
1. Como Temporizador
2. Como contador Síncrono
Figura 4.- Cronograma del programa 3. Como contador Asíncrono
TMR0_2 RETFIE
Curso microcontroladoresPAGS 29/4/03 10:38 Página 55

;*************************************************************************************
; Programa TMR0_2.ASM Fecha : 15 - Abril - 2003
; Este programa presenta en el display de cátodo común conectado en el PORTB
; los números del 0 al 9, mostrando un dato por segundo (aproximadamente), la
; temporización la realiza utilizando la interrupción por TMR0 y el registro auxiliar CONTA
; Revisión : 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instrucción: 1 MHz = 1 uS
; Perro Guardián : deshabilitado Tipo de Reloj : XT
; Protecci¢n del código : OFF
;********************************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
;************************** DEFINICION DE VARIABLES ************************************
W_TEMPORALequ 0x20 ;Almacena W antes de atender la interrupción
S_TEMPORAL equ 0X21 ;Almacena Status antes de atender la interrupción
DIGITO equ 0x22 ;numero a representar en display
CONTA equ 0x23 ;Contador auxiliar para alargar el tiempo a 1 segundo
;entre cada cambio de digito, ya que los 256 (FF) del Timer,
;aunque se divida por 256, es 4x256x256=262,144 ms
;*******************************************************************************************
; ORG 0x00
; goto INICIO
ORG 0x04
;*************************** ATENCION A LA INTERRUPCION *******************************
INT_TMR0
movwf W_TEMPORAL ;Guarda el valor actual de W cuando se interrumpe
swapf STATUS,W ;Intercambia nibbles y guarda en W
movwf S_TEMPORAL ;Almacena Status pero cambiado el ..
;.. nibble alto por el bajo
clrf TMR0 ;Inicializa TMR0=00
decfsz CONTA,f ;Decrementa CONTA y si =0 incrementa DIGITO
goto FIN_INT ;Si cont_aux <> 0 finaliza interrupción
incf DIGITO,F ;Incrementa el DIGITO
movlw D'16' ;Al cargar TMR0 con 0 hace 256 cuentas con un predivisor de 256
;(programado en OPTION_REG). Como queremos 1sg. ponemos 16 en CONTA
; así obtenemos 4*256*256*16 = 1,048576s
movwf CONTA ;inicializa de nuevo CONTA para un nuevo digito
FIN_INT
swapf S_TEMPORAL,W ;Deja Status como estaba antes y en W
movwf STATUS
swapf W_TEMPORAL,F ;Intercambia nibbles del W guardado
swapf W_TEMPORAL,W ;Vuelve a intercambiar pero ya en W
bcf INTCON,T0IF ;Borra el flag de la interrupción
retfie ;Retorno de interrupción
;********************* PROGRAMA PRINCIPAL *************************************
INICIO
bcf STATUS,RP0
bsf STATUS,RP0 ;Habilita Banco1 de registros
clrf TRISB ;direcciona PortB como salidas
movlw B'00000111' ;Reloj interno asignado aTMR0 con divisor por 256
movwf OPTION_REG
bsf INTCON,GIE ;habilitación general de las interrupciones
bsf INTCON,T0IE ;habilitación de la interrupción por TMR0
bcf STATUS,RP0 ;RP0=0 habilita Banco0 de registros
clrf TMR0 ;Inicializa TMR0 a 0
movlw D'16' ;Carga CONTA con 16
movwf CONTA
PONER_0
clrf DIGITO ;Carga DIGITO a 0 para iniciar cuenta
LEETABLA
call TABLA
movwf PORTB ;Muestra digito en el display 7 segmentos (PortB)
movlw D'9' ;
subwf DIGITO,W ;Compara DIGITO con 9
btfss STATUS,Z ;
goto LEETABLA ;Si DIGITO NO = 9, incrementa DIGITO
goto PONER_0 ;Si DIGITO=9,lo pone a 0 de nuevo.
;********************* TABLA CON LOS VALORES DE LOS DIGITOS ******************
TABLA
movf DIGITO,W ;Guarda digito en acumulador
addwf PCL,F ;Suma al contador de programa el digito
DT 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X67
;*******************************************************************************
ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la página 0
goto INICIO ;Salto a la dirección de INICIO del programa
;*******************************************************************************
END
Curso microcontroladoresPAGS 29/4/03 10:38 Página 56

REGISTRO T1CON: Registro de control del TIMER1 (dirección 10h)


U-0 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
--- --- T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
Bit 7 Bit 0

bit 7-6: No implementados: Se lee como "0"


bit 5-4: TlCKPS1:T1CKPS0: bit de selección del preescaler de la señal de reloj del TIMER1
MICROCONTROLADORES
11 = valor del preescaler 1:8
10 = valor del preescaler 1:4
01 = valor del preescaler 1:2
00 = valor del preescaler 1: 1
bit 3 : T1OSCEN: bit de habilitación del oscilador del TIMER1. Cuando se emplea un oscilador
externo, hay que poner este bit a 1. El TMR1 puede trabajar a una frecuencia totalmente independiente
de la del sistema.
1 = Habilita el oscilador
0 = Deshabilita el oscilador
Nota.- El oscilador y la resistencia de desconectan para reducir el consumo

bit 2: #TlSYNC: bit de control de sincronización de la señal de entrada.


Con TMR1CS = 1
1= No sincroniza la entrada de reloj externa
0 = Sincroniza la entrada de reloj externa
Con TMR1CS = 0
En esta condición se ignora. El TIMER1 utiliza el reloj interno cuando TMRICS=0
bit 1 TMR1CS: bit de selección de la fuente de reloj del TIMER1
1 = Reloj externo por el pin RC0/T1OSO/T1CK1 (flanco ascendente)
0 = Reloj interno (FOSC/4)
bit 0: TMR1ON: TIMER1. activo. Hace entrar o no en funcionamiento el TIMER1.
1 = Habilita el TIMER1

56
RESISTOR
0 = Deshabilita el TIMER1

El modo de trabajo viene efecto ya que el reloj interno está T1OSCEN está a uno, y por el pin
determinado por la fuente de los siempre sincronizado. RC1/TlOSI/CCP2, cuando el bit
impulsos de reloj, es decir, la señal T1OSCEN está a cero.
de reloj puede ser externa o interna, MODO DE Si T1SYNC se pone a cero,
se selecciona con el bit TMR1CS FUNCIONAMIENTO DEL entonces la entrada de reloj externa
del registro T1CON<l>, cuando TIME1 COMO CONTADOR se sincroniza con los relojes de fase
este bit está a nivel bajo En este modo puede trabajar interiores. La sincronización se hace
se selecciona el reloj el interno del como contador síncrono o después de la fase del preescaler. En
micro-controlador (Fosc/4) y asíncrono . Cuando el TIMER1 se el preescaler la fase de la señal de
cuando está a uno se selecciona el está incrementando según le llegan reloj es por lo tanto asíncrona.
modo contador y cuenta los los impulsos externos, los En este modo de trabajo,
impulsos que le llegan a través del incrementos ocurren en los flancos durante el modo SLEEP el
pin RC0/TlCKl. Además como se de subida. Después de que el TIMER1 no se incrementa aún
verá mas adelante el TIMER1 TIMER1 se ha configurado como cuando la señal de reloj
tiene la posibilidad de contador, debe producirse un flanco externa esté presente. El
reinicializarse, a partir del módulo de bajada antes de empezar a preescaler sin embargo continua
CCP. contar. incrementándose.

MODO DE MODO DE MODO DE


FUNCIONAMIENTO DEL FUNCIONAMIENTO DEL FUNCIONAMIENTO DEL
TIMER1 COMO TIMER1 COMO CONTADOR TIMER1 COMO CONTADOR
TEMPORIZADOR SÍNCRONO ASÍNCRONO
Este modo se selecciona Para seleccionar este modo se Cuando el bit de control
poniendo a cero el bit TMR1CS pone a uno el bit TMR1CS T1SYNC (T1CON <2>) se poner a
(T1CON <1>. En este modo la (T1CON <1>). En este modo el uno, la señal de reloj externa no se
señal de reloj es el reloj interno del contador se incrementa en cada sincroniza. El contador sigue
microcontrolador FOSC/4. En este flanco ascendente de la señal de realizando la cuenta de forma
modo de trabajo el bit T1SYNC reloj que se introduce por el pin asíncrona respecto a la fase de la
(T1CON <2>) no tiene ningún RC0/T1OSO/TICK1 cuando el bit señal de reloj interna. El contador
Curso microcontroladoresPAGS 29/4/03 10:38 Página 57

T1CK1
(Por defecto a
nivel alto)

MICROCONTROLADORES
T1CKI
(Por defecto a
nivel bajo)

Nota.- Las flechas indicas los incrementos del contador

El bit TMR1F se pone a 1


cuando se desborda

TMR1 Entrada Clock


0
Sincronizada
TMR1H TMR1L
1

TMR1ON
on/off T1SYNC

1 Preescaler sincronización
RC0/T1OSO/T1CKI detección
1,2,4,8
FOSC/4 0
RC1/T1OSI/CCP2 Clok

T1OSCEN
Interno

TMR1CS
2
T1CKPS1:T1CKPS0 Entrada SLEEP 57
RESISTOR
Habilita
Oscilador
Figura 5.- Diagrama de bloques de TIMER1
Tipo de Oscilador Frecuencia C1 C2
LP 32 kHz 33pF 33pF
100kHz 15 pF 15 pF
200 15 pF 15 pF
Estos valores son para los siguientes cristales de referencia
32.768 EpsonC-001R21.768K-A ±20 PPM
100 kHz Epson C-2 100.000 KC-p1 ±20 PPM
200 kHz STD XTL 200.000 kHz ±20 PPM
Nota.-
1. Capacidades mayores aumentan la estabilidad del oscilador, pero también aumentan el start-up.
2. Cada cirstal/resonador tiene sus propias características, el usuario debe consultar los valores apropiados
de los componentes externos al cristal.
Tabla 1.- Selección de los condensadores para el oscilador del TIMER1
continúa la cuenta incluso en el para el módulo CCP (Captura y recibiendo (teniendo cuidado con el
modo SLEEP y puede generar una comparación-PWM) hardware). Sin embargo, el usuario
interrupción por desbordamiento debe tener en cuenta que el
que despierta al procesador. Hay LECTURA Y ESCRITURA EN EL contador es de 16 bits y se pueden
que tener especial cuidado con el TIMER1 CUANDO SE tener ciertos problemas al leer los
software al leer o escribir el TRABAJA EN EL MODO dos registros de ocho bits, ya que el
contador. CONTADOR ASÍNCRONO contador puede desbordarse entre
Cuando se trabaja en el modo Se pueden leer los contadores las lecturas.
contador asíncrono, el TIMER1 no TMR1H y TMR1L mientras la Para escribir en él, se
puede usare como base de tiempos señal externa del contador se está recomienda que el usuario
Curso microcontroladoresPAGS 29/4/03 10:38 Página 58

simplemente pare el contador y (CP1CON<3:0>)), esta señal un disparo de evento especial en


escriba los valores deseados. reestablecerá el TIMIER1. CCP1 y CCP2. El registro T1CON
Cuando se escribe el registro del Nota.- El evento especial que se inicializa a 00h después de un
contador puede haber conflicto activa los módulos CCP1 y CCP2 no Power-on Reset o Brown-out Reset
mientras este se está activará el flag que deja a 1:1 el preescaler. En los
incrementando. Esto puede TMR1IF (PIR1<0>). demás reset, el registro no es
producir un valor imprevisible en el El TIMER1 debe configurarse alterado.
contador. como temporizador o contador
síncrono. TIMER1 PREESCALER
OSCILADOR DEL TIMER1 Restablecimiento TIMER1 que El contador del preescaler se
Se puede conectar un oscilador usa un disparador de CCP. pone a cero al escribir en los
a cristal entre los pines T1OSI TIMER1 debe configurarse registros TMR1H o TMR1L.
(entrada) y T1OSO (salida para temporizador o contador
del amplificador). Se debe síncrono para aprovechar esta RESUMEN DE REGISTROS
habilitar poniendo a uno el bit de característica. Si el TIMER1 está ASOCIADOS AL TIMER1
control TLOSCEN (TICON <3>). trabajando en modo contador En la siguiente tabla se muestran
El oscilador de bajo consumo asíncrono, el reset no puede ser los registros principales que
puede trabajar hasta 200 kHz. En activado. controlan el comportamiento del
estas condiciones el oscilador sigue En el caso de escribir sobre el TIMER1 y la distribución de los
funcionando aunque se fuerce el TIMER1 en el momento del bit.

Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en el
POR,BOR resto de Reset
0Bh,8Bh
10Bh,18Bh INTCON GIE PEIE T0IE INTE RBIE TOIF INTE RBIF 0000 000x 0000 000u
0Ch PIR1 PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
0Bh PIE1 PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE 0000 0000 0000 0000
0Eh TMR1L Registro de carga del byte de menor peso del registro de 16 bits de TMR1 xxxx xxxx uuuu uuuu
0Fh TMR1H xxxx xxxx uuuu uuuu
10h T1CON --- --- T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON --xx xxxx --uu uuuu

Leyenda
x = desconocido, u = inalterado; - = no implementado se lee como ‘0’. Las celdas sombreadas no son usa-
das por el TIMER1
Nota 1: Los bits PSPIE y PSPIF están reservados para el PIC16F873/876, mantener estos bits a cero.

modo SLEEP. Está pensado para disparo del evento especial de


trabajar con un cristal de hasta 32 CCP1 o CCP2, se tomará el valor PROGRAMA EJEMPLO DE
kHz. La Tabla 1 muestra el valor anterior. FUNCIONAMIENTO DEL
de los condensadores para el En el caso de escribir sobre TIMER1
TIMER1. TIMER1 si coincide con un disparo Para comprobar el
El oscilador TIMER1 es por evento especial de CCP1 o funcionamiento de este programa
idéntico al oscilador LP. El CCP2, se carga el valor anterior. utilizaremos el circuito de la
usuario debe proporcionar un En este modo de Figura 3 que es el mismo
tiempo de retardo por software funcionamiento, el par de registros que hemos utilizado para
para asegurar la salida apropiada CCPRxH:CCPRxL se reponen comprobare el funcionamiento del
del oscilador. para volver a tener el periodo del TIMER0, en el que se ha
TIMER1. conectado un display del tipo
RESTABLECIMIENTO DEL cátodo común al PORTB de
TIMER1 UTILIZADO LA RESTABLECIMIENTO DEL PAR PIC16F876. Una vez cargado el
SALIDA TRIGGER DEL CCP DE REGISTRO DEL TIMER1 programa TMR1_0.asm, en el
Si el módulo CCP1 o CCP2 (TMR1H, TMR1L) display se irán representado los
se configuran en modo Los registros TMR1H y números del 0 al 9 con una
comparación para generar un TMR1L no se inicializan a 00h cadencia de aproximadamente un
"disparo por evento especial" después de un Power-on Reset o segundo.
(CCP1M3:CCP1M0 = 1011 por cualquier otro reset excepto por
Curso microcontroladoresPAGS 29/4/03 10:38 Página 59

;*************************************************************************************
; Programa TMR1_0.ASM Fecha : 15 - Abril - 2003
; Este programa presenta en el display de cátodo común conectado en el PORTB
; los números del 0 al 9, mostrando un dato por segundo (aproximadamente), la
; temporización la realiza utilizando la interrupción por TMR1 y el registro auxilar CONTA
; Revisión : 0.0 Programa para PIC16F87X
; Velocidad del Reloj: 4 MHz Reloj Instrucción: 1 MHz = 1 uS
; Perro Guardián : deshabilitado Tipo de Reloj : XT
; Protecci¢n del código : OFF
;********************************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
;********************* DEFINICION DE VARIABLES *****************************
W_TEMPORALequ 0x20 ;Almacena W antes de atender la interrupción
S_TEMPORAL equ 0X21 ;Almacena Status antes de atender la interrupción
DIGITO equ 0x22 ;numero a representar en display
CONTA equ 0x23 ;Contador auxiliar para alargar el tiempo a 1 segundo
;entre cada cambio de digito, ya que los 256 (FF) del Timer,
;aunque se divida por 256, es 4x256x256=262,144 ms
;*******************************************************************************
; ORG 0x00
; goto INICIO
ORG 0x04
;******************* ATENCION A LA INTERRUPCION **************************
INT_TMR1
movwf W_TEMPORAL ;Guarda el valor actual de W cuando se interrumpe
swapf STATUS,W ;Intercambia nibbles y guarda en W
movwf S_TEMPORAL ;Almacena Status pero cambiado el ..
;.. nibble alto por el bajo
movlw low ~.62500 ;Carga parte baja del contador con el complemento
movwf TMR1L ; de 62500 en hex.
movlw high ~.62500 ;Carga parte baja del contador con el complemento
movwf TMR1H ;de 62500 en hex.
bcf PIR1,0 ;Desconecta el flag del TMR1
incf PORTB,F ;Incrementa el contador de la Puerta B
decfsz CONTA,f ;Decrementa CONTA y si =0 incrementa DIGITO
goto FIN_INT ;Si cont_aux <> 0 finaliza interrupcion
incf DIGITO,F ;Incrementa el DIGITO
movlw D'2'
movwf CONTA ;inicializa de nuevo cont_aux para un nuevo digito
FIN_INT
swapf S_TEMPORAL,W ;Deja Status como estaba antes y en W
movwf STATUS
swapf W_TEMPORAL,F ;Intercambia nibbles del W guardado
swapf W_TEMPORAL,W ;Vuelve a intercambiar pero ya en W
bcf INTCON,T0IF ;Borra el flag de la interrupción
retfie
;********************* PROGRAMA PRINCIPAL *************************************
INICIO
bcf STATUS,RP0
bsf STATUS,RP0 ;Habilita Banco1 de registros
clrf TRISB ;direcciona PortB como salidas
movlw b'11111111'
movwf OPTION_REG ;Preescaler d 128 asociado al WDT
bsf PIE1,0 ;habilita interrupción del TMR1
bcf STATUS,RP0 ;Selecciona banco 0
;El TMR1 trabaja con oscilador interno y un preescaler de 1:8. Si se trabaja a una frecuencia
;de 4 MHz, el TMR1 deberá ser cargado con 62500 para que provoque interrupción al de 0.5s b
movlw b'00110001'
movwf T1CON
movlw b'11000000'
movwf INTCON ;Habilitación global de interrupciones
movlw D'2' ;Carga CONTA con 2
movwf CONTA
PONER_0
clrf DIGITO ;Carga DIGITO a 0 para iniciar cuenta
LEETABLA
call TABLA
movwf PORTB ;Muestra digito en el display 7 segmentos (PortB)
movlw D'9' ;
subwf DIGITO,W ;Compara DIGITO con 9
btfss STATUS,Z ;
goto LEETABLA ;Si DIGITO NO = 9, incrementa DIGITO
goto PONER_0 ;Si DIGITO=9, lo pone a 0 de nuevo.
;********************* TABLA CON LOS VALORES DE LOS DIGITOS ******************
TABLA
movf DIGITO,W ;Guarda digito en acumulador
addwf PCL,F ;Suma al contador de programa el digito
DT 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X67
;*******************************************************************************
ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la página 0
goto INICIO ;Salto a la dirección de INICIO del programa
;*******************************************************************************
END
Curso (60-64) 3/7/03 09:47 Página 60

CURSO DE
MICROCONTROLADORES
MICROCONTROLADORES
PIC16F87X (...y VI)
Fernando Remiro Domínguez
Profesor de Sistemas Electrónicos
IES. Juan de la Cierva
www.terra.es/personal/fremiro

EL MÓDULO TIMER2 selecciona a través de los bits especiales, de manera, que al incre-
El TIMER2 es un temporizador- T2CKPS1:T2CKPS0 (T2CON mentarse TMR2 y coincidir con el
contador ascendente de 8 bits que <1:0>). El postsrscaler tiene como valor del registro PR2 se produce un
ocupa la posición 11H del banco de misión poner a nivel alto el flag de impulso de salida por EQ, estos
registros especiales, con un preesca- interrupción del TMR2 cuando se impulsos pueden ser divididos por
ler y un postscaler. Se puede usar haya producido la igualdad entre el un postescaler antes de activar el
como base de tiempo para el módulo registro PR2 y el TMR2 un número flag TMR2IF (PIR1<1>). El registro
PWM, el módulo CCP (Módulo de de veces comprendido entre 1 y 16 y PR2 es un registro de 8 bits que pue-
Captura y Comparación) y el Puerto que se indica con los bits de ser escrito y leído. Este registro

60
Serie Síncrono (SSP). El registro T2OUTPS3:T2CKPS0 (T2CON toma el valor FF después de un
TMR2 se puede leer y escribir y se <6:3>) Reset.
pone a cero después de realizar un El postscaler permite dividir la
RESISTOR Reset. OPERACIONES CON EL señal que activa el flag
La señal de reloj interna TIMER2 de interrupciones por desbordamien-
(FOSC/4) antes de llegar al TMR2 El Titner2 tiene emparejado el to del TMR2 por cualquier valor
pasa por un preescaler (Predivisor) registro PR2 que ocupa la posición comprendido entre 1:1 hasta 1:16,
con rangos de 1:1, 1:4, 1:16 que se de 92H del banco 1 de registros para controlar el postescaler se utili-

Figura 1.- Diagrama de bloques del módulo TIMER2


Curso (60-64) 3/7/03 09:47 Página 61

zan los bit TOUTPS3:TOUTPS0 REGISTRO T2CON: REGISTRO DE CONTROL DEL TIMER2
(T2CON <6:3>). (DIRECCIÓN 12H)
El Preescaler y el Postescaler se
ponen a cero cuando:
● Se escribe sobre el registro TMR2 U-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R/W-0
● Se escribe sobre el registro
T2CON --- TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
● Se produce un reset (POR, MCLR
restablecido, WDT reestablecido o Bit 7 Bit 0
BOR)
TMR2 no se pone a cero cuando
se escribe en T2CON. bit 7: No implementado: Se lee como 0
Para reducir el consumo total del
microcontrolador se puede "apagar" bit 6-3: TOUTPS3:TOUTPS0: bit de selección del rango del divisor del
el temporizador poniendo a cero el
bit TMR2ON (T2CON<2>). Postescaler para el TIMER2

INTERRUPCIONES DEL 0000 = Divisor del postescaler 1:1


TIMER2
0001 = Divisor del postescaler 1:2
El temporizador TMR2 tiene un
flag de desbordamiento el TMR2IF 0010 = Divisor del postescaler 1:3
(<1>PIR1).
El TMR2 tiene asociado un 0011 = Divisor del postescaler 1:4
Registro de Periodo PR2, que ocupa
la posición 92h. Cuando el valor de 0100 = Divisor del postescaler 1:5
cuenta de TMR2 coincide con el
valor cargado en PR2 se genera un 0101 = Divisor del postescaler 1:6
impulso en la salida EQ (ver la Figu-
ra 1) y se pone a cero el TMR2. Estos 0110 = Divisor del postescaler 1:7
impulsos pueden ser divididos por el 0111 = Divisor del postescaler 1:8
postdivisor antes de activar el flag
TMR21F(<1> PIR1). 1000 = Divisor del postescaler 1:9
El temporizador puede producir
una interrupción si se pone a 1 el bit 1001 = Divisor del postescaler 1:10
TMR2IE (<1> PIE1)
1010 = Divisor del postescaler 1:11
SALIDA DEL TMR2
La salida de TMR2 (antes del 1011 = Divisor del postescaler 1:12
postscaler) alimenta al Módulo de
1100 = Divisor del postescaler 1:13
SSP que opcionalmente puede usar-
se para generar la señal de reloj de 1101 = Divisor del postescaler 1:14
desplazamiento.
1110 = Divisor del postescaler 1:15
PROGRAMA EJEMPLO
DE FUNCIONAMIENTO 1111 = Divisor del postescaler 1:16
DEL TIMR2 CON
INTERRUPCIONES. bit 2: TMR2ON: bit de activación del TIMER2
Para comprobar el funcionamien-
to de este programa, utilizaremos el 1:= habilita el funcionamiento del TIMER2
mismo montaje que hemos utilizado 0 = Inhibe el funcionamiento del TIMER2
para comprobar el funcionamiento
del Timer0 y del Timer1, que es el bit 1-2: T2CKPS1:T2CKPS0 Selección del rango de divisor del Preescaler
que se representa en la Figura 2.
La estrategia para conseguir del TIMER2
la temporización de aproximada-
mente un segundo es la que se refle- 00 = Divisor del Preescaler 1:1
ja en el diagrama de flujos de la
Figura 3, y consiste en lo siguiente. 01 = Divisor del Preescaler 1:4
Partiendo de la base de que nuestro
Ix = Divisor del Preescaler 1:16
microcontrolador tiene un cristal de
Curso (60-64) 3/7/03 09:47 Página 62

REGISTROS ASOCIADOS AL TMR2


Dirección Nombre Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Valor en el
MICROCONTROLADORES
POR,BOR resto de Reset
0Bh,8Bh INTCON GIE PEIE T0IE INTE T0IF RBIE INTF RBIF 0000 000x 0000 000u
10Bh,18Bh
0Ch PIR1 PSPIF(1) ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF 0000 0000 0000 0000
0Bh PIE1 PSPIE(1) ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IF 0000 0000 0000 0000
11h TMR2 Módulo Del registro Timer2 0000 0000 0000 0000
12h T2CON --- TOUTPS3 TOUPS2 TOUPS1 TOUPS0 TMR2ON T2CKPS1 T2CKPS0 - 000 000 - 000 0000
92h PR2 Registro de período del TMR2 1111 1111 1111 1111

Leyenda
x = desconocido, u = inalterado; - = no implementado se lee como ‘0’. Las celdas sombreadas no son usadas
por el TIMER2
Nota 1: Los bits PSPIE y PSPIF están reservados para el PIC16F873/876, mantener estos bits a cero.

62
RESISTOR

Figura 2.- Circuito de aplicación para el programa TMR2_1

cuarzo de 4 Mhz, y de que un ciclo 195, con un preescaler de 1/16, se as de código que hemos eliminado
máquina se ejecuta en un 1 µs, la puede llegar a 3120 µs y por último para utilizar el programa bootloader
máxima cuenta del que podemos con un postescaler de 1/16 se obtiene para poder realizar la carga del mis-
hacer con el TIMER2 es de 256 µs, una temporización de 49.920 µs que mo y en color verde, las líneas que
si tenemos en cuenta la máxima divi- aproximadamente es de 50 ms. Pues hemos añadido, de tal manera que
sión del preescaler de 1/16 y del bien, si esta temporización se realiza eliminado las líneas de color verde y
postscaler 1/16 la máxima cuenta o 20 veces, ya tenemos prácticamente habilitando las que están en azul el
temporización a la que se puede lle- 1 segundo. programa puede grabarse directa-
gar es a 256 x 16 x 16 = 65536 µs. El programa es el siguiente, en el mente en un PIC16F876.
Por lo tanto, si se carga el registro de que como viene siendo habitual
periodos PR2 con el valor decimal están marcado en color azul las líne-
Curso (60-64) 3/7/03 09:47 Página 63

MICROCONTROLADORES
63
RESISTOR

Figura 3.- Organigrama del programa TMR2_1.asm


Curso (60-64) 3/7/03 09:47 Página 64

;**********************************************************************************
;TIMER2-1.asm
;El TMR2. Temporización hace que el display que está conectado al PORTB se incremente cada
; segundo. El TMR2 provoca una interrupción cada 50 mS. Transcurridas 20 interrupciones, el tiempo
; total obtenido es de 1 segundo.
; Revisión : 0.0 Programa para PIC16F87X
MICROCONTROLADORES
; Velocidad del Reloj: 4 MHz Reloj Instrucción: 1 MHz = 1 uS
; Perro Guardián : deshabilitado Tipo de Reloj : XT
; Protección del código : OFF
;**********************************************************************************
List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
VECES equ 0x20 ;Variable de temporización
CONTADOR equ 0x21 ;Variable del contador
; org 0x00 ;Vector de Reset
; goto INICIO
org 0x04
goto INTERUPCION ;Vector de interrupción
;********************* TABLA CON LOS VALORES DE LOS DIGITOS ******************
TABLA addwf PCL,F ;Suma al contador de programa el digito
DT 0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X67;
;*******************************************************************************
;PROGRAMA DE ATENCIÓN A LA INTERRUPCION. se ejecuta cada 50 ms, cuado se ejecuta
;20 veces, indica de que ha transcurrido 1 segundo
INTERUPCION decfsz VECES,F ;Ha pasado un segundo ??
goto No_es_1_seg ;No
incf CONTADOR,F ;Si, incrementa el contador
movlw .10
subwf CONTADOR,W
64
RESISTOR
btfsc
clrf
STATUS,Z
CONTADOR
movf CONTADOR,W
call TABLA
;Contador > 9 ??
;Si, ponerlo a 0
;Convierte a 7 segmentos
movwf PORTB ;presenta el dato en el display
movlw .20
movwf VECES ;Reinicia variable delay
No_es_1_seg bcf PIR1,TMR2IF ;Repone el flag del TMR2
clrf TMR2 ;Reinicia el TMR2
retfie
;*****************************************************************************
;PROGRAMA PRINCIPAL
;*****************************************************************************
INICIO clrf PORTB ;Desconecta salidas
bsf STATUS,RP0 ;Selecciona banco 1
movlw b'00000110'
movwf ADCON1 ;Configura PORTA E/S digitales
clrf TRISB ;Configura PORTB como salida
bsf PIE1,TMR2IE ;Habilita interrupción del TMR2
movlw .195
movwf PR2 ;Carga registro de periodos con 195
bcf STATUS,RP0 ;Selecciona banco 0
movlw b'01111111'
movwf T2CON ;TMR2 ON, preescaler 1/16 y postcaler 1/16
clrf TMR2 ;pone a cero TMR2
movlw .20
movwf VECES ;Inicia variable de VECES
movlw b'11000000'
movwf INTCON ;Habilita interrupciones
clrf CONTADOR ;Inicia el contador
goto $ ;Bucle infinito
;*****************************************************************************
ORG 0x1F00
bcf PCLATH,4
bcf PCLATH,3 ;Selecciona la página 0
goto INICIO ;Salto a la dirección de INICIO del programa
;*****************************************************************************
end