Está en la página 1de 510

Escuela de Ingeniería Eléctrica

AUTOR: César Álvarez


DISEÑO INSTRUCCIONAL: 1
Contenido Marilú Sánchez y César Álvarez Instrucciones
INSTRUCCIONES

• Botón para avanzar..........................


• Botón para retroceder......................
• Botón para ir al contenido principal.. INICIO
• Botón para retornar..........................
• Para ir a un tema del contenido,
hacer clic en título del tema............. Tema..
• Para salir, presione la tecla.............. Esc

2
Equipo necesario
Requerimientos mínimos

• Computador personal Pentium III 128MB RAM, disco duro con


100MB libres, unidad de CD, monitor igual o mayor de 14” de
alta resolución y puertos: serial (RS-232) o paralelo (LPT), y
conexión a Internet (no indispensable, pero recomendable).
• Sistema operativo Windows 98SE o superior.
• Software MS Office 2000 o superior (Power Point).
En cuanto a componentes, podrás tratar de ubicar lo siguiente:
• Microcontroladores: PIC16C54JW o PIC16F54, PIC16F84A y un
PIC16F877 o algún otro PIC16F87X.
• Leds rojos, verdes y amarillos, resistencias, indicadores
numéricos 7 segmentos, pulsadores, interruptores y lo que te
interese utilizar para tus aplicaciones.
• Un programador PICSTART Plus. Si no lo consigues o te parece
muy costoso, podrás construir tu propio programador, para ello
deberás consultar el anexo 7 después de ver el tema 2.
Además será necesario
• Mucha voluntad y dedicar suficiente tiempo para aprender sobre
los microcontroladores PIC.

3
INSTALACIONES

• Instalar el siguiente software, si no lo ha hecho con anterioridad,


para la consulta de artículos en Internet y tener tu sistema de
desarrollo:
– Acrobat Reader
– Win Zip
– MPLAB IDE
Para ello podrá hacer Clic en el programa que deseas instalar o
deberás ingresar a los sitios webs de cada uno de ellos,
buscar el software de instalación, bajarlo gratis, y luego hacer
las instalaciones.
Te recordamos que para hacer las instalaciones, deberás salir del
módulo instruccional al pulsar la tecla Esc y luego
llamar a cada uno de los programas instaladores por
separado, en el orden sugerido.

4
CONTENIDO
INTRODUCCIÓN.
 TEMA I. GENERALIDADES DE LOS MICROCONTROLADORES PIC
 TEMA 2. PROGRAMACIÓN DEL PIC16C54.
 TEMA 3. MEMORIA DE PROGRAMA, REGISTROS, PUERTOS Y
TEMPORIZADORES
 TEMA 4. CARACTERÍSTICAS ESPECIALES DEL HARDWARE
 TEMA 5. OTROS MICROCONTROLADORES DE LA GAMA BÁSICA
 TEMA 6. MICROCONTROLADOR PIC 16F84A
 TEMA 7. MICROCONTROLADORES DE LA SERIE PIC16F87X
 CONCLUSIÓN
 ANEXOS
• El objetivo primordial que nos movió a diseñar este material, es el de
que adquieras, a través de su estudio teórico y práctico, las habilidades
y destrezas necesarias para conocer los microcontroladores y diseñar
circuitos basados en algunos de ellos.
• Se explicará y describirá qué son los microcontroladores, cuáles son sus
aplicaciones y funciones, y se describirán ejemplos de circuitos, para
aprender a manejarlos.
• Para ello hemos decidido trabajar con los microcontroladores PIC de
Microchip, debido a que, en la actualidad, son los que tienen mayor
popularidad, tanto en las universidades del continente americano y
europeo, como en las diversas industrias que desarrollan proyectos en
electrónica.
• Este material se ha dividido en siete temas, con los cuales irás
aprendiendo poco a poco acerca de los microcontroladores PIC, desde el
más básico, el PIC16C54, luego podrás observar las diferencias con otros
miembros de la serie PIC16C5X, si así lo deseas. Después podrás
conocer al microcontrolador PIC16F84A que es uno de los más básicos la
gama media, y finalmente se hablará sobre los microcontroladores de la
serie PIC16F87X, los cuales son los más utilizados de la gama media.

6 INICIO
• La metodología empleada consiste en explicar de manera secuencial, desde el
microcontrolador más básico, hasta que poco a poco vayas conociendo aquellos
componentes con mayor complejidad. Por otro lado, se incluirá desde un principio,
nociones básicas del software que te ambientará en el desarrollo de tus programas: El
MPLAB, el cual irás empleando, a medida que vayas elaborando tus programas,
instrucciones del lenguaje ensamblador, métodos para simular tus programas, elaboración
de interfaces electrónicas para la adaptación de señales y el uso del programador, para
que puedas hacer el montaje de los circuitos que has desarrollado.

• Este módulo instruccional te ofrece además, algunos anexos, los cuales podrás
consultar para profundizar tus conocimientos acerca de los microcontroladores y el
software que emplearás, definiciones comúnmente utilizadas en este campo, y
sugerencias para la elaboración de circuitos electrónicos con microcontroladores PIC.

7 INICIO
DIVISIÓN DE LOS TEMAS

Los temas están divididos de la siguiente manera:

• Tema 1: Se muestra en forma general el concepto de microcontroladores, cómo han


surgido, cuáles son los fabricantes más destacados y se resume las características
principales de los microcontroladores PIC. Luego se presenta la arquitectura del
microcontrolador PIC16C54 y se describe cada una de las instrucciones de los
microcontroladores de la gama básica.

• Tema 2: Se explica detalladamente los pasos para programar cualquier


microcontrolador. Se dan ejemplos y se enseñan los primeros pasos para trabajar con el
lenguaje Ensamblador y el ambiente de trabajo MPLAB, el cual es una herramienta muy
poderosa para trabajar con cualquiera de los microcontroladores PIC que vayas a utilizar
en el futuro. Aquí aprenderás: a editar un programa, a ensamblarlo en un código para la
memoria del microcontrolador, a simularlo para observar si la lógica del programa está
correcta y grabarlo en un microcontrolador. Para ello utilizaremos unos ejemplos sencillos.

• Tema 3: En este aparte, se describe cómo está organizada la memoria de programa y


de datos del microcontrolador PIC16C54. Esto te ayudará a comprender cómo programar
por medio de los registros de funciones especiales que son los que controlan el programa y
algunos circuitos específicos dentro del microcontrolador. Con ello podrás hacer
programas un poco más complejos.

8 INICIO
TEMAS RELACIONADOS CON
MICROCONTROLADORES MÁS AVANZADOS

• Tema 4: Aquí verás las características de los circuitos internos o hardware del
microcontrolador PIC16C54. En este tema podrás informarte acerca de la
inicialización del circuito, los temporizadores internos, el modo de reposo o bajo
consumo y los tipos de osciladores que puedes utilizar.

•Tema 5: En este aparte aprenderás acerca de otros microcontroladores de la gama


básica y las diferencias con el PIC16C54.

• Tema 6: En este tema te iniciarás con la familia de los microcontroladores de la


gama media. Aquí verás las diferencias entre el PIC16C54 y el PIC16F84A;
encontrarás que estas diferencias consisten en algunas mejoras que te permitirán
desarrollar circuitos más versátiles. En el estudio del PIC16F84A te darás cuenta que
todo lo que aprendiste en los cuatro primeros temas, lo aplicarás a este tema.

• Tema 7: En este último tema encontrarás información sobre los microcontroladores


de la gama media de la serie PIC16F87X, los cuales tienen mucha aplicación en la
industria. Estos microcontroladores tienen gran capacidad de funciones, ya que pueden
leer señales analógicas, hacer control de potencia por modulación de ancho de pulsos,
comunicación serial y otras posibilidades más.

• Anexos: En los anexos encontrarás una guía de referencia para consulta: El


glosario, el manejo detallado de instrucciones, las directivas del lenguaje ensamblador,
algunas notas de aplicación, etc.

9 INICIO
UNOS CONSEJOS MÁS
ANTES DE EMPEZAR

• Para el mejor aprendizaje de este módulo es conveniente que leas y practiques con
este material de manera ordenada, para que tú, como interesado en esta área,
conozcas los microcontroladores, su tecnología electrónica avanzada y su aplicación en
la actualidad.
• Es importante que cuentes, al menos con una computadora compatible con las PCs que
trabaje en ambiente Windows, e instales el MPLAB IDE, el cual lo puedes bajar
gratuitamente en la dirección microchip.com. Si tienes la posibilidad de obtener el
PICSTART PLUS, y conseguir algunos microcontroladores, tales como el PIC16F54, el
PIC16F84 y el PIC16F877 sería mucho más provechoso para ti todavía, ya que podrás
contar con la posibilidad de hacer tus propios montajes.
• Si no tienes la posibilidad de obtener el PICSTART PLUS, en el anexo 7 encontrarás
un circuito y un software que podrás utilizar para grabar tu microcontrolador PIC.
• Finalmente, te aconsejamos que para empezar a estudiar con microcontroladores,
será necesario que tengas conocimientos de electrónica analógica y electrónica digital:
Circuitos con resistencias, condensadores, diodos, leds, transistores, tiristores,
amplificadores operacionales, interfaces, Álgebra de Boole, sistemas numéricos
binarios y hexadecimales, aritmética de números binarios, compuertas lógicas, bloques
funcionales combinacionales, contadores, etc.
• Mientras mayores conocimientos tengas de electrónica, circuitos digitales,
instrumentación y otros campos relacionados o no con la electrónica, mejor provecho
podrás sacar a estos microcontroladores para tus planes en el futuro.

10 INICIO
 Te recomendamos que leas el material detalladamente, porque así
comprenderás mejor el contenido.

 Ten presente, que gracias a tu empeño el aprendizaje dependerá de


ti, ya que eres el único responsable directo de él.

 Debes cumplir con las actividades y ejercicios que aparecen en el


material.

 Cuando tengas dudas, pide a tu profesor asesor de la materia una


entrevista.

 Si eres claro al responder la auto-prueba que aparece en el


material, sabrás cuál ha sido tu avance.

11 INICIO
Generalidades de los Microcontroladores PIC
1.1.- Contexto histórico de los microcontroladores
1.2.- Definiciones de microcontroladores
1.3.- Funciones de los microcontroladores
1.4.- Aplicaciones de los microcontroladores
1.5.- Algunos fabricantes de microcontroladores
1.6.- Consideraciones que debes tener antes de seleccionar un microcontrolador
1.7.- Familia de los microcontroladores PIC
1.8.- Principales características del PIC16C54
1.9.- Descripción de los microcontroladores PIC16C54
1.10.- Arquitectura del microcontrolador PIC16C54
1.11.- Instrucciones del PIC16C54 y los PIC de la gama básica

INICIO
Objetivos Terminales:

•Describir cómo han surgido


los microcontroladores a
través del tiempo.
•Enumerar algunas aplicacio-
nes de los microcontrolado-
res.
•Explicar la arquitectura de
los microcontroladores de la
serie PIC16C54.
•Clasificar las instrucciones
de los microcontroladores
de la gama básica.

INICIO
1.1.- Contexto histórico de los
Microcontroladores
Al comenzar la década de 1970, los microcontroladores hicieron su aparición, y han
encontrado una gran aceptación en los diseños de aplicaciones electrónicas que
requieren un nivel básico de automatización y programación. Hoy en día su uso se
extiende en casi cualquier elemento que contenga componentes electrónicos: equipos de
sonido, televisores, hornos de microondas, aires acondicionados, sistemas de alarmas,
automóviles, periféricos de computadoras, teléfonos inalámbricos y celulares,
calculadoras, agendas electrónicas, traductores de idiomas, controles inalámbricos,
relojes despertadores, equipos de control industrial, equipos médicos, medidores
digitales, y así puede nombrarse un sinnúmero de aparatos los cuales tienen al
microcontrolador como circuito de control para el funcionamiento de éstos.
La razón de tal aceptación, se debe a que un microcontrolador, es básicamente una
computadora en miniatura, y como tal, puede desarrollar un gran número de funciones
según los programas que tenga grabado en su memoria.
Hoy en día existen microcontroladores con un potencial superior al de las primeras
computadoras personales, lo cual indica las posibilidades que se pueden desarrollar con
ellos, y todo esto en un pequeño circuito integrado.

14 INICIO
El primer microcontrolador

Durante la década de 1960, algunas compañías fabricantes de dispositivos electrónicos,


entre ellas Intel, Texas Instruments y Motorala, decidieron integrar componentes
electrónicos para el desarrollo de circuitos integrados. Intel marcó una pauta al
desarrollar un procesador de 4 bits, el Intel 4004, después fabricó microprocesadores
de 8 bits: el 8008 en 1972, el 8080 en 1973 y el 8085 en 1975. Por su parte en 1971
Texas Instruments anunció el desarrollo de su primer microcontrolador: El TMS1000,
cuya patente fue dada al ingeniero Gary Boone y a la Texas Instruments. Este
componente fue utilizado inicialmente para la construcción de calculadoras de 8 dígitos
que realizaban las cuatro operaciones básicas: suma, resta, multiplicación y división.
Al TMS1000, en un principio, se le llamó “computador en un
chip”, constaba de las siguientes partes: oscilador, unidad
central de procesamiento con un juego de 32 instrucciones, 64 x
4bits de RAM, 1024 bytes de ROM y puertos de entrada salida.
En los últimos veinte años del siglo XX, muchos fabricantes se
han dedicado a la tarea de desarrollar una gran diversidad de
microcontroladores de 4, 8, 16 y 32 bits, siendo los de 8 y 16
bits, los más populares.

15 INICIO
Surgimiento de los PICs

En cuanto a los microcontroladores PIC, en 1965, la empresa “General Instruments”


creó una división de microelectrónica, “GI Microelectronics Division”, que comenzó
fabricando memorias. A principios de los años 1970 diseñó el microprocesador de
16 bits CP1600, razonablemente bueno, pero que no manejaba eficazmente las
entradas y salidas. Para solventar este problema, en 1975 diseñó un circuito
integrado destinado a controlar los puertos: el PIC (Peripheral Interface
Controller). Se trataba de un controlador rápido pero limitado y con pocas
instrucciones, pues iba a trabajar en combinación con el microprocesador CP1600.
La arquitectura del PIC, que se comercializó en 1975, era sustancialmente la misma
que la de los actuales modelos PIC16C5X. En aquel momento se fabricaba con
tecnología NMOS y el producto sólo se ofrecía con memoria de lectura solamente
(ROM) y con un pequeño pero robusto conjunto de instrucciones.
La década de los años 1980 no fue buena para GI, que tuvo que reestructurar sus
negocios, concentrando sus actividades en los semiconductores de potencia.

16 INICIO
La “GI Microelectronics División” se convirtió en una empresa subsidiaria, llamada
“GI Microelectronics Inc.” Finalmente, en 1985, la empresa fue vendida a un grupo
de inversores de capital de riesgo, los cuales, tras analizar la situación,
rebautizaron a la empresa con el nombre de “Arizona Microchip Technology”, y
orientaron su negocio a los PICs, las memorias EPROMs paralelo y las EEPROMs
serie. Se comenzó rediseñando los PICs, que pasaron a fabricarse con tecnología
CMOS, surgiendo la familia de gama básica PIC16C5X, considerada como la
"clásica".
El éxito de los microcontroladores PIC ha sido vertiginoso. Mientras en 1990
ocupaba la vigésima posición en ventas de microcontroladores de 8 bits, en 1999
subió a la segunda posición, y desde 2002 se mantiene en la primera. En febrero
de 2004 llegaron a totalizar las tres mil millones de unidades vendidas y la
tendencia es seguir aumentando esta cantidad.

17 INICIO
Las razones del éxito de los PIC se basa quizás en muchas cosas: simplicidad en el
uso, conjunto de pocas instrucciones con alta eficiencia de código, rapidez en la
ejecución de programas, compatibilidad de instrucciones desde la gama básica a la
alta, gran variedad de modelos, multiplicidad de interfaces, soporte de software,
librería de aplicaciones prácticas. En pocas palabras, son elementos de muy alta
versatilidad que pueden utilizarse en un sinnúmero de diferentes diseños electrónicos
y, cuando se aprende a manejar uno de ellos, conociendo su arquitectura y su
repertorio de instrucciones, es muy fácil emplear otro modelo.
Los fabricantes de los PICs, ofrecen una gama de diversos tipos de
microcontroladores, que pueden ser usados en muchas aplicaciones; desde un sencillo
reloj digital, hasta el control de velocidad de motores de inducción y circuitos de
control que utilizan lógica difusa en aplicaciones de robótica y procesos industriales.

18 INICIO
La diversidad de modelos, abarca los microcontroladores básicos, los cuales tienen:

Unidad central de procesamiento, memoria de programa (PROM, EPROM o FLASH),

memoria de datos (RAM), puertos y temporizadores. Hay otros, más avanzados, que

ofrecen, además de los elementos mencionados anteriormente, algunos de los circuitos

que se nombran a continuación: Manejador de interrupciones, convertidores A/D,

convertidores D/A, memoria EEPROM y FLASH (que pueden mantener sus datos después

de quitar la alimentación, sin añadir un equipo externo), moduladores de ancho de pulso,

sensores de temperatura, comparadores, interfaces seriales, entre otros.

19 INICIO
1.2.- Definiciones de Microcontrolador

 Es un computador completo dedicado, aunque con limitadas prestaciones, que está


contenido en un circuito integrado y se destina a gobernar una sola tarea.

 Son circuitos integrados programables que constan básicamente de una unidad


central de procesamiento (CPU), una memoria de programa, una memoria de datos,
puertos de entrada y salida, temporizador y circuitos de inicialización y reloj.

20 INICIO
1.3.- Funciones de los
Microcontroladores

Los microcontroladores tienen funciones específicas, que se realizan de acuerdo al


programa grabado y a las conexiones de las líneas de entrada y salida. Estas líneas
se conectan a interfaces que manejan elementos de lectura y de acción final en un
equipo o sistema a controlar.
Microcontrolador
100

80

60

40
Interfaces
20
AUTOR: César Álvarez
DISEÑO INSTRUCCIONAL:
M. Sánchez y C. Álvarez

21 INICIO
1.4.- Aplicaciones de los
Microcontroladores

Los microcontroladores tienen una gran


cantidad de aplicaciones; prácticamente
cualquier aparato electrónico que se fabrica
en la actualidad utiliza al menos un
microcontrolador.

Las aplicaciones de éstos pueden desglosarse


en áreas de: computación, comunicaciones,
industria, automoción y electrodomésticos.

22 INICIO
1.5.- Algunos Fabricantes de
Microcontroladores
Fabricante Microcontroladores Capacidad de Memoria
Intel MCS51, 151, 251 8KB - 16KB ROM, 256B - 1KB RAM
Siemens C540U (8051) 4KB - 8KB ROM, 256B RAM
Dallas, Atmel 8051-52 2KB - 16KB ROM, 256B - 16KB RAM
Motorola 68HC05 0 - 16KB ROM, 176B – 512B RAM
68HC08 16KB - 32KB ROM, 512B - 1KB RAM
68HC11 4KB - 32KB ROM, 256B - 2KB RAM
Texas Instruments TMS370 0KB - 64KB ROM, 128B - 2KB RAM
NEC m PD7890xxx 2KB - 24KB ROM, 128B – 512B RAM
m PD780xxx 8KB - 60KB ROM, 256B - 2KB RAM
Toshiba TLCS-870 4KB - 60KB ROM, 256B - 2KB RAM
TLCS-90 0 - 60KB ROM, 0 - 2KB RAM
Hitachi H8/300 8KB- 60KB ROM, 256B - 2KB RAM
SGS- ST-6 1KB- 8KB ROM, 64B – 320B RAM
THOMSON ST-7 4KB- 60KB ROM, 256B - 2KB RAM
(ST-Micro) ST-9 0KB-128KB ROM, 512B - 4KB RAM
National COP820, 840, 880C, 912 1KB- 4KB ROM, 64B – 128B RAM
Semiconductor COP884xx, 888xx 4KB-32KB ROM, 128B –1088B RAM
Zilog Z8 0,5KB - 32KB ROM, 61B – 237B RAM
Microchip 16Cxx 512X12 - 4KX14 ROM, 25B –192B RAM
18Fxx 2K - 32Kx16 ROM, 232B – 2KB RAM

INICIO
Las compañías de mayor producción de
microcontroladores de 8bits 1990 - 2002

INICIO
1.6.- Consideraciones a tomar antes
de seleccionar un Microcontrolador:
Principalmente se debe tomar en cuenta, en qué aplicación quieres que éste opere.
Si deseas seleccionar algún fabricante específico, para desarrollar muchas
prototipos, entonces se deberá escoger aquél que ofrezca ciertas ventajas tanto en
las características del hardware como del software.

• Debe seleccionarse a aquellos que ofrezcan


• Suficiente capacidad de memoria para los facilidad de programación y códigos de
programas y datos. programación eficientes.
• Líneas de entrada y salida suficientes para • Programas de simulación de fácil uso.
la aplicación a desarrollar.
• Soporte de lenguajes de programación de
• Que presente rapidez en la ejecución de los alto nivel.
programas.
• Compatibilidad con los sistemas operativos
• Sencillez en el montaje. más comunes.
• Sistema de soporte para la grabación. • Disponibilidad de programas y librerías de
• Diversidad de productos. aplicaciones.
• Disponibilidad en el mercado y bajo costo. • Disponibilidad de herramientas de desarrollo.

En este módulo instruccional hemos seleccionado a los microcontroladores PIC de


Microchip, ya que ofrecen una gran variedad de productos para muchas aplicaciones.

25 INICIO
En principio, para la selección de un microcontrolador en una aplicación específica,
deberás tomar en cuenta muchos factores para que esta escogencia resulte en una
relación efectiva de bajo costo. Entre estos factores están: tensión de
alimentación, tipo de fuente a utilizar, capacidad de memoria de programa y de
datos, tipos de señales a manejar, cantidad de líneas de entrada y salida, tipos de
memorias para programa y datos, capacidad de interrupción, tamaño y otros
factores más.
Podría darse el caso, de tomar en cuenta muchos de estos factores y luego
encontrar otro microcontrolador que se adapte mejor a lo que tú deseabas. En este
sentido, no hay mayor problema, ya que el programa que elaboraste en el primer
microcontrolador, podrá ejecutarse en otro, si éste es de la misma gama o de una
gama superior.
Por otro lado podríamos dar una idea inicial de aquellos microcontroladores que
ofrece Microchip, según la serie a la cual pertenece. En las páginas siguientes de
este módulo instruccional se mencionan las características principales de estos
microcontroladores. Para un análisis más detallado, deberás consultar con las
especificaciones que presenta el manual del fabricante.
Finalmente, en este módulo encontrarás cómo trabajar con los microcontroladores
más utilizados de Microchip. Obteniendo un buen aprendizaje, podrás seleccionar el
microcontrolador más adecuado para tu aplicación específica.

26 INICIO
1.7.- Familia de los
Microcontroladores PIC
La familia de los microcontroladores de 8 bits de Microchip, es muy variada, y
prácticamente hay un tipo de microcontrolador para cada aplicación. La siguiente
tabla resume las características principales de cada familia hasta comienzos de 2004.
La serie dsPIC, que aparece al final de la tabla, es una familia de procesadores
señales de 16bits que entró en producción recientemente.

PIC Memoria de Características Principales


Series Programa

PIC 12C5XX 0,5 - 1K x 12 Opción EEPROM, Velocidad: 1 a 2 MIPS


PIC 12C6XX 2K x 14 8 Terminales, Oscilador incluido, A/D C
PIC 12F6XX 0,5 - 1K x 14 A/D C, EEPROM, FLASH, Oscila. interno
Velocidad: 5 MIPS, 8 Terminales.
PIC 14C000 4K x 14 A/D C 16 Bits, DA/C, Lector de temperat.
28 terminales, manejo de Interrupciones
PIC 16C5X 0,5K -2K x 12 Velocidad: 5 MIPS, Disponibilidad en
14, 18 y 28 terminales
PIC 16CXXX 0,5K -8K x 14 Comparador Digital y analógico, Interrpc.
Modulador de ancho de pulso (PWM),
Interfaz serial (USART), A/D C ,
Manejador LCD, variedad de tamaños.

27 INICIO
PIC 16FXXX 0,5K - 8K x 14 A/D C de 10bits, PWM, USART, EEPROM,
FLASH o ROM, Manejo de Interrupciones,
I2C, Comparador Digital, Vel: 5 MIPS,
Disponibles en 18, 28,40 y 44 Terminales.
PIC 17C4X/7XX 2K - 8K x 16 Multiplicador de 8x8 bits, Comparador
Digital, PWM, Opciones en: OTP, EPROM
y FLASH - ROM, USART, I2C,Velocidad:
8,5 MIPS, manejo de Interrupciones,
Disponibilidad de hasta 44 Terminales.
Conjunto de 58 instrucciones de 16 bits.
PIC18CXX /18FXX 0 - 65K x 16 Similar a la serie PIC 17C7XX. Conjunto
de 77 instrucciones de 16 bits velocidad
de 10 MIPS. Compilación en C eficiente

rfPIC12C5XX 1K x 12 Similar a la serie PIC 12XXX, pero incluye


rfPIC12F6XX 1K x 14 un transmisor de radio frecuencia UHF.
dsPIC30FXXXX 4K - 48K x 24 A/D C de 12bits, PWM, EEPROM, FLASH
(Procesadores de Manejo de Interrupciones, USART, I2C,
señales de 16bis) CAN, Comparador Digital, Vel: 30 MIPS,
18 a 80 Terminales. Conjunto de 84 instruc.

28 INICIO
1.8.- Principales características del
PIC16C54

 Facilita la labor de depuración de programas.

 Permite el desarrollo de aplicaciones en poco tiempo.

 Todas las instrucciones son sencillas y presentan un código eficiente, lo que


permite reducir un programa a la mitad con respecto a otros microcontroladores de
8 bits.

 Circuito de inicialización incluido.

 Presenta cuatro configuraciones programables para el oscilador.

 Modo “Reposo” (sleep) para el ahorro de energía.

 Temporizador “perro guardián” (Watchdog), para prevenir que un programa se


“cuelgue”.

 Protección de programas.

29 INICIO
1.9.- Descripción del Microcontrolador
PIC16C54

El PIC16C54 es un microcontrolador de 8 bits de tecnología CMOS.

Este microcontrolador tiene una arquitectura RISC con un conjunto de apenas 33


instrucciones de una sola palabra (12 bits), lo cual reduce esfuerzo en memorizar
los códigos de instrucción.

30 INICIO
1.10.- Arquitectura del
Microcontrolador PIC16C54
El microcontrolador PIC16C54 utiliza una arquitectura Harvard, lo cual significa que la
memoria de programa y la de datos está separada en dos buses diferentes. Esto
mejora la velocidad en el acceso a instrucciones y datos, y permite utilizar palabras de
una longitud para las instrucciones y otra para los datos.

El PIC16C54 utiliza códigos de instrucción de 12 bits, esto permite combinar


instrucciones de un ciclo donde se incluye el acceso directo a la memoria de datos;
además, se cuenta con una estructura de entubamiento en la cual, mientras se ejecuta
una instrucción, se prepara la siguiente, es decir, significa un ahorro en el tiempo de
ejecución de cada programa, en donde se necesita apenas cuatro períodos del oscilador
por cada ciclo de ejecución de una instrucción. Por ejemplo: para un oscilador con una
frecuencia igual a 20 MHz, el período del oscilador es de 50nSeg; esto significa que el
ciclo de una instrucción tarda 4 X 50nSeg, es decir, 200 nSeg. Las instrucciones en
donde se ejecutan saltos demoran dos ciclos, ya que la instrucción que se prepara es la
de la siguiente línea del programa, y al realizar el salto se va a una instrucción que
está ubicada en otra línea del programa.

A continuación se presenta la arquitectura del microcontrolador PIC 16C54:

31 INICIO
Diagrama de Bloques del Microcontrolador
PIC16C54

9-11 ENTRADA PALABRA DE


9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
(SRAM)
5 5-7
STATUS 25 BYTES
8 8

TMRO F
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

32 INICIO
Al examinar la figura de la arquitectura, se puede ver que arriba a la izquierda se
encuentra la memoria de programa EPROM o ROM; su capacidad es de 512 palabras
de 12 bits, y allí está el programa desde la posición 000h.
A la derecha de la memoria de programa, se encuentra el registro PC o Contador de
Programa, del cual salen los valores de las direcciones que se leerán en la memoria
de programa. El programa del microcontrolador comienza en la dirección 0 que
corresponde a la siguiente instrucción después de la inicialización.
Los datos que salen de la memoria de programa, que corresponden a los códigos de
instrucción, que son las líneas del programa codificadas en binario, van al Registro de
Instrucciones. En este registro se almacena temporalmente el código de la
instrucción a ejecutar, la cual es interpretada por el Decodificador de Instrucciones.
El Decodificador de Instrucciones traduce el código o valor binario que está en la
memoria del programa a una instrucción que se va a ejecutar. Esta instrucción puede
tomar dos caminos: Si la instrucción implica un salto de dirección, entonces se
colocará en el registro PC (vía directa) un nuevo valor, el cual corresponde a la nueva
dirección del programa; si la instrucción consiste en hacer una operación con uno de
los Registros de Propósitos Generales (véase el bloque en la parte derecha de la
figura) o con el registro W, se tomarán unas líneas del Registro de Instrucciones
para especificar la dirección de acceso al registro, y las otras líneas para colocar el
código de la operación que se realizará en la Unidad de Lógica y Aritmética.

33 INICIO
En la Unidad de Lógica y Aritmética se puede hacer cálculos aritméticos, tales
como la suma y la resta binarias, u operaciones lógicas, tales como: “and”, “or”,
“exor”, complemento y desplazamientos. Las operaciones se pueden ejecutar con
una o dos variables de 8 bits, que pueden estar en el registro de trabajo W o en
un registro indicado por medio de la dirección F, que señala una posición de la
memoria de datos o Registro de Propósitos Generales, un Puerto, un registro TRIS
o el temporizador TMR0, como puede observarse en la parte inferior de la
arquitectura PIC 16C54.
En la parte superior derecha de la figura, se puede observar el bloque que se
refiere a la Palabra de Configuración, la cual define si se va a inhabilitar el
Temporizador WDT (perro guardián), si se va a hacer la Protección de Códigos del
programa de la memoria y cuál palabra de configuración se va a emplear para
seleccionar el tipo de oscilador en el bloque Oscilador, Tiempo y Control.
El registro Option, el cual se escribe por medio del registro W, es el encargado
de colocar la palabra de configuración en el Escalamiento de WDT y TMR0. Este
escalamiento fijará la programación del divisor de frecuencia en uno de los
temporizadores.
Finalmente, en la parte derecha del registro PC, se encuentran los registros Pila1
y Pila2, que se utilizan para almacenar la dirección del contador de programa en el
momento en el que se va a ejecutar una subrutina.

34 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

35 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

36 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

37 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

38 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

39 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

40 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

41 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE F REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

42 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

43 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

44 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

45 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

46 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

47 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

48 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

49 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

50 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

51 INICIO
9-11 ENTRADA PALABRA DE
9-11 PILA 1
EPROM-ROM TOCKI CONFIGURACIÓN
OSC1 OSC2 MCLH
PILA 2
512x12 PC INHABILITA
TIPO DE
12 TEMPORIZADOR OSCILAD.
PROTECCIÓN
WDT DE CODIGOS 2
REGISTRO DE
9 OSCILADOR,
INSTRUCCIONES
TIEMPO DE TIEMPO Y
ESCALAMIENTO
ESPERA DEL CONTROL
12 DE TMRO Y WDT
WDT
DECODIFICADOR 8
6
DE SLEEP
INSTRUCCIONES REG. OPTION OPTION
DIRECCIÓN
DIRECTA RAM DE REGISTROS DE
DIRECCIÓN DIRECTA PROPOSITOS
GENERALES
5
STATUS (SRAM)
8 8
25 BYTES

TMRO
UNIDAD
LÓGICA Y BUS DE DATOS
W ARITMÉTICA 8

4 8 8
8 4

TRISA TRISB PUERTO B


TRIS 5 PUERTO A TRIS 6
8
4

RA3 RA0 RB7 RB0

52 INICIO
Diagrama de conexiones del
Microcontrolador PIC16C54

A continuación, se presenta la interconexión del los PIC 16C54

PIC
16C54

Cada conexión tiene su propia función específica. Haz clic en el terminal


deseado para encontrar la función correspondiente en el glosario.

53 INICIO
1.11.- Instrucciones del PIC16C54
y los PIC de la gama básica
Un programa que se graba en un microcontrolador, es el encargado de ejecutar una
función de aplicación para el circuito a utilizar.
Para hacer un programa, es necesario conocer las instrucciones que ofrece el lenguaje con
el que se va a trabajar y manejar el software necesario para comprobar que el programa
haga lo que se desea.
Queremos hacerte entender que la labor de programación no es difícil. Hacer un
programa es algo así como hablar con alguien para que ejecute una o más acciones. Para
realizar esto, tú necesitas conocer una gran cantidad de palabras del idioma con el que te
puedas expresar, y la persona deberá entender el mismo lenguaje que tú empleas.
Mientras más palabras conozcas, podrás manejar con mayor eficiencia tu lenguaje y tu
modo de expresión. Sin embargo, además de conocer las palabras, necesitarás manejar
también las reglas de expresión o sintaxis. Por ejemplo cuando le dices a alguien:
“Quiero que me traigas 1Kg de azúcar”. En ese caso estás expresando un deseo a ese
alguien, que consiste en que esa persona salga de la casa, camine hacia el abasto, entre
al lugar, busque el azúcar en los estantes, tome un paquete de 1 Kg de azúcar, vaya a la
caja a pagarlo, saque el dinero, tome el vuelto, salga del abasto, regrese a la casa y
finalmente te entregue el paquete de azúcar.
Fíjate que en la expresión utilizada inicialmente, que es bastante corta, implica una serie
de pasos que se deben ejecutar para llegar a la acción final, y estos pasos podrán ser tan
específicos como a nosotros se nos pudiera ocurrir. La expresión “Quiero que me traigas
1Kg de azúcar” podría interpretarse en un software, como una instrucción de un lenguaje
de alto nivel o una subrutina de un lenguaje de bajo nivel, y los pasos que implican realizar
la acción, pueden verse como los códigos del lenguaje del microcontrolador.

54 INICIO
Cuando se quiere dar órdenes a un microcontrolador, se deberá emplear un lenguaje de
programación que él lo entienda directamente. Sabemos que un microcontrolador
entenderá códigos compuestos por “1” y “0”, que nosotros podríamos aprenderlo, pero
invertiríamos mucho tiempo y sería muy fácil equivocarnos al emplear este lenguaje. Sin
embargo, como vamos a contar con una computadora, podremos utilizar un lenguaje un
poco más fácil de entender, y la computadora hará las traducciones necesarias al
lenguaje del microcontrolador. Este proceso se llama “ensamblaje” o “compilación”.

El lenguaje que se utiliza comúnmente para trabajar con microcontroladores es el


lenguaje Ensamblador, que es un lenguaje de bajo nivel. Existen otros lenguajes, de
alto nivel, que también se pueden utilizar para programar estos componentes, tales
como los lenguajes “C” y “Basic”. El lenguaje Ensamblador es básicamente un lenguaje
de máquina, es decir, que las instrucciones que emplea se codifican directamente para
ser grabadas en la memoria del programa del microcontrolador.

Para facilitar un poco el entendimiento del lenguaje Ensamblador de un microcontrolador


o un microprocesador, las instrucciones se presentan con códigos, que representan
abreviaciones, y a continuación, los operadores que van a realizar la instrucción. El
lenguaje ensamblador permite colocar, de manera opcional, algunos comentarios, que se
reconocerán por ser expresiones que están después de “;” en una línea del programa.
Otra opción que nos permite el ensamblador, consiste en colocar etiquetas o
encabezados, que indican posiciones en la memoria de programa escritas en palabras de
uso común.

55 INICIO
Para escribir un programa en un microcontrolador, sea cual fuere el lenguaje que vamos
a emplear, debemos utilizar un software que nos facilite la labor de la comunicación.
En este curso se empleará el software MPLAB, ya que es la plataforma de
programación gratuita que ofrece Microchip para todos los microcontroladores que
fabrica, y permite realizar todos los pasos necesarios en la programación del
microcontrolador, sin necesidad de llamar a otro software.
Para escribir un programa en un microcontrolador, debes comenzar por conocer las
instrucciones o el lenguaje que vas a emplear. En este curso comenzaremos por utilizar
el lenguaje Ensamblador, ya que éste nos permitirá conocer con bastante profundidad el
modo de funcionamiento del microcontrolador. Más adelante podrás emplear un lenguaje
de alto nivel; sin embargo queremos que sepas que si puedes hacer un buen programa en
el lenguaje ensamblador, éste se ejecutará con mayor rapidez y empleará menos
cantidad de memoria que al hacer uso de un compilador de lenguaje de alto nivel.
Después de conocer las instrucciones del lenguaje de programación, podrás utilizar el
MPLAB o algún otro software para editar el programa, es decir, escribirlo como si
fuera una carta, pero de manera ordenada; luego deberás ejecutar el comando que
ensambla o compila el programa; después, si no hubo error de sintaxis, podrás hacer la
simulación del programa; y si no hay errores de lógica, podrás finalmente grabarlo en la
memoria del microcontrolador para que, de esta manera, puedas probar si funciona
correctamente en un circuito. En cada fase debe hacerse las correcciones necesarias
según los resultados que se van obteniendo.
56 INICIO
Fíjate en lo siguiente:

El microcontrolador PIC16C54 utiliza palabras de 12 bits divididas en un código de


operación que especifica el tipo de instrucción y los registros en donde se va a
ejecutar la operación y en qué lugar se va a colocar el resultado. Esto te permite
utilizar instrucciones que en el microcontrolador se codifican en una sola palabra.
Eso te garantiza que tu programa en el microcontrolador ocupa igual número de
instrucciones como las que empleaste en el lenguaje ensamblador. Esto no ocurre
con la mayoría de los otros microcontroladores.
El número de instrucciones que presenta el PIC16C54, es de apenas 33. El formato
de estas instrucciones, permite tratar a la memoria de datos, como si fueran
registros de trabajo, lo cual implica un ahorro tanto en la codificación de la
instrucción, como en el tiempo de ejecución en la misma.
Las instrucciones pueden hacer operaciones entre registros de un byte, para lo
cual se utiliza el apuntador de direcciones de registros f y el registro de trabajo
W; pueden ejecutarse entre operaciones con valores constantes y el registro de
trabajo W; también pueden ejecutarse operaciones orientadas a bits, para esto se
utiliza la variable b, que indica la posición del bit en el registro apuntado por f.
En las instrucciones orientadas a bytes, f es un valor que representa la dirección
de un registro de asignación y d representa el destino, que puede ser el mismo
registro apuntado por f o el registro W. Los registros señalados por f, son uno de
los 32 lugares de memoria a los que puede acceder la instrucción, por medio de los
5 bits del código especificado para ello.
57 INICIO
En resumen

• W  Registro de trabajo.
• F  Dirección del registro de la RAM.
• d  Destino, a donde va el resultado (W o F).
• b  Dirección del bit a utilizar en el registro de
dirección F.
• K  Valor numérico constante.

58 INICIO
Operaciones entre W y f

La designación del destino, que se hace por medio de d, indicará si el resultado se


llevará al registro de trabajo W, cuando d=W, o al registro de dirección f, cuando
d=f. Recuerda que las operaciones lógicas y aritméticas se hacen en código
binario, y por lo general se utiliza el código hexadecimal en los valores asignados en
el lenguaje ensamblador.
Por ejemplo, la instrucción:

ADDWF f,d
Indicará sumar (ADD) el registro de trabajo W,
con el registro de dirección f. El resultado se
colocará en W si d=W, o en f si d=f. Si no
colocas ningún destino, el ensamblador
guardará el resultado en el registro de
dirección f y te dará un mensaje de
advertencia.

Digamos que la instrucción:


ADDWF 12,W ;Suma en binario el contenido del registro
Código de la instrucción ;W con el contenido del registro 12 y el
Registro
Destino
;resultado se guardará en el registro W

59 INICIO
Operaciones con literales y bits

IORLW K

Donde K es un valor constante de 8 bits, indicará que se


realizará la función (Inclusive) OR entre los bits del Literal K y los del
registro W. El resultado irá a W.
Para instrucciones con literales y control, K representa una constante de 8 ó 9
bits, o un valor literal indicado por medio
de una palabra clave o etiqueta.
Un ejemplo:
IORLW B’10010110’ ; 10010110 es un número
; en binario

GOTO K ; (Ejemplo GOTO LAZO)


Indica que el programa saltará a la posición indicada
por el valor K, donde K puede ser un número de 9 bits
en este caso, o una palabra clave o etiqueta que indica
una posición en la memoria de programa.
Para las instrucciones orientadas a bits, b representa
la posición de un bit ubicado en el registro f. Por
ejemplo, la instrucción:
BCF f,b
Indicará una instrucción (Bit Clear) que borrará el bit
en la posición b (0 a 7) del registro de dirección f (0
a 31).

60 INICIO
INSTRUCCIONES DEL LENGUAJE
ENSAMBLADOR

Clasificación de las instrucciones del microcontrolador PIC16C54:

– Instrucciones de transferencia de datos, las cuales mueven datos de un registro a otro


(los registros involucrados son el W y un registro apuntado por f), o un dato constante en
la memoria del programa al registro W.
– Instrucciones aritméticas, las cuales ejecutan operaciones aritméticas binarias entre W
y un registro de dirección f.
– Instrucciones lógicas, las cuales ejecutan operaciones lógicas bit a bit entre W y un
registro de dirección f, o entre W y un valor constante.
– Instrucciones de borrado, las cuales colocan el valor cero a un registro.
– Instrucciones de rotación, las cuales permiten rodar el contenido de un registro de
dirección f, un bit hacia la derecha o hacia la izquierda. Estas instrucciones se utilizan
para efectuar multiplicaciones y divisiones aritméticas binarias. Entre estas instrucciones
también existe una que permite intercambiar grupos de 4 bits, para el manejo de dígitos.
– Instrucciones de manejo de bits, las cuales pueden colocar en “0” o en “1” un bit
determinado de un registro de dirección f.
– Instrucciones de saltos, las cuales permiten la posibilidad de cambiar la dirección de
ejecución de un programa de manera incondicional o según la evaluación de un bit o si un
registro es igual a cero.
– Instrucciones de control, las cuales permiten hacer algunas configuraciones de hardware
en el microcontrolador.

61 INICIO
Instrucciones de transferencia
de datos y aritméticas

INSTRUCCIONES DE TRANSFERENCIA DE DATOS

MOVF f,d ; Mueve el contenido de f hacia el destino d (W o f)


MOVLW K ; Se asigna a W el valor K
MOVWF f ; Mueve el contenido de W hacia el registro f

INSTRUCCIONES ARITMÉTICAS

ADDWF f,d ; Suma W con f (y guarda el resultado en d: W o f)


SUBWF f,d ; Resta f menos W
DECF f,d ; Decremento en 1 el contenido de f
INCF f,d ; Incremento en 1 en contenido de f

62 INICIO
Instrucciones lógicas y de borrado

INSTRUCCIONES LÓGICAS

ANDLW K ; And de los bits de W con los de K y guarda en W


ANDWF f,d ; And de los bits del registro W con los de f
COMF f,d ; Complemento en uno el contenido del registro f
IORLW K ; Or de los bits de W con los de K y guarda en W
IORWF f,d ; Or de los bits del registro W con los de f
XORLW K ; Exor de los bits de W con los de K y guarda en W
XORWF f,d ; Exor de los bits del registro W con los de f

INSTRUCCIONES DE BORRADO

CLRF f ; Borra el contenido del registro f


CLRW W ; Borra el contenido del registro W

63 INICIO
Instrucciones de rotación
y manejo de bits

INSTRUCCIONES DE ROTACIÓN

RLF f,d ; Rotación de f hacia la izquierda a través de Carry


RRF f,d ; Rotación de f hacia la derecha a través de Carry
SWAPF f,d ; Intercambia nibles (grupo de 4 bits) en el registro f

INSTRUCCIONES DE MANEJO DE BITS

BCF f,b ; Pone en 0 bit b del registro f


BSF f,b ; Pone en 1 bit b del registro f

64 INICIO
Instrucciones de Salto

INSTRUCCIONES DE SALTO (Si se ejecuta el salto, la instrucción demora dos ciclos)

BTFSC f,b ; Si el bit b de f es cero, salta una instrucción


BTFSS f,b ; Si el bit b de f es uno, salta una instrucción
CALL K ; Llama a subrutina en la dirección K
GOTO K ; El programa va a la dirección K
DECFSZ f,d ; Decremento de f y si es cero, salta una instrucción
INCFSZ f,d ; Incremento de f y si es cero, salta una instrucción
RETLW K ; Retorno de subrutina, W toma el valor de K

65 INICIO
Instrucciones de Control

INSTRUCCIONES DE CONTROL

CLRWDT ; Borra temporizador “Perro guardián” (WDT)


SLEEP ; Inhabilita el procesador, (Reposo)
NOP ; No ejecuta operación
OPTION ; El contenido de W se carga al registro OPTION,
; que se utiliza para la configuración de los
; temporizadores y el escalamiento.
TRIS f ; Contenido de W va a TRIS (programación puertos),
; f representa uno de los puertos A o B (5 ó 6).
; Un 1 en el bit de programación, configura la línea
; correspondiente al puerto como entrada; un 0 lo
; configura como línea de salida.

Nota: Si deseas ver el significado en detalle de todas las instrucciones de los


microcontroladores PIC de las gamas básica y media, puedes consultar el anexo 2.

66 INICIO
ACTIVIDADES A REALIZAR

En este aparte, se pide que tú desarrolles las actividades que a continuación se


presentan, para comprender mejor el tema siguiente.

1.- Define con tus propias palabras los siguientes términos:

a.- ¿Qué es un Microcontrolador?

b.- ¿Cómo funciona un microcontrolador?

c.- ¿En cuáles aplicaciones se podría utilizar un microcontrolador?

d.- Describe las principales características de los microcontroladores PIC.

2.- Dibuja la arquitectura de un microcontrolador PIC16C54.

3.- Haz una clasificación de las instrucciones de los microcontroladores PIC de la


gama básica y relaciona el significado de cada código de operación con la instrucción
que ejecuta con sus operadores.

4.- Explica qué es lenguaje ensamblador y haz un ejemplo de un programa que lea dos
datos ubicados en la memoria de datos y los sume.

67 INICIO
TEMA 2
Programación del PIC 16C54

Contenido
2.1.- Programación de Microcontroladores
2.2.- Pasos para programar un Microcontrolador
2.3.- Representación del circuito.
2.4.- Edición del Programa con el MPLAB
2.5.- Ensamblaje del Programa
2.6.- Simulación
2.7.- Grabación del Microcontrolador
2.8.- Reduciendo el programa
2.9.- Advertencia para un vehículo
2.10.- Control de leds por medio de pulsadores
2.11.- Ejemplo de un programa para sumar
2.12.- Resta de dos números

INICIO
TEMA II: Programación del microcontrolador
PIC16C54

Objetivos Terminales:
•Explicar los pasos necesarios para
programar un microcontrolador para
una aplicación específica.
•Desarrollar programas básicos para
aplicaciones específicas, que puedan
ejecutarse por un microcontrolador
PIC16C54.

69
INICIO
2.1.- Programación de
Microcontroladores

La programación es el modo de organización de las instrucciones que va a realizar


el microcontrolador para cumplir una o más funciones específicas.

Para programar los microcontroladores es importante que utilices el lenguaje


ensamblador, ya que es el más parecido al lenguaje del procesador, y esto te
ayudará a entender mejor cómo trabaja cada instrucción. Existe también la
posibilidad de utilizar los programas en lenguaje “C”, “Basic” o algún otro de alto
nivel.

Queremos convencerte que esta labor no es difícil, especialmente si ya has


programado en cualquier otro lenguaje, recuerda que programar es parecido a
hablar o escribir en el idioma que empleas usualmente para comunicarte.

Para hacer un diseño en el que se utilicen circuitos integrados programables, será


necesario emplear herramientas que ayuden a la puesta a punto del Hardware y
del Software.

70 INICIO
Recuerda que es indispensable el grabador,
encargado de escribir el programa en la memoria
Debes tener en cuenta que, además de del microcontrolador. Existen grabadores muy
los compiladores o intérpretes de los completos capaces de trabajar con muchos modelos
lenguajes usados, es muy interesante de diferentes familias. Otra herramienta de
disponer de simuladores de programas, desarrollo, es el emulador en circuito, que consiste
que consisten en un software que en un complejo dispositivo físico que, controlada por
ejecuta las instrucciones que un programador desde tu computadora personal,
representan, en una computadora, el dispone de un conector con cables que van hacia la
comportamiento interno del procesador y computadora y que tiene los mismos terminales que
el estado de las líneas de entrada y el microcontrolador que trata de imitar. El
salida. conector se introduce en la base donde irá el
microcontrolador, con el programa definitivo en la
memoria de la computadora. El emulador en
circuito (ICE) hace funcionar el sistema como si
hubiese un microcontrolador real, pero con la
ventaja de poder observar todo el funcionamiento
en la computadora. Un inconveniente de los
emuladores, es su elevado precio que los aleja de
los usuarios personales

71 INICIO
2.2.- Pasos para programar un
Microcontrolador:

Después de seleccionar un microcontrolador para una aplicación específica, para


programarlo será necesario:

Hacer pruebas en el circuito

Grabar el programa en el microcontrolador

Simular el programa
Después de cada fase, se
deberá corregir los errores
Ensamblar el programa
hasta que todo funcione bien.

Editar el programa

Representar el circuito

72 INICIO
2.3.- Representación del circuito.
Un ejemplo

Para representar el circuito, se colocará el siguiente ejemplo:


Se desea hacer un circuito con cuatro interruptores de entrada y ocho
indicadores a la salida, de los cuales cuatro serán de color rojo, y cuatro serán
de color verde. Cada interruptor estará asociado a dos indicadores de diferente
color, y al accionarlo, deberá cambiar el encendido, de uno a otro. Cuando un
interruptor esté abierto, deberá encender el indicador de color rojo asociado a
éste. En el caso de estar cerrado encenderá el indicador de color verde.
Solución:
De acuerdo al problema planteado, deberás contestar estas preguntas:
¿Cuántas líneas de entrada y salida serán necesarias para desarrollar el circuito?
¿Cuáles serán conectadas como entradas y cuáles se conectarán como salidas?
¿Qué tipo de interfaz se colocará para las entradas?
¿Qué tipo de interfaz se colocará para las salidas?
¿El PIC 16C54 será apropiado para este circuito?
Antes de pasar a la siguiente página, recomendamos que tú respondas estas
preguntas. Si lo deseas, podrás consultar con las páginas anteriores de este
módulo instruccional.

73 INICIO
Respuestas

De acuerdo a las preguntas planteadas en la página anterior, las respuesta serán las
siguientes:
Se necesitarán doce líneas de entrada y salida, de las cuales cuatro serán entradas,
que corresponderán a los interruptores y ocho serán salidas, que corresponderán a
los indicadores o leds.
Las interfaces se harán de una forma sencilla. Se tomará en cuenta que en los
puertos de entrada, si las líneas no están conectadas, la lectura será indefinida (0 ó
1), entonces se conectará una resistencia de 4,7KΩ al voltaje de alimentación para
cada entrada, y en el mismo punto, se colocará un interruptor a la referencia
negativa o tierra, de manera que si el interruptor está abierto, se leerá un “1”, y si
está cerrado, se leerá un “0”. En cuanto a las interfaces de salida, se deberá
considerar si los microcontroladores pueden manejar directamente a los leds.
Teniendo en cuenta que los puertos de los microcontroladores pueden entregar o
absorber hasta 25mA a 25ºC con una alimentación de 5V, y para un led basta una
corriente de 5 a 10mA para encenderlo, entonces la interfaz se hará por medio de
una resistencia de 300Ω en serie con cada led. La ecuación para calcular la
resistencia de cada Led, será: Rled=(Vdd-Vled)/Iled
Donde: Vdd = 5V (O la tensión de alimentación que utilizas para el circuito)
Vled  2V (Depende del color del led: Rojo -> 1,6V; Verde -> 2,4V)
Iled  10mA (Depende del brillo deseado y la corriente máxima del led)
74 INICIO
Selección del Microcontrolador

Según lo establecido anteriormente, el microcontrolador PIC16C54 es adecuado para esta


aplicación, ya que tiene doce líneas disponibles para los puertos de entrada-salida. Si en
el mercado local no consigues el PIC16C54, podrías utilizar el PIC16F54, el PIC16F84A o
algún otro microcontrolador PIC de 18 terminales que pertenezca a la gama básica o
media, ya que dispone de doce terminales de entrada-salida, y los programas que se
elaboran con los PIC16C54, funcionan con los otros de la gama básica o media; las
conexiones externas entre ellos también son compatibles. A continuación se presenta el
circuito a utilizar, en donde se escogerá al puerto A como entrada (4 bits) y el puerto B
como salida (8 bits).

Vdd
PIC
16C54

75 INICIO
2.4.- Edición del Programa
con el MPLAB
Después de representar el circuito, y de asignar cada línea de entrada y salida a los
puertos del microcontrolador, se procederá a editar el programa. Debes tener claro
con qué elemento se conecta cada línea de los puertos del microcontrolador.
Existen muchos editores para programar los microcontroladores PIC. Sin embargo,
se utilizará el MPLAB, debido a que esta herramienta de programación, ofrece la
posibilidad de: Editar, compilar, simular y grabar.
Para entrar al entorno MPLAB, se deberá acceder al software que ofrece
gratuitamente la compañía Microchip (www.microchip.com), o al comprar uno de los
sistemas de desarrollo para estos microcontroladores. Después de instalar el
software, se abrirá el programa MPLAB.
Si deseas alternar entre este módulo instruccional y el MPLAB, puedes hacerlo al
presionar simultáneamente las teclas: Alt y (Tab)
La primera vez que se abre este programa, aparecerá la siguiente pantalla:

Llamada:
Microchip
MPLAB IDE

76 INICIO
Familiarización con el MPLAB

Después de abrir el MPLAB, ya podrás comenzar


a editar tu programa en el espacio donde dice
“Untiteled Work space”. Si quieres trabajar con
mayor comodidad, podrás ampliar esta ventana.
Los recursos que se ofrecen con este software
son bastante variados, es por esto que en este
aparte se mostrará sólo algunos de los comandos
necesarios para iniciar una edición de un
programa.
Algo que deberás tomar en cuenta, es el ser
consistente con el dispositivo que vas a usar.
Para ello, deberás seleccionar el microcontrolador
en este ambiente de trabajo; en este caso el
PIC16C54 (o el microcontrolador que encontraste
en el mercado local). Para esto se irá a la barra
de menú, y se escogerá en “Configure” y luego
“Select Device...” Si el MPLAB se está utilizando
por primera vez, en pantalla aparecerá la
siguiente ventana:

77 INICIO
Opciones del MPLAB

Si vas a utilizar el PIC 16C54, se deberá cambiar a:

Nótese el cambio al PIC16C54. Luego


1 se seleccionará en “OK”. Después de
hacer esto, el MPLAB estará listo para
trabajar con el PIC16C54. Si se va a
trabajar con otro microcontrolador, éste
se seleccionará en “Device”. Al regresar
al ambiente de trabajo, en la parte
inferior aparecerá el tipo de
microcontrolador que se va a emplear, el
cual deberá ser igual al que se utilizará
en el circuito, o de lo contrario podrá
haber problemas en el momento de
ensamblar, cuando se realice la
simulación o al grabar el programa.

2
78 INICIO
Es importante documentar
bien el programa

En un programa ensamblador, es muy importante hacer una buena documentación; en


lo posible, hay que colocar los comentarios que sean necesarios para comprender bien
qué es lo que se está haciendo. Los comentarios se reconocerán por el símbolo “;”
tal como se puede ver en la figura de la página siguiente, en donde se hace una
breve descripción del programa que se va a realizar.
Te recalcamos la importancia de colocar los comentarios, ya que los que comienzan a
trabajar en esto, consideran innecesario colocarlos. Sin embargo, un tiempo
después, a la hora de analizar el programa no recuerdan qué fue lo que hicieron, y
prácticamente tienen que comenzar desde cero para tratar de entender el programa.
Antes de comenzar a editar el programa, te recomendamos que revises, en el tema
1, en la parte de las Instrucciones del Lenguaje Ensamblador, lo que hacen las
siguientes instrucciones, o sino accede a las explicaciones de ellas, por medio del
hipervínculo asociado:
MOVLW K GOTO K
TRIS f BSF f,b
CLRW BCF f,b
BTFSS f,b BTFSC f,b
En la página siguiente encontrarás la primera parte de la edición del programa.
Fíjate bien en los comentarios escritos.

79 INICIO
Comentarios

80 INICIO
Los archivos “INCLUDE”

En el ejemplo de la página anterior, se puede observar una parte inicial compuesta de


comentarios, los cuales se colocan para describir el programa. Después se observa la
directiva INCLUDE “P16C5X.INC”. Esta directiva, básicamente se utiliza para incluir
un archivo que asigna valores numéricos a cada uno de los registros de funciones
especiales y los bits del registro STATUS. Esto nos facilitará la elaboración del
programa, es decir, que para emplear, por ejemplo, una instrucción MOVF 5,0; el
programa entenderá que el contenido del puerto A, que está en la dirección 5, pasará
al registro W. Sin embargo, será mucho más fácil comprender la instrucción, si se
escribiera de esta manera: MOVF PORTA, W´. Esta última instrucción se aceptará, si
previamente se definió “PORTA” y ”W”, y esto se puede hacer con la directiva
INCLUDE.
Si deseas más información acerca de las directivas del lenguaje ensamblador, puedes
consultar el anexo 3 de este módulo instruccional.
En el archivo P16C5X.INC, está la asignación de los registros de funciones especiales
(tal como PORTA y W) de los microcontroladores de la gama básica. En el caso de no
utilizar este archivo, tendríamos que asignar nosotros mismos los registros en el
programa. Es decir, que antes de comenzar el programa deberíamos escribir lo
siguiente:
PCL EQU H'0002'
W EQU H'0000'
STATUS EQU H'0003'
F EQU H'0001‘
FSR EQU H'0004'
INDF EQU H'0000'
PORTA EQU H'0005'
TMR0 EQU H'0001'
PORTB EQU H'0006'

81 INICIO
Las Directivas y las Bases Numéricas

El hecho de que un valor aparezca como H’0000’, sólo significa que se está escribiendo
en hexadecimal. Por otro lado, EQU significa igual, o sea que al escribir la directiva:
W EQU H’0000’, significa que en cualquier instrucción que se escriba W, al codificarse
el texto, se colocará un valor 0 en el programa ensamblador. Una directiva, es algo así
como una instrucción que no se codifica en el programa, pero que realiza una operación
de control en el ensamblador. En otras palabras, la directiva EQU asigna la igualdad
entre una etiqueta y un número, para que en el momento de hacer la codificación del
programa, en donde aparezca la etiqueta, se asignará el número, ya que en el
microcontrolador sólo pueden entrar valores numéricos binarios. El ensamblador permite
también que utilices varios tipos de sistemas numéricos, por ejemplo, el número 11 en
decimal se puede representar de las siguientes maneras:
Base Numérica Representación
Hexadecimal 0B / 0BH / H’0B’ / 0x0B
Binaria B’1011’
Decimal D’11’
Observa que a los números hexadecimales que empiezan por una letra, le debes colocar
un 0 a la izquierda.
A continuación seguimos con la elaboración del programa en la siguiente página, donde
podrás observar, cómo se separa el programa en columnas, por medio de la tecla de
tabulación, de manera que la columna 1 se utiliza para etiquetas, la segunda para la
instrucción, la tercera para los operadores y la cuarta para los comentarios:

82 INICIO
División por columnas

Colu. 1 Colu. 2 Colu. 3 Columna 4

{Instrucciones}
{Etiquetas}
{Comentarios}

{Operadores}

83 INICIO
Comienzo del Programa

Puede verse en la pantalla anterior, la directiva ORG (Origen) poco después de la


directiva INCLUDE. Élla asigna la dirección en la cual va a comenzar una sección del
programa. En este caso, el programa comienza en la dirección 0 de la memoria EPROM
del microcontrolador.
Al comenzar el programa, se debe preparar los puertos y registros que se van a utilizar.
En este caso, se asignará la programación de los puertos, tal como se puede observar a
partir de la etiqueta “PREPAR” en el programa de la página anterior.
En la sección siguiente se presenta el comienzo el programa. Se verá cómo se realiza el
análisis para un “grupo” de una sola entrada del puerto A y dos salidas del puerto B.

84 INICIO
Si no estuvo claro el comienzo, lee
esto detenidamente

Trata de completar lo que debe ir en las secciones: GRUPO1, GRUPO2 y GRUPO3. Es


importante que cada etiqueta se escriba en una sola palabra, sin espacio, es decir que
sería incorrecto colocar, por ejemplo, GRUPO 1.
Recuerda que aquí se utiliza la instrucción BTFSS PORTA,0; la cual indica que se va a
hacer un test del bit 0 del puerto A, o sea RA0, (Bit Test de F, Salta si es 1). Si el
resultado es 0, ejecutará la instrucción siguiente GOTO VERD0ON, la cual hará que el
programa salte a la posición VERD0ON, en donde se apagará el led rojo (BCF PORTB,0;
que hará RB0=0) y encenderá el led verde (BSF PORTB,1; que hará RB1=1). Si al hacer
el test de RA0, éste es igual a 1, el interruptor estará abierto; en el programa se
indica que debe saltar una línea, por lo tanto se pasará a la línea ROJO0ON, en donde
se apagará el led verde (BCF PORTB,1), y se encenderá el rojo.
Las direcciones que se le asignan a las etiquetas, se hacen de manera automática. Por
ejemplo, la etiqueta PREPAR, que está ubicada después de los comentarios iniciales,
tendrá asignada la dirección 0, ya que se ubica inmediatamente después de la directiva
ORG 0.
La etiqueta INICIO, se ubicará entonces en la dirección 4, ya que está cuatro
instrucciones por debajo de PREPAR. Recuerda que ni los comentarios ni las directivas
cuentan como instrucciones del programa en el microcontrolador.
En la página siguiente, podrás observar la parte final de este programa, que sirve como
una de las soluciones para activar los cuatro interruptores que manejan los ocho leds.

85 INICIO
Continuación del programa

86 INICIO
2.5.- Ensamblaje del Programa

Después de editar el programa, o en los momentos que creas convenientes, deberás


guardar tu programa con un nombre luego un punto (.) y después “asm”: “nombre.asm”.
Te recomendamos que abras un subdirectorio en el directorio “Mis documentos” y
guardes allí los programas elaborados. Cuando hayas editado todo, procederás a
ensamblar el programa. El programa que se presentó anteriormente, no presenta
errores de codificación. Sin embargo, tú puedes intentar editarlo, y luego podrás
proceder a ensamblarlo o codificarlo. Al ensamblar un programa, se generará un
archivo objeto codificado en binario o hexadecimal, el cual será el mismo que se
grabará en la memoria del microcontrolador; este archivo tendrá como nombre, el
mismo del programa editado, pero con extensión .hex. Por ejemplo si al programa
anterior le colocaste por nombre conmutador.asm, el archivo generado al compilar se
llamará conmutador.hex. Por otro lado se generará un archivo de listado con todos
los símbolos utilizados (conmutador.lst) y un archivo con los errores (conmutador.err),

87 INICIO
Ensamblando el archivo editado

Para ensamblar un archivo, deberás seleccionar en Project y luego Quickbuilt nombre.asm:

88 INICIO
Resultados del ensamblaje

Si al final aparece la frase:


“BUILD SUSCCEEDED”, significa
Que ha sido exitosa la compilación.

89 INICIO
Archivos con errores

Si algo sale mal, es decir, si hay errores al introducir las instrucciones, entonces
habrá que buscar el problema y solucionarlo. Si en tu programa no ha habido errores,
te felicitamos, porque lo copiaste muy bien. En caso contrario, no te preocupes,
porque te ayudaremos a encontrarlos. Primero volveremos a ensamblar el programa
con errores intencionales. Fíjate en esta sección del programa:

90 INICIO
Listado de errores

Al tratar de ensamblar nuevamente, nos encontraremos con un error, tal como lo


muestra la siguiente figura:

Al aparecer la frase “BUILD FAILED”, indica que no se pudo realizar el ensambalje,


debido a que hay uno o más errores en el programa.

91 INICIO
Encontrando los errores

Una forma sencilla de encontrar en cuál línea se cometió el error, se logra al hacer
doble clic en el error que queremos ver. Es posible que un error aparezca varias
veces, ya que éste puede reflejarse en las líneas del programa que estén asociadas
con ese problema. Hagamos doble clic en donde aparece el error y caemos en el
programa fuente, en el cual podemos ver la indicación que señala la línea donde se
produjo ese error.

Indicación
de la línea
con error

El error consiste en que no se ha definido previamente “PUERTOA”. Para solucionar


esto, se deberá colocar la variable PORTA, definida en P16C5X.INC o escribir
previamente la directiva PUERTOA EQU 5, para indicar que el puerto A corresponde
a la dirección 5 de la memoria de registros o RAM.
Si hay más errores en el programa, el procedimiento para hallarlos es el mismo. En
la edición de errores, se hace doble clic en la línea correspondiente, donde aparece
el error, luego te indicará dónde se produjo éste en el programa fuente.
Trata de interpretar los mensajes dados, y corrige los errores en el programa.

92 INICIO
2.6.- Simulación

¿Corregiste todo? Es importante que lo hagas, y que te fijes bien, para dar el
próximo paso.
El próximo paso, consiste en la simulación del programa. Esto significa que se debe
revisar si hay errores de lógica, los cuales no se detectan al ensamblar el archivo.
Una vez ensamblado el programa, procederemos a hacer la simulación. Para ello,
vamos a asegurarnos que el MPLAB tiene activada la simulación. Nos colocamos en el
menú “Debugger”:

Debemos asegurarnos que la herramienta MPLAB SIM esté activada, para poder
ejecutar la simulación.
Después de ensamblar el programa, en la “memoria ROM” del MPLAB se encuentra el
programa ensamblado. Podremos ver las memorias y registros en la simulación al
seleccionar en “View”, según veremos en la página siguiente. Las ventanas las
podemos colocar según nuestra conveniencia.
93 INICIO
Ventanas para verificar el programa

Registros
Memoria de
programa
Registro de
funciones
especiales

94 INICIO
Simulación de las condiciones de entrada

Será también útil, colocar un simulador de condiciones, para variar los valores en las
líneas que corresponden al puerto A. Para ello se seleccionará en Debugger,
Stimulus. Esta opción sólo aparecerá, si ya ha sido seleccionada la herramienta de
simulación. A continuación aparece la siguiente ventana.

95 INICIO
Para asignar cada entrada

Para asignar cada entrada, se hará lo siguiente:


1. Presionar el botón “Add Row”
2. Presionar uno de los rectángulos blancos de la primera fila. Aparecerá:

96 INICIO
Explicación de los estímulos

Los terminales seleccionados y el tipo de acción, se podrán escoger en cada fila:


Type. Indica si la entrada es sincrónica o asincrónica con respecto a los pulsos del
reloj. Por lo general, para entradas externas se fija en “Asynch” (Asincrónico).
Enable. Se utiliza para generar la acción en el terminal de entrada.
Pin. Indica el terminal del microcontrolador que se va a utilizar para generar el
estímulo: RA0, RA1, etc. Al presionar la flecha adyacente encontrarás las
opciones.
Action. Determina el tipo de entrada que se va a colocar: High (cambia a 1), Low
(cambia a cero), Toggle (cambia al estado opuesto cada vez que se presiona),
Pulse (pulso que cambia momentáneamente al estado opuesto y luego vuelve al
inicial).
High cicles. Número de ciclos en que la entrada se mantiene en uno, al aplicar un
estímulo sincrónico.
Low cicles. Número de ciclos en que la entrada se mantiene en cero, al aplicar un
estímulo sincrónico.
PC. Dirección numérica o símbolo en el cual ocurrirá el estímulo.
Invert. Si el símbolo de chequeo está activo, indica que se invertirá el pulso si se
está utilizando un estímulo sincrónico.
Comments. Puedes indicar un comentario relacionado con el estímulo.

97 INICIO
Asignación de cada entrada

Tú podrás añadir más entradas de estímulo cada vez que presionas el botón “Add
Row”. Cuando termines de colocar todos los estímulos con sus características,
presionarás “Edit Complete” y luego “Save” para guardar lo que hiciste. Después de
esto podrás comenzar la simulación.
Trata de colocar las entradas del puerto A como estímulo tipo “toggle”:

98 INICIO
Ejecución del programa

Para ejecutar el programa, podrás seleccionar inicialmente la velocidad del


microcontrolador, los puntos de parada y las opciones de trazado en “Debugger” y
luego en “Settings”.
Si no has seleccionado nada en “Settings”, al ejecutar el programa y mover
adecuadamente las ventanas, encontrarás lo siguiente:
Ejecución del
programa

Detención Reinicio
del programa

Paso que se Ejecución


ejecuta paso a paso

Verificación
de estados Ejecución
animada

Estimulación
de entradas

99 INICIO
Revisión de resultados

Los resultados no los podrás ver en el momento del aplicar los estímulos. Para
observar los cambios, deberás detener el programa.
También tienes la posibilidad de correr el programa paso a paso, para observar el
comportamiento del mismo al ejecutarse cada instrucción, o al presionar F8.
Al ejecutar en forma animada, se observa en el programa editado y en la memoria de
programa, cómo se van ejecutando cada paso del programa. En este modo, al aplicar
los estímulos no siempre obedecen. Esto se podrá verificar en la lectura de los bits
de los puertos.
Después de verificar que el programa se ejecuta correctamente, se deberá proceder a
grabar en la EPROM del microcontrolador.
Si existe algún problema, entonces se deberá revisar el programa, ya sea paso a paso
o entre dos posiciones de la EPROM.

100 INICIO
2.7.- Grabación del Microcontrolador

Después de revisar cuidadosamente el programa, ahora se procederá a grabar el


microcontrolador. Es importante tener un borrador de EPROM y el programador. Si
no tienes el borrador de EPROM que consiste en una lámpara ultravioleta, entonces
trabaja mejor con un PIC16F54 o un PIC16F84A. En el caso de no tener el
programador, trata de comprarlo o hacer alguno de los que se proponen en la Internet.
Para realizar este paso, supondremos que se dispone del programador PICSTART Plus.
La ventaja de utilizar este programador, es que sirve para casi cualquier
microcontrolador PIC, desde ocho terminales hasta cuarenta terminales. Si tienes una
versión vieja del programador, podrás ir al anexo 7, en el cual se explican los pasos
para actualizar el programador.
El programador se conectará por medio de una fuente que trae el equipo, y el puerto
de comunicación serial disponible de una computadora personal.
Para empezar, deberás seleccionar en el MPLAB, el programador que vas a utilizar:

101 INICIO
Selección del puerto de comunicación serial

Si se desea cambiar el puerto serial, como por ejemplo, el puerto 2, se deberá


escoger en Programmer, Settings, Comunications. Después se selecciona el puerto
serial deseado.

102 INICIO
Equipo de Desarrollo PICSTAR Plus

1 Programador PICSTART Plus


2 Cable serial RS-232 (Interfaz con la Computadora)
3 Microcontroladores
4 Disco con software, manuales y notas de aplicaciones

103 INICIO
Comenzando a Grabar

Una vez que escogiste el puerto de comunicación serial y tienes todo conectado, entonces
colocarás el microcontrolador en el conector del programador. Procederemos a llamar al
programador en Programmer, Enable Programmer. Primero se verificará la comunicación
con el programador. Si todo está correcto, entonces aparecerá la siguiente ventana:

Chequeo si Leer Grabar Verificar Borrar


está borrado memoria programa programación memoria Flash

104 INICIO
Cargando el programa a la computadora

Si un programa ha sido recién ensamblado, en la


ventana “View, Program Memory”, aparecerá el
programa en código hexadecimal. En este caso ya
todo estaría listo para programar el
microcontrolador. Suponiendo que antes de cargar
el programa, queremos verificar si el
microcontrolador está borrado, al presionar en ,
se podrá hacer esta verificación. En el caso de
hacer una lectura del contenido de la memoria del
microcontrolador, los datos se tranferiran a la
ventana de la memoria del programa y se borra la
del programa ensamblado. Para cargar nuevamente
el programa ensamblado, se buscará en File, Import,
Download To Memory... Luego se accede al archivo
con el nombre con extensión .hex, el cual ha sido
ensamblado anteriormente.

105 INICIO
Estableciendo las condiciones de Hardware y
grabación en la memoria del microcontrolador

Antes de programar nos


fijaremos en la ventana inferior,
la cual establece algunas
condiciones del hardware del
microcontrolador:

De éstas cambiaremos el Watchdog Timer a Off, ya que en nuestro programa, no hemos


usado este temporizador. Por otro lado, debemos dejar el Code Protect en off, ya que
si lo cambiamos, no podríamos volver a regrabar el microcontrolador.
Una vez realizado esto, se puede proceder a grabar. Para ello, simplemente se
activará el botón , y se transfiere los datos a la EPROM del microcontrolador.
Si se desea verificar que la grabación fue correcta, se podrá activar el botón .

106 INICIO
Si no se dispone del microcontrolador
PIC16C54 o un borrador de EPROM

Si no puedes trabajar con el PIC16C54JW, ya sea porque no lo consigues en el mercado


local, o porque no tienes la lámpara de luz ultravioleta, entonces podrás utilizar el
PIC16F54, el cual es igual al PIC16C54, con la diferencia de que se puede regrabar sin
necesidad de la lámpara de luz ultravioleta, gracias a su memoria de programa tipo
FLASH. Otro microcontrolador PIC que puedes utilizar, haciendo pocas modificaciones,
es el PIC16F84A que también contiene una memoria del tipo FLASH.
Entre el PIC16C54 y el PIC16F84A hay compatibilidad de hardware, es decir que los
terminales de conexión coinciden en ambos casos y por lo tanto no tienes que modificar
el circuito. Otro detalle que hay en ambos microcontroladores, es la compatibilidad del
software. A pesar de que el PIC16F84A es un microcontrolador de la gama media, el
programa que editaste con el PIC16C54 puede ejecutarse sin problemas, ya que las
instrucciones de los microcontroladores de la gama básica son compatibles con los de la
gama media. A pesar de esta compatibilidad, deberás hacer las siguientes modificaciones
para que puedas grabar correctamente al PIC16F84A:
• En el programa deberás cambiar la directiva INCLUDE “P16C5X.INC”, por la directiva
INCLUDE “P16F84.INC”, ya que vas a trabajar con el PIC16F84A.
• En el MPLAB deberás seleccionar en Options, Development Mode y Processor al
PIC16F84A. De esta manera al grabar con el MPLAB seleccionarás los códigos
adecuados para este microcontrolador.
• Finalmente, deberás reensamblar el programa, para generar los códigos del PIC16F84.

107 INICIO
Conexiones externas al microcontrolador

Una vez que se ha grabado el microcontrolador, este dispositivo está listo para ser
utilizado en un circuito. Como se vio en el capítulo 1, las conexiones restantes a los
puertos serán: Vdd voltaje de alimentación positiva, cuyo valor continuo, puede estar
comprendido entre 3V y 6V; Vss que corresponde al punto negativo de la fuente o
común; MCLR o inicialización, que en operación normal se deberá conectar a Vdd;
TOCKI, que es la base de tiempo del temporizador TMR0, y que se deberá conectar a
Vdd o a Vss en el caso de no utilizarse. Las otras dos líneas son OSC1 y OSC2, que
se utilizan para conectar el circuito oscilador.
Como primera prueba, se podrá conectar el circuito, según se muestra en la siguiente
página.
Al activar los interruptores, se deberá observar el funcionamiento del circuito, tal
como se programó. En el caso de no ser así, se deberá chequear las conexiones, y
las tensiones en cada punto del circuito, observar si hay oscilación en OSC1 y OSC2,
y chequear si los leds no están invertidos.
En el caso de haber revisado todo, y el circuito sigue sin funcionar, consulta con tu
profesor.

108 INICIO
Circuito final

5V

10K
f680KHz
100 pF

5V
8 Resistencias de 300
4 Resistencias de 4,7K

5V
18 17 16 15 14 13 12 11 10

PIC16C54

1 2 3 4 5 6 7 8 9

5V

109 INICIO
Algunas Preguntas

• ¿Para qué sirve la instrucción TRIS?


• ¿Cuáles líneas se emplearon para entrada y cuáles para salida?
• ¿Qué hace la directiva ORG?
• ¿Qué hace la directiva EQU?
• ¿Cuál es la diferencia entre una directiva y una instrucción?
• ¿Cuánta corriente circulan por los leds, cuando ellos están encendidos?
• ¿Qué hace la instrucción BTFSS?
• ¿Qué hacen las instrucciones BCF y BSF?
• ¿En cuáles partes del programa se ejecutan saltos?
• ¿Para qué sirve la directiva END?
• ¿Por qué son importantes los comentarios en un programa?
• ¿Entendiste la lógica del programa?
• ¿Te atreverías a escribir nuevamente un programa que haga lo mismo, sin
consultar este módulo instruccional? Explícalo claramente.
• ¿Comprendiste los pasos necesarios para programar a un microcontrolador?

110 INICIO
2.8.- Reduciendo el programa

Es posible reducir la cantidad de líneas de programa, para utilizar menor espacio en


la memoria de programa. Para ello, se leerá el puerto de entrada, y con la
instrucción de rotación. Se podrá hacer la evaluación bit por bit en un registro.
Con este procedimiento, también se podrá escribir los bits en el puerto de salida.
Te recomendamos que antes de comenzar a interpretar el programa que se presenta
en la siguiente página, analiza lo que realizan las siguientes instrucciones:
MOVWF f MOVF f,d
DECF f,d INCF f,d
DECFSZ f,d INCFSZ f,d
RRF f,d RLF f,d
En las instrucciones RRF y RLF, el registro f rueda un bit hacia la derecha o hacia
la izquierda respectivamente; sin embargo esto lo hace al través de un noveno bit
que se llama Carry (C) que se encuentra en el registro STATUS. Este registro
guarda algunas condiciones después de que se ejecutan ciertas operaciones, por
ejemplo, si un resultado es igual a cero, en STATUS hay un bit Z, que se colocará en
1. De manera similar, si en el bit 0 de f hay un “1”, al hacer la rotación a la
derecha, el bit C del STATUS, se colocará en “1”.

111 INICIO
Programa reducido para la
lectura de interruptores

112 INICIO
2.9.- Advertencia para un vehículo

Te recomendamos que analices, edites, ensambles y simules el programa que se presentó


anteriormente. Verás que hará lo mismo que el primer programa. Nota que en este
programa se utiliza algunas posiciones de la RAM, en la que se guarda los valores
temporales del puerto A, puerto B y el contador de ciclos.
A continuación, se presentará un programa que indicará ciertas condiciones de
advertencia para un vehículo. Para ello te recomendamos que estudies y analices las
siguientes instrucciones:
ANDWF f,d ANDLW K
IORWF f,d IORLW K
XORWF f,d XORLW K
COMF f,d NOP
Recordando las funciones lógicas que se efectuará en cada bit de índice “n” de los
registros W y F:
AND IOR XOR COM Donde:
n  Posición de bit
f  Direc. de RAM
w  Reg de
trabajo
d  Destino (w o f)
113 INICIO
Descripción del Problema

Se desea hacer un circuito que indique señales de advertencia para un vehículo de dos
puertas. Las advertencias se darán según se cumplan las condiciones siguientes:
Condición 1: El motor está encendido y alguna de las puertas está abierta. Se
utilizará la línea RA0 para señalar esta condición.
Condición 2: El motor está encendido y el cinturón de seguridad del conductor está
desabrochado. Se utilizará la línea RA1 para indicar esta condición.
Condición 3: El motor está apagado y las luces están encendidas. Se utilizará la
línea RA2 para señalar esta condición.
Condición 4: El motor está apagado, la puerta del conductor abierta y la llave de
encendido puesta. Se utilizará la línea RA3 para indicar esta condición.
Advertencia General: Si ocurre cualquiera de las condiciones anteriores. Se tomará
la línea RB7 para señalar esta condición.
Cada condición se mostrará por medio de un indicador luminoso (Led) y la advertencia
general se dará por medio de una señal sonora.
Se dispone de seis detectores tipo pulsador, que detectan las señales de entrada y
serán conectadas a cada línea de entrada del puerto B. La lógica de los detectores
se dará de la siguiente manera:
Motor: Indica un “1” si éste está encendido, se conectará a RB0.
Pcond (puerta del conductor): Indica un “1” si ésta está abierta, se conectará a RB1.
Pacom (la otra puerta): Indica un “1” si ésta está abierta, se conectará a RB2.
Cintu (cinturón de seguridad): Indica un 1 si está desabrochado, se conectará a RB3.
Luces: Indica un “1” si están encendidas, se conectará a RB4.
Llave: Indica un “1” si está colocada, se conectará a RB5.

114 INICIO
Circuito y Ecuaciones Lógicas

De acuerdo a la descripción del problema, te proponemos como actividad, que dibujes


el circuito del microcontrolador, con los detectores y las luces de advertencia.

Las ecuaciones lógicas para cada condición de advertencia, según el problema


planteado, se podrán colocar de la siguiente manera:

COND1 = MOTOR.(PCOND+PACOM)
COND2 = MOTOR.CINTU
COND3 = MOTOR.LUCES
COND4 = MOTOR.PCOND.LLAVE
ADGEN = COND1 + COND2 + COND3 + COND4

Según las asignaciones en cada puerto, se puede plantear también lo siguiente:

RA0 = RB0.(RB1+RB2)
RA1 = RB0.RB3
RA2 = RB0.RB4
RA3 = RB0.RB1.RB6
RB7 = RA0 + RA1 + RA2 + RA3

Donde RAn son las líneas que corresponde al puerto A y RBn son las líneas que
corresponden al puerto B.

115 INICIO
Lógica del Programa

En un primer intento, la lógica a utilizar en este programa, consiste en asignar un


registro a cada entrada, y luego hacer las operaciones lógicas correspondientes, para
colocar los resultados en registros que correspondan a cada solución. Esto implica que
hay que tomar la lectura de las líneas RB0 hasta RB5, y asignar las condiciones al bit
menos significativo de cada uno de los registros correspondientes. Los resultados, se
colocarán en el bit menos significativo de cada registro. Véase a continuación, la
asignación de etiquetas en el programa:

INCLUDE "P16C5X.INC" ; INCLUYE ETIQUETAS DE P16C5X.INC

MOTOR EQU 10 ;MOTOR


PCOND EQU 11 ;PUERTA DEL CONDUCTOR
PACOM EQU 12 ;PUERTA DEL ACOMPAÑANTE
CINTU EQU 13 ;CINTURON DE SEGURIDAD
LLAVE EQU 14 ;LLAVE DE ENCENDIDO
LUCES EQU 15 ;LUCES
COND1 EQU 16 ;CONDICION 1
COND2 EQU 17 ;CONDICION 2
COND3 EQU 18 ;CONDICION 3
COND4 EQU 19 ;CONDICION 4
ALGEN EQU 1A ;ALARMA GENERAL

Nota: Es muy importante que las direcciones asignadas a cada etiqueta, no coincidan con las reservadas
para cada uno de los registros de propósitos especiales del microcontrolador.

116 INICIO
CONSIDERANDO UN PROGRAMA
MODULAR

La forma en la cual se presentó las posiciones de los registros es completamente válida.


Sin embargo, te recomendamos que te acostumbres a hacer módulos de subrutina, de
manera que con pocos cambios, lo puedas utilizar sin problemas en otros programas.
Para ello, en cada subrutina se especificará la longitud del programa, la dirección de
arranque, la cantidad de registros utilizados y la posición de referencia de estos
registros. Si te acostumbras a hacer esto, entonces podrás hacer módulos que
utilizarías luego sin mucha dificultad. Para ello te proponemos que especifiques los
registros de la manera siguiente:

MOTOR EQU 10 ;MOTOR


PCOND EQU MOTOR+1 ;PUERTA DEL CONDUCTOR
PACOM EQU MOTOR+2 ;PUERTA DEL ACOMPAÑANTE
CINTU EQU MOTOR+3 ;CINTURON DE SEGURIDAD
LLAVE EQU MOTOR+4 ;LLAVE DE ENCENDIDO
LUCES EQU MOTOR+5 ;LUCES
COND1 EQU MOTOR+6 ;CONDICION 1
COND2 EQU MOTOR+7 ;CONDICION 2
COND3 EQU MOTOR+8 ;CONDICION 3
COND4 EQU MOTOR+9 ;CONDICION 4
ALGEN EQU MOTOR+0A ;ALARMA GENERAL

En este caso, sabremos que la cantidad de registros utilizada es de 11, y que la posición de referencia
es “MOTOR”, que ocupa la posicón 10H.

117 INICIO
Otra forma de nombrar
bloques de constanes

Otra manera que puedes utilizar para nombrar las etiquetas de tu programa en un
bloque, es la siguiente:

cblock 0x10
MOTOR, PCOND, PACOM, CINTU, LLAVE, LUCES,
COND1, COND2, COND3, COND4, ALGEN
endc

La directiva “cblock” asigna un bloque de constantes, a partir de un valor específico, es


decir que en el caso anterior se define la etiqueta MOTOR con el valor 10h, y a
continuación a PCOND se le asigna el valor 11h, y así sucesivamente. Como podrás
observar ésta es una manera más sencilla de asignar valores a un bloque de constantes.
La directiva “endc” indica la finalización de la lista de constantes, es decir que la última
de ellas es ALGEN.

118 INICIO
Asignación de detectores a registros

119 INICIO
Asignación de advertencias

120 INICIO
Condición de Alarma General

El programa presentado, es una de las formas de solucionar este problema. En la


siguiente página, se presenta otro programa, mucho más corto y que utiliza menos
registros. La lógica que se utilizó, se basa en asignar las operaciones lógicas en
forma paralela, es decir, que cada condición se manifiesta en un bit de una palabra.
Deberá notarse que en todas las operaciones está involucrada la variable “MOTOR”,
por lo que se aprovecha esto, para simplificar más el programa.

121 INICIO
Una alternativa más eficiente

La lógica se basa en sí, en que hay dos operadores: OPER1, donde se colocará las
condiciones del motor y OPER2, donde se asignarán las otras condiciones. Para ello, en el
bit 0 se coloca la condición 1, en el bit 1 la condición 2 y así sucesivamente. Luego se
escribe la condición inicial “0011” a OPER1, que asignará una suposición de que el motor
está encendido. En el caso de detectarse que está apagado, se inviertirá esta condición.
OPER1 (Motor): Motor Motor Motor Motor
OPER2 (Otros): (Llave. Pcond) Luces Cintu (Pcond+Pacom)
Condición4 Condición3 Condición2 Condición1
; COMIENZO DEL PROGRAMA
;
; ASIGNACIONES DE VARIABLES
;
OPER1 EQU 10 ; OPERADOR 1 SE UTILIZARA PARA COLOCAR LAS CONDICIONES
; DEL MOTOR
OPER2 EQU OPER1+1 ; EL OPERADOR 2 SE UTILIZARA PARA COLOCAR LAS OTRAS
; CONDICIONES

INCLUDE "P16C5X.INC" ; INCLUYE ETIQUETAS DE P16C5X.INC

ORG 0
PREPAR
CLRW ; EL PUERTO A SERA UTILIZADO COMO ENTRADA
TRIS PORTA
MOVLW 7F ; RB7 SERA UTILIZADO COMO SALIDA Y EL RESTO
TRIS PORTB ; DE LOS BITS DEL PUERTO B SERAN ENTRADAS

122 INICIO
Programa de advertencia reducido

123 INICIO
2.10.- Control de leds por medio
de pulsadores

En este ejemplo se hará lo mismo que en el caso de la lectura de los interruptores,


pero se utilizará pulsadores para encender los leds de manera alterna.
Se deberá considerar el efecto de rebote del pulsador, el cual consiste en que al
accionarlo, sus contactos rebotan varias veces antes de lograr permanecer en su
estado estable; el tiempo de duración del efecto de rebote, podrá estar entre 5 y 25
mSeg dependiendo de la calidad y el tipo del pulsador. En otras palabras, se deberá
hacer la lectura de los conmutadores por lo menos cada 25 mSeg.
El programa a realizar, entonces deberá leer el estado del pulsador. En el caso de
que éste se haya presionado, se deberá encender el led que estaba apagado, y apagar
el que estaba encendido en el canal correspondiente, además se deberá esperar un
tiempo de aproximadamente 25 mSeg, para efectuar la siguiente lectura.
El circuito, entonces deberá constar de cuatro entradas y ocho salidas, de manera
similar que en el caso de los interruptores.

124 INICIO
Circuito utilizado para leer pulsadores

De acuerdo a lo establecido anteriormente, se deberá escoger un microcontrolador que


tenga al menos doce líneas para puertos de entrada-salida. Una elección posible,
podría ser el PIC16C54, ya que tiene doce terminales de entrada-salida. Las
conexiones se presentarán a continuación, en donde se escogerá al puerto A como
entrada (4 bits) y el puerto B como salida (8 bits).

Vss
PIC
16C54

125 INICIO
Comienzo del Programa

El programa que se presenta a continuación, se utilizará para detectar el estado de uno


de los pulsadores.
Como siempre, el programa deberá empezar con comentarios que den suficiente
información acerca del programa que se va a realizar.
;
;
; PROGRAMA PARA LA LECTURA DE PULSADORES
;
;
; Este programa se utilizará en un circuito con cuatro pulsadores de entrada y
; ocho indicadores a la salida, de los cuales cuatro serán de color rojo, y cuatro
; serán de color verde.
;
; Longitud del programa 82 (51h) palabras. Dirección de inicio del programa 0H
; Cantidad de registros 2. Posición de referencia PBANTES dirección 10h
;
; Cada pulsador estará asociado con dos indicadores de diferente color, y
; al presionarlo, deberá cambiar el encendido, de uno a otro. En condiciones iniciales,
; deberán encender los indicadores de color rojo.
;
; Se tomará el puerto A como entrada para los pulsadores.
; Un "1" determinará que el pulsador está abierto
; Un "0" determinará que el pulsador está presionado
;
; El puerto B se utilizará como salida
; Los terminales pares se conectarán a los leds rojos
; Los terminales impares se conectarán a los leds verdes

126 INICIO
Preparación y detección

INCLUDE "P16F84.INC" ; ESTA DIRECTIVA INDICA QUE SE ASIGNARA VALORES


; NUMERICOS A CADA UNO DE LOS REGISTROS DE FUNCIONES
; ESPECIALES Y LOS BITS DEL REGISTRO STATUS

PBANTES EQU 10 ; INDICA EL ESTADO ANTERIOR DEL PUERTO B


STTUSPA EQU PBANTES + 1 ; INDICA EL ESTADO DE LOS BITS LEIDOS EN EL PUERTO A

ORG 0
PREPAR MOVLW 0F
TRIS PORTA ; PUERTO A SERA ENTRADA
CLRW
TRIS PORTB ; PUERTO B SERA SALIDA
MOVLW 55
MOVWF PORTB ; SE ALTERNAN 1 Y 0 EN LAS LINEAS DE SALIDA DEL PUERTO B
CLRF PBANTES ; PALABRA DE ESTATUS QUE INDICA EN CADA GRUPO QUE LOS
; LEDS ROJOS ESTAN ENCENDIDOS Y LOS VERDES APAGADOS
CLRF STTUSPA ; PALABRA DE CONTROL PARA MANTENER VALOR EN LA ENTRADA

INICIO BTFSS PORTA,0 ; CONDICION BIT 0 DEL PUERTO A: SI ES 1 => PULSADOR NO PRESIONADO
GOTO CAMBIO0 ; SI ES CERO HACE EL CAMBIO EN EL GRUPO 0
BCF STTUSPA,0 ; PONE UN 0 PARA MANTENER CONDICION MIENTRAS SE PRESIONA PULSADOR
GRUPO1 BTFSS PORTA,1 ; CHEQUEA CONDICION BIT 1 DEL PUERTO A
GOTO CAMBIO1 ; SI ES CERO HACE EL CAMBIO EN EL GRUPO 1
BCF STTUSPA,1
GRUPO2 BTFSS PORTA,2 ; CHEQUEA CONDICION BIT 2 DEL PUERTO A
GOTO CAMBIO2 ; SI ES CERO HACE EL CAMBIO EN EL GRUPO 2
BCF STTUSPA,2
GRUPO3 BTFSS PORTA,3 ; CHEQUEA CONDICION BIT 3 DEL PUERTO A
GOTO CAMBIO3 ; SI ES CERO HACE EL CAMBIO EN EL GRUPO 3
BCF STTUSPA,3
SIGCICL CALL RETARDO ; LLAMA RUTINA DE RETARDO PARA ESPERAR TIEMPO DE REBOTE
GOTO INICIO

127 INICIO
Cambio de estado en dos de los grupos

128 INICIO
Eliminación del Rebote

El programa se repite en forma similar para los otros dos grupos. Intenta tú terminar
lo que falta del programa.
Finalmente queda por editar el retardo. Para ello, se asumirá que el oscilador del
microcontrolador, produce una frecuencia de 4MHz, lo cual quiere decir que el período
es igual a 0,25μSeg. Si una instrucción se ejecuta en cuatro períodos del oscilador,
significa que el tiempo de duración de una instrucción es de 1μSeg.
Para eliminar el rebote, se podrá esperar un tiempo de 30mSeg, es decir que se
necesitaría ejecutar 30.000 instrucciones. Esto se puede hacer mediante lazos
repetitivos, como el que se muestra a continuación, que corresponde a la instrucción
siguiente después de la última escritura al puerto B:

129 INICIO
2.11.- Ejemplo de un programa
para sumar

En el siguiente ejemplo, se muestra cómo realizar la suma binaria de dos números de


4 bits que se leen en el puerto B. Trata de aprender a utilizar las siguientes
instrucciones:

ADDWF f,d SUBWF f,d


CALL K RETLW K
CLRF SWAPF f,d

130 INICIO
Programa SUMABYTE

; SUMABYTE
;
; Programa que suma dos números de 8 bits. Los sumadores se encuentran
; en PORTB, luego se ubican en las posiciones 8h y 9h en la memoria de
datos.
; El resultado se guardará en la posición 0Ah y sale por PORTA
PREPAR CLRW ; SE ASUME PORTB COMO ENTRADA Y SE PROGRAMA
PORTA
TRIS PORTA ; COMO SALIEA
INICIO MOVF PORTB,W ; EL CONTENIDO DE PORTB VA A W
ANDLW 0F ; SE TOMAN LOS 4 BITS MENOS SIGNIFICATIVOS
MOVWF 8 ; SE GUARDA VALOR EN LA POSICIÓN 8H
MOVF PORTB,W ; SE VUELVE A LEER EL PUERTO B
ANDLW OFO ; SE TOMAN LOS 4 BITS MAS SIGNIFICATIVOS
MOVWF 9 ; SE GUARDA VALOR EN LA POSICIÓN 9H
SWAPF 9,F ; EL VALOR SE COLOCA EN
CALL SUMABYTE
MOVF 0A,W
MOVWF PORTA
GOTO INICIO ; VA AL INICIO DEL PROGRAMA
SUMABYTE MOVF 8,W ; Mueve Sumador ubicado en la posición 8 a W
ADDWF 9,W ; Suma valor de la posición 9 con W, resultado a W
MOVWF 0A ; El resultado se guarda en la posición 0A
RETLW 0 ; Retorno con W = 0
END

131 INICIO
Resta de dos números

Este ejemplo es similar al anterior. Sin embargo, hay que tomar en cuenta que la
operación “restar” en un microprocesador, se hace por medio de una suma, en donde
el valor negativo se complementa a dos, es decir, se complementa en 1 (se cambia
“unos” por “ceros” y viceversa) y luego se le suma 1.
;
; RESTABYTE
;
; Programa que resta dos números de 8 bits
; Los valores se encuentran ubicados en las posiciones minuendo (8h)
; y sustraendo (9h) en ;la memoria de datos.
; El resultado se guardará en la posición 0Ah
;

MINUENDO EQU 8 ; Posición del minuendo


SUSTRAENDO EQU 9 ; Posición del sustraendo
RESULTADO EQU 0A ; Posición del resultado
ORG 50 ; Dirección del comienzo del programa 50h
RESTABYTE
MOVLW 5 ; Asigna el valor 5 a W (Registro de trabajo)
MOVWF MINUENDO ; El valor 5 pasa al minuendo
MOVLW 3 ; Asigna el valor 3 a W
MOVWF SUSTRAENDO ; El valor 3 pasa al sustraendo
MOVF SUSTRAENDO,W ; El valor del sustraendo pasa a W
SUBWF MINUENDO,W ; Resta MINUENDO – SUSTRAENDO,
; resultado en W
MOVWF RESULTADO ; El resultado se guarda en la posición 0A

END ;Finalización del programa

132 INICIO
Trata de hacerlo tú

En el siguiente ejemplo se propone hacer el control de cuatro semáforos en


una intersección de dos vías. Los semáforos tienen cruces a la izquierda en cada
esquina. Se asume que los tiempos de duración serán los que se muestran en la tabla
anexa:

4 1

3 2

Esquinas1 y 3 Esquinas 2 y 4 Duración


Rojo y Verde cruce Rojo 8 segundos
Verde Rojo 20 segundos
Amarillo Rojo 3 segundos
Rojo Rojo y Verde cruce 8 segundos
Rojo Verde 25 segundos
Rojo Amarillo 3 segundos

133 INICIO
ACTIVIDADES A REALIZAR

Hasta este punto hemos visto los pasos necesarios para realizar programas,
simulaciones y prototipos con microcontroladores desde un punto de vista muy básico.
Algunas de las actividades que puedes realizar, para complementar este tema, son las
siguientes:
1.- Edita, compila y simula los programas que se han explicado en este tema.
2.- Graba un microcontrolador PIC16C54JW, PIC16F54 o PIC16F84 con los programas
que se proponen como ejemplos y monta los circuitos para verificar el funcionamiento.
3.- Hacer un circuito con un microcontrolador, que detecte una clave secreta de 8
bits. El usuario introducirá un valor binario en uno de los puertos y, por medio de un
pulsador, hará válido el código de entrada. Si el código falla tres veces seguidas, se
deberá inhibir el circuito por un período de dos minutos. En el caso de que el código
sea correcto, se deberá activar una luz indicadora.
4.- Hacer un contador binario de 8 bits, con dos pulsadores de entradas, que permita
que cuente en forma ascendente o descendente, de acuerdo al pulsador que se
presione.

134 INICIO
TEMA 3
MEMORIA DE PROGRAMA, REGISTROS,
PUERTOS Y TEMPORIZADORES

CONTENIDO
3.1- Organización de las memorias del PIC 16C54:
3.2.- Organización de la memoria de programa del PIC16C54:
3.3.- Organización de la memoria de datos del microcontrolador PIC 16C54:
3.4.- Registro STATUS
3.5.- Registros INDF y FSR, Modo de acceso indirecto
3.6.- Registro contador de programa PC
3.7.- Registro STACK (pila)
3.8.- Puertos de Entrada y Salida
3.9.- Registro OPTION
3.10.- Temporizador contador
3.11.- Temporizador WDT (Perro Guardián)

INICIO
TEMA III:
MEMORIA DE PROGRAMA, REGISTROS, PUERTOS
Y TEMPORIZADORES

Objetivos Terminales:
•Describir los registros de funciones
especiales del microcontrolador
PIC16C54.
•Mencionar la utilidad de los
temporizadores en los microcontro-
ladores.

136
INICIO
3.1- Organización de las memorias
del PIC16C54

Para entender un poco más las instrucciones, hace falta conocer la organización de la
memoria, cuáles son los registros especiales, dónde se ubican, y cuáles son los
registros de propósitos generales. Poco a poco se irá incluyendo ejemplos con otras
nuevas instrucciones en donde se observará cómo éstas influyen, tanto en los
diferentes registros como en el funcionamiento del microcontrolador. La memoria del
PIC16C54 se organiza en dos tipos:

Memoria de Programa Memoria de Datos


Se almacenan todas las instrucciones Los datos que manejan los programas
del programa de control. El tamaño varían continuamente y esto exige
de esta memoria es de 512 que la memoria que los contiene,
palabras. debe ser de lectura y escritura, por
lo que la memoria RAM estática
(SRAM) es la más adecuada, aunque
sea volátil.

137 INICIO
3.2.- Organización de la memoria de
programa del PIC 16C54

El PIC16C54, tiene un contador de programa (PC) de 9 bits, capaz de ubicar al


programa, en una de las 512 direcciones del espacio de memoria que se utiliza la
palabra de 12 bits.

PC<8:0>
9
CALL, RERLW
NIVEL DE PILA 1
NIVEL DE PILA 2

Espacio 000h
para MEMORIA
memoria DE 0FFh
del 100h
usuario PROGRAMA

VECTOR DE INICIALIZACIÓN 1FFh

Memoria de programa del PIC16C54

138 INICIO
3.3.- Organización de la memoria de
datos del microcontrolador PIC 16C54

La memoria de datos está organizada por registros de un byte de extensión,


contenidos en una RAM. Los registros se dividen en dos grupos:

Registros de Registros de
funciones propósitos
especiales generales
Estos incluyen:
 Se utilizan para guardar
 El registro STATUS (Estado)
información de datos y control por
 El Registro FSR (Registro medio de las instrucciones del
programa.
apuntador de direcciones de la RAM).
 El PCL (Contador de programa)
 Los registros PORTA y PORTB
(puertos de entrada y salida)
 El Registro TMRO (Temporizador)

139 INICIO
MEMORIA DE DATOS DEL
PIC16C54

00h INDF(1)
01h TMRO
02h PCL
03h STATUS
04h FSR
05h PORTA
06h PORTB
07h
REGISTROS
0Fh DE
10h PROPÓSITOS
GENERALES

1Fh

(1) El registro INDF, no corresponde a una posición física, sino al registro cuya dirección está
contenida en el registro FSR.

140 INICIO
Tipos de Registros

a.- Registro de propósitos generales:


Los registros de propósitos generales, son aquéllos donde se guardan los datos de
los programas de aplicación. Ellos se pueden acceder de manera directa por medio
de la dirección f en una instrucción, o de manera indirecta, a través del registro
FSR o registro apuntador de direcciones.

b.- Registros de funciones especiales:


Estos registros los usa la CPU y los periféricos para el control de la operación del
microcontrolador. Debes tener cuidado de no utilizar un registro de función
especial, como un registro de propósito general, ya que en los registros de
funciones especiales se asigna un control específico, que puede estar relacionado
con el hardware del microcontrolador o el control del programa. En la siguiente
tabla se representa un resumen de las funciones de estos registros.

141 INICIO
Función de cada bit de los registros
de funciones especiales

Valor después Valor después

Direcc Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 de encender WDT y MCLR

N/A Tris Registros de control de Entrada y Salida (TRISA,TRISB) 1111 1111 1111 1111

N/A OPTION Contiene los bits de configuración del escalamiento, TMRO y WDT --11 1111 --11 1111

00h INDF Registro de la mem. de datos, su dirección está en el registro FSR xxxx xxxx uuuu uuuu

01h TMRO Temporizador contador de tiempo real de 8 bits xxxx xxxx uuuu uuuu

02h PCL 8 bits de bajo orden del Contador de Programa (PCL) 1111 1111 1111 1111

03h STATUS PA2 PA1 PA0 TO PD Z DC C 0001 1xxx

04H FSR Apuntador de la memoria de datos para acceso indirecto 1xxx xxxx

05h PORTA - - - - RA3 RA2 RA1 RA0 ---- xxxx ---- uuuu

06H PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu

Nota: “x” significa “cualquier cosa” y “u” significa “no cambia”


142 INICIO
3.4 Registro STATUS

Está ubicado en la dirección 03h, en la memoria de datos, y contiene los bits de


estado de la Unidad Lógica y Aritmética y el estado de la inicialización (RESET).
El registro STATUS puede ser el destino para una instrucción, como cualquier otro
registro. Si este registro es el destino de una instrucción que afecta los bits C
(acarreo), DC (acarreo decimal) o Z (cero), entonces la escritura de estos tres
bits es inhibida, es decir, estos bits se establecerán de acuerdo a la lógica del
dispositivo.

Por otro lado, los bits TO (Tiempo de espera) y PD (Reposo) no se pueden escribir.

A continuación se presentarán los bits del registro STATUS (dirección: 03h).

143 INICIO
Bits del Registro STATUS

R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x


PA2 PA1 PA0 TO PD Z DC C
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
R = bit de lectura W = bit de escritura -N = Valor después de la inicialización.

Bit 7-5: PA2 PA0: No se usan para el PIC16C54


Bit 4: TO: Bit “Tiempo de espera”.
1 = Al encender la alimentación o con las instrucciones CLRWT o SLEEP.
0 = Al haber un desbordamiento en el registro WDT.
Bit 3: PD: Bit “Reposo”.
1 = Al encender la alimentación o con las instrucciones CLRWT.
0 = Al ejecutar la instrucción SLEEP.
Bit 2: Z: Bit cero.
1 = El resultado de una operación lógica o aritmética es cero.
0 = El resultado de una operación lógica o aritmética es diferente de cero.
Bit 1: DC: Bit de acarreo/débito de dígito (instrucciones ADDWF o SUBWF).
ADDWF
1 = Ocurre un acarreo en el cuarto bit del resultado (se excede el valor 0Fh).
0 = No ocurre un acarreo en el cuarto bit del resultado.
SUBWF
1 = No ocurre un débito en el cuarto bit del resultado.
0 = Ocurre un débito en el cuarto bit del resultado.
144 INICIO
El bit “C” o bit de acarreo (Carry)

Bit 0: C: Bit de acarreo/débito (instrucciones ADDWF, SUBWF, RRF o RLF).


ADDWF
1 = Ocurre un acarreo.
0 = No ocurre un acarreo.
SUBWF
1 = No ocurre un débito.
0 = Ocurre un débito.

RRF: Toma el valor del bit menos significativo (LSb) del registro f.
RLF: Toma el valor del bit más significativo (MSb) del registro f.

145 INICIO
Programa para incrementar
un contador BCD

Un programa típico es el de un contador BCD. Éste, a diferencia de los contadores


binarios, presentan la salida en código BCD, de manera que pueda ser fácilmente
llevado a una presentación decimal.
El programa que se presenta a continuación, cada vez que es llamado, incrementa un
contador cuya salida es de código BCD. Para ello se utilizan los bits DC y C del
registro STATUS.

INCLUDE "P16C5X.INC"
CONT EQU 0X10 ; En CONT se encuentra el contador BCD

org 0
clrf CONT ; Se hace CONT igual a 0
Increm incf CONT,F ; Se incrementa CONT en 1
movlw 6 ; Se hace el ajuste a BCD
addwf CONT,W ; suma 6 para corrección digito 0
btfsc STATUS,DC ; chequea si hubo un acarreo en digito 0
movwf CONT ; corrige si hay acarreo digito 0
movlw 60
addwf CONT,W ; suma 60 para corrección digito 1
btfsc STATUS,C ; corrige si hay acarreo digito 1
movwf CONT
goto Increm
end

146 INICIO
3.5 Registros INDF y FSR,
Modo de acceso indirecto

El registro INDF no es un registro físico; si se accede al registro INDF, se coloca en


el registro cuya dirección está contenida en el registro FSR, es decir, que FSR es un
apuntador de direcciones.

Ejemplo de cómo utilizar los


registros INF y FSR:

La siguiente sección de programa, permite borrar los registros ubicados desde la


dirección 10h hasta la 1Fh. Una forma de realizar esto es por medio del modo de
acceso indirecto.
MOVLW 0X10 ; Inicialización del apuntador de la RAM
MOVWF FSR ; El Registro FSR toma el valor 10h
Próximo CLRF INDF ; Borra registro cuya dirección está en FSR
INCF FSR, F ; Incremento del apuntador
BTFSS FSR,5 ; ¿Borrado completo? (Examina bit 5 de FSR)
GOTO Próximo ; No, borra siguiente

147 INICIO
3.6 Registro contador de programa PC

Cuando una instrucción es ejecutada, el contador de programa (PC) contendrá la


dirección de la próxima instrucción a ejecutarse. El valor del PC se incrementa en
uno por cada ciclo de instrucción, al menos que la instrucción cambie el valor del
PC.
Para una instrucción GOTO, los bits 8 a 0 del PC se incluyen en dicha instrucción.
El registro PCL toma los bits 7 a 0. Véase figura a continuación:

PIC16C54
8 7 0
PC PCL

Palabra de Instrucción

148 INICIO
Para una instrucción CALL, o alguna instrucción donde el PCL es el destino, los bits 7
a 0 del PC se obtienen del código de la instrucción. Sin embargo, el bit 8 del PC no
viene del código de la instrucción, sino que es puesto en cero.

Algunas de las instrucciones donde el PCL es el destino, o se le modifica el


contenido, son: MOVWF PCL, ADDWF PCL y BSF PCL, 5. Recuerda que la dirección
del PCL es la 2

8 7 0
PC PCL

Inicialización Palabra de Instrucción


A “0”

PIC16C54

149 INICIO
Saltos de dirección del programa

A lo largo de este módulo instruccional, hemos visto algunos ejemplos en los que se
ejecutan algún cambio en la dirección del programa. Recordemos que estas
instrucciones son las únicas que duran dos ciclos de máquinas, es decir, que se
demoran en ejecutar el doble de las otras instrucciones.
Veamos algunos ejemplos de saltos de dirección del programa:

BTFSS REG0,3 ; Chequea el bit 3 de REG0 si es “1” salta una instrucción


BTFSC STATUS,C ; Chequea el bit de acarreo del estatus, salta si es “0”
GOTO FINAL ; Salto incondicional a la dirección final, el salto corresponde a 9 bits
CALL MULT ; Ejecuta la rutina MULT, el salto corresponde a 8 bits
RETLW 0 ; Retorno de subrutina, la dirección del STACK va al PC
MOVWF PCL ; El contenido de W va a los 8 bits menos significativos del PC
ADDWF PCL,F ; Se suma W + PCL y el resultado va al PC
XORWF PCL,F ; Se hace el exor entre PCL y W y el resultado modifica al PC
BCF PCL,2 ; Coloca en 0 el bit 2 del PC

Otras instrucciones que ejecutan cambios en el PC son: ANDWF PCL,F;


IORWF PCL,F; COMF PCL; BSF PCL,1; RRC PCL,F; RLC PCL, F; INCF PCL,F;
DECF PCL,F; INCFSZ PCL,F; DECFSZ PCL,F; CLRF PCL; SWAPF PCL,F; etc.

150 INICIO
3.7 Registro STACK (pila)

El registro STACK guarda las direcciones de retorno de las rutinas que se llaman
por medio de la instrucción CALL, y carga la dirección de retorno al PC con la
instrucción RETLW. la longitud de palabra de la pila es la misma que la del PC. La
pila tiene dos niveles:
Una instrucción CALL coloca el contenido del nivel 1 de la pila, en el nivel 2 y luego
coloca el valor del contador del programa actual, incrementando en uno, en el nivel
1 de la pila. Si se llama a más de dos subrutinas en una misma secuencia,
únicamente las direcciones de las dos más recientes serán almacenadas.
Una instrucción RETLW, cargará el contenido del nivel 1 de la pila al PC y el del
nivel 2 al nivel 1. Si más de dos instrucciones RETLW se ejecutan, la pila se
llenará con la dirección almacenada previamente en el nivel 2, y podría dar
problemas en el programa.

NOTA:
Al utilizar la instrucción RETLW, el registro W se cargará con el valor literal en la
instrucción. Esto es útil para la construcción de tablas de conversión con la
memoria de programa.

151 INICIO
Convertidor BCD a 7 Segmentos

Este es un programa típico que utiliza una tabla de conversión BCD a 7 segmentos.
Básicamente se coloca el valor a convertir en el registro W, y se utiliza este valor
para sumárselo al PC, luego se regresa W con el valor convertido en 7 segmentos.
Para esta rutina, se asume que un “1” significa que el valor del segmento es activo, lo
cual se usa en indicadores del tipo cátodo común. El bit menos significativo (RB0)
corresponde al segmento “a”.

include "P16C5X.INC"
valorBCD equ 10
org 0
INICIO movf valorBCD,w ; el valor BCD a convertir se lleva a W
call BCD7SEG
goto INICIO
BCD7SEG ; rutina de conversion BCD a 7 segmentos
addwf PCL,f ; El valor BCD se suma al contador de programa
; en el retorno se convierte en 7 segmentos
retlw b'00111111' ;0
retlw b'00000110' ;1 a (RB0)
retlw b'01011011' ;2
retlw b'01001111' ;3 f (RB5) b (RB1)
retlw b'01100110' ;4
retlw b'01101101' ;5 g (RB6)
retlw b'01111101' ;6
retlw b'00000111' ;7 e (RB4) c (RB2)
retlw b'01111111' ;8 d (RB3)
retlw b'01101111' ;9
end

152 INICIO
3.8 Puertos de Entrada y Salida

Los puertos de entrada y salida pueden ser leídos y escritos como cualquier registro
de datos por medio de las instrucciones de programa. Sin embargo, una instrucción
de lectura (por ejemplo MOVF PORTB, W) leerá los terminales de los puertos,
independientemente si ellos están programados como entrada o salida. Después de
una inicialización, todos los puertos se definen como entrada (alta impedancia), ya
que los registros de control TRISA y TRISB son puestos en 1.

Puerto A: El puerto A es un registro de 4 bits (PORTA), los bits que se utilizan son
los menos significativos (RA3:RA0). Los bits 7-4 se leen como ceros.

Puerto B: El puerto B es un registro de entrada-salida de 8 bits (PORTB<7:0>).

153 INICIO
Registro de control de puerto TRIS

Los registros de control de puertos, son cargados con el contenido del registro W,
al ejecutar la instrucción TRIS F. Un “1” en un bit del registro TRIS, coloca el
adaptador del terminal correspondiente en modo de alta impedancia o entrada. Un
“0” en ese bit, coloca el adaptador de ese terminal como salida.

NOTA:
Una lectura de los puertos, lee los terminales de los puertos de salida, y no la
salida que ha sido enviada. Esto significa que si una salida de un terminal es
habilitada para tener un “1” y en el sistema externo, este terminal es forzado a un
nivel bajo, la lectura del puerto indicará que en el terminal correspondiente habrá
un cero.
Los registros TRIS, son registros de escritura solamente, y son colocados en 1
después de una inicialización (RESET  todas las líneas de los puertos quedarán
programados como entradas).
Los registros TRIS no tienen una dirección asignada en los microcontroladores de la
gama básica. Sin embargo en los microcontroladores de la gama media si tienen
una dirección asignada, y por lo tanto, en ellos no se recomienda utilizar la
instrucción TRIS.

154 INICIO
Interfaces de Entrada y Salida

Cada terminal de un puerto, puede ser utilizado como entrada o salida. Para
operaciones de entrada, estos puertos no guardan la condición. El nivel de
entrada debe permanecer hasta que la instrucción de lectura se ejecute (por
ejemplo MOVF PORTB, W). En el caso de las salidas, las líneas mantienen su nivel
hasta que haya una nueva instrucción de escritura en el puerto. Para usar un
terminal como salida, la dirección correspondiente del bit de control en TRISA o
TRISB, debe colocarse en cero. Para usar este terminal como entrada, el bit
correspondiente en el registro TRIS debe colocarse en uno.

Cualquier línea de un puerto, puede programarse individualmente como entrada o


salida.

El circuito equivalente para cada línea de un puerto, es el que se muestra a


continuación:

155 INICIO
Bus de
Datos D Q

Registro
Tipo D
Escribe Vdd
en puerto
CK Q P terminal de
Entrada/Salida

Registro N
W D Q
Vss

Registro
TRIS

TRIS f
CK Q
Inicialización

Lee de Puerto

156 INICIO
La siguiente tabla presenta un resumen de la posición de las líneas en cada uno de los
puertos:

Valor después Valor después

Direcc Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 de encender WDT y MCLR

N/A Tris Registros de control de Entrada y Salida (TRISA,TRISB, TRISC) 1111 1111 1111 1111

05h PORTA - - - - RA3 RA2 RA1 RA0 ---- xxxx ---- uuuu

06H PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu

Nota: “x” significa “cualquier cosa” y “u” significa “no cambia”

157 INICIO
Escritura en un Indicador
7 segmentos

En el registro W se encuentra el código 7 segmentos que se va a


escribir en el indicador numérico.
La instrucción:
MOVWF PORTB ; Lleva el contenido de W al puerto B.

Previamente se debe programar al puerto B como salida con la


instrucción TRIS PORTB.

RB0

RB1

RB2

PIC 16C54 RB3

RB4

RB5

RB6

158 INICIO
Escritura en Dígitos Multiplexados

La siguiente figura muestra


una configuración de una
salida de cuatro dígitos
controlados por los puertos RA0
A y B. RA1
Los indicadores numéricos 7
RA2
segmentos son del tipo
ánodo común, por lo tanto RA3
se debe considerar que los
segmentos encenderán con
un “0” en vez de con un PIC16C54
“1”.
RB0
Los dígitos se encenderán RB1
con un “0” en la entrada
del transistor que le RB2
corresponde manejar al RB3
dígito correspondiente.
RB4
En la siguiente página se RB5
muestra una rutina para el
control de varios dígitos. RB6

159 INICIO
Rutina para el manejo
de cuatro dígitos

;4IDIGITOS

;Salida para 4 dígitos 7 segmentos


INCLUDE "P16C5X.INC"
CBLOCK H'10'
DIGITO0, DIGITO1, DIGITO2, DIGITO3
ENDC ; VALORES DE SALIDA DE CADA DIGITO
ORG 0

PREPARA CLRW
TRIS PORTA
TRIS PORTB ; SE PROGRAMAN PUERTOS A Y B COMO SALIDAS

INICIO MOVF DIGITO0,W ; EL CONTENIDO DE DIGITO 0 VA A W


MOVWF PORTB,F ; SE SACA EL VALOR POR EL PUERTO B
MOVLW B’1110’ ; SELECCION DEL PRIMER DIGITO
MOVWF PORTA,F ; SE SELECCIONA RA0, PARA EL PRIMER DIGITO
CALL RETARDO ; PERMANENCIA DEL VALOR EN EL INDICADOR
MOVF DIGITO1,W ; EL CONTENIDO DE DIGITO 1 VA A W
MOVWF PORTB,F ; SE SACA EL VALOR POR EL PUERTO B
MOVLW B’1101’ ; SELECCION DEL SEGUNDO DIGITO
MOVWF PORTA,F ; SE SELECCIONA RA1, PARA EL PRIMER DIGITO
CALL RETARDO ; PERMANENCIA DEL VALOR EN EL INDICADOR
MOVF DIGITO2,W ; EL CONTENIDO DE DIGITO 2 VA A W
MOVWF PORTB,F ; SE SACA EL VALOR POR EL PUERTO B
MOVLW B’1011’ ; SELECCION DEL TERCER DIGITO
MOVWF PORTA,F ; SE SELECCIONA RA2, PARA EL PRIMER DIGITO
CALL RETARDO ; PERMANENCIA DEL VALOR EN EL INDICADOR
MOVF DIGITO3,W ; EL CONTENIDO DE DIGITO 3 VA A W
MOVWF PORTB,F ; SE SACA EL VALOR POR EL PUERTO B
MOVLW B’0111’ ; SELECCION DEL CUARTO DIGITO
MOVWF PORTA,F ; SE SELECCIONA RA3, PARA EL PRIMER DIGITO
CALL RETARDO ; PERMANENCIA DEL VALOR EN EL INDICADOR

160 INICIO
Rutina para el manejo
de varios dígitos

;MULTIDIGITO
;Salida para 4 o más dígitos 7 segmentos
INCLUDE "P16C5X.INC"
CBLOCK H'10'
DIGITO0, DIGITO1, DIGITO2, DIGITO3, SELDIGI
ENDC ; VALORES DE SALIDA DE CADA DIGITO
ORG 0

PREPARA CLRW
TRIS PORTA
TRIS PORTB ; SE PROGRAMAN PUERTOS A Y B COMO SALIDAS

INICIO MOVLW B’11111110 ; SE HACE 0 EL BIT 0, PARA ENCENDER PRIMER DIGITO


MOVWF SELDIGI,F ; EL VALOR SE LLEVA DE W A SELDIGI
MOVLW DIGITO0 ; VALOR DIGITO 0 VA A W PARA CARGARLO A FSR
MOVWF FSR ; DIGITOX VA AL APUNTADOR DE DIRECCIONES
PROXDIG MOVF INDF,W ; VALOR DEL DIGITO VA A W
MOVWF PORTB ; SE SACA VALOR AL PUERTO B
MOVF SELDIGI,W ; SELECCIONADOR DE DIGITO A W
MOVWF PORTA ; SELECCION DE DIGITO AL PUERTO A
BSF STATUS,C ; COLOCA ACARREO EN 1, PARA APAGAR DIGITO 0
RLF SELDIGI,F ; CAMBIO EN LA SELECCION DE DIGITO
INCF FSR,F ; INCREMENTA APUNTADOR DE DIGITOS
CALL RETARDO ; PERMANENCIA DEL VALOR EN EL INDICADOR
BTFSS SELDIGI,4 ; SI FINALIZA ULTIMO DIGITO SALTA
GOTO PROXDIG ; SINO VA AL PROXIMO DIGITO

161 INICIO
3.9 Registro OPTION

El registro OPTION es un registro de 6 bits de escritura solamente, y contiene los


bits de control para configurar el escalamiento del temporizador TMR0 (Timer 0) o
del temporizador WDT (Perro guardián). El registro OPTION no tiene dirección
asignada en los microcontroladores de la gama básica. Sin embargo, este registro
sí tiene una dirección específica en los microcontroladores de la gama media.
A continuación se presenta la asignación de los bits del registro OPTION:

U-C U-0 W1 W1 W1 W1 W1 W1
TOCS TOSE PSA PS2 PS1 PS0
7 6 5 4 3 2 1 0

Bit 5: TOCS: Bit de selección de fuente del temporizador TMR0


1 = Transición del terminal TOCKI
0 = Reloj de ciclo de instrucciones interno (CLKOUT)
Bit 4: TOSE: Bit de selección de transición de fuente del temporizador TMR0
1 = Incremento en una transición de bajada en el terminal TOCKI
0 = Incremento en una transición de subida en el terminal TOCKI

162 INICIO
Bit 3: PSA: Bit de asignación del escalamiento.
1 = Se asigna el escalamiento a WDT (perro guardián).
0 = Se asigna el escalamiento al temporizador TMR0 (Timer 0).
Bit 2-0: PS2:PS0: Bits de selección de la relación de escalamiento.

PS2 PS1 PS0 Relación TMR0 Relación WDT


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

163 INICIO
Cambios en el
preescalador

Veamos un ejemplo de cómo cambiar el preescalador para los temporizadores del


PIC16C54. En el primer caso se hace un cambio del temporizador 0 al WDT.
Recuerda que los valores binarios “x”, son los que vamos a asignar:

CLRWDT ; BORRA EL TEMPORIZADOR PERRO GUARDIAN WDT


CLRF TMR0 ; BORRA TEMPORIZADOR TMR0
MOVLW B’00xx1111’ ; LAS ULTIMAS TRES INSTRUCCIONES SE REQUERIRAN SI
OPTION ; SE DESEA HACER EL CAMBIO
CLRWDT ; PS<2:0> A 000 O 001
MOVLW B’00xx1xxx’ ; SE ESTABLECE EL PREESCALADOR AL VALOR DESEADO
OPTION ; PARA EL WDT

En el segundo caso se hace un cambio del preescalador del WDT al TMR0.

CLRWDT ; BORRA EL WDT Y EL PREESCALADOR


MOVLW B’xxxx0xxx’ ; SELECCIONA EL NUEVO ESCALAMIENTO PARA TMR0 Y LA
OPTION ; FUENTE QUE ACTIVA ESTE TEMPORIZADOR

164 INICIO
3.10 Temporizador contador

Un temporizador contador tiene la función de calcular el tiempo transcurrido


durante la ejecución del programa del microcontrolador o, contar los pulsos
producidos por uno o más eventos externos. Básicamente el circuito que se utiliza
es el de un contador independiente, que puede ser activado por el oscilador del
microcontrolador o por un oscilador externo.

El temporizador TMR0 presenta las siguientes características:

 Registro contador - temporizador de 8 bits de lectura y escritura.


 Escalamiento programable (Véase registro Option).
 Selección de entrada de oscilador interna o externa.
 Selección del tipo de transición que activa la cuenta.

165 INICIO
Modo Temporizador

El modo temporizador se selecciona al colocar un cero en el bit TOCS, bit 5 del


registro OPTION. En este modo, el temporizador se incrementa por cada
transición del escalamiento, el cual divide la frecuencia de cada ciclo de
instrucción. Si se escribe el registro TMR0 (temporizador 0), el incremento se
inhibe durante los dos ciclos siguientes, véase las siguientes figuras:
Ciclos del Temporizador 0, para el oscilador interno sin escalamiento:

01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04
PC (Contador de
programa)
MOVWF TMR0 MOVF TMR0,W MOVF TMR0,W MOVF TMR0,W MOVF TMR0,W MOV TMR0,W MOVF TMR0, W
Preparación de
instrucción
Temporizador 0

Instrucción
Ejecutada

Escribir Leer TMRO Leer TMRO Leer TMRO Leer TMRO Leer TMRO
TRMRO Lee NTO+1 Lee NTO+2
Lee NTO Lee NTO Lee NTO
Ejecutado

166 INICIO
Ciclos del Temporizador 0:
Oscilador interno con escalamiento 1 a 2

01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04
PC (Contador de
programa)
MOVWF TMR0 MOVF TMR0,W MOVF TMR0,W MOVF TMR0,W MOVF TMR0,W MOV TMR0,W MOVF TMR0,W
Preparación de
instrucción
Temporizador 0

Instrucción
Ejecutada

Escribir Leer TMRO Leer TMRO Leer TMRO Leer TMRO Leer TMRO
TRMRO Lee NTO
Lee NTO Lee NTO Lee NTO Lee NTO+1
Ejecutado

El programador debe considerar este retardo en la escritura para ajustar el valor


deseado en TMR0.

167 INICIO
Modo Contador

El modo contador se selecciona al poner en 1 el bit TOCS (bit 5 del registro


OPTION). En este modo, el temporizador o el escalamiento se incrementará en 1
cada vez que haya una transición en el terminal de entrada TOCKI. El tipo de
transición se determina por medio del bit TOSE (bit 4 del registro OPTION); si
éste es cero, la entrada es sensible a transiciones de subida.
En la siguiente figura, se muestra la conexión eléctrica del terminal TOCKI, que es
la entrada del temporizador TMR0:

Entrada con
TOCKI Disparador de
N Schmitt

El escalamiento puede ser usado por TMR0 o por el temporizador WDT “perro
guardián”, pero no por ambos. La asignación del escalamiento se hace por el bit
PSA (bit 3 de OPTION). Si el bit PSA es cero, el escalamiento será asignado al
temporizador TMR0. Los valores de escalamiento pueden ser desde 1/2 hasta
1/256, según la tabla mostrada en el registro OPTION.

168 INICIO
En la tabla siguiente, se muestra un resumen de los registros asociados con
el temporizador TMR0.

Valor al Valor después


Direcc Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Encender de TMR0 y TO
N/A TMRO Temporizador 0 - Contador/reloj de tiempo real de 8 bits xxxx xxxx uuuu uuuu

N/A OPTION - - TOCS TOSE PSA PS2 PS1 PS0 11 1111 1111 1111

169 INICIO
Contador de tiempo

Veamos como ejemplo que se quiere incrementar un contador de tiempo cada segundo,
y que en una posición de memoria, se lleve la cuenta del tiempo en minutos.
Supongamos que el microcontrolador tiene un cristal de 10MHz.
Para este caso, si el oscilador es de 10MHz, el período del oscilador es igual a
100nSeg. El ciclo de máquina dura cuatro períodos del oscilador, por tanto
corresponde a 400nSeg. El valor máximo que se puede asignar al preescalador para
el TMR0, corresponde a 256 veces. Es decir que si tomamos el máximo valor, se
obtiene: 400nSeg X 256 = 102,4μSeg. El TMR0 es de 8 bits, por tanto este tiempo
lo podemos ampliar hasta 102,4μSeg X 255 = 26,112mSeg. Si la idea es obtener un
tiempo submúltiplo de 1Seg, podríamos seleccionar por ejemplo 20mSeg o 10mSeg, de
manera que al leer 50 o 100 veces el incremento de un registro que detecte cada vez
que el TMR0 se desborda, entonces obtendríamos 1 segundo respectivamente.
Supongamos que seleccionamos como base del temporizador 10mSeg, entonces
podríamos tomar el valor de escalamiento en 1/128, en vez de 1/256 que es el
máximo. Así se podrá tener mayor exactitud en la medición del tiempo.
El incremento del tiempo se hará en 400nSeg X 128 = 51,2μSeg. En 10mSeg se
necesitarán 10mSeg/51,2μSeg períodos del TMR0, es decir; 195,3125 ciclos de
TMR0. Como éste sólo admite un valor entero, se tomará el 195. El resto podría
corregirse con una rutina que retarde la escritura del temporizador unos 51,2μSeg X
0,3125 = 16μSeg, que corresponde a la ejecución de 40 ciclos del PIC. Sin embargo,
lo mejor sería probarlo sin tomar en cuenta este remanente, y luego corregir.
Para obtener los 195 ciclos del TMR0, debe cargarse el valor 256-195=61; no se
toma en cuenta el retardo en la escritura, ya que el valor del escalamiento es alto.

170 INICIO
El Contador de segundos
y minutos

include "P16C5X.INC" ; Incluye los símbolos del PIC16C54


cblock 10H
segund, minuto, hora, dia
endc
prepara movlw b'00000110' ; Selección del preescalador a TMR0 y división por 128
option ; Carga al registro OPTION la configuración
tmr0full movf TMR0,w
btfss STATUS,Z ; Chequea si el TMR0 está en 0
goto tmr0full
movlw d'61'
movwf TMR0 ; carga el valor 61 para que se ejecuten 195 ciclos de tmr0
incf segund,f ; Se incrementan los segundos
call ajuste
goto tmr0full ; Se espera hasta que el tmr0 vuelva a 0. Para otras aplicacione
; el programa principal puede seguir mientras se incrementa TMR0
ajuste movlw 6 ; Se hace el ajuste a BCD
addwf segund,w ; suma 6 para corrección digito 0
btfsc STATUS,DC ; chequea si hubo un acarreo en digito 0
movwf segund ; corrige si hay acarreo digito 0
movlw 0A0
addwf segund,w ; suma 100 para corrección de segundos
btfsc STATUS,C ; corrige si hay acarreo
goto incminu ; va a incrementar los minutos
retlw 0 ; retorna si no hay incremento de minutos
incminu movwf segund ; corrige si hay acarreo en el siguiente dígito
incf minuto,f ;
• ; el programa continúa, aquí se puede hacer las correcciones para
• ; contar los minutos, horas, días, etc.

171 INICIO
Una consideración respecto
al programa anterior

En el programa anterior observamos que el microcontrolador está un tiempo inactivo,


mientras espera el desbordamiento del TMR0. Para este programa, puede no ser
problema alguno, pero en otros programas se necesita administrar mejor el tiempo
del microcontrolador. Esto se puede solucionar si el microcontrolador tuviera una
interrupción que avisara que ya se llenó el TMR0. Sin embargo los PIC de la gama
media no tienen este recurso, cosa que sí tienen los PICs de gamas más avanzadas.
Si se desea aprovechar mejor un programa de un PIC de la gama básica, entonces se
sugiere que el programa que se esté ejecutando realice sus actividades mientras el
TMR0 está contabilizando el tiempo. Es importante que mientras se ejecuta dicho
programa, el tiempo no exceda al de un ciclo del TMR0, porque sino, al evaluar su
salida, pudo ya haber pasado por cero, y entonces habrá que esperar otro
desbordamiento del temporizador.

172 INICIO
Uso de un oscilador externo
para TMR0

Si un oscilador externo se usa para el temporizador TMR0, hay que considerar que
debe haber una sincronización con la fase del oscilador externo; sino habrá un
retardo en el incremento del temporizador TMR0 después de la sincronización.

Al no usar el escalamiento, la señal del oscilador externo entra directamente al bloque de


sincronización. Esta sincronización de TOCKI con la fase del oscilador interno, se realiza por
medio del muestreo de la salida escalada en los ciclos Q2 y Q4 de la fase del oscilador interno.
Por consiguiente, se necesita que TOCKI esté en 1 por lo menos dos veces el periodo del oscilador
y en 0 al menos otro intervalo de tiempo igual. Véase la siguiente figura:

01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04
Un pequeño pulso se
Entrada de un pierde en el muestreo
Oscilador Externo o
Salida del (1)
Escalamiento
(3)
Salida del Oscilador
Externo/Escalamiento
Después del muestreo
Incremento del tem-
porizador TMR0 (Q4)

Temporizador TMR0

173 INICIO
Cuando se usa el escalamiento, se obtiene una señal simétrica cuya frecuencia está
divida con respecto a la de la frecuencia de entrada del oscilador. Es necesario que
en la entrada TOCKI, el período sea de por lo menos 4Tosc dividido entre el valor
escalado. Por otro lado, la duración de un nivel debe ser mayor que el mínimo ancho
de pulso requerido de acuerdo a las especificaciones, es decir 10nSeg.

Debido a que la salida del escalamiento se sincroniza con el oscilador interno, cuando
ocurre una transición en la señal externa habrá un pequeño retardo en el incremento
del temporizador TMR0.

174 INICIO
3.11 Temporizador WDT
(Perro Guardián)

En la mayoría de los microcontroladores, se incorpora un temporizador independiente


llamado “perro Guardián” (Watchdog Timer). Éste tiene la finalidad de reiniciar el
programa principal o atender una interrupción, cuando ocurre una anormalidad en la
ejecución de la secuencia de instrucciones programadas. Básicamente esta
“anormalidad” hará que el programa ejecute un lazo sin retorno, y por tanto el
microcontrolador no hará la función que se le había asignado. Si esto ocurre, y se
dispone de un temporizador “perro guardián”, éste, después de un tiempo de espera,
enviará la señal de interrupción que repondrá al microcontrolador y podrá ser capaz
de iniciar o continuar el programa principal. Es de suponer, que si se va a utilizar
este temporizador, el programa principal debe borrarlo en un tiempo menor al tiempo
de espera especificado por el temporizador, porque de lo contrario el programa
nunca se ejecutaría completamente.

175 INICIO
En los PIC16C5X, el temporizador WDT o “perro guardián” es un oscilador
independiente de configuración RC que está dentro del microcontrolador. Esto
significa que este circuito genera una señal, aunque el oscilador principal (terminales
OSC1/CLKIN y OSC2/CLKOUT) se haya detenido, como por ejemplo al ejecutar la
instrucción SLEEP. En una operación normal o en el modo “Reposo” (SLEEP), una
señal de habilitación del WDT, resultará en una inicialización del microcontrolador.
El bit TO (bit 4 de STATUS) se borrará después de esta señal de inicialización.

El temporizador WDT puede ser deshabilitado permanentemente al colocar en “0” el


bit de configuración WDTE. Véase el tema IV, acerca de los bits de configuración
para los microcontroladores 16C5X.

176 INICIO
Período del temporizador WDT

El período de espera del temporizador WDT, es de alrededor 18 mSeg cuando no


tiene escalamiento. Si se desea un mayor tiempo de espera, este período se puede
aumentar por medio del escalamiento hasta 128 veces. Para ello se debe colocar en
“1” los bits PSA, PS2, PS1 y PS0 del registro OPTION. De esta manera, se puede
obtener un tiempo de espera normal de hasta 2,3 segundos. Este periodo puede
variar con la temperatura, VDD y las tolerancias en las especificaciones.

177 INICIO
Consideraciones al programar
el Temporizador WDT:

La instrucción CLRWDT borra el contenido del temporizador WDT y el


escalamiento, si éste ha sido asignado a WDT. Esto permitirá que no
ocurra una inicialización del microcontrolador.

La instrucción SLEEP, borra el contenido del temporizador WDT y el


escalamiento, si éste ha sido asignado a WDT. El “perro guardián”
(WDT) “despertará” al microcontrolador en el tiempo máximo de espera
fijado por el WDT.

REGISTROS ASOCIADOS CON EL TEMPORIZADOR WDT (PERRO GUARDIÁN):

Direcc Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 Valor al Valor después de
Encender TMR0 y MCLR

N/A OPTION - - TOCS TOSE PSA PS2 PS1 PS0 --11 1111 --11 1111

178 INICIO
Programa que utiliza el WDT
para prevenir lazos infinitos

Veamos el ejemplo del contador de segundos y minutos. Sabemos que el programa


deberá chequear continuamente el temporizador TMR0. Una manera de prevenir que el
programa se “guinde” es de la siguiente manera:

tmr0full movf TMR0,w


btfss STATUS,Z ; Chequea si el TMR0 está en 0
goto tmr0full
movlw d'61'
movwf TMR0 ; carga el valor 61 para que se ejecuten 195 ciclos de tmr0
clrwdt ; Borra el temporizador WDT
incf segund,f ; Se incrementan los segundos


Recordemos que el WDT reiniciaría el microcontrolador cada 18mSeg aproximadamente,


si no se borra antes de que transcurra ese tiempo, ya que este valor no se puede
ampliar porque el TMR0 está utilizando el escalador. Si sabemos que el TMR0 se
carga cada 10mSeg, entonces podría ser una buena alternativa colocar la instrucción de
borrado del WDT después de cargar el valor en el TMR0.
Es importante tomar en cuenta, que el WDT se activa por medio de los bits de
configuración al hacer la programación del PIC, lo cual se verá en el próximo tema.

179 INICIO
ACTIVIDADES A REALIZAR

1.- Hacer un contador BCD con dos pulsadores para el control ascendente y
descendente, y que tenga dos dígitos de salida en formato siete segmentos.
2.- Hacer un control de luces para el semáforo propuesto en el tema 2, en el cual se
lleve la medición del tiempo con el temporizador TMR0. Suponga que la frecuencia
del oscilador es igual a 4MHz.
3.- Hacer un reloj digital, que sincronice su velocidad con el temporizador TMR0.
Este reloj deberá tener la posibilidad de ajustar la hora y minutos, por medio de
pulsadores. Asuma que la frecuencia del oscilador es igual a 20MHz.
4.- Incluir el temporizador WDT en las actividades anteriores, de manera que el
programa se ejecute correctamente, en condiciones normales, y que haga la
inicialización, en el caso de caer en un lazo infinito.

180 INICIO
TEMA 4
Características Especiales del
Hardware

CONTENIDO

4.1.- Configuración de la serie PIC16C5X

4.2.- Modo SLEEP (Reposo)

4.3.- Inicialización de los PIC16C5X

4.4.- El Temporizador de Inicialización (DRT)

4.5.- Inicialización por Encendido (POR)

INICIO
Objetivos Terminales:
•Describir los modos de
configuración que presentan los
microcontroladores PIC.
•Señalar la importancia que tiene
activar el modo “Reposo” en un
microcontrolador.
•Describir los modos de
inicialización que presentan los
microcontroladores PIC.

182
INICIO
4.1.- Configuración de
la serie PIC16C5X

En la dirección FFFh de los microcontroladores de la serie 16C5X, se dispone de


una palabra de configuración de 12 bits, de los cuales 4 bits tienen funciones
específicas. Cuando se va a grabar el programa en el microcontrolador, se tiene
acceso a esta dirección. Para ello, se dispone de una ventana que permite
configurar algunas características del hardware del microcontrolador.

 Estos bits pueden programarse para seleccionar algunas funciones de Hardware


del microcontrolador.

 Dos de los bits son para seleccionar el tipo de oscilador que se va a utilizar, un
bit es para la habilitación del temporizador “Perro Guardián” (WDT) y un bit es
para habilitar la protección del código del programa.

183 INICIO
Diagrama de la palabra de configuración

CP WDTE FOSC1 FOSC0


Bit 11 10 9 8 7 6 5 4 3 2 1 Bit 0

Registro CONFG
Dirección FFFH
Bits 11-4: No utilizados: Se leen “0”

Bit 3: CP: Bit de protección de códigos


1-> No protegido
0-> Protegido

Bit 2: WDTE: Habilitación del temporizador WDT (Perro Guardián)


1-> Habilitado
0-> Inhabilitado

184 INICIO
Protección de códigos

Los microcontroladores PIC tienen la posibilidad de proteger el programa grabado


en memoria al acceder al bit 3 de la palabra configuración.

Si este Bit tiene valor 0, entonces no será posible leer el programa guardado.

Habilitación del Temporizador WDT

El temporizador WDT se utiliza normalmente para reiniciar el programa principal,


cuando ocurre una anormalidad.

En el bit 2 de la palabra de configuración se puede habilitar o no este


temporizador, al colocar un 1 ó un 0 respectivamente.

185 INICIO
Selección del Oscilador

Los microcontroladores PIC16C5X, pueden operar en uno de cuatro modos de


oscilación; para ello, el usuario deberá programar dos de los bits de
configuración del microcontrolador.

En la palabra de configuración, que sólo se accede a ella en el modo de


programación, se encuentran los bits FOSC1 y FOSC0 (bits 1 y 0
respectivamente).

De acuerdo a la combinación de ellos, se puede escoger lo siguiente:

 LP Cristal resonante a bajo consumo (00)


 XT Cristal resonante (01)
 HS Cristal resonante de alta velocidad (10)
 RC Resistencia y condensador (11)

186 INICIO
En las figuras de la página siguiente, se puede observar la conexión del cristal en
el microcontrolador, y los valores adecuados de los condensadores según el modo de
oscilación seleccionado.
Otra alternativa existente es la de conectar una señal producida por un oscilador
externo en la entrada OSC1/CLKIN, lo cual se puede observar a continuación

Señal de un oscilador OSC1


externo
PIC 16C5X
Abierto OSC2

187 INICIO
C1(1) OSC1
PIC16C5X

SLEEP
XTAL RF(3)

Hacia lógica

OSC2
interna
Tabla de Selección
RS(2)
C2(1)

NOTAS: Tipo de Frecuencia C1 C2


Oscilador resonante
1.- Ver tabla de selección de C1 y
C2
LP 32KHz 15 pF 15pF
2.- Puede ser necesario colocar una
resistencia en cristales sin blindajes
XT 100KHz 15-30 pF 200-300 pF
3.- El valor de RF depende del 200KHz 15-30 pF 100-200 pF
cristal seleccionado 455KHz 15-30 pF 15-100 pF
1MHz 15-30 pF 15-30 pF
2MHz 15 pF 15 pF
4MHz 15 pF 15 pF

HS 4MHz 15 pF 15 pF
8MHz 15 pF 15 pF
20MHz 15 pF 15 pF

188 INICIO
Para las aplicaciones en las cuales no se requiera precisión en la medición del tiempo,
el modo RC ofrece una alternativa económica para el desarrollo de circuitos. La
frecuencia del oscilador RC, depende de los valores del voltaje de alimentación, la
resistencia Rext, el condensador Cext, la temperatura de operación y la tolerancia que
ofrece el dispositivo. Se recomienda utilizar valores de Rext entre 3 K y 100 K.
En cuanto a Cext se recomienda utilizar valores por encima de los 20 pF.
En la siguiente figura se muestra la conexión de circuito RC, nótese que se dispone de
una salida con la frecuencia de oscilación dividida entre cuatro en el terminal
OSC2/CLKOUT.

VDD

Rext Reloj Interno


OSC1

N PIC16C5X
Cext

Vss OSC2/ClkOUT
FOSC/4

189 INICIO
Valores típicos de frecuencia que se
pueden obtener en el modo RC

Cext Rext Frecuencia


Vdd= 5V, Tamb=25ºC

3.3K 5,0MHz
20pF 5K 3,8MHz
10K 2,2MHz
100K 260KHz
3.3K 1,6MHz
100pF 5K 1,2MHz
10K 680KHz
100K 72KHz
3.3K 660KHz
300pF 5K 480KHz
10K 270KHz
160K 29KHz

190 INICIO
4.2.- Modo SLEEP (Reposo)

Los microcontroladores PIC, tienen la posibilidad de estar en un modo de operación


de bajo nivel de consumo. Sin embargo, durante ese tiempo, no podrá ejecutar
instrucciones, tal como si estuviera durmiendo. Luego podrá despertar para
funcionar en el modo normal, por medio de una señal de inicialización.

Para estar en el modo “Reposo”, se deberá ejecutar en el programa la instrucción


SLEEP. Si el temporizador “perro guardián” está habilitado, al ejecutar la
instrucción SLEEP, borrará el contenido del registro WDT, para dar comienzo el
tiempo de espera seleccionado según el escalamiento del WDT, y enviar después la
señal del temporizador “perro guardián”. Por otro lado, el bit TO o tiempo de
espera (bit 4 de STATUS), se coloca en “1”, y el bit PD o baja potencia (bit 3 de
STATUS), se coloca en “0”, entonces el oscilador se detiene. Los puertos de
entrada y salida mantienen el estado anterior a la ejecución de la instrucción SLEEP.

Si se desea un consumo aún menor en este estado, se deberá colocar el terminal


TOCKI a un nivel fijo (VDD o VSS) y la entrada MCLR/Vpp deberá colocarse a un nivel
alto.

191 INICIO
Para salir del modo de reposo, existen dos posibilidades: Por medio de una
inicialización externa o al cumplirse el tiempo de espera en el temporizador “perro
guardián” (si WDT había sido habilitado).

Estas dos formas causarán una inicialización del dispositivo, y los bits TO y PD
pueden usarse para determinar cómo se hizo la inicialización.

Un cero en el bit TO, indicará que el tiempo de espera en el WDT “despertó al


microcontrolador”.

192 INICIO
4.3.- Inicialización de los PIC16C5X

Los microcontroladores PIC pueden iniciar sus funciones de las siguientes formas:

 Inicialización por encendido (POR).

Inicialización MCLR (operación normal).

 Inicialización MCLR al “despertar” (desde el modo Reposo o SLEEP).

 Inicialización WDT (operación normal).

 Inicialización del WDT para “despertar” (desde el modo Reposo o SLEEP).

La siguiente tabla muestra las condiciones de los bits de los registros PCL y STATUS,
después de una inicialización.

193 INICIO
PCL STATUS
Condición
Dirección: 02h Dirección: 03h

Inicialización por encendido 1111 1111 0001 1xxx

Inicialización MCLR 1111 1111 000u uuuu


(operación normal)

Inicialización MCLR al 1111 1111 0001 0uuu


“despertar” (desde modo
Reposo)

Inicialización WDT 1111 1111 0000 1uuu


(operación normal)

Inicialización WDT al 1111 1111 0000 0uuu


“despertar” (desde modo
Reposo)

Nota: “x” significa “cualquier valor”; “u” significa que mantiene el valor anterior

194 INICIO
Algunos registros se establecerán según la condición de inicialización. Los otros no
serán afectados y sus estados serán indefinidos después de una inicialización al
encender el dispositivo, y mantendrán sus valores para otro tipo de inicialización.
Los bits TO (tiempo de espera) y PD (Reposo); se colocarán en “0” o en “1”,
dependiendo de la condición de la inicialización. Estos bits pueden utilizarse para
conocer la causa de inicialización. A continuación se muestra cómo se afectan los
bits TO y PD según el tipo de inicialización y según ciertas condiciones en el
microcontrolador.

TO PD Inicialización fue causada por:


1 1 Encendido (POR)
u u Inicialización MCLR (Operación Normal)
1 0 Inicialización MCLR al despertar
0 1 Inicialización WDT (Operación Normal)
0 0 Inicialización WDT Al despertar

195 INICIO
Estados de los registros,
después de una inicialización

Registro Dirección Inicialización por Inicialización por


Encendido MCLR o WDT
W N/A xxxx xxxx uuuu uuuu

TRIS N/A 1111 1111 1111 1111

OPTION N/A --11 1111 --11 1111

INDF 00h xxxx xxxx uuuu uuuu

TMRO 01h xxxx xxxx uuuu uuuu

PCL(1) 02h 1111 1111 1111 1111

Nota: “x” significa “cualquier valor”.


“u” significa que mantiene el valor anterior.

196 INICIO
Registro Dirección Inicialización por Inicialización por
Encendido MCLR o WDT

STATUS 03h 0001 1xxx 000? ?uuu

FSR 04h 1xxx xxxx 1000 0000

PORTA 05h --- xxxx ---- uuuu

PORTB 06h xxxx xxxx uuuu uuuu

Registros de
07h-7Fh xxxx xxxx uuuu uuuu
propósitos generales

197 INICIO
En la siguiente figura, se muestra el diagrama de bloques del circuito de
inicialización:

Detector de POR
VDD Encendido (Inicialización
por Encendido)

Tiempo de espera
MCLR/VDD del WDT
Contador de 8 Bits Inicio S Q
Oscilador RC
Asincrónico
Interno (Temporizador de
Arranque) R Q
Inicialización
del Chip

198 INICIO
4.4. El Temporizador de
Inicialización (DRT)

El temporizador de inicialización (DRT) es un circuito interno, basado en un


oscilador RC, que introduce un tiempo de espera nominal de 18mseg, antes de la
inicialización del microcontrolador.

El retardo en la inicialización que introduce este circuito, permite la estabilización


de la frecuencia de oscilación en el circuito resonante que fija los ciclos del
microcontrolador; lo cual evita la necesidad de colocar una red RC externa para
este propósito.

El DRT también se activa después de un tiempo de espera del “perro guardián”


(WDT), lo cual es importante para aplicaciones en las que “despertará” al
microcontrolador, después del modo “dormir” o reposo.

199 INICIO
4.5. Inicialización por
encendido (POR)

Los microcontroladores de la familia PIC16C5X incorporan un circuito de


inicialización por encendido dentro del chip, para la mayoría de las situaciones.
Para utilizar estas facilidades, el diseñador simplemente debe colocar el terminal
MCLR/Vpp al voltaje de alimentación Vpp.

Los circuitos de la inicialización por encendido (POR) y del temporizador de


inicialización (DRT), están muy relacionados. Cuando se enciende el
microcontrolador, el registro de inicialización se coloca en “1” y se borra el DRT.
Luego el DRT arranca cuando detecta un “1” en la línea MCLR. Después de un
tiempo de espera, que dura aproximadamente 18mseg, se pone en “0” el registro
de inicialización y de esta manera se genera la señal de inicialización.

Un ejemplo de encendido en donde MCLR no se conecta a VDD se grafica en la


siguiente figura:

200 INICIO
V1
VDD

MCLR

TDRT
POR INTERNO

ESPERA DRT

INICIALIZACIÓN INTERNA

El VDD aumenta y se estabiliza antes de que MCLR sea igual a “1”.


La inicialización se efectuará un tiempo después de que MCLR sea “1” y será
fijado por el DRT.

201 INICIO
La siguiente figura muestra el caso en que MCLR se conecta a VDD.

V1
VDD

MCLR

POR INTERNO TDRT

ESPERA DRT

INICIALIZACIÓN INTERNA

El caso conveniente se consigue cuando MCLR se conecta a VDD. El


valor de VDD permanece estable antes de que se cumpla el tiempo de espera
en el DRT, y no hay problemas en obtener la inicialización adecuada.

202 INICIO
Para los casos en los que la alimentación sube de manera muy lenta, ocurre una
situación problemática. Véase la siguiente figura:

V1
VDD

MCLR

TDRT
POR INTERNO

ESPERA DRT

INICIALIZACIÓN INTERNA
Cuando VDD se eleva lentamente, el tiempo de espera TDRT se acaba antes de
que VDD llegue al valor final. En este ejemplo, el dispositivo tendrá una
inicialización apropiada, únicamente si V1  VDD.

203 INICIO
Cuando el DRT detecta el “1” lógico en la entrada MCLR/Vpp, y ésta no ha llegado
a estabilizar su voltaje, no habrá garantía de que la inicialización en el
microcontrolador se haya hecho correctamente. Para estos casos, se recomienda
colocar un circuito RC como se muestra a continuación, de manera de solventar este
problema.

VDD VDD

D R
R1
MCLR
C
PIC16C5X

Si se desea mayor información, consultar la nota de aplicación AN522 en el


“Embedded Control Handbook” o en www.microchip.com.

204 INICIO
TEMA V
Otros Microcontroladores de la Gama Básica

5.1.- Introducción
5.2.- Familia de los microcontroladores PIC de la gama básica
5.3.- Conexiones externas de los microcontroladores PIC de la gama básica
5.4.- Organización de las memorias de los microcontroladores PIC de la gama básica
5.5.- Registro STATUS
5.6.- Registro Contador de Programa PC
5.7.- Memoria de Datos

INICIO
5.1 INTRODUCCIÓN

Hemos visto hasta ahora todo lo relacionado con el PIC16C54. Este microcontrolador
es muy útil para aplicaciones básicas. En la medida en que aumenta la complejidad de
un circuito, será necesario utilizar dispositivos con mayor capacidad de memoria, o
posiblemente se requiera una mayor cantidad de líneas de entrada y salida, o por el
contrario, pueden haber aplicaciones en las que se requiera pocas líneas y bajo
consumo. Dentro de los PIC de la gama básica, hay otros microcontroladores que
pueden solucionar estos problemas. Recuerda que la idea al utilizar
microcontroladores, es para que este circuito haga prácticamente todas las funciones
electrónicas de la aplicación requerida. En otras palabras, un circuito con
microcontrolador no debería tener, en lo posible, ampliaciones externas de memoria ni
circuitos digitales de soporte. ¿Por qué? Simplemente, porque si se hace esto, estas
soluciones implican la utilización de más circuitos externos y en muchos casos se
sacrificarían líneas que pueden utilizarse como puertos; por otro lado, si en un
programa se pueden realizar todas las funciones lógicas, entonces será más económico
aprovechar la elaboración de rutinas que ejecuten esas funciones. Por ejemplo, no
sería conveniente hacer un contador con un microcontrolador, cuyas salidas vayan a un
decodificador BCD a 7 segmentos. Es más económico y funcional hacer la
decodificación BCD a 7 segmentos, por medio de una rutina de conversión. Tampoco
será lógico añadir una memoria externa para aumentar la capacidad, ya que al
comunicar la memoria con el microcontrolador se utilizarán líneas de puerto, que bien
pueden emplearse para otra actividad. La solución será adquirir un microcontrolador
con mayor capacidad de memoria.

206 INICIO
5.2 Familia de los microcontroladores
PIC de la gama básica

A continuación se presentan otros modelos de microcontroladores PIC de la gama


básica con sus características:
Producto Memoria de programa RAM Líneas Encapsulado Temporizadores Veloc. Otras características
MCU Bytes OTP/EPROM ROM Bytes E/S y WDT Máx.

207 INICIO
Familia de los microcontroladores PIC
de la gama básica con memoria FLASH

A continuación se presentan los dos modelos de microcontroladores PIC de la gama


básica con memoria FLASH y sus características:

Producto Memoria de RAM Líneas Encapsulado Temporiza- Velocidad Otras


MCU programa FLASH Bytes E/S dores y Máx. Características
WDT
PIC16F54 512X12 25 12 18/PDIP 1-8 bits 20MHz Memoria FLASH
18/SOIC 1-WDT
20/SSOP
PIC16F57 2KX12 72 20 1-8 bits 20MHz Memoria FLASH
1-WDT

Podemos observar que las características son idéntica a los PIC16C54 y PIC16C57,
con la diferencia de que la memoria de programa es del tipo FLASH. Esto ofrece una
ventaja considerable, ya que no se necesita el borrador de luz ultravioleta para poder
reprogramar los microcontroladores.

208 INICIO
5.3 Conexiones externas de los
microcontroladores PIC
de la gama básica
A continuación, se presenta la interconexión de los PIC’s 16C54 hasta el 16C58.
Puede observarse que las líneas RA0 a RA3, RB0 a RB7 y RC0 a RC7 constituyen las
líneas de puertos de entrada y salida.

Cada conexión tiene su propia función específica

209 INICIO
5.4 Organización de las memorias
de los microcontroladores PIC
de la gama básica
Sabemos que los microcontroladores de la gama básica tienen un mismo conjunto de
instrucciones. Sin embargo, debido a las diferencias que hay entre cada modelo, en
cuanto a las capacidades de memoria y números de líneas de entrada y salida, se
deberá tomar esto en consideración para realizar la programación.
Los 16C54 y 16C55, tienen un contador de programa (PC) de 9 bits, capaz de ubicar
al programa, en una de las 512 direcciones del espacio de memoria que se utiliza la
palabra de 12 bits.

PC<8:0>
9
CALL, RERLW
NIVEL DE PILA 1
NIVEL DE PILA 2

Espacio 000h
para MEMORIA
memoria DE 0FFh
del 100h
usuario
PROGRAMA
VECTOR DE INICIALIZACIÓN 1FFh

Memoria de programa de los PIC16C54 y 55

210 INICIO
Organización de las memorias de los
microcontroladores PIC16C56, 57 y 58

PC<10:0>
11
CALL, RERLW
NIVEL DE PILA 1 PC<9:0>
10
NIVEL DE PILA 2 CALL, RERLW
NIVEL DE PILA 1
000h
MEMORIA DE NIVEL DE PILA 2
PROGRAMA 0FFh
(página 0) 100h
000h
1FFh MEMORIA DE
MEMORIA DE 200h
Espacio PROGRAMA 0FFh
PROGRAMA 2FFh para 100h
300h (página 0)
(página 1) memoria 1FFh
3FFh MEMORIA DE
del 200h
Espacio MEMORIA DE 400h
usuario PROGRAMA
PROGRAMA 4FFh 2FFh
para 500h (página 1) 300h
memoria (página 2) 5FFh
del MEMORIA DE 600h
VECTOR DE INICIALIZACIÓN 3FFh
usuario PROGRAMA 6FFh
(página 3) 700h
Memoria de programa del PIC16C56
VECTOR DE INICIALIZACIÓN 7FFh

Memoria de programa del PIC16C57 y 58

211 INICIO
5.5 Registro STATUS

Hemos visto en la descripción del PIC16C54 que el registro STATUS se ubica en la


dirección 03h en la memoria de datos. Este registro tiene unos bits que indican los
estados de las operaciones lógicas y aritméticas, la detección del tipo de inicialización
y la selección de página de la memoria de programa.
A continuación se presentan los bits del registro STATUS y más abajo, la explicación
de los bits PA1 y PA0, los cuales son los bits que se utilizan para la selección de
página de la memoria de programa.

R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x


PA2 PA1 PA0 TO PD Z DC C
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

R = bit de lectura W = bit de escritura -N = Valor después de la inicialización.

Bit 7: PA2: No se usa para la serie 16C5X

Bit 6-5: PA1-PA0: Página seleccionada de la memoria de programa (PIC 16C56/57/58)


00 = Pág. 0 = (000h - 1FFh)
01 = Pág. 1 = (200h - 3FFh)
10 = Pág. 2 = (400h - 5FFh) PIC16C57/58
11 = Pág. 3 = (600h - 7FFh) PIC16C57/58

212 INICIO
5.6 Registro Contador de
Programa PC
Cuando una instrucción es ejecutada, el contador de programa (PC) contendrá la
dirección de la próxima instrucción a ejecutarse. El valor del PC se incrementa en
uno por cada ciclo de instrucción, al menos que la instrucción cambie el valor del
PC.
Para una instrucción GOTO, los bits 8 a 0 del PC se incluyen en dicha instrucción.
El registro PCL toma los bits 7 a 0. Véase figura a continuación:

9 8 7 0
PIC16C56 PC PCL

Palabra de Instrucción 10 9 8 7 0
PA0 0 PC PCL
7

STATUS Palabra de Instrucción


PA1 PA0
PIC16C54/55 2
8 7 0 7 0
PC PCL
STATUS

Palabra de Instrucción PIC16C57/58

213 INICIO
Para una instrucción CALL, o alguna instrucción donde el PCL es el destino, los bits 7
a 0 del PC se obtienen del código de la instrucción. Sin embargo, el bit 8 del PC no
viene del código de la instrucción, sino que es puesto en cero.

Algunas de las instrucciones donde el PCL es el destino, o se le modifica el


contenido, son: MOVWF PCL, ADDWF PCL y BSF PCL, 5. Recuerda que la dirección
del PCL es la 2

Para los PIC16C56, 16C57 y 16C58, se debe agregar un número de página. El bit 5
del registro STATUS se transfiere al bit 9 del PC para el PIC16C56, y los bits 5 y
6 del registro STATUS se transfieren respectivamente a los bits 9 y 10 del PC para
los PIC16C57 y PIC16C58. Véase figura a continuación.

214 INICIO
7 0 9 8 7 0
8
PC PCL PC PCL

Inicialización Palabra de Instrucción Palabra de Instrucción


A “0” Inicialización
A “0”
7 PA0 0
PIC16C54/55

STATUS
PIC16C56

10 9 8 7 0
PC PCL

2 0 Palabra de Instrucción
PA1 PA0
7 0

STATUS

PIC16C57/58

215 INICIO
Efectos de la inicialización

El contador de programa (PC) es cargado en la última dirección de la memoria de


programa cuando hay una inicialización (RESET), lo cual significa que la dirección
del PC se coloca al finalizar la dirección de la última página, es decir al valor del
vector inicialización.

Los bits de la página preseleccionada en el registro STATUS, son borrados


después de una inicialización, lo cual significa que se preselecciona la página 0.
Por consiguiente, después de la inicialización, una instrucción GOTO en la posición
del vector inicialización, hará que el programa salte a la página 0.

Si ocurre una inicialización inadecuada (por ejemplo una baja de tensión en la


alimentación), los bits de preselección de página, en el registro STATUS, pueden
no ser borrados. Por consiguiente, es una buena práctica de programación
borrar el registro STATUS (CLRF STATUS) en la posición del vector de
inicialización para que después el PC se coloque en la posición 000h.

216 INICIO
Consideraciones para las páginas
en los PIC 16C56/57/58

Si el contador de programa está apuntando a la última dirección de una página


seleccionada, cuando éste se incremente, hará que el programa continúe hacia la
página siguiente. Sin embargo, los bits de la página preseleccionada en el registro
STATUS, no se actualizarán. Por consiguiente, la próxima instrucción GOTO,
CALL o de modificación del PCL, enviará al programa a la página especificada por
los bits preseleccionados de página (PA0 o PA1).

Por ejemplo, una instrucción NOP en la posición 1FFh (página 0), incrementa el PC
a 200h (página 1). Un GOTO xxh en la posición 200h, hará que el programa salte
a la posición xxh en la página 0 (asumiendo que PA1: PA0 valen 0). Para prevenir
esto, los bits de la página preseleccionada deben actualizarse por medio del
control del programa.

217 INICIO
ecuerda
La memoria de programa está seleccionada en páginas de 512 palabras de 12 bits.
Cada posición en una página, puede ser accedida directamente cuando se va a
ejecutar un salto de dirección por medio de las instrucciones: CALL, RETLW o
GOTO.

Para los dispositivos con capacidad de más de 512 palabras, se utilizan los bits de
selección de página PA1 y PA0, los cuales se encuentran en el STATUS.

En la memoria de datos se ubican los registros de funciones especiales y los de


propósitos generales. En las siguientes páginas, podrás observar la ubicación de los
registros en los microcontroladores PIC de la serie 16C5X. En ellos encontrarás que
los dispositivos de 28 terminales, tienen al puerto C ubicado en la posición 07h, que
corresponde a un registro de propósito general para los microcontroladores de 18
terminales. Por otro lado, observarás que los PIC16C57 y PIC16C58 tienen una
memoria RAM de mayor capacidad, y por tanto el acceso se hace por medio del
registro FSR, ya sea de manera indirecta a través del registro INDF o directa, por
medio de los bits 6 y 5 del registro FSR, ya que éstos indican el banco de memoria
a utilizar, que está especificado de acuerdo a su valor en binario.

218 INICIO
5.7 Memoria de datos
PIC16C54, 55 y 56

MEMORIA DE DATOS DE LOS MEMORIA DE DATOS DEL


PIC16C54 Y 56 PIC16C55

00h INDF(1) 00h INDF(1)


01h TMRO 01h TMRO
02h PCL 02h PCL
03h STATUS 03h STATUS
04h FSR 04h FSR
05h PORTA 05h PORTA
06h PORTB 06h PORTB
07h 07h PORTC
REGISTROS
0Fh DE 0Fh REGISTROS
10h PROPÓSITOS 10h DE
GENERALES PROPÓSITOS
1Fh 1Fh GENERALES

(1) El registro INDF, no corresponde a una posición física, sino al registro cuya dirección está
contenida en el registro FSR.

219 INICIO
Memoria de datos PIC16C57

MEMORIA DE DATOS DEL PIC16C57


FSR<6:5> 00 01 10 11
Dirección
de registro00h
INDF(1) 20h
01h TMRO 40h 60h
02h PCL
03h STATUS
04h FSR
05h PORTA Este Mapa de Direcciones
06h PORTB retoma a las direcciones
07h PORTC del Banco 0

08h REGISTROS
DE
PROPÓSITOS
GENERALES 2Fh 4Fh 6Fh
0Fh
10h REGISTROS 30h REGISTROS 50h
REGISTROS 70h REGISTROS
DE DE DE DE
PROPÓSITOS PROPÓSITOS PROPÓSITOS PROPÓSITOS
GENERALES GENERALES
1Fh GENERALES GENERALES
3Fh 5Fh 7Fh
Banco 0 Banco 1 Banco 2 Banco 3

220 INICIO
Memoria de datos PIC16C58

MEMORIA DE DATOS DEL PIC16C58

FSR<6:5> 00 01 10 11
Dirección
de registro00h
INDF(1) 20h
01h TMRO 40h 60h
02h PCL
03h STATUS
04h FSR
05h PORTA Este Mapa de Direcciones
06h PORTB retoma a las direcciones
07h del Banco 0
REGISTROS
DE
PROPÓSITOS
GENERALES 2Fh 4Fh 6Fh
0Fh
10h REGISTROS 30h REGISTROS 50h
REGISTROS 70h REGISTROS
DE DE DE DE
PROPÓSITOS PROPÓSITOS PROPÓSITOS PROPÓSITOS
GENERALES GENERALES
1Fh GENERALES GENERALES
3Fh 5Fh 7Fh
Banco 0 Banco 1 Banco 2 Banco 3

221 INICIO
TEMA VI
Microcontrolador PIC16F84A

6.1.- Introducción
6.2.- Familia de los microcontroladores PIC16F8X
6.3.- El PIC16F84A
6.4.- Nuevas instrucciones de los PIC de la gama media
6.5.- Organización de la memoria del PIC16F84A
6.6.- El registro STATUS
6.7.- Manejo de Interrupciones en el PIC16F84A
6.8.- La Memoria EEPROM
6.9.- Registro Contador de Programa PC
6.10.- El Registro STACK (Pila)
6.11.- Los temporizadores y algo más de PORTB
6.12- Los Bits de configuración

INICIO
Objetivos Terminales:

•Establecer las diferencias


de software y hardware
entre los microcontroladores
de la gama básica y los de
la gama media.
•Explicar la arquitectura del
microcontrolador PIC16F84.
•Diseñar circuitos básicos
con microcontroladores de
la gama media.

223
INICIO
6.1- INTRODUCCIÓN

Los microcontroladores de la gama básica son útiles para aplicaciones sencillas, en


donde se realiza una tarea a la vez. Ejemplos de estas aplicaciones, pueden ser los
relojes digitales, las combinaciones de cajas fuertes y cerraduras, medidores de
frecuencia, tacómetros y algunos circuitos básicos de control.
Cuando una aplicación se hace más compleja, se podría añadir circuitos externos a
estos microcontroladores; sin embargo, la idea de utilizar estos dispositivos consiste
en reducir considerablemente el número de componentes, y por tanto, el espacio y el
consumo de energía en los circuitos de diferentes aplicaciones. Por ejemplo.
Suponiendo que se necesita diseñar un circuito que sea capaz de controlar un sistema
con varias señales analógicas a la vez; si utilizáramos un microcontrolador de la gama
básica, tendríamos que añadir al circuito: un convertidor analógico a digital, uno o
más multiplexers analógicos, posiblemente se deba agregar más memoria RAM, se
necesitaría utilizar una EEPROM externa para guardar constantes del sistema y
constantes de calibración, y así el circuito se haría bastante complejo, de tal forma,
que quizás sea más indicado utilizar un microprocesador que un microcontrolador.
Como se ha visto en la primera sección de esta guía, existen microcontroladores que
internamente tienen los elementos que nombramos anteriormente, y por lo tanto hay
la posibilidad de diseñar equipos con cierta complejidad utilizando un solo
microcontrolador. En esta sección se verán los microcontroladores de la gama media
a partir del PIC16F84.

224 INICIO
6.2- Familia de la serie PIC16F8X

A continuación, se presenta la familia PIC16F8X con sus características principales:

Producto Memoria. de programa EEPROM RAM Líneas Encapsulado Canales Comparadores PWM Temporizadores Puertos Veloc. ICSP BOR/ CCP/ Otras características
MCU FLASH Bytes Bytes E/S A/D C Analógicos 16bits y WDT seriales Máxima PBOR ECCP

225 INICIO
6.3- El PIC16F84A

Inicialmente se hará una descripción del PIC16F84A, ya que éste es uno de los más
sencillos de la familia de los microcontroladores de la serie PIC16F8X. En principio se
establecerán las diferencias con respecto al microcontrolador PIC16C54, luego se harán
unos ejemplos de aplicación con este microcontrolador.
El PIC16F84A es un microcontrolador Microchip de la gama media que presenta las
siguientes características básicas, las cuales se comparan con las del PIC16C54:

Microcontrolador PIC16F84A PIC16C54JW


Memoria de Programa 1Kx14 tipo Flash 0,5Kx12 tipo EPROM
Memoria de datos 68 bytes tipo RAM 25 bytes tipo RAM
64 bytes tipo
EEPROM
Manejo de interrupciones 4 0
Número de líneas de E/S 13 12
digitales
Número de temporizadores 2: TMR0 y WDT 2: TMR0 y WDT

226 INICIO
Diferencias entre los microcontroladores
de la gama básica y los de la media

Después de programar y utilizar un PIC de la gama básica, notarás que no hay mucha
diferencia en la programación con respecto a los PICs de la gama media. Algo
importante que debes saber, es que podrás utilizar sin ningún problema el MPLAB para
los PIC de la gama media, tal como se sugirió al ejecutar un programa editado para el
PIC16C54 en un PIC16F84. En otras palabras, si editas un programa para un PIC de la
gama básica, éste se ejecutará en un PIC de la gama media. Sin embargo, existen
algunas diferencias que debes tomar en cuenta al programar los PIC de la gama media.
En primer lugar la longitud de las palabras de instrucción en los PICs de la gama media
es de 14 bits, en comparación con los 12 bits de la gama básica. Esto significa que se
podrá obtener ciertas ventajas en la programación. Por otro lado, los registros TRIS y
OPTION, tendrán una dirección definida, y por lo tanto, las instrucciones asociadas a
ellas cambian. A pesar de que en un programa, estas instrucciones se pueden ensamblar
sin problemas, se recomienda sustituirlas por las instrucciones “MOVWF TRISX”, donde
X es el puerto que se desea configurar (A, B, etc.) y “MOVWF OPTION_REG”.
Una ventaja que aparece en el manejo de instrucciones en los microcontroladores de la
gama media, es que ahora se podrá acceder directamente a 128 registros de la memoria
RAM con una sola instrucción, sin necesidad de seleccionar bancos de memoria, a
diferencia de los PICs de la gama básica, en los cuales sólo se tenía acceso directo a 32
registros de la RAM.
Otra ventaja importante de los PICs de la gama media, es que ahora se cuenta con ocho
niveles de subrutinas, a diferencia de dos en los PICs de la gama básica.

227 INICIO
6.4 Nuevas instrucciones de los
PICs de la gama media
Es importante considerar que existen cuatro nuevas instrucciones en los PICs de la gama
media. Dos de ellas permiten hacer operaciones aritméticas con valores constantes, y
las otras dos se utilizan para retornos de subrutinas e interrupciones. Si eliminamos las
instrucciones TRIS y OPTION, significa que el conjunto de instrucciones de los
microcontroladores PIC de la gama media suman un total de 35.
Las nuevas instrucciones y el grupo al que pertenecen, se presentan a continuación:

INSTRUCCIONES ARITMÉTICAS
ADDLW K ; Suma W con K, donde K es constante y el resultado va a W.
SUBLW K ; Resta K menos W, donde K es un valor constante.

INSTRUCCIONES DE SALTO, se realizan en dos ciclos porque ejecutan un salto


hacia la dirección de retorno.
RETFIE ; Retorno y habilitación de interrupción, el PC toma el valor del TOS (Pila)
RETURN ; Retorno de subrutina, el PC toma el valor del TOS (Pila)

Cambios en las INSTRUCCIONES DE CONTROL


OPTION  MOVWF OPTION_REG ; Las posiciones de estos registros están en
TRIS f  MOVWF TRISF ; el banco 1 de la RAM (BSF STATUS,RP0)

228 INICIO
6.5- Organización de la Memoria
del PIC16F84A
Debido a que los microcontroladores de la gama media tienen una mayor cantidad de
funciones, éstas se configuran por medio de registros. Fíjate cómo en los
microcontroladores de la gama básica encontrábamos registros de funciones especiales
para: INDF, TMR0, PCL, STATUS, FSR, PORTA y PORTB; dependiendo del número
de terminales, también podía aparecer PORTC. Ahora hay que agregar los registros
OPTION, TRISA y TRISB (y otros PORT y otros TRIS según la cantidad de puertos).
Por otro lado existen otros registros de control, que para el PIC16F84A, se resumen
en la tabla de la página siguiente.
En primer lugar, se podrá observar la coincidencia con algunas direcciones de los
registros de los microcontroladores de la gama básica.
En segundo lugar, se puede ver que las posiciones de los registros TRISA y TRISB
están en las direcciones 85h y 86h respectivamente, por otro lado el registro OPTION
está en la dirección 81h. Mientras los primeros registros mencionados pertenecen al
banco 0 de la memoria RAM, estos últimos pertenecen al banco 1, es decir, hay que
considerar en las instrucciones, a cuál banco se está señalando, ya que en la palabra
de instrucción de los PIC de la gama media, sólo podemos acceder de manera directa a
128 posiciones de la RAM. Si estamos en el banco 0, podemos acceder desde la
posición 00h hasta la 7Fh, y si estamos en el banco 1, desde la posición 80h hasta la
0FFh. La selección del banco se hará por medio del bit RP0 del registro STATUS.
Finalmente veremos que hay un grupo de registros que son nuevos para nosotros, y que
serán explicados más adelante.
229 INICIO
Ubicación de los registros del
microcontrolador PIC16F84A

En la siguiente tabla, se presentan


las direcciones y los nombres
de los registros del
PIC16F84A.
Notas:
(1) Al igual que el PIC16C54, el
registro indirecto “INDF”, no
corresponde a una posición
fija en la RAM; al acceder a
ese registro, se lee o escribe
en el registro señalado en la
dirección señalada por el
registro FSR.
(2) Los espacios de la tabla en
color gris, corresponden a
direcciones no implementadas.

Banco 0 Banco 1

230 INICIO
Asignación de bits en cada registro

Valor después
Valor después
Dirección Nombre de otra
de encender
inicialización

231 INICIO
6.6- Registro STATUS

Como en el caso de los microcontroladores de la gama básica, este registro está


ubicado en la dirección 03h de la memoria de datos, y contiene los bits de estado
de la Unidad Lógica y Aritmética, el estado de la inicialización (RESET), y los bits
de selección de los bancos de registros de la memoria de datos.
Los bits de STATUS de los PIC de la gama básica y el PIC16F84A tienen las
mismas funciones, con la excepción de que los bits de selección de página en los
microcontroladores de la gama básica se cambian por los de selección de banco de
los registros de la memoria de datos. Observa las diferencias en el tema 3.

R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x


IRP RP1 RP0 TO PD Z DC C
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
R = bit de lectura W = bit de escritura -N = Valor después de la inicialización.

Bit 7: IRP: Se utiliza para acceso indirecto 0-> 00h a 0ffh. 1-> 100h a 1ffh
(nota: IRP y RP1 no se utilizan en los PIC16F84, por tanto se hacen iguales a 0).
Bit 6-5: RP1-RP0: Selección de banco de la memoria de datos
00 = Banco 0 = (00h - 7Fh)
01 = Banco 1 = (80h - 0FFh)
10 = Banco 2 = (100h - 17Fh) RP1 no se utiliza en los PIC16F84A
11 = Banco 3 = (180h - 1FFh)
232 INICIO
6.7- Manejo de las Interrupciones
en el PIC16F84A

Muchas veces cuando estás desarrollando una actividad, como por ejemplo una tarea
para entregarla al día siguiente, encuentras momentos en que necesitas interrumpir tus
labores, ya sea para comer, para descansar, para atender una llamada telefónica o para
alguna otra cosa. Algo similar ocurre con los programas que se ejecutan en los
microcontroladores. Un programa es una secuencia de instrucciones que ejecutan una
actividad en el microcontrolador. Si ese programa se encarga de leer un dato en
memoria, luego lo muestra en un indicador numérico, y después vuelve a comenzar, para
que cíclicamente ejecute esa actividad, entonces esa actividad podría ser “el programa
principal”. Supongamos que ese dato que se muestra corresponde a la temperatura de
una habitación. Si se quiere leer la señal que corresponde a la lectura de temperatura y
llevarla a la posición de memoria que el programa principal busca y lo lleva al indicador,
se necesitará interrumpir este programa principal por un momento, ejecutar una rutina
de lectura de la señal de temperatura y almacenamiento del dato de temperatura y luego
volver al programa principal en el punto donde fue interrumpido, sin que se pierda los
valores de los registros que utiliza el programa principal, especialmente el registro W, el
registro STATUS y cualquier otro registro que se modifique en la rutina de interrupción.

233 INICIO
100
AUTOR: César Álvarez
DISEÑO
80

60 INSTRUCCIONAL:
Interrupción:
Programa Principal: M. Sánchez y C. Álvarez
40 Lee la señal
Convierte a digital Lee posición de la memoria
20
Guarda en memoria Convierte a 7 segmentos
0
Escribe valor en el indicador

Entonces, se puede definir las interrupciones, como desviaciones del flujo de control del
programa originadas asíncronamente mediante diversas causas que pueden ser externas
al sistema, tales como el cambio de nivel de una entrada; o internas, tal como el
desbordamiento en la cuenta de un temporizador.
La manera de ejecutar una interrupción, es similar al llamado de una subrutina con la
instrucción CALL, ya que se almacena la dirección del PC de la siguiente instrucción a
ejecutar, en el registro PILA, con la diferencia de que en la interrupción, el programa
salta a una posición de la memoria de programa llamada “vector de interrupción”.

234 INICIO
Fuentes de interrupción
en el PIC16F84A

En el PIC16F84A, el vector de interrupción está ubicado en la dirección 4h de la


memoria de programa. Esto significa que en esa posición comienza la rutina de
interrupción, y por lo tanto, el programa principal no debería tener nada escrito allí.
Debemos considerar lo siguiente acerca de las interrupciones en el PIC16F84A:
• Una interrupción puede ocurrir debido a diversas causas. Para el PIC16F84A estas
causas pueden ser:
• Una activación en la entrada RB0/INT
• Un desbordamiento en la cuenta del temporizador 0 (TMR0).
• El cambio de estado de uno de los 4 terminales de mayor peso del puerto B.
• La finalización de la escritura en la EEPROM.
• Cuando se atiende una interrupción, el microcontrolador deshabilita automáticamente
cualquier otra interrupción que pueda ocurrir, al colocarse en 0 el bit GIE del registro
INTCON. Al salir de la rutina de interrupción, por medio de la instrucción RETFIE se
vuelve a habilitar automáticamente la atención de alguna otra interrupción.
• Las interrupciones se pueden habilitar o deshabilitar por software al escribir un 1 o un
0 en el bit GIE del registro INTCON.
• Cada interrupción se puede habilitar o deshabilitar individualmente según los bits de
control del registro INTCON.
235 INICIO
El registro INTCON
Control de interrupciones

La mayor parte de las indicaciones de las fuentes de interrupción y las habilitaciones de


interrupción, se encuentran en el registro INTCON. En el caso de las habilitaciones de
las interrupciones, un 1 indica habilitado y un 0 indica deshabilitado. Para el caso de las
indicaciones, un 1 señala que ocurrió el evento, es decir que podrá interrumpir si hay
habilitación y un 0 que no ha ocurrido nada.
• GIE. Habilitación global de interrupciones. Si GIE = 0 no se acepta ninguna de las
interrupciones. Si GIE = 1, se aceptan solamente las interrupciones habilitadas.
• EEIE. Habilitación de interrupción por finalización de la escritura en la EEPROM.
• T0IE. Habilitación de interrupción por desbordamiento de TMR0 (Temporizador 0).
• INTE. Habilitación de interrupción por la activación del terminal RB0/INT.
• RBIE. Habilitación de interrupción por cambio de estado en RB7, RB6, RB5 ó RB4.
• T0IF. Indicador de un desbordamiento en TMR0.
• INTF. Indicador de la activación en el terminal RB0/INT.
• RBIF. Indicador de un cambio de estado en RB7, RB6, RB5 ó RB4.
INTCON
GIE EEIE T0IE INTE RBIE T0IF INTF RBIF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

236 INICIO
Guardar W y STATUS en
la rutina de interrupción

En el momento de ejecutar una rutina de interrupción, es sumamente importante


guardar los registros W y STATUS, además de algún otro que pueda ser utilizado en
el programa principal y que la rutina de interrupción los modifique.
En los PICs de la gama media esta labor no es tan directa como en otros
microcontroladores, los cuales utilizan las instrucciones PUSH y POP. Aquí hay que
tomar en cuenta el banco seleccionado por la RAM en el programa principal, el cual al
interrumpir al microcontrolador, no sabemos cuál está seleccionado. En el caso del
PIC 16F84A, los registros de propósitos generales que se acceden en el banco 0,
corresponden a la misma dirección en el banco 1, de esta manera bastaría con salvar
los registros W y STATUS como se muestra a continuación:

Rut_interr movwf W2 ; se guarda el valor de w en W2.


swapf STATUS,w ; se utiliza esta instrucción, ya que movf afecta al bit Z de STATUS
movwf STATUS2 ; Se guarda el STATUS en STATUS2 con los nibbles intercambiados
• ; Se ejecuta la rutina de interrupción


swapf STATUS2,w ; se recupera el valor del STATUS con los nibbles en la posición original
movwf STATUS
swapf W2,f ; se toma el valor de W2 con los nibbles intercambiados
swapf W2,w ; se recupera el valor de w.
retfie ; Retorno de la interrupción

237 INICIO
Ejemplo de interrupción
por TMR0

include "P16F84A.INC" ; Incluye los símbolos del PIC16F84A


• ; Definición de símbolos, tales como: segundo, minuto, hora, día, etc.
org 0 ; Dirección inicial del programa en el microcontrolador
goto prepara ; En prepara se establece la selección de TMR0, interrupciones, puertos, etc.
org 4 ; Dirección donde comienza la rutina de interrupción
interrupt btfsc INTCON,T0IF ; Evalúa si la interrupción fue del TMR0
goto tmr0full ; si es 1 atiende rutina de TMR0
btfsc eecon1,eeif ; Evalúa si la interrupción fue de la EEPROM

tmr0full movwf W2 ; se guarda el valor de w en W2, para recuperarlo al retorno
swapf STATUS,w
movwf STATUS2 ; Se guarda el STATUS en STATUS2, para luego recuperarlo
movlw d'61‘
movwf TMR0 ; carga el valor 61 decimal para que se ejecuten 195 ciclos de tmr0
incf segundo,f ; Se incrementan los segundos
call ajuste ; En ajuste se cambia los incrementos a la bases numéricas adecuadas
swapf STATUS2,w ; se recupera el valor del STATUS
movwf STATUS
swapf W2,f
swapf W2,w ; se recupera el valor de w
bcf INTCON,T0IF ; se borra el bit de interrupción de TMR0
retfie ; Se regresa al programa principal. En la rutina ajuste, se pueden hacer
• ; todos los ajustes para llevar la cuenta del tiempo real
prepara movlw b'00000110‘ ; Selección del preescalador a TMR0 y división por 128
movwf TMR0 ; Se carga a TMR0 con un valor diferente de 0 ó 0FF para no interrumpir aún
bsf STATUS,RP0 ; Selecciona banco 1 para acceder a los registros OPTION y TRIS
movwf REG_OPTION ; Carga al registro OPTION la configuración
movlw b’11100000 ; Se habilita interrupción global, la de TMR0 y la EEPROM
movwf INTCONT ; Después de esta instrucción, continúa otras inicializaciones y el programa
movlw b’xxxxxxxx’ ; Palbra de configuración del puerto A
movwf TRISA ; Configura puerto A • • • • •

238 INICIO
6.8- La memoria EEPROM

En muchos equipos se hace necesario el uso de datos que deben mantener su valor
después de haber quitado la energía del circuito. Un ejemplo de esto lo podemos ver
en equipos que necesiten calibración. En estos equipos el ajuste de ciertos parámetros
se puede hacer por medio de resistencias ajustables o potenciómetros, los cuales
pueden utilizarse para la calibración del cero, la ganancia, la linealidad, los parámetros
de control y algunos otros más. Si se dispone de una memoria que mantenga los datos
después de apagarse el equipo, estos potenciómetros se hacen innecesarios, ya que
estos factores de ajuste se pueden grabar en esta memoria y ser llamados por medio
de un simple programa que aproveche éstas y otras constantes para poder introducirlas
en ecuaciones matemáticas que compensen las calibraciones. Esto supone una reducción
del espacio en el circuito; una mayor seguridad para la realización de los ajustes, ya
que se puede incluir una clave secreta que también puede ser grabada en la EEPROM
para la solicitud del ajuste; también se puede lograr ajustes con mucha mayor
precisión y en un tiempo mucho más corto.
El uso de una EEPROM tiene semejanzas con el de la RAM; sin embargo, hay que
tomar en cuenta algunas consideraciones que se mencionarán a continuación:
• El tiempo de escritura de una EEPROM está en el orden de los 10mSeg.
• El número de grabaciones en la EEPROM está limitado entre 105 y 107 veces.
• Se debe utilizar un código especial para la grabación de datos, para evitar el
borrado accidental de la EEPROM en el momento de quitarle la alimentación.

239 INICIO
Explicación de los registros
relacionados con la EEPROM

Para acceder a las direcciones de la EEPROM en el PIC16F84A, se deberá utilizar los


registros: EEADR, EEDATA, EECON1 y EECON2. Las direcciones son: 08h y 09h en el
banco 0 y, 88h y 89h en el banco 1 respectivamente.
• EEADR: Es el registro de 8 bits que tiene la dirección del dato de la EEPROM. El
PIC16F84, sólo puede acceder a 64 bytes de la EEPROM, por lo tanto estas direcciones
están comprendidas desde la dirección 0h hasta la 3Fh.
• EEDATA: Es el registro de 8 bits en el cual se escribe o se lee el valor del dato a
guardar en la EEPROM en la dirección que está en el registro EEADR.
• EECON1: Este registro contiene los bits de control de las operaciones en la EEPROM:
• RD, Bit 0 (Lectura). Se escribirá 1 cuando se va a realizar un ciclo de lectura
de la EEPROM, al terminar se colocará en cero. No admite la escritura de 0.
• WR, Bit 1 (Escritura). Se enviará 1 cuando se va a realizar un ciclo de escritura
de la EEPROM, al terminar se colocará en cero. No admite la escritura de 0.
• WREN, Bit 2 (Habilitación de escritura). Si se escribe 1, se permitirá la
escritura de la EEPROM. Si se coloca 0, no permitirá la escritura en la EEPROM.
• WRERR, Bit 3 (Indicador de error). Se lee un 1 si hubo error en la escritura
debido a una inicialización del PIC. Un 0 indicará que la operación se hizo
correctamente.
• EEIF, Bit 4 (Indicador de finalización de escritura). Un 1 indicará que se
completó el ciclo de escritura. Se deberá colocar en 0 por medio del programa.
• EECON2: En este registro se coloca una secuencia clave para evitar grabaciones
accidentales.
240 INICIO
Escribir un dato en la EEPROM

El registro EECON2 se utiliza para colocar el código de control en la escritura de datos


de la EEPROM y evitar una grabación accidental de la misma. Para ello, después de
habilitar la escritura de la EEPROM al poner en 1 el bit WREN de EECON1, se deberá
escribir en EECON2 el código 55h y luego el código AAh; finalmente, para grabar el dato
que está en el registro EEDATA en la dirección marcada por el registro EEADR que fija la
dirección de la EEPROM, se deberá escribir un 1 en el bit WR del registro ECON1. Un
programa propuesto que realiza la escritura de un byte en la EEPROM es el que se
presenta a continuación:
BCF STATUS, RP0 ; En el banco 0 están los registros EEADR y EEDATA
MOVLW DIRECCION ; DIRECCION indica la posición donde se guardará
MOVWF EEADR ; el dato en la EEPROM
MOVLW DATO ; DATO es el valor que irá a la EEPROM
MOVWF EEDATA ;
BSF STATUS, RP0 ; Selecciona banco 1 de la RAM
BCF INTCON, GIE ; Deshabilita interrupciones al escribir EEPROM
BCF EECON1, EEIF ; Se borra el bit indicador de finalización de escritura
. BSF EECON1, WREN ; Habilita escritura en la EEPROM
MOVLW 55h ;
MOVWF EECON2 ; Escribe código 55h en EECON2
MOVLW 0AAh ; (Códigos de protección para no grabar accidental-
MOVWF EECON2 ; mente un dato) Escribe código AAH en EECON2
BSF EECON1,WR ; Comienza la grabación del dato
BSF INTCON,GIE ; Habilitación global de interrupciones

241 INICIO
Lectura de un dato en la EEPROM

Durante la sección del programa que escribe en la EEPROM se recomienda deshabilitar las
interrupciones para que el proceso de escritura se realice correctamente. Después de
iniciarse el proceso de escritura de la EEPROM, se podrá habilitar las interrupciones por
medio de la instrucción “BSF INTCON, GIE”. En la escritura de la EEPROM el bit WR
de EECON1 se colocará en 0 automáticamente. Tú podrás determinar cuándo termina el
ciclo de escritura al leer un 1 en el bit EEIF del registro EECON1. Después de esto se
deberá colocar el bit WREN en 0 para prevenir un borrado accidental de la EEPROM.
Trata de volver a escribir el programa anterior como una rutina, de manera que la
dirección y el dato provengan de registros y no de valores constantes.
Para leer un dato en la EEPROM se podrá utilizar la sección de programa que se muestra
a continuación:
BCF STATUS, RP0 ; Selecciona banco 0 para EEADR
MOVLW DIR_LECT ; Dirección de lectura en W
MOVWF EEADR ; Dirección de lectura en EEADR
BSF STATUS, RP0 ; Selecciona banco 1 para EECON1
BSF EECON1, RD ; Lectura de la EEPROM
BCF STATUS, RP0 ; Selecciona banco 0 para EEDATA
MOVF EEDATA, W ; Coloca dato leído de EEPROM en W
Una buena práctica para escribir un dato en la EEPROM, consiste en verificar si ese dato
ha sido grabado correctamente mediante la lectura del dato escrito y comparación con él
mismo por medio de una resta y al evaluar el bit Z del registro STATUS.

242 INICIO
6.9 Registro contador de programa

Vimos que en los PIC16C5X los 8 bits de menos peso del contador de programa
ocupan la posición 2h de la memoria RAM, y los bits de mayor peso se dividen en
páginas y se encuentran en el registro STATUS. En el caso de los PICs de la
gama media los bits de mayor peso están en los 5 bits de menor peso del registro
PCLATCH que está ubicado en la posición 0Ah u 8Ah. Debido a que el PIC16F84A
sólo tiene acceso a 1024 direcciones de la memoria de programa (000h a 3FFh), se
necesitan 10 bits, de los cuales son efectivos los ocho del PCL y los dos bits
menos significativos del PCLATCH.
En las instrucciones GOTO y CALL se incluyen 11 bits para cargar la dirección del
PC, por tanto se puede tener acceso a 2048 posiciones. Como la capacidad del
PIC16F84A es 1024 bits no tiene sentido hacer divisiones por páginas.

12 11 10 9 8 7 0
PC PCL

11
PCLATCH 4-3
2 Palabra de Instrucción
7 4 0
PIC16F84
PCLATCH

243 INICIO
Para aquellas instrucciones donde el PCL es el destino, en los bits 7 a 0 del PC se
obtienen del código de la instrucción. Los bits superiores provienen del PCLATCH.
Algunas de las instrucciones donde el PCL es el destino, o se le modifica el
contenido, son: MOVWF PCL; ADDWF PCL; BSF PCL, 5; etc. Recuerda que la
dirección del PCL es la 2h

12 11 10 9 8 7 0
PC PCL

5 Resultado de la ALU
PCLATCH
4-0

7 0
PCLATCH

PIC16F84

El vector de inicialización del PIC16F84A está en la dirección 3FFh, esto significa


que la primera instrucción del programa se debe colocar en esa dirección.

244 INICIO
6.10 Registro STACK (pila)

El registro STACK guarda las direcciones de retorno de las rutinas que se llaman
por medio de la instrucción CALL o una interrupción, y carga la dirección de retorno
al PC con la instrucción RETLW, RETURN o RETFIE. la longitud de palabra de la
pila es la misma que la del PC. La pila tiene ocho niveles, a diferencia de los dos
niveles que tienen los microcontroladores de la gama básica:

Una instrucción CALL o una llamada de interrupción coloca el contenido del nivel 7
de la pila, en el nivel 8, el nivel 6 lo coloca en el 7 y así sucesivamente hasta
colocar el valor del contador del programa actual, incrementando en uno, en el nivel
1 de la pila. Si se llama a más de ocho subrutinas en una misma secuencia,
únicamente las direcciones de las ocho más recientes serán almacenadas.

Una instrucción RETLW, RETURN o RETFIE cargará el contenido del nivel 1 de la


pila al PC y el del nivel 2 al nivel 1 y así sucesivamente, hasta colocar el nivel 8 al
7. Si más de ocho instrucciones entre RETLW, RETURN o RETFIE se ejecutan, la
pila se llenará con la dirección almacenada previamente en el nivel 8.

245 INICIO
6.11 Los Temporizadores y
algo más de PORTB
El PIC16F84A, utiliza, al igual que los PIC de la gama básica el temporizador TMR0 y
el WDT, los cuales, a su vez se programan según el registro OPTION.
El registro OPTON del PIC16F84 agrega 2 bits que en los PIC de la gama básica no
están asignados. Éstos son: RBPO# (Bit 7) y INTEDEG (Bit 6). Si RBPO# = 0,
conecta resistencias de valor alto a Vdd (Pull up). En el caso de INTEDEG, éste
determina el tipo de transición que llevará la interrupción externa (RB0): 1=>
Transición de subida, 0=> Transición de bajada.
Los circuitos asociados a estos temporizadores son iguales a los de los PIC de la gama
básica, con la diferencia de que si se utiliza el TMR0 como temporizador, la entrada
RA4/TOCKI se convierte en una línea adicional del puerto A.
En el caso de los PIC16F84A la ubicación del registro OPTION, en la memoria de
datos, se encuentra en la posición 81H (banco 1).
Una posibilidad que ofrece los PIC de la gama media, es que cuando se detecta un
desbordamiento en el contador, se genera una señal de interrupción, la cual se puede
verificar en el bit TOI, el cual es el bit 2 del registro INTCON. Esta interrupción se
habilita al colocar un “1” al bit TOIE, que es el bit 5 del registro INTCON
Si deseas repasar el tema de los temporizadores de los PIC de la gama básica,
selecciona el menú siguiente:
OPTION TMR0 WDT INTCON

246 INICIO
6.12 Los Bits de Configuración

Al igual que los PICs de la gama básica, los bits de configuración del PIC16F84A se
acceden sólo en el momento de grabar el programa en el microcontrolador.
Los bits de configuración WDT, FOSC1 y FOSC0 del PIC 16F84 coinciden en lógica y
posición con los de los PICs de la gama básica (Repasar). En el caso del bit de
protección de programa, éste trabaja de la misma manera en ambos casos, pero la
lógica es invertida y la ubicación es diferente, es decir que en el PIC16F84A este bit
se ubica en la posición 4 de la palabra de configuración y un 1 indicará que el
dispositivo no estará protegido, y un 0 indicará que no será posible leer el contenido
del programa ni los datos de la EEPROM.
Finalmente el PIC16F84A tiene adicionalmente el bit PWRTE#, el cual, con un 0
activa un retardo en el reinicio por 72 ms. Este bit ocupa la posición 3 en la palabra
de configuración.

Palabra de Configuración en el PIC16F84A:

CP CP CP CP CP CP CP CP PWRTE WDTE FOSC1 FOSC0

Bit 11 10 9 8 7 6 5 4 3 2 1 Bit 0

247 INICIO
TEMA VII
MICROCONTROLADORES DE LA SERIE
PIC16F87X

 7.1 Generalidades
 7.2 La familia PIC16F87X
 7.3 Registros de funciones especiales
 7.4 Las interrupciones de los PIC16F87X
 7.5 Las Memorias EEPROM y FLASH
 7.6 El Puerto A, el Puerto E y el Convertidor A/D
 7.7 El Puerto B
 7.8 El Puerto C y los Temporizadores
 7.9 El Puerto C y los módulos de Captura, Comparación y PWM
 7.10 El Puerto C y el Módulo de Comunicación Serial Síncrona
 7.11 El Puerto C y la Comunicación I2C
 7.12 El Puerto C y el USART
 7.13 El Puerto D, el Puerto E y la Interfaz Paralela
 7.14 Palabra de Configuración
248
INICIO
Objetivos Terminales:

Establecer las diferencias de


hardware entre el
microcontrolador PIC16F84A y
los PIC16F87X
Describir las características de
los PIC16F87X
Explicar el uso de las
interrupciones en los
PIC16F87X
Describir cada uno de los
módulos de hardware de los
PIC16F87X
Diseñar circuitos con
microcontroladores PIC16F87X

249
INICIO
7.1 Generalidades de
los PIC16F87X

En el tema anterior hemos visto al PIC16F84A, con el cual nos iniciamos a los
microcontroladores PIC de la gama media. ¿Quedó todo bien claro? Es importante que lo
hayas comprendido todo bien hasta ahora, para continuar con los PIC16F87x. Estos
microcontroladores presentan una serie de características que permiten una mayor
versatilidad en un sinnúmero de aplicaciones. Estas características se pueden resumir en
las siguientes:
* Mayor capacidad de memoria RAM y EEPROM.
* Manejo de hasta 14 fuentes de interrupción.
* Líneas de entrada y salida adicionales.
* Dos temporizadores adicionales: TMR1 y TMR2.
* Módulos de captura, comparación y modulador de ancho de pulsos.
* Convertidor Analógico a Digital de 10 bits para varias entradas.
* Módulos de comunicación serial.
* Los modelos de 40 terminales tienen un módulo de comunicación paralela.

Todas estas características colocan a los PIC16F87X como la familia de


microcontroladores de la gama media de mayor cantidad de recursos, y que obviamente se
presentan como soluciones a una gran diversidad de desarrollos.

250 INICIO
7.2 La familia de los PIC16F87X

Anteriormente ya habíamos presentado a la familia de los PIC16F87X. Conviene


volverlos a mostrar, y esta vez observa mejor las características que presentan cada
uno de sus miembros y la comparación con el PIC16F84A:

Microcontrolador PIC16F84 PIC16F870 PIC16F871 PIC16F872 PIC16F873 PIC16F874 PIC16F876 PIC16F877

FLASH 1Kx14 2K x 14 2K x 14 2K x 14 4K x 14 4K x 14 8K x 14 8K x 14
(Programa)

RAM 64 bytes 128 bytes 128 bytes 128 bytes 192 bytes 192 bytes 368 bytes 368 bytes
(Datos)

EEPROM 64 bytes 64 bytes 64 bytes 64bytes 128 bytes 128 bytes 256 bytes 256 bytes
(Datos
permanentes)

Puertos A,B A, B, C A,B,C,D,E A, B, C A, B, C A,B,C,D,E A, B, C A,B,C,D,E

Entradas No 5 canales 8 canales 5 canales 5 canales 8 canales 5 canales 8 canales


Analógicas

Captura, No 1 1 1 2 2 2 2
Comparación y
Modulador de
ancho de pulso

Puerto serial No AUSART AUSART M2CSPI AUSART/ AUSART/ AUSART/ AUSART/


M2CSPI M2CSPI M2CSPI M2CSPI

Temporizadores 1-8bits, 1-16bits 1-16bits, 1-16bits, 1-16bits, 1-16bits, 1-16bits, 1-16bits


WDT 2-8bits, WDT 2-8bits,WDT 2-8bits, WDT 2 8bits, WDT 2-8bits, WDT 2-8bits, WDT 2-8bits, WDT

251 INICIO
Conexiones de los PIC16F870/72/73/76

252 INICIO
Conexiones de los PIC16F871/74/77

253 INICIO
7.3 Registros de
funciones especiales
Sabemos que las instrucciones de los microcontroladores PIC16F87X, son las mismas
que las del PIC16F84, ya que todos pertenecen a la gama media. Sin embargo, para la
programación se hace necesario conocer los nuevos registros de funciones especiales
que ofrecen los PIC16F87X con sus características mejoradas. Estos registros se
ubican en la memoria RAM del microcontrolador. Recordemos que para acceder a una
posición de la RAM, contamos con 7 bits en la palabra de instrucción, que corresponden
directamente a 128 posiciones. Para seleccionar un banco de la memoria RAM se
cuenta con los bits RP1 y RP0 que se ubican en el registro STATUS. En el caso del
PIC16F84 sólo se puede modificar el bit RP0, y por consiguiente, únicamente se puede
acceder a dos bancos de la RAM. En el caso de los PIC16F87X, podemos acceder a 4
bancos de la RAM.
Los registros de funciones especiales los podemos ubicar en las tablas de las páginas
siguientes, no hace falta que te lo aprendas todavía, después lo analizaremos con más
detalle. En ellas encontraremos a los siguientes microcontroladores:
PIC16F870 y PIC16F871
PIC16F872
PIC16F873 y PIC16F874
PIC16F876 y PIC16F877
Bits de los registros de Funciones especiales

254 INICIO
PIC16F870 y 871

En la siguiente tabla, se presentan


las direcciones y los nombres
de los registros de los
PIC16F870 y PIC16F871.
Notas:
(1) El registro indirecto “INDF”, no
corresponde a una posición fija
en la RAM; al acceder a ese
registro, se lee o escribe en el
registro señalado en la
dirección indicada por el
registro FSR.

(2) Los espacios de la tabla en color


gris, corresponden a direcciones
no implementadas.

(3) El PIC16F870 no tiene los puertos


D y E ni los registros TRIS
correspondientes.

Banco 0 Banco 1 Banco 2 Banco 3


255 INICIO
PIC16F872

En la siguiente tabla, se presentan


las direcciones y los nombres
de los registros del
PIC16F872.
Notas:
(1) El registro indirecto “INDF”, no
corresponde a una posición fija
en la RAM; al acceder a ese
registro, se lee o escribe en el
registro señalado en la
dirección indicada por el
registro FSR.

(2) Los espacios de la tabla en color


gris, corresponden a direcciones
no implementadas.

Banco 0 Banco 1 Banco 2 Banco 3


256 INICIO
PIC16F873 y 874

En la siguiente tabla, se presentan


las direcciones y los nombres
de los registros de los
PIC16F873 y PIC16F874.
Notas:
(1) El registro indirecto “INDF”, no
corresponde a una posición fija
en la RAM; al acceder a ese
registro, se lee o escribe en el
registro señalado en la
dirección indicada por el
registro FSR.

(2) Los espacios de la tabla en color


gris, corresponden a direcciones
no implementadas.

(3) El PIC16F873 no tiene los puertos


D y E ni los registros TRIS
correspondientes.

Banco 0 Banco 1 Banco 2 Banco 3


257 INICIO
PIC16F876 y 877

En la siguiente tabla, se presentan


las direcciones y los nombres
de los registros de los
PIC16F876 y PIC16F877.
Notas:
(1) El registro indirecto “INDF”, no
corresponde a una posición fija
en la RAM; al acceder a ese
registro, se lee o escribe en el
registro señalado en la
dirección indicada por el
registro FSR.

(2) Los espacios de la tabla en color


gris, corresponden a direcciones
no implementadas.

(3) El PIC16F876 no tiene los puertos


D y E ni los registros TRIS
correspondientes.

Banco 0 Banco 1 Banco 2 Banco 3

258 INICIO
Bits de los Registros de
Funciones Especiales (Banco 0)

259 INICIO
Bits de los Registros de
Funciones Especiales (Banco 1)

260 INICIO
Bits de los Registros de
Funciones Especiales (Bancos 2 y 3)

261 INICIO
Diferencias entre los registros de
funciones especiales de los PIC16F87X

Los PIC16F87X tienen más registros de funciones especiales que el PIC16F84. En la


siguiente tabla, podemos observar aquellos registros diferentes entre ellos, sus
respectivas ubicaciones y a qué función está asociada:
Funciones asociadas Registro PIC16F870 PIC16F871 PIC16F872 PIC16F873 PIC16F874 PIC16F876 PIC16F877

PORTD ----- 08h ----- ----- 08h ----- 08h

Puerto TRISD ----- 88h ----- ----- 88h ----- 88h

Paralelo PORTE ----- 09h ----- ----- 09h ----- 09h

TRISE ----- 89h ----- ----- 89h ----- 89h

SSPBUF ----- ----- 13h 13h 13h 13h 13h

Módulo de SSPCON ----- ----- 14h 14h 14h 14h 14h


Comunicación SSPCON2 ----- ----- 91h 91h 91h 91h 91h

Serial SSPADD ----- ----- 93h 93h 93h 93h 93h

Síncrona SSPSTAT ----- ----- 94h 94h 94h 94h 94h


RCSTA 18h 18h ----- 18h 18h 18h 18h
Puerto TXTA 98h 98h ----- 98h 98h 98h 98h
de Comunicación TXREG 19h 19h ----- 19h 19h 19h 19h
Serial Universal SPBRG 99h 99h ----- 99h 99h 99h 99h
USART RCREG 1Ah 1Ah ----- 1Ah 1Ah 1Ah 1Ah

Segundo módulo CCPR2L ----- ----- ----- 1Bh 1Bh 1Bh 1Bh

de Comparación, CCPR2H ----- ----- ----- 1Ch 1Ch 1Ch 1Ch

Captura y PWM CCP2CON ----- ----- ----- 1Dh 1Dh 1Dh 1Dh

262 INICIO
7.4 Las Interrupciones de
los PIC16F87X

Los microcontroladores PIC de la serie 16F87X de 28 terminales tienen 13 fuentes


de interrupción, y los de 40 terminales tienen 14 fuentes de interrupción. Esta
cantidad de fuentes de interrupción obedece a que estos microcontroladores cuentan
con más periféricos que el PIC16F84. Entre ellos podemos nombrar: El convertidor
analógico a digital, el módulo de comparación, captura y modulador de ancho de pulso
(PWM), el módulo de comunicación serial y el módulo de comunicación paralela.
Los registros asociados a las interrupciones son los siguientes:

Registro Función Direcciones


INTCON Habilitación y señalizado de interrupciones 0 0BH, 8BH, 10BH, 18BH
PIE1 Habilitación de Interrupciones 1 8CH
PIE2 Habilitación de Interrupciones 2 8DH
PIR1 Indicador de Interrupciones 1 0CH
PIR2 Indicador de Interrupciones 2 0DH

Básicamente estos registros contienen los bits que permiten o no las interrupciones
en el microcontrolador (registros INTCON, PIE1 y PIE2) y los bits que se
establecen cuando se genera una interrupción (registros INTCON, PIR1 y PIR2). El
registro INTCON es similar al del PIC16F84, con la diferencia de que se sustituye
la habilitación de la escritura de la EEPROM por la de habilitación de los dispositivos
que no están en INTCON. Esto se podrá ver mejor en la siguiente página.

263 INICIO
El registro INTCON
Control de interrupciones

El registro INTCON contiene algunas de las indicaciones de las fuentes de interrupción y


las habilitaciones de interrupción. En el caso de las habilitaciones de las interrupciones,
un 1 indica habilitado y un 0 indica deshabilitado. Para el caso de las indicaciones, un 1
señala que ocurrió el evento, es decir que podrá interrumpir si hay habilitación y un 0 que
no ha ocurrido nada. Los bits del registro INTCON son:
INTCON (Acceso a todos los bancos por medio de la dirección 0BH)
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

• GIE. Habilitación global de interrupciones. Si GIE = 0, no se acepta ninguna de las


interrupciones. Si GIE = 1, se aceptan solamente las interrupciones habilitadas.
• PEIE. Habilitación de interrupciones de dispositivos que no se controlan con INTCON.
• T0IE. Habilitación de interrupción por desbordamiento de TMR0 (Temporizador 0).
• INTE. Habilitación de interrupción por la activación del terminal RB0/INT.
• RBIE. Habilitación de interrupción por cambio de estado en RB7, RB6, RB5 ó RB4.
• T0IF. Indicador de un desbordamiento en TMR0.
• INTF. Indicador de la activación en el terminal RB0/INT.
• RBIF. Indicador de un cambio de estado en RB7, RB6, RB5 ó RB4.
264 INICIO
Registro PIE1

El registro PIE1 contiene 8 bits que se utilizan para la habilitación de ocho de las
interrupciones de los PIC16F87X.

PIE1 (8CH)
PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

BIT Función
PSPIE Habilitación de interrupción para escritura o lectura de la interfaz paralela
ADIE Habilitación de interrupción para indicar la finalización de una conversión A/D
RCIE Habilitación de interrupción que indica que se recibió un dato en del USART
TXIE Habilitación de interrupción que indica que se envió un dato desde el USART
SSPIE Habilitación de interrupción para el puerto serial síncrono
CCP1IE Habilitación de interrupción para CCP1 al producirse una captura o comparación
TMR2IE Habilitación de interrupción para un desbordamiento del TMR2
TMR1IE Habilitación de interrupción para un desbordamiento del TMR1

265 INICIO
Registro PIE2

El registro PIE2 contiene 3 bits que se utilizan para la habilitación de tres de las
interrupciones de los PIC16F87X.

PIE2 (8DH)
--- 0 --- EEIE BCLIE --- --- CCP2IE
bit7 bit6 (1) bit5 bit4 bit3 bit2 bit1 bit0

(1) Este bit es reservado y deberá mantenerse en “0”

BIT Función
EEIE Habilitación de interrupción para finalización de escritura en la EEPROM
BCLIE Habilitación de interrupción para indicar colisión de datos en el bus SSP
CCP2IE Habilitación de interrupción para CCP2 al producirse una captura o comparación

266 INICIO
Registro PIR1

El registro PIR1 contiene 8 bits que se utilizan para la indicación de ocho de las
interrupciones de los PIC16F87X.

PIR1 (0CH)
PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

BIT Función
PSPIF Aviso de interrupción por escritura o lectura de la interfaz paralela
ADIF Aviso de interrupción para indicar la finalización de una conversión A/D
RCIF Aviso de interrupción para indicar que indica que se recibió un dato en del USART
TXIF Aviso de interrupción para indicar que indica que se envió un dato desde el USART
SSPIF Aviso de interrupción por el puerto serial síncrono
CCP1IF Aviso de interrupción por CCP1 al producirse una captura o comparación
TMR2IF Aviso de interrupción por un desbordamiento del TMR2
TMR1IF Aviso de interrupción por un desbordamiento del TMR1

267 INICIO
Registro PIR2

El registro PIR2 contiene 3 bits que se utilizan para la indicación de tres de las
interrupciones de los PIC16F87X.

PIR2 (0DH)
--- 0 --- EEIF BCLIF --- --- CCP2IF
bit7 bit6 (1) bit5 bit4 bit3 bit2 bit1 bit0

(1) Este bit es reservado y deberá mantenerse en “0”

BIT Función
EEIF Aviso de interrupción por finalización de escritura en la EEPROM
BCLIF Aviso de interrupción para indicar colisión de datos en el bus SSP
CCP2IF Aviso de interrupción por CCP2 al producirse una captura o comparación

268 INICIO
Salvando los registros W y STATUS
al atender una interrupción

Hay que tener un especial cuidado cuando se manejan las interrupciones, sobretodo
para recuperar el contenido de los registros W y STATUS en el programa principal, ya
que de lo contrario se pierde el control del programa. En los microcontroladores de la
serie PIC16F87X, encontramos que existen cuatro bancos de la memoria RAM, y si el
programa principal está accediendo a uno de ellos, en una interrupción podríamos
cambiar el acceso a otro banco de la RAM. El reto está en recuperar los valores de
W y STATUS que tenía el programa principal antes de la interrupción.
Si observamos los bancos de memoria en los PIC16F870, 871, 872, 876 y 877; se
puede ver que los registros ubicados en la parte final de cada banco, se acceden por
medio de las direcciones 70h hasta la 7Fh. Por lo tanto lo que tenemos que hacer, es
que en una interrupción se salven W y STATUS en uno de esos registros:

Rut_interr ; Las direcciones de W2 y STATUS2 deben estar entre 70h y 7Fh


movwf W2 ; se guarda el valor de w en W2.
swapf STATUS,w ; se utiliza esta instrucción, ya que movf afecta al bit Z de STATUS
movwf STATUS2 ; Se guarda el STATUS en STATUS2 con los nibbles intercambiados
• ; Se ejecuta la rutina de interrupción
• ; Al final de la interrupción se escribe lo siguiente
swapf STATUS2,w ; se recupera el valor del STATUS con los nibbles en la posición
movwf STATUS ; original, ya que se había guardado con los nibbles intercambiados
swapf W2,f ; se toma el valor de W2 con los nibbles intercambiados
swapf W2,w ; se recupera el valor original de w.
retfie ; Retorno de la interrupción

269 INICIO
En el caso de los
PIC16F873 y PIC16F874

En los PIC16F873 y 874, no encontramos registros que se acceden en los cuatro


bancos, sino en el 0 y 2 ó en el 1 y 3. Es decir que con el control de RP0, podemos
guardar y recuperar W y STATUS. Guardar W y STATUS se hace más complejo que
en los otros PIC16F87X, y se sugiere hacerlo como se presenta a continuación:
Push btfss STATUS,RP0 ; Chequea si el programa principal señala al banco 0
goto rp0_en_0
bcf STATUS,RP0 ; Si no estaba, selecciona el banco 0 para guardar
movwf W2 ; w y STATUS
swapf STATUS,w
movwf STATUS2
bsf STATUS2,1 ; Nótese que se cambia el bit guardado que corresponde
goto rutint ; a RP0, que pasó de la posición 5 a 1 con el swapf
rp0_en_0 movwf W2 ; Si el programa principal señala el banco 0 no se
swap STATUS,w ; realizan modificaciones
movwf STATUS2
rutint • ; Rutina de interrupción

pop swapf STATUS2,w
movwf STATUS ; se recupera el status, pero como pudo haber cambiado
btfss STATUS,RP0 ; RP0, se chequea para recuperar correctamente a W2
goto recup_w ; en el banco 0
bcf STATUS,RP0
swap W2,f
swap W2,w
bsf STATUS,RP0 ; se coloca como estaba RP0 en el programa principal
retfie
recup_w swapf W2,f ; si RP0 era 0, no se hace cambios y se recupera w
swapf W2,w
retfie

270 INICIO
Actividades

Ya hemos visto cómo funcionan las interrupciones, y cómo hacer un programa para
salvar los registros W y STATUS cuando se atiende una interrupción. Debes
considerar siempre estos programas que se han mostrado anteriormente, por tanto te
recomendamos que los escribas, o los copies, y lo guardes en tus archivos personales
de tus programas.
Por los momentos, no te proponemos alguna otra actividad. Pensamos que
comprenderás mejor acerca del manejo de interrupciones, a medida que vayas
conociendo cada módulo de los PIC16F87X, los cuales verás, poco a poco en las
siguientes secciones.
Recuerda que es importante que sepas que básicamente en el manejo de las
interrupciones, cuentas con bits que te habilitan o no cada una de las interrupciones,
y que además puedes acceder a los bits que te avisan cuál fue la interrupción que se
generó mientras se ejecutaba el programa principal.

271 INICIO
7.5 Las Memorias
EEPROM y FLASH

En los PIC16F87X, se pueden escribir o leer datos, tanto en la EEPROM, como en la


memoria FLASH. Para escribir o leer la EEPROM, básicamente se ejecutan los mismos
pasos que con el PIC16F84, con la diferencia de que en los PIC16F87X hay que
colocar en 0 el bit EEPGD (bit 7) del registro EECON1 (dirección 18CH), para
seleccionar la EEPROM. Para leer o escribir la memoria FLASH necesitaremos que los
registros de dirección y de datos tengan mayor longitud, porque la FLASH es de 14
bits de contenido, y entre 11 y 13 bits de dirección. Por lo tanto se agregarán los
registros EEADRH, para los bits más significativos de la dirección, y EEDATAH, para
los bits más significativos del contenido a grabar en la FLASH.
La escritura en la FLASH puede protegerse por áreas o totalmente, por medio de los
bits de configuración. Estos bits se acceden en el momento de grabar el programa, al
utilizar un programador de microcontroladores.

272 INICIO
Registros asociados para la lectura y
escritura de la EEPROM y la FLASH

En la siguiente tabla se presentan los registros asociados para la lectura y escritura


de las memorias EEPROM y la FLASH.

Dirección Registro Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en POR Otros
y BOR Resets

0BH (todos INTCON GIE PEIE T0IE INTE RBIE T0IF INTF RBIF 0000 000x 0000 000u
los bancos)

10DH EEADR Registro Dirección EEPROM y la FLASH xxxx xxxx uuuu uuuu
10FH EEADRH ---- ---- ---- Dirección Alta de la FLASH xxxx xxxx uuuu uuuu
10CH EEDATA Registro de Dato de la EEPROM y la FLASH xxxx xxxx uuuu uuuu

10EH EEDATAH ---- ---- Dato Alto de la FLASH xxxx xxxx uuuu uuuu

18CH EECON1 EEPGD ---- ---- ---- WRERR WREN WR RD x--- x000 x--- u000

18DH EECON2 Registro de control de la EEPROM y la FLASH

8DH PIE2 ---- 0 ---- EEIE BCLIE ---- ---- CCP2IE -r-0 0--0 -r-0 0--0

0DH PIR2 ---- 0 ---- EEIF BCLIF ---- ---- CCP2IF -r-0 0--0 -r-0 0--0

273 INICIO
Explicación de los registros
relacionados con la EEPROM

Para acceder a las direcciones de la EEPROM en los PIC16F87X, se deberá utilizar los
registros: EEADR, EEDATA, EECON1 y EECON2. Las direcciones son: 10Ch y 10Dh en
el banco 2, y 18Ch y 18Dh en el banco 3 respectivamente.
• EEADR: Es el registro de 8 bits que tiene la dirección del dato de la EEPROM.
• EEDATA: Es el registro de 8 bits en el cual se escribe o se lee el valor del dato a
guardar en la EEPROM en la dirección que está en el registro EEADR.
• EECON1: Este registro contiene los bits de control de las operaciones en la EEPROM:
• RD, Bit 0 (Lectura). Se escribirá 1 cuando se va a realizar un ciclo de lectura
de la EEPROM, al terminar se colocará en cero. No admite la escritura de 0.
• WR, Bit 1 (Escritura). Se enviará 1 cuando se va a realizar un ciclo de escritura
de la EEPROM, al terminar se colocará en cero. No admite la escritura de 0.
• WREN, Bit 2 (Habilitación de escritura). Si se escribe 1, se permitirá la
escritura de la EEPROM. Si se coloca 0, no permitirá la escritura en la EEPROM.
• WRERR, Bit 3 (Indicador de error). Se lee un 1 si hubo error en la escritura
debido a una inicialización del PIC. Un 0 indicará que la operación se hizo
correctamente.
• EEPGD, Bit 7 (Acceso a EEPROM o FLASH). Un 1 indicará que la operación se
relaciona con la FLASH, un 0 indicará que la operación se relaciona con la
EEPROM.
• EECON2: En este registro se coloca una secuencia clave para evitar grabaciones
accidentales.

274 INICIO
Escribir un dato en la EEPROM

El registro EECON2 se utiliza para colocar el código de control en la escritura de datos


de la EEPROM y evitar una grabación accidental de la misma. Para ello, después de
habilitar la escritura de la EEPROM al poner en 1 el bit WREN de EECON1, se deberá
escribir en EECON2 el código 55h y luego el código 0AAh; finalmente, para grabar el
dato que está en el registro EEDATA en la dirección marcada por el registro EEADR
que fija la dirección de la EEPROM, se deberá escribir un 1 en el bit WR del registro
ECON1. Un programa propuesto que realiza la escritura de un byte en la EEPROM es
el que se presenta a continuación:
BCF STATUS, RP0 ; En el banco 2 están los registros EEADR y EEDATA
BSF STATUS, RP1 ;
MOVF DIRECCION,W ; En DIRECCION está la posición donde se guardará
MOVWF EEADR ; el dato en la EEPROM
MOVF DATO,W ; En DATO está el valor que irá a la EEPROM
MOVWF EEDATA ;
BSF STATUS, RP0 ; Selecciona banco 3 de la RAM
BCF INTCON, GIE ; Deshabilita interrupciones al escribir EEPROM
BCF EECON1, EEPGD ; Selecciona acceso a la EEPROM
BCF EECON1, EEIF ; Se borra el bit indicador de finalización de escritura
. BSF EECON1, WREN ; Habilita escritura en la EEPROM
MOVLW 55h ;
MOVWF EECON2 ; Escribe código 55h en EECON2
MOVLW 0AAh ; (Códigos de protección para no grabar accidental-
MOVWF EECON2 ; mente un dato) Escribe código AAH en EECON2
BSF EECON1,WR ; Comienza la grabación del dato
BSF INTCON,GIE ; Habilitación global de interrupciones

275 INICIO
Lectura de un dato en la EEPROM

Durante la sección del programa que escribe en la EEPROM se recomienda deshabilitar las
interrupciones para que el proceso de escritura se realice correctamente. Después de
iniciarse el proceso de escritura de la EEPROM, se podrá habilitar las interrupciones por
medio de la instrucción “BSF INTCON, GIE”. En la escritura de la EEPROM el bit WR
de EECON1 se colocará en 0 automáticamente. Tú podrás determinar cuándo termina el
ciclo de escritura al leer un 1 en el bit EEIF del registro EECON1. Después de esto se
deberá colocar el bit WREN en 0 para prevenir un borrado accidental de la EEPROM.
Para leer un dato en la EEPROM se podrá utilizar la sección de programa que se muestra
a continuación:

BCF STATUS, RP0 ; Selecciona banco 2 para EEADR


BSF STATUS, RP1 :
MOVLW DIR_LECT ; Dirección de lectura en W
MOVWF EEADR ; Dirección de lectura en EEADR
BSF STATUS, RP0 ; Selecciona banco 3 para EECON1
BCF EECON1, EEPGD ; Selecciona acceso a la EEPROM
BSF EECON1, RD ; Lectura de la EEPROM
BCF STATUS, RP0 ; Selecciona banco 2 para EEDATA
MOVF EEDATA, W ; Coloca dato leído de EEPROM en W
Una buena práctica para escribir un dato en la EEPROM, consiste en verificar si ese dato
ha sido grabado correctamente mediante la lectura del dato escrito y comparación con él
mismo por medio de una resta y al evaluar el bit Z del registro STATUS.

276 INICIO
Escribir un dato en la FLASH

Para escribir un dato en la FLASH, la dirección de acceso no debe estar protegida. Por
otro lado, después del proceso de escritura, el microcontrolador no lee las siguientes dos
instrucciones, y éste se inhibe durante la operación de escritura. A continuación se
presenta una sección de programa para escribir un dato en la FLASH.

BCF STATUS, RP0 ; En el banco 2 están los registros EEADR, EEADRH,


BSF STATUS, RP1 ; EEDATA y EEDATAH
MOVF DIRECCIONH,W ; En DIRECCIONH está la posición más significativa donde
MOVWF EEADRH ; se guardará el dato en la FLASH
MOVF DIRECCIONL,W ; En DIRECCIONL está la posición menos significativa donde
MOVWF EEADR ; se guardará el dato en la FLASH
MOVF DATOH,W ; En DATOH está el valor más significativo del dato
MOVWF EEDATAH ;
MOVF DATOL,W ; En DATOL está el valor menos significativo del dato
MOVWF EEDATA
BSF STATUS, RP0 ; Selecciona banco 3 de la RAM
BCF INTCON, GIE ; Deshabilita interrupciones al escribir en la FLASH
BSF EECON1, EEPGD ; Selecciona acceso a la FLASH
BCF EECON1, EEIF ; Se borra el bit indicador de finalización de escritura
. BSF EECON1, WREN ; Habilita escritura en la EEPROM
MOVLW 55h ;
MOVWF EECON2 ; Escribe código 55h en EECON2
MOVLW 0AAh ; (Códigos de protección para no grabar accidental-
MOVWF EECON2 ; mente un dato) Escribe código AAH en EECON2
BSF EECON1,WR ; Comienza la grabación del dato
NOP ; El microcontrolador ignora estas dos instrucciones y continúa
NOP ; después de terminar el proceso de grabación
BSF INTCON,GIE ; Habilitación global de interrupciones
BCF EECON1, WREN ; Se deshabilita la escritura para prevenir un borrado accidental

277 INICIO
Lectura de un dato en la FLASH

Una sección de programa para leer un dato de la FLASH, es la que se muestra a


continuación:

BCF STATUS, RP0 ; Selecciona banco 2 para EEADR


BSF STATUS, RP1 :
MOVLW DIR_LECTH ; Dirección más significativa de lectura en W
MOVWF EEADRH ; DIR_LECTH en EEADRH
MOVLW DIR_LECTL ; Dirección menos significativa de lectura en W
MOVWF EEADR ; DIR_LECTL en EEADR
BSF STATUS, RP0 ; Selecciona banco 3 para EECON1
BSF EECON1, EEPGD ; Selecciona acceso a la FLASH
BSF EECON1, RD ; Lectura de la FLASH
NOP ; Después de esta instrucción, la memoria de programa
NOP ; es leída en los siguientes dos ciclos
BCF STATUS, RP0 ; Selecciona banco 2 para EEDATA
MOVF EEDATA, W ; Coloca dato bajo leído de la FLASH en W
MOVWF DATOL ; Parte menos significativa del dato en DATOL
MOVF EEDATAH,W ; Coloca dato alto leído de la FLASH en W
MOVWF DATOH ; Parte más significativa del dato en DATOH

Al igual que en el caso de la EEPROM, se considera buena práctica leer los datos, depués
de que estos sean grabados.

278 INICIO
Protección de la FLASH

La memoria FLASH puede ser protegida totalmente o por secciones, tanto para la lectura
como para la escritura. Para ello, antes del proceso de grabación o lectura, hay que
acceder a los bits CP1, CP0 y WRT de la palabra de configuración del microcontrolador.
Si el bit WRT vale “1” se podrá escribir en la memoria FLASH del microcontrolador, si
vale “0” no se podrá escribir. A continuación se presenta cómo se protege la escritura
de la FLASH según los valores de CP1 y CP0 y el modelo del microcontrolador.

Modelo PIC CP1 CP0 Dirección inicial de Dirección final de


protección protección
PIC16F870/871/872 0 0 TODO PROTEGIDO

PIC16F873/874 0 0 0000H 0FFFH


PIC16F873/874 0 1 0800H 0FFFH
PIC16F873/874 1 0 0F00H 0FFFH
PIC16F876/877 0 0 0000H 1FFFH
PIC16F876/877 0 1 1000H 1FFFH
PIC16F876/877 1 0 1F00H 1FFFH
Todos los modelos 1 1 NO PROTEGIDO

279 INICIO
Actividades

Hemos visto cómo puedes guardar y leer datos de la EEPROM, por supuesto que las líneas
de programa mostradas anteriormente necesitan ser completadas para que pueda trabajar
bien en un programa.
La primera actividad propuesta para esta sección, es que puedas introducir un dato de 8
bits, a través del puerto B, lo guardes en la EEPROM. Después apagues el dispositivo, y
puedas leer el dato que habías guardado en ese puerto. Para ello deberás colocar un
interruptor de control en una línea del puerto C, de manera que en un momento dado el
puerto B trabaje como entrada, lea el dato y lo guarde en una posición de la EEPROM, y
en la otra posición de esa línea del puerto C, el puerto B trabaje como salida y aparezca
el dato desde la posición donde guardaste el dato anteriormente.
La segunda actividad propuesta es hacer un contador de dos dígitos 7 segmentos, que
tenga un pulsador para la cuenta ascendente, otro para la cuenta descendente y uno más
para almacenar el valor de la cuenta en la EEPROM, de manera que al encender el
dispositivo, el valor que aparezca en pantalla, sea el que se almacenó en la EEPROM, y
desde allí se seguirá el conteo.

280 INICIO
7.6 El Puerto A, el Puerto E
y el Convertidor A/D
En vista de que los microcontroladores de la serie PIC16F87X tienen muy diversas
aplicaciones, los terminales de los puertos pueden poseer varias funciones de manera
multiplexada. Por otro lado, los dispositivos de 28 terminales tienen 22 líneas de
entrada-salida (PORTA, PORTB y PORC) y los microcontroladores de 40 terminales
tienen 33 líneas E/S (PORTA, PORTB, PORTC, PORTD y PORTE). Recuerda que cada
terminal de un puerto, si está configurado como E/S digital, se puede programar como
entrada o salida, al colocar el bit asociado del registro TRIS en 1 ó 0
respectivamente.
El puerto A (PORTA) dispone de 6 terminales. La función que puede realizar cada
terminal se resume en la siguiente tabla:

RA5/AN4/SS# RA4/TOCKI RA3/AN3/Vref RA2/AN2 RA1/AN1 RA0/AN0


E/S DIGITAL E/S DIGITAL E/S DIGITAL E/S DIGITAL E/S DIGITAL E/S DIGITAL

ENTRADA ENTRADA ENTRADA ENTRADA ENTRADA


ANALÓGICA 4 ANALÓGICA 3 ANALÓGICA 2 ANALÓGICA 1 ANALÓGICA 0

MODO ESCLAVO EN ENTRADA DE VOLTAJE DE


COMUNICACIÓN RELOJ DEL REFERENCIA A/D C
SERIAL SÍNCRONA TMRO

Cada terminal se puede configurar como entrada o salida de manera individual


mediante el registro TRISA, ubicado en la dirección 85h de la RAM, tal como se hace
con el PIC16F84A. Para configurar una función relacionada con el convertidor
analógico a digital, se deberá acceder a los registros ADCON0 y ADCON1 (direcciones
1FH y 9FH respectivamente).

281 INICIO
Registros asociados
a PORTA

La siguiente tabla muestra los registros asociados al puerto A y la ubicación de los


mismos en la memoria RAM.

Dirección Registro Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Otros
POR y BOR Resets

05h PORTA --- --- RA5 RA4 RA3 RA2 RA1 RA0 --0x 0000 --0u 0000

85h TRISA --- --- Registro de Configuración de PORTA --11 1111 --11 1111

1Fh ADCON0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/ --- ADON 0000 00-0 0000 00-0
DONE#

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

Las líneas PCFG0 – PCFG3 del registro ADCON1 configuran las líneas del puerto A y
el puerto E para que trabajen como entradas analógicas o digitales (los PIC16F870,
872, 873 y 876 no tienen puerto E). Debemos observar que los bits de estos
registros son puestos a 0 después de un RESET, un POR (inicialización por encendido)
o un BOR (inicialización por baja de Vdd). Esto significa, como se verá más
adelante, que la configuración inicial de las líneas de los puertos A y E estarán como
entradas analógicas. Si se desea que todas ellas trabajen en forma digital, deberá
escribirse el valor “011x” en los cuatro bits menos significativos del registro
ADCON1.

282 INICIO
El Puerto E y las entradas
analógicas AN5, AN6 y AN7

Los microcontroladores PIC16F871, 874 y 877 tienen tres entradas analógicas


adicionales, las cuales se encuentran en el puerto E (PORTE, dirección 09H).

RE2/CS#/AN7 RE1/WR#/AN6 RE0/RD#/AN5


E/S DIGITAL E/S DIGITAL
c E/S DIGITAL
Entrada Analógica 7 Entrada Analógica 6 Entrada Analógica 5
Selección de Chip en el Escritura en cel modo PSP Lectura en el modo PSP
modo PSP (CS) (WR) (RD)

En la tabla se indica que cada línea del puerto E, puede trabajar como
Entrada/Salida Digital, como entrada analógica o como control del puerto paralelo.
En esta sección, sólo veremos las dos primeras funciones, y cuando se estudie el
puerto paralelo, se verá la tercera función.
En la dirección 89H se encuentra TRISE, que es el que configura las líneas
digitales del puerto E y la interfaz paralela (Bits 4 a 7). La configuración como
entrada analógica o E/S digital, se hace por medio del registro ADCON1.

Dirección Registro Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Otros
POR y BOR Resets

89h TRISE IBF OBF IBOV PSP --- Registro de 0000 -111 0000 -111
MODE Configuración de PORTE

283 INICIO
El Convertidor Analógico a Digital

Los microcontroladores PIC16F87X poseen un convertidor analógico digital de 10 bits de


resolución y cinco canales de entrada en los modelos de 28 terminales (puerto A) y ocho
canales en los que tienen 40 terminales (puertos A y E).
Este convertidor puede aceptar sólo señales positivas comprendidas entre Vref+ y Vref-.
La resolución que tiene cada bit que procede de la conversión es función de la tensión de
referencia según la siguiente ecuación:

Resolución = (Vref+ - Vref-)/1024bits

En el caso de que la tensión de referencia positiva (Vref+) sea igual a 5 voltios y la


negativa sea 0V, la resolución será de 4,8mV/bit. La tensión de referencia determina
los límites máximo y mínimo de la tensión analógica que puede leer el microcontrolador, y
puede seleccionarse externamente por medio de RA3 (Vref+) y RA2 (Vref-) o emplearse la
fuente de alimentación del microcontrolador (Vdd y Vss).
El convertidor analógico digital es el único dispositivo que puede seleccionarse para que
esté activo en el modo de reposo, para ello, los pulsos del convertidor deberán
conectarse al oscilador RC interno.
Los cinco primeros canales de entradas analógicas del PIC16F87X están en el puerto A.
Por lo tanto se deben configurar dichas líneas para expresar aquéllas que se utilizarán
como entradas analógicas.
El convertidor analógico a digital utiliza la técnica de aproximaciones sucesivas y requiere
una tensión mayor a 2V y menor a Vdd – Vss como voltaje de referencia.

284 INICIO
Descripción del
funcionamiento del AD/C

Para que funcione el convertidor analógico a digital (AD/C), se necesita configurarlo


inicialmente. Esto significa que hay que definir las líneas que se utilizarán como
entradas analógicas, cuáles van a ser las tensiones de referencia a emplear, la
velocidad de conversión del AD/C, cuál oscilador se va a emplear, cómo se escribirá el
valor digital en los registros ADRESH y ADRESL, y la habilitación o no de la
interrupción por convertidor. Después de esto, en el programa se seleccionará cada
canal a convertir seguido de la orden de conversión.
En principio, el AD/C utiliza la técnica de aproximaciones sucesivas y está controlado
por un oscilador. Estos pulsos pueden ser una señal proveniente del oscilador de
cristal, dividida entre 2, 8 ó 32, o el oscilador RC interno del microcontrolador. Si se
selecciona esta última opción, se podrán hacer conversiones durante el modo de reposo.
Es importante tomar en cuenta que el tiempo del AD/C para cada bit, no debe ser
menor de 1,6μSeg, para que las conversiones se hagan correctamente. En el caso de
utilizar el oscilador RC, este tiempo es de aproximadamente 4μSeg.
La señal a convertir se selecciona por medio del multiplexer analógico, luego va al
circuito de muestreo y retención y después al convertidor A/D. El tiempo total de
lectura está dado por el tiempo de adquisición mas el tiempo que emplea el convertidor.
Un dato importante es conocer el tiempo de lectura de cada señal, para el empleo de
circuitos de control. En la siguiente página se muestra el cálculo del tiempo de lectura
y la frecuencia de muestreo para la señal correspondiente a un canal.

285 INICIO
Tiempo de lectura del
convertidor A/D

El tiempo de lectura para la señal de cada canal, está dado por el tiempo de
adquisición mas el tiempo de conversión del convertidor A/D.
El tiempo de adquisición está dado por la siguiente ecuación:

tadq = tamp + tcc + tcT


Donde: tamp es el tiempo de establecimiento del amplificador, 2μSeg.
tcc es el tiempo de carga del condensador del circuito de
muestreo y retención (sample & hold), 16,5μSeg.
tcT es el tiempo debido al coeficiente de temperatura:
tcT = (T-25°C)0,05μSeg
El tiempo de conversión está dado por 12tAD, donde tAD es el tiempo de conversión de
cada bit.
El tiempo de lectura mínimo a 25°C está dado para tAD = 1,6μSeg:

tlect = 2μSeg + 16,5μSeg + 0 + 12x1,6μSeg = 37,7μSeg


La máxima velocidad de muestreo se dará para 40μSeg, dando un margen de 2μSeg
para la espera del convertidor y la realización de instrucciones de lectura y
ordenamiento, es decir que estará en el orden de las 25K muestras por segundo.

286 INICIO
Configuración del Convertidor A/D

En resumen, los pasos necesarios para configurar el convertidor A/D son:


• Determinar las líneas que se utilizarán como entradas analógicas.
• Seleccionar las tensiones de referencia.
• Seleccionar el oscilador del convertidor.
• Seleccionar el modo de escritura en los registros ADRESH-L del convertidor
A/D.
• Activar la interrupción para el convertidor A/D.

287 INICIO
Selección de las entradas analógicas
y las de referencia

Para seleccionar las líneas que se utilizarán como entradas analógicas y las tensiones de
referencia, se selecciona el código apropiado de PCFG3-0 en el registro ADCON1, para
ello se busca en la siguiente tabla la opción más conveniente:

Notas:
1: Estos canales no son disponibles en los PIC16F870, 872, 873 y 876.
2: Esta columna indica el número de canales analógicos y el número de entradas de referencia.

288 INICIO
El oscilador del convertidor A/D

Para seleccionar el oscilador, se debe acceder a los bits ADCS1 y ADCS0 del registro
ADCON0. En la siguiente tabla podrás escoger la opción adecuada:

ADCS1 - ADCS0 Frecuencia


00 fosc/2
01 fosc/8
10 fosc/32
11 Osilador RC interno

Debe tomarse en cuenta que el tiempo de conversión de cada bit debe ser mayor o
igual a 1,6μSeg. La frecuencia máxima del cristal según los valores de ADCS1-ADCS0
se muestra a continuación:

Nota 1: El tiempo típico de conversión, al utilizar el oscilador interno, es


aproximadamente 4μSeg, aunque éste puede estar comprendido entre 2 y 6μSeg.

289 INICIO
Selección de la escritura en los
registros ADRESH y ADRESL

En los registros ADRESH y ADRESL se escribe el resultado de la conversión analógica


a digital. Por medio del bit ACFM (bit7) que está en el registro ADCON1 (dirección
9FH). Un “1” en el bit ACFM alínea la lectura hacia la derecha, y un “0” lo alínea
hacia la izquierda.

290 INICIO
Configuración de los registros de
interrupciones para el convertidor A/D

El tiempo de conversión puede variar según la frecuencia del oscilador del convertidor
A/D y la temperatura. Al estar lista la conversión analógica de un dato digital, se
activan las líneas ADON a “0” del registro ADCON0 y se coloca en “1” la línea ADIF
del registro PIR1. Si las interrupciones están habilitadas por medio de un “1” en el
bit GIE del registro INTCON y la interrupción del convertidor A/D está habilitada por
medio de un “1” en la línea ADIE del registro PIE1, al finalizar la conversión del dato
analógico a digital, provocará una interrupción en el microcontrolador y se cargará el
vector de interrupción al contador de programa (dirección 4H). Para atender la rutina
de interrupción debida al convertidor A/D, bastará con leer el bit ADIF del registro
PIR1.

PIE1 (8CH)
c
PSPIE ADIE RCIE TXIE SSPIE c CCP1IE TMR2IE TMR1IE
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

PIR1 (0CH)
c
PSPIF ADIF RCIF TXIF SSPIF c CCP1IF TMR2IF TMR1IF
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

291 INICIO
Manejo del Convertidor A/D

En la siguiente figura se
muestra un esquema de las
conexiones internas del
convertidor analógico a digital.
Podemos observar que las
entradas analógicas van a un
multiplexer analógico, y la
selección del canal a convertir
se realiza por medio de los bits
CHS2, CHS1 y CHS0 del
registro ADCON0.
Por otro lado, vemos que es
posible sacrificar las entradas
AN3 y AN2, para colocar las
tensiones de referencia
externas, y con ello mejorar la
exactitud en las lecturas del
convertidor A/D. Nota 1: No disponible en los PIC16F870, 872,
873 y 876

292 INICIO
Ejemplo de un programa que
configura al convertidor A/D

De acuerdo a lo que hemos visto hasta ahora, presentamos a continuación un programa


que configura al convertidor A/D, a partir de los siguientes criterios:
N° canales de entrada = 4, tensión de referencia = 2,5V (referida a tierra), Fosc =
20MHz, tiempo de lectura = 40μSeg, lectura alineada a la derecha.

CONFIGAD
BCF RP1 ; Selecciona el banco 1 de la RAM
BSF RP0
MOVLW 3F ; Configuración de las líneas del puerto A como entradas
MOVWF TRISA
MOVLW B’10000011 ; Configura: RA0, RA1, RA2 y RA4 como entradas analógicas; RA3 será
MOVWF ADCON1 ; la entrada de Vref y los 10 bits de lectura del A/D se alínean a la derecha
BSF PIE1,ADIE ; Habilita la interrupción para el AD/C
BCF RP1 ; Selecciona el banco 0 de la RAM
MOVLW B’10000001 ;
MOVWF ADCON0 ; Se configura el oscilador de 20MHz para dividir por 32 y enciende el ADC

El convertidor A/D queda configurado. Para hacer lecturas de cada canal, se deberá
seleccionar los canales por medio de los bits CHS2, CHS1 y CHS0 del registro ADCON0,
y colocar en “1” el bit Go/Done del mismo registro ADCON0.

293 INICIO
Actividades

Para una mejor comprensión del manejo del convertidor analógico a digital, te
proponemos las siguientes actividades:
Hacer un programa y montar un circuito con un microcontrolador PIC, que lea el canal 0,
y coloque el valor binario en los 8 bits del puerto B, y en 2 bits del puerto C.
Hacer un programa y montar un circuito que haga las veces de voltímetro digital, en
donde se muestre la lectura de un canal a seleccionar y se haga la conversión a BCD, y
luego a 7 segmentos, para presentarlo en un indicador de tres dígitos y medio (0,000 a
1,998), para ello la tensión de referencia deberá ser de 2V.

294 INICIO
7.7 El Puerto B

El puerto B dispone de 8 líneas bidireccionales que se utilizan para entradas o salidas


digitales. Cada línea se puede programar como salida o entrada al colocar en “0” o
en “1” respectivamente el bit asociado en el registro TRISB. Dos de las líneas de
este puerto se utilizan en el momento de grabar la memoria de programa del
microcontrolador. Estas dos entras son: RB6/PGC (Program Clock) y RB7/PGD
(Program Data) para más detalles, ver el anexo 7. El terminal RB0 se puede emplear
como entrada de interrupción externa. Por otro lado, es posible hacer la conexión de
cada terminal RBn a una resistencia interna asociada a Vdd (Pull-up), al colocar un 0
en el bit RBPU# del registro OPTION REG. Por otro lado, si seleccionas a RB0 como
entrada de interrupción, podrás escoger el tipo de transición a la cual se activará
ésta. Un “0” en el bit INTEDEG del registro OPTION_REG, hará que la interrupción
en el microcontrolador sea por medio de una transición de bajada y un “1”, por una
transición de subida. En la siguiente tabla se resume los registros asociados a PORTB.

Dirección Registro Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Otros
POR y BOR Resets

06h,106h PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu

86h,186h TRISB Registro de Configuración de PORTB 1111 1111 1111 1111

81h,181h OPTION_REG RBPU INTEDEG TOCS TOSE PSA PS2 PS1 PS0 1111 1111 1111 1111
#

0Bh, 8Bh, INTCON GIE PEIE TOIE INTE RBIE TOIF INTF RBIF 0000 000x 0000 000x
10Bh,18Bh

295 INICIO
7.8 El Puerto C y los
Temporizadores

El puerto C dispone de 8 líneas bidireccionales, que están multiplexadas con otras


funciones relacionadas con los temporizadores TMR1 y TMR2, la transmisión-recepción
serial, la captura, la comparación y la modulación de ancho de pulsos.
Los PIC16F87x tienen tres temporizadores TMR0, TMR1 y TMR2. El funcionamiento de
TMR0 es básicamente igual al de los PIC16C54 y PIC16F84A. TMR1 es un temporizador
con 16 bits de capacidad y TMR2 contiene 8 bits con pre y post escalamiento.
En la siguiente tabla se muestra las funciones de los terminales del puerto C.

RC7/RX/DT RC6/TX/CK RC5/SDO RC4/SDI/ RC3/SCK/ RC2/CCP1 RC1/T10SC1/ RC0/T1OSC0/


SDA SCL CCP2 T1CKI
E/S E/S E/S E/S E/S E/S E/S E/S
DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL
RECEPCIÓN TRANSMIS. SALIDA ENTRADA RELOJ SPI ENTRADA ENTR. TMR1 ENTRADA TMR1
USART USART DATOS DATOS CAPTURA 1 ENTR. CAPT2
SPI SPI
DATOS RELOJ ENTRADA RELOJ I2C SAL COMP1 SAL COMP2 SALIDA TMR1
TRANS TRANS DATOS SAL PWM1 SAL PWM2
SINCRONA SINCRONA I2C

Debemos tomar en cuenta que los PIC16F870/871/872 sólo tienen un módulo de


comparación, captura y PWM. Por otro lado, los PIC16F870/871 no poseen el módulo
SPI y el PIC16F872 no tiene el módulo de comunicación USART. Por lo tanto es
conveniente tomar en consideración esto al programar el puerto C.

296 INICIO
El Temporizador TMR1

TMR1 es un temporizador con preescalamiento de conteo ascendente, con una capacidad


de 16 bits. Esto significa que se necesitan dos registros para cargar un valor entre
0000H y 0FFFFH: TMR1H (dirección 0FH) y TMR1L (dirección 0EH). Al igual que con
TMR0 en el PIC16F84A, al haber un desbordamiento en la cuenta, puede generar una
interrupción por medio del bit TMR1IF del registro PIR1. La habilitación de esta
interrupción se hace por medio del bit TMR1IE del registro PIE1.
Los pulsos de conteo de TMR1 pueden provenir del oscilador del microcontrolador (fosc/4)
o externamente a través de los terminales RC0 o RC1. El registro de control de TMR1
es el T1CON y se ubica en la posición 10H. El diagrama de bloques de TMR1 es el que
se muestra en la siguiente figura:

297 INICIO
Registro de control del TMR1:
T1CON

En la figura anterior hemos visto cómo se controla el TMR1 por medio de los bits del
registro T1CON. A continuación se describe el funcionamiento de cada uno de estos
bits.

T1CON (10CH)
---- ---- T1CKPS1 T1CKPS0 T1OSCEN TISYNC# TMR1CS TMR1ON
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

BIT Función
TMR1ON Un “1” en este bit enciende el TMR1
TMR1CS Selección de pulsos del TMR1: “0” fosc/4; “1”  Entrada externa (RC0, RC1)
TISYNC# Sincronización con externa con oscilador interno: “0”  Sincronizado;
“1”  No sincronizado
T1OSCEN Habilitación de circuito oscilador. Si T1OSCEN es “1”, Al colocar un cristal de valor
inferior a 200KHz entre RC0 (T1OSC0) y RC1 (T1OSC1) generará la base de tiempo
del TMR1. Si TOSCEN vale “0” TMR1 funcionará como contador de eventos de RC0
T1CKPS0 Bits del preescalador. Relación de frecuencia según T1CKPS1 - T1CKPS0:
T1CKPS1 0-0  1:1; 0-1  1:2; 1-0  1:4; 1-1  1:8

298 INICIO
Algo más sobre TMR1

El TMR1 es colocado automáticamente en 0 cuando en la cuenta hay un desbordamiento


al pasar de 0FFFFh. Otra forma de hacer 0 a TMR1 automáticamente, es por medio de
los módulos CCPs (Comparación, captura y modulación de ancho de pulso). Para ello,
alguno de los módulos CCP1, CCP2 o ambos se deben configurar como comparadores.
Se debe tener cuidado al leer o escribir en TMR1 mientras éste se está incrementando,
ya que podría suceder que haya un desbordamiento de uno de los 8 bits, y el valor
cambie para uno de los registros. Para evitar esto, se recomienda que, durante una
operación de lectura o escritura, se detenga a TMR1. En el caso de que éste no se
pueda detener, ya que lleva la cuenta del tiempo real del programa, se recomienda hacer
la lectura de la siguiente forma:
LEETMR1 MOVF TMR1H, W ; Lee el byte de mayor peso de TMR1 a W
MOVWF TEMPH ; El valor va a un registro temporal TEMPH
MOVF TMR1L, W ; Lee el byte de menor peso de TMR1
MOVF TEMPL ; El valor va a TEMPL
MOVF TMR1H, W ; S vuelve a leer el byte de mayor peso
SUBWF TEMPH, W ; Se restan ambas lecturas
BTFSC STATUS, Z ; Si el resultado es cero, no hubo cambio en TMR1H mientras se leía
GOTO CONTINUA ; Por lo tanto, el programa continúa
GOTO LEETMR1; ; Sino, se vuelve a leer TMR1
CONTINUA ; Continúa con el programa principal
Al escribir un valor en TMR1, se deberá también tener cuidado de que no haya un
incremento en TMR1H mientras se ejecuta la operación. Para evitar esto se podría
iniciar la escritura borrando inicialmente a TMR1L.

299 INICIO
Actividades

Hemos visto la operación del temporizador 1, y que éste tiene una resolución de 16 bits.
Por otro lado, vimos una sección de programa que permite hacer la lectura del TMR1 sin
necesidad de detenerlo. Te proponemos que hagas un circuito y programa de un reloj
digital, que tenga como base de tiempo a la frecuencia del oscilador del PIC y el
temporizador TMR1.

300 INICIO
El Temporizador TMR2

El temporizador TMR2 es un contador ascendente de 8 bits, que se puede leer y


escribir, y también puede realizar funciones con el módulo de comunicación serial SSP y
los módulos de captura y comparación. TMR2 se ubica en la posición 11H de la memoria
RAM, utiliza la señal fosc/4, la cual pasa por un pre-escalador, y luego su salida pasa
por un post-escalador. El registro de control de TMR2 es T2CON. A continuación se
muestra el diagrama de bloques de TMR2.

El encendido del TMR2 se hace al colocar un “1” en el bit TMR2ON del registro T2CON.
La salida de TMR2 puede seleccionarse por software, para que en el puerto de
comunicación serial trabaje como generador de baudios. El bit TMR2IF del registro
PIR1 se coloca en 1 al haber un desbordamiento del post-escalador de TMR2 y puede
ser utilizado como interrupción al habilitarla por medio del bit TMR2IE del registro
PIE1.
El registro PR2 (dirección 92H) se utiliza para fijar un valor de conteo máximo del TMR2
cuando se trabaja en modulación de ancho de pulsos (PWM).

301 INICIO
Registro de control del TMR2:
T2CON

A continuación se describe el funcionamiento de cada uno de los bits del registro


T2CON.

T2CON (12CH)
---- - TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2SCKPS1 T2SCKPS0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

Los bits T2SCKPS1 y T2CKPS0 Los bits TOUTPS3 hasta TOUTPS0


sirven para seleccionar la frecuencia sirven para seleccionar la frecuencia del
del pre-escalador según la siguiente post-escalador según la siguiente tabla:
tabla: funcionamiento de cada uno de los bits.

T2SCKPS1 - T2CKPS0 Relación del predivisor TOUTPS3 - TOUTPS0 Relación del postdivisor

00 1:1 0000 1:1

01 1:4 0001 1:2

1x 1:16 0010 1:3


..... 1:Bn + 1
El bit TMR2ON se utiliza para 1110 1:15
encender con un “1” al TMR2. Un 1111 1:16
“0 deshabilitará al TMR2.

302 INICIO
7.9 El Puerto C y los Módulos de
Captura, Comparación y PWM

Los PIC16F870-872 disponen de un módulo CCP1, mientras que los otros PIC de las serie
16F87x tienen dos módulos CCP: CCP1 y CCP2, los cuales son prácticamente iguales.
Las funciones que realizan los módulos CCP son las que se muestran a continuación:
• Modo Captura. Dos registros de un módulo CCP capturan el valor de TMR1 cuando
ocurre un evento especial en el terminal RC2/CCP1 o en el terminal RC1/CCP2.
• Modo Comparación. Se compara el valor de TMR1 con el de los dos registros de un
CCP, y cuando coinciden ocurre un evento en el terminal RC2/CCP1 o en RC1/CCP2.
• Modo Modulación de Ancho de Pulsos (PWM). Se mantiene un nivel alto en la salida
RC2/CCP1 o en RC1/CCP2, según se determina en el módulo CCP correspondiente.
CCP1 utiliza los registros CCPR1H y CCPR1L (posiciones 15H y 16H), y para la
configuración se utiliza el registro CCP1CON (17H). Para CCP2 están CCPR2H, CCPR2L y
CCP2CON. En la siguiente tabla se muestran los terminales involucrados del puerto C:
RC7/RX/DT RC6/TX/CK RC5/SDO RC4/SDI/SDA RC3/SCK/SCL RC2/CCP1 RC1/T10SC1/ RC0/T1OSC0/
CCP2 T1CKI
E/S DIGITAL E/S E/S E/S E/S DIGITAL E/S E/S E/S
c
DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL
RECEPCIÓN TRANSMIS. SALIDA
c ENTRADA RELOJ SPI ENTRADA ENTR. TMR1 ENTRADA
c TMR1
USART USART DATOS DATOS SPI CAPTURA 1 ENTR. CAPT2
SPI
DATOS RELOJ ENTRADA RELOJ I2C SAL COMP1 SAL COMP2 SALIDA TMR1
TRANS TRANS DATOS I2C SAL PWM1 SAL PWM2
SINCRONA SINCRONA

303 INICIO
El Registro CCP1CON

En el registro CCP1CON se utilizan 4 bits para configurar la función del módulo CCP1,
los cuales son CCP1M3-CCP1M0. Por otro lado, los bits CCP1X y CCP1Y sólo se utilizan
en el modo PWM y representan los bits menos significativos del valor de un ciclo de
trabajo. Los 8 bits más significativos del ciclo de trabajo, se encuentran en el registro
CCPR1L. A continuación se presenta la disposición de los bits de CCP1CON y en la tabla
se describe el modo de trabajo de CCP1, según los valores de CCP1M3 – CCP1M0.
CCP1CON (17H)
---- ---- CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

CCP1M3-CCP1M0 Función
0000 Módulo CCP1 desconectado
0100 Modo captura con cada flanco descendente en RC2/CCP1
0101 Modo captura con cada flanco ascendente en RC2/CCP1

0110 Modo captura con cada 4 flancos ascendentes en RC2/CCP1


0111 Modo captura con cada 16 flancos ascendentes en RC2/CCP1
1000 Modo comparación que activa el terminal RC2/CCP1 al coincidir valores
1001 Modo comparación que desactiva el terminal RC2/CCP1 al coincidir valores
1010 Modo comparación que genera una interrupción (no afecta al terminal RC2/CCP1)
1011 Modo comparación que pone a 0 TMR1 y provoca interrupciones periódicas
11xx Modo PWM

304 INICIO
El Registro CCP2CON

Al igual que CCP1CON, en el registro CCP2CON se utilizan 4 bits para configurar la


función del módulo CCP2, los cuales son CCP2M3-CCP2M0; los bits CCP2X y CCP2Y sólo
se utilizan en el modo PWM y representan los bits menos significativos del valor de un
ciclo de trabajo. Los 8 bits más significativos de ese ciclo de trabajo se encuentran en
el registro CCPR2L. A continuación se presenta la disposición de los bits de CCP2CON y
el modo de trabajo de CCP2 según los valores de CCP2M3 – CCP2M0.
CCP2CON (1DH)
---- ---- CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0

CCP1M3-CCP1M0 Función
0000 Módulo CCP2 desconectado
0100 Modo captura con cada flanco descendente en RC1/CCP2
0101 Modo captura con cada flanco ascendente en RC1/CCP2
0110 Modo captura con cada 4 flancos ascendentes en RC1/CCP2
0111 Modo captura con cada 16 flancos ascendentes en RC1/CCP2
1000 Modo comparación que activa el terminal RC1/CCP2 al coincidir valores
1001 Modo comparación que desactiva el terminal RC1/CCP2 al coincidir valores
1010 Modo comparación que genera una interrupción (no afecta al terminal RC1/CCP2)
1011 Modo comparación que pone a 0 TMR1 y provoca interrupciones periódicas
11xx Modo PWM

305 INICIO
Modo Captura

En este modo, si ocurre un evento en los terminales RC2/CCP1 o RC1/CCP2, el valor


del temporizador se carga a los registros CCPR1H-L o CCPR2H-L respectivamente.
Esto podría utilizarse para la medición de intervalos de tiempo entre pulsos o para la
medición de la duración de un pulso. Sin estos módulos, las mediciones de intervalos
de tiempo habrían que hacerla con un temporizador al detectar una interrupción
externa, el problema está en que la lectura no será precisa debido a que el
temporizador sigue contando mientras se ejecuta la rutina de interrupción que va a
leer su contenido.
En el modo de captura es importante que el TMR1 esté configurado como
temporizador o como contador sincrónico para que la transferencia se haga
correctamente.
Como se vio en las tablas de los registros CCP1CON y CCP2CON, los eventos pueden
darse como: una detección de una transición de subida, una detección de una
transición de bajada, una detección de 4 pulsos de transición ascendente o una
detección de 16 pulsos de transición ascendente. La selección se hace por medio de
los bits CCP1M3-0 ó CCP2M3-0, según el módulo que se vaya a utilizar.
La resolución en la medición del tiempo de captura y el período máximo están dados
por el ancho de los pulsos que activan al TMR1. Por ejemplo si selecciona a fOSC/4
como entrada del TMR1, el escalamiento es 1:1, y la frecuencia fOSC es igual a
20MHz, entonces la resolución de la medición del intervalo será igual a 200nSeg. El
período máximo en el cual se podrá hacer la captura, será igual a 13,107mSeg. ¿Por
qué?

306 INICIO
Esquema del Modo Captura

En el momento de ocurrir una captura, se activa el indicador CCP1IF del registro PIR1 o
el bit CCP2IF del registro PIR2, según el evento que se registra. La interrupción se
realizará si están activos el bit GIE del registro INTCON y el bit CCP1IE o CCP2IE de
los registros PIE1 o PIE2. Esta interrupción puede ser utilizada para leer el contenido
de CCPR1H-L o CCPR2H-L, ya que si ocurre un nuevo evento, entonces se carga el valor
de TMR1 después de que este nuevo evento ocurra.
En la siguiente figura se puede observar el diagrama de bloques de cómo funcionan los
PIC16F87X en el modo de captura para el módulo CCP1.

307 INICIO
Inicialización en el modo Captura

A continuación se presenta la sección de un programa para la inicialización del módulo


CCP1, para que éste trabaje en el modo Captura.

CLRF CCP1CON ; El módulo CCP es apagado


CLRF TMR1L ; Borra byte de menor peso del temporizador 1
CLRF TMR1H ; Borra byte de mayor peso del temporizador 1
CLRF INTCON ; Deshabilita interrupciones y borra TOIF
BSF STATUS, RP0 ; Selecciona Banco 1
BSF TRISC, CCP1 ; Configura CCP como terminal de entrada
CLRF PIE1 ; Deshabilita interrupciones
BCF STATUS, RP0 ; Selecciona Banco 0
CLRF PIR1 ; Borra avisos de interrupciones
MOVLW 0x06 ; Configura modo de captura, cada 4 transiciones ascendente
MOVWF CCP1CON ;
BSF T1CON, TMR1ON ; Arranca el temporizador 1
; Al estar la interrupción de CCP1 deshabilitada se evalúa
; el bit CCP1IF continuamente
CAPTURA
BTFSS PIR1, CCP1IF
GOTO CAPTURA
; Ocurre la captura
BCF PIR1, CCP1IF ; Este bit debe borrarse antes de la próxima comparación

308 INICIO
Modo Comparación

En este modo se compara continuamente los valores de los registros CCPR1H-L o


CCPR2H-L con el de TMR1H-L. En el caso de haber coincidencia, ocurre un evento
según se haya programado en los registros CCP1CON y CCP2CON. Estos eventos
pueden ser: Colocar un “1” en el terminal RC2/CCP1 o RC1/CCP2; colocar un “0” en
uno de esos terminales; activar una interrupción por medio de los bits CCP1IF de
PIR1 o CCP2IF de PIR2, sin afectar a los terminales mencionados; o poner en 0 al
TMR1. En este último caso, si la comparación ocurre con CCPR1H-L, puede activar
una interrupción mediante el bit CCP1IF, y si la comparación ocurre con CCPR2H-L,
entonces activa una conversión del módulo convertidor analógico a digital.
Al trabajar el módulo CCP en el modo comparación, el módulo TMR1 deberá trabajar
en modo temporizador o como contador sincrónico para que se haga la comparación
correctamente.
Al haber en TMR1H-L un valor igual al de CCPR1H-L o CCPR2H-L, se coloca en “1” el
bit CCP1IF del registro PIR1 o el indicador CCP2IF del registro PIR2, según la
igualdad que se registre. La interrupción se realizará si están activos el bit GIE del
registro INTCON y el bit CCP1IE o CCP2IE de los registros PIE1 o PIE2. Esta
interrupción puede ser utilizada para disparar con precisión algún tiristor que controle
la velocidad de un motor de corriente alterna. Al igual que en el modo de captura, la
precisión del disparo y el tiempo en que éste ocurre, está dada por la frecuencia del
oscilador que envía los pulsos a TMR1.

309 INICIO
Modo Comparación

En la siguiente figura se muestra el esquema de funcionamiento en el modo Comparación


para el módulo CCP1.

310 INICIO
Inicialización en el
modo Comparación

La siguiente sección de programa presenta la configuración del módulo CCP1 para


trabajar en el modo Comparación.

CLRF CCP1CON ; El módulo CCP es apagado


CLRF TMR1L ; Borra byte de menor peso del temporizador 1
CLRF TMR1H ; Borra byte de mayor peso del temporizador 1
CLRF INTCON ; Deshabilita interrupciones y borra TOIF
BSF STATUS, RP0 ; Selecciona Banco 1
BSF TRISC, CCP1 ; Configura CCP como terminal de entrada
CLRF PIE1 ; Deshabilita interrupciones
BCF STATUS, RP0 ; Selecciona Banco 0
CLRF PIR1 ; Borra avisos de interrupciones
MOVLW 0x08 ; Configura modo comparación, establece terminal
MOVWF CCP1CON ; para la comparación
BSF T1CON, TMR1ON ; Arranca el temporizador 1
; Al estar la interrupción de CCP1 deshabilitada se evalúa
; el bit CCP1IF continuamente
COMPARA
BTFSS PIR1, CCP1IF
GOTO COMPARA
; Ocurre la comparación
BCF PIR1, CCP1IF ; Este bit debe borrarse antes de la próxima comparación

311 INICIO
Modo Modulación de Ancho
de Pulsos (PWM)

En este modo se obtienen pulsos lógicos cuyo ancho en el nivel “1” tiene una duración
programable con respecto a un período fijo. La relación entre el tiempo que dura el
nivel “1” y el período total, se denomina ciclo de trabajo. Los PWMs tienen aplicaciones
en convertidores digitales a analógicos (D/A), control de velocidad de motores DC,
disparos de Transistores de potencia en el manejo de motores AC y disparos de relés en
el control de temperatura, entre otras. El promedio del valor DC de salida en un PWM
es igual al ciclo de trabajo multiplicado por el valor de la tensión de la fuente de
alimentación.
La siguiente explicación del funcionamiento del módulo PWM de CCP1 aplica también al
módulo CCP2 para los PIC16F873-77. El valor alto que se ha de mantener en el
terminal RC2/CCP1 está determinado por un tiempo de 10 bits de resolución, donde los 8
bits más significativos del valor que dura el “1” se escribe en el registro CCPR1L y los
otros dos bits se escriben en CCP1X-Y del registro CCP1CON. Los 8 bits más
significativos del período total, están determinados por el valor que está en el registro
PR2. Para ello el TMR2 (8 bits más significativos) y los dos bits de un contador que
está conectado entre el preescalador y TMR2, al comenzar a contar, colocan a R2/CCP1
en 1. Cuando el valor del temporizador coincide con el valor que CCPR1L transfirió a
CCPR1H, la salida RC2/CCP1 se hace 0, y éste se mantiene hasta que los bits más
significativos del temporizador coincidan con el valor de PR2. Cuando esto ocurre, se
reinicia TMR2, se vuelve a establecer en “1” RC2/CCP1, exceptuando si el ciclo de
trabajo es 0. El valor de CCPR1L se carga a CCPR1H, de esta manera es posible
escribir en cualquier momento el valor en CCPR1L, ya que la comparación con ese valor se
efectuará después de reiniciarse TMR2.

312 INICIO
Duración del ciclo en el PWM

En el modo PWM, el bit RC2/CCP1 deberá programarse como salida mediante el registro
TRISC. El valor del período que entra al contador menos significativo que está antes de
TMR2 es igual a Tosc multiplicado por la relación del preescalador. De esta manera, el
período del ciclo es:

TCICLO = (PR2 + 1) X 4 X TOSC X preescalador de TMR2

Para el módulo CCP1, el ancho del pulso estará dado por la siguiente ecuación:

T1 = (CCPR1L,CCP1X,CCP1Y) X Tosc X preescalador de TMR2

La resolución del PWM será mejor cuando mayor es el valor de PR2. Para obtener una
precisión de 10bits, PR2 deberá valer 255, ya que de esta manera el valor a escribir en
CCPR1L, y los bits CCP1X y CCP1Y corresponden a 10 bits.
La misma explicación dada hasta ahora se aplica para el CCP2 para los
microcontroladores que tienen dos módulos CCP.

313 INICIO
Diagramas de bloques del PWM

A continuación se presenta el diagrama de bloques del modulador de ancho de pulsos


para el módulo CCP1.

314 INICIO
Configuración del PWM

La siguiente sección de programa presenta la configuración del PWM.

CLRF CCP1CON ; El módulo CCP es apagado


CLRF TMR2 ; Borra contenido del temporizador 2
MOVLW 0x7F ;
MOVWF PR2 ;
MOVLW 0x1F ;
MOVWF CCPR1L ; Configura ciclo de trabajo al 25% del período de PWM
CLRF INTCON ; Deshabilita interrupciones y borra TOIF
BSF STATUS, RP0 ; Selecciona Banco 1
BSF TRiSC, PWM1 ; terminal RC2/PWM1 como terminal de salida
CLRF PIE1 ; Deshabilita interrupciones
BCF STATUS, RP0 ; Selecciona Banco 0
CLRF PIR1 ; Borra avisos de interrupciones
MOVLW 0x2C ; Configura modo PWM, 2 bits de bajo peso del ciclo
MOVWF CCP1CON ; de trabajo = 10
BSF T2CON, TMR2ON ; Arranca el temporizador 2
; Al estar la interrupción de CCP1 deshabilitada se evalúa
; el bit CCP1IF continuamente
PER_PWM
BTFSS PIR1, TMR2IF
GOTO PER_PWM
; Se actualiza este período del PWM y sigue siguiente ciclo
BCF PIR1, TMR2IF ; Este bit debe borrarse antes de la próxima comparación

315 INICIO
Actividades

Las actividades a realizar en esta sección corresponderán a las funciones del módulo de
captura, comparación y modulación de anchos de pulso.
Con respecto al modo captura, te proponemos que hagas un programa y un circuito capaz
de medir el tiempo que tarda en hacer una revolución un motor. Para ello deberás
colocar una marca al eje del motor y un sistema de emisión y recepción infrarroja o
magnética, de manera que cada vez que se detecte esa marca, se medirá el tiempo
transcurrido entre una y otra aparición de la lectura. Por medio de este método,
podrás calcular las revoluciones por minuto del motor.
Para la parte de comparación, te proponemos mejorar la precisión del reloj digital
propuesto en la actividad con el temporizador 1. En este caso, la propuesta es cargar
automáticamente un valor al temporizador, por medio de los registros CCPR1H y CCPR1L,
de manera que el TMR1 se inicialice automáticamente. Esto te permitirá contar con un
contador de tiempo fiel, al cual no tendrás que cargar un valor cada vez que se ponga en
“0”. Para ello podríamos fijar que la inicialización del temporizador se efectúe cada 10
mSeg, y utilices este valor como base para el contador de tiempo.
En cuanto a la modulación de ancho de pulsos, te proponemos hacer un convertidor digital
a analógico que tenga una precisión de 10 bits. Para ello colocarás una resistencia y un
condensador como filtro pasa bajo a la salida del modulador de ancho de pulsos, de
manera que promedie la señal de salida. El valor DC a la salida del circuito RC será
igual a la relación entre el tiempo en que dura el “1” a la salida del PWM y el período
total. Deberás en este caso calcular los valores de R y C para que el rizado sea
mínimo.

316 INICIO
7.10 El Puerto C y el Módulo de
Comunicación Serial Síncrona
La comunicación serial es una manera muy utilizada para la transferencia de datos entre
equipos digitales, esto se debe a la cantidad reducida de líneas que utiliza. Los
PIC16F87X, con excepción de los PIC16F870 y PIC16F871, tienen un módulo MSSP
(Master Synchronous Serial Port) el cual proporciona una interfaz entre el
microcontrolador y otros dispositivos electrónicos tales como: otros microcontroladores,
memorias seriales, pantallas de cristal líquido, convertidores A/D, etc. Para ello
disponen de los terminales: RC3/SDO (Datos de salida), RC4/SDI (Datos de entrada) y
RC5/SCK (señal de sincronización o reloj).
El módulo serial, entre otras cosas, puede trabajar en uno de los siguientes modos de
comunicación: SPI (Serial Peripheral Interface) e I2C (Inter Integrated Circuit), los
cuales son muy utilizados actualmente.
En la figura anexa se presenta el diagrama de
bloques del módulo MSSP. El funcionamiento de
este módulo está basado en el registro de
desplazamiento SSPSR, el cual transmite y recibe
los datos en serie, por medio de las líneas SDO y
SDI respectivamente. La sincronización de SSPSR
se ejecuta mediante la señal SCK. La carga y
recepción de estos datos se realiza por medio del
registro SSPBUF, el cual tiene conexión con el bus
interno del microcontrolador. La selección del tipo
de transición y el control del desplazamiento de
datos del registro SSPSR, se hace por medio de
otros registros internos del PIC16F87X.
317 INICIO
La comunicación SPI

La comunicación en el modo SPI (Serial Peripheral


Interface) permite la transferencia de datos de 8 bits
en serie, los cuales se transmiten y reciben en forma
síncrona y simultáneamente. El microcontrolador en este
tipo de transmisión puede trabajar como “maestro” o
como “esclavo”. En el caso de trabajar como “esclavo”,
además de utilizar los terminales SDO, SDI y SCK,
utilizará una línea adicional de selección de esclavo, la
cual se ubica en el terminal RA5/SS# y que deberá ser
puesta a nivel “0”.
Para que un dispositivo trabaje como “maestro”, se
deberá configurar la línea RC5/SCK como salida. Cuando
se trabaja en modo “esclavo”, las líneas RC5/SCK y
RA5/SS# se deberán configurar como entradas; esta
última se colocará a 0V. Para ambos casos, la línea
RC3/SDO se configurará como salida y la línea RC4/SDI
se configurará como entrada.
La transferencia de información entre el “maestro” y el
“esclavo” se suele hacer de la siguiente manera:
• Escritura: El “maestro” envía la dirección, luego el
comando de escritura y después el dato.
• Lectura: El “maestro” envía la dirección, luego el
comando de lectura y después el “esclavo” envía el dato.
318 INICIO
Formas de onda en modo Maestro

En la figura siguiente se presentan las formas de ondas para la comunicación en el modo


SPI. Nótese las diversas combinaciones que se pueden obtener con la señal de
sincronización SCK, según los valores de los bits CKP y CKE, los cuales se ubican en los
registros SSPCON y SSPSTAT respectivamente. También se observa cuándo un dato
en la entrada SDI se tomará como válido según el valor del bit SMP, ubicado en el
registro SSPSTAT. Esto es importante para la compatibilidad en la comunicación con
otros dispositivos seriales. Finalmente, podemos ver la línea SSPIF del registro PIR1,
la cual se utilizará para interrumpir al programa principal cuando un dato se haya
transmitido o recibido.

319 INICIO
Formas de onda en modo Esclavo

Similarmente podemos observar a continuación las formas do onda en modo esclavo.


Para CKE=0

Para CKE=1

320 INICIO
Registros asociados

En el modo SPI los registros asociados son los que se presentan en la siguiente tabla.
Para mayor detalles de los registros SSPCON y SSPSTAT, nos referiremos a las
páginas siguientes en donde se presenta el funcionamiento de cada bit.

321 INICIO
Registro SSPSTAT
Registro de Estatus del MSSP

SMP: Modo de muestreo.


Maestro: 1 muestreo al final del dato de salida.
0 muestreo a la mitad del dato de salida.
Esclavo: Debe ponerse en 0.
CKE: Selección de transición de la señal se sincronización.
Si CKP=0: 1 La transmisión ocurre desde el estado de activación hasta el
de reposo de la señal de sincronización.
0 La transición ocurre desde el estado de reposo hasta el de
activación de la señal de sincronización.
Si CKP=1: 1 El dato es transmitido en la transición de bajada de SCK.
0 El dato es transmitido en la transición de subidad de SCK.
BF: Registro SSPBUF lleno.
1 Recepción terminada. SSPBUF está lleno.
0 No ha finalizado la recepción. SSPBUF está vacío.

322 INICIO
Registro SSPCON
Registro de control del MSSP

WCOL: Detección de colisión de bits.


1 Hay colisión; 0 No hay colisión.
SSPOV: Indicador de desbordamiento en la recepción.
1 Se recibió dato sin haber leído SSPBUF; 0 No hay desbordamiento.
SSPEN: Habilitación del puerto serial. Los terminales del puerto serial deben ser
configurados apropiadamente como entradas y salidas.
1 Puerto serial habilitado. 0 Terminales configurados como E/S.
CKP: Selección de polaridad de la señal de sincronización (SCK).
1 Estado de reposo de SCK = 1; 0 Estado de reposo de SCK = 0.
SSPM3- Modo de trabajo del MSSP. Para el modo de trabajo del puerto serial
SSPM0: síncrono, ver la tabla de la página siguiente.

323 INICIO
Bits SSPM3-SSPM0

SSPM3-SSPM0 Modo de trabajo


0000 Modo maestro SPI con sincronización a Fosc/4
0001 Modo maestro SPI con sincronización a Fosc/16
0010 Modo maestro SPI con sincronización a Fosc/64
0011 Modo maestro SPI con sincronización igual a la salida de TMR2/2
0100 Modo esclavo SPI con sincronización igual a SCK (SS# = 0)
0101 Modo esclavo SPI con sincronización igual a SCK (SS# no está activo)
0110 Modo esclavo I2C con dirección de 7 bits
0111 Modo esclavo I2C con dirección de 10 bits
1000 Modo maestro I2C con sincronización = Fosc/(4(SSPAD+1))
1011 Modo maestro I2C controlado por
c firmware
1110 Modo maestro I2C controlado por firmware, con bits de arranque y parada,
interrupción activada y dirección de 7bits
1111 Modo maestro I2C controlado por firmware, con bits de arranque y parada,
interrupción activada y dirección de 10bits

324 INICIO
Programa ejemplo

Configuración y transmisión y recepción en Modo “maestro”


CLRF STATUS ; Selección del banco 0
CLRF SSPSTAT, CKE ; SMP = 0, CKE = 0, bits de STATUS en 0
MOVLW 0x31 ; Activa puerto SPI, modo maestro y CLK/16
MOVWF SSPCON ; Los datos se transmiten en transición de bajada
; Los datos se leen en la mitad del pulso (SMP = 0)
BSF STATUS, RP0 ; Selección del banco 1
BSF PIE, SSPIE ; Habilitación de la interrupción SSP
BCF STATUS, RP0 ; Selección del banco 0
BSF INTCON, GIE ; Habilitación global de interrupciones
MOVLW DATOTX ; Se coloca el dato a ser transmitido
MOVWF SSPBUF ; Comienza la transmisión

• ; Lectura de un dato
MOVF SPBUF,W ; Dato pasa a W
MOVWF DATORX ; Se guarda dato en la RAM
MOVF TRANSM,W ; El dato a transmitir va a W
MOVWF SPBUF ; Se carga SPBUF y se transmite el
; dato automáticamente

325 INICIO
Ejercicio: Transmitir un dato en
modo SPI

Configurar el PIC16F87x que vayas a utilizar (con excepción de los PIC16F870 y 871),
para que transmita un dato de 8 bits a un registro de desplazamiento 74xx164. Para
ello deberás buscar las características de este dispositivo, de manera de hacer
compatible la transmisión de datos.

PIC16F87X

74XX164
SDO SI

SCK Clock

326 INICIO
7.11 El Puerto C y la
Comunicación I2C
Este protocolo de comunicación fue desarrollado por Philips en la década de 1980.
Utiliza dos líneas para la transferencia de información entre varios elementos; éstas
son: La SDA, la cual se encarga de la transferencia de datos en forma bidireccional, y la
línea SCL la cual es generada por un dispositivo “maestro” hacia los “esclavos”, y lleva los
pulsos de sincronización. La interconexión entre dispositivos es la que se muestra en la
figura siguiente, en donde puede haber en cada caso, más de un dispositivo “maestro” y
no se necesita que todos los dispositivos tengan la misma tecnología digital.
Los dispositivos involucrados en la comunicación I2C se conectan formando un “AND
cableado” con las líneas SDA y SCL, ya que las salidas de cada uno es del tipo drenador
abierto o colector abierto (open drain or open collector). De allí que sea necesario
colocar resistencias a una de las alimentaciones en las líneas SDA y SCL. Esta
configuración, a la vez evita que ocurra fallas, en el caso de haber colisión de datos
cuando dos dispositivos traten de enviar señales al mismo tiempo. Observa las conexiones
de varios elementos y las resistencias Rp en la figura siguiente.

VDD1

NMOS

327 INICIO
Funcionamiento del protocolo I2C

Cuando el bus está libre, las líneas SDA y SCL se encuentran en “1”, es decir, los
transistores de salida se encuentran en estado “abierto”. Cuando comienza una
transmisión, el dispositivo “maestro” envía una señal “0” en la salida SDA, luego la salida
SCL se coloca en “0” y después se envía el conjunto de 8 bits en modo serial por la línea
SDA, los cuales corresponden a 7 bits de la dirección del “esclavo” con el cual se va a
comunicar y un bit de R/W, según la operación que se va a realizar (lectura o escritura);
simultáneamente se envían los pulsos de sincronización. Los valores de los bits de la línea
SDA se considerarán válidos, en los momentos en que la señal de sincronización está en
“1”. Después de enviada la dirección, se envía el bit de parada, el cual corresponde a un
“1”. Entonces el dispositivo “esclavo” envía una señal de reconcimiento, que corresponde
a un “0”, lo cual indica que se ha recibido la información. A continuación, dependiendo
de si la operación es escritura o lectura, se enviará el dato serial del “maestro” al
“esclavo” o viceversa. Observa las formas de ondas en la figura anexa. En las figuras
de la página siguiente, se observa con mayor detalle, el proceso de comunicación serial
I2C en los PIC16F87X, en los que se detallan las señales de estado de este
microcontrolador.

(RC4)

(RC3)

328 INICIO
Formas de ondas en la transmisión
y recepción en el protocolo I2C

Formas de onda para la escritura de datos al “esclavo”:

Formas de onda para la lectura de datos desde el “esclavo”:

329 INICIO
Colisión de datos

Existe la posibilidad de que en un bus I2C dos dispositivos “maestros” puedan generar
una transmisión simultáneamente. Para resolver este problema los dispositivos
maestros “leen” el valor en la línea SDA y lo compara con el valor enviado. En el caso
de que envíe un “1” y lee un “0”, querrá decir que otro maestro tiene dominio del bus
y por tanto el primero tendrá que ceder e inhibir su salida SDA. Podría suceder que
en este conflicto, el maestro que toma el control esté enviando información al maestro
que cedió el bus. En este caso el maestro que cedió el bus deberá pasarse a la
condición de “esclavo”.
La figura siguiente muestra en un diagrama de tiempo de cómo un primer maestro cede
el bus al segundo maestro, ya que el tiempo en “0” del segundo se mantiene por más
tiempo que el del primero.

330 INICIO
Diagrama de bloques del módulo
I2C en los PIC16F87X

Los PIC16F87X, con excepción de los PIC16F870 y 871, cuentan con un módulo de
comunicación serial que puede configurarse con el protocolo I2C. Este módulo genera
todas las secuencias necesarias para este protocolo, con un mínimo de programación. La
configuración se puede realizar para que trabaje tanto en modo “maestro”, como
“esclavo”.

331 INICIO
Registros asociados al I2C

La siguiente tabla muestra los registros asociados al puerto I2C. En cada uno de los
registros se podrán encontrar la función de cada bit.

93h SSPADD A7 A6 A5 A4 A3 A2 A1 A0 0000 0000 0000 0000


87h TRISC TC7 TC6 TC5 TC4 TC3 TC2 TC1 TC0 0000 0000 0000 0000
07h PORTC RC7 RC6 RC5 RC4/SDA RC3/SCl RC2 RC1 RC0 0000 0000 0000 0000

332 INICIO
Registro SSPSTAT
(Registro de Estatus del MSSP)

SMP: Modo de muestreo.


1 Control de transición deshabilitado para velocidad estándar (100KHz).
0 Control de transición habilitado para alta velocidad (400KHz).
CKE: Selección de transición de la señal se sincronización.
1 Compatibilidad con SMBUS. 0 Compatibilidad con I2C.
D/A: Dato/Dirección
1 Último byte fue un dato. 0 Último byte fue una dirección.
P Bit de parada.
1 Detección de bit de parada al final. 0 No se detectó bit de parada.
S Bit de arranque.
1 Detección de bit de arranque al final. 0 No se detecto el arranque.
R/W Bit de información de lectura y escritura.
Modo esclavo: 1 Lectura. 0 Escritura.
Modo maestro: 1 Hay una transmisión en proceos. 0 No hay transmisión.
UA Actualización de la dirección.
1 Debe actualizarse la dirección. 0 La dirección no se necesita actualizar.
BF Registro SPBUF lleno.
Recepción: 1 Recepción completa, SPBUF lleno. 0 Recepción incompleta, SPBUF vacío.
Transmisión: 1 Transmisión en proceso, SPBUF lleno. 0 Transmisión finalizada.

333 INICIO
Registro SSPCON
(Registro de control del MSSP)

WCOL: Detección de colisión de bits.


1 Hay colisión; 0 No hay colisión.
SSPOV: Indicador de desbordamiento en la recepción.
1 Se recibió dato sin haber leído SPBUF; 0 No hay desbordamiento.
SSPEN: Habilitación del puerto serial. Los terminales del puerto serial deben ser
configurados apropiadamente como entradas y salidas.
1 Puerto serial habilitado, configura a SDA y SCL.
0 Terminales configurados como E/S.
CKP: Selección de polaridad de la señal de sincronización (SCL, sólo en modo
maestro).
1 Habilita sincronización (reloj); 0 Estado de reposo de SCL = 0.
SSPM3- Modo de trabajo del MSSP. Para el modo de trabajo del puerto serial
SSPM0: síncrono, ver la tabla de la página siguiente.

334 INICIO
Bits SSPM3-SSPM0

SSPM3-SSPM0 Modo de trabajo


0000 Modo maestro SPI con sincronización a Fosc/4
0001 Modo maestro SPI con sincronización a Fosc/16
0010 Modo maestro SPI con sincronización a Fosc/64
c
0011 Modo maestro SPI con sincronización igual a la salida de TMR2/2
0100 Modo esclavo SPI con sincronización igual a SCK (SS# = 0)
0101 Modo esclavo SPI con sincronización igual a SCK (SS# no está activo)
0110 Modo esclavo I2C con dirección de 7 bits
0111 Modo esclavo I2C con dirección de 10 bits
1000 Modo maestro I2C con sincronización = Fosc/(4(SSPADD+1))
1011 Modo maestro I2C controlado por firmware
1110 Modo maestro I2C controlado por firmware, con bits de arranque y parada,
interrupción activada y dirección de 7bits
1111 Modo maestro I2C controlado por firmware, con bits de arranque y parada,
interrupción activada y dirección de 10bits

335 INICIO
Registro SSPCON2
(Registro de control 2 del MSSP)

GCEN: Habilitación de llamada general (sólo en modo esclavo).


1 Habilita interrupción al detectar dirección 0000H; 0 Deshabilitado.
ACKSTAT: Bit de reconocimiento de estatus (Sólo en modo maestro).
1 No se recibió reconocimiento del esclavo; 0 Si hubo reconocimiento.
ACKDT: Bit de reconocimiento de dato (Sólo en modo maestro).
1 No reconocido. 0 Reconocido.
ACKEN: Reconocimiento de habilitación de secuencia (Sólo en modo maestro).
1 Reconoce secuencia en SDA y SCL y transmite bit de reconocimiento = 0
0 Secuencia de reconocimiento en reposo.
RCEN Bit de habilitación de recepción (Sólo en modo maestro).
1 Habilita modo de recepción; 0 Recepción en reposo.
PEN: Habilitación de la condición de parada (Sólo en modo maestro).
1 Habilita condición de parada en SDA y SCL. 0Condición de parada en reposo.
RSEN: Condición de arranque repetido (Sólo en modo maestro).
1 Inicia condición repetida de arranque en SDA y SCL. 0 Arranque en reposo.
SEN: Habilitación de condición de arranque (Sólo en modo maestro).
1 Inicia condición de arranque en SDA y SCL. 0 Condición de arranque en reposo.

336 INICIO
Configuración del puerto I2C

A continuación se presenta una sección de un programa que configura al puerto I2C en el


modo “maestro”.
movlw b’00101000’ ; Carga a w el valor de la configuración
clrf STATUS ; Selección del banco 0
movwf SPCON1 ; Configuración en modo maestro
Para configurar la frecuencia de transmisión a 400KHz, asumiendo que la frecuencia del
oscilador del microcontrolador es 16MHz, recurrimos a la ecuación:
ftrsm = fosc/(4(SSPADD+1))
movlw b’00001001’ ; Carga a w el valor de configuración
bsf STATUS,RP0 ; Selección del banco 1
movwf SSPADD ; Configuración de la frecuencia de transmisión a 400KHz
La configuración del control de la transición y fase de la sincronización se hace por medio
del registro SSPSTAT.
movlw b’00000000’ ; Carga a W el valor de la configuración del registro SSPTAT
movwf SSPSTAT
Finalmente, se deben programar las líneas SCL y SDA como entradas, para que éstas
trabajen en el modo I2C.
movlw b’00000110 ; Carga a W el valor de la configuración del puerto C
movwf TRISC ; Configura a SCL y SDA como entradas

337 INICIO
Implementación y control del puerto I2C

Otro aspecto que debemos tomar en cuenta, es si se va a configurar las interrupciones


en el caso de que ocurran eventos tales como si hay un dato en SPBUF (bit SSPIE en el
registro PIE1) y si hay una colisión al tratar de enviar un dato (bit BCLIE en el registro
PIE2).
Una vez configurado el puerto I2C, entonces vendría la parte de implementación y
control. Para ello se deberá seguir los siguientes pasos:
1) Arranque (Start).
2) Continuación (Restart).
3) Parada (Stop).
4) Lectura (recepción).
5) Reconocimiento (Acknowlege, después de una lectura).
ACK (Reconocimiento)
NACK (No reconocimiento)
6) Escritura.
Hasta aquí te hemos dado una introducción relacionada con el puerto I2C. Si deseas
saber más detallada sobre este tema, te recomendamos que leas la nota de aplicación
AN735,

338 INICIO
Actividad

Para esta sección, te proponemos que ubiques componentes que se comuniquen en el


modo I2C y desarrolles programas que establezcan la comunicación con esos
dispositivos. Si por alguna razón no te es posible ubicarlos, entonces te proponemos
que hagas la comunicación entre dos microcontroladores PIC, de manera que
transfieran datos entre uno y otro... Utiliza tu imaginación.

339 INICIO
7.12 El Puerto C y el USART

Un USART es un Transmisor y Receptor Serial Asíncrono o Síncrono Universal. Éste es


un dispositivo de suma importancia para la comunicación con una diversidad de equipos
electrónicos, entre los cuales destacan: Computadores Personales, monitores,
programadores, controles industriales, MODEM, etc. Los PICs de la serie 16F87X, con
excepción del PIC16F872, tienen un módulo USART que puede trabajar en modo
bidireccional asíncrono (full duplex) o en modo síncrono unidireccional (half duplex).
Veamos en la siguiente tabla, los terminales del puerto C involucrados con este módulo.
RC7/RX/DT RC6/TX/CK RC5/SDO RC4/SDI/ RC3/SCK/ RC2/CCP1 RC1/T10SC RC0/T1OSC0
SDA SCL 1/CCP2 /T1CKI
E/S E/S E/S E/S E/S E/S E/S E/S
c
DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL
RECEPCIÓN TRANSMIS. SALIDA ENTRADA RELOJ SPI ENTRADA
c ENTR. TMR1 ENTRADA
USART USART DATOS DATOS CAPTURA 1 ENTR. CAPT2 TMR1
SCPI SPI

DATOS RELOJ ENTRADA RELOJ I2C SAL COMP1 SAL COMP2 SALIDA TMR1
TRANS TRANS DATOS I2C
SAL PMW1 SAL PMW2
SINCRONA SINCRONA

En una transmisión sincrónica el terminal RC7/RX/DT se utiliza para la transferencia de


datos en forma serial (DT) y en el terminal R6/TX/CK están los pulsos de sincronización
(CK). En modo síncrono, el PIC podrá trabajar en los modos “maestro” o “esclavo”.
En una transmisión asíncrona, el terminal RC7/RX se utiliza para la recepción de datos
(RX), mientras que el terminal RC6/TX se emplea para la transmisión de datos (TX).
340 INICIO
Transmisión Asíncrona

En la siguiente figura se muestra un esquema de dos equipos que se comunican de manera


serial asincrónica.

PIC 1 PIC 2
RS-
232C Tx Rx
Rx Tx
Gnd Gnd

La comunicación serial asíncrona es muy utilizada en una gran variedad de aplicaciones,


tanto en equipos de computación, como en equipos industriales. Su ventaja radica en que
sólo necesita de dos o tres cables para interconectar dos equipos, y por medio de ellos
transmitir mensajes. Además de esto, debido a que la comunicación se realiza en forma
serial, se adapta muy bien a sistemas de transmisión inalámbrica.
Al USART también se le suele llamar SCI por las siglas “Serial Comunications Interface”,
y para el protocolo de transmisión de datos, es muy utilizada la norma RS-232-C.
La configuración del USART se hace mediante los registros: TXSTA (dirección 98h),
RCSTA (dirección 18h) y SPBRG (dirección 99h), los cuales corresponden al control del
transmisor, el control del receptor y el generador de baudios respectivamente.

341 INICIO
Diagrama de bloques
de la transmisión del USART

En la siguiente figura se muestra el diagrama de funcionamiento de la sección de


transmisión serial del USART que se encuentra en los PIC16F87X.

En una transmisión serial asíncrona, para enviar un dato de 8 bits, éste se coloca en el
registro TXREG; ese dato se transfiere al registro de desplazamiento TSR, el cual hará
que los datos salgan por el terminal de salida RC6/TX/CK. El dato a enviar, podrá tener
un bit adicional, el cual se utiliza normalmente para colocar la paridad de los datos
transmitidos, según se habilite o no el bit 8 por medio de TX9. Cuando se desea hacer
la transmisión se coloca en “1” el bit TXEN (habilitación de transmisión) y con ello, el
oscilador del generador de velocidad de transmisión envía los pulsos para que se produzca
el desplazamiento de los datos del registro TSR y salgan por el terminal RC6/TX/CK. El
bit TXIF, el cual se puede utilizar para interrumpir el programa principal para colocar un
nuevo dato en TXREG, se activa cuando un dato se transfiere de TXREG a TSR al
iniciarse una nueva transmisión, entonces TXREG está listo para recibir un nuevo dato.
342 INICIO
Bits de configuración
de la transmisión del USART

De acuerdo a la explicación anterior, podemos nombrar los bits que configuran al


transmisor del USART ubicados en el registro TXSTA.

CSRC: Selección de la fuente del oscilador.


1 Modo Maestro (oscilador interno). 0 Modo esclavo (Oscilador externo)
TX9: Habilitación del bit 9 de transmisión.
1 Transmisión de 9 bits. 0 Transmisión de 8 bits.
TXEN: Habilitación de la transmisión.
1 Transmisión habilitada. 0 Transmisión inhabilitada.
SYNC: Selección del modo de operación del USART.
1 Modo síncrono. 0 Modo asíncrono.
BRGH: Velocidad de transmisión:
1 Velocidad alta. 0 Velocidad baja.
TRMT: Estado del registro de transmisión:
1 Registro vacío (transmitió los datos). 0 Registro no vacío.
TX9D: Bit 9 del dato a transmitir. Usualmente se utiliza para el bit de paridad.

343 INICIO
Formas de onda en la
transmisión asíncrona

Otra manera de observar el funcionamiento de esta interfaz serial, la podemos analizar


de acuerdo al diagrama de las formas de onda involucradas.

Vemos que la señal BRG es una oscilación libre, la cual determinará la velocidad de
transmisión. En un segmento de transmisión, podemos ver que el envío comienza con un
bit de arranque (start bit) que comienza con valor “0”, luego se envía el dato de 8 ó 9
bits y finaliza con un bit de parada (stop bit) el cual es de valor “1”. Un dato se puede
escribir en el registro TXREG después de haberse transmitido el bit de parada (stop bit)
de un dato previo, es decir, que mientras se está transmitiendo un dato, por medio del
registro TSR, se puede cargar otro en el registro TXREG. El bit TXIF del registro
PIR1 es el que nos indicará cuándo se puede cargar un dato a transmitir en el registro
TXREG. El bit TRMT indicará si el registro TSR está vacío.

344 INICIO
Diagrama de bloques
de la recepción del USART

Conociendo el funcionamiento de un dispositivo de transmisión serial asíncrona, será más


fácil comprender el receptor serial. En principio, el receptor serial deberá ser un
dispositivo que lea los datos enviados por el transmisor serial. En la siguiente figura se
muestra el diagrama de funcionamiento de la sección de recepción serial del USART que
se encuentra en los PIC16F87X.

Los datos entran por el terminal RC7/RX/DT, y de allí pasan al registro RSR cuando el
bit CREN está en “1”. El circuito de control de datos de entrada y el generador de
baudios, se encargan de transferir el dato al registro RSR. Al llenarse el registro RSR,
se activa el bit RCIF del registro PIR1, el cual se puede utilizar como interrupción, y se
transfiere el dato a una memoria FIFO con dos datos de capacidad, la cual se podrá leer
por medio del PIC16F87X al acceder al registro RCREG.
345 INICIO
Bits de configuración
de la recepción del USART

Veamos a continuación la descripción de los bits de configuración del registro RCSTA:

SPEN: Habilitación del puerto serial.


1 Puerto serial habilitado. 0 Puerto serial deshabilitado.
RX9: Habilitación del bit 9 de Recepción.
1 Recepción de 9bits. 0 Recepción de 8 bits.
SREN: Configuración de la recepción sencilla en modo síncrono maestro.
1 Habilita la recepción sencilla. 0 Deshabilita la recepción sencilla.
CREN: Configura la recepción continua.
1 Habilita la recepción continua. 0 Deshabilita la recepción continua.
ADDEN: Habilitación de la detección de dirección:
1 Activa la detección de dirección e interrupción.
0 Inhibe la detección de dirección y el bit 9 puede ser utilizado.
FERR: Error de trama:
1 Hay error de trama. 0 No hay error de trama.
OERR: Error de desbordamiento
1 Hay error de desbordamiento. 0 No hay error de desbordamiento.
RX9D: Bit 9 del dato Recibido. Usualmente se utiliza para el bit de paridad.

346 INICIO
Formas de onda en la
transmisión asíncrona

Otra manera de observar el funcionamiento del receptor serial, la podemos analizar de


acuerdo al diagrama de las formas de ondas involucradas.

En la figura se muestra una recepción de tres datos simultáneos. Cada vez que se
activa el bit de parada, se transfiere un dato a la FIFO, que es leída como el registro
RCREG, y se activa el bit RCIF de PIR1, que puede utilizarse para interrumpir al
programa principal del microcontrolador. Si la lectura del registro RCREG no se realiza,
y se llena la FIFO, Se colocará el bit OERR en “1”, para indicar que hay un
desbordamiento, y que podrían perderse datos.

347 INICIO
Velocidad de transmisión

La cantidad de datos que se pueden enviar por unidad de tiempo depende de la velocidad
de transmisión. A mayor velocidad, podremos transferir más rápidamente los datos de
un dispositivo a otro, pero esto podría llevar algunos inconvenientes, tales como la
incompatibilidad de velocidad con el otro equipo, una mayor probabilidad de error, una
menor distancia de transmisión y una mayor dedicación del microcontrolador al manejo de
los datos enviados y recibidos. El compromiso está en poder transmitir a la mayor
velocidad posible, sin que ocurra algún inconveniente de importancia, lo cual amerita un
estudio de mayor profundidad.
En los PIC16F87X, la velocidad de transmisión se puede obtener en base al oscilador
interno del microcontrolador o algún oscilador externo. Además se cuenta con el
registro SPBRG, el cual fija la relación de velocidad de transmisión en función de la
frecuencia del oscilador y el bit BRGH del registro TXSTA. A continuación se presenta
esta relación:

Velocidad de transmisión (Baudios o Bits/Seg) = fosc/K(X + 1)

Donde: X es el valor cargado en el registro SPBRG


K = 64 si BRGH = 0, y K = 16 si BRGH = 1

En las tablas de la siguiente página, podemos obtener las velocidades de transmisión


estandarizadas para la norma RS-232-C, en función de la frecuencia del oscilador y el
valor del registro SPBRG y el bit BRGH.

348 INICIO
Determinar la velocidad
de transmisión

En el caso de que BGRH=0, obtenemos la siguiente tabla:

En el caso de que BGRH=1, obtenemos la siguiente tabla:

349 INICIO
Pasos para configurar al módulo
de transmisión serial asíncrono

Para configurar el módulo USART para una transmisión serial asíncrona, se deberá seguir
los siguientes pasos:
• Configurar R6/TX/CK como salida y R7/RX/DT como entrada por medio de TRISC.
• Se fija la velocidad de transmisión al cargar el valor adecuado en SBREG y BGRH.
• Colocar SYNC = 0, para indicar que la transmisión es asíncrona.
• Colocar SPEN = 1, para habilitar al puerto serial.
• Colocar los bits GIE y TXIE en “1” si se va a habilitar las interrupciones del
transmisor y el receptor.
• Si el dato es de 9 bits, hacer TX9 = 1.
• Se activa la transmisión con TXEN = 1, TXIF se colocará en 1, ya que TXREG se
encuentra vacío.
• Se carga en TXREG el dato a transmitir, y comienza la transmisión.
• Al comenzar la transmisión, si TSR estaba vacío, éste se cargará con el contenido de
TXREG, por tanto se podrá colocar otro dato a enviar en TXREG. Para saber si se
puede cargar ese dato, bastará con evaluar el bit TXIF.

350 INICIO
Bits utilizados para la
transmisión asíncrona

A continuación se presentan los bits utilizados para configurar la transmisión asíncrona


en el USART.

En la siguiente página se muestra un programa ejemplo para seguir los pasos


mencionados anteriormente.

351 INICIO
Pasos para configurar al módulo
de recepción serial asíncrono

Para configurar el módulo USART para una recepción serial asíncrona, en el caso en el
que no se haya configurado el bloque transmisor, se deberá seguir los siguientes pasos:
• Se fija la velocidad de transmisión al cargar el valor adecuado en SBREG y BGRH.
• Colocar SYNC = 0, para indicar que la transmisión es asíncrona.
• Colocar SPEN = 1, para habilitar al puerto serial.
• Colocar los bits GIE y RCIE en “1” si se va a habilitar las interrupciones del transmisor
y el receptor.
• Si el dato es de 9 bits, hacer RX9 = 1.
• Habilitar la recepción al hacer CREN = 1
El módulo de recepción serial quedará configurado. Cuando un dato se recibe, el bit de
aviso RCIF se colocará en “1”, y si el bit RCIE está habilitado, habrá una interrupción.
En ese momento se podrá leer el registro RCSTA obtener el noveno bit (RX9D) y
determinar si hubo algún error en la recepción (bits FERR y OERR). Para leer un
próximo dato, estos dos bits deberán ser borrados al colocar en “1” el bit CREN.
Si no se encuentra errores, se leerá el dato en el registro RCREG.

352 INICIO
Bits utilizados para la
recepción asíncrona

A continuación se presentan los bits utilizados para configurar la recepción asíncrona


en el USART.

En la siguiente página se muestra un programa ejemplo para seguir los pasos


mencionados anteriormente.

353 INICIO
Programa de configuración
del USART en modo asíncrono

; Configuración del USART para transmisión y recepción serial asíncrona


BCF STATUS, RP1
BSF STATUS, RP0 ; Selección del banco 1 para configurar TRISC
MOVLW b’10xxxxxx’ ; Palabra de configuración del puerto C
MOVWR TRISC ; Configura las líneas RC7 como entrada y RC6 como salida
MOVLW BAUDIOS ; Establece la velocidad de transmisión, el valor de
MOVWF SPBRG ; BAUDIOS se calcula según la tablas de SPBRG
MOVLW 0x40 ; Transmisión de 8 bits, modo baja velocidad
MOVWF TXTA ; Modo asincrónico, habilitación del USART
BSF PIE1,TXIE ; Habilita interrupción del transmisor
BSF PIE1,RCIE ; Habilita interrupción del receptor
BCF STATUS,RP0 ; Selección del banco 0
MOVLW 0x90 ; Recepción de 8 bits, receptor habilitado,
MOVWF RCSTA ; Puerto serial habilitado

354 INICIO
Configuración para la recepción
de una dirección

La detección de direcciones en un módulo de comunicación serial tiene aplicaciones en


sistemas en donde varios equipos se conectan juntos. Para configurar el módulo USART
para la recepción de una dirección, se siguen prácticamente los mismos pasos que en la
recepción de un dato, con la diferencia de que en el caso de detectar una dirección, se
deberá habilitar el bit ADDEN del registro RCSTA:
• Se fija la velocidad de transmisión al cargar el valor adecuado en SBREG y BGRH.
• Colocar SYNC = 0, para indicar que la transmisión es asíncrona.
• Colocar SPEN = 1, para habilitar al puerto serial.
• Colocar los bits GIE y RCIE en “1” si se va a habilitar las interrupciones del transmisor
y el receptor.
• Si el dato es de 9 bits, hacer RX9 = 1.
• Colocar en “1” el bit ADDEN para habilitar la lectura de la dirección.
• Habilitar la recepción al hacer CREN = 1
El módulo de recepción serial quedará configurado. Cuando una dirección se recibe, el
bit de aviso RCIF se colocará en “1”, y si el bit RCIE está habilitado, habrá una
interrupción. En ese momento se podrá leer el registro RCSTA obtener el noveno bit
(RX9D) y determinar si hubo algún error en la recepción (bits FERR y OERR). Para leer
un próximo dato, estos dos bits deberán ser borrados al colocar un “1” en CREN. Si se
obtuvo la dirección al leer el registro RCREG, se deberá borrar el bit ADDEN, para la
lectura de datos.

355 INICIO
Algunos formatos de utilizados
en la transmisión asíncrona

Quizás las interfaces más comunes de comunicación serial que utilizan el USART, son la
RS-232 y la RS-485. La mayoría de los computadores personales tiene uno o más
puertos que utilizan la interfaz RS-232, la cual sirve para comunicarte con otro
dispositivo, tales como un ratón, un módem o un programador de PICs. En el caso de la
interfaz RS-485, ésta es muy utilizada en la industria, y permite comunicar un
dispositivo maestro con varios esclavos por medio de un par trenzado.
Entre las características del RS-232, se puede mencionar que utiliza comúnmente dos
líneas de señal y la referencia o tierra. Las abreviaciones utilizadas para estas líneas
son: GND que es la referencia, TXD que es la salida a transmitir y RXD que es la
entrada a recibir. Existen también otras líneas que pueden ser utilizadas en algunos
casos para el protocolo. Sin embargo, lo común es que se utilicen sólo estas tres líneas.
Los conectores más comunes utilizados para las interfaces RS-232 son los de 9
terminales y un poco menos los de 25 terminales. En la parte posterior de tu
computador podrás observar si tienes una interfaz de 9 terminales machos, similar a la
que se presenta en la siguiente figura:

A pesar de las nueve líneas que se presentan en el conector, bastaría con utilizar
solamente tres. En la figura de la siguiente página se muestra un esquema de la
conexión de dos elementos con la interfaz RS-232.

356 INICIO
Conexión RS-232

La figura muestra las líneas de transmisión y recepción, ya que se sobreentiende que


éstas están referidas a tierra (GND) y representa el sistema más sencillo de transmisión
bidireccional RS-232.
INTERFAZ o “TRANSCEIVER”

2
3

Por lo general, una tensión positiva (mayor que +3Vdc) representa un “0” y una negativa
(menor que -3Vdc) representa un “1”. Los elementos que se representan por medio de
un rectángulo a trazos, se les conoce con el nombre de “Transceiver”, y se utiliza para
convertir los niveles lógicos de 0 a 5V en los niveles de voltaje RS-232. Un ejemplo de
esta interfaz es el circuito integrado SN75155.
La comunicación RS232 podría ser sencilla, ya que el USART transmite y recibe datos en
el formato de bytes. Esta transmisión se podrá hacer más compleja, si se incluye la
paridad, las señales de protocolo y el estado de “break”, el cual consiste en una salida
cero que se mantiene por un período en el orden de 100mS a 500mS.

357 INICIO
Asignación de terminales en un
conector RS-232

A continuación, en la siguiente tabla, se presenta la asignación de cada terminal en la


mayoría de los conectores macho RS-232-C de 9 pines que emplean terminales o
computadores. Además se muestran las abreviaciones y los nombres de cada terminal, y
el sentido de flujo de datos entre un DTE (computador o terminal) y DCE (equipo de
comunicación).
N° Terminal Nombre DTE-DCE Función
1 DCD  Detector de portadora de dato
54321 2 RD  Recepción de datos
3 TD  Transmisión de datos
4 DTR  Terminal listo
5 SG Tierra de señales
9876
6 DSR  Dato listo en el DCE
7 RTS  Responde para enviar
8 CTS  Borrar envío

9 RI  Indicador de llamada

De estos terminales, los que se utilizan con más frecuencia son: RD, TD y SG; es decir:
recepción de datos, transmisión de datos y tierra de señales. Debemos recordar que en
el equipo de comunicación, el tipo de conector es hembra y el terminal 2 corresponde al
de transmisión de datos y el 3 al de recepción de datos.

358 INICIO
Utilización y configuración del
puerto RS-232-C de tu PC

Para hacer utilización del puerto serial de tu computador personal, podrás entrar en el
modo “Hiperterminal. Para ello deberás acceder a: Inicio, Programas, Accesorios,
Comunicaciones y luego a Hyper Terminal.

Aparecerá entonces la siguiente ventana: En ella deberás hacer doble clic en


Hypertrm

359 INICIO
Utilizando tu PC en modo
Hyper Terminal

Al acceder al Hyper Terminal, deberás hacer la configuración. Aparecerá la ventana


que está a la izquierda, en ella podrás escoger algún icono y colocar un nombre como por
ejemplo “Puerto Serial 1”. Luego tendrás que hacer clic en “Aceptar”. Después
aparecerá la ventana que está a la derecha, en la cual podrás seleccionar el puerto
serial que utilizarás.

Al hacer esto, aparecerá un cuadro para configurar el puerto serial, en el cual deberás
seleccionar los parámetros adecuados para la comunicación con tu microcontrolador.

360 INICIO
Configuración del puerto RS-232-C

En la siguiente ventana introducirás los parámetros del puerto de comunicación serial de


tu computadora, y deberás seleccionar los valores que sean compatibles con el del puerto
USART del PIC16F87X que tú irás a programar.

Después de configurar el puerto serial, tendrás lista tu PC para utilizar su puerto


serial. Lo que escribas desde el teclado, será enviado por el terminal TX del puerto
serial, y los caracteres que veas en pantalla, serán aquéllos que entran por el terminal
RX del mismo puerto.
Es importante que utilices la interfaz que convierta las señales del PIC a los niveles
establecidos por la norma RS-232C. Al final de este aparte te proponemos una
actividad en la que deberás utilizar el puerto RS-232C.

361 INICIO
Conexión RS-485

La interfaz RS-485 utiliza señales de transmisión en modo diferencial, de esta manera


hay dos señales de voltaje que indican su valor por su diferencia de potencial relativa.
Las salidas del RS-485 pueden ser tres estados, lo cual permite la conexión de varios
dispositivos para transmitir o recibir con el mismo par de señales. Los dispositivos se
configuran en un arreglo de un “maestro” y varios “esclavos”, y la transmisión puede
hacerse mediante un par de cables o dos pares de cables. La figura muestra el esquema
de conexión en una transmisión con dos pares de cables en donde las líneas son
conectadas a varios dispositivos.

362 INICIO
Implementación RS-485

El software para la interfaz RS-485 puede ser significativamente más complejo que el
de la interfaz RS-232. Se requiere un protocolo de comunicación para arbitrar el bus,
y no exista colisión de datos al tratar de transmitir dos dispositivos a la vez.
Los buses RS-485 se suelen implementar con un “maestro” y varios “esclavos”. El
“maestro” es el único dispositivo que inicia la comunicación en el bus, para así evitar
problemas de colisiones. Esta comunicación se comienza al enviar una dirección y un
comando, entonces el “esclavo” que está siendo seleccionado responderá. Cada esclavo
deberá tener una dirección diferente, y debe “entender” el formato de los datos que se
le envían. Adicionalmente cada dispositivo debe controlar la habilitación de la señal de
salida en su “transceiver”.
Debido a que en el bus se conectan varios dispositivos “esclavos”, el USART debe utilizar
el modo de detección de direcciones, al habilitar el bit ADDEN del registro RCSTA.
Esto permitirá que en una transmisión, los “esclavos” no seleccionados previamente
ignoren los bits de datos recibidos. Si en una transmisión, “el maestro” coloca en “1” el
bit ADDEN, se indica que se está transmitiendo una dirección a ellos. En el momento de
detectar el bit ADDEN, cada “esclavo” hará la comparación de la dirección recibida con
la que ellos tienen establecidas, y en el caso de coincidir, ese “esclavo” sabrá que los
datos y comandos siguientes corresponderán a él. Esto reducirá y facilitará el software
de comunicación entre varios dispositivos conectados en un mismo par de líneas.
Para más detalles, deberás conocer los formatos de cada protocolo, para que puedas
programar el USART en tu PIC. Algunos de los protocolos industriales que utilizan la
interfaz RS485 son: el ASCII ANSI X3 28-2.5-A4, el BSAP y el MODBUS, entre
otros.

363 INICIO
Transmisión Síncrona en
modo “maestro”

La transmisión síncrona con el USART se realiza en modo Half Duplex, es decir, la


transmisión y la recepción no ocurren al mismo tiempo. Al transmitir un dato, la
recepción se inhibe y viceversa, ya que éstas se hacen por una misma línea. La otra
línea es utilizada para sincronizar los datos, es decir, saldrán los niveles del oscilador si
el transmisor es “maestro” o los recibirá si es un dispositivo “esclavo”. La ventaja de la
transmisión síncrona, es que ésta es más sencilla y no requiere de una lógica complicada.
Para configurar el módulo USART en la comunicación serial síncrona en modo “maestro”
se colocarán en “1” los bits SYNC (modo síncrono) y CSRC (oscilador interno) del registro
TXSTA. Al habilitar el bit SPEN del registro RCSTA, se configuran los terminales
RC6/TX/CK como el que produce la señal de sincronización o reloj, y el terminal
RC7/RX/DT se utilizará como la línea que envía y recibe datos.
La transmisión serial síncrona ocurre de manera similar a la asíncrona. La gran
diferencia está en que la señal del oscilador de sincronización, la cual es producida por
el generador de baudios, se transmite simultáneamente con la señal de datos.
Para configurar el módulo USART para la transmisión síncrona en modo “maestro”, se
deberá hacer pasos similares para la configuración en modo asíncrono. La única
diferecncia será que hay que hacer “1” los bits SYNC y CSRC del registro TXSTA.
En la siguiente página se muestran los bits involucrados en la transmisión serial síncrona
en modo “maestro” y las formas de ondas.

364 INICIO
Bits y formas de ondas relacionados
con la transmisión síncrona

365 INICIO
Comunicación Síncrona en
modo “esclavo”

La transmisión síncrona en modo “esclavo” se diferencia de la del modo “maestro” en


que, en modo esclavo el oscilador que produce la sincronización de datos es externo al
dispositivo. Para especificar que el dispositivo trabaja en modo “esclavo”, se deberá
colocar el bit CSRC = 0, el cual está en el registro TXSTA.
En el caso de la recepción síncrona en modo “esclavo”, se siguen los mismos pasos que
en modo “maestro”.
Debido a que la sincronización en modo “esclavo” es externa, el dispositivo podrá
trabajar en modo “reposo”. En este caso habrá diferencias en la configuración con
respecto al modo “maestro”.

366 INICIO
Registros asociados en la comunicación
síncrona en modo “esclavo”

367 INICIO
Programa de configuración
del USART en modo síncrono

; Configuración de la transmisión serial síncrona

BCF STATUS,RP1
BSF STATUS,RP0 ; Selección del Banco 1
MOVLW BAUDIOS ; Establece la velocidad de transmisión
MOVWF SPBRG
MOVLW 0xB0 ; Transmisión de 8 bits, modo baja velocidad
MOVWF TXTA ; Modo sincrónico, habilitación del USART
BSF PIE1,TXIE ; Habilita interrupción del transmisor
BSF PIE1,RCIE ; Habilita interrupción del receptor
BCF STATUS,RP0 ; Selección del banco 0
MOVLW 0x90 ; Recepción de 8 bits, receptor habilitado,
MOVWF RCSTA ; Puerto serial habilitado

368 INICIO
Actividades

Ya hemos visto el funcionamiento del puerto universal sincrónico-asincrónico (USART).


En principio, te habíamos mencionado la importancia de este puerto para realizar la
comunicación con otros equipos, entre ellos, el computador.
La actividad que se propone, es la de que hagas un programa y montes un circuito que
sea capaz de leer una señal analógica, la convierta a digital y la envíe al puerto RS-232
de tu computadora. Claro está, que deberás utilizar una interfaz que convierta la señal
de 0 a 5V que maneja tu microcontrolador, en la de 12V a -12V que se emplea en el
estándar RS-232-C. Para ello, te proponemos que emplees el dispositivo de la figura
anexa, o uno similar. Por otro lado, deberás adquirir un cable para la conexión RS-232,
el cual podrás comprar en una tienda de electrónica o computación.

-12V
+12V
Transmisión
RC6/TX RS232C
del PIC

SN75155 Recepción RC7/RX


RS232C del PIC

369 INICIO
Registros asociados al Puerto C

Dirección Registro Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Otros
POR y BOR Resets
07h PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 xxxx xxxx uuuu uuuu
87h TRISC Registro de Configuración de PORTC 1111 1111 1111 1111
81h, 181h OPTION_REG RBPU# INTDG TOCS TOSE PSA PS2 PS1 PS0 1111 1111 1111 1111
15h CCPR1L Registro 1 de Captura, Comparación y PWM menos significativo xxxx xxxx uuuu uuuu
16h CCPR1H Registro 1 de Captura, Comparación y PWM más significativo xxxx xxxx uuuu uuuu
17h CCP1CON --- --- CCP1X CCP1Y CCP1M3 CCP1M2 CCP1M1 CCP1M0 --00 0000 --00 0000
1Bh CCPR2L Registro 2 de Captura, Comparación y PWM menos significativo xxxx xxxx uuuu uuuu
1Ch CCPR2H Registro 2 de Captura, Comparación y PWM más significativo xxxx xxxx uuuu uuuu
1Dh CCP2CON --- --- CCP2X CCP2Y CCP2M3 CCP2M2 CCP2M1 CCP2M0 --00 0000 --00 0000
18h RCSTA SPEN RX9 SREN CREN ADDEN FERR OERR RX9D 0000 000x 0000 000x
98h TXTA CSRC TX9 TXEN SYNC --- BRGH TRMT TX9D 0000 -010 0000 -010
19h TXREG Registro de datos a transmitir del USART 0000 0000 0000 0000
99h SPBRG Registro de generación de la velocidad de transmisión (Baudios) 0000 0000 0000 0000
1Ah RCREG Registro de datos recibidos del USART 0000 0000 0000 0000
13h SSPBUF Registro de datos transmitidos y recibidos del puerto serial sincrónico xxxx xxxx uuuu uuuu
14h SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 0000 0000 0000 0000
91h SSPCON2 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN 0000 0000 0000 0000
93h SSPADD Registro de Direcciones del puerto serial sincrónico en modo I2C 0000 0000 0000 0000
94h SSPSTAT SMP CKE D/A P S UA R/W BF 0000 0000 0000 0000

370 INICIO
7.13 El Puerto D, el Puerto E
y la Interfaz Paralela

El puerto D sólo lo tienen los dispositivos de 40 terminales o más. Dispone de 8 líneas


bidireccionales multiplexadas y, las que se usan como entradas, tienen un disparador
de Schmitt. El puerto D o PORTD, se ubica en la dirección 08h, mientras que TRISD
se encuentra en la 88h.
El puerto D puede utilizarse como puerto paralelo esclavo de 8 líneas (PSP). Para que
trabaje de esta manera, se deberá colocar el bit PSMODE en “1”. Este bit se ubica
en la posición 4 del registro TRISE. Las líneas de control del puerto paralelo PSP, las
cuales son RD, WR y CS se encuentran en el puerto E
En la siguiente tabla, podemos observar la función de cada terminal del puerto D.

RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0

E/S E/S E/S E/S E/S E/S E/S E/S


DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL DIGITAL

Bit 7 PSP Bit 6 PSP Bit 5 PSP Bit 4 PSP Bit 3 PSP Bit 2 PSP Bit 1 PSP Bit 0 PSP

Los PIC16F870/872/873/876 no tienen los puertos D y E, así que la tabla aplica


solamente a los PIC16F871, PIC16F874 y PIC16F877.

371 INICIO
Diagrama de bloques del
Puerto Paralelo

El puerto paralelo opera con palabras de 8 bits


cuando el bit de control PSPMODE, ubicado en
TRISE, se coloque en “1”. En el caso de que el
puerto trabaje en modo “esclavo”, se podrá leer
o escribir de manera asíncrona por medio de los
terminales RE0/RD y RE1/WR respectivamente.
La interfaz paralela puede hacer del
microcontrolador, un dispositivo de comunicación
con microprocesadores de 8bits. Para ello se
deberán configurar los bits RE2/CS, RE1/WR y
RE0/RD como entradas de control que se
conectarían a la selección del dispositivo (CS), la
lectura RD y la escritura WR. Los datos se
conectarán a las líneas del puerto D, que al ser
bidireccionales, no tendrá efecto el registro
TRISD en el puerto D.
En la siguiente figura se presenta el diagrama de
bloques del puerto paralelo. Al analizar este
diagrama, se podrá comprender el funcionamiento
de las líneas del puerto D y las líneas de control
que se encuentran en el puerto E.

372 INICIO
Formas de onda para
la escritura de datos

La escritura en el puerto PSP ocurre al colocar en “0” las líneas CS y WR. Cuando
estas líneas pasan a “1”, el bit IBF, el cual indica que el registro de entrada está
lleno, y está ubicado en el registro TRISE se establece en el período Q4 del siguiente
ciclo del oscilador del microcontrolador. La señal estará escrita cuando aparece el
pulso Q2 de ese ciclo. El bit de aviso de interrupción PSPIF, ubicado en PIR1, se
establecerá también en el período Q4 y se podrá utilizar para interrumpir al
microcontrolador. Este bit se borrará al leer el dato en el puerto D en el programa
del microcontrolador. El bit de desbordamiento, IBOV, ubicado en TRISE, se
colocará en “1”, si una nueva escritura se hace en el registro del PSP antes de
haberse leído el dato que estaba en ese registro. En la siguiente figura se presentan
las formas de onda para la escritura de datos en el PSP.

373 INICIO
Formas de onda para
la lectura de datos

La lectura del PSP ocurre cuando se detecta un “0” en cada una de las líneas CS y
RD. El bit que indica que el registro de salida está lleno (OBF), ubicado en el registro
TRISE, se coloca en cero inmediatamente, para indicar que el puerto D está a la
espera de ser leído por el bus externo. Al colocar el bit CS o RD en “1”, el bit de
interrupción PSPIF se coloca en “1” en el período Q4 del ciclo del oscilador del
microcontrolador, para indicar que la lectura ha sido realizada. En la siguiente figura
se presentan las formas de onda para la lectura de datos.

374 INICIO
Registros asociados al
Puerto Paralelo

La ventaja de utilizar al puerto paralelo como elemento controlado por otro dispositivo
externo, es que nos permite hacer transferencias de datos de un dispositivo a otro de
manera más rápida e independiente, y para ello se utilizarían las interrupciones.
En la siguiente tabla se encuentran los bits asociados al puerto paralelo.

375 INICIO
Registros Asociados a PORTD

Dirección Registro Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en Otros
POR y BOR Resets

08h PORTD RD7 RD6 RD5 RD4 RD3 RD2 RD1 RD0 xxxx xxxx uuuu uuuu

88h TRISD Registro de Configuración de PORTD 1111 1111 1111 1111

89h TRISE IBF OBF IBOV PSP Registro de 0000 -111 0000 -111
MODE Configuración de PORTE

376 INICIO
El Puerto E

El puerto E o PORTE ocupa la dirección 09h, dispone de 3 líneas bidireccionales,


multiplexadas con otras funciones relacionadas con el control del puerto paralelo
esclavo (PSP) y las entradas del Convertidor Analógico a Digital.

RE2/CS#/AN7 RE1/WR#/AN6 RE0/RD#/AN5

E/S DIGITAL E/S DIGITAL E/S DIGITAL


Entrada Analógica Entrada Analógica Entrada Analógica
7 6 5
Selección de Chip en Escritura en el modo Lectura en el modo
el modo PSP (CS) PSP (WR) PSP (RD)

Los PIC16F870/872/873/876 no tienen los puerto D y E, así que la tabla aplica


solamente a los PIC16F871, PIC16F874 y PIC16F877.
La configuración del puerto E se realiza por medio del registro TRISE.

Dirección Registro Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Valor en POR Otros
y BOR Resets

89h TRISE IBF OBF IBOV PSP --- Configuración de las 0000 -111 0000 -111
MODE Entradas/Salida Digitales

377 INICIO
Actividades

Con este aparte finalizamos la descripción de los módulos de los PIC16F87X. La


primera actividad propuesta, relacionada con el puerto paralelo, será la de conectar
dos microcontroladores entre sí por medio del puerto paralelo. Deberás enviar datos
desde uno a otro, mediante un programa que tú mismo elaborarás. Recuerda utilizar
las líneas de control RD, WR y CS, para el control del flujo de datos.
Otra actividad que podrás realizar, es la de transferir datos desde el puerto paralelo
de tu computadora. Para ello, deberás buscar información de cómo se conectan las
líneas de este puerto.

378 INICIO
7.14 Palabra de Configuración

La palabra de configuración es una posición reservada en la memoria de programa, que


se ubica en la posición 2007h, y sólo se puede acceder a ella en el momento de la
grabación del PIC. Los bits de esta palabra determinarán algunas características de
funcionamiento del microcontrolador.
B13 B12 B11 B10 B9 B8 B7 B6 B5 B4 B3 B2 B1 B0
CP1 CP0 - Debug WRT CP0 LVP BODEN CP1 CP0 PWRTE# WDTE FOSC1 FOSC0

Los bits FOSC0, FOSC1, WDTE y PWRTE# se configuran de la misma manera que en
los PIC16F84A y PIC16C54 (repasar). CP1 y CP0 se utilizan para proteger secciones de
la memoria de programa, y éstas dependen de los modelos del PIC que se va a utilizar.
Para más detalles, véase la tabla de la página siguiente.
• BODEN. Habilitación de inicialización por caída de tensión. 1 Habilitada, 0 Deshabiltada.
• LVP. Habilitación para programar en bajo voltaje. 1 RB3 habilitada, 0 RB3 funciona
como E/S digital y la programación se realizará por alto voltaje.
• CPD. Protección de la memoria EEPROM de datos. 1 No protegida, 0 Protegida
• WRT. Habilitación para la escritura de la memoria de programa FLASH. 1 Se podrá
escribir en la parte no protegida de la FLASH, 0 No se permitirá la escritura.
• Debug. Modo de depuración del circuito. 1 Desactivado. RB7 y RB6 actuarán como líneas
de E/S. 0 Activado. RB7 y RB6 actúan en modo de depuración. La depuración
se podrá hacer desde el MPLAB.

379 INICIO
Protección de la memoria de
programa de los PIC16F87X

Modelo PIC CP1 CP0 Dirección Dirección final


inicial de de protección
protección
PIC16F870/871/872 0 0 TODO PROTEGIDO

PIC16F873/874 0 0 0000H 0FFFH

PIC16F873/874 0 1 0800H 0FFFH

PIC16F873/874 1 0 0F00H 0FFFH

PIC16F876/877 0 0 0000H 1FFFH

PIC16F876/877 0 1 1000H 1FFFH

PIC16F876/877 1 0 1F00H 1FFFH

Todos los modelos 1 1 NO PROTEGIDO

380 INICIO
Conclusión
 Hemos hablado acerca de lo que puedes hacer con los microcontroladores PIC y has visto
la descripción de algunos de ellos, desde el más básico, el PIC16C54, hasta los de la gama
media de la serie PIC16F87X. Entre ellos podrás considerar sus potencialidades a la hora
de hacer algún diseño.
 Has aprendido las instrucciones del lenguaje ensamblador y la forma en que puedes
desarrollar programas y grabarlos para realizar varias aplicaciones.
 Has visto cómo trabajan los módulos de circuitos incluidos en los diferentes
microcontroladores y cómo acceder a sus registros de configuración. Pudiste observar
también la importancia de estos módulos para el desarrollo de interfaces con el mundo
exterior.
 En el anexo 5 te presentamos algunos circuitos, notas de aplicación y direcciones de
Internet, los cuales te ayudarán a ampliar los conocimientos sobre los microcontroladores
PIC.
 Tu estudio siguiente lo podrás hacer en los microcontroladores PIC18FXXX, lenguaje C, y
los procesadores de señal dsPIC o TMS320.
 Finalmente, te deseamos el mejor de los éxitos, y si encuentras alguna sugerencia para
mejorar y promocionar este material, podrás escribir un correo electrónico a la dirección:
calvarezluz@cantv.net

INICIO
ANEXOS

 ANEXO 1. GLOSARIO
 ANEXO 2. EXPLICACIÓN DETALLADA DE LAS INSTRUCCIONES
 ANEXO 3. DIRECTIVAS DEL LENGUAJE ENSAMBLADOR
 ANEXO 4. REGISTROS Y BITS DE FUNCIONES ESPECIALES
 ANEXO 5. INTERFACES Y PROYECTOS CON
MICROCONTROLADORES PIC
 ANEXO 6. ACTUALIZACIÓN DEL PICSTART PLUS
 ANEXO 7. GRABACIÓN DE UN PROGRAMA EN LOS PIC16F87X

INICIO
383
INICIO
 Símbolo matemático que indica mayor o igual que.

 Símbolo matemático que indica menor o igual que.

<> Los valores que estén encerrados en estos símbolos, indican bits que

están asignados a un registro.

El valor que esté debajo de una línea continua, indica que está
negado o invertido lógicamente.

384 INICIO
Acceso: Entrada de datos a un lugar de memoria o puerto.

Actuador: Elemento de acción final en un sistema de control.

A/DC: Convertidor Analógico a digital.

ADD: Instrucción que ejecuta la operación suma o adición.

Analógico: Se dice a aquella señal o función que varía de forma


continua en el tiempo.

AND: Instrucción que ejecuta la operación lógica AND, la cual


tiene como resultado “0”, cuando cualquiera de sus entradas
es “0”.

385 INICIO
Aritmética: Operación matemática, normalmente se refiere a una
instrucción que ejecuta una suma, resta, incremento o
decremento.

Arquitectura: Estructura interna de un microcontrolador donde se ubica


sus elementos y la interconexión entre ellos.

ASCII: Se refiere a un formato internacional de caracteres, en los


que un código binario corresponde a una letra, número o
signo utilizado en un idioma. También corresponde a un
protocolo de comunicación entre varios dispositivos. El
protocolo ASCII ANSI X3 28-2.5-A4, corresponde a una
norma de comunicación industrial en los que varios
dispositivos se conectan a un par de cables.

Asincrónico: Que no está sincronizado con otra señal.

Atmel: Fabricante de semiconductores.

386 INICIO
B (b): Posición de un bit en un registro.

Bajo consumo: Que absorbe poca potencia.

Básica: Se refiere a la gama de los microcontroladores con


palabras de instrucción de 12 bits.

Bidireccional: Que puede transferir datos en las dos direcciones.

Bit: Es la mínima unidad de información. Puede valer “0” ó


“1”.

Booleano: Se refiere a la lógica o los elementos digitales.

Boole: Matemático que desarrolló el álgebra que lleva su


nombre y los postulados de lógica que se usa como
base para la elaboración de funciones digitales.

387 INICIO
Borrado: Acción de colocar los datos con valor “0”. En el caso de
las memorias EPROM, EEPROM y FLASH, la acción de borrar
significa colocar todos los datos en “1”.

BSAP: Se refiere a las siglas “Bristol Synchronous Asynchronous


Protocol”. Es un protocolo utilizado para el control y
supervisión de sistemas de control.

Bus: Líneas que agrupan dirección, datos o señales de control.

Byte: Octeto o agrupación de 8 bits.

388 INICIO
C: Lenguaje de programación de alto nivel. Es muy utilizado
para compilar programas a lenguaje de máquina.
CAN: Protocolo de comunicación serial utilizado en la industria.
Call: Instrucción que consiste en llamar a una rutina o
subprograma.
Capacitor: Condensador eléctrico.
Carry o C: Es el bit 0 del registro STATUS, que indica cuándo en una
operación de suma se lleva un acarreo, o en una resta se
lleva un débito.
Cero: Valor nulo.
Cext: Condensador externo.
Chip: Circuito integrado.
Ciclo: Período en el cual transcurre una instrucción.

CLEAR: Instrucción de borrado o puesta a cero de un dato.

389 INICIO
CLK: Reloj o señal de oscilación que define la frecuencia de
trabajo del microcontrolador.

CMOS: Tecnología digital de bajo consumo, basada en el uso de transistores


MOS complementarios (Complementary Metal Oxide Semiconductor).

CLKOUT: Señal de salida del reloj o CLK.

Comparador: Elemento que lee dos magnitudes y las compara.

Complemento: Obtención del valor opuesto.

Configuración: Efecto de establecer unas condiciones que definen algunas


funciones permanentes de un dispositivo.

Contador: Registro que efectúa la acción de contar.

Control: Organización de determinada información.

CPU: “Central Processor Unit” Unidad central de


Procesamiento. Microprocesador.

390 INICIO
D/AC: Convertidor Digital a Analógico.

Dallas: Fabricante de Semiconductores

Dato: Cualquier valor que puede leerse o escribirse en un registro


o memoria o puerto

DC: Corriente Directa. Acarreo decimal (Decimal Carry)

Decimal Carry: Acarreo decimal referido a un nibble. Corresponde al bit 1


del registro STATUS. Cuando en una operación suma (o
resta) se excede el valor 1111, se activa el Decimal Carry.

Decremento: Disminución en una unidad el valor de un dato específico.

Deshabilitar: Inhabilitar o inhibir las funciones de un elemento.

391 INICIO
Dirección: Valor numérico o etiqueta en donde se puede ubicar un
determinado dato o instrucción en una posición de memoria.

Disparador de
Schmitt: Elemento que incorpora a su entrada un detector de
histéresis, es decir que compara con dos valores, según si la
señal a detectar tiene pendiente positiva o negativa.

DRT: Temporizador interno que retarda la inicialización del


microcontrolador en aproximadamente 18 mseg.

392 INICIO
EEPROM: Memoria para lectura solamente, a la que se le puede grabar
con pulsos eléctricos. Esta memoria se puede usar para
guardar datos, que deben mantenerse, aun al quitar la
alimentación de la memoria.

Ejecución: Acción de realizar la instrucción o instrucciones de un


programa.

Embedded: Elemento dentro de otro, normalmente se refiere al


microcontrolador como un sistema dentro de un chip

Emulador: Elemento que imita al microcontrolador, y que posee los mismos


terminales que éste, y una conexión a la computadora.
Éste se inserta en el conector destinado al
microcontrolador en un prototipo, y mediante
la computadora se puede observar y corregir
el programa que esté en el sistema diseñado

393 INICIO
Entrada: Terminal de conexión cuya señal se dirige hacia un dispositivo.

Entrada-Salida: Terminales de conexión al microcontrolador que pueden


emplearse como entrada o salida.

EPROM: “Eraseble Programable Read Only Memory” Memoria de


sólo lectura, que puede ser borrada con luz ultravioleta,
y luego puede ser regrabada.

Escalamiento: Efecto de cambiar de escala a un valor.

Escribir: Almacenar un dato en una memoria, registro o puerto.

Escritura: Almacenamiento de un dato en una memoria, registro


o puerto.

EXOR: Instrucción que ejecuta la función lógica “o exclusivo”. Esta


instrucción definida para dos entradas tiene como resultado 0,
si las dos entradas son iguales. Tiene como resultado 1 si las
dos entradas son diferentes.

394 INICIO
y
F: Apuntador de direcciones de los registros de la memoria de
datos.

FIFO: De las siglas “First In First Out” (Primero entrado, primero


salido. Se refiere a las memorias cuyos datos van a una pila,
y el dato que se lee es el que entró de primero.

Flash: Memoria de programa que puede borrar grupos de datos por


medio de pulsos eléctricos.

FOSC: Frecuencia del oscilador del microcontrolador (reloj).

FSR: Registro apuntador de direcciones de la memoria de datos.

Gama: Grupo.

GOTO: Instrucción utilizada para cambiar la dirección de


ejecución del programa.

395 INICIO
e
Handbook: Manual del fabricante.
Harvard: Arquitectura que consiste en separar la memoria de programa
de la de datos.
Hitachi: Fabricante japonés de semiconductores.
Hz: Unidad de frecuencia que indica Hertz o ciclo por segundo.
I2C ó I2C: Protocolo de comunicación serial desarrollado por Philips. Este
protocolo permite comunicar varios dispositivos utilizando
únicamente dos líneas y el común.
I/O: Entrada/Salida.
Incremento: Aumenta en una unidad el valor de un dato específico.
IND: Registro de acceso indirecto, cuya dirección está dada
por el registro FSR.

396 INICIO
Inicialización: Acción y efecto de dar valores iniciales a un dispositivo.

Instrucción: Acción que se desea que ejecute una línea de un programa.

INTCON: Registro de control de interrupciones

Intel: Fabricante estadounidense de microprocesadores y otros


semiconductores.

Interfaz: Punto de enlace entre dos medios. Normalmente se aplica a las


entradas y salidas de una computadora con el medio.

Interrupción: Detención momentánea de un programa, debido al llamado de


un elemento que necesita ser atendido por medio de una
rutina.

IOR: Instrucción que ejecuta la función lógica OR (inclusivo).

397 INICIO
y
K: Prefijo que significa 1000. Letra que se utiliza para designar
a una constante.

K: Unidad de resistencia eléctrica equivalente a 1000 ohmios.

LCD: Pantalla de cristal líquido (Liquid Crystal Display).

Lectura: Obtención de un dato de una memoria, registro o puerto.

Leer: Acción y efecto de obtener un dato desde una memoria,


registro o puerto.

Literal: Valor constante o etiqueta.

Lógica: Que se relaciona con el álgebra de Boole o elementos


digitales. Sólo toma dos valores: “0” ó “1”.

LSB: Bit menos significativo o de menor peso.


(Least Significant bit).

398 INICIO
MCLR: Entrada de inicialización del dispositivo. Se activa con “0”. Este
terminal también tiene la funcion Vpp, que es la tensión de
programación els microcontrolador.
MCS: “Micro-Computer System”. Se refiere a un sistema realizado
con microcomputador e interfaces.
MCU: “Microcontroller Unit”. Se refiere a un microcontrolador.
Media: Se refiere a la gama de los microcontroladores que tienen
palabras de instrucción de 14 bits.
Memoria Memory: Elemento capaz de almacenar información (datos o programas).
Programming: Grabación o programación de una memoria.
MHz: Unidad de frecuencia equivalente a un millón de Hertz.
Microchip: Fabricante estadounidense de semiconductores.
Microcomputadora: Computadora pequeña, antes se refería así a un microcontrolador.
Microcontrolador: Dispositivo que está compuesto de un microprocesador,
memorias, puertos, temporizadores y algunos otros
elementos,que ejecuta una o más funciones
específicas de acuerdo a su programación y conexión.

399 INICIO
Microprocesador: Elemento que consta de una unidad de control, registros y
unidad de lógica y aritmética, capaz de realizar funciones de
procesamiento y cómputo.

MIPS: Millones de instrucciones por segundo, esto da una idea de la


velocidad de procesamiento de un microprocesador o
microcontrolador.

MODBUS: Protocolo industrial utilizado para el control de procesos.

MODEM: Se refiere al término “Modulador Demodulador”, y es un


dispositivo que se emplea para transmitir y recibir señales por
medio de la modulación y demodulación de la misma.

Motorola: Fabricante estadounidense de semiconductores y equipos de


comunicación.

MOVE: Instrucción que transfiere un dato de un lugar a otro.

MPLAB: Software de ambiente de desarrollo para los PIC.

MSb: Bit más significativo o de mayor peso. (More Significant bit).

mseg o ms: Unidad de tiempo que representa una milésima de segundo.

Mux: Multi-seleccionador o multiplexer, elemento que conmuta varias


señales.
400 INICIO
National
Semiconductor: Fabricante estadounidense de semiconductores.

NEC: Fabricante japonés de semiconductores.

Nibbles: Agrupación de 4 bits.

NMOS: Tecnología digital basada en transistores MOSFET canal N.

NOP: Instrucción que no ejecuta ninguna operación.

nSeg: Unidad de tiempo que representa una milmillonésima parte de


segundo.

401 INICIO
OPTION: Registro que configura el escalamiento del TMRO o el WDT.

OR: Función lógica cuyo resultado es “1”, cuando cualquiera de sus


entradas es “1”.

Oscilador: Circuito capaz de producir una señal cíclica a una frecuencia


estable.

OSC1/CLKIN: Es una de las conexiones para un cristal resonador, que fije


la frecuencia de oscilación. En el caso de no utilizar un
cristal resonador, ese terminal se podrá conectar a la
entrada de un oscilador externo.

OSC2/CLKOUT: Es la otra conexión para un cristal resonador. En modo RC,


ésta es la salida de oscilación que tiene un valor de ¼
de la frecuencia de OSC1, y determina el tiempo de
duración de un ciclo de instrucción.
OTP: Dispositivo programable una sola vez.

402 INICIO
PA: Puerto A (PORTA).

Paralelo: Se aplica a un conjunto de datos que se envían o reciben en


forma simultánea por un medio de transmisión que utiliza un
grupo de líneas.

PB: Puerto B. (PORTB).

PC: Contador de programa. Puerto C (PORTC).

PD: PD Bit 5 del registro STATUS que indica que el dispositivo


está en el modo “SLEEP” o Reposo. Puerto D (PORTD).

Perro Guardián: “Watchdog”, término con el que se le designa al temporizador


que hace la inicialización del microcontrolador, cuando detecta
una condición anormal.

Philips: Fabricante de semiconductores. Entre otras cosas es una


empresa considerada un gigante en productos electrónicos.

403 INICIO
PIC: “Peripheral Interface Controller” Sigla que identifica a los
microcontroladores de Microchip.

PICSTART PLUS: Programador para cualquier microcontrolador PIC.

Pila: “Stack”, registros donde se guardan las direcciones de retorno


de rutinas.

POR: “Power on reset”, circuito de inicialización por encendido.

PORT: Nombre con el que se designa a cada puerto, el cual es una


interfaz o registro de conexión externa del microcontrolador.

Programa: Secuencia y efecto de escribir instrucciones que realizan una


función específica.

Programador: Dispositivo que graba un programa en el microcontrolador.


Persona que desarrolla un programa.

404 INICIO
PROM: “Programble Read Only Memory” Memoria programable sólo
para lectura.
PS: Bit que se encuentra en el registro OPTION, y que está
relacionado con el escalamiento. El bit PSA (Bit 3 de
OPTION), es el bit de asignación al escalamiento, y los bits
PS0 - PS2 (Bits 0 al 2 de OPTION) están relacionado con el
valor del escalamiento.
Puerto: Interfaz o registro de conexión externa a un microcontrolador.
Puerto Serial: Interfaz que transmite o recibe datos en una sola línea. Los
datos se envían de manera secuencial en grupos de varios bits
y además se incluyen bits de control.
Pull up: Conexión a la fuente de alimentación positiva. Se refiere
normalmente a las resistencias que se conectan al voltaje de
alimentación (VDD).
PWM: “Pulse With Modulator” Modulador de ancho de pulsos.

405 INICIO
RA0 – RA4: Terminal de conexión del puerto A, el sufijo indica el bit que
corresponde a ese puerto.

RAM: “Random Access Memory” Memoria para escritura y lectura.

RB0 – RB7: Terminal de conexión del puerto B, el sufijo indica el bit que
corresponde a ese puerto.

RC: Resistencia - Condensador. Terminal de conexión del puerto C,


el sufijo indica el bit que corresponde a ese puerto.

Registro: Elemento electrónico que almacena un dato.

Reloj: Señal producida por un oscilador que se utiliza como referencia


del tiempo.

Reset: Inicialización. Efecto de dar condiciones iniciales a algo

406 INICIO
Resistencia: Elemento eléctrico que se opone parcialmente al paso de la
corriente eléctrica.

Resonante: Que tiene una frecuencia natural de oscilación.

RET, RETURN: Instrucción de retorno. Se aplica cuando una rutina finaliza.

REXT: Resistencia externa.

RISC: Conjunto reducido de instrucciones (Reduced Instruction Set).


Se utiliza en microprocesadores de alta velocidad.

Rodar: Desplazar los bits de un registro.

ROM: “Read Only Memory” Memoria sólo para lectura.

Rotación: Acción y efecto de desplazar los bits de un registro.

Rutina: Subprograma que se ejecuta en forma separada al


programa principal.

407 INICIO
Salida: Terminal de conexión cuya señal es generada por un dispositivo.

Salto: Cambio de dirección de la memoria de programa en forma no


secuencial.

Sensor: Elemento que detecta una variable física y la convierte en señal


eléctrica.

Serial: Se aplica a los datos que entran o salen uno por uno o bit por
bit en una sola línea de transmisión.

SGS-THOMSON: Fabricante europeo de semiconductores.

Siemens: Fabricante europeo de semiconductores.

408 INICIO
Sincrónico: Que ocurre a la par de otra señal guía.

Sleep: Dormir. Se emplea para decir que un dispositivo está en reposo,


y por tanto disminuye el consumo de potencia.

Stack: Pila de registros donde se almacenan las direcciones de retorno


de las rutinas.

STATUS: Registro donde se guarda los bits de control de un


microprocesador.

SUB: Instrucción que ejecuta la resta de dos valores.

Subrutina: Subprograma de una rutina.

SWAP: Instrucción que intercambia la posición de los nibles


(agrupación de 4 bits) de un registro.

409 INICIO
Tecnología Se refiere al tipo de semiconductor utilizado en los dispositivos
Dgital: lógicos. Destacan: TTL, CMOS, NMOS, ECL, PMOS, etc.

Temporizador: “Timer”, elemento que contabiliza el tiempo.

Terminal: Conexión física de un elemento.

Texas Fabricante estadounidense de semiconductores. Son muy


Instruments: conocidos los DSPs que fabrica esta compañía.

Tiempo Tiempo por el cual no se ejecutará una acción alguna, hasta que
de espera: éste se acabe.

Timer: Temporizador, elemento que contabiliza el tiempo.

TMRO: Temporizador 0. Contiene una longitud de 8 bits.

TO: Tiempo de espera (time out). TO corresponde al bit 4 del


registro STATUS, e indica si la ejecución del programa
de un microcontrolador, ha sido interrumpido por el WDT.

410 INICIO
TOCKI: Es el terminal que corresponde a la base de tiempo del
temporizador 0 (TMR0). Debe colocarse a Vss o VDD en el caso
de no utilizarse, para reducir el consumo de energía.

TOCS: Bit 5 del registro OPTION, que se utiliza como selección de la


fuente del temporizador 0.
TOSE: Bit 4 del registro OPTION, que se utiliza como selección de la
transición de la fuente del temporizador 0.
Toshiba: Fabricante japonés de semiconductores.
Transferencia: Mover un dato de un registro, memoria o puerto a otra posición.
Tres estados: Son salidas de dispositivos lógicos que tienen, además de los
estados “0” y “1”, un tercer estado que es el de alta
impedancia o desconexión. Esto es útil para la transferencia de
datos de forma bidireccional.
TRIS: Registro de programación de los puertos del microcontrolador.

411 INICIO
y

USART: Transmisor y receptor universal sincrónico o asincrónico.

VDD: Terminal que se conecta al voltaje de alimentación positiva en


circuitos MOS. En el caso de los microcontroladores PIC, la
tensión a aplicar en este terminal deberá estar comprendida
entre 3V y 6V.

Verify
Specification: Verificación de especificación.

VSS: Terminal que se conecta al voltaje de referencia o nulo (0V) en


circuitos electrónicos MOS.

Vpp: Tensión de programación

412 INICIO
a
W: Registro de trabajo de los microcontroladores PIC.

Watchdog: “Perro guardián”, término con el que se le designa al


temporizador que hace la inicialización del microcontrolador,
cuando detecta una condición anormal.

WDT: Temporizador “perro guardián” o “Watchdog timer”.

XOR: Instrucción que ejecuta la función lógica “o exclusivo”, la cual


consiste en obtener un “0” si las dos entradas son iguales, y un
“1” si éstas son diferentes.

Z: Bit 2 del registro STATUS que se activa cuando un resultado es


igual a cero.

Zero: Cero o valor nulo.

413 INICIO
414
INICIO
Conjunto de instrucciones de los PIC16C5X,
PIC16F5X y 12C5X (Gama Básica):

OPERACIONES ORIENTADAS A BYTES


Código En- Operadores Descripción Ciclos Código de Operación Bits STATUS Notas
samblador Msb Lsb afectados

ADDWF f,d Suma W con f 1 0001 11df ffff C, DC, Z 1,2,4


ANDWF f,d AND de W con f 1 0001 01df ffff Z 2,4
CLRF f Borra f 1 0000 011f ffff Z 4
CLRW - Borra W 1 0000 0100 0000 Z
COMF f,d Complementa f 1 0010 01df ffff Z
DECF f,d Decremento f 1 0000 11df ffff Z 2,4
DECFSZ f,d Decrementa f, salta si es 0 1(2) 0010 11df ffff 2,4
INCF f,d Incremento f 1 0010 10df ffff Z 2,4
INCFSZ f,d Incremento f, salta si es 0 1(2) 0011 11df ffff 2,4
IORWF f,d OR inclusivo de W con f 1 0001 00df ffff Z 2,4
MOVF f,d Mueve f 1 0010 00df ffff Z 2,4
MOVWF f Mueve W a f 1 0000 001f ffff 1,4
NOP - No operación 1 0000 0000 0000
RLF f,d Rotación izqu. a través del Carry 1 0011 01df ffff C 2,4
RRF f,d Rotación der. a través del Carry 1 0011 00df ffff C 2,4
SUBWF f,d Resta W de f 1 0000 10df ffff C,DC,Z 1,2,4
SWAPF f,d Intercambia nibles de f 1 0011 10df ffff 2,4
XORWF f,d OR exclusivo de W con f 1 0001 10df ffff Z 2,4

415 INICIO
OPERACIONES ORIENTADAS A BITS DE REGISTROS

Código Ensamblador Bits de


Código de Operación
Operadores Descripción Ciclos STATUS Notas
Msb Lsb afectados
BCF f,b Borra bit de f 1 0100 bbbf ffff 2,4
BSF f,b Pone un “1” a bit de f 1 0101 bbbf ffff 2,4
BTFSC f,b Salta si bit de f es “0” 1(2) 0110 bbbf ffff
BTFSS f,b Salta si bit de f es “1” 1(2) 0111 bbbf ffff
OPERACIONES CON LITERAL Y CONTROL
ANDLW K AND de K con W 1 1110 kkkk kkkk Z
CALL K Llamar a subrutina 2 1001 kkkk kkkk 1
CLRWDT K Borra temporizador WDT 1 0000 0000 0100 TOPD
GOTO K Salto incondicional 2 101k kkkk kkkk
IORLW K OR inclusivo de k con W 1 1101 kkkk kkkk Z
MOVLW K Mover valor k hacia W 1 1100 kkkk kkkk
OPTION K Mover valor k a OPTION 1 0000 0000 0010
RETLW K Retornar, asignar valor k a W 2 1000 kkkk kkkk
SLEEP - Habilita modo de bajo consum. 1 0000 0000 0011 TO, PD
TRIS f Mover valor de W a TRIS 1 0000 0000 0fff 3
XORLW k EXOR DE k con W 1 1111 kkkk kkkk Z

416 INICIO
Conjunto de instrucciones de los
PIC16CXXX, 16FXXX, 12C6XX, 12F6XX
Y 14CXXX (Gama media).

Código Ensamblador Bits de


Código de Operación
Operadores Descripción Ciclos STATUS Notas
Msb Lsb afectados
OPERAECIONES ORIENTADAS A BYTES
ADDWF f,d Suma W con f 1 00 0001 11df ffff C, DC, Z 1,2,4
ANDWF f,d AND de W con f 1 00 0001 01df ffff Z 2,4
CLRF f Borra f 1 00 0000 011f ffff Z 4
CLRW - Borra W 1 00 0000 0100 0000 Z
COMF f,d Complementa f 1 00 0010 01df ffff Z
DECF f,d Decremento f 1 00 0000 11df ffff Z 2,4
DECFSZ f,d Decrementa f, salta si es 0 1(2) 00 0010 11df ffff 2,4
INCF f,d Incremento f 1 00 0010 10df ffff Z 2,4
INCFSZ f,d Incremento f, salta si es 0 1(2) 00 0011 11df ffff 2,4
IORWF f,d OR inclusivo de W con f 1 00 0001 00df ffff Z 2,4
MOVF f,d Mueve f 1 00 0010 00df ffff Z 2,4
MOVWF f Mueve W a f 1 00 0000 001f ffff 1,4
NOP - No operación 1 00 0000 0000 0000
RLF f,d Rotación izq. a través del Carry 1 00 0011 01df ffff C 2,4
RRF f,d Rotación der. a través del Carry 1 00 0011 00df ffff C 2,4
SUBWF f,d Resta W de f 1 00 0000 10df ffff C,DC,Z 1,2,4
SWAPF f,d Intercambia nibles de f 1 00 0011 10df ffff 2,4
XORWF f,d OR exclusivo de W con f 1 00 0001 10df ffff Z 2,4

417 INICIO
OPERACIONES ORIENTADAS A BITS DE REGISTROS

Código Ensamblador Bits de


Código de Operación
Operadores Descripción Ciclos STATUS Notas
Msb Lsb afectados
BCF f,b Borra bit de f 1 01 00bb bfff ffff 1,2
BSF f,b Pone un “1” a bit de f 1 01 01bb bfff ffff 1,2
BTFSC f,b Salta si bit de f es “0” 1(2) 01 10bb bfff ffff 3
BTFSS f,b Salta si bit de f es “1” 1(2) 01 11bb bfff ffff 3
OPERACIONES CON LITERAL Y CONTROL
ADDLW K Suma K con W 1 11 111x kkkk kkkk C,DC,Z
ANDLW K AND de K con W 1 11 1001 kkkk kkkk Z
CALL K Llamar a subrutina 2 10 0kkk kkkk kkkk
GOTO K Salto incondicional 2 10 1kkk kkkk kkkk
IORLW K OR inclusivo de k con W 1 11 1000 kkkk kkkk Z
MOVLW K Mover valor k hacia W 1 11 00xx kkkk kkkk
RETRE - Retorno de interrupción 2 00 0000 0000 1001
RETLW K Retornar, asignar valor k a W 2 11 01xx kkkk kkkk
SLEEP - Habilita modo de bajo consum. 1 00 0000 0110 0011 TO, PD
SUBLW K Restar W del valor K 1 11 110k kkkk kkkk C,DC,Z
XORLW k EXOR de k con W 1 11 1010 kkkk kkkk Z

418 INICIO
ADDLW
Suma valor literal con W

Nota: Esta instrucción no está incluida en los PIC de la gama básica


Código Ensamblador: (Etiqueta) ADDLW K
Operadores: 0 ≤ K ≤ 255
Operación: (W) + (K)  (W)
Bits de estado que se afectan: C, DC, Z
Descripción: Se suma el contenido del
registro W con el valor “K”
El resultado se coloca en W.

Ejemplo: ADDLW 0 x 15
Antes de la Instrucción
W = 0x10
Después de la Instrucción
W = 0x25

419 INICIO
ADDWF Suma W y “f”

Código Ensamblador: (Etiqueta) ADDWF f,d


Operadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)
d  (0,1)
Operación: (W) + (f)  (dest)
Bits de estado que se afectan: C, DC, Z
Descripción: Suma los contenidos de los
registros W y “f”
Si “d” es 0, el resultado se coloca en
W, si “d” es 1, se coloca en “f”

Ejemplo: ADDWF FSR, 0


Antes de la Instrucción
W = 0x17
FSR = 0xC2
Después de la Instrucción
W = 0xD9
FSR = 0xC2

420 INICIO
And del valor
ANDLW literal con W

Código Ensamblador: (Etiqueta) ANDLW k


Operadores: 0 ≤ K ≤ 255
Operación: (W). AND.(K)  (W)
Bits de estado que se afectan: Z
Descripción: Se realiza la función lógica AND entre
los bits del registro W y el valor “K”.
El resultado se coloca en W.

Ejemplo: ANDLW 0x5F


Antes de la Instrucción
W = 0xA3
Después de la Instrucción
W = 0x03

421 INICIO
ANDWF AND W con “f”

Código Ensamblador: (Etiqueta) ANDWF f,d


Operadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)
d  (0,1)
Operación: (W).AND. (f)  (dest)
Bits de estado que se afectan: Z
Descripción: Se ejecuta la función lógica AND entre
los bits del registro W y los bits del
registro “f”
Si “d” es 0, el resultado se coloca en
W, si “d” es 1, se coloca en “f”

Ejemplo: ANDWF FSR, 1


Antes de la Instrucción
W = 0x17
FSR = 0xC2
Después de la Instrucción
W = 0x17
FSR = 0x02

422 INICIO
BCF Borra bit en “f”

Código Ensamblador: (Etiqueta) BCF f,b


Operadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)
0 ≤ b ≤ 7
Operación: 0  (f<b>)
Bits de estado que se afectan: Ninguno
Descripción: Se coloca en 0 bit “b” en registro “f”

Ejemplo: BCF FLAG_REG, 7


Antes de la Instrucción
FLAG_REG = =0xC7
Después de la Instrucción
FLAG_REG = 0x47

423 INICIO
BSF Establece en 1 bit en “f”

Código Ensamblador: (Etiqueta) BSF f,b


Operadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)
0 ≤ b ≤ 7
Operación: 1  (f<b>)
Bits de estado que se afectan: Ninguno
Descripción: Se coloca en 1 bit “b” del registro “f”

Ejemplo: BSF FLAG_REG, 7


Antes de la Instrucción
FLAG_REG = =0x0A
Después de la Instrucción
FLAG_REG = 0x8A

424 INICIO
BTFSC Prueba bit en
salta si es cero
f,

Código Ensamblador: (Etiqueta) BTFSC f,d


Operadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)
0 ≤ b ≤ 7
Operación: Salta si (f<b>) = 0
Bits de estado que se afectan: Ninguno
Descripción: Si bit “b” en el registro “f” es 0, entonces
se salta la siguiente instrucción, la cual
se había preparado para ejecutar, pero se
descarta y se ejecuta un NOP, lo cual hace
que la instrucción dure dos ciclos. Si bit “b”
en “f” es 1, entonces la instrucción actual
se ejecuta en un ciclo, luego se ejecuta la
siguiente instrucción
Ejemplo: AQUÍ BTFSC FLAG, 1
FALSO GOTO COD_PROCESO
CIERTO
Antes de la Instrucción
PC = dirección (AQUÍ)
Después de la Instrucción
Si FLAG<1> = 0,
PC = dirección (CIERTO); Ejecución en dos ciclos
Si FLAG<1> = 1,
PC = dirección (FALSO); Ejecución en un ciclo

425 INICIO
BTFSS Prueba bit en f, salta si es 1

Código Ensamblador: (Etiqueta) BTFSS f,d


Operadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)
0 ≤ b ≤ 7
Operación: Salta si (f<b>) = 1
Bits de estado que se afectan: Ninguno
Descripción: Si bit “b” en el registro “f” es 1, entonces
se salta la siguiente instrucción, la cual
se había preparado para ejecutar, pero se
descarta y se ejecuta un NOP, lo cual hace
que la instrucción dure dos ciclos. Si bit “b”
en “f” es 0, entonces la instrucción actual
se ejecuta en un ciclo, luego se ejecuta la
siguiente instrucción

Ejemplo: AQUÍ BTFSS FLAG, 1


FALSO GOTO COD_PROCESO
CIERTO
Antes de la Instrucción
PC = dirección (AQUÍ)
Después de la Instrucción
Si FLAG<1> = 0,
PC = dirección (FALSO); Ejecución en un ciclo
Si FLAG<1> = 1,
PC = dirección (CIERTO); Ejecución en dos ciclos

426 INICIO
CALL Llamar a subrutina

Código Ensamblador: (Etiqueta) CALL K


Operadores: 0 ≤ K ≤ 255
Operación: (PC) +1  Tope de la pila (Stack);
K  PC<7:0>;
(STATUS <6:5>)  PC <10:9>;
0  PC <8>
Bits de estado que se afectan: Ninguno
Descripción: Llama a subrutina. Primero la dirección de
retorno (PC+1) se coloca en la pila (Stack).
Los bits 8 de “K” se colocan en los bits
<7:0> del PC. Los bits <10:9> del PC toman
los valores de los bits <6:5> del STATUS.
El bit 8 del PC es colocado en 0. Esta
instrucción dura dos ciclos.

Ejemplo: AQUÍ CALL ALLA

Antes de la Instrucción
PC = dirección (AQUÍ)
Después de la Instrucción
PC = dirección (ALLA)
TOS = dirección (AQUÍ + 1)

427 INICIO
CLRF Borra “f”

Código Ensamblador: (Etiqueta) CLRF f


Operadores: 0 ≤ f ≤ 31 (Gama básica)
0 ≤ f ≤ 127 (Gama media)
Operación: 00h  (f);
1  Z
Bits de estado que se afectan: Z
Descripción: El contenido del registro “f” es borrado
y el bit Z es puesto en 1

Ejemplo: CLRF FLAG_REG


Antes de la Instrucción
FLAG_REG = =0x5A
Después de la Instrucción
FLAG_REG = 0x00
z = 1

428 INICIO
Código Ensamblador: (Etiqueta) CLRW
Operadores: Ninguno
Operación: 00h  (W);
1  Z
Bits de estado que se afectan: Z
Descripción: El registro W es borrado y el bit Z es
puesto en 1.

Ejemplo: CLRW
Antes de la Instrucción
W = 0x5A
Después de la Instrucción
W = 0x00
z = 1

429 INICIO
CLRWDT
Borra temporizador
perro guardián (WDT)

Código Ensamblador: (Etiqueta) CLRWDT


Operadores: Ninguno
Operación: 00h  WDT;
0  Escalamiento WDT (si es asignado
a éste);
1  TO;
1  PD
Bits de estado que se afectan: TO, PD
Descripción: Borra el registro WDT y también al
escalamiento, si éste es asignado al
WDT y no al temporizador Timer0.
Los bits de estado TO y PD se ponen en 1

Ejemplo: CLRWDT
Antes de la Instrucción
Contador WDT = ?
Después de la Instrucción
Contador WDT = 0x00
Escalamiento de WDT = 0
TO = 1
PD = 1

430 INICIO
Complementa “f”

Código Ensamblador: (Etiqueta) COMF f,d


Operadores: 0  f  31 (Gama básica)
0  f  127 (Gama media)
d  0,1
Operación: (f) - 1  (dest)
Bits de estado que se afectan: Z
Descripción: Se complementa el contenido del registro
“f”. Si “d” es 0, el resultado se coloca en
W, si “d” es 1, el resultado se coloca en
“f”.

Ejemplo: COMF REG1, 0


Antes de la Instrucción
REG1 = 0x13
Después de la Instrucción
REG1 = 0x13
W = 0xEC

431 INICIO
Decremento de “f”

Código Ensamblador: (Etiqueta) DECF f,d


Operadores: 0  f  31 (Gama básica)
0  f  127 (Gama media)
d  0,1
Operación: (f) - 1  (dest)
Bits de estado que se afectan: Z
Descripción: Decrementa el contenido del registro “f”.
Si “d” es 0, el resultado se coloca en W,
si “d” es 1, el resultado se coloca en “f”.

Ejemplo: DECF CNT, 1


Antes de la Instrucción
CNT = 0x01
Z = 0
Después de la Instrucción
CNT = 0x00
Z = 1

432 INICIO
Decremento de “f”,
salta si es 0

Código Ensamblador: (Etiqueta) DECFSZ f,d


Operadores: 0  f  31 (Gama básica)
0  f  127 (Gama media)
d  0,1
Operación: (f) - 1  d; salta si el resultado = 0
Bits de estado que se afectan: Ninguno
Descripción: Decrementa el contenido del registro “f”.
Si “d” es 0, el resultado se coloca en W,
si “d” es 1, el resultado se coloca en “f”.
Si el resultado es 0, entones se salta la siguiente
instrucción, la cual se había preparado para ejecutar,
pero se descartta y se ejecuta un NOP, lo cual
hace que la instrucción dure dos ciclos.
Si el resultado es diferente de cero, en un ciclo, y luego
entonces la instrucción actual se ejecuta
se ejecuta la siguiente instrucción.
Ejemplo: AQUI DECFSZ CNT, 1
GOTO LAZO
CONTI 

Antes de la Instrucción
PC = dirección (AQUÍ)
Después de la Instrucción
CNT = CNT - 1;
Si CNT = 0,
PC = dirección (CONTI); Ejecución en dos ciclos
Si CNT ‡ 0,
PC = dirección (AQUÍ+1); Ejecución en un ciclo
433 INICIO
Salto Incondicional

Código Ensamblador: (Etiqueta) GOTO k


Operadores gama básica: 0  k  512
Operadores gama media: 0  k  2047
Operación gama básica: k  PC <8:0>
(STATUS <6:5>  PC <10:9>
Operación gama media: k  PC <10:0>
(PCLATCH <4:3>)  PC <12:11>
Bits de estado que se afectan: Ninguno
Descripción: Salto incondicional. Los 9 bits de “k” se
colocan en los bits <8:0> del PC. Los
bits <10:9> del PC toman los valores de
los bits <6:5> del registro STATUS.
Esta instrucción dura dos ciclos

Ejemplo: GOTO ALLA

Después de la Instrucción
PC = dirección (ALLA)

434 INICIO
Incremento de “f”

Código Ensamblador: (Etiqueta) INCF f,d


Operadores: 0  f  31 (Gama básica)
0  f  127 (Gama media)
d  0,1
Operación: (f) + 1  (dest)
Bits de estado que se afectan: Z
Descripción: Se incrementa el contenido de “f”
Si “d” es 0, el resultado se coloca
en W, si “d” es 1, el resultado se coloca
en “f”

Ejemplo: INCF CNT, 1

Antes de la Instrucción
CNT = 0xFF
Z = 0
Después de la Instrucción
CNT = 0x00
Z = 1

435 INICIO
Incremento de “f”
salta si es 0

Código Ensamblador: (Etiqueta) INCFSZ f,d


Operadores: 0 f  31 (Gama básica)
0  f  127 (Gama media)
d  0,1
Operación: (f) + 1  (dest), salta si el resultado = 0
Bits de estado afectados: Ninguno
Descripción: Incrementa el contenido del registro “f”.
Si “d” es 0, el resultado se coloca en W,
si “d” es 1, el resultado se coloca en “f”.
Si el resultado es 0, entones se salta la siguiente
instrucción, la cual se había preparado para ejecutar,
pero se descarta y se ejecuta un NOP, lo cual hace
que la instrucción dure dos ciclos. Si el resultado es
diferente de cero, entonces la instrucción actual se
ejecuta en un ciclo, y luego se ejecuta la siguiente
instrucción.

Ejemplo: AQUI INCFSZ CNT, 1


GOTO LAZO
CONTI 

Antes de la Instrucción
PC = dirección (AQUÍ)
Después de la Instrucción
CNT = CNT - 1;
Si CNT = 0,
PC = dirección (CONTI); Ejecución en dos ciclos
Si CNT ‡ 0,
PC = dirección (AQUÍ+1); Ejecución en un ciclo

436 INICIO
OR Inclusivo de
valor literal con W

Código Ensamblador: (Etiqueta) IORLW k


Operadores: 0 ≤ K ≤ 255
Operación: (W).OR.(K)  (W);
Bits de estado que se afectan: Z
Descripción: Se ejecuta la función lógica OR
(inclusivo) entre los bits del registro W
y los bits del valor literal “k”. El
resultado se coloca en W.

Ejemplo: IORLWF 0x35


Antes de la Instrucción
W = 0x9A
Después de la Instrucción
W = 0xBF
Z = 0

437 INICIO
IORWF OR Inclusivo de W
con “f”
Código Ensamblador: (Etiqueta) IORWF f,d
Operadores: 0 f  31 (Gama básica)
0  f  127 (Gama media)
d  0,1
Operación: (W).OR.(F)  (dest),
Bits de estado que se afectan: Z
Descripción: Se ejecuta la función lógica OR
(inclusivo) entre los bits del registro W
y los bits del registro “f”.
Si “d” es 0, el resultado se coloca en W,
si “d” es 1, el resultado se coloca en “f”.
Ejemplo: IORWF RESULT, 0
Antes de la Instrucción
RESULT = 0x13
W = 0x91
Después de la Instrucción
RESULT = 0x13
W = 0xBF
Z = 0

438 INICIO
MOVF Mueve “f”
Código Ensamblador: (Etiqueta) MOVF f,d
Operadores: 0  f  31 (Gama básica)
0  f  127 (Gama media)
d  0,1
Operación: (f)  (dest)
Bits de estado que se afectan: Z
Descripción: El valor de “f” se mueve hacia “d”. Si “d”
es 0, el valor se coloca en W, si “d” es 1,
el valor se coloca en “f”. Esta instrucción
es útil para saber si el contenido de “f” es
cero, ya que se afecta al bit Z.

Ejemplo: MOVF FSR, 0

Después de la Instrucción
W = Valor en el registro FSR

439 INICIO
MOVLW Mueve valor literal a W

Código Ensamblador: (Etiqueta) MOVLW k

Operadores: 0 ≤ K ≤ 255

Operación: K  (W);

Bits de estado que se afectan: Ninguno

Descripción: Se carga el valor de “k” en el

registro W.

Ejemplo: MOVLW 0x5A

Después de la Instrucción

W = 0x5A

440 INICIO
MOVWF Mueve W a “f”

Código Ensamblador: (Etiqueta) MOVWF f


Operadores: 0  f  31 (Gama básica)
0  f  127 (Gama media)
Operación: (W)  (f)
Bits de estado que se afectan: Ninguno
Descripción: Mueve el dato desde W a “f”

Ejemplo: MOVWF TEMP_REG

Antes de la Instrucción
TEMP_REG = 0xFF
W = 0x4F

Después de la Instrucción
TEMP_REG = 0x4F
W = 0x4F

441 INICIO
NO
NOP No operación

Código Ensamblador: (Etiqueta) NOP


Operadores: Ninguno
Operación: No operación
Bits de estado que se afectan: Ninguno
Descripción: No hay operación.
Simplemente se ejecuta un ciclo,
sin afectar nada.

Ejemplo: NOP

442 INICIO
OPTION Carga el registro OPTION

Nota: Esta instrucción no se recomienda utilizar en los PIC de la gama media.


Código Ensamblador: (Etiqueta) OPTION
Operadores: Ninguno)
Operación: (W)  OPTION
Bits de estado que se afectan: Ninguno
Descripción: El contenido de W es cargado al Registro
OPTION.

Ejemplo: OPTION

Antes de la Instrucción
W = 0x07
Después de la Instrucción
OPTION = 0x07

443 INICIO
RETFIE Retorno de Interrupción

Nota: Esta instrucción no está incluida en los PIC de la Gama Básica


Código Ensamblador: (Etiqueta) RETFIE
Operadores: Ninguno)
Operación: TOS  PC
Bits de estado que se afectan: 1  GIE
Descripción: Retorno de una Interrupción. El valor del
tope de la pila (TOS) es cargado en el
contador de programa (PC).
Las interrupciones se habilitan al poner
en “1” el bit de habilitación global de
interrupciones (GIE). Este bit se encuentra
ubicado en el registro INTCON (bit 7).
Esta instrucción dura dos ciclos.
Ejemplo: RETFIE

Después de la Instrucción
PIC = TOS
GIE = 1

444 INICIO
RETURN Retorno de Interrupción

Nota: Esta instrucción no está incluida en los PIC de la Gama Básica

Código Ensamblador: (Etiqueta) RETURN


Operadores: Ninguno)
Operación: TOS  PC
Bits de estado que se afectan: Ninguno
Descripción: Retorno de una subrutina. El valor del
tope de la pila (TOS) es cargado en el
contador de programa (PC).
Esta instrucción dura dos ciclos.

Ejemplo: RETURN

Después de la Instrucción
PC = TOS

445 INICIO
RETLW Retorno con valor literal en W

Código Ensamblador: (Etiqueta) RETLW K


Operadores: 0  K  255
Operación: K  (W)
TOS  PC
Bits de estado afectados: Ninguno
Descripción: El registro W se carga con el valor del literal “k”. El
contador de programa PC se carga con el tope de la
pila (STACK, dirección de retorno). Esta instrucción
es útil para convertir valores por medio de una tabla
de equivalencia, véase ejemplo. Esta instrucción dura
dos ciclos.
Ejemplo: CALL TABLA ;W contiene tabla de valores de la
 ;conversión. Después de ejecutar la
 ;rutina, W tendrá el valor convertido

TABLA ADDWF PCL ;W = desplazamiento
RETLW k0 ;Comienza tabla
RETLW k1

RETLW kn ;Final de la tabla
Antes de la Instrucción
W = 0x07
Después de la Instrucción
W = valor de k7

446 INICIO
Rodar “f” a la Izquierda a
RLF través del Carry

Código Ensamblador: (Etiqueta) RLF f, d


Operadores: 0  f  31 (Gama básica)
0  f  127 (Gama media)
d  [0,1]
Operación: Ver descripción abajo
Bits de estado que se afectan: C
Descripción: Los bits de “f” son rodeados (desplazados)
en un bit hacia la izquierda, pasando por el
bit Carry. El bit 0 de “f”, forma el valor
anterior del bit 7 de “f”.
Si “d” es 0, el resultado se coloca en W,
si “d” es 1, el resultado se coloca en “f”.
Ejemplo: RLF REG1, 0

Antes de la Instrucción
REG1 = 1110 0110
C = 0
Después de la Instrucción
REG1 = 1110 0110
W = 1100 1100
C = 1

447 INICIO
RRF Rodar “f” a la Derecha a
través del Carry

Código Ensamblador: (Etiqueta) RRF f, d


Operadores: 0  f  31 (Gama básica)
0  f  127 (Gama media)
d  [0,1]
Operación: Ver descripción abajo
Bits de estado que se afectan: C
Descripción: Los bits de “f” son rodeados (desplazados)
en un bit hacia la derecha, pasando por el
bit Carry. El bit 7 de “f”, toma el valor
anterior del bit Carry, y el bit Carry
toma el valor anterior del bit 0 de “f”
Si “d” es 0, el resultado se coloca en W,
si “d” es 1, el resultado se coloca en “f”.

Ejemplo: RRF REG1, 0


Antes de la Instrucción
REG1 = 1110 0110
C = 0
Después de la Instrucción
REG1 = 1110 0110
W = 0111 0011
C = 0
448 INICIO
SLEEP Entra en el modo de reposo

Código Ensamblador: (Etiqueta) SLEEP


Operadores: Ninguno
Operación: 00h  WDT
0  Escalamiento del WDT;
1  TO
0  PD
Bits de estado que se afectan: TO, PD
Descripción: Se coloca en 1 el bit TO del registro de
estado. Los bits de estado de: potencia
baja. El WDT y el escalamiento se colocan
en 0.
El procesador se coloca en estado
de reposo (SLEEP), el oscilador se
detiene y el consumo es mínimo.

Ejemplo: SLEEP

449 INICIO
Resta W de Valor Literal
Nota: Esta instrucción no está incluida en los PIC de la Gama Básica

Código Ensamblador: (Etiqueta) SUBLW K


Operadores: 0 ≤ K ≤ 255
Operación: K - (W)  (W)
Bits de estado que se afectan: C, DC, Z
Descripción: Se resta el contenido de W con el de
los 8 bits de k (en complemento a 2).
El resultado se coloca en W
Ejemplo 1: SUBLW 0x02
Antes de la Instrucción
W = 1
C = ?
Después de la Instrucción
W = 1
C = 1; el resultado es positivo
Ejemplo 2: Antes de la Instrucción
W = 2
C = ?
Después de la Instrucción
W = 0
C = 1; el resultado es 0

Ejemplo 3: Antes de la Instrucción


W = 3
C = ?
Después de la Instrucción
W = FF
C = 0; el resultado es negativo
450 INICIO
Resta W de f

Código Ensamblador: (Etiqueta) SUBWF f, d


Operadores: 0  f  31 (Gama básica)
0  f  127 (Gama media)
d  [0,1]
Operación: (f) - (W)  (dest)
Bits de estado que se afectan: C, DC, Z
Descripción: Se resta el contenido de W con el del
registro “f” (en complemento a 2).
Si “d” es 0, el resultado se coloca en W
Si “d” es 1, el resultado se coloca en “f”
Ejemplo 1: SUBWF REG, 1
Antes de la Instrucción
REG1 = 3, W = 2, C = ?
Después de la Instrucción
REG1 = 1, W = 2, C = 1; el resultado es positivo
Ejemplo 2: Antes de la Instrucción
REG1 = 2, W = 2, C = ?
Después de la Instrucción
REG1 = 0, W = 2, C = 1; el resultado es 0

Ejemplo 3: Antes de la Instrucción


REG1 = 1, W = 2, C = ?
Después de la Instrucción
REG1 = FF, W = 2, C = 1; el resultado es negativo

451 INICIO
Intercambio de Nibles in “f”

Código Ensamblador: (Etiqueta) SWAPF f, d


Operadores: 0  f  31 (Gama básica)
0  f  127 (Gama media)
d  [0,1]
Operación: (f<3:0>)  (dest<7:4>)
(f<7:4>)  (dest<3:0>)
Bits de estado que se afectan: Ninguno
Descripción: Los nibles (grupo de 4 bits) superiores e
inferiores de “f” son intercambiados
Si “d” es 0, el resultado se coloca en W
Si “d” es 1, el resultado se coloca en f.
Ejemplo: SWAPF REG1, 0

Antes de la Instrucción
REG1 = 0xA5
Después de la Instrucción
REG1 = 0xA5
W = 0x5A
452 INICIO
Carga valor al registro TRIS con W

Nota: Esta instrucción no se recomienda utilizar en los PIC de la gama media.


Código Ensamblador: (Etiqueta) TRIS f
Operadores: f = 5, 6 ó 7
Operación: (W)  TRIS registro f
Bits de estado que se afectan: Ninguno
Descripción: El registro TRIS “f” (f = 5, 6, ó 7) toma
el valor del contenido de W. El registro
TRIS es el de programación de los
puertos como entrada o salida

Ejemplo: TRIS PORTA

Antes de la Instrucción
W = 0xA5
Después de la Instrucción
TRISA = 0xA5
453 INICIO
OR Exclusivo valor literal con W

Código Ensamblador: (Etiqueta) XORLW K


Operadores: 0 ≤ K ≤ 255
Operación: (W).XOR.K  (W)
Bits de estado que se afectan: Z
Descripción: Se ejecuta la operación lógica OR
Exclusivo entre el contenido W y el
valor literal “k”. El resultado se
guarda en W.

Ejemplo: XORLW 0xAF


Antes de la Instrucción
W = 0xB5
Después de la Instrucción
W = 0x1a

454 INICIO
OR Exclusivo de W con “f”

Código Ensamblador: (Etiqueta) XORWF f, d


Operadores: 0  f  31 (Gama básica)
0  f  127 (Gama media)
d  [0,1]
Operación: (W).XOR.(f)  (dest)
Bits de estado que se afectan: Z
Descripción: Se ejecuta la operación lógica OR
Exclusivo del contenido con el contenido
del registro “f”.
Si “d” es 0, el resultado se coloca en W
Si “d” es 1, el resultado se coloca en “f”.
Ejemplo: XORWF REG1, 0

Antes de la Instrucción
REG = 0xAF (B’10101111)
W = 0xB5 (B’10110101)
Después de la Instrucción
REG = 0x1A (B’00011010)
W = 0xB5 (B’10110101)
455 INICIO
456
INICIO
El lenguaje ensamblador provee una plataforma para desarrollar los códigos
de los programas en los microcontroladores. En este anexo se expondrá
una explicación acerca de las opciones de comandos y las directivas que
ofrece este lenguaje.
En el momento en el que te dispones a ensamblar un programa editado, en
el MPLAB tendrás acceso a una ventana, tal como la que se muestra en la
siguiente página. Allí podrás establecer una serie de comandos de opción
para que tengas la posibilidad de generar o no diferentes archivos que
provendrán de tu archivo editado o archivo fuente, el cual deberá tener
un nombre y la extensión “.asm”. Por ejemplo, si el archivo que editaste
tiene como nombre “miprog.asm”, entonces podrás generar los siguientes
archivos:
• miprog.lst, el cual te muestra una lista de los códigos y símbolos
generados.
• miprog.err, el cual te muestra una lista de los errores.
• miprog.hex. Este archivo es el que contiene los códigos del programa en
hexadecimal y es el que vas a grabar en el microcontrolador.
• miprog.cod. Este archivo te muestra los símbolos y la depuración.
• miprog.hxl o .hxh, el cual separa los bytes del archivo hexadecimal.

457 INICIO
Opciones de las líneas
de comando
Para ensamblar un programa en el MPLAB seleccionas “Project” en el meú principal y
luego “Build Node”, tendrás acceso a la ventana con las opciones de las líneas de
comando, tal como se muestra en la figura de abajo. En la siguiente página se
explica el significado de estos comandos que se establecerán los archivos generados.

458 INICIO
Descripción de las opciones

Opción Por defecto Descripción


/a INHX8M Establece el formato del archivo .hex
/c On Habilita/deshabilita la sensitividad del caso
/d Ninguno Define símbolo: /dDebug /dMax=5 /dString=“abc”
/e On Habilita/Deshabilita la generación del archivo de error
/l On Habilita/Deshabilita la generación del archivo de listado
/m On Habilita/Deshabilita la expansión macro
/o On Habilita/Deshabilita la generación del archivo .obj
/p Ninguno Selecciona el tipo de microcontrolador
/q Off Habilita/Deshabilita el modo de salida de pantalla
/r Hexadecimal Selecciona el tipo de formato numérico
/t 8 Coloca el número de espacios por Tabulación
/w 0 Selecciona los mensajes: 0 = todos, 1 = errores y advertencias
2 = solamente errores
/x Off Habilita/Deshabilita la generación de la tabla de referencia

459 INICIO
Te recordamos que las directivas del lenguaje ensamblador son comandos que aparecen
en el lenguaje que tú editas, pero que no se convierten en códigos del programa del
microcontrolador. Ellas se utilizan para controlar la compilación del programa que vas a
utilizar en el microcontrolador, es decir, dónde vas a colocar las direcciones de los
datos según su nombre, en cuál línea comenzará una parte del programa, dónde termina
el programa, cuáles son las entradas y salidas, y otras especificaciones más.

Las directivas del ensamblador se clasifican en:

•Directivas de Control, que colocan secciones condicionales en el código ensamblado.

•Directivas de Datos, que asignan nombres a posiciones de memoria.

•Directivas de Listado, que controlan el archivo de listado (.lst).

•Directivas de macro, que controlan un grupo de comandos.

A continuación te mostraremos una tabla de las directivas que puedes utilizar en el


lenguaje ensamblador.
460 INICIO
Directiva Descripción Sintaxis Ejemplo
_ _BADRAM Especifica localidades inválidas en la RAM _ _badram <exp> _ _badram 87-89,91

CBLOCK Define un bloque de constantes, la cblock[<exp>] cblock 0x20


directiva ENDC debe colocarse al final <etiq> <,etiq> nomb1, nomb2...
ENDC endc endc

_ _CONFIG Especifica bits de configuración. Ver p 4-3 _ _config<exp> _ _config H’FFFF’

CONSTANT Declara constante de símbolo constant <etiq> constant long=125

DATA Crea Datos numéricos y de texto <etiq> data <exp> data 1, 2, externa

DB Declara datos de un Byte <etiq> db <exp> db ‘t’, 0xd, ‘e’, 3

DE Define datos en EEPROM <etiq> de <exp> de “miprog”, 0

#DEFINE Define etiqueta de sustitución de texto #define<nomb> #define long 20


[<tex>]

DT Define tabla <etiq> dt <exp> dt val1, val2

DW Declara datos de una palabra <etiq> dw <exp> dw 27, W27, W29

ELSE Comienza alternativa después de un IF else else


IF es un si condicional, ELSE = sino dw frio

END Finaliza bloque de programa end end

461 INICIO
Directiva Descripción Sintaxis Ejemplo
ENDC Finaliza un bloque de constantes endc endc ;ver CBLOCK

ENDIF Finaliza un bloque condicional IF endif endif ;ver IF

ENDM Finaliza la definición de una macro endm endm ;ver MACRO

ENDW Finaliza un lazo condicional While endw endw ;ver WHILE


Loop
EQU Define una constante <etiq> equ <exp> portb equ 0x5

ERROR Crea un mensaje de error error “<texto>” error “fuera escala”

ERRORLEVEL Especifica los tipos de mensajes de errorlevel errorlevel 1, -212


error en los archivos .lst y .err 0|1|2<+|-><num>

EXITM Sale de una macro exitm exitm ;ver MACRO

EXPAND Escribe las macros en el archivo .lst expand expand

FILL Llena memoria <etiq> fill <exp> fill 0x100, 5

_ _IDLOCS Especifica localizaciones ID _ _idlocs <exp> idlocs 1234

462 INICIO
Directiva Descripción Sintaxis Ejemplo
IF Comienza un bloque condicional. Se pregunta if <exp> if temper > 100
por una condición, si ésta es cierta se ejecuta <instruc> dw caliente
la acción, sino se ejecuta la línea siguiente. Si <else <exp>> else
ELSE
en esa línea aparece ELSE entonces se asigna
<instruc> dw frio
la acción que le sigue. El bloque IF se cierra
ENDIF con ENDIF endif endif

IFDEF Se ejecuta si los símbolos se han definido ifdef <etiq> ifndef cierto
<instruc> dw no_cierto
IFNDEF Se ejecuta si los símbolos no se han definido endif endif

#INCLUDE Incluye un archivo fuente adicional. Ver p2- include <arch> include p16f84.inc
15
LIST Lista opciones. Ver tabla de opciones A3-3 list |<lista>| list p=16c71,r=dec

LOCAL Declara variable como macro local. Ver macro local <etiq> local

MACRO Declara definición de macro. Una macro son <etiq> macro leer macro d1, d2
un conjunto de instrucciones que pueden ser <instruc> movlw d1...
insertadas como código fuente. endm endm
ENDM
_ _MAXRAM Especifica máxima dirección de la RAM _ _maxram<exp> _ _maxram 0x0bf

MESSG Crea un mensaje definido por el usuario messg “<text>” messg “error 1”

NOEXPAND Elimina macros del archivo .lst noexpand noexpand

463 INICIO
Directiva Descripción Sintaxis Ejemplo
NOLIST Elimina lista de salida nolist nolist

ORG Especifica dirección de origen <etiq> org <exp> org 50 ;ver p2-18

PAGE Inserta salto de página en la lista page page

PROCESSOR Especifica el tipo de microcontrolador processor<tipo> processor 16f84

RADIX Especifica la base numérica a utilizar radix<base num> radix dec ;(hex, oct)

RES Reserva memoria <etiq>res <num> menres res 64

SET Define una variable en el ensamblador <label> set<exp> long set 0x12;

SPACE Inserta líneas vacías en el archivo .list space <exp> space 3

SUBTITLE Especifica subtítulo del programa subtitle <texto> subtitle “lazo”

TITLE Especifica título del programa title <texto> title “comienzo”

#UNDEFINE Borra una etiqueta de sustitución #undefine <etiq> #undefine long

VARIABLE Declara variable de símbolo variable variable grablong=64


<etiq>=>exp> constant parclong=512

WHILE Hace un lazo si una condición es cierta while <exp> while i<contador
i+=1
ENDW endw

464 INICIO
465
INICIO
PIC16C54 y 56

MEMORIA DE DATOS DE LOS


PIC16C54 Y 56

00h INDF(1)
01h TMRO
02h PCL
03h STATUS
04h FSR
05h PORTA
06h PORTB
07h
REGISTROS
0Fh DE
10h PROPÓSITOS
GENERALES
1Fh

466 INICIO
PIC16C55

MEMORIA DE DATOS DEL


PIC16C55

00h INDF(1)
01h TMRO
02h PCL
03h STATUS
04h FSR
05h PORTA
06h PORTB
07h PORTC

0Fh REGISTROS
10h DE
PROPÓSITOS
1Fh GENERALES

467 INICIO
PIC16C57

FSR<6:5> 00 01 10 11
Dirección
de registro00h
INDF(1) 20h
01h TMRO 40h 60h
02h PCL
03h STATUS
04h FSR
05h PORTA Este Mapa de Direcciones
06h PORTB retoma a las direcciones
07h PORTC del Banco 0

08h REGISTROS
DE
PROPÓSITOS
GENERALES 2Fh 4Fh 6Fh
0Fh
10h REGISTROS 30h REGISTROS 50h
REGISTROS 70h REGISTROS
DE DE DE DE
PROPÓSITOS PROPÓSITOS PROPÓSITOS PROPÓSITOS
GENERALES GENERALES
1Fh GENERALES GENERALES
3Fh 5Fh 7Fh
Banco 0 Banco 1 Banco 2 Banco 3

468 INICIO
PIC16C58

FSR<6:5> 00 01 10 11
Dirección
de registro00h
INDF(1) 20h
01h TMRO 40h 60h
02h PCL
03h STATUS
04h FSR
05h PORTA Este Mapa de Direcciones
06h PORTB retoma a las direcciones
07h del Banco 0
REGISTROS
DE
PROPÓSITOS
GENERALES 2Fh 4Fh 6Fh
0Fh
10h REGISTROS 30h REGISTROS 50h
REGISTROS 70h REGISTROS
DE DE DE DE
PROPÓSITOS PROPÓSITOS PROPÓSITOS PROPÓSITOS
GENERALES GENERALES
1Fh GENERALES GENERALES
3Fh 5Fh 7Fh
Banco 0 Banco 1 Banco 2 Banco 3

469 INICIO
Registros de funciones
especiales y bits de los PIC16C5X

Valor después Valor después

Direcc Nombre Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 de encender WDT y MCLR

N/A Tris Registros de control de Entrada y Salida (TRISA,TRISB, TRISC) 1111 1111 1111 1111

N/A OPTION - - TOCS TOSE PSA PS2 PS1 PS0 --11 1111 --11 1111

00h INDF Registro de la mem. de datos, su dirección está en el registro FSR xxxx xxxx uuuu uuuu

01h TMRO Temporizador contador de tiempo real de 8 bits xxxx xxxx uuuu uuuu

02h PCL 8 bits de bajo orden del Contador de Programa (PCL) 1111 1111 1111 1111

03h STATUS PA2 PA1 PA0 TO PD Z DC C 0001 1xxx

04H FSR Apuntador de la memoria de datos para acceso indirecto 1xxx xxxx

05h PORTA - - - - RA3 RA2 RA1 RA0 ---- xxxx ---- uuuu

06H PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu

07H PORTC RC7 RC6 RC5 RC4 RC3 RC2 RC1 RC0 xxxx xxxx uuuu uuuu

470 INICIO
PIC16F84

Banco 0 Banco 1
471 INICIO
472 INICIO
BANCO 0 PIC16F87X

473 INICIO
BANCO 1 PIC16F87X

474 INICIO
BANCOS 2 y 3 PIC16F87X

475 INICIO
476
INICIO
Algunas Interfaces

En las siguientes figuras se mostrarán algunos circuitos que podrás emplear como
interfaces de entrada y salida, para que ellos actúen con los microcontroladores. En
sí, no se dan detalles del funcionamiento; sin embargo, con tus conocimientos de
electrónica, esperamos que sepas interpretar cómo trabajan.
El hecho de que estas interfaces se presenten aquí, de ninguna manera significa que
sean las únicas soluciones para poder conectar tu microcontrolador al mundo exterior.
Simplemente los presentamos, para darte una idea de cómo convertir señales de 0 a
5v, las cuales generan los microcontroladores, en órdenes que pueden manejar
elementos que trabajen a tensiones diferentes. Por otro lado, también podrás
observar cómo señales de tensiones diferentes a la de los niveles lógicos, puedan ser
adaptadas para que la lean los microcontroladores.
En la siguiente parte, se presenta una lista de proyectos propuestos, y al lado se
presenta el número de nota de aplicación que puedes consultar para que los puedas
desarrollar. Las notas de aplicación fueron obtenidas del sitio www.microchip.com,
por lo tanto las encontrarás en inglés. Otros sitios web que podrás consultar, los
podrás acceder mediante algún motor de búsqueda al colocar palabras claves, tales
como: “microcontroladores”, “pic”, “proyectos”, entre otras. (p.e. en
www.google.com). De todas formas, al final de este anexo te presentamos alguanas
direcciones en español que tú podrás acceder donde se describen algunos proyectos
en español.

477 INICIO
Encendido de un diodo
emisor de luz (LED)

Terminal
del Puerto

Terminal
del Puerto

Encendido con un “1” lógico Encendido con un “0” lógico

478 INICIO
Lectura de interruptores
o pulsadores

4 Resistencias de 4,7K

5V
18 17 16 15 14 13 12 11 10
Vss
PIC
PIC16C54
16F84A
1 2 3 4 5 6 7 8 9

5V

479 INICIO
Control de la Línea
de Corriente Alterna

Relé

NC
C
NA

0 a 5V

480 INICIO
Control de la Línea de
Corriente Alterna 1

0 a 5V 0 a 5V

481 INICIO
Control de la Línea de
Corriente Alterna 2

0 a 5V

482 INICIO
Control de la Línea de
Corriente Alterna 3

0 a 5V

483 INICIO
Detector de Cruces
por Cero

0 a 5V 0 a 5V

484 INICIO
Encendido de un Indicador de 7
Segmentos Ánodo Común (Display)

Salida de los terminales de un Puerto.


Los segmentos encenderán con un “0”
lógico. El ánodo se conectará a una
tensión positiva Vdd.

Segmento a

Segmento b

Segmento c

0 a 5V Segmento d

Segmento e

Segmento f

Segmento g

485 INICIO
Encendido de un Indicador 7
Segmentos de varios dígitos

Dígito 0

Dígito 1
0 a 5V
Dígito 2

Dígito 3

Segmento a
Segmento b
Segmento c

0 a 5V Segmento d
Segmento e
Segmento f
Segmento g

486 INICIO
MATRIZ DE LEDS

Valores
de cada
Columna

0 a 5V

Selección de
columna
0 a 5V

487 INICIO
Lectura de un teclado
matricial

R1 R2 R3 R4
10k 10k 10k 10k

Ra0
Ra1
0 a 5V
Ra2
Entradas Ra1
S1 S2 S3 S4

Rb0
S5 S6 S7 S8

Rb1
S9 S10 S11 S12
0 a 5V
Salidas
Rb2
S13 S14 S15 S16

Rb3

488 INICIO
Aplicación de un reloj con bajo
consumo en el modo “Reposo”

489 INICIO
Interruptor Analógico

0 a 5V

490 INICIO
Notas de Aplicación
PIC16C5X y PIC16F84

AN712 Detector Autobaudio RS-232 para dispositivos PIC16C5X.


AN619 Interfaces para un PIC16C5X con las memorias 93XX76 y 93XX86.
AN657 Decodificador de un control remoto Infrarrojo con un PIC16C5X.
AN526 Rutinas de utilidad matemática para los PIC16C5x/PIC16Cxx.
AN541 Utilización de un PIC16C5x como un periférico inteligente IIC.
AN530 Interfaz para un PIC16C5X con la EEPROM serial 93CX6.
AN563 Utilización de los microcontroladores PIC16C5x como manejadores de LCD.
AN592 Contador de frecuencia con un PIC16C5x.
AN515 Comunicación con un bus IIC por medio de un PIC16C5X.
TB050 Lectura de varios puntos de temperatura con sensores TC74 y un PIC16C5x.
AN558 Uso de los dispositivos 24XX65 y 24XX32 con los códigos del PIC16C54.
AN567 Interfaz para un PIC16C54 con una EEPROM serial 24LCXXB.
AN590 Diseño de un reloj con pantalla de leds e interruptores con el PIC16C54.
AN648 Interfaz del microcontrolador PIC16C54 con una EEPROM serial SPI.
AN577 Resultados EMI del PIC16C54A.
AN661 Decodificador Hopping para un codificador KeeLoq por medio de un PIC16C56
AN715 Medida de sincronización usando un PIC16F84A y un ADXL202.
AN689 Asistente de ingeniero por medio de un PIC16F84A.

491 INICIO
Notas de Aplicación
PIC16F87X

AN686 Circuitos Supervisores.


AN246 Manejo de las entradas analógicas de un Convertidor SAR A/D.
AN236 Automatización del hogar X-10 usando el PIC16F877A.
AN826 Conceptos para el oscilador de cristal en un rfPIC™ y un PICmicro®.
TB052 Monitorización de temperatura multizona.
TB051 Medición de temperatura.
AN670 Conversión coma flotante a ASCII.
AN777 Multitarea para el PIC16F877 con el Salvo RTOS.
AN732 Implementación de un cargador boot para el PIC16F87X.
AN693 Entendiendo las especificaciones de un convertidor A/D.
AN656 Programador para calibración de parámetros.
AN582 Reloj de tiempo real de baja potencia.
TB028 Técnica para calcular el día de la semana.
TB033 Uso del PIC16F877 para desarrollar códigos del PIC16CXXX.
AN709 Consideraciones de diseño a nivel de sistema.
TB026 Cálculo de chequeo de la memoria de programa con el PIC16F87X.
TB025 Carga de archivos HEX al PIC16F87X.
TB029 Manejador complementario de LEDs.
AN690 Autodetección de memoria de I²C™.

492 INICIO
Notas de Aplicación
PIC16F87X
TB004 Calibración automática del tiempo de espera del WDT.
TB008 Técnicas para fuentes de alimentación sin transformador.
AN597 Implementación a frecuencias ultrasónicas.
AN587 Interfaz de un microcontrolador PIC a un módulo LCD.
AN607 Detector de fallas de la alimentación.
AN660 Rutinas de coma flotante.
AN595 Mejora de la Susceptibilidad de una aplicación.
AN591 Bus de escritorio de la Apple.
AN594 Uso de los módulos CCP.
AN655 Conversión D/A por medio de un PWM y una red R-2R.
AN667 Cargador inteligente de baterías con interfaz SMBus.
AN617 Rutinas de coma flotante.
AN893 Control de un motor DC con escobillas por medio del PIC16F684.
AN892 Monitor de seguridad contra falla e interruptor de frecuencia con un PIC16F684.
AN889 Control VF de motores de inducción trifásicos por medio del PIC16F7X7.
AN880 Referencia rápida de códigos de conversión entre un 8051 y un PIC.
AN879 Uso de un PIC de bajo consumo para un módulo reloj despertador.
AN258 Programador de microcontroladores con interfaz USB de bajo costo.
AN774 Comunicación asíncrona con el módulo USART.
AN212 Sensor inteligente de nodo CAN utilizando el MCP2510 y el PIC16F876.

493 INICIO
Notas de Aplicación
Otros PIC
AN239 Nodo “esclavo” LIN para PIC16 y PIC18.
AN240 Nodo “esclavo” LIN en un PIC16C433.
AN237 Implementación de un nodo “esclavo” LIN en un PIC16F73.
AN851 Transferencia de datos a la FLASH para dispositivos PIC16 y PIC18.
AN844 Interfaces simplificadas para termocuplas en microcontroladores PIC.
AN847 Control de motor en aeromodelismo.
AN821 Encriptación avanzada estándar por medio de un PIC16XXX.
TB053 Generación de alto voltaje por medio de los PIC16C781/782.
AN756 Uso de un MCP2120 para comunicaciones por infrarrojo.
AN758 Uso de un MCP2150 para añadir una conectividad inalámbrica IrDA®.
TB045 Rutinas de codificación de recepción Manchester para dispositivos Keeloq.
AN744 Decodificador Keeloq modular con PIC de la gama media en lenguaje C.
AN746 Interfaz de los potenciómetros digitales MCP41XXX/42XXX con microcontroladores PIC.
AN747 Comunicación con protocolo para los potenciómetros digitales MCP42XXX.
AN217 Programador para los KeeLoQ HCS30X, HCS200.
AN742 Decodificador Hopping modular con microcontroladores PIC de la gama media.
TB043 Rutinas de verificación CRC para KeeLoq.
AN823 Diseño analógico en el mundo digital por medio de controladores de señales mezcladas.
AN220 Medidor de vatios-hora por medio de un PIC16C923 y un CS5460.
AN735 Utilización del módulo MSSP para comunicaciones I2C.

494 INICIO
Notas de Aplicación
Otros PIC

AN734 Utilizaci{on del módulo SSP en modo “esclavo” para la comunicación I2C.
AN216 Controlador de convertidor DC/DC con un microcontrolador PIC.
AN214 Compatibilidad de un transductor inteligente IEEE 1451.2 con un PIC.
AN731 Incrustación de un microcontrolador PIC en el Internet.
AN730 Chequeo y generación CRC.
TB016 Implementación de un ICSP con un PIC16F8X.
TB013 Implementación de un ICSP con un PIC16CXXX.
AN585 Sistema operativo en tiempo real para un PIC16/17.
AN724 Utilización de un PIC para conectar a Internet vía PPP.
AN656 Uso de parámetros de calibración para la programación serial en los PIC.
AN703 Conexión de un PIC con el convertidor serial de 12 bits MCP320X.
AN580 Utilización del temporizador 1 en modo de reloj asíncrono.
AN578 Uso del módulo SSP en el ambiente “multimaestro” IIC.
AN579 Utilización del puerto paralelo de 8 bits.
AN714 Implementación de sistema de seguridad inalámbrico con Keeloq y un PIC.
AN716 Migración de diseños desde el PIC16C74A/74B hacia el PIC18C442
AN719 Interfaz del convertidor analógico a digital MCP3201 con un microcontrolador PIC.
TB028 Técnica para calcular el día de la semana.
AN701 Eliminador de batería en modo de conmutación basado en un PIC16C72A.
AN700 Convertidor Delta-Sigma por medio de un módulo de comparación analógica.

495 INICIO
Notas de Aplicación
Otros PIC
PICREF-3 Medidor de vatios hora.
PICREF-2 Cargador de baterías inteligente.
PICREF-5 Cargador de baterías nivel 3 del SMBus para el PIC16C73A.
TB020 Emulación del PIC12C67X con el PIC16C72.
AN672 Decodificador de código Hopping con PIC del la gama media.
TB004 Calibración automática del período de espera del temporizador WDT.
TB008 Fuente de alimentación sin transformadores.
AN668 Interfaz de un PIC16C92x a una EEPROM serial SPI.
AN514 Técnicas de interrupción por Software.
AN654 El PWM, una solución de software mediante los PIC16CXXX.
TB010 Un convertidor A/D de 4 canales de 8bits a un PIC17C4X.
AN546 Utilización del Convertidor Analógico a Digital.
AN597 Implementación en el rango ultrasónico.
AN615 Diseño de un reloj económico mediante técnicas de baja potencia.
AN511 Reemplazo de PLD.
AN589 Desarrollo de un programador basado en un PC para el PIC16C84.
TB011 Utilización de la SRAM con un PIC16CXX.
AN588 Guía de diseño de osciladores para los PIC16/17.
AN607 Determinación de fallas de encendido.
AN663 Decodificador sencillo de código Hopping con Keeloq.

496 INICIO
Notas de Aplicación
Otros PIC
AN529 Manejador de LED y teclado 4x4 por muestreo.
AN606 Utilización de diseños de baja potencia con PIC16/17.
AN566 Utilización del las interrupciones del puerto B como interrupciones externas.
AN576 Técnicas para deshabilitar interrupciones globales.
AN616 Procesamiento digital de señales con el PIC16C74.
AN662 Decodificador de Código Hopping con KeeLoq por medio de aprendizaje seguro.
Fact 2 Convertidor A/D del PIC16C7X.
AN552 Implementación de un despertador con teclado.
AN520 Comparaciones entre microcontroladores de 8 bits.
AN556 Implementación de una tabla de lectura.
AN522 Consideraciones durante el encendido.
AN595 Mejoramiento de la susceptibilidad en una aplicación a ESD.
AN649 Caracteríssticas del reloj del PIC16C924.
AN531 Posicionador remoto inteligente.
AN575 Rutinas de coma flotante compatibles con la norma IEEE 754.
AN658 Fundamentos de los LCD con los PIC16C92X.
AN613 Uso de las EEPROMs seriales de la serie 93 con el puerto SPI.
AN513 Conversión Analógica a Digital.
AN600 Control de flujo de aire con lógica difusa.
AN527 Software administrador de la pila (Stack).

497 INICIO
Notas de Aplicación
Otros PIC
AN528 Implementación de un despertador con teclado.
AN557 Voltímetro digital de cuatro canales con teclado y pantalla.
AN560 Uso de las EEPROM seriales 93LC56 y 93LC66.
AN535 Lógica a utilizar con EEPROM seriales.
AN655 Conversión D/A por medio del PWM y una red R-2R para generar ondas seno y DTMFL.
AN643 Modulación de Código de Pulso Diferencial Adaptable.
AN647 Interfaz entre un PIC16C64/74 con una EEPROM Serial.
Fact 3 Cuidado y alimentación del PIC16C74.
AN584 Soporte de PICMASTER en Microsoft Windows(TM) DDE.
AN521 Intefaz con líneas de potencia AC.
AN554 Implementación de Software del bus of I²C maestro.
AN611 Medición de Resistencia y Capacitancia cou un PIC 16C622.
AN667 Cargador de batería inteligente con la interfaz SMBus.
AN555 Implementación de Software para el puerto serial asíncrono.
AN519 Desarrollo de un ratón serial.
Fact 1 Guía de diseño de osciladores para los PIC.

498 INICIO
Lista de algunos sitios web
relacionados con PIC

• http://www.comunidadelectronicos.com/sitios2.htm
• http://www.siste.com.ar/enlacesarchivos/Micros.htm
• http://www.sagitron.es
• http://www.todorobot.com.ar
• http://www.todopic.com.ar/
• http://robotia.com.ar/rb/links/links.htm
• http://www.abcdatos.com/tutoriales/electronicayelectricidad/electronica/microcon
troladorespic.html
• http://perso.wanadoo.es/juanramon.villodas/favorite.htm
• http://www.micropic.arrakis.es/marcos.htm
• http://www.miguelo.com.ar/mchip/index.html
• http://www.conket.com/modules.php?name=Topics
• http://www.geocities.com/micramtechnologies/seteando.htm
• http://www.hackemate.com.ar/mirrors/karpoff/manuales/topcite/archivos/hitechPI
C.htm
• http://boards1.melodysoft.com/app?ID=creatronica.microcontroladores&DOC=1
21
• http://www.geocities.com/alva_cesar/rutas.htm

499 INICIO
500 INICIO
Equipo requerido para la actualización
del PICSTART PLUS

A medida que van fabricando nuevos modelos de microcontroladores, será necesario


que tú actualices el MPLAB IDE y el programador PICSTART PLUS, para que
puedas utilizarlos en los nuevos componentes ofrecidos. La versión nueva del
MPLAB IDE, la puedes bajar en www.microchip.com. El equipo requerido para
actualizar al PICSTART PLUS, es el siguiente:
• Programador PICSTART PLUS, el cual debe estar encendido y conectado al
computador con el puerto serial.
• Última versión del Software MPLAB IDE.
• Microcontrolador PIC17C44 (de 25MHz o más veloz) borrado.
• Archivo actualizado psf######.hex (donde ###### es el número de la
última versión). Éste se encuentra en el software de instalación del MPLAB IDE.
• Un destornillador de estrías.

Sin embargo, a partir del año 2004, los PIC17C44 ya no tienen la capacidad
suficiente para aceptar esta actualización. Para ello, necesitarás adquirir un
módulo UK003010, y seguir las instrucciones para realizar la actualización del
PICSTART PLUS. Para más detalles consulta en alguna de las direcciones
siguientes: http://www.sagitron.es o http://www.microchip.com.

Otro detalle, si tu PICSTART PLUS ya contiene el módulo UK003010, ya sea porque


es nuevo (versión R20 o superior), o porque ya instalaste dicho módulo, no
necesitarás seguir los pasos de actualización que se presentan en las siguientes
páginas, simplemente descargarás la actualización desde tu computador.

501 INICIO
Procedimiento para la actualización
del PICSTART PLUS

• Seleccionar en el MPLAB al microcontrolador PIC17C44.


• Habilitar al programador PICSTART PLUS.
• Seleccionar en los bits de configuración lo siguiente:
– Oscillator: XT.
– Processor Mode: Microcontroller.
– Watchdog timer: TMR.
• Seleccione en el menú: File, Import y luego escoja el archivo
de actualización ######.hex.
• Inserte al PIC17C44 borrado en el sócalo del programador.
• Verifique que el dispositivo está borrado.
• Seleccione el botón “Program” para transferir el archivo al
PIC17C44.
• Al terminar la transferencia, extraiga al PIC17C44.
• Salga del MPLAB, desconecte la fuente y la conexión serial
del computador al programador... (Continúa en la página
siguiente).
502 INICIO
Procedimiento para la actualización
del PICSTART PLUS (continuación)

• Extraiga la tapa posterior del programador.


• Saque con cuidado al microcontrolador que está en el
programador y guárdelo, servirá para otras actualizaciones.
• Inserte cuidadosamente al PIC17C44 recién programado. El
terminal 1 del PIC debe estar hacia el conector serial.
• Coloque la tapa posterior del programador y atorníllela con
cuidado, sin aplicar un torque excesivo.
• Vuelva a conectar el programador PICSTART PLUS a la
fuente y al puerto serial del computador.
• Arranque al MPLAB IDE y habilite al programador.
• Podrás verificar que se ha actualizado la versión del
programador al habilitarlo. Igualmente podrás verificar la
versión del MPLAB IDE en “Help, About MPLAB IDE”.
• Tu programador PICSTART PLUS está actualizado.

503 INICIO
504
INICIO
Grabación de un programa
en un PIC16F87X

La grabación de un microcontrolador PIC16F87X se realiza en forma serial, y para ello


se puede hacer aplicando una tensión baja al terminal MCLR#/Vpp (5V) o con una
tensión alta aplicada a ese terminal (13V ±5%). Para programar en ambos casos se
utilizan la línea RB6/PGC para colocar los pulsos de sincronización o señal de reloj, y la
línea RB7/PGD para colocar los bits datos en serie. En el caso de optarse por la
programación de tensión baja, entonces se deberá colocar el terminal RB3/PGM en
nivel alto.
A continuación te presentamos los planos y las instrucciones para que hagas un
programador de los PIC16F84 y los de la serie PIC16F87X. Los programas para este
programador los podrás bajar en Internet en la dirección:
http://www.todorobot.com.ar.

505 INICIO
Diagrama del circuito
programador

506 INICIO
El PicProg

Descripción:

PicProg
Programador para PIC 16F8xx
(Versión 2.0)
(c) TodoRobot - 2002

El PicProg está preparado para programar los siguientes modelos de la familia de


Microchip:

16F84, 16F870, 16F871, 16F872, 16F873, 16F874, 16F876, 16F877.

El PicProg le permite Programar, Verificar y Borrar todos los modelos anteriormente


detallados.
El archivo Hexadecimal (.hex) a grabar debe ser formato Intel INHX8M. Éste es el
formato estándar generado por la herramienta de desarrollo MPLAB que puede
descargarse gratis en el sitio de Microchip.

Para ir al sitio web donde está el software de instalación del PicProg haz clic aquí.

507 INICIO
Instrucciones para el PicProg

Programar
El PicProg verifica antes y después de grabar cada dirección. De esta forma se evita
grabar el mismo dato ya grabado, prolongando la vida útil de la Flash Memory. Y luego
realiza la verificación posterior al grabado para asegurarse que el dato ha sido grabado
adecuadamente.

Verificar
Como se dijo en el punto anterior, el PicProg realiza una verificación al grabar cada
dirección, por lo tanto no es necesario ejecutar este procedimiento luego de cada
programación. Esta función es más bien útil cuando no se está seguro de cual es el
programa que ha sido o tiene cargado un determinado micro.

Borrar
Esta función es solamente necesaria cuando el PIC ha sido programado con código de
protección (CP). En estos caso la única forma de regrabar el micro es efectuando un
borrado general. Está función borra la memoria de programa y la de datos.

Poner el PIC en Modo RUN


Esta función haced qued la línea MCLR/VPP pase a 5v y por lo tanto el PIC salgo del
modo Reset para pasar al modo de ejecución normal.
Está funcionalidad solo es útil cuando se está usando la modalidad In-Circuit o bien se
esté trabajando en un diseño usando el PIC instalado en el Programador.

508 INICIO
Programación Paso por paso

1°) Seleccionar el puerto LPT a usar mediante el menú desplegable correspondiente. Si


por algún motivo no se pudiese detectar el Hardware del programador, aparecerá un
mensaje en rojo indicando el error y se bloquearán todos los controles hasta tanto no se
resuelva el problema. Generalmente la dirección 0x378 corresponde al LPT1 y 0x278 al
LPT2. Pero en contados casos, puede darse que el LPT1 tenga la dirección 0x3BC, en
cuyo caso el LPT2 asume la dirección 0x378.
2°) Seleccionar el modelo de Microcontrolador que se desea programar. Esta función
puede dejarse también en Autodetectar para permitir que el PicProg lo detecte
automáticamente.
3°) Ingresar el archivo Hexadecimal (.hex) que contiene el programa a descargar al PIC.
Puede usarse el botón BUSCAR para encontrar el archivo a grabar o bien escribirlo
directamente en la ventana.
4°) Pulsar el botón CONFIGURAR para establecer la configuración deseada para el PIC
(Watchdog, Power Up Timer, etc). Todas las configuraciones están por defecto
seteadas para detectar estos parámetros directamente desde el archivo hexadecimal
(.hex), para que esto funcione se debieron haber colocado previamente en el código
fuente a fin de que el compilador genere el código necesario en el archivo hexadecimal.
En ese caso este punto puede ser salteado y pasar directamente al punto siguiente.
5°) Pulsar el botón PROGRAMAR para iniciar la descarga hacia el PIC. Aparecerá una
ventana pidiendo confirmación de los parámetros que se usarán en la programación y, una
vez aceptado, si todo ha funcionado correctamente, aparecerá una ventana indicando la
finalización del proceso.
509 INICIO
Algunas sugerencias

IMPORTANTE: Antes de insertar o extraer un micro del zócalo de programación, se


debe tener la precaución de retirar la alimentación del programador, debido a que no se
ha previsto ningún circuito de aislamiento y podría resultar dañado el chip o el puerto
paralelo de la PC. Asimismo es aconsejable no alimentar el programador hasta tanto el
programa PicProg no haya sido ejecutado y se encuentre activo en pantalla.

Reporte de errores a todorobot@yahoo.com.ar

http://www.todorobot.com.ar

510 INICIO

También podría gustarte