Está en la página 1de 536

MICROCONTROLADORES «PIC»

DISEÑO PRÁCTICO DE APLICACIONES

Primera parte
PIC12F508 Y PIC16F84A
Lenguajes Ensamblador, C y PBASIC

4.a edición
MICROCONTROLADORES «PIC»
DISEÑO PRÁCTICO DE APLICACIONES

Primera parte
PIC12F508 Y PIC16F84A
Lenguajes Ensamblador, C y PBASIC

4.a edición

JOSÉ MARÍA ANGULO USATEGUI


Doctor Ingeniero Industrial
Catedrático de Arquitectura de Computadores
en la Universidad de Deusto

IGNACIO ANGULO MARTÍNEZ


Licenciado en Informática
Profesor del Departamento de Arquitectura de Computadores
en la Universidad de Deusto

ARITZA ETXEBARRIA RUIZ


Licenciado en Informática
Jefe del Departamento de Informática
Colegio Vizcaya

MADRID • BOGOTÁ • BUENOS AIRES • CARACAS • GUATEMALA • LISBOA • MÉXICO


NUEVA YORK • P ANAMÁ • SAN JUAN • SANTIAGO • SÃO PAULO
AUCKLAND • HAMBURGO • LONDRES • MILÁN • MONTREAL • NUEVA DELHI • PARÍS
SAN FRANCISCO • SIDNEY • SINGAPUR • SAN LUIS • TOKIO • TORONTO
MARCAS REGISTRADAS:
El nombre y logo de Microchip, dsPIC, PIC, PICmicro, PICSTART, PICMASTER, PRO MATE y MPLAB
son marcas registradas por Microchip Technology Incorporated en Estados Unidos y otros países.
DsPICDEM, dsPIC.net, ICSP: In-Circuit Serial Programming (Programación Serie en Circuito), ICEPIC,
MPASM, MPLIB, MPLINK, MPSIM, PICC, PICkit, PICDEM, PICDEM.net, rfLAB y rfPIC son marcas
registradas por Microchip Technology Incorporated en Estados Unidos y otros países.
SQTP (Serialized Quick Turn Programming) es una marca de servicio de Microchip Technology Incor-
porated en Estados Unidos.
Determinados materiales e informaciones contenidos en esta obra han sido reproducidos con el permiso
de Microchip Technology Incorporated. No se pueden reproducir ni reeditar dichos materiales sin el pre-
vio consentimiento escrito de Microchip Technology Incorporated.
BASIC Stamp, Home Work Board y el logo de Parallax son marcas registradas por Parallax, Inc.
Las restantes marcas, logos y productos mencionados en este libro están registrados por sus respectivos
propietarios.
El software contenido en el CD destinado a la edición, compilación, simulación y depuración
de programas son propiedad de sus respectivos fabricantes:
Microchip Technology, Inc.; Parallax, Inc., e Ingeniería de Microsistemas Programados, S.L.

MICROCONTROLADORES «PIC». Diseño práctico de aplicaciones.


Primera parte: PIC12F508 Y PIC16F84A. Lenguajes Ensamblador, C y PBASIC. 4.a edición

No está permitida la reproducción total o parcial de este libro, ni su tratamiento informático, ni la trans-
misión de ninguna forma o por cualquier medio, ya sea electrónico, mecánico, por fotocopia, por registro
u otros métodos, sin el permiso previo y por escrito de los titulares del Copyright.

McGraw-Hill/Interamericana
de España, S.A.U.
DERECHOS RESERVADOS © 2007, respecto a la cuarta edición en español, por
McGRAW-HILL/INTERAMERICANA DE ESPAÑA, S. A. U.
Edificio Valrealty, 1.a planta
Basauri, 17
28023 Aravaca (Madrid)
www.mcgraw-hill.es
universidad@mcgraw-hill.com

ISBN: 978-84-481-5647-3
Depósito legal: M.
Editor: Carmelo Sánchez González
Asistente editorial: Israel Sebastián
Diseño de cubierta: Luis Sanz Cantero
Compuesto en: Fernández Ciudad, S. L.
Impreso en:

IMPRESO EN ESPAÑA - PRINTED IN SPAIN


CONTENIDO

Prólogo .................................................................................................................. vii

PRIMERA PARTE. La gama básica: el humilde PIC12F508 ........................ 1

TEORÍA
Capítulo 1. Microcontrolador: la solución está en un chip .............................. 3
Capítulo 2. Los PIC, una familia numerosa ..................................................... 21
Capítulo 3. El más humilde de la gama básica: PIC12F508 ............................ 37
Capítulo 4. Las memorias ................................................................................ 49
Capítulo 5. Recursos y periféricos principales................................................. 61
Capítulo 6. Recursos auxiliares........................................................................ 75
Capítulo 7. El repertorio de instrucciones........................................................ 81

APLICACIONES PRÁCTICAS

1.a aplicación. Simulando los primeros programas con el MPLAB y el MPLAB


SIM ........................................................................................................... 105
2.a aplicación. Herramientas para la grabación, implementación y depuración:
PIC School y WinPic800 .............................................................................. 121
3.a aplicación. Las primeras experiencias....................................................... 147
4.a aplicación. Manejando el tercer estado en las E/S ....................................... 163
5.a aplicación. Controlando el tiempo con software ...................................... 181
6.a aplicación. Controlando el tiempo con hardware. El temporizador TMR0.. 189
7.a aplicación. Manejando el Perro Guardián, el modo de bajo consumo
y el reset................................................................................................. 205
8.a aplicación. Comunicación serie RS232 ................................................... 219
9.a aplicación. Controlando una pantalla LCD.............................................. 231
10.a aplicación. Manejando el bus I2C............................................................. 245
11.a aplicación. Aproximación a la conversión A/D........................................ 259
12.a aplicación. Transmisión y recepción por RF............................................ 279
v
vi CONTENIDO

SEGUNDA PARTE. La gama media: el fabuloso PIC16F84A......................... 291

TEORÍA

Capítulo 8. El primer contacto con el PIC16F84A ........................................ 293


Capítulo 9. En el interior del procesador........................................................ 305
Capítulo 10. Los recursos fundamentales: temporizadores, puertas de E/S y
EEPROM de datos ......................................................................... 319
Capítulo 11. Interrupciones, reset y recursos auxiliares .................................. 335
Capítulo 12. Manejando el repertorio de instrucciones.................................... 351
Capítulo 13. Herramientas y diseño de proyectos............................................ 367

APLICACIONES PRÁCTICAS

1.er taller. Simulando el primer taller ................................................................ 389


2.o taller. Trabajando con entradas y salidas. Concurso de televisión............ 397
3.er taller. Manejo de la instrucción SLEEP ..................................................... 405
4.o taller. Uso de temporizadores. Contador ascendente/descendente................. 413
5.o taller. Manejo del teclado ............................................................................ 419
6.o taller. Comunicación RS-232...................................................................... 425
7.o taller. Manejo del LCD................................................................................ 433
8.o taller. Generación de números aleatorios ................................................... 439
9.o taller. Manejo de la memoria EEPROM de datos...................................... 447
10.o taller. Un ejercicio completo. La máquina de «Su Turno» ....................... 457

TERCERA PARTE. Los módulos microcontroladores BASIC Stamp


y el lenguaje PBASIC

Capítulo 14. Los sellos mágicos de Parallax.................................................... 469


Capítulo 15. PBASIC. El lenguaje más fácil del mundo. Prácticas y pro-
gramas ........................................................................................ 485

CUARTA PARTE. «Software» de desarrollo, programas fuente, apéndices


y complementos incluidos en el CD

Contenido del CD ............................................................................................. 511

Bibliografía y direcciones de interés relacionadas con los PIC ........................ 513

Índice analítico ....................................................................................................... 515


PRÓLOGO

Los microcontroladores están invadiendo el mundo. Están presentes en nuestra casa, en


nuestro trabajo y en nuestra vida. Se pueden encontrar controlando los hornos microon-
das y los televisores de nuestro hogar, en los teclados y ratones de los computadores y
en los automóviles. En el bolsillo llevamos unos cuantos entre los del teléfono móvil, los
que tienen las modernas llaves del coche y los mandos a distancia del garaje y la alarma
doméstica. Pero la invasión acaba de comenzar y el comienzo del siglo XXI será testigo
de la conquista masiva de estos diminutos computadores que gobernarán la mayor parte
de los aparatos que fabricamos y usamos los humanos.
Las extensas áreas de aplicación de los microcontroladores, que se pueden conside-
rar ilimitad as, exigirán un gigantesco trabajo de diseño y aplicación.
Aprender a manejar y aplicar los microcontroladores sólo se consigue desarrollando
prácticamente diseños reales. Sucede lo mismo que con cualquier instrumento musical,
cualquier deporte y muchas otras actividades.
El objetivo primordial que nos ha movido a escribir este libro es facilitar el camino
al lector para que se entusiasme y utilice los microcontroladores; por eso, está plagado
de programas y experiencias, así como de proyectos reales.
La filosofía y el método que hemos aplicado en la elaboración de esta obra han
sido los mismos que usamos con nuestros alumnos de varias especialidades de inge-
niería en la Universidad de Deusto. Sospechamos que los excelentes resultados obte-
nidos se deben principalmente a la calidad de los estudiantes.
En esta nueva edición hemos introducido un cambio sustancial en el planteamiento
del aprendizaje. En el verano de 2006 nos reunimos los autores para establecer el pro-
grama de la asignatura «Diseño de Sistemas Basados en Microcontrolador» y para es-
tructurar este libro que sirviese de texto y guía. Decidimos empezar por lo más sencillo
y elegimos el procesador más simple y fácil con la intención de alcanzar tres metas:

1.ª En un par de semanas los alumnos comenzaban diseños reales.


2.ª Un procesador humilde y sin apenas recursos obliga a «espabilarse» más para
resolver las tareas.
3.ª Una vez que se domina un microcontrolador por sencillo que sea, pasar a otros
más potentes resulta natural y apetecible.

vii
viii PRÓLOGO

Así que tomamos la decisión de comenzar con el humildísimo PIC12F508 de la


gama básica, que sólo posee ocho patitas. Si bien es verdad que tiene poco de todo,
era uno de los más populares y vendidos en todo el mundo. Cosa lógica, porque la
mayor parte de los productos masivos, como el mando a distancia de una alarma, no
necesitan más de lo que posee el PIC12F508. Tras conocer la teoría y la práctica de
dicho microcontrolador se decidió pasar al PIC16F84A, que es uno de los modelos
más pobres de la gama básica, pero ya un clásico en la historia de los microcontrola-
dores PIC. Finalmente, para acabar de demostrar que con los elementos más sencillos
se alcanzan las metas más complejas, se presentan los módulos de Parallax, que fa-
cilitan el hardware y permiten confeccionar los programas con el lenguaje más fácil
del mundo: el BASIC.
Este libro recoge los temas teóricos y las experiencias, programas y proyectos
prácticos de laboratorio que impartimos en la anteriormente mencionada asignatura
desde octubre de 2006 hasta febrero de 2007. Además, como nuestros alumnos tenían
que aprender a diseñar proyectos con microcontrolador, les propusimos como evalua-
ción un proyecto en equipos de cuatro personas para construir un prototipo operativo
de un «pastillero inteligente». El proyecto no tenía restricciones, pero sus especifica-
ciones debían quedar determinadas a mitad de curso y al final el prototipo las debía
cumplir y funcionar correctamente.
Enlazando las diversas experiencias prácticas, aplicando los conocimientos teóricos
y demostrando que un futuro ingeniero debe tener el ingenio necesario para combinar
todo ello y alcanzar brillantemente el objetivo, nuestros alumnos construyeron varios
pastilleros en los que dejaron la huella de su capacidad técnica e imaginativa. En un
apéndice en el CD que acompaña la obra se presenta uno de dichos proyectos.
El libro que tiene entre sus manos constituye la primera parte de una colección
de tres libros y se destina a los microcontroladores más sencillos de la gama básica y
media y a los lenguajes de programación Ensamblador, C y PBASIC. La segunda parte
se dedica a los poderosos PIC16F87X de la gama media, a los PIC18FXXX de la gama
mejorada y ofrece una introducción a las familias de microcontroladores de 16 bits. Por
último, el tercer volumen de esta obra se refiere a los Controladores Digitales de Señales
(DSC), que se materializan en las familias dsPIC30F y dsPIC33F, que reúnen lo mejor
de los microcontroladores PIC de 16 bits con los recursos principales de los DSP. Para
desarrollar todos los programas y proyectos de las tres partes se ha elegido el sistema de
desarrollo PIC School.
El contenido de esta primera parte consta de cuatro secciones:

Primera: PIC12F508
Teoría: Funcionamiento, arquitectura y repertorio de instrucciones. Práctica: Colec-
ción de doce aplicaciones desarrolladas con la PIC School de complejidad progresiva en
los lenguajes Ensamblador y C.

Segunda: PIC16F84A
Teoría: Funcionamiento, arquitectura y repertorio de instrucciones. Práctica: Colec-
ción de varias aplicaciones desarrolladas con la PIC School de complejidad progresiva
en Ensamblador y C.
PRÓLOGO ix

Tercera: Módulos microcontroladores BASIC Stamp


Teoría y práctica sobre el funcionamiento y el desarrollo de aplicaciones con los
módulos microcontroladores de Parallax resueltos con el lenguaje PBASIC.

Cuarta: «Software» de desarrollo, programas fuente, apéndices y complementos


contenido en el CD
En el CD que acompaña a este libro se incluyen todas las herramientas software
necesarias, los programas fuente de todos los ejercicios y proyectos. Además, en dicho
CD se dedica el Apéndice A a una guía rápida del PIC12F508 y el Apéndice B a una
guía rápida del PIC16F84A. El proyecto completo de un «pastillero» diseñado por un
alumno se ofrece en el Apéndice C. Toda la gama de modelos de los microcontroladores
PIC que se comercializan en la actualidad con sus principales características se recogen
en el Apéndice D. El Apéndice E describe una colección de experiencias muy didácticas
y útiles desarrolladas con un kit básico de componentes y el PIC16F84A. Se completa
este libro con una bibliografía y un directorio de direcciones interesantes en Internet y
de un índice analítico.
Gran parte de la información proporcionada en este libro y su CD procede de
Microchip (www.microchip.com) y agradecemos especialmente la colaboración que
hemos obtenido de don Juan Gutiérrez, de la oficina central. También desde Parallax
(www.parallax.com) hemos recibido toda la colaboración que hemos solicitado de don
Arístides Álvarez. Finalmente, don Mikel Echevarría, de Ingeniería de Microsistemas
Programados (www.microcontroladores.com), nos ha facilitado multitud de programas
y experiencias soportadas por la extraordinaria herramienta PIC School.
PRIMERA PARTE
La gama básica: el humilde PIC12F508

TEORÍA
CAPÍTULO
Microcontrolador:
la solución está en un chip
1

1.1. ¿QUÉ ES UN MICROCONTROLADOR?


Es un pequeño computador construido sobre el «chip» o dado de silicio que hay dentro
de un circuito integrado. Se emplea para controlar el funcionamiento de una tarea de-
terminada o el de un producto, y debido a su reducido tamaño, suele estar incorporado
en el propio dispositivo que gobierna. Esta última característica es la que le confiere la
denominación de «controlador incrustado» (embebed controller) (Fig. 1.1).
Al microcontrolador se le considera como un «computador dedicado» pues en su
memoria reside un único programa destinado a controlar una aplicación concreta, sus
líneas de entrada/salida soportan el conexionado de los sensores y actuadores del siste-
ma a gobernar y todos los recursos complementarios disponibles tienen como finalidad
exclusiva atender los requerimientos de la tarea a la que se dedica el microcontrolador
(Fig. 1.2).

Figura 1.1. El microcontrolador es tan pequeño que podría incrustarse en un dado y cambiar su suerte.

3
4 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 1.2. Fotografía de un ratón para PC abierto. Se distingue el microcontrolador que se encarga de
recoger los movimientos de la «bola» y transferirlos al PC para producir los desplazamien-
tos correspondientes del cursor en la pantalla.

Un microcontrolador es un computador completo, aunque de capacidad limitada, que está


contenido en un circuito integrado y se destina a gobernar una tarea o producto en donde
suele ir incrustado.

Figura 1.3. La inclusión de un microcontrolador en un pastillero le añade prestaciones que le otorgan el


calificativo de «inteligente».
MICROCONTROLADOR: LA SOLUCIÓN ESTÁ EN UN CHIP 5

Figura 1.4. Distribución porcentual de la producción mundial de microcontroladores en las cinco grandes
áreas de aplicación.

La potencia que se puede obtener de un computador es inmensa; por eso, si son


pequeños y baratos, se pueden incorporar en cualquier producto por pequeño y econó-
mico que sea, abriendo las puertas de la imaginación de los diseñadores. Empresas del
prestigio de Dataquest auguran la presencia de centenares de microcontroladores en los
hogares del mundo desarrollado en un futuro cercano.

1.2. LA INVASIÓN DEL MUNDO


La potencia de los microcontroladores aumenta constantemente a la par que su volumen
y coste, lo que está dando lugar al crecimiento exponencial de su aplicación y, en conse-
cuencia, a su invasión en muchos de los productos típicos del mundo moderno. Funda-
mentalmente, existen cinco grandes campos de aplicación de los microcontroladores.

1.o Comunicaciones.
2.o Gran consumo.
3.o Automoción.
4.o Informática.
5.o Industria.

Las comunicaciones y sus sistemas de transferencia de información utilizan profu-


samente los microcontroladores, siendo el teléfono móvil su componente más represen-
tativo (Fig. 1.5).
En el área de productos de gran consumo, los electrodomésticos de línea blanca
(lavadoras, hornos, lavavajillas, etc.) y de línea marrón (televisores, vídeos, aparatos de
audio, etc.) incorporan numerosos microcontroladores (Fig. 1.6).
6 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 1.5. Las comunicaciones absorben la mayor parte de la producción mundial de microcontrolado-
res, siendo el teléfono móvil uno de los dispositivos que más utilizan.

Figura 1.6. Los electrodomésticos de línea blanca y marrón, como el televisor, precisan numerosos mi-
crocontroladores para optimizar su funcionamiento y sus prestaciones.

La industria de automoción es una firme candidata a incrementar el consumo de


microcontroladores para soportar las nuevas y cada vez más exigentes funcionalidades
de los vehículos modernos. En 2003, Microchip vendió veinticinco millones de micro-
controladores para el control del sensor del airbag.
La industria informática acapara una buena parte de la producción de microcontro-
ladores, puesto que casi todos los periféricos del computador disponen de uno o varios,
como sucede con las impresoras, teclados, discos duros, escáneres, etc.
En el área industrial, hay secciones como la robótica, la visión artificial, el control
de motores, las fuentes de alimentación ininterrumpibles, etc., que son grandes consu-
midores de microcontroladores.
MICROCONTROLADOR: LA SOLUCIÓN ESTÁ EN UN CHIP 7

Figura 1.7. Bastantes sistemas de control, confort y seguridad del automóvil son gobernados por micro-
controladores.

Más de la mitad de la producción mundial de microcontroladores es absorbida por las


comunicaciones y los productos de gran consumo. El resto se reparte entre el sector de la
automoción, la informática y la industria.

Figura 1.8. Casi todos los periféricos del computador, como la impresora, utilizan microcontroladores.
8 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 1.9. Los robots industriales precisan numerosos y potentes microcontroladores para su control.

Además de las cinco áreas comentadas, van apareciendo constantemente otras nue-
vas que precisan el empleo de microcontroladores, como la industria militar, la electro-
medicina, los juegos, la navegación espacial, etc.

Figura 1.10. Fotografía de una pistola para la medida del dolor en pacientes de fibromialgia basada en
microcontrolador.
MICROCONTROLADOR: LA SOLUCIÓN ESTÁ EN UN CHIP 9

1.3. EN EL INTERIOR DEL MICROCONTROLADOR


Dentro del circuito integrado que materializa un microcontrolador hay un completo
computador, aunque de recursos y prestaciones limitadas. Consta de tres grandes
bloques.

BLOQUES DEL COMPUTADOR

1. Unidad de proceso:
A. Procesador.
B. Memoria de programa.
C. Memoria de datos.
D. Líneas de E/S.

2. Periféricos complementarios:
A. Temporizadores.
B. Conversores A/D.
C. Comparadores analógicos.
D. Puertos de comunicación.
E. Otros.

3. Recursos auxiliares:
A. Circuito de reloj.
B. Modos de bajo consumo.
C. Perro Guardián.
D. «Reset» al conectar la alimentación.
E. Otros.

Lo verdaderamente curioso es que con tantas cosas como hay dentro del microcon-
trolador sólo existe comunicación con el exterior a través de las patitas o «pines» exis-
tentes en la cápsula, que pueden ser tan pocas como seis u ocho. Dichas patitas sirven
para recibir la alimentación, la señal de reloj para sincronizar su funcionamiento, para
controlar los periféricos externos a gobernar y para sacar o introducir información con
el mundo exterior (Fig. 1.11).
Si sólo existiese un modelo de microcontrolador, éste debería tener muy potenciados
todos sus recursos para poderse adaptar a las exigencias de las múltiples aplicaciones
posibles. Esta potenciación supondría un despilfarro en muchos casos. En la práctica,
cada fabricante oferta un elevado número de modelos diferentes desde los más sencillos
hasta los más potentes. Es posible seleccionar la capacidad de la memoria, la velocidad
de funcionamiento, los periféricos y recursos complementarios, el número de líneas de
E/S, etc. Por todo ello, un aspecto muy destacado en la labor del ingeniero de diseño es
la elección del microcontrolador apropiado.

EJEMPLO
Un horno microondas se gobierna mediante un microcontrolador en el que se almacena
el programa, que tiene 382 instrucciones, cada una de las cuales ocupa una palabra
de la memoria de código. Para soportar el teclado y la pantalla LCD necesita de doce
10 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 1.11. El computador que hay en el microcontrolador sólo dispone de las patitas exis-
tentes en el encapsulado para comunicarse con los periféricos y dispositivos
externos a gobernar, recibir la alimentación y la señal de reloj.

líneas de E/S. ¿Cuál de los siguientes modelos de microcontroladores es el que más se


adapta a los requerimientos de la aplicación?

Memoria instr.
Modelo Líneas E/S Precio (euros)
(palabras)

PIC12F508 512 6 1,30


PIC16F83 512 13 2,17
PIC16F84A 1.024 13 2,50
PIC16C54 4.096 33 3,17

SOLUCIÓN
Para esta aplicación es suficiente el PIC16F83 y su empleo supone una importante eco-
nomía de material y mano de obra.

1.4. DIFERENCIA ENTRE MICROCONTROLADOR


Y MICROPROCESADOR
El microprocesador es un circuito integrado que contiene la Unidad Central de Pro-
ceso (UCP) de un computador. La UCP, también llamada procesador, está formada
por la Unidad de Control, que interpreta o traduce las instrucciones, y el Camino de
Datos, que se encarga de ejecutar las operaciones que conllevan las instrucciones.
MICROCONTROLADOR: LA SOLUCIÓN ESTÁ EN UN CHIP 11

Figura 1.12. Un computador basado en un microprocesador es un sistema «abierto» que puede configu-
rarse a medida adaptando a sus buses los módulos necesarios.

Por las patitas de un microprocesador salen al exterior las líneas de los buses de
direcciones, de datos y de control para permitir comunicar el procesador con la Memo-
ria y los Módulos de E/S para configurar un computador completo. De esta manera, el
computador completo se construye con varios circuitos integrados y se dice que el sis-
tema que configura un microprocesador es «abierto» porque su estructura varía según la
aplicación a la que se destine (Fig. 1.12).

Un microcontrolador es un sistema «cerrado» porque contiene un computador completo y


de prestaciones fijas y limitadas que son difíciles de modificar.
Un microprocesador sólo es una parte del computador, la más importante, la UCP, y
para construir un computador completo hay que conectar otros circuitos integrados que
contengan la Memoria y los Módulos de E/S; por eso, se puede configurar a medida y se
llama sistema «abierto».

El PC es un computador conocido por todos que está basado en un microprocesador,


como el Pentium, que reside en la tarjeta principal y se conecta con los módulos de me-
moria, los controladores de periféricos (disco duro, impresora, etc.) y recursos auxiliares
(fuente de alimentación, circuito de reloj, etc.) configurando la máquina a la medida del
usuario (Fig. 1.13).
Aunque hay excepciones, los microcontroladores contienen todos los elementos
del computador y sus patitas se conectan directamente a los periféricos externos. Al no
disponer en el exterior de los buses, es bastante complicado ampliar las características
con las que se ha fabricado.
12 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 1.13. Alrededor del microprocesador Pentium se distribuyen y conectan los módulos de memoria
y de periféricos que configuran el PC.

1.5. ARQUITECTURA INTERNA


Las partes principales que existen en un microcontrolador son cinco.

1. Procesador o UCP.
2. Memoria para las instrucciones y para los datos.
3. Líneas de E/S para la comunicación con el exterior.
4. Periféricos, como temporizadores, conversores AD, comparadores analógicos, etc.
5. Recursos auxiliares, como Perro Guardián, circuito de reloj, modo de funcionamiento
con bajo consumo, etc.

1.5.1. El procesador
Es la parte más importante del computador y se compone de dos grandes bloques:

1.o Unidad de Control, que se encarga de interpretar el tipo de instrucción que se


debe realizar
2.o Camino de Datos, que realiza las operaciones con los datos que implican las
instrucciones.
MICROCONTROLADOR: LA SOLUCIÓN ESTÁ EN UN CHIP 13

Figura 1.14. La Unidad de Control de la UCP recibe las instrucciones de la memoria, las interpreta y
gobierna al Camino de Datos para realizar las operaciones correspondientes con los datos.

La Unidad de Control recibe las instrucciones en formato binario o máquina desde


la memoria que almacena el programa y genera las órdenes que necesita el Camino de
Datos para efectuarlas, recibiendo datos de entrada y generando otros de salida que se
almacenan en la memoria de datos (Fig. 1.14).
La estructura del procesador mostrado en la Figura 1.14 corresponde a la propuesta
por Von Neumann y tiene el inconveniente de guardar en la misma memoria las instruc-
ciones y los datos. Con objeto de poder acceder simultáneamente a instrucciones y datos
y, además, adaptar las características de las memorias a sus contenidos se utiliza la ar-
quitectura Harvard, que dispone de memorias independientes para datos e instrucciones
(Fig. 1.15).

1.5.2. Memoria de programa


Es la memoria donde se guardan las instrucciones del programa que tiene que ejecutar
el microcontrolador. La longitud de sus palabras se adapta al número de bits que tienen
las instrucciones y su capacidad se adecúa al tamaño que previsiblemente tendrán los
programas para los que se destina. En los microcontroladores, es interesante no tener
que ampliar el tamaño de esta memoria por lo que supone en el volumen y precio del
sistema.
14 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 1.15. La arquitectura Harvard, habitual en los microcontroladores, dispone de memorias inde-
pendientes para datos e instrucciones.

Como el programa a ejecutar en un microcontrolador siempre es el mismo, debe


estar grabado de forma permanente y no volátil. Los tipos de memoria que se adaptan a
estas exigencias son los siguientes:

A) ROM
El programa se graba en la memoria del microcontrolador durante su fabricación me-
diante el uso de «máscaras». Los altos costes de diseño e instrumental sólo aconsejan el
uso de la ROM en series de producción muy altas, como sucede con los electrodomésti-
cos y productos de gran consumo. No se puede borrar ni volver a utilizar.

B) EPROM
Si el microcontrolador dispone de memoria EPROM para contener el programa, la gra-
bación del mismo se realiza con un dispositivo (grabador) gobernado desde un PC. En la
superficie de la cápsula del microcontrolador hay una ventana de cristal por la que puede
someterse al chip a rayos ultravioleta para conseguir el borrado de la memoria EPROM y
utilizarla nuevamente. Este tipo de memoria es muy interesante en la fase de diseño y de-
puración de programas, pero su coste unitario es elevado y su manipulación es complicada
y precisa de grabadores y «quemadores».

C) OTP (Programable una vez)


Al igual que la memoria EPROM, el usuario puede grabar el programa en este tipo de
memoria, pero ya no se puede borrar. El bajo precio de los microcontroladores con OTP
MICROCONTROLADOR: LA SOLUCIÓN ESTÁ EN UN CHIP 15

y la sencillez de la grabación recomiendan este tipo para prototipos finales y series de


producción cortas.

D) EEPROM
La grabación es similar a la de las memorias EPROM y OTP, pero el borrado para su
reutilización es mucho más simple, porque utiliza el mismo procedimiento eléctrico que
en la grabación. Sobre el mismo zócalo del grabador se puede programar y borrar tantas
veces como se desee. Es ideal en aplicaciones de diseño y educativas. Además de servir
para guardar el programa, en muchos modelos hay una parte de EEPROM como memo-
ria de datos no volátiles que tan necesarios son en algunas aplicaciones.
Es una memoria no volátil que suele garantizar el fabricante hasta un millón de
ciclos de grabación/borrado. Como inconveniente, destaca el elevado y variable tiempo
que se precisa para la escritura y el borrado, la dificultad de alcanzar grandes capacida-
des y el elevado consumo de energía. Está siendo desplazada por la tecnología FLASH.

E) FLASH
Se trata de una memoria no volátil, de bajo consumo, que se puede grabar y borrar en cir-
cuito al igual que las EEPROM, aunque disponen de mayor capacidad que estas últimas.
Se suelen garantizar los mil ciclos de grabado/borrado. El borrado y la escritura se realiza
sobre bloques completos en lugar de bytes en la EEPROM.
Son muy recomendables en aplicaciones en las que haya que modificar el programa
a lo largo de la vida del producto como consecuencia del desgaste o de cambios de piezas
o especificaciones, como ocurre con los automóviles.

1.5.3. Memoria de datos


Los datos que manejan los programas varían continuamente y esto exige que la memoria
que los contiene debe ser de lectura y escritura, por lo que la memoria RAM estática
(SRAM) es la más adecuada, aunque sea «volátil» y pierda su contenido al quitar la
alimentación.
Para guardar datos permanentes o no volátiles suele existir en los microcontrolado-
res un pequeño espacio de datos con memoria EEPROM.

Las memorias tipo EEPROM y FLASH pueden escribirse y borrarse eléctricamente en el


mismo circuito donde están montadas. No se precisa sacar el circuito integrado del zócalo
en el que residen.

1.5.4. Líneas de E/S


A veces, en ciertos modelos de microcontroladores, existen algunas patitas de la cápsula
que están reservadas para recibir la alimentación, la frecuencia de funcionamiento e
16 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

incluso para producir la reinicialización o reset. Las restantes se destinan a soportar la


comunicación con el mundo exterior.
Las líneas de E/S sacan información de los periféricos y recursos internos al exterior.
También recogen información de los dispositivos exteriores y la introducen al microcon-
trolador para su procesamiento. Se suelen agrupar en conjuntos de ocho líneas, que se
llaman «puertas» o «puertos». Son de tipo multifuncional, lo que significa que pueden
realizar diversas funciones multiplexadas en el tiempo y programables.

1.5.5. Recursos y periféricos auxiliares


Según las aplicaciones a las que orienta el fabricante cada modelo de microcontrolador,
le incorpora diversos elementos que refuerzan y potencian su empleo. Entre los recursos
más comunes en casi todos los modelos se citan:

a) Circuito de reloj, que genera los impulsos que sincronizan el funcionamiento de todo
el sistema.
b) Temporizadores, destinados a controlar tiempos y retardos.
c) Perro Guardián («watchdog»), que vigila el programa y lo reinicializa cuando se blo-
quea.
d) Conversores A/D y D/A.
e) Comparadores analógicos, para analizar las señales analógicas.
f) Sistemas de protección ante fallos de la alimentación.
g) Modos de funcionamiento de bajo consumo.
h) Protocolos de comunicación, como I2C, USART, bus CAN, USB, etc.

Figura 1.16. Un proyecto con microcontrolador se materializa en una tarjeta de circuito impreso que
contiene al microcontrolador con el programa grabado y unos pocos elementos auxiliares.
La fotografía muestra una tarjeta para la creación de prototipos basados en PIC.
MICROCONTROLADOR: LA SOLUCIÓN ESTÁ EN UN CHIP 17

1.6. HERRAMIENTAS DE DISEÑO

El resultado de un proyecto basado en microcontrolador suele consistir en una pequeña


tarjeta de circuito impreso que soporta al microcontrolador, que tiene grabado en su
memoria de código el programa de control y una serie de componentes auxiliares. Dicha
tarjeta se conecta a la fuente de alimentación y a los sensores, actuadores y dispositivos
que gobierna (Fig. 1.16).
Para desarrollar un proyecto se precisan de herramientas para la creación del software
y para la implementación y puesta a punto del hardware. Entre las herramientas desti-
nadas al software se precisa un programa que permita desde un PC editar los programas
en un lenguaje, compilarlos para obtener el programa ejecutable, simular el programa y
depurarlo. Microchip ha creado para trabajar con sus microcontroladores PIC un entorno
integrado, denominado MPLAB IDE, que contiene todas las herramientas requeridas
para el desarrollo del software. El MPLAB IDE puede encontrarlo en el CD que acom-
paña al libro y su propietario lo pone a disposición de los usuarios libremente en su sitio
en Internet (www.microchip.com). Se recomienda visitar este sitio habitualmente para
trabajar con la última versión disponible (Fig. 1.17).

1. Gestión del proyecto 4. Editor de textos. 7. Vista de la EEPROM.


2. Ventana de registros. 5. Ventana de resultados. 8. Control memoria.
3. Ventana de inspecciones. 6. Memoria del programa.

Figura 1.17. El entorno MPLAB IDE de Microchip contiene todas las herramientas necesarias para el des-
arrollo del software de los proyectos que utilizan microcontroladores PIC.
18 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 1.18. Fotografía del grabador de PIC denominado «PIC’ Burner», de Ingeniería de Microsiste-
mas Programados.

Los lenguajes usados normalmente para la confección de los programas para mi-
crocontroladores son el Ensamblador, el C y el BASIC. Para todos ellos existen en el
mercado eficientes compiladores e intérpretes.
Confeccionado y puesto a punto el software, hay que grabar el programa ejecutable
en la memoria del microcontrolador, montar y conectar todos los componentes que con-

Figura 1.19. Fotografía de un emulador de Microchip que permite comprobar en tiempo real el compor-
tamiento del prototipo y depurarlo.
MICROCONTROLADOR: LA SOLUCIÓN ESTÁ EN UN CHIP 19

Figura 1.20. Los sistemas de desarrollo permiten grabar los microcontroladores, conectar los perifé-
ricos y comprobar en tiempo real el comportamiento del prototipo. Fotografía de la PIC
School empleada en esta obra para el desarrollo de las aplicaciones prácticas.

figuran el hardware en la PCB y comprobar el correcto funcionamiento del prototipo.


Tanto los fabricantes de microcontroladores como otras empresas relacionadas ofrecen
un completo abanico de grabadores, emuladores y sistemas para el desarrollo de aplica-
ciones.

1.7. LOS FABRICANTES Y EL MERCADO MUNDIAL


Hasta el año 2002, Motorola ha ocupado el primer puesto del ranking mundial de fa-
bricantes de microcontroladores de 8 bits, que son los más populares. A partir de dicho
año, Microchip le ha reemplazado como líder mundial de dicho tipo de microcontrola-
dores. Otros importantes fabricantes de estos dispositivos son Mitsubishi, NEC, Intel,
SGS-Thomson, Hitachi, ST-Micro, Renesas, etc. (Fig. 1.21).
En el año 2000 casi se vendieron cuatro billones de microcontroladores de 8 bits,
alcanzando Microchip unas ventas superiores cercanas a los 500 millones de dólares. En
2006, dicha empresa alcanzó una cifra de ventas cercana a los 1.000 millones de dólares
(Fig. 1.22).
20 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 1.21. «Ranking» mundial de los principales fabricantes de microcontroladores de 8 bits ordenado
por el número de unidades vendidas (Dataquest).

Figura 1.22. Crecimiento de las ventas anuales de microcontroladores de Microchip.


CAPÍTULO
Los PIC,
una familia numerosa 2

2.1. LA SELECCIÓN DEL MEJOR


De un centenar de fabricantes de microcontroladores con varios miles de modelos dife-
rentes resulta una misión imposible elegir al «mejor». En realidad, no existe, porque en
cada aplicación son sus requerimientos específicos y las circunstancias que la rodean los
que determinan el microcontrolador más conveniente para ese caso.
Los microcontroladores PIC tienen «ángel», así como una gran aceptación en la
comunidad de profesionales y aficionados que se dedican al diseño de aplicaciones. Ésta
es la favorable sensación que comparten los autores de este libro, quienes, admitiendo su
subjetividad, sólo han utilizado PIC desde que los conocieron.
¿Cuáles son las razones de la excelente imagen de los PIC? Hay detalles que nos
apasionan a los que trabajamos a caballo entre la electrónica y la informática, de los
cuales citamos los más importantes:

• Sencillez de manejo.
• Magnífica información técnica.
• Precio ajustado y buena disponibilidad.
• Instrucciones comprensibles y poco numerosas.
• Excelente promedio de los parámetros de funcionamiento: velocidad, consumo, alimen-
tación, tamaño, etc.
• Herramientas de desarrollo abundantes, fáciles y baratas.
• Compatibilidad del software y hardware que facilitan la migrabilidad hacia modelos su-
periores.
• Gran variedad de modelos para encontrar el más apropiado para cada caso.
• Disposición del fabricante Microchip y de sus empleados para ayudar a sus clientes .

Microchip es generosa con sus clientes y pone a su disposición gratuitamente poten-


tes herramientas software a través de Internet. También comercializa a precios compe-
titivos herramientas hardware que soportan la realización de proyectos y colabora con
otras empresas a desarrollar equipos y programas para cimentar un mercado con una
gran variedad de ayudas al diseño con microcontroladores PIC.

21
22 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 2.1. En el mercado existen excelentes y económicas herramientas para el entrenamiento y diseño
con PIC. En la fotografía, el sistema de desarrollo «Micro’ PIC Trainer», de Ingeniería de
Microsistemas Programados.

Microchip es el líder mundial en la venta de microcontroladores de 8 bits desde 2002,


y en la actualidad, potencia la línea de microcontroladores de 16 bits y la de los Contro-
ladores Digitales de Señal (DSC).

Figura 2.2. Espectacular crecimiento del número de modelos diferentes de microcontroladores PIC.
LOS PIC, UNA FAMILIA NUMEROSA 23

Figura 2.3. Clasificación de los microcontroladores PIC fabricados por Microchip.

2.2. LA GRAN FAMILIA DE LOS PIC


Cada proyecto tiene sus propios requerimientos técnicos y necesidades y lo ideal es
resolverlo con aquel microcontrolador que las cumpla exactamente. Si no cubre algu-
na de ellas, habría que añadir elementos auxiliares externos que complican, encarecen
y aumentan el volumen del equipo físico. Si el microcontrolador tiene más potencia,
capacidad y recursos que lo que necesita la aplicación, se están desaprovechando y se
está pagando más y trabajando con un dispositivo más complejo y voluminoso que lo
necesario.
El objetivo de los fabricantes de microcontroladores es ofertar una amplia gama de
modelos, desde los más simples hasta los más complejos, para que todos encuentren el
que precisan.
La variedad de PIC aumenta incesantemente, y en la actualidad, los modelos conte-
nidos en el catálogo comercial alcanzan aproximadamente los tres centenares, incluyen-
do los de 8 y 16 bits.

Desde 1990, Microchip ha vendido más de cuatro billones de microcontroladores PIC y


más de 400.000 sistemas de desarrollo.

Microchip fabrica microcontroladores de 8 y 16 bits, existiendo diversas categorías


o gamas en cada tipo (Fig. 2.3).
Paralelamente al aumento del número de modelos, ha ido creciendo la potencia y
el rendimiento de los microcontroladores PIC, hasta alcanzar versiones muy cercanas
a los DSP (Procesadores Digitales de Señales), que permiten resolver aplicaciones de
alta complejidad y que tienen un espléndido futuro (Fig. 2.4).
24 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 2.4. Aumento del rendimiento y prestaciones de los microcontroladores PIC.

2.3. PRINCIPALES CARACTERÍSTICAS


Los microcontroladores PIC se distinguen por poseer cinco características específicas
que les otorga una ventaja significativa sobre sus competidores.

1.a Arquitectura RISC, tipo Harvard, basada en un banco de registros.


2.a Juego de instrucciones reducido de la misma longitud y ortogonal.
3.a Cauce de procesamiento segmentado.
4.a Herramientas de desarrollo abundantes, fáciles y económicas.
5.a Gran diversidad de modelos para facilitar la migrabilidad.
LOS PIC, UNA FAMILIA NUMEROSA 25

2.3.1. Arquitectura RISC, tipo Harvard, basada en un banco


de registros
La arquitectura Harvard se caracteriza por disponer de dos memorias independientes
para contener los datos y las instrucciones. Esta dualidad permite el acceso simultáneo,
así como que la longitud de las posiciones y la capacidad de cada memoria se acomode
a los requerimientos de las instrucciones y de los datos.
Por ser un procesador RISC, el número de instrucciones es reducido. Así, la gama básica
sólo dispone de 33 instrucciones en su repertorio, la gama media de 35 y la gama mejorada
de 79. Una propiedad muy interesante hace referencia a la longitud de las posiciones de la
memoria de programa, que se ajusta al tamaño de la instrucción. De esta forma, la longitud de
las posiciones de la memoria de instrucciones de la gama básica es de 12 bits, la de la gama
media de 14 bits y la de la gama mejorada de 16 bits. La simplicidad de la función que realiza
cada instrucción permite que la mayoría se ejecute en un solo ciclo de instrucción equivalente
a cuatro ciclos de reloj. Todas estas características permiten que el tamaño de los programas
sea muy compacto, la velocidad de ejecución excelente y los compiladores para el lenguaje
C estén optimizados.

2.3.2. Juego de instrucciones reducido, de la misma longitud


y ortogonal
Los procesadores RISC tienen un juego de instrucciones reducido y de gran simplicidad
que hace que su ejecución sea de un ciclo de instrucción. La ortogonalidad significa que
cualquier instrucción puede manejar cualquier elemento como fuente o destino.
La longitud de las instrucciones es diferente para cada gama.

Figura 2.5. Las memorias independientes permiten el acceso simultáneo y la adecuación de la capacidad
y longitud de cada memoria a los datos y las instrucciones.
26 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 2.6. El cauce segmentado en dos etapas supone que cada T/2 sale de él una instrucción ejecu-

A) GAMA BÁSICA: instrucciones de 12 bits de longitud.


B) GAMA MEDIA: instrucciones de 14 bits de longitud.
C) GAMA MEJORADA: instrucciones de 16 bits de longitud.

2.3.3. Cauce de procesamiento segmentado


El dividir el cauce donde se ejecutan las instrucciones en etapas supone una notable re-
ducción del tiempo que tarda en ejecutarse cada una debido al paralelismo implícito. En
cada instante se están ejecutando tantas instrucciones como etapas existan en el cauce,
ya que en cada etapa hay una instrucción. En la Figura 2.6 se muestra el cauce de dos
etapas correspondiente a los PIC. Mientras en la segunda etapa se realiza la fase de ejecu-
ción de la instrucción en curso, en la primera se procede a la búsqueda de la siguiente
instrucción en la memoria de programa. Si las dos etapas necesitan el mismo tiempo
una vez que está el cauce lleno, el tiempo que transcurre entre cada ejecución de una
instrucción es de T/2.

2.3.4. Herramientas de desarrollo abundantes, fáciles y económicas


Tanto Microchip como otras segundas fuentes se esfuerzan en poner a disposición de
los usuarios de PIC herramientas software y hardware eficaces en la implementación de
proyectos. La más destacable es el entorno integrado MPLAB IDE y el programador-
depurador ICD2, ambas de Microchip (Fig. 2.7).

2.3.5. Gran diversidad de modelos para facilitar la migrabilidad


Optimizar un proyecto conlleva la elección del modelo de microcontrolador que cumpla
todas las especificaciones. Entre unos 300 modelos de PIC resulta fácil elegir el más
adecuado para cada aplicación.
LOS PIC, UNA FAMILIA NUMEROSA 27

Figura 2.7. Fotografía del grabador-depurador ICD2 de Microchip.

La migrabilidad es la posibilidad de poder cambiar de microcontrolador cuando lo


requiere la aplicación, pues existe compatibilidad del hardware y del software.
La compatibilidad hardware se consigue manteniendo la distribución de las funcio-
nes de las patitas en los diferentes encapsulados y las características fundamentales de
los módulos periféricos (Fig. 2.8).
La compatibilidad software se produce:

a) Por existir las mismas instrucciones en cada gama.


b) Por ser muy parecidas las instrucciones en distintas familias.
c) Por utilizar las mismas herramientas de desarrollo para todas las familias.

Figura 2.8. Al mantener la distribución de las patitas y sus funciones en los diversos encapsulados se
favorece la migrabilidad entre dispositivos; en este caso, de 8, 14 y 20 patitas.
28 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Estas propiedades de los PIC posibilitan la ampliación de la capacidad de la me-


moria del dispositivo, así como la inclusión de nuevos periféricos sin perder el software
desarrollado y con mínimos cambios en el conexionado.
Se describen otras aportaciones típicas de los PIC.

A) Tecnología nanoWatt
Con ella se consigue una gran flexibilidad en el voltaje de alimentación (de 2 a 5,5 VDC),
múltiples modos de generar las señales de reloj y posibilidad de funcionamiento con bajo
consumo.

B) Encapsulados variados
Para poder usar en diferentes montajes.

C) Mejora del proceso de fabricación


Entre 1998 y 2003, Microchip rebajó la tecnología de fabricación de sus chips desde 0,7
hasta 0,4 µm (micras), con un voltaje de alimentación comprendido entre 2 y 5,5 VDC.
Desde 2003 al 2006, la tecnología ha bajado hasta 0,22 µm y la tensión del núcleo del
procesador de 2 a 3,6 VDC, manteniéndose en 5 V la tensión para los elementos de
entrada/salida.

D) Fabricación libre de plomo

E) Estrategia comercial
Red mundial de oficinas con soporte tecnológico y comercial.

F) Información técnica
Existe una sección en Internet completísima que incluye herramientas gratuitas, suministro
de muestras, atención exquisita y disponibilidad inmediata.

2.4. LA GAMA BÁSICA


La misión de este libro, que constituye la primera parte de una obra dedicada a los micro-
controladores de Microchip, es la de facilitar al lector el diseño de aplicaciones usando los
microcontroladores PIC de 8 bits de la gama básica y los más sencillos de la gama media. La
segunda parte se dedica a los modelos avanzados de la gama media y a los de la gama mejorada.
Finalmente, el libro dsPIC. Diseño Práctico de Aplicaciones está destinado a los Controladores
Digitales de Señal (DSC), que son la combinación de los microcontroladores PIC de 16 bits con
los principales recursos propios de los DSP (Procesadores Digitales de Señales).
Los modelos de la gama básica son los más simples y económicos, estando bastan-
te limitada su potencia, su capacidad de memoria y el número de recursos y periféricos
que disponen. Pero ¡son los que más se venden! Con ellos se fabrican multitud de
productos de consumo masivo, y si lo quiere comprobar, métase la mano al bolsillo
o curiosee lo que tiene alrededor. Probablemente encontrará las llaves y el mando a
distancia del coche, el de la alarma de casa, el de apertura de la puerta del garaje. Abra
la tapa y localice un pequeño circuito integrado con muy pocas patitas. ¿Qué es? Un
microcontrolador PIC de la gama básica (Fig. 2.9).
LOS PIC, UNA FAMILIA NUMEROSA 29

Figura 2.9. El mando a distancia para el control de la alarma de casa lo controla un PIC de la gama
básica.

Como se refleja en el gráfico de la Figura 2.10, la gama básica abarca modelos


que se caracterizan por sus encapsulados con pocas patitas (de 6 a 40) y por su escasa
capacidad de memoria de programa (hasta 2 K palabras de 12 bits).
Estos pequeños microcontroladores están orientados a proveer soluciones con el
menor coste y volumen posible, lo que les hace muy recomendables para gobernar todos
los productos de escasa complejidad que funcionan con batería, como los mandos a dis-
tancia, los pastilleros y las alarmas portátiles.
La familia PIC10F, comprende un conjunto de baratísimos microcontroladores de
8 bits presentados en una cápsula diminuta con sólo seis patitas. Resuelven numerosas
aplicaciones y sólo requieren un corto período de aprendizaje.
La familia PIC12F, cuyos modelos están encapsulados con ocho patitas, se utiliza
universalmente para resolver las aplicaciones típicas que están limitadas por el volumen
y por el peso y que hasta hace poco se resolvían con dispositivos electrónicos lógicos,
ASIC, elementos electromagnéticos, etc. Su extraordinaria sencillez de manejo y sus
excepcionales prestaciones, unidas al bajo precio, han popularizado el empleo de estos
microcontroladores en numerosas aplicaciones de bajo coste, entre las que destacan las
siguientes:

• Cargadores de baterías.
• Control de motores eléctricos.
• Sensores remotos.
• Sistemas de seguridad.
30 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

• Temporizadores diversos.
• Termómetros.
• Juguetes.
• Detectores de gas.
• Mandos a distancia.
• Termostatos.
• Programadores.
• Secadores de pelo.
• Tostadoras.
• Máquinas de afeitar.
• Reostatos.
• Planchas.
• Paelleras.
• Relojes de pulsera.

Memoria Oscilador
RAM Líneas Encapsu- ADC Compa- Temporiza- F. máx
Modelo programa interno
bytes E/S lado canales rador dores MHz
Flash MHz

PIC12F508 512 × 12 25 6 8P, 8SN, — — 1 de 8 bits 4 4


8MS WDT
PIC12F509 1 K × 12 41 6 8P, 8SN, — — 1 de 8 bits 4 4
8MS WDT
PIC12F510 1 K × 12 38 6 8P, 8SN, 3×8 1 1 de 8 bits 8 8
8MS bits WDT

Figura 2.10. Los principales modelos de la gama básica tienen pocas patitas y poca capacidad de memoria.
La tabla recoge las principales características de algunos modelos PIC12F de ocho patitas.
LOS PIC, UNA FAMILIA NUMEROSA 31

Los PIC12F de oho patitas han revolucionado la «mecatrónica», que es una especia-
lidad que integra el software con la microelectrónica en los sistemas mecánicos clásicos.
Desde 1990, Microchip ha vendido millones de estos diminutos microcontroladores que
se han incrustado en multitud de productos del hogar y de la industria desplazando a los
clásicos elementos mecánicos del siglo pasado, como los relés.
Finalmente, y dentro de la gama básica, existen modelos PIC16F5X y PIC16C5X
que se presentan en cápsulas de 16 a 40 patitas y que disponen de una capacidad de me-
moria y un número de recursos importante.
Todos los modelos de la gama básica responden a un repertorio de 33 instrucciones
de 12 bits de longitud cada una.

2.5. LA GAMA MEDIA


Comprende un elevado número de modelos de las familias PIC12 y PIC16 que se hallan
encapsulados con 8 hasta 64 patitas y que responden a un repertorio de 35 instrucciones
de 14 bits de longitud cada una. Es la gama más variada y completa de PIC y se distin-
guen por manejar una memoria de programa FLASH muy flexible, de bajo consumo
y que precisa una alimentación de 2 a 5,5 VDC. Su rendimiento alcanza los 5 MIPS y
posee una gran variedad de periféricos integrados, como conversores A/D, controladores
LCD, temporizadores, comparadores analógicos, comunicaciones I2C, USART, CAN,
USB, SPI, etc. Los procesadores de esta gama manejan interrupciones y la Pila dispone
de ocho niveles de profundidad frente a sólo dos en la gama básica.
En el repertorio de instrucciones de la gama media se añaden cuatro nuevas a las de
la gama básica (RETURN, RETFIE, ADDLW y SUBLW), mientras que desaparecen
dos de las antiguas (OPTION y TRIS).

Figura 2.11. La gama media ocupa una posición intermedia en cuanto al número de patitas y capacidad
de la memoria de programa que la sitúa entre la básica y la mejorada.
32 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Memoria
EEPROM RAM Líneas ADC Com- F. máx CCP/
Modelo programa Encapsulado
bytes bytes E/S canales parador MHz ECCP
FLASH
PIC12F629 1 K × 14 128 64 6 8P, 8SN, 8MD — 1 20 —
PIC12F635 1 K × 14 128 64 6 8P, 8SN, 8MD — 1 20 —
PIC12F675 1 K × 14 128 64 6 8P, 8SN, 8MD 4 × 10 1 20 —
bits
PIC12F683 2 K × 14 256 128 6 8P, 8SN, 8MD 4 × 10 1 20 1/0
bits

Figura 2.12. Características destacadas de los cuatro modelos de ocho patitas de la gama media de la
familia PIC12F que pronto se verá aumentada por otros nuevos.

La variedad de modelos de la gama media es enorme: cuatro de la familia PIC12F


de ocho patitas, cuarenta y uno de la PIC16F, uno de la PIC14000 y veintiséis de la
PIC16C. En un futuro próximo, Microchip pondrá en el mercado tres nuevos modelos de
la PIC12F, nueve de la PIC16F y cuatro de la PIC16C. En la tabla de la Figura 2.12 se
muestran las características más representativas de los cuatro modelos de ocho patitas de
la gama media. Todos ellos disponen de un temporizador de 16 bits y otro de 8 menos el
PIC12F683, que tiene dos temporizadores de 8 bits.
Dentro de la gama media existen familias especializadas, como la que dispone de un
controlador LCD (PIC16F913/914/916/917/918) capaz de manejar fácilmente pantallas
LCD de 60 a 168 segmentos y que también disponen de conversores AD, comparadores
analógicos y comunicaciones I2C, SPI y USART.

2.6. LA GAMA MEJORADA


Está formada por modelos de la familia PIC18 que utilizan una palabra de 16 bits para
codificar cada instrucción y se comercializan en cápsulas de 18 a 80 patitas.
Los microcontroladores PIC18 disponen de un núcleo de procesador muy mejora-
do que permite soportar 32 niveles en la Pila y un extenso conjunto de interrupciones
internas y externas. La mayoría de las 79 instrucciones de su repertorio se ejecutan en
un ciclo de instrucción (4 × TOSC) con excepción de las de salto, que tardan el doble.
Se supera un rendimiento de 10 MIPS. En la Figura 2.13 se muestra la alta densidad
de la memoria FLASH de código, que es proporcional al número de patitas del en-
capsulado.
La combinación de las elevadas capacidades de memoria de código (128 KB) en
combinación con el alto número de patitas permite la disponibilidad de modelos espe-
cializados orientados a:
a) Manejo de LCD de hasta 192 segmentos.
b) Interfaz USB hasta 12 Mbits/s.
c) Interfaz CAN 2.0B Active.
d) Interfaz LIN 1.2.
e) Capacidad para la tecnología ZigBee.
f) Capacidad para conexión Internet (TC/IP, 10BASE-T).
LOS PIC, UNA FAMILIA NUMEROSA 33

Figura 2.13. La alta densidad de la memoria FLASH de la gama mejorada es función del número de
patitas de la cápsula.

En la tabla de la Figura 2.14 se muestran las características relevantes del PIC 18F8722
de ochenta patitas con 128 KB de FLASH. Dispone de tres temporizadores de 16 bits y dos
de 8, oscilador interno de 8 MHz o 32 KHz, dos módulos EUSART, 2 módulos I2C y se
fabrica con tecnología nanoWatt.

FLASH EEPROM RAM Líneas Encap- ADC Compa- F. máx CCP/


Modelo
bytes bytes bytes E/S sulado canales rador MHz ECCP
PIC18F8722 128 K 1K 3.936 70 80 PT 16×10 bits 2 40 2/3

Figura 2.14. Características relevantes del modelo PIC18F8722 de la gama mejorada.

Entre algunas de las aplicaciones típicas de la gama mejorada se citan las siguientes.

• Robótica industrial.
• Automatización.
• Control de movimientos.
34 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

• Periféricos de computadores.
• Cargadores de baterías.
• Máquinas expendedoras.
• Control remoto.
• Desfibriladores.
• Monitores de presión arterial.
• Sistemas de diagnóstico.
• Monitores de glucosa.
• Fuentes de alimentación ininterrumpibles.
• Sistemas de seguridad y alarma.
• Acondicionadores de aire.
• Control de motores.
• Videoconsolas y juguetes.
• Equipos MP3.
• Gestión de minibares en hoteles.

2.7. LOS MICROCONTROLADORES DE 16 BITS DE MICROCHIP


La estrategia de desarrollo de microcontroladores de 16 bits seguida por Microchip se
basa en potenciar dos líneas diferentes:

A) Microcontroladores clásicos de 16 bits (MCU)


Familias PIC24F y PIC24H
B) Controladores Digitales de Señal (DSC)
Familias dsPIC30F y dsPIC33F

Los microcontroladores de 16 bits, tipo MCU, incrementan considerablemente la


potencia de cálculo, la velocidad y las capacidades de las memorias frente a la gama
mejorada de 8 bits al mismo tiempo que aumentan la cantidad y las prestaciones de los
periféricos integrados.
Los microcontroladores de 16 bits, tipo DSC, son superiores a los MCU en presta-
ciones y en rendimiento al incorporar recursos propios de los DSP que les permiten apli-
carse en el área del procesamiento digital de señales que tan brillante porvenir presenta.
Los dispositivos de la familia PIC24F se parecen a los PIC18F, pero les aventajan en
las siguientes especificaciones:
a) Capacidad de memoria.
b) Instrucciones más potentes.
c) Registros de trabajo.
d) Modos de direccionamiento.
e) Control de la pila.
La longitud de las instrucciones de los microcontroladores de 16 bits de Micro-
chip es de 24 bits, mientras que la de los datos es de 16 bits. El espacio de la memoria
de programa puede alcanzar los 8 MB y el de datos los 64 KB. Estas características
orientan las aplicaciones de los microcontroladores de 16 bits hacia las que no son
capaces de soportar los de la gama mejorada. En la Figura 2.15 se muestran algunas
características destacadas de algunos modelos PIC24F. Todos ellos disponen de cinco
LOS PIC, UNA FAMILIA NUMEROSA 35

Modelo Patitas FLASH (KB) RAM (KB)

24FJ64GA006 64 64 8
24FJ64GA008 80 64 8
24FJ64GA010 100 64 8

24FJ128GA006 64 128 8
24FJ128GA008 80 128 8
24FJ128GA010 100 128 8

Figura 2.15. Características destacables de seis modelos de la familia PIC24F.

temporizadores, cinco módulos de Captura, cinco módulos de Comparación, cinco módulos


PWM, dos comparadores, dieciséis canales de un conversor AD de 10 bits a 500 ksps, dos
UART, dos SPI, dos módulos I2C y un reloj calendario en tiempo real.
La familia PIC24H alcanza un rendimiento de 40 MIPS y una capacidad de memoria
FLASH de programa de 256 KB y de 16 KB de RAM. Además, dispone de un controla-
dor DMA con ocho canales y oscilador interno (Fig. 2.16).
DMA #CH
Flash (KB)

RAM (KB)

OC PWM

12 bits ADC

CODEC
Timers
Patitas

UART

RC Osc

CAN
SPI

I2C
Modelo 500 KSPS
con PLL
#ADC, #CH

24HJ64GP206 64 64 8 8 9 8 1 ADC, 18 Ch 2 2 1 0 0 SI
24HJ64GP210 100 64 8 8 9 8 1 ADC, 32 Ch 2 2 2 0 0 SI
24HJ64GP506 64 64 8 8 9 8 1 ADC, 18 Ch 2 2 2 1 0 SI
24HJ64GP510 100 64 8 8 9 8 1 ADC, 32 Ch 2 2 2 1 0 SI
24HJ128GP206 64 128 8 8 9 8 1 ADC, 18 Ch 2 2 1 0 0 SI
24HJ128GP210 100 128 8 8 9 8 1 ADC, 32 Ch 2 2 2 0 0 SI
24HJ128GP506 64 128 8 8 9 8 1 ADC, 18 Ch 2 2 2 1 0 SI
24HJ128GP510 100 128 8 8 9 8 1 ADC, 32 Ch 2 2 2 1 0 SI
24HJ128GP306 64 128 16 8 9 8 1 ADC, 18 Ch 2 2 2 0 0 SI
24HJ128G310 100 128 16 8 9 8 1 ADC, 32 Ch 2 2 2 0 0 SI
24HJ256GP206 64 256 16 8 9 8 1 ADC, 18 Ch 2 2 2 0 0 SI
24HJ256GP210 100 256 16 8 9 8 1 ADC, 32 Ch 2 2 2 0 0 SI
24HJ256GP610 100 256 16 8 9 8 1 ADC, 32 Ch 2 2 2 2 0 SI

Figura 2.16. Principales características de diversos modelos de microcontroladores de 16 bits de la


familia PIC24H.

En cuanto a las familias dsPIC30F y dsPIC33F de DSC tienen bastante parecido a


las PIC24F y PIC24H, respectivamente, pero además integran los recursos y las instruc-
ciones necesarias para cubrir las funcionalidades típicas de los DSP. Los mismos autores
y en la misma editorial tienen publicado el libro dsPIC. Diseño Práctico de Aplicaciones,
que está dedicado exclusivamente a los DSC.
CAPÍTULO
El más humilde de la gama
básica: PIC12F508
3

3.1. JUSTIFICANDO LA ELECCIÓN


Para iniciar el aprendizaje y manejo de los microcontroladores PIC hemos elegido el
modelo PIC12F508, el más «pobre», con ocho patitas de la gama básica.
La selección está motivada por nuestro trabajo como profesores. En el verano de
2006 estábamos preparando el programa y la estrategia a seguir en una asignatura titu-
lada «Diseño de Sistemas Basados en Microcontrolador» para alumnos de ingeniería
enfocados a la electrónica industrial que aún no habían recibido ninguna enseñanza
sobre microcontroladores. Intentamos ajustarnos a las nuevas directrices didácticas
europeas y decidimos estructurar una asignatura eminentemente práctica. Si tenían que
aprender los alumnos a diseñar, la única forma de conseguirlo era diseñando. La mayor
cantidad de horas que tenía que dedicar el alumno a nuestra asignatura estaba enfocada
a la realización de experiencias, prácticas, programas y un proyecto final como resul-
tado definitivo en el que recaería la evaluación y que debería ser presentado por cada
equipo de trabajo al terminar el curso ante el profesor y un grupo de estudiantes de
cursos superiores.
Tenemos la inmensa suerte de que nuestros alumnos son enormemente responsa-
bles y cuando se motivan se autoimponen metas muy exigentes. La asignatura tenía
asignados cinco créditos ECTS que suponen un trabajo total del alumno de 125 horas
e intentamos que los proyectos no fuesen demasiado complejos para no sobrepasar ese
tiempo. Íbamos a comenzar demostrándoles que una gran cantidad de aparatos que nos
rodean tenían incrustado un pequeño microcontrolador y les propusimos que «destri-
paran» todos los sospechosos que cayesen en sus manos: alarmas, mandos a distancia,
herramientas eléctricas, cargadores de baterías, detectores de humo, estaciones meteo-
rológicas, termostatos, juguetes, relojes y todo lo que les oliese a que dentro había un
computador (Fig. 3.1).
Teniendo en cuenta el tiempo disponible y el desconocimiento total del tema,
elegimos un proyecto común para todos que inicialmente tuviese unas especifi-
caciones muy sencillas, pero que el ingenio y el saber hacer de los diseñadores
admitiese múltiples ampliaciones y opciones. Así que presentaríamos en las clases
de teoría dos microcontroladores sencillos, uno de la gama básica (PIC12F508) y
otro de la gama media (PIC16F84A). En las clases prácticas de laboratorio propon-

37
38 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 3.1. Numerosos pequeños aparatos de mucho uso son gobernados por un sencillo microcontrola-
dor incrustado. Los dos que aparecen en la figura son candidatos a contener uno.

dríamos una serie de experiencias que les ayudasen a comprender las posibilidades
de los microcontroladores. Y, por último, tendrían que formar equipos de cuatro
personas y construir el prototipo de un «pastillero inteligente» que intentase ayudar
a los enfermos de SIDA para los que es tan importante tomar las dosis correcta-
mente. En el Apéndice C, contenido en el CD, se describe paso a paso el proyecto
de un pastillero con el PIC12F508.

Figura 3.2. Fotografía de un pastillero «normal» al que la inclusión de un microcontrolador le propor-


cionaría el calificativo de «inteligente».
EL MÁS HUMILDE DE LA GAMA BÁSICA: PIC12F508 39

Figura 3.3. Fotografía de un pastillero «inteligente» comercial.

No había restricciones en el proyecto, pero sus especificaciones había que deter-


minarlas a mitad de curso, y al final, el prototipo debería cubrir las mismas y funcionar
correctamente. En la evaluación de los pastilleros intervendría, además del profesor,
los compañeros y alumnos de cursos superiores. Se formaría un ranking con las valora-
ciones y las notas serían en función del mismo. Cuando algún pastillero no funcionase
o no respondiese a todas las especificaciones propuestas, el grupo correspondiente
tendría que ponerlo en marcha en verano.
En el libro que tiene en sus manos hemos recogido todo lo que hemos ofrecido a
nuestros alumnos para ayudarles a aprender a diseñar proyectos con los PIC más senci-
llos. Sólo una cosa más: el resultado ha sido fabuloso, y si le interesa conocer más datos,
póngase en contacto con cualquiera de nosotros, porque no trabajamos en la enseñanza,
sino que disfrutamos con ella y nos encanta compartir experiencias.

3.2. LOS COMPONENTES DE LA GAMA BÁSICA


Actualmente, el catálogo comercial de Microchip contiene veinte modelos de la gama
básica, aunque anuncia otros nuevos que sacará al mercado en breve.

Memoria Memoria Patitas F. máx


Modelo Temporizador Periféricos
FLASH RAM (bytes) E/S MHz
PIC10F200 256 × 12 16 4 4 1-8 bits —
PIC10F202 512 × 12 24 4 4 1-8 bits —
PIC10F204 256 × 12 16 4 4 1-8 bits 1 Comparador
PIC10F206 512 × 12 24 4 4 1-8 bits 1 Comparador
PIC10F220 256 × 12 16 4 8 1-8 bits ADC (2 × 8 bits)
PIC10F222 512 × 12 23 4 8 1-8 bits ADC (2 × 8 bits)

Figura 3.4. Modelos de la gama básica con seis patitas. Funcionan con una tensión comprendida entre
2 y 5,5 VDC y poseen Perro Guardián.
40 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Memoria Memoria Patitas F. máx


Modelo Temporizador Periféricos
FLASH RAM (bytes) E/S MHz
PIC12F508 512 × 12 25 6 4 1-8 bits —
PIC12F509 1 K × 12 41 6 4 1-8 bits —
PIC12F510 1 K × 12 38 6 8 1-8 bits ADC (3 × 8 bits)
y Comparador

Figura 3.5. Modelos de la gama básica con ocho patitas. Funcionan con una tensión comprendida entre
2 y 5,5 VDC y tienen Perro Guardián.

En la tabla de la Figura 3.6 se muestran cinco modelos de la gama básica de la fa-


milia PIC16F5XX que funcionan con una tensión de 2 a 5,5 VDC y disponen de Perro
Guardián y un temporizador.

Memoria Memoria Patitas F. máx


Modelo Temporizador Periféricos
FLASH RAM (bytes) E/S MHz
PIC16F505 1 K × 12 72 12 14 20 —
PIC16F506 1 K × 12 67 12 14 20 ADC (3 × 8 bits)
y Comparador
PIC16F54 512 × 12 25 12 18-20 20 —
PIC16F57 2 K × 12 72 20 28 20 —
PIC16F59 2 K × 12 134 32 40-44 20 —

Figura 3.6. Tabla que recoge las principales características de los modelos PIC16F5XX de la gama
básica.

Finalmente, en la tabla de la Figura 3.7 se presentan los modelos PIC16C5X de


la gama básica. Todos ellos tienen un temporizador de 8 bits, Perro Guardián y se ali-
mentan con una tensión comprendida entre 2 y 5,5 VDC, con excepción del modelo
PIC16HV540, que funciona con un voltaje comprendido entre 3,5 y 15 VDC y tiene
ocho líneas de E/S de alto voltaje (15 V), cuatro niveles de profundidad en la Pila y
cinco líneas de E/S que sacan al procesador del modo de bajo consumo cuando cam-
bian su estado lógico.

Memoria Memoria Patitas Patitas F. máx


Modelo Periféricos
FLASH RAM (bytes) E/S encapsulado MHz
PIC16C55 OTP 512 × 12 24 20 28 40 —
PIC16C56A OTP 1 K × 12 25 12 18-20 40 —
PIC16CR56A ROM 1 K × 12 25 12 18-20 20 —
PIC16C58B OTP 2 K × 12 73 12 18-20 20 —
PIC16CR58B ROM 2 K × 12 73 12 18-20 20 —
PIC16HV540 OTP 512 × 12 25 12 18-20 20 —

Figura 3.7. Principales características de los modelos PIC16C5X de la gama básica.


EL MÁS HUMILDE DE LA GAMA BÁSICA: PIC12F508 41

3.3. EL HUMILDE PIC12F508


Es el modelo de ocho patitas de la familia PIC12F de la gama básica que dispone de
menos capacidad de memoria y recursos integrados, pero que a lo largo de su historia ha
sido uno de los más empleados en numerosos productos portátiles de uso masivo. Con
lo poco que tiene, es uno de los más vendidos por su flexibilidad y la imaginación de los
diseñadores. Es diminuto y cuesta menos de un euro. Es muy fácil de comprender su fun-
cionamiento y su arquitectura. Las instrucciones son muy sencillas y su programación
asequible desde el comienzo. En la tabla de la Figura 3.8 se presentan las características
más relevantes del PIC12F508.

PIC12F508
Memoria De programa tipo FLASH 512 × 12
De datos tipo RAM 25 × 8
Reloj Frecuencia máxima 4 MHz
de funcionamiento
Periféricos Temporizador TMR0 de 8 bits
Despertar de sleep por cambio SÍ
en una patita
Prestaciones Patitas E/S 5
Patita de entrada 1
Resistencias pull-up internas SÍ
Programación serie en circuito SÍ
Repertorio de instrucciones 33 de 12 bits
Tamaño de los datos 8 bits
Encapsulados PDIP, SOIC y MSOP
(ocho patitas)
Ventajas Coste Muy bajo (< 0,5 euros)
Volumen Muy bajo (< mosca)
Consumo Muy bajo (< 350 µA/2 V/4MHz)

Figura 3.8. Principales características y recursos del PIC12F508.

Las ventajas del PIC12F508 han propiciado el desbordamiento de sus aplicaciones


en áreas en las que hace unos años nadie preveía el uso del microcontrolador en ellas.
Así pasa con los relojes, temporizadores programables, transmisores/receptores de bajo
consumo, etc.

El PIC12F508 es más barato, más pequeño y más seguro y potente que los elementos
electromecánicos a los que sustituye y, además, es «inteligente».

El PIC12F508 es similar al PIC12F509, sólo se diferencian en que este último


posee el doble de memoria de programa FLASH (1 K × 12); así que si con el 508
tiene problemas para que quepa su programa, pase al 509. En un nivel superior está
el PIC12F510, que tiene un conversor A/D de 8 bits con tres canales de entrada y un
comparador analógico.
42 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 3.9. Nuestro pequeño PIC12F508 al lado de una mosca.

Otras características complementarias del PIC12F508/509 son las siguientes:

• Oscilador interno de precisión de 4 MHz.


• Protección ante lecturas del código del programa.
• Las instrucciones se ejecutan en un ciclo de instrucción (4 × TOSC) menos las de salto,
que tardan el doble.
• Pila con dos niveles de profundidad.
• Grabación de la memoria en serie (ICSP) y con recursos para depuración en circuito (ICD).
• Perro Guardián (Watch Dog Timer: WDT) con oscilador RC integrado.
• Líneas de E/S con resistencias pull-up integradas.
• Temporizador de 8 bits.

3.4. DIAGRAMA DE CONEXIONES


En la Figura 3.10 se muestra el diagrama de conexiones de las ocho patitas de la cápsula
en formato PDIP (doble hilera) del PIC12F508, que también sirve para el PIC12F509.
Además de dicho encapsulado, Microchip comercializa estos microcontroladores en

Figura 3.10. Diagrama de conexionado del PIC12F508/509.


EL MÁS HUMILDE DE LA GAMA BÁSICA: PIC12F508 43

formato SOIC y MSOP. También ofrece versiones QTP en los que se graba en fábrica la
memoria de programa para series medias y altas, así como versiones SQTPSM en las que
graba diversos números de serie, secuenciales, aleatorios o pseudoaleatorios, en unas
pocas posiciones de la memoria y que sirven como referencia y control al usuario.

Nombre Función Entrada Salida Descripción


GP0/ICSPDAT GPO TTL CMOS Línea de E/S bidireccional. Puede pro-
gramarse con resistencia pull-up inter-
na y salida del modo sleep por cambio
de estado.

ICSPDAT ST CMOS Línea de datos serie en la programa-


ción de la memoria FLASH mediante
ICSP.

GP1/ICSPCLK GP1 TTL CMOS Línea de E/S bidireccional. Puede pro-


gramarse con resistencia pull-up inter-
na y salida del modo sleep por cambio
de estado.

ICSPCLK ST CMOS Línea de reloj en la programación ICSP.

GP3/MCLR#/VPP GP3 TTL Línea de E/S bidireccional. Puede pro-


gramarse con resistencia pull-up inter-
na y salida del modo sleep por cambio
de estado.

MCLR# ST Entrada de reset. Cuando se configura


como MCLR#, genera reset por nivel «0»
y siempre dispone de resistencia pull-up.
La tensión en esta patita no debe ser su-
perior a VDD durante el funcionamiento
normal del dispositivo, de lo contrario
entra en el modo de programación.

VPP HV Entrada de tensión VPP en el modo de


grabación (12,8 V).

GP4/OSC2 GP4 TTL CMOS Línea de E/S bidireccional.

OSC2 XTAL Conexión de salida con el cristal o


resonador en los modos de oscilador
XT y LP.

GP5/OSC1/CLKIN GP5 TTL CMOS Línea de E/S bidireccional.

OSC1 XTAL Conexión de entrada con el cristal del


oscilador.

CLKIN ST Entrada de reloj externo de trabajo

VDD VDD P Entrada del positivo de alimentación.

GND GND P Entrada de la tierra de alimentación.

Figura 3.11. Descripción de las funciones de las patitas del PIC12F508/509.


44 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Modelo FLASH RAM E/S

PIC12F508 512 × 12 25 × 8 6

PIC12F509 1 K × 12 41 × 8 6

PIC16F505 1 K × 12 72 × 8 12

Figura 3.12. En la gama básica, el PIC12F509 duplica la memoria de programa del PIC12F508, y el
PIC16F505, además, duplica el número de líneas de E/S de los dos anteriores.

Por las patitas 1 y 8 (VDD y VSS) se aplica la tensión de alimentación. La patita 4


soporta tres funciones multiplexadas en el tiempo: línea de entrada GP3, generación de
reset MCLR# y entrada de alta tensión usada en la grabación de la memoria de programa
VPP. Las otras cinco líneas restantes son de E/S, pero además cada una de ellas soporta
otra función multiplexada, que se describe en la tabla de la Figura 3.11. Así, las líneas
GP0 y GP1 tienen multiplexadas las funciones IPCSPCLK y ICSPDAT, que corres-
ponden a las líneas por las que circulan las señales de reloj y las de los datos en serie,
respectivamente, que se utilizan en la grabación de la memoria de instrucciones. T0CKI
es la patita por la que puede recibirse la señal de reloj que controla el temporizador
TMR0. OSC1 y OSC2 son las líneas de entrada y salida para el cristal exterior que usa el
oscilador para estabilizar la frecuencia de trabajo. CLKIN es la patita de entrada del reloj
cuando se usa un oscilador externo.
El PIC12F509 tiene el doble de capacidad de memoria de programa FLASH que
el 508, y en vez de 25 bytes de memoria RAM de datos, dispone de 41 bytes, pero am-
bos tienen el mismo número y distribución de líneas de E/S; por eso, cuando se busca
ampliar la cantidad de estas últimas, hay que recurrir al PIC16F505, que tiene el doble
(Fig. 3.12).

3.5. ARQUITECTURA INTERNA

Los microcontroladores PIC12F508/509 y el PIC16F505 disponen de un procesador con


arquitectura Harvard caracterizada por tener la memoria de datos independiente de la de
programa con buses propios para cada una, lo que permite el acceso simultáneo a datos
e instrucciones. Las posiciones de la memoria de programa FLASH tienen una longitud
de 12 bits, mientras que las de la memoria de datos sólo tienen 8 bits, adaptándose así a
la longitud de las instrucciones y los datos, respectivamente.
El cauce donde se realizan las instrucciones consta de dos etapas, siendo en la se-
gunda donde se ejecuta la instrucción en curso y en la primera donde se busca el código
de la instrucción siguiente simultáneamente (Fig. 3.13).
La segmentación en dos etapas aumenta la velocidad de ejecución de las instruccio-
nes debido al paralelismo «implícito», que significa que se trabaja en paralelo con dos
instrucciones, consiguiéndose completar todas las instrucciones en un «ciclo de instruc-
ción» (4 × TOSC), excepto las de salto, que tardan el doble, porque la siguiente instrucción
a la actual no es la de la siguiente posición natural en la memoria.
EL MÁS HUMILDE DE LA GAMA BÁSICA: PIC12F508 45

Figura 3.13. El cauce del PIC12F508/509, al igual que todos los PIC, se divide en dos etapas. En la
segunda se ejecuta la instrucción en curso y a la vez en la primera se busca el código de
la siguiente.

EJEMPLO
Si un PIC12F508 funcionando a 4 MHz debe ejecutar un programa de mil instrucciones,
de las cuales el 30 por 100 son de salto, calcular el tiempo que se tarda en completar
el programa.

SOLUCIÓN
fOSC = 4 MHz
TOSC = 1 / fOSC = 250 ns
TCiclo instrucción = 4 × TOSC = 1 µs
TInstrucciones normales =700 × 1 µs = 700 µs
TInstrucciones salto = 300 × 2 µs = 600 µs
TTotal programa = 700 + 600 = 1.300 µs

La arquitectura del PIC12F508 se muestra en la Figura 3.14 y puede dividirse en


siete bloques:

1.o Memoria de programa FLASH de 512 posiciones de 12 bits.


2.o Memoria de datos RAM de 25 bytes.
3.o Camino de Datos con una ALU de 8 bits para realizar las operaciones lógico-aritméticas.
4.o Unidad de Control donde se decodifican las instrucciones.
5.o Temporizador TMR0 de 8 bits.
6.o Módulo de líneas de E/S GPIO.
7.o Recursos complementarios.

La memoria FLASH se direcciona con 12 bits procedentes del Contador de Pro-


grama (PC), que tiene asociado una Pila con dos niveles de profundidad en la que en
algunas ocasiones se guarda temporalmente el contenido del PC y en otras se recupera
46 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 3.14. Arquitectura interna del PIC12F508.


EL MÁS HUMILDE DE LA GAMA BÁSICA: PIC12F508 47

lo guardado. La Pila es muy simple y sólo puede almacenar dos valores del PC. Con la
dirección proporcionada por el PC se accede a una posición de la FLASH de la que se
extrae su contenido de 12 bits, que es el código de la instrucción a ejecutar y se almacena
en el Registro de Instrucciones. Normalmente, cada vez que el PC genera una dirección
se incrementa automáticamente y pasa a apuntar la dirección siguiente.
La memoria de datos RAM, volátil y de lectura/escritura, sólo dispone de treinta y dos
posiciones de 8 bits que funcionan como si se tratase de un banco de registros de 8 bits,
algunos de los cuales son de propósito general (GPR) y en ellos el usuario puede depositar
los datos temporales que se manejan en el programa. Los restantes registros son especí-
ficos para el control de los recursos del procesador (SFR) y la programación de sus bits
determina el comportamiento de dichos recursos. A las posiciones de la memoria de datos
se accede a través de un bus de direcciones de 9 bits que se carga mediante el multiplexor
MPX DIR por direccionamiento directo o indirecto.
El Camino de Datos es la sección del procesador encargada de realizar las operacio-
nes lógicas y aritméticas que implican las instrucciones, y para llevarlas a cabo utiliza
una ALU de 8 bits. Uno de los operandos lo recibe la ALU desde un registro de trabajo
W, que también puede cargarse con el resultado, mientras que el otro lo recibe por el bus
de datos o directamente del código que conforma la instrucción (operando inmediato).
La ALU, al completar cada operación, genera 3 bits de señalización, llamados «bande-
ras» o flags, que avisan cuando se produce acarreo o llevada en el octavo bit del resultado
(C: Carry), acarreo o llevada en el cuarto bit del resultado (DC: Digit Carry) o cuando el
resultado es cero (Z: Zero). Estos tres señalizadores se guardan al terminar la instrucción
en el Registro de Estado SR (STATUS) junto a otros bits.
El temporizador TMR0 es un contador ascendente de 8 bits que se usa en misiones
destinadas a controlar el tiempo.
El módulo de E/S GPIO es el que soporta el interfaz externo con las seis líneas de
E/S, que se corresponden con las patitas que se denominan GP0-GP5 y que también
pertenecen a las líneas de la Puerta B (PORTB/GPIO).
Existen dos registros de 8 bits independientes, llamados TRIS y OPTION, que se
accede a ellos mediante las instrucciones TRIS y OPTION, respectivamente, que cargan
el contenido del registro W en TRIS y OPTION.
Finalmente, existe un conjunto de recursos complementarios que se describen bre-
vemente:

— El Perro Guardián (WDT: Watch Dog Timer) es un temporizador encargado de


vigilar la correcta ejecución de los programas. Caso de existir algún problema
produce un reset.
— El reset, por conexión de alimentación (POR: Power On Reset), provoca la
reinicialización del sistema al conectar la alimentación.
— El temporizador del reset controla los tiempos en la generación del reset.
— El oscilador interno RC genera los impulsos de reloj para la sincronización del
funcionamiento del procesador, que también puede provenir del exterior a través
de las patitas OSC1/CLKIN y OSC2.
CAPÍTULO

Las memorias
4

4.1. LA MEMORIA DE PROGRAMA


Aunque los microcontroladores PIC de la gama básica disponen de un espacio máximo
para la memoria de programa de 212 = 4 K posiciones al disponer de 12 bits la dirección
que genera el Contador de Programa, el modelo PIC12F508 sólo tiene implementadas físi-
camente en FLASH 512 posiciones de 12 bits cada una, ocupando un rango de direcciones
comprendido entre la 0000 h y la 01FF h (Fig. 4.1). El PIC12F509 y el PIC16F505 tienen
implementadas físicamente 1 K posiciones.

Figura 4.1. Estructura interna de la memoria de programa de los PIC de la gama básica. El PIC12F508 sólo
tiene implementadas físicamente 512 posiciones de 12 bits cada una.

49
50 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 4.2. Cuando se produce un reset en el PIC12F508, el PC se carga con la última dirección de la
memoria, la 01FF h que contiene la instrucción MOVLW XX, que viene grabada de fábrica y
que carga en W el valor XX, que sirve para calibrar el oscilador interno.

La posición 0000 h está reservada para el Vector de Reset y en ella debe almacenarse la
primera instrucción que haya que ejecutarse cuando se inicializa el sistema (reset). Cuan-
do se genera un reset. se inicializa el estado del procesador y el programa de aplicación.
En realidad, cuando hay un reset en el PIC12F508, el PC se carga con la última dirección
del mapa de la memoria, es decir, con la 01FF h a la que apunta y en la que está guardada
y grabada en fábrica la instrucción MOVLW XX, cuya función es cargar en el registro de
trabajo W el valor inmediato XX que acompaña a la instrucción y que ha seleccionado el
fabricante con la misión de calibrar el oscilador interno del dispositivo (Fig. 4.2).
En el reset se ejecuta la instrucción MOVLW XX, después el PC se incrementa y se
desborda, pasando a contener el valor 0000 h, que es la dirección en la que se halla la
siguiente instrucción a ejecutar y en la que se debe almacenar la instrucción MOVWF
OSCCAL, que guarda el valor XX contenido en el registro W en el registro de calibración
OSCCAL. Por tanto, si se usa el oscilador interno, la primera instrucción del programa
de aplicación deberá estar almacenada en la dirección 0001 h.

4.2. COMPORTAMIENTO DEL PC


Cuando en un programa se llama a una subrutina con la instrucción CALL, el valor del
PC se salva en la Pila para que cuando se termine la subrutina y se retorne al programa
principal (RETLW) se recupere de la Pila el valor almacenado, se cargue en el PC y nue-
vamente continúe el flujo de control del programa en la instrucción siguiente a CALL.
LAS MEMORIAS 51

Figura 4.3. Las instrucciones CALL y RET guardan y restauran el valor del PC en la Pila,
respectivamente.

Como la Pila en la gama básica sólo tiene dos niveles de profundidad, únicamente se
pueden encadenar o anidar un máximo de dos subrutinas, quedando bajo la responsa-
bilidad del programador controlar la disponibilidad en la Pila y evitar machacar alguna
dirección previamente guardada (Fig. 4.3).
El PC siempre contiene la dirección de la siguiente instrucción que hay que ejecu-
tar, y en cuanto se accede a ella, se incrementa una unidad automáticamente, quedando
apuntado a la siguiente instrucción del programa.
Con la instrucción GOTO se produce un salto incondicional a cualquiera de las 512
posiciones de la memoria FLASH. Con esta instrucción se modifican los 9 bits de menos
peso de la dirección contenida en el PC, los cuales reciben los 9 bits de menos peso del
código máquina o binario de la instrucción GOTO (Fig. 4.4).

Figura 4.4. Los 9 bits de menos peso del código binario de la instrucción GOTO se cargan en los 9 bits
de menos peso del PC, lo que permite realizar un salto a cualquiera de las 512 direcciones
de la memoria de programa.
52 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 4.5. En las instrucciones CALL sólo se cargan los 8 bits de menos peso del PC con los 8 bits de
menos peso del código binario de dicha instrucción, el noveno bit del PC pasa a valer 0,
apuntando a una instrucción comprendida en el rango 0000 h y 00FF h, o sea, dentro de las
primeras 256 posiciones de la memoria de programa.

Con la instrucción de llamada a subrutina CALL sólo se proporcionan los 8 bits


de menos peso que se cargan en los correspondientes del PC, pasando a valer 0 el
noveno bit del Contador de Programa, lo que implica que cualquier subrutina debe
comenzar siempre en las 256 primeras posiciones de la memoria (28) del PIC12F508
(Fig. 4.5).

4.4. LA MEMORIA DE DATOS

La memoria de datos del PIC12F508 es tipo RAM, muy rápida de acceso, pero volátil,
y se comporta como si se tratase de un banco de treinta y dos registros de 8 bits cada
uno, ocupando las direcciones comprendidas entre la 00 h y la 1F h. Los siete prime-
ros registros son específicos (SFR) porque sus bits gobiernan el comportamiento de
los recursos del procesador. Actúan como registros de control. Los restantes veinti-
cinco registros son de propósito general (GPR) y en ellos el usuario puede guardar de
forma temporal los datos que maneja el programa (Fig. 4.6).
Para direccionar en una instrucción un dato al que se quiere acceder a leer o escribir
se pueden utilizar dos modos de conseguirlo:

— Direccionamiento directo. La dirección a acceder en la RAM viene determinada


por los 5 bits de menos peso del código binario de la instrucción (Fig. 4.7).
— Direccionamiento indirecto. La dirección a acceder en la RAM del PIC12F508
la proporcionan los 5 bits de menos peso del registro especial FSR (Fig. 4.8).
LAS MEMORIAS 53

Figura 4.6. La memoria de datos RAM del PIC12F508 consta de siete registros específicos (SFR) que
ocupan las siete primeras posiciones y veinticinco de propósito general (GPR).

Figura 4.7. En el direccionamiento directo, la dirección de la posición a acceder en la RAM viene dada
por los 5 bits de menos peso del código de la instrucción.
54 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 4.8. En el direccionamiento indirecto en el PIC12F508, la dirección a acceder en la RAM viene


determinada por los 5 bits de menos peso del registro especial FSR.

4.5. LOS REGISTROS ESPECIALES SFR


Las siete primeras posiciones o registros de la memoria de datos RAM tienen a sus bits asigna-
dos a controlar el funcionamiento de diferentes elementos del microcontrolador. No se pueden
usar para guardar datos del usuario. Es muy importante grabar en los bits de estos registros los
valores correctos para conseguir que el comportamiento del dispositivo sea el adecuado.
A continuación se pasan a describir los nombres, la misión y un ejemplo de aplica-
ción de los siete registros especiales.
— INDF:
Este registro ocupa la dirección 00 h de la RAM y no se halla implementado física-
mente. Se usa en la nomenclatura de las instrucciones con direccionamiento indirec-
to, pero los bits que se utilizan para conformar la dirección del dato a acceder son los
5 bits de menos peso del registro especial FSR, que sí se halla implementado.

EJEMPLO
En este programa se comienza cargando el registro FSR con el valor 10 h a través de W.
Luego, la instrucción CLRF INDF borra el contenido de la dirección 10 h de la RAM al
usar el modo de direccionado indirecto, que se refleja con INDF en la nomenclatura de la
instrucción.

MOVLW 0x10 ; Carga o mueve el dato 10 h en W


MOVWF FSR ; Mueve el contenido de W al registro FSR
CLRF INDF ; Borra el contenido de la dirección
; indirecta formada por los 5 bits de menos
; peso de FSR
LAS MEMORIAS 55

Figura 4.9. Distribución y nomenclatura de los bits del registro STATUS. Los bits que llevan W se pueden
escribir, los que llevan R se pueden leer.

— FSR:
Contiene en sus 5 bits de menos peso la dirección a acceder en la RAM cuando
se utiliza el modo de direccionado indirecto. Por ejemplo, la instrucción CLRF
INDF borra el contenido de la dirección de la RAM formada por los 5 bits de
menos peso de FSR.
— TMR0:
Contiene los 8 bits de la cuenta del temporizador TMR0 que usa en labores de
control de tiempo. Se carga un valor en TMR0 y con cada impulso de reloj se
incrementa hasta alcanzar el valor máximo para luego desbordarse.
— PCL:
Es un registro especial que contiene el valor de los 8 bits de menos peso del PC.
— STATUS:
Se le llama Registro de Estado (SR) y sus bits informan sobre el estado interno del
procesador cuando ocurre un evento o se ejecutan ciertas instrucciones. En la Figu-
ra 4.9 se muestra la nomenclatura, la distribución y el significado de sus bits.

Los bits de la Figura 4.9 si llevan –x tienen un valor desconocido o indeterminado y se leen
siempre a 0. Si llevan –1 o –0 se cargan con un 1 o con un 0 cuando hay un reset por POR
(reset por conexión de la alimentación).

— GPWUF: Bit de reset por cambio de estado en una patita de entrada


1: Se ha producido un reset por cambio de estado en una patita de entrada.
0: Se ha producido un reset por conexión de la alimentación u otra causa.

— PA0: Bit de selección de página en la memoria de programa. Cada página


tiene 512 posiciones; por eso, en el PIC12F508 sólo dispone de la página 0.
En el PIC12F509 existen dos páginas, la 0 y la 1.
1: Selecciona la página 1 de la memoria de programa (0200 h-03FF h).
0: Selecciona la página 0 de la memoria de programa (0000 h-01FF h).

— TO#: Timer Out (Desbordamiento del WDT)


1: Al conectar la alimentación o al ejecutar CLRWDT o SLEEP.
0: Al desbordarse el WDT.
56 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

— PD#: Power-Down (Modo de Bajo Consumo)


1: Se pone con este valor el bit al conectar la alimentación o al ejecutar la ins-
trucción CLRWDT.
0: El procesador entra al modo de bajo consumo al ejecutarse la instrucción SLEEP.

— DC: Acarreo/llevada en el cuarto bit del resultado para las instrucciones


ADDWF/SUBWF
1: Se ha producido acarreo en el cuarto bit del resultado con la instrucción
ADDWF.
0: No se ha producido acarreo en el cuarto bit del resultado tras ejecutar ADDWF.
«El valor que toma este bit para señalizar la llevada en el cuarto bit del resultado
tras ejecutar la instrucción SUBWF es el contrario que para el acarreo».

— Z: Cero
1: El resultado de una instrucción aritmética o lógica ha sido cero.
0: El resultado de una instrucción aritmética o lógica no ha sido cero.

— C: Acarreo/llevada en el bit de más peso del resultado (ADDWF, SUBWF,


RRF, RLF)
1: Si se ejecuta ADDWF y hay acarreo o si se ejecuta SUBWF y no hay llevada.
0: No hay acarreo al ejecutar ADDWF y si se ejecuta SUBWF indica que hay llevada.
Con RRF y RLF, el valor de C se corresponde con el de menos peso o el de más
peso, respectivamente, del registro que se rota.

— OSCCAL: Es el registro de calibración para el oscilador interno


Su misión es calibrar la frecuencia de funcionamiento del oscilador interno a
4 MHz. El valor que hay que usar en la calibración (XX) lo proporciona el fabri-
cante en la última posición de la memoria de programa (01FF h) del PIC12F508,
en la que ha grabado durante la fabricación la instrucción MOVLW 0 × XX. Al
producirse un reset, el PC apunta dicha dirección y la ejecuta cargando en W el
valor XX h de calibración. Luego, el PC se desborda y pasa a apuntar la primera
dirección 0000 h accediendo al Vector de Reset, en donde reside la instrucción
MOVWF OSCCAL, que carga en el registro OSCCAL el valor XX depositado en W.
Como el valor de calibración que almacena OSCCAL se borra frecuentemente
al estar en RAM volátil, cada vez que se produce un reset y se reinicializa, el
programa se restaura. El valor de calibración XX se guarda en los 7 bits de más
peso de OSCCAL (Fig. 4.10).

Figura 4.10. El valor de calibración se guarda en los 7 bits de más peso de OSCCAL.
LAS MEMORIAS 57

Frecuencia oscilador
CAL6 CAL5 CAL4 CAL3 CAL2 CAL1 CAL0
interno
0 1 1 1 1 1 1 Máxima
— — — — — — —
0 0 0 0 0 0 1
0 0 0 0 0 0 0 Media
1 1 1 1 1 1 1
— — — — — — —
1 0 0 0 0 0 0 Mínima

Figura 4.11. Tabla que determina la frecuencia del oscilador interno en función del valor de calibración
guardado en OSCCAL.

El valor de los bits del registro OSCCAL establece la frecuencia del oscilador
interno de acuerdo con la tabla de la Figura 4.11.
Téngase en cuenta que cuando se borra la memoria de programa también se bo-
rra el valor de calibración almacenado en la dirección 01FF h, por lo que se debe
leer previamente y restaurarlo.

— GPIO: Registro de las líneas de E/S.


Las líneas de E/S GP5-GP0 se corresponden con los 6 bits de menos peso del
registro GPIO correspondiente al valor de las líneas de E/S. Una lectura de GPIO
supone leer el estado lógico actual de las líneas de entrada asociadas, mientras
que una escritura sobre GPIO supone sacar valores lógicos por las líneas de
salida correspondientes.

4.5. LAS MEMORIAS DEL PIC12F509 Y DEL PIC16F505

La memoria de programa FLASH del PIC12F509 y del PIC16F505 son iguales y tienen una
capacidad de 1 K palabras de 12 bits cada una, o sea, el doble que el PIC12F508. Se divide en
dos páginas (0 y 1) de 512 posiciones cada una (Fig. 4.12).
La memoria de datos del PIC12F509 se compone de dos bancos (0 y 1) de treinta
y dos posiciones de 8 bits cada uno. El PIC12F508 sólo disponía de un banco (0) de
treinta y dos registros (Fig. 4.13).
Las posiciones del banco 01, comprendidas desde la 20 h a la 2F h, están mapeadas
en el banco 00, lo que significa que cuando se utiliza la dirección 22 h del banco 01 en
realidad se accede a la 02 h del banco 00. En resumen, el PIC12F509 tiene los mismos
registros SFR que el 508 y cuarenta y un registros GPR, de los cuales veinticinco se
ubican en el banco 00 y los otros dieciséis en el banco 01 (30 h al 3F h).
Cuando hay varios bancos en la memoria de datos en su direccionamiento, además
de necesitarse los 5 bits que seleccionan una posición dentro de un banco, se necesita
otro bit que seleccione el banco accedido. Dicho bit que elige el banco (0 o 1) corres-
ponde al bit 5 del registro FSR tanto en el direccionamiento directo como en el indirecto
(Fig. 4.14).
La memoria de datos del PIC16F505 consta de cuatro bancos de treinta y dos regis-
tros cada uno. Los bancos 01, 10 y 11 están mapeados sobre el banco 00 (Fig. 4.15).
58 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Para seleccionar el banco de datos a acceder en el PIC16F505 se utilizan los bits 5


y 6 del registro FSR. Además, como este microcontrolador tiene más patitas de E/S que
los PIC12F508/509, existen dos registros de E/S para intercambiar la información con el
exterior, que son las Puertas B y C (PORTB y PORTC).

Figura 4.12. La memoria FLASH del PIC12F509 y del PIC16F505 consta de 1 K posiciones de 12 bits
cada una.

Figra 4-13. Mapa de la memoria de datos del PIC12F509.


LAS MEMORIAS 59

Figura 4.14. El bit 5 del registro FSR se encarga de seleccionar el banco a acceder (0 o 1) de la memoria
de datos en los dos modos de direccionado.

Figura 4.15. Estructura de la memoria de datos del PIC16F505.


CAPÍTULO
Recursos y periféricos
principales
5

5.1. EL CICLO DE INSTRUCCIÓN


El oscilador principal que sincroniza el procesador es fundamental porque establece la
duración del ciclo de reloj en el que se efectúan las operaciones elementales y, en conse-
cuencia, determina el tiempo que tarda en ejecutarse una instrucción.
La mayoría de las instrucciones tardan un ciclo de instrucción en ser ejecutadas
excepto las de salto, que tardan el doble. El ciclo de instrucción se compone de cuatro ci-
clos de reloj, llamados Q1, Q2, Q3 y Q4. Durante Q1, el Contador de Programa apunta la
instrucción a ejecutar y se incrementa una unidad (Fase de Búsqueda de la Instrucción).
A continuación, se accede a la memoria de programa FLASH, se lee el contenido de la
posición y dicho valor, que es el código máquina o binario de la instrucción a ejecutar,
se almacena en el Registro de Instrucción durante Q4. Al mismo tiempo que se realiza la
búsqueda de la instrucción que apunta el PC, se procede a ejecutar la instrucción buscada
en el ciclo de instrucción anterior. Durante Q2 se lee la memoria de datos y durante Q4
se escribe. De esta manera, en el mismo ciclo de instrucción, se efectúa la búsqueda de
una instrucción y la ejecución de la anterior (Fig. 5.1).
Al estar segmentado el cauce del procesador en dos etapas independientes (Búsque-
da y Ejecución), durante un ciclo de instrucción se realiza la búsqueda de la instrucción
en curso y la ejecución de la anterior, lo que supone que cada instrucción se ejecuta en
un ciclo de instrucción. Las instrucciones de salto, como no emplean la dirección incre-
mentada automáticamente del PC, deben repetir la fase de búsqueda y por eso tardan dos
ciclos de instrucción (Fig. 5.2).

EJEMPLO
Un PIC12F508 funciona con su oscilador interno a 4 MHz en la ejecución de un pro-
grama con quinientas instrucciones, de las cuales el 40 por 100 son de salto. Calcular
el tiempo que tarda en ejecutar el programa.

61
62 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

SOLUCIÓN
fOSC = 4 MHz; TOSC = 1 / 4 × 106 = 250 ns
TCICLO INSTRUCCIÓN =4 × TOSC = 1 µs
TPROGRAMA = 300 × 1 µs + 200 × 2 µs = 700 µs

Figura 5.1. Representación de tres ciclos de instrucción consecutivos.

Figura 5.2. La instrucción de salto CALL SUBR de la figura tarda en ejecutarse dos ciclos de instrucción
al no ser válida la fase de búsqueda correspondiente al incremento automático del PC.
RECURSOS Y PERIFÉRICOS PRINCIPALES 63

5.2. EL OSCILADOR PRINCIPAL

Para generar los ciclos de reloj que conforman el ciclo de instrucción, los dispositivos
PIC12F508/509 disponen de cuatro tipos posibles de osciladores.

LP : Oscilador externo de bajo consumo con cristal de cuarzo o resonador.


XT: Oscilador externo de alta frecuencia con cristal o resonador.
EXTRC: Oscilador externo RC.
INTRC: Oscilador interno de 4 MHz.

El tipo de oscilador elegido hay que programarlo en los bits FOSC <1:0> de la Palabra
de Configuración.

5.2.1. Osciladores externos con cristal de cuarzo o resonador


Los cristales de cuarzo y los resonadores cerámicos tienen la propiedad de oscilar a una
frecuencia determinada muy precisa que asegura el funcionamiento del oscilador prin-
cipal. En el tipo LP, la frecuencia de trabajo es de 32 KHz, mientras que en el XT puede
ser de 200 KHz, 1 MHz o 4 MHz. En la Figura 5.3 se muestra el conexionado del cristal
XTAL a las patitas RB5/GP5/OSCIN (CLKIN) y RB4/GP4/OSC2 (CLKOUT).

Figura 5.3. Conexionado del cristal de cuarzo XTAL a las patitas OSC1 y OSC2 del PIC12F508/509. La
resistencia RS sólo hay que colocarla con algunos cristales especiales.

Tipo Oscilador Frecuencia C1 C2


LP 32 KHz 15 pF 15 pF
XT 200 KHz 47-68 pF 47-68 pF
1 MHz 15 pF 15 pF
4 MHz 15 pF 15 pF

Figura 5.4. Valores de los condensadores C1 y C2 correspondientes al esquema de la Figura 5.3.


64 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

5.2.2. Oscilador externo RC


En lugar de usar un cristal o un resonador, se coloca una red R-C externa que supone una
considerable reducción del coste, pero una estabilidad de la frecuencia muy mediocre.
La frecuencia del oscilador depende de los valores de R y C. También influye en la fre-
cuencia la temperatura del ambiente de trabajo (Fig. 5.5).

Figura 5.5. El oscilador externo RC es barato, pero poco preciso. Si REXT = 10 K y CEXT = 20 pF, la fre-
cuencia de oscilación es de 625 KHz, aproximadamente.

Para valores de REXT inferiores a los 3 K, el oscilador puede resultar muy inestable
e incluso pararse. Para valores superiores a 1 M, el oscilador se vuelve muy sensible al
ruido y la humedad. Se recomienda un valor comprendido entre 5 K y 100 K. También
se recomienda que el valor de CEXT sea de unos 20 pF. Por la patita OSC2 se obtiene en
este oscilador la cuarta parte de la frecuencia de oscilación que se corresponde con la que
corresponde al ciclo de instrucción.

5.2.3. Oscilador externo


Es un tipo de oscilador que se caracteriza porque se emplea un oscilador externo inde-
pendiente cuya salida se aplica a la patita OSC1 (Fig. 5.6).

5.2.4. Oscilador interno


Es la opción más económica y sencilla, ya que no precisa de componentes externos.
El tipo de oscilador INTRC proporciona una frecuencia de trabajo de 4 MHz con una
RECURSOS Y PERIFÉRICOS PRINCIPALES 65

Figura 5.6. Conexionado de un oscilador externo que actúa como reloj principal.

tensión de alimentación de + 5 VDC y una temperatura de 25 grados. Para calibrar el


oscilador a la frecuencia indicada se proporciona de fábrica un «valor de calibración»
(XX) que viene guardado en la última posición de la memoria de programa en forma de
instrucción MOVWL XX. Con dicha instrucción, que es la primera que se ejecuta tras
un reset, se carga en W el valor XX y luego en la siguiente instrucción, que será la de la
dirección 000 h, se carga dicho valor con la instrucción MOVWF OSCCAL en el regis-
tro OSCCAL, que tiene funciones de ajuste del oscilador interno.

Si se borra la memoria de programa también se borra el valor XX de calibración, por lo que


debe ser leído y memorizado antes de proceder al borrado.

5.3. «RESET» O REINICIALIZACIÓN


Cuando se produce un reset en el PIC12F508, el PC pasa a tomar el valor 1 en todos sus
bits, apuntando la última posición de la última página disponible de la memoria de pro-
grama en donde se encuentra grabada en fábrica la instrucción MOVWL XX. Se ejecuta
dicha instrucción y luego el PC se desborda y pasa a valer 0, apuntando la posición ini-
cial (Vector de Reset) correspondiente a la primera instrucción del programa del usuario,
que es MOVWF OSCCAL.
El reset o reinicialización del procesador se produce por seis causas diferentes:

1.a Conexión de la alimentación (POR: Power On Reset).


2.a Activación por nivel bajo de la patita MCLR# estando el procesador en modo ejecu-
ción.
3.a Activación de MCLR# en modo de bajo consumo (SLEEP).
4.a Desbordamiento del Perro Guardián (WDT) en modo ejecución.
5.a Desbordamiento del Perro Guardián en modo de bajo consumo.
6.a Salida o «despertar» del modo de bajo consumo por cambio de estado en una patita
de entrada.

A veces, cuando arranca el programa de aplicación del usuario, puede comportarse


de forma diferente según las condiciones en las que se produjo el reset. Mediante 3 bits
del Registro de Estado (STATUS) se conoce la causa que provocó el último reset en el
procesador (Fig. 5.7).
66 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

GPWUF TO# PD# Causa del «reset»


0 0 0 Desbordamiento del WDT en el modo SLEEP.
0 0 U Desbordamiento del WDT en ejecución.
0 1 0 Activación del MCLR# en el modo SLEEP.
0 1 1 Conexión de alimentación.
0 U U Activación de MCLR# en el modo ejecución.
1 1 0 Despertar del modo SLEEP por cambio de estado
de una patita de entrada.

Figura 5.7. El valor de los 3 bits del Registro de Estado mostrados en la tabla determina la causa del
último reset en el procesador.

En la tabla de la Figura 5.8 se presenta el valor que toman los bits de los registros
especiales indicados después de que se produce un reset.

Activación MCLR#, desbordamiento del WDT


Registro Dirección POR
y salida de SLEEP por cambio de estado
W — qqqq qqqu1 qqqq qqqu1
INDF 00 h xxxx xxxx uuuu uuuu
TMR0 01 h xxxx xxxx uuuu uuuu
PC 02 h 1111 1111 1111 1111
STATUS 03 h 0001 1xxx q00q quuq2, 3
FSR4 04 h 110x xxxx 11uu uuuu
FSR5 04 h 111x xxxx 111u uuuu
OSCCAL 05 h 1111 111- uuuu uuu-
GPIO 06 h --xx xxxx --uu uuuu
OPTION — 1111 1111 1111 1111
TRIS — --11 1111 --11 1111

Leyendas: u=no cambia; x=aleatorio; - = no implementado; q=depende de la condición.


Notas:
1
Los bits <7:2> del registro W contienen el valor de calibración al ejecutar MOVLW XX.
2
Consultar las condiciones específicas.
3
Si el reset es por cambio de estado, el bit 7=1; en los demás casos, el bit 7 = 0.
4
Sólo en el PIC12F509.
5
Sólo en el PIC12F508.
Figura 5.8. Tabla que muestra el valor de los bits de los registros especiales según el reset que se haya
producido.

5.4. LAS LÍNEAS DE E/S


Los microcontroladores PIC12FXXX, al estar encapsulados con ocho patitas y desti-
nar forzosamente dos a la alimentación, sólo disponen de un máximo de seis para la
conexión de periféricos externos siempre que se use oscilador interno y no se emplee la
patita MCLR# para poder originar un reset manual. Las líneas de E/S se corresponden
con los bits de un registro que se llama GPIO o PORTB. Dichos registros son de 8 bits,
RECURSOS Y PERIFÉRICOS PRINCIPALES 67

Figura 5.9. En el PIC12F508/509, el registro PORTB o GPIO contiene 6 bits válidos que se relacionan
con las seis posibles líneas de E/S.

pero los dos de más peso no están implementados físicamente y siempre se leen como 0.
Las seis líneas de E/S válidas pueden denominarse PB0-PB5 o GP0-GP5 indistintamen-
te. Mediante la programación de la Palabra de Configuración, las líneas de E/S pueden
asignarse a soportar otras funciones alternativas.
El registro GPIO o PORTB, ubicado en la dirección 0 × 06 del área SFR de la me-
moria de datos, contiene la información de las líneas de E/S en sus 6 bits de menos peso
correspondientes. Cuando se lee el registro GPIO, se lee el estado lógico de las líneas de
entrada asociadas a sus bits. Una escritura en dicho registro saca el valor lógico de sus
bits por las correspondientes líneas de salida; de esta manera, se realiza la transferencia
bidireccional de las líneas de E/S.
La línea GP3 sólo puede actuar como entrada. Las líneas GP0, GP1 y GP3 pueden
configurarse para funcionar como entradas con resistencias de pull-up y también pueden
programarse para que generen un reset cuando cambie de estado alguna de ellas y el
procesador se halle metido en el modo de bajo consumo, lo cual le hace «despertar».

La función que realiza cada patita se programa en la Palabra de Configuración.

Asociado al registro GPIO está el registro TRIS, el cual está implementado inde-
pendientemente fuera de la memoria de datos. Sólo se puede acceder a él con la ins-
trucción TRIS, que transfiere el contenido de W a TRIS. Los bits de TRIS se utilizan
para configurar el sentido de las líneas de E/S correspondientes del registro GPIO. Un
1 en un bit de TRIS configura como «entrada» la línea de GPIO asociada. Un 0 en un
bit de TRIS configura como «salida» la línea de GPIO asociada. Recuérdese que GP3
sólo puede ser entrada y GP2/T0CKI se selecciona desde un bit del registro OPTION
cuando actúa como línea GP2 de E/S o entrada de los impulsos de reloj para el tem-
porizador TMR0.

Figura 5.10. Sólo cuando se usa el oscilador interno y la patita MCLR# se configura como línea de E/S,
el PIC12F508/509 puede disponer de un máximo de seis líneas de E/S.
68 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

En la Figura 5.11 se muestra el esquema eléctrico de las líneas de E/S, con excep-
ción de la GP3, que sólo puede ser entrada. Cada línea tiene asociado un bit en un latch
del registro TRIS y otro en el registro GPIO. Cuando se carga un 1 en un latch de TRIS,
el latch de salida se desactiva y la línea queda configurada como entrada. Si, por el con-
trario, en un latch de TRIS hay cargado un 0, queda habilitado el latch de salida de datos
y la patita se configura como salida.

Figura 5.11. Esquema eléctrico correspondiente a las líneas de E/S, con excepción de GP3, que sólo
funciona como entrada.

Para las instrucciones de lectura de las líneas de entrada se usa la instrucción MOVF
GPIO, W, que deposita en los bits correspondientes de W el estado lógico de las líneas de
entrada. Para escribir sobre las líneas de salida se emplea la instrucción MOVWF GPIO,
que saca por las líneas de salida los bits de W asociados.

PRECAUCIÓN
Algunas instrucciones orientadas a bit, como BSF y BCF, realizan una lectura de un
registro, luego a un bit lo ponen a 1 o a 0 y finalmente vuelven a escribir el mismo re-
gistro.
Estas instrucciones son peligrosas cuando las líneas de los puertos se configuran
dinámicamente como entradas o salidas. Por ejemplo, si se ejecuta la instrucción BCF
GPIO,2, se intenta poner a 0 la línea GP2. Esta instrucción comienza leyendo todo el
registro GPIO, pone a 0 el bit 2 y el nuevo valor lo vuelve a escribir en GPIO. Si en el
momento de la lectura una línea cualquiera como la GP1 está configurada como entra-
RECURSOS Y PERIFÉRICOS PRINCIPALES 69

da con un valor 0, este valor se lee y luego se escribe sobre el latch de salida correspon-
diente a GP1. En el instante en que GP1 se reconfigure como salida, la patita se pondrá
a 0 como consecuencia de la instrucción BCF GPIO,2.

5.5. EL TEMPORIZADOR TMR0


El módulo temporizador TMR0 es un contador de 8 bits ascendente cuyo valor se
incrementa automáticamente con cada impulso de reloj y tiene las siguientes carac-
terísticas:

1.a Dispone de un registro TMR0 en la zona SFR de la memoria de datos que puede fun-
cionar como temporizador o como contador de eventos externos.
2.a Se puede leer y escribir.
3.a Posee un predivisor de frecuencia o «preescaler» de 8 bits programable por software.
4.a El incremento del valor de TMR0 se puede controlar mediante un reloj interno o exter-
no, pudiendo en este último caso seleccionar el flanco activo.

En la Figura 5.12 se muestra el esquema de la estructura del módulo TMR0 junto a


las señales de control, que son T0CS, T0SE, PSA, PS2, PS1 y PS0 y residen en el registro
OPTION.
El bit T0CS selecciona en el MPX1 la entrada del reloj interno del microcontro-
lador (FOSC /4) cuando vale 0, y en caso contrario, el reloj externo aplicado a la patita
GP2/T0CKI. Tanto los impulsos internos como los externos pueden aplicarse al contador
directamente o a través de un predivisor de frecuencia o «preescaler», que divide su nú-
mero por un rango seleccionable.
El registro TMR0 está ubicado en la dirección 0 × 01 de la memoria de datos y cada
vez que recibe un impulso de reloj incrementa su valor automáticamente. Cuando llega
al valor máximo (1111 1111), con el siguiente impulso de reloj se «desborda» y pasa a
valer 0000 0000.
Mediante los bits PS2, PS1 y PS0 se selecciona el rango por el que divide los im-
pulsos de reloj el predivisor de frecuencia, que puede llegar desde 1:2 (0, 0, 0) hasta
1:256 (1, 1, 1).

Figura 5.12. Estructura del módulo TMR0 con sus señales de control.
70 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

El módulo TMR0 tiene dos modos de trabajo:

A) Modo temporizador
Sirve para medir o controlar tiempo. En este modo, se comienza cargando con un valor al
TMR0 y luego se va incrementando con los impulsos internos de reloj (FOSC /4) hasta que se
produce el desbordamiento. El valor que hay que cargar en TMR0 es el complemento al valor
que se quiere contar. Por ejemplo, si se quiere contar diez impulsos de reloj hay que cargar en
TMR0 el complemento a 255, que es el valor hexadecimal 0 × F5, o sea, 245 en decimal.
Cuando se trabaja con el oscilador interno a 4 MHz, la base de tiempo será FOSC /4 =
1 MHz, lo que supone que se recibe un impulso de reloj cada microsegundo. Cuando no
se utiliza el predivisor, el menor tiempo a contar será de 1 µs cuando se carga TMR0 con
1111 1111, mientras que el mayor tiempo que es posible medir será de 256 µs cuando se car-
ga con 0000 0000. Si se usa el predivisor, se puede dividir la frecuencia de los impulsos des-
de el rango 2 hasta el 256, en cuyo caso para calcular el tiempo se usa la siguiente fórmula:

T = (4 / FOSC) × Complemento del valor cargado en TMR0 × Rango Predivisor

B) Modo contador de eventos


En este modo, se selecciona el oscilador externo, cuya salida se aplica a la patita GP2/
T0CKI. En esta situación, son los impulsos aplicados a dicha patita los que hacen incre-
mentar el valor depositado en TMR0. Con el bit T0SE del registro OPTION se elige el
tipo de flanco activo, ascendente o descendente.
Para averiguar el momento en que TMR0 se desborda y su valor pasa de 1111 1111 a
0000 0000 lo que se hace es cargar el TMR0 en W (MOVF TMR0, W), luego se chequea
si el bit Z (Cero) del registro STATUS vale 1, y si es así, es que se han cargado todos 0 en
W. Para conocer si Z = 1 se usa la instrucción condicional BTFSS STATUS, Z, que salta la
siguiente instrucción si Z = 1, mientras que si Z = 0 no se salta la siguiente instrucción.

MOVF TMR0, W ; Mueve el valor de TMR0 a W


BTFSS STATUS, Z ; Si Z = 1, se salta la siguiente instrucción,
; y si Z = 0, no se la salta.

5.5.1. El registro OPTION


Este registro, que se halla situado fuera de la memoria de datos, tiene la mayoría de sus
bits dedicados al módulo TMR0 (Fig. 5.13). Sólo puede ser accedido con la instrucción
OPTION, que carga el valor de W en él.

Figura 5.13. Distribución y nomenclatura de los bits del registro OPTION.


RECURSOS Y PERIFÉRICOS PRINCIPALES 71

La misión de los bits de OPTION es la siguiente:

PS2, PS1 y PS0


Con estos 3 bits se establece el rango por el que divide los impulsos de reloj el pre-
divisor para el TMR0, desde 0-0-0 (rango 2) hasta 1-1-1 (rango 256) (Fig. 5.14).

PS2-PS1-PS0 Rango TMR0 Rango 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

Figura 5.14. Rangos de división del predivisor o «preescaler» para el TMR0 y para el WDT. Hay que
seleccionar a cuál de los dos temporizadores se dedica.

PSA
El predivisor lo comparte el módulo TMR0 con el Perro Guardián (Watch Dog Ti-
mer), que tiene un funcionamiento parecido, pero que cuando se desborda produce un
reset. Con el bit PSA se asigna el predivisor al TMR0 cuando vale 0 y al WDT cuando
vale 1.

T0SE
Selecciona el tipo de flanco activo cuando el reloj es externo. Si vale 1, el flanco
activo es el descendente.

T0CS
Selecciona la procedencia de los impulsos de reloj, que producen el incremento de
TMR0. Si vale 0, proceden del oscilador interno (FOSC / 4), y si vale 1, de un oscilador
externo que los aplica a la patita GP2/T0CKI.

GPPU#
Si este bit vale 0 cuando cambia de estado una de las líneas de entrada GP0, GP1 o
GP3 y el procesador se halla en modo de bajo consumo, se sale de él o se «despierta».
Si vale 1, no pasa nada.

GPWU#
Cuando vale 1, se coloca una resistencia de carga pull-up en las líneas GP0, GP1 y
GP3. Si vale 0, no hay resistencias de carga en dichas líneas.
72 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Cuando se utiliza un reloj externo como entrada de impulsos del módulo TMR0,
éstos deben sincronizarse con los impulsos del oscilador interno. Si se emplea el predi-
visor, los impulsos externos se dividen en él y su salida debe ser simétrica. Aunque el
predivisor esté sincronizado con el reloj interno, se produce un ligero retardo entre el
flanco activo del impulso externo y el incremento efectivo del valor del TMR0.

5.6. EL PERRO GUARDIÁN (WDT: «WATCH DOG TIMER»)


Es un temporizador de 8 bits independiente que se alimenta de los impulsos de reloj pro-
cedentes de su propio oscilador RC; por dicha causa, sigue funcionando aunque se entre
en el modo de bajo consumo y se pare el oscilador principal del procesador.
Cada vez que se desborda o pasa de 1111 1111 a 0000 0000 el WDT, se genera un
reset. Su misión es vigilar la correcta ejecución de las instrucciones del programa, de
forma que cuando queda bloqueado o en un bucle cerrado, el Perro Guardián se desborda
e inicializa desde el principio el sistema.
El WDT comienza a incrementarse desde el principio del programa, y cuando todo
va bien, se coloca la instrucción CLRWDT en puntos estratégicos, que pone a 0 o ini-
cializa o «refresca» el WDT. Si se bloquea el flujo de instrucciones en algún punto del
programa o por alguna anomalía no se alcanza a tiempo la instrucción CLRWDT, se
produce el desbordamiento del WDT y el reset que origina.
El bit TO# (Timer Out) del registro STATUS, cuando pasa a valer 0, indica que se ha
producido un reset por desbordamiento del Perro Guardián.
El funcionamiento de WDT es opcional, existiendo el bit WDTE en la Palabra de
Configuración, que, según valga 1 o 0, permite o prohíbe su funcionamiento.
El bit PSA de OPTION asigna el predivisor de frecuencia al TMR0 o al WDT (Fig. 5.15).

Figura 5.15. Esquema que muestra la compartición del divisor de frecuencia entre el TMR0 (predivisor)
y el WDT (posdivisor).
RECURSOS Y PERIFÉRICOS PRINCIPALES 73

Cuando el WDT no emplea el divisor de frecuencias, por defecto tiene un período


de desbordamiento de 18 ms. Para aumentar dicho tiempo, se puede configurar el rango
del divisor hasta 1:128, con lo que se permite alcanzar un tiempo de desbordamiento de
2,3 s. En realidad, el divisor de frecuencia actúa con el WDT como posdivisor, puesto
que divide los impulsos que salen del Perro Guardián.
La instrucción CLRWDT pone a 0 el valor del WDT. También la instrucción SLEEP
que pasa al procesador al modo de bajo consumo, pone a 0 al WDT, aunque éste sigue
funcionando con su oscilador propio.
Como el divisor de frecuencia se asigna por software al TMR0 o al WDT, es posible
su modificación a lo largo del programa actuando sobre el bit PSA de OPTION. Si se
produce un reset imprevisto, el bit PSA toma el valor que corresponde la asignación al
TMR0 del divisor de frecuencia, y se recomienda introducir para estos casos el siguiente
programa para reestablecer el divisor al WDT.

CLRWDT ; Borra o pone a 0 el WDT


CLR TMR0 ; Borra el TMR0 y el divisor
MOVLW ‘00xx1111’b ; PSA=PS2=PS1=PS0=1
CLRWDT ; PS2<2:0> a 000 o a 111
MOVLW ‘00xx1xxx’b ; Programa el rango deseado
OPTION ; xxx para rango divisor del WDT

Para cambiar la asignación del divisor de frecuenta del WDT al TMR0 se debe usar
el siguiente programa:

CLRWDT ; Borra al WDT y al divisor


MOVLW ‘xxxx0xxx’b ; Asigna el divisor al TMR0
OPTION ; con el rango xxx deseado.
CAPÍTULO

Recursos auxiliares
6

6.1. EL MODO DE BAJO CONSUMO


Los modelos industriales PIC12F508/509 admiten un rango de temperatura comprendi-
do entre – 40 °C y + 85 °C, pudiéndoles alimentar con una tensión comprendida entre 2,0
y 5,5 V. Trabajando con 2 V y 4 MHz, la corriente de funcionamiento siempre es inferior
a 350 µA y el valor típico es de 170 µA.
Cuando el microcontrolador entra en el modo de bajo consumo, también llamado
standby y SLEEP, el consumo típico de corriente es de 0,1 µA con una tensión de 2,0 V.
Es decir, en este modo de trabajo, el consumo se rebaja en más de mil veces, aspecto
muy significativo cuando se emplea en sistemas portátiles alimentados con baterías
(Fig. 6.1).

Figura 6.1. Los sistemas portátiles basados en microcontrolador y alimentados con baterías funcionan
normalmente en modo de bajo consumo.

75
76 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Al modo de bajo consumo se entra cuando se ejecuta la instrucción SLEEP en el


programa, y si en ese instante el Perro Guardián está activado, se refresca, pero sigue
funcionando a partir del valor inicial. Al entrar en modo de bajo consumo se detiene el
oscilador principal del procesador y se detiene la ejecución de instrucciones, también se
«congelan» las líneas de E/S. Al tener su propio oscilador, el WDT, aunque se refresca,
sigue trabajando al entrar al modo de bajo consumo.
En este modo, la patita (GP2/RB2)/T0CKI debe estar conectada a VDD o a VSS y la
(GP3/RB3)/MCLR#/VPP debe tener nivel alto cuando actúa como MCLR#.
Para «despertar» al procesador o salir del modo de bajo consumo existen tres causas:

1.a Se produce un reset por activación con nivel bajo de la patita (GP3/RB3)/MCLR#/VPP
cuando está configurada para trabajar como MCLR#.
2.a Se produce un reset por desbordamiento del WDT.
3.a Estando configuradas para producir un reset las patitas GP0/RB0, GP1/RB1, GP3/RB3
y RB4, cambia el estado lógico de alguna de ellas y hay reset.

Para conocer la causa que ha originado el despertar del procesador se dispone de tres
bits señalizadores del Registro de Estado (STATUS): TO#, que indica si se ha desborda-
do el WDT; PD#, si se ha ejecutado la instrucción SLEEP, y GWUF/RBWUF, si se ha
producido un cambio de estado en alguna de las patitas RB<4:0>.

IMPORTANTE

Antes de entrar en el modo de bajo consumo es necesario leer las patitas de entrada. Una
de las causas que hace salir del modo de bajo consumo es el cambio de estado en alguna
de las patitas de entrada RB<4:0>. Si antes de ejecutar la instrucción SLEEP no se ha leído
el estado de dichas patitas, se producirá un despertar automático, aunque ninguna cambie
el estado lógico.

Indiferentemente de la causa que provoque el despertar del procesador, el WDT se


refresca siempre.

6.2. LA PALABRA DE CONFIGURACIÓN


Los PIC12F508/509 disponen de una posición en la memoria FLASH que se denomina
«Palabra de Configuración» y cuyos 5 bits de menos peso controlan funciones importan-
tes del procesador. Los 7 bits de más peso no están implementados y se leen siempre 0
(Fig. 6.2). A la Palabra de Configuración sólo puede accederse en la fase de grabación.

Figura 6.2. Distribución de los 5 bits válidos de la Palabra de Configuración.


RECURSOS AUXILIARES 77

La misión de los bits de la Palabra de Configuración es la siguiente:

— MCLRE: Control de la función de la patita GP3/MCLR#


1: La patita GP3/MCLR# funciona como MCLR#.
0: Actúa como patita de entrada digital GP3, estando internamente conectada a
la tensión positiva la función MCLR# .

— CP#: Protección de código


1: No hay protección del código.
0: Hay protección del código y no se puede leer la memoria de programa.
Si no se programa el bit CP#, por defecto se puede leer el código. Independiente-
mente del valor del CP#, las sesenta y cuatro primeras posiciones de la memoria
de programa y la última (valor de calibración para OSCCAL) se pueden leer
siempre.

— WDTE: Permite el funcionamiento del WDT


1: El WDT funciona.
0: No funciona el WDT.

— FOSC<1:0>: Selecciona el tipo de oscilador


11: EXTRC (externo).
10: INTRC (interno).
01: Tipo XT.
00: Tipo LP.
La Palabra de Configuración sólo es accesible durante el proceso de grabación de la
memoria de programa y no responde a una dirección concreta del mapa.

6.3. POSICIONES DE IDENTIFICACIÓN ID

Hay cuatro posiciones de la memoria de programa reservadas para labores de «identifica-


ción» del dispositivo, que se denominan ID, en las cuales el usuario puede grabar en los
4 bits de menos peso números, códigos o claves que le permitan averiguar ciertas caracte-
rísticas a lo largo del tiempo (versión, año de fabricación, versión del software, precio, etc.).
Sólo se pueden grabar los 4 bits de menos peso de estas cuatro posiciones, leyéndose
siempre 0 los ocho restantes.
Al igual que la Palabra de Configuración, las posiciones ID no son accesibles du-
rante la ejecución normal del programa y sólo pueden ser leídas o escritas en la fase de
grabación/verificación.

6.4. PROGRAMACIÓN SERIE EN CIRCUITO (ICSPTM)


En general, todos los microcontroladores PIC pueden ser grabados con el programa de
aplicación una vez que el circuito integrado esté montado en la tarjeta final. Esto permite
a los fabricantes disponer de las tarjetas a incluir en los productos totalmente terminadas
78 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 6.3. Conexionado del microcontrolador para proceder a la grabación del programa en la memo-
ria FLASH en serie (ICSPTM).

a falta de grabar el programa en el microcontrolador. Así, la grabación se efectúa justo


antes de ser entregado al cliente final, pudiéndose introducir el firmware más actual.
La grabación de la memoria FLASH se realiza transmitiendo la información en se-
rie usando una línea para introducir los datos (GP0/ICSPDAT) y otra que introduce los
impulsos de reloj para la sincronización (GP1/ICSPCLK). Además, se precisan otras tres
líneas más: una para la alimentación positiva (VDD), otra para tierra (GND) y una última
para aplicar por ella el voltaje especial VPP que se necesita para la grabación y que suele
ser algo inferior a 13,5 V (Fig. 6.3).
Para iniciar el modo de trabajo para la Programación/Verificación basta aplicar por
la patita MCLR#/VPP un voltaje superior a VDD, que suele ser de unos 13 V, mientras se
mantienen a nivel bajo las patitas GP0 y GP1. A partir de ese momento, la patita GP0
actúa como entrada y salida de datos en serie y GP1 recibe los impulsos de reloj que
sincronizan la transferencia entre el microcontrolador y el exterior.

6.5. «RESET» AL CONECTAR LA ALIMENTACIÓN


(POR: «Power On Reset»)
En la mayor parte de los microcontroladores, como en el PIC12F508/509, se incluye un
circuito que produce un reset cuando se conecta la alimentación al microcontrolador.
Dicho circuito, llamado POR (Power On Reset), mantiene al PIC en estado de reset hasta
que el voltaje de alimentación, VDD, alcance el valor suficiente para el funcionamiento
correcto del sistema.
El POR permite utilizar la patita GP3/MCLR#/VPP en funciones de entrada o sa-
lida desde el principio, ya que el reset se provoca automáticamente y mantiene dicho
estado hasta que se alcancen las condiciones de trabajo adecuadas en cuanto al voltaje,
frecuencia, temperatura, etc. En la Figura 6.4 se muestra el esquema eléctrico de control
del reset.
Apréciese en la Figura 6.4 que tanto POR como DTR se activan al conectar la ali-
mentación al microcontrolador, mientras que POR activa la entrada S (SET) del flip-flop;
al cabo de un cierto tiempo, controlado por DTR, se activa la entrada R (RESET) y se
produce el RESET# principal del sistema.
RECURSOS AUXILIARES 79

Figura 6.4. Esquema general para la generación del reset.

6.6. TEMPORIZADOR DE «RESET» (DTR: «Device Reset Timer»)


El DTR es un temporizador que comienza el control del tiempo en el que se retrasa la
generación del reset cuando se conecta la alimentación. Funciona como un oscilador RC
interno y su valor varía dependiendo del oscilador que se emplee y el tipo de reset que
se provoque.
La misión del DTR es mantener reseteado al dispositivo hasta que no complete su
período de temporización para permitir que tanto la tensión de alimentación suba hasta
el mínimo necesario como la frecuencia de trabajo se estabilice.
También se activa el DTR cuando se desborda el WDT trabajando en el modo de
bajo consumo, lo que resulta muy útil en aplicaciones en las que se emplea el WDT para
despertar automáticamente al procesador.

Figura 6.5. Circuito BOR que genera un reset cuando VDD < VZ + 0,7.
80 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

6.7. «RESET» POR BAJADA DE LA ALIMENTACIÓN


(BOR: «Brown Out Reset»)
Así como se produce un reset al conectar la alimentación (POR), cuando la tensión de
alimentación, VDD, baja del valor mínimo que precisa el microcontrolador para funcionar
correctamente, sin llegar a 0, y después recupera su valor hasta ser aceptable, también
conviene generar un reset. A esta condición de reset se la conoce como Brown Out Reset
(BOR) y en la Figura 6.5 se presenta el esquema del circuito BOR que activará el reset
cuando VDD baje del valor (VZ + 0,7), siendo VZ la tensión Zener del diodo.
CAPÍTULO

El repertorio de instrucciones
7

7.1. CARACTERÍSTICAS GENERALES


Y TIPOS DE INSTRUCCIONES
Los microcontroladores PIC de 8 bits de la gama básica soportan un repertorio de treinta
y tres instrucciones de 12 bits de longitud de código máquina cada una. Son muy ortogo-
nales, teniendo mucha flexibilidad para escoger los operandos y el destino.
Hay cuatro grandes grupos de instrucciones,

1.o Instrucciones orientadas a manejar datos de tamaño byte.


2.o Instrucciones orientadas a manejar bits.
3.o Instrucciones orientadas a manejar constantes o literales (valores inmediatos).
4.o Instrucciones de control.

Las instrucciones más usadas y numerosas son las que manipulan bytes. Frecuente-
mente, los datos de tamaño byte, que son los datos naturales, residen en posiciones de la
memoria de datos, que actúan como si se tratasen de «registros» de datos.
Cuando una instrucción utiliza un registro o posición de la memoria de datos, lo
representa en su nomenclatura con una f y en binario se determina con 5 bits, con los que
se pueden discriminar hasta los 32 de un banco (del 0 al 31). Recuérdese que en algunos
modelos de microcontroladores pueden existir varios bancos de registros en la memoria
de datos y hay que dedicar otros bits para elegir el banco.
Al destino de una instrucción, que es un registro de datos, se le representa por d y en
su codificación sólo se precisa un bit, que si vale 1, el resultado se guarda en el registro
de datos f (que actuaba como uno de los operandos), y si vale 0, se guarda en el registro
de trabajo W.
Cuando una instrucción sólo afecta a un bit de un registro de datos, se le representa
como b, y se codifica con 3 bits, que determinan la posición del seleccionado (del 0 al 7).
Los literales o constantes son valores inmediatos que van incluidos en el formato
binario de la instrucción de 12 bits y pueden ser de 8 o 9 bits de tamaño, estando repre-
sentados en el nemónico de la instrucción por k.

81
82 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

En la Figura 7.1 se presenta una tabla correspondiente a los símbolos usados en los
diferentes campos de la nomenclatura de las instrucciones en lenguaje ensamblador, así
como su descripción.

Campo Descripción
f Dirección del registro de datos (0 × 00 hasta 0 × 1F).
W Registro de trabajo (acumulador).
b Dirección de un bit dentro de un registro de 8 bits.
k Campo literal, dato constante o etiqueta.
x Valor indiferente (= 0 o 1).
El compilador generará código con x = 0. Es la forma recomendada de uso
para compatibilidad con todas las herramientas software de Microchip.
d Selección de destino:
d = 0 → almacena el resultado en W.
d = 1 → almacena el resultado en el registro f.
Por defecto d = 1.
label Nombre de la etiqueta.
TOS Cima de la pila (Top-of-Stack).
PC Contador de Programa (Program Counter).
WDT Perro Guardián (Watch Dog Timer).
TO# Bit Time-out (desbordamiento WDT).
PD# Bit Power-down (modo de bajo consumo).
dest Destino, el registro W o la localización del registro especificado.
[] Opciones.
() Contenido.
→ Asignado a.
<> Bit del registro.
 En el intervalo.
italics Términos definidos por el usuario (la fuente es Courier).
0 × hhh Representación del número hexadecimal (h: dígito hexadecimal).
b’10101010’ Representación del número binario 10101010.

Figura 7.1. Símbolos usados para representar los diferentes campos de la nomenclatura de las instruc-
ciones en Ensamblador.

Todas las instrucciones tardan en ejecutarse un ciclo de instrucción (4 × TOSC), ex-


cepto las de salto, que tardan el doble.
EL REPERTORIO DE INSTRUCCIONES 83

7.2. FORMATO DE LAS INSTRUCCIONES


Los 12 bits que codifican en lenguaje máquina o binario las instrucciones de los PIC de
la gama básica se dividen en varios campos que sirven para identificar los operandos,
el destino, el valor inmediato o literal, el bit al que afecta o la dirección del salto. Los
bits de más peso del código de la instrucción se reservan para el código OPCODE, que
identifica la instrucción que se trata.
Las instrucciones que manejan datos de tamaño byte suelen emplear a un registro
(posición de la memoria de datos) cuya dirección f viene determinada por un campo
de 5 bits. El destino de estas instrucciones puede ser el propio registro f o el regis-
tro W, según el bit d valga 1 o 0, respectivamente. Por defecto, se supone que d = 1
(Fig. 7.2).

Figura 7.2. Formato máquina o binario de las instrucciones orientadas a manejar bytes que residen en
una dirección f de la memoria de datos. El destino es W si d vale 0, y en caso contrario, es
el propio registro f.

Ejemplo
Sabiendo que el código OPCODE de la instrucción de nemónico MOVF f,
d es
001000dfffff
Averigurar el formato binario de la instrucción que mueve el conte-
nido del registro de datos ubicado en la dirección 0x08 de la memo-
ria de datos al registro W.

Solución
001000001000

Las instrucciones orientadas a manipular un bit concreto de un registro de datos


tienen el formato de la Figura 7.3 y destinan los 3 bits del campo b a definir el bit afec-
tado.

Figura 7.3. Formato de las instrucciones orientadas a manejar un bit b de un registro f.


84 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Ejemplo
La instrucción que responde al nemónico BCF f, b pone a 0 el bit «b»
del registro «f» y responde al código máquina
0100bbbfffff
Averiguar el código máquina de la instrucción BCF 0x07, 4 que pone
a 0 el bit 4 del registro ubicado en la dirección 0x07 de la memoria
de datos.

Solución
010010000111

Las instrucciones que manejan valores inmediatos o literales k admiten que éstos
tengan 8 o 9 bits. En el caso de que k tenga 8 bits, el campo binario de la instrucción
OPCODE es de 4 bits, mientras que si es de 9 bits, el campo OPCODE se reduce a 3
(Fig. 7.4).

Figura 7.4. Formato máquina de las instrucciones que manejan literales de 8 bits,

Ejemplo
La instrucción que mueve a W un literal «k» responde al nemónico
MOVLW k y su formato es
1100kkkkkkkk
Averiguar el código máquina de la instrucción que carga en W el li-
teral 0xFF.

Solución
110011111111

Las instrucciones GOTO, que producen un salto incondicional a una posición de la


memoria del programa, manejan un literal de 9 bits que representan los 9 bits de menos
peso de la dirección a la que saltan (Fig. 7.5).

Figura 7.5. La instrucción GOTO maneja un literal k de 9 bits que se carga en los 9 bits de menos peso
del PC y determina la dirección del salto.
EL REPERTORIO DE INSTRUCCIONES 85

Ejemplo
El código máquina al que responde la instrucción GOTO k responde al
formato
101kkkkkkkkk
Averiguar el formato binario de la instrucción GOTO 0x05A

Solución
101001011010

Finalmente, las instrucciones de control del flujo del programa bien manejan un
literal k de 8 bits o bien son implícitas y no precisan especificar mas que a ellas mismas.

Ejemplo
La instrucción CALL k sirve para llamar a una subrutina que co-
mienza en una dirección que la determina el contenido del PC cuando
se cargan los 8 bits del literal «k» en sus 8 bits de menos peso y
responde al formato
1001kkkkkkkk
Averiguar el formato de la instrucción CALL 0xF0.

Solución
100111110000

La instrucción de control CLRWDT refresca o inicializa el valor del Perro Guardián


y tiene de código máquina fijo 000000000100.
En la tabla de la Figura 7.6 se presenta el valor de los 12 bits del código binario
correspondiente a las treinta y tres instrucciones de la gama básica junto a ciertas carac-
terísticas de interés.

INSTRUCCIONES ORIENTADAS AL MANEJO DE BYTES


Formato Bits
Nemónico
Descripción Ciclos 12 bits afectados Notas
operandos
MSb LSb STATUS
ADDWF f, d Suma W y f 1 0001 11df ffff C, DC, Z 1, 2, 4
ANDWF f, d Operación lógica AND de W 1 0001 01df ffff Z 2, 4
yF
CLRF f Establece f a ceros 1 0000 011f ffff Z 4
CLRW — Establece W a ceros 1 0000 0100 0000 Z
COMF f, d Complementa f 1 0010 01df ffff Z
86 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

INSTRUCCIONES ORIENTADAS AL MANEJO DE BYTES (Continuación)

Formato Bits
Nemónico
Descripción Ciclos 12 bits afectados Notas
operandos
MSb LSb STATUS
DECF f, d Decrementa f 1 0000 11df ffff Z 2, 4
DECFSZ f, d Decrementa f y salta si cero 1o2 0010 11df ffff Ninguno 2, 4
INCF f, d Incrementa f 1 0010 10df ffff Z 2, 4
INCFSZ f, d Incrementa f y salta si cero 1o2 0011 11df ffff Ninguno 2, 4
IORWF f, d Operación lógica OR de W y f 1 0001 00df ffff Z 2, 4
MOVF f, d Mueve f a d 1 0010 00df ffff Z 2, 4
MOVFW f Mueve W a f 1 0000 001f ffff Ninguno 1, 4
NOP — No operar 1 0000 0000 0000 Ninguno
RLF f, d Rotar a izquierda a través del 1 0011 01df ffff C 2, 4
acarreo
RRF f, d Rotar a derecha a través del 1 0011 00df ffff C 2, 4
acarreo
SUBWF f, d Resta W de f 1 0000 10df ffff C, DC, Z 1, 2, 4
SWAPF f, d Intercambia f y d 1 0011 10df ffff Ninguno 2, 4
XORWF f, d Operación lógica OR exclusiva 1 0001 10df ffff Z 2, 4
de W y f

INSTRUCCIONES ORIENTADAS A MANEJO DE BITS

BCF f, b Borrar el bit b de f 1 0100 bbbf ffff Ninguno 2, 4


BSF f, b Establece a 1 el bit b de f 1 0101 bbbf ffff Ninguno 2, 4
BTFSC f, b Brinca si el bit b de f es cero 1o2 0110 bbbf ffff Ninguno
BTFSS f, b Brinca si el bit b de f es uno 1o2 0111 bbbf ffff Ninguno

INSTRUCCIONES DE CONTROL Y DE MANEJO DE LITERALES

ANDLW k AND entre W y el literal k 1 1110 kkkk kkkk Z


CALL k Llamada a subrutina 2 1001 kkkk kkkk Ninguno 1
CLRWDT — Refrescar Perro Guardián 1 0000 0000 0100 TO#, PD#
GOTO k Salto incondicional 2 101k kkkk kkkk Ninguno
IORLW k Operación lógica OR con el 1 1101 kkkk kkkk Z
literal k
MOVLW k Mueve el literal a W 1 1100 kkkk kkkk Ninguno
OPTION — Carga el registro OPTION 1 0000 0000 0010 Ninguno
RETLW k Retorno subrutina, devuelve 2 1000 kkkk kkkk Ninguno
k en W
EL REPERTORIO DE INSTRUCCIONES 87

INSTRUCCIONES DE CONTROL Y DE MANEJO DE LITERALES (Continuación)

Formato Bits
Nemónico
Descripción Ciclos 12 bits afectados Notas
operandos
MSb LSb STATUS
SLEEP — Entra en modo SLEEP 1 0000 0000 0011 TO#, PD#
TRIS f Carga el registro TRIS 1 0000 0000 0fff Ninguno 3
XORLW k OR exclusiva con W y el lite- 1 1111 kkkk kkkk Z
ral k
Notas:
1. El noveno bit del Contador de Programa es puesto a ‘0’ por cualquier instrucción que modifique el valor del
PC, excepto la instrucción GOTO.
2. Cuando un registro de ENTRADA/SALIDA se modifica a sí mismo (ej.: MOVF PORTB, 1), el valor usado es que
está presente en los propios pines. Por ejemplo, si el registro de datos tiene puesto a ‘1’ un pin configurado como
entrada y es cambiado a nivel bajo por un dispositivo externo, el dato será escrito con un ‘0’.
3. La instrucción TRIS f, donde f es igual a 6, provoca que el contenido del registro W sea escrito en los registros tri-
estados de la Puerta B (PORTB). Un ‘1’ pone el pin en un estado de alta impedancia y deshabilita los buffers de salida.
4. Si esta instrucción es ejecutada en el registro TMR0 (y donde sea aplicable, d = 1), el preescaler será puesto a ‘0’.

Figura 7.6. Tabla que recoge el formato máquina de las treinta y tres instrucciones de los PIC de la
gama básica y algunas características de interés. Brincar significa que se salta la siguiente
instrucción.

7.3. DESCRIPCIÓN DE LAS INSTRUCCIONES CON EJEMPLOS


Se procede a la descripción, por orden alfabético, de las treinta y tres instrucciones de la
gama básica junto a las características relevantes.

ADDWF Suma W y el registro f


Sintaxis ADDWF f, d
Operación (W) + (f) → (dest)
Operandos 0  f  31
d  [0,1]
Señalizadores afectados C, DC y Z
Ciclos instrucción 1
Formato binario 0001 00df ffff
Descripción Suma el contenido del registro W con el del
registro f. Si d = 0, el resultado lo almacena
en W, y si d = 1, en f. Por defecto, d = 1.

Ejemplo
ADDWF 0x07, 0
Suma el contenido de W con el del registro ubicado en la dirección
0x07 de la memoria de datos y deposita el resultado en W.
88 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

ANDLW Operación AND de W y un literal k


Sintaxis ANDLW k
Operación (W) and K → (W)
Operandos 0  k  255
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 1110 kkkk kkkk
Descripción Con el contenido de W se realiza la operación
lógica bit a bit con el literal k, depositán-
dose el resultado en W.

Ejemplo
ANDLW 0x0F
Se realiza la AND lógica bit a bit del contenido de W con el inme-
diato 0x0F, depositándose en W el resultado.

ANDWF Operación AND de W con el registro f


Sintaxis ANDWF f, d
Operación (W) and (f) → (dest)
Operandos 0  f  31
d  [0,1]
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 0001 11df ffff
Descripción El contenido de W efectúa la operación AND
bit a bit con el del registro f. Si d = 0, el
resultado se carga en W, y d = 1, en f.

Ejemplo
ANDWF 0x09
Se efectúa la operación lógica AND entre el contenido de W y el de
la dirección de la memoria de datos 0x09, depositándose el resultado
en este último. (Por defecto, d = 1).

BCF Borrar un bit del registro f


Sintaxis BCF f, b
Operación 0 → (f < b>)
Operandos 0  f  31
0b7
EL REPERTORIO DE INSTRUCCIONES 89

Señalizadores afectados Ninguno


Ciclos instrucción 1
Formato binario 0100 bbbf ffff
Descripción El bit b del registro f se pone a 0.

Ejemplo
BCF 0x03, 2
Se pone a 0 el bit 2 del registro de datos con dirección 0x03.

BSF Poner a 1 un bit del registro f


Sintaxis BSF f, b
Operación 1 → (f<b>)
Operandos 0  f  31
0b7
Señalizadores afectados Ninguno
Ciclos instrucción 1
Formato binario 0101 bbbf ffff
Descripción El bit b del registro f pasa a valor 1.

Ejemplo
BSF 0x02, 6
El bit 6 del registro de datos con dirección 0x02 pasa a valer 1.

BTFSC Explora un bit de un registro y brinca si es 0


Sintaxis BTFSC f, b
Operación Si el bit b del registro f vale 0, se salta
la siguiente instrucción y PC=PC+1 (brinca).
Si vale 1, se pasa a la siguiente instrucción
(PC=PC+1).
Operandos 0  f  31
0b7
Señalizadores afectados Ninguno
Ciclos instrucción 1 o 2 (si brinca)
Formato binario 0110 bbbf ffff
90 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Descripción Si el bit f<b>=0, se salta la siguiente ins-


trucción (brinco) y se ejecuta una NOP en su
lugar, por lo que dura dos ciclos de instruc-
ción. Si f<b>=1, se pasa normalmente a eje-
cutar la siguiente instrucción. Actúa como
una instrucción de salto condicional, aunque
el salto es más pequeño porque sólo salta la
siguiente instrucción. Es un brinco.

Ejemplo
BTFSC 0x02, 3
Si el bit 3 del registro 0x02 vale 0, se brinca y se salta la si-
guiente instrucción.

BTFSS Explora un bit de un registro y brinca si es 1


Sintaxis BTFSS f, b
Operación Si el bit b del registro f vale 1, se brinca
(PC=PC+2). Si vale 0, PC=PC+1
Operandos 0  f  31
0b7
Señalizadores afectados Ninguno
Ciclos instrucción 1 o 2(si brinca)
Formato binario 0111 bbbf ffff
Descripción Si el bit f<b>=1, se salta la siguiente ins-
trucción (brinco), ejecutándose en su lugar
una NOP y tardando dos ciclos de instruc-
ción.

Ejemplo
BTFSS 0x04, 5
Si el bit 5 del registro 0x04 vale 1, se brinca (PC=PC+2).

CALL Llamada a subrutina


Sintaxis CALL k
Operación PC+1 → TOP (Cima de la Pila)
K → PC<7:0>
STATUS<6:5> → PC<10:9>
0 → PC<8>
Operandos 0  k  255
Señalizadores afectados Ninguno
EL REPERTORIO DE INSTRUCCIONES 91

Ciclos instrucción 2
Formato binario 1001 kkkk kkkk
Descripción Primero se guarda PC+1 en la Cima de la
Pila. Luego, los 8 bits de menos peso de PC.
Los bits 6 y 5 del STATUS se cargan en los
2 bits de más peso de PC (9 y 10) y el bit
PC<8>=0.

Ejemplo
CALL 0x5B
1. El valor de PC + 1 se guarda en la Pila
2. PC <7:0> se cargan con 0x5B
3. PC <10:9> se cargan con STATUS<6:5>
4. PC <8>=0

CLRF Borra el registro f


Sintaxis CLRF f
Operación 0x00 → (f) y Z ← 1
Operandos 0  f  31
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 0000 011f ffff
Descripción El contenido del registro de datos de direc-
ción f se pone a 0 y Z = 1.

Ejemplo
CLRF 0x09
El contenido de la posición de memoria 0x09 se pone a 0 y Z=1.

CLRW Borrar W
Sintaxis CLRW
Operación 0x00 → W y Z=1
Operandos Ninguno
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 0000 0100 000
Descripción Pone a cero el registro W y Z = 1.
92 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Ejemplo
CLRW
Pone a 0 el registro W y Z=1.

CLRWDT Borrar el perro guardián (WDT)


Sintaxis CLRWDT
Operación 0 → WDT
0 → predivisor WDT (si tiene)
1 → TO#
1 → PD#
Operandos Ninguno
Señalizadores afectados TO# y PD#
Ciclos instrucción 1
Formato binario 0000 0000 0100
Descripción Pone a 0 el WDT y también el predivisor de
frecuencias si lo tiene asignado. Los seña-
lizadores TO# y PD# pasan a valor 1.

Ejemplo
CLRWDT
Pone a 0 el WDT y también el predivisor de frecuencias si lo tiene
asignado. Los señalizadores TO# y PD# pasan a valor 1.

COMF Complementa f
Sintaxis COMF f, d
Operación Complementa f y lo deposita en el destino.
Operandos 0  f  31
d  [0, 1]
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 0010 01df ffff
Descripción Complementa el contenido de la dirección f
depositándolo en d.

Ejemplo
COMF 0x07, 0
Complementa el contenido de la posición 0x07 y deposita el resultado
en W. (Si d=1, el destino es f).
EL REPERTORIO DE INSTRUCCIONES 93

DECF Decrementa f
Sintaxis DECF f, d
Operación (f)—1 → (dest)
Operandos 0  f  31
d  [0, 1]
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 0000 11df ffff
Descripción Decrementa en una unidad el contenido de la
dirección f.

Ejemplo
DECF 0x05
Decrementa en una unidad el contenido de la posición 0x05 de la
memoria de datos y deposita el resultado en dicha posición (por de-
fecto, d = 1). Si d = 0, el destino es W.

DECFSZ Decrementa f, y si vale 0, brinca


Sintaxis DECFSZ f,d
Operación Decrementa el registro f, y si vale 0, se salta
la siguiente instrucción (brinca).
Operandos 0  f  31
d  [0, 1]
Señalizadores afectados Señalizadores
Ciclos instrucción 1 o 2(si brinca)
Formato binario 0010 11df ffff

Ejemplo
DECFSZ 0x12, 0
Decrementa una unidad el contenido de 0x12 y lo carga en W. Si el
resultado del decremento es cero, brinca, o sea, salta la siguiente
instrucción (PC ← PC+2.

GOTO Salto incondicional


Sintaxis GOTO k
Operación k → PC<8:0>
STATUS<6:5> → PC<10:9>
Operandos 0  k  511
94 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Señalizadores afectados Ninguno


Ciclos instrucción 2
Formato binario 101k kkkk kkkk

Ejemplo
GOTO 0x0A5
PC<8:0> ← 01010 0101
PC<10:9> ← STATUS<6:5>

INCF Incrementa f
Sintaxis INCF f, d
Operación (f)+1 → (dest)
Operandos 0  f  31
d  [0, 1]
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 0010 10df ffff

Ejemplo
INCF 0x10, 1
Incrementa el contenido de la posción 0x10 de la memoria de datos y
deposita el resultado en dicha posición. (Si d=0, el destino es W).

INCFSZ Incrementa f y brinca si es cero


Sintaxis INCFSZ f, d
Operación (f)+1 → (dest)
Y si es 0, brinca
Operandos 0  f  31
d  [0, 1]
Señalizadores afectados Ninguno
Ciclos instrucción 1 o 2(si brinca)
Formato binario 0011 11df ffff

Ejemplo
INCFSZ 0x09, 0
Incrementa el contenido de la dirección 0x09 de la memoria de datos
y lo deposita en W, y si el resultado es 0, brinca (PC ← PC+2).
EL REPERTORIO DE INSTRUCCIONES 95

IORLW Operación OR de un literal con W


Sintaxis IORLW k
Operación (W) OR (k) → (W)
Operandos 0  k  255
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 1101 kkkk kkkk

Ejemplo
IORLW 0xFF
Se efectúa la operación lógica OR bit a bit entre el contenido de W
con el valor del literal 0xFF y se deposita el resultado en W.

IORWF Operación OR entre W y f


Sintaxis IORWF f, d
Operación (W) OR (f) → (dest)
Operandos 0  f  31
d  [0, 1]
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 0001 00df ffff

Ejemplo
IORWF 0x03, 0
Se realiza la operación lógica OR bit a bit entre el contenido de
la posición 0x03 de la memoria de datos con el de W y se deposita el
resultado en W. Si d = 1, el destino es f.

MOVF Mueve f
Sintaxis MOVF f, d
Operación (f) → (dest)
Operandos 0  f  31
d  [0, 1]
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 0010 00df ffff
96 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Ejemplo
MOVF 0x12, 1
Mueve el contenido de la posición 0x12 de la memoria de datos a la
misma posición (d=1). Esta instrucción puede servir para saber si el
contenido de la posición es 0, ya que entonces se activa Z. Si d = 0,
el contenido de la posición se mueve a W.

MOVLW Mueve un literal a W


Sintaxis MOVLW K
Operación (k) → (w)
Operandos 0  k  255
Señalizadores afectados Ninguno
Ciclos instrucción 1
Formato binario 1100 kkkk kkkk

Ejemplo
MOVLW 0x00
Mueve el literal 0x00 al registro W.

MOVWF Mueve W a f
Sintaxis MOV WF f
Operación (w) → (f)
Operandos 0  f  31
Señalizadores afectados Ninguno
Ciclos instrucción 1
Formato binario 0000 001f ffff

Ejemplo
MOVWF 0x04
Mueve el contenido de W a la posición 0x04 de la memoria de datos.

NOP No hace nada


Sintaxis NOP
Operación Ninguna
EL REPERTORIO DE INSTRUCCIONES 97

Operandos Ninguno
Señalizadores afectados Ninguno
Ciclos instrucción 1
Formato binario 0000 0000 0000

Ejemplo
NOP
No realiza ninguna operación. Ocupa una posición de memoria de có-
digo y tarda un ciclo de instrucción en ejecutarse, pero no hace
nada.

OPTION Carga el registro OPTION


Sintaxis OPTION
Operación (W) → OPTION
Operandos Ninguno
Señalizadores afectados Ninguno
Ciclos instrucción 1
Formato binario 0000 0000 0010

Ejemplo
OPTION
El contenido del registro W se carga en el registro OPTION.

RETLW Retorno de subrutina y carga de W con literal


Sintaxis RETLW
Operación K → (W)
TOS (Cima Pila) → PC
Operandos 0  K  255
Señalizadores afectados Ninguno
Ciclos instrucción 2
Formato binario 1000 kkkk kkkk

Ejemplo
RETLW 0x55
El literal 0x55 se carga en W y el PC se carga con el valor almace-
nado en la Cima de la Pila (TOS).
98 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

RLF Rotación a la izquierda a través del acarreo


Sintaxis RLF f, d
Operación

Figura 7.7

Operandos 0  f  31 y d  [0, 1]
Señalizadores afectados C
Ciclos instrucción 1
Formato binario 0011 01df ffff

Ejemplo
RLF 0x05, 0
Los bits de la posición 0x05 de la memoria de datos rotan un bit a
la izquierda a través del acarreo C, cargándose el resultado en W.
Si d = 1, el destino es la posición de la memoria de datos.

RRF Rotación a la derecha a través del acarreo


Sintaxis RRF f, d
Operación

Figura 7.8

Operandos 0  f  31 y d  [0,1]
Señalizadores afectados C
Ciclos instrucción 1
Formato binario 0011 00df ffff
EL REPERTORIO DE INSTRUCCIONES 99

Ejemplo
RRF 0x06, 1
Los bits de la posición 0x06 de la memoria de datos rotan un bit
a la izquierda a través del acarreo C y el resultado se deposita a
dicha posición. Si d = 0, el destino es W.

SLEEP Entrada al modo de bajo consumo


Sintaxis SLEEP
Operación 0x00 → WDT
0 → Predivisor del WDT
TO# = 1 y PD# = 0
Operandos Ninguno
Señalizadores afectados TO#, PD# y RBWUF
Ciclos instrucción 1
Formato binario 0000 0000 0011

Ejemplo
SLEEP
El señalizador TO# = 1, el PD# = 0 y el RBWUF no varían. El WDT y su
predivisor se ponen a 0. El procesador entra en modo de bajo con-
sumo, parándose el oscilador principal y dejando de ejecutar ins-
trucciones.

SUBWF Resta W de f
Sintaxis SUBWF f, d
Operación (f)-(w) → (dest)
Operandos 0  f  31 y d  [0, 1]
Señalizadores afectados C, DC y Z
Ciclos instrucción 1
Formato binario 0000 10df ffff

Ejemplo
SUBWF 0x08, 0
Se resta el contenido de la dirección 0x08 de la numeración de datos
de W y el resultado se deposita en W. Si d = 1, el destino es f.
100 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

SWAPF Intercambia nibles en f


Sintaxis SWAPF f, d
Operación F < 3:0> → (dest < 7:4>)
F < 7:4> → (dest < 3:0>)
Operandos 0  f  31 y d [0, 1]
Señalizadores afectados Ninguno
Ciclos instrucción 1
Formato binario 0011 10df ffff

Ejemplo
SWAPF 0x14, 0
Si d = 0, los 4 bits de menos peso de la dirección 0x014 se cargan en
los 4 bits de más peso de W y los 4 bits de más peso de la dirección
0x014 se cargan en el lugar de los 4 bits de menos peso de W. Si d = 1,
se intercambian los 4 bits (nibble) de menos peso con los de más peso
en la misma posición.

TRIS Carga el registro TRIS


Sintaxis TRIS GPIO
Operación (w) → TRIS (F=6)
Operandos F=5
Señalizadores afectados Ninguno
Ciclos instrucción 1
Formato binario 0000 0000 0fff

Ejemplo
TRIS GPIO
El registro que configura las líneas de E/S de GPIO se carga con el
contenido de W.

XORLW Operación XOR de W con un literal


Sintaxis XORLW K
Operación (w) XOR K → (w)
Operandos 0  k  255
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 1111 kkkk kkkk
EL REPERTORIO DE INSTRUCCIONES 101

Ejemplo
XORLW 0, 5B
El contenido de W efectúa la operación lógica XOR bit a bit con el
valor inmediato 0x5B y el resultado se carga en W.

XORWF Operación XOR de W con f


Sintaxis XORWF f, d
Operación (w) XOR K (f) → (dest)
Operandos 0  f  31 y d  [0, 1]
Señalizadores afectados Z
Ciclos instrucción 1
Formato binario 0001 10df ffff

Ejemplo
XORWF 0x08, 0
Se realiza la operación lógica XOR de W con el contenido de la di-
rección 0x08 de la memoria de datos y el resultado se deposita en
W. Si d = 1, el destino es f.
APLICACIONES PRÁCTICAS
a
Simulando los primeros
programas con el MPLAB 1.
y el MPLAB SIM APLICACIÓN

P1.1. ETAPAS EN UN PROYECTO CON MICROCONTROLADOR


Las fases o etapas que hay que realizar para implementar un proyecto basado en micro-
controlador se presentan de forma gráfica en el organigrama de la Figura P1.1.

Primera etapa
Se da por supuesto que ya se ha analizado el proyecto, se ha elegido una solución, se
han escogido los componentes que conforman el hardware y se ha seleccionado el mi-
crocontrolador adecuado. A continuación hay que «editar el programa fuente», para lo
cual puede emplearse cualquier editor que guarde ficheros de tipo ASCII, como el Word
Pad, el Microsoft Word o el block de notas incluido en Windows. Nosotros usamos, y
por eso lo recomendamos, el propio editor de la herramienta MPLAB IDE, que se inicia
con la opción File New. Dicha herramienta va a utilizarse en muchas fases del proyecto
y Microchip pone libremente a disposición de los usuarios la última versión en su sitio
de Internet. Así que la instalación en el PC del MPLAB IDE debe ser una labor previa
imprescindible.
Para escribir el programa fuente se puede usar el lenguaje Ensamblador, el C, el
BASIC y otros. La extensión que acompaña al archivo del programa indica el lenguaje
en el que se ha escrito: .ASM, .C, .BAS, etc. En este libro vamos a usar el Ensamblador,
el C y el PBASIC.

EJERCICIO
Comenzar instalando la versión del MPLAB IDE que se incluye en el CD que acompaña
a este libro.
A continuación, editar el programa en Ensamblador Ejem_0.ASM que encontrará
en la carpeta correspondiente de dicho CD: D:\16F84ASM\Ejem_0.ASM.

105
106 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P1.1. Organigrama que recoge las etapas que se cubren en el desarrollo de un proyecto con
microcontrolador.

Segunda etapa
El programa fuente escrito en un lenguaje hay que traducirlo a código máquina (binario
o hexadecimal) para que lo pueda ejecutar el microcontrolador. Cuando se emplea el len-
guaje Ensamblador, que es el más parecido al máquina, el fabricante suele proporcionar
SIMULANDO LOS PRIMEROS PROGRAMAS CON EL MPLAB Y EL MPLAB SIM 107

gratuitamente el programa traductor, que tambien se llama «Ensamblador». En el caso


de Microchip, el programa Ensamblador se halla incluido en el entorno de desarrollo
MPLAB IDE.
Cuando se utilizan los lenguajes C o BASIC, los programas que traducen el progra-
ma fuente en máquina ejecutable (.HEX) suelen tener algún coste, aunque es muy fácil
encontrar en Internet versiones shareware o demos para su evaluación.

Tercera etapa
Hay que depurar y poner a punto el programa ejecutable. En el proceso de traducción
del programa en lenguaje fuente a código ejecutable pueden surgir errores sintácticos
que los detecta el programa traductor y que pueden ser debidos a usar instrucciones no
existentes o mal escritas, parámetros incorrectos, etc. Cuando se detecta este tipo de
errores hay que retornar a la primera etapa y volver a editar el programa eliminando los
errores.
Cuando el programa fuente está bien escrito, los ensambladores o compiladores
que les traducen a código máquina generan una serie de archivos, de los cuales el más
importante es el que tiene la extensión .HEX, pues contiene el programa en binario/
hexadecimal que ejecutará el procesador. El resto de los archivos que se generan contie-
ne los errores encontrados (.ERR), el listado (.LIST) y otros que suelen necesitarlos las
herramientas de depuración, simulación y emulación.

Cuarta etapa
Una vez obtenido el fichero .HEX, se pasa a la verificación de su comportamiento real.
Para desarrollar esta fase tanto los fabricantes como segundas fuentes ofertan tres tipos
de herramientas que se diferencian en su potencia, rendimiento y coste.

A) Emuladores
Son equipos que sustituyen al microcontrolador en el prototipo físico y ejecutan el pro-
grama bajo prueba exactamente igual que lo haría el dispositivo definitivo, pero con la
ventaja de poder registrar eventos en el desarrollo del programa, cambiar parámetros, ver
la evolución de los valores de las posiciones de memoria, etc. Son muy precisos y caros
y Microchip comercializa los modelos IC2000 e IC4000, cuyo control se realiza desde
el entorno MPLAB (Fig. P1.2).

B) Depurador en circuito
Su coste es más asequible que el de los emuladores y consiste en una herramienta, ICD,
que comunica los recursos destinados a labores de depuración que hay dentro de muchos
microcontroladores, como los PIC, con un software de depuración externo. El ICD tiene
la capacidad de grabación del programa de aplicación sobre el microcontrolador del
prototipo (en el emulador se sustituye al microcontrolador). De esta forma, el programa
se ejecuta en tiempo real sobre el microcontrolador final bajo el control del ICD, que
108 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P1.2. Fotografía del emulador ICE 4000.

permite un seguimiento del desarrollo del programa y sus efectos. Se pueden aplicar
puntos de parada, ejecución paso a paso (instrucción por instrucción), visualización y
modificación de los valores de los registros, etc. (Fig. P1.3).
El depurador en circuito tiene limitaciones y restricciones frente al emulador, ade-
más consume parte del área de programa, algunas líneas de E/S y cada vez que hay que
modificar el programa hay que regrabarlo en la memoria del microcontrolador.

C) Simulador «software»
Se trata de un programa que simula el comportamiento del microcontrolador en la ejecu-
ción de las instrucciones de un programa de aplicación. Se ejecuta sobre el PC, pero no
en tiempo real, y no puede conectar externamente periféricos reales.

Figura P1.3. Fotografía del depurador en circuito ICD-2 que se gestiona desde el entorno MPLAB.
SIMULANDO LOS PRIMEROS PROGRAMAS CON EL MPLAB Y EL MPLAB SIM 109

Suele ser de carácter gratuito y muy didáctico. Vamos a proponer usar el MPLAB
SIM en el desarrollo de los primeros programas. Está incluido en el MPLAB.

EJERCICIO
Realizar un análisis comparativo entre las ventajas e inconvenientes de utilizar un emu-
lador, un depurador en circuito y un simulador para la fase de depuración y puesta a
punto de los programas de aplicación.

Quinta etapa
Se comprueba que el comportamiento del programa es el correcto. La comprobación
puede efectuarse con un emulador, un depurador en circuito o un simulador software. Si
se detectan fallos, hay que retornar a la primera etapa. Sólo cuando el programa cumple
todas las expectativas previstas se pasa a la siguiente etapa.

Sexta etapa
Grabación del programa ejecutable (.HEX) en la memoria del microcontrolador. Se re-
curre a un grabador con su software de apoyo. En la Figura P1.4 se muestra la fotografía
del grabador PIC Burner, muy sencillo de manejo, económico y útil para grabar la ma-
yoría de los modelos de PIC.

Figura P1.4. Fotografía del grabador PIC Burner, de Ingeniería de Microsistemas Programados, que
destaca por su economía y facilidad de manejo.
110 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Séptima etapa
Se realizan las pruebas finales sobre el prototipo que lleva incrustado el microcontrola-
dor con el programa de aplicación grabado sobre su memoria de instrucciones.
El sistema de desarrollo PIC School, que se usa en las prácticas de este libro, admite
la mayoría de las gamas de PIC, desde la básica hasta los dsPIC; dispone de un grabador
propio y es adaptable al depurador ICD-2, todo ello bajo el entorno MPLAB.

P1.2. EL ENTORNO DE DESARROLLO MPLAB IDE


La mejor herramienta que existe para trabajar con los PIC es el entorno MPLAB IDE,
diseñado por Microchip, y que en el CD que acompaña a este libro se incluye la versión
7.50. Es un software que se cuida con enorme interés y que facilita enormemente el di-
seño de proyectos con PIC.
Con el MPLAB IDE se pueden realizar todas las tareas que participan en el desarro-
llo de un proyecto: editar el programa fuente, ensamblarlo o compilarlo (si se dispone de
compilador), simular el comportamiento del programa ejecutable y, con las herramientas
precisas, también se puede emular, depurar en circuito y grabar el programa sobre la
memoria del microcontrolador.
Una vez que el lector haya instalado en su PC el MPLAB IDE, se sugiere crear una
carpeta bajo el nombre de «Programas de Aplicaciones» y copiar en ella los programas
fuente .ASM correspondientes a los ejemplos contenidos en el CD del libro.
La pantalla principal del MPLAB IDE, v. 7.30, dispone de las opciones e iconos
típicos en los programas habituales de Windows (Fig. P1.5). En www.microchip.com se
puede recoger un excelente manual de usuario del entorno MPLAB IDE.

Figura P1.5. Opciones e iconos que aparecen en la pantalla principal del entorno MPLAB IDE.

P1.2.1. Creando un proyecto


Se recomienda trabajar en el entorno MPLAB IDE mediante «proyectos», lo que facilita
enormemente la tarea del programador. Un proyecto contiene diversos ficheros, unos se
encargan de la inicialización del dispositivo, otros definen las áreas de memoria, otros
los programas fuente, etc. El proyecto recoge una serie de datos relacionados con la
aplicación:
SIMULANDO LOS PRIMEROS PROGRAMAS CON EL MPLAB Y EL MPLAB SIM 111

Figura P1.6. La iniciación del proyecto se produce con la opción Project Wizard en la ventana desplega-
ble de Project en el entorno MPLAB IDE.

• Tipo de procesador.
• Lenguaje de programación.
• Nombre del fichero con el programa fuente.
• Ficheros que se obtienen tras el ensamblado o compilación, como los ejecutables (.HEX),
listados (.LIST), errores (.ERR), etc.
• Entorno de trabajo.
• Parámetros de configuración.

Cuando se abre un proyecto, se obtiene automáticamente y de forma muy rápida el


entorno de trabajo que se dejó la última vez.
Para iniciar la gestión y desarrollo de un proyecto, se elige la opción Project/Project
Wizard en el menú principal, tal como se presenta en la Figura P1.6.
Una vez seleccionado el gestor de proyectos, éste va guiando al usuario en las dife-
rentes fases precisas para crear un nuevo proyecto. Tras una ventana de bienvenida, se
elige la pestaña «Siguiente» para ir pasando por todos los pasos.

— Primer paso: Selección del microcontrolador. Aparece una lista desplegable


con todos los modelos de PIC que admite la versión del MPLAB utilizada. Se-
leccionamos el PIC12F508 (Fig. P1.7).
112 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P1.7. Selección del microcontrolador usado en el proyecto.

— Segundo paso: Se selecciona la herramienta del MPLAB IDE que se va a usar


para ensamblar o compilar el programa fuente. Se supone que el programa
fuente está escrito en lenguaje Ensamblador (.ASM) y se elige en la persiana
Active Toolsuite la herramienta Microchip MPASM Toolsuite, que incluye el
entorno integrado. Dicha herramienta consta del ensamblador (mpasmwin.exe),
del enlazador o linkador (mplink.exe) y de la biblioteca (mplib.exe). Con el botón
Browse se puede seleccionar la ruta donde se encuentran esos tres ficheros, que
por defecto es la mostrada en la Figura P1.8.

Figura P1.8. En el segundo paso se seleccionan las herramientas para ensamblar o compilar el progra-
ma fuente.
SIMULANDO LOS PRIMEROS PROGRAMAS CON EL MPLAB Y EL MPLAB SIM 113

— Tercer paso: Se introduce el nombre que se asigna al proyecto y se indica en


la carpeta en que se guardará (Fig. P1.9). Se recomienda crear una carpeta para
guardar los ejercicios con el PIC12F508 (F:\12F508ASM). Es importante no
crear una carpeta en Mis Documentos o lugares del disco donde la ruta tenga
muchos caracteres, ya que el compilador dará un error si la ruta del fichero es
demasiado larga, de ahí la recomendación de hacerlo en una carpeta directamen-
te de una unidad.

Figura P1.9. Se asigna nombre al proyecto (EJEMPLO_0) y se indica en la carpeta que se guardará
(F:\ASM\EJEMPLO_0).

— Cuarto paso: Se pasa a asignar al proyecto el programa fuente, que se supone


que ya está editado y archivado en la carpeta F:\Programas12F508, y dentro de
ella, es Programa_0.ASM el que se selecciona y con el botón Add se aplica al
PROYECTO_0 (Fig. P1.10).

Figura P1.10. Se asigna al proyecto en desarrollo el programa fuente EJEMPLO_0.ASM.


114 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Al pulsar la fase «Siguiente», aparece un resumen del proyecto construido, y para


acabar, basta presionar la opción «Finalizar» (Fig. P1.11).

Figura P1.11. Resumen de las principales características del proyecto creado.

En la pantalla principal del MPLAB IDE hay una ventana que recoge los ficheros
del proyecto creado (Fig. P1.12).

Figura P1.12. Ventana que muestra los ficheros del proyecto creado.

P1.2.2. Análisis del programa fuente


El proyecto creado (PROYECTO_0) utiliza como programa fuente en Ensamblador a
Ejem_0.ASM, que ya estaba confeccionado antes del comienzo del proyecto. Lo puede
obtener en el CD del libro en D:\12F508ASM\EJEM_0.ASM. Pulsando dos veces sobre
Ejem_0.ASM aparece en la ventana principal de PROYECTO_0.mcp el contenido de
dicho programa (Fig. P1.13).
SIMULANDO LOS PRIMEROS PROGRAMAS CON EL MPLAB Y EL MPLAB SIM 115

Figura P1.13. Ventana en la que aparece el programa fuente en Ensamblador.

El programa bajo análisis dispone de comentarios aclaratorios en la mayoría de las


instrucciones que facilitan la comprensión de su estructura y objetivos.
En la primera línea, se usa la directiva de Ensamblador List, que indica el modelo
de microcontrolador utilizado y que en este caso es el PIC12F508. En la segunda línea,
la directiva Include permite incluir en el programa el fichero P12F508, que contiene la
declaración de los nombres de los registros, sus bits y las etiquetas que se usan para el
modelo de PIC empleado. Con Org 0x00, la primera instrucción del programa se coloca
en la dirección hexadecimal 00, destinada al Vector de Reset.
La instrucción Movlw b’00000001’ carga en el registro W el valor binario 00000001.
La siguiente instrucción, Nop, no hace nada, sólo ocupa una posición de la memoria y
tarda en ejecutarse un ciclo de instrucción. Con Clrw se pone a 0 el registro W. La direc-
tiva final End indica la terminación del programa fuente.
En resumen, este programa comienza poniendo a 1 el contenido del registro W y
luego lo pasa a 0. Es un programa muy sencillo y con sólo fines didácticos.

P1.2.3. Desarrollando el proyecto


Para que el microcontrolador pueda ejecutar el programa fuente (.ASM) es necesario
traducir o «ensamblar» el mismo para convertirlo en programa en código máquina
(*.HEX). Tras el ensamblado, además del fichero ejecutable .HEX, hay otro con los
errores (*.ERR), otro con el listado (*.LIST), etc.
116 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P1.14. Al final de la operación de ensamblado, producida por la opción Project/Build All, aparece
la frase «BUILD SUCCEEDED» si todo ha ido bien.

Para realizar el ensamblado, se recurre en el MPLAB IDE, dentro del menú Project,
a la opción Build All. A continuación, se proporciona información sobre cómo se está
desarrollando la traducción, y al final, se genera una ventana con el resultado de la mis-
ma. En dicha ventana se informa del desarrollo de la operación de ensamblaje, y si todo
ha ido bien, finaliza con la frase BUILD SUCCEEDED. Si ha ocurrido algún fallo en la
traducción, la frase final es BUILD FAILED. En este caso, hay que eliminar los errores
en el programa fuente, que se indican en la ventana, y repetir la operación de ensamblaje
(Fig. P1.14).

P1.3. EL SIMULADOR MPLAB SIM


El PROGRAMA_0.ASM es de carácter didáctico y no interesa grabarlo en la memoria
del PIC12F508 para comprobar su comportamiento. En estas condiciones, basta con
simular la ejecución del programa y analizar los resultados que produce. Para ello, se uti-
liza el simulador software MPSIM, que se halla integrado en el entorno MPLAB IDE.
Se elige la opción Debugger → Select Tool → 3 MPLAB SIM (Fig. P1.15).
Al seleccionar el MPLAB SIM, aparece en la ventana principal un recuadro con siete
iconos que proporcionan mucha flexibilidad en la simulación del programa (Fig. P1.16).
La opción Run ejecuta el programa, que no se detendrá hasta que bien se acabe el
programa, el simulador llegue a un punto de ruptura o bien se utilice la opción Halt, que
detiene la ejecución del programa.

Figura P1.15. Selección del simulador MPLAB SIM, integrado en el MPLAB.


SIMULANDO LOS PRIMEROS PROGRAMAS CON EL MPLAB Y EL MPLAB SIM 117

Figura P1.16. Opciones del simulador MPLAB SIM.

La opción Animate también ejecuta el programa, pero de forma animada. Es decir,


ejecuta más lentamente el programa y resaltando en pantalla cada instrucción que está
ejecutándose para seguir visualmente dicha ejecución.
La opción Step Into ejecuta una sola instrucción (STEP INTO); la opción Step Over
ejecuta hasta la siguiente instrucción de mismo nivel sin introducirse en subrutinas, etc.
(STEP OVER), y la opción Step Out ejecuta el programa hasta salir de la rutina en
ejecución (STEP OUR).
Por último, la opción Reset reinicia la ejecución del programa.
Para comprobar el contenido de los registros del procesador y las posiciones de la
memoria, usando la pestaña View se eligen los elementos que intervienen en el programa
y les afectan las instrucciones. Así, en Programa_0.ASM, el elemento más interesante
y usado es el registro W. También variará su valor el PCL cuando se vayan ejecutando
las instrucciones.

P1.3.1. Configurando el procesador


Antes de proceder a la simulación del programa hay que determinar el valor de los bits
de la Palabra de Configuración seleccionándolos con la opción Configure/Configuration
Bits. Se selecciona el oscilador interno INTOSC, no se usa el Perro Guardián (así que el
WDT se pone en off ), no se habilita el Código de Protección ante lectura de la memoria
y se utiliza el Master Clear Reset interno.

P1.4. COMPORTAMIENTO DEL PROGRAMA


CON EL SIMULADOR
A continuación, se describe cómo observar el comportamiento del programa a través del
simulador. Una vez seleccionada la herramienta MPLAB SIM a través de la opción De-
bugger → Select Tool → 3 MPLAB SIM, se procede a ejecutar paso a paso el programa
y observar su funcionamiento.
Mediante la opción Debugger → Step Into o bien mediante la tecla de función F7
equivalente, el simulador ejecuta una instrucción del programa. En este caso, el simu-
lador ejecutará la primera instrucción del programa, es decir, MOVLW b’00000001’.
Si se desea observar si el resultado de esta instrucción es el deseado, es conveniente
añadir en la ventana de inspección el registro W. Esta tarea se realiza mediante la opción
View-Watch y en esta ventana seleccionar WREG y pulsar el botón ADD SFR. Así, se
observará cómo el valor de WREG es 0001, resultado de la MOVLW ejecutada.
118 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Al ejecutar la siguiente instrucción mediante F7, la instrucción NOP se puede ob-


servar en la misma pantalla cómo WREG no cambia su valor debido a que esta instruc-
ción no altera ningún dato.
Por último, la instrucción CLRW borra el regitro WREG, pero no puede observarse
en la pantalla de inspección, ya que al tratarse de la última instrucción del programa, éste
se reinicia automáticamente y no da tiempo a observar dicho valor. Para poder observar
la ejecución de esta instrucción sería necesario añadir una nueva instrucción NOP antes
de la directiva END.

P1.5. OTRO PROYECTO DE ENTRENAMIENTO


Se propone confeccionar otro proyecto, el EJEMPLO_01, que utilice un programa fuen-
te un poco más complejo que el anterior, pero que al no utilizar periféricos sus resultados
puedan comprobarse con el simulador MPLAB SIM.
Este proyecto consiste en conseguir en una posición de la memoria (0x09) números
impares de forma indefinida siguiendo la secuencia 0x01, 0x03, 0x05, …, 0xFF y que
dicha secuencia vuelva a empezar desde 0x01 al alcanzar el valor máximo 0xFF.
Para ello será necesario conocer tres instrucciones nuevas y una directiva. Esas tres
instrucciones son las siguientes:

MOVWF F ;Mueve el contenido de W a la posición F


ADDWF F, d ;Suma W al contenido de la dirección F.
;Si d = 0, deja el resultado en W
;Si d = 1, deja el resultado en F
GOTO k ;Salto incondicional a la instrucción
;referenciada por la etiqueta k

La directiva EQU permite asignar valores a etiquetas. Así, la posición 0x09 se puede
referenciar mediante la etiqueta IMPAR haciendo uso de la siguiente directiva:

IMPAR EQU 0x09

La solución propuesta para el EJEMPLO_01 se detalla a continuación:

; EJEMPLO 01
LIST P=12F508 ;Tipo de procesador
INCLUDE “P12F508.INC” ;Definición registros internos
IMPAR EQU 0x09 ;Def. de par etiqueta valor
ORG 0x00 ;Inicio programa
MOVLW b’00000001’ ;Mueve 1 a la posición IMPAR
MOVWF IMPAR
MOVLW b’00000010’ ;Mueve 2 a WREG
BUCLE: ADDWF IMPAR, 1 ;IMPAR + W = IMPAR
NOP ;No hace nada
GOTO BUCLE ;Repite el bucle
END ;Fin pograma
SIMULANDO LOS PRIMEROS PROGRAMAS CON EL MPLAB Y EL MPLAB SIM 119

El programa comienza moviendo el valor 1 a la posición de memoria IMPAR. Para


conseguir números impares, mueve 2 a WREG. El programa entra en un bucle en el que
se va sumando el contenido de la posición IMPAR con el registro WREG, dejando el
resultado en la posición IMPAR.
La instrucción GOTO BUCLE hace que esta suma se repita de forma indefinida,
generando así los números impares deseados de forma constante.

Trabajo personal

Confeccione un programa que genere números pares de forma descendente, desde 0xFE
hasta 0x00, y así sucesivamente.

P1.6. PROGRAMADO EN C
En los diseños con microcontrolador es muy habitual y cómodo usar el lenguaje C ade-
más de Ensamblador. Hay ocasiones que interesa mezclar trozos de ambos lenguajes.
A un coste muy asequible y con características profesionales, Ingeniería de Micro-
sistemas Programados comercializa el compilador de C, de la firma CCS, con la que
vamos a resolver los programas de C en este libro.
a
Herramientas para la grabación,
implementación y depuración: 2.
PIC School y WinPic800 APLICACIÓN

P2.1. NUESTRO BANCO DE TRABAJO

En la aplicación anterior se aprendió a:

1.o Editar programas fuente en Ensamblador y en C.


2.o Ensamblar o compilar los programas fuente para convertirlos en programas ejecutables.
3.o Simular el comportamiento de los programas ejecutables mediante el simulador soft-
ware MPLAB SIM.

Los grandes inconvenientes de la simulación software son dos, y el más importante


consiste en que la ejecución de las instrucciones no se realiza en tiempo real. Tampoco
se puede comprobar el funcionamiento de los periféricos y dispositivos externos conec-
tados al microcontrolador.
Para comprobar el funcionamiento real, se construirá un prototipo físico con los
mismos elementos que el sistema definitivo, se grabará el programa de aplicación en la
memoria del microcontrolador y, finalmente, se ejecutará el programa y se analizarán
los resultados del mismo. En una palabra, hay que construir un prototipo sobre el que
correrá el programa específico desarrollado (Fig. P2.1).
Para montar con rapidez y facilidad un prototipo basado en un microcontrolador
PIC y disponer de los recursos típicos que frecuentemente se utilizan en las aplicacio-
nes, se ha seleccionado una herramienta robusta, sencilla de manejar, muy flexible y
económica llamada PIC School que ha diseñado Ingeniería de Microsistemas Progra-
mados (www.microcontroladores.com). Con la PIC School se pueden diseñar sistemas
con todas las gamas de microcontroladores PIC encapsulados hasta con cuarenta patitas:
PIC12F, PIC16F, PIC18F, PIC24, dsPIC y otras.
La herramienta PIC School está apoyada por una línea de módulos complementarios
que se orientan a formar y experimentar en gamas o aspectos concretos como el módulo
PIC12F508, dedicado a este modelo de microcontrolador y que será el que usemos en
este libro, el módulo dsPIC, el módulo PIC16F87X, el módulo PIC18F, etc. Este equipo
contiene un grabador de PIC, fuentes de alimentación, varios zócalos para los procesa-

121
122 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P2.1. En el prototipo físico, el microcontrolador ejecuta el programa que tiene grabado y se
comprueba el comportamiento de los periféricos externos.

dores, numerosos periféricos y recursos que pueden conectarse a cualquier patita del
microcontrolador seleccionado y una sección de montaje sin soldadura para añadir otros
elementos que requiera el proyecto (Fig. P2.2).

Figura P2.2. Fotografía de PIC School.


HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 123

P2.2. EL FABULOSO PIC SCHOOL

Las principales características del PIC School son las siguientes:

• Permite trabajar directamente con microcontroladores PIC de 8 bits de las gamas


baja, media y alta con encapsulados de 8, 18, 28 y 40 contactos, pudiendo incluso,
con ayuda de un adaptador, dar soporte a los dispositivos de 16 bits y a los potentes
dsPIC. Además, dispone de un oscilador de cuarzo que permite trabajar a diferentes
frecuencias, permitiendo también utilizar el oscilador RC incluido en algunos micro-
controladores.
• Dispone de un amplio y representativo número de periféricos con la ventaja que ninguno
de éstos se encuentra conectado de forma predeterminada a las líneas de E/S del mi-
crocontrolador. Es el propio usuario quien, mediante un sencillo cableado sin soldadura,
conecta y asocia los distintos periféricos a esas líneas de E/S según lo requiera la apli-
cación. Esto permite tener un contacto más directo con el hardware y un mayor control
del mismo. Además, dispone de una amplia superficie de board en la cual se pueden
conectar sin soldadura los periféricos necesarios para un proyecto que no estén incluidos
en el entrenador.
• Existe una serie de módulos de prácticas opcionales en los que se van tratando di-
ferentes temas relacionados con los microcontroladores: comunicaciones, bluetooth,
USB, CAN, RF, control de motores, periféricos avanzados y un largo etcétera. En esos
módulos también se describen aplicaciones que permiten conocer las características
de los PIC desde la sencilla familia 12FXXX hasta los potentes 18FXXXX. Cada mó-
dulo consta de una colección de prácticas y todos los componentes necesarios para
implementarlas.
• El PIC School tiene tres modos de operación diferentes que se seleccionan fácil-
mente mediante un conmutador. El modo RUN se emplea cuando el dispositivo está
grabado con el programa de aplicación a ejecutar. Todas las líneas de E/S están
disponibles para el control de periféricos. El modo PC se emplea durante los ciclos
de grabación del dispositivo. La grabación se realiza mediante el canal serie de un
PC dotado del software de grabación correspondiente (WinPic800, IcProg, etc.).
Se suministra el cable de conexión con el PC. Finalmente, el modo ICSP permite
conectar el laboratorio PIC School con otros grabadores externos dotados de las
señales ICSP o bien con depuradores en circuito, como el ICD2 de Microchip. De
esta forma, es posible la emulación/depuración/grabación del dispositivo contenido
en el laboratorio

A la hora de seleccionar los periféricos incluidos en este potente entrenador, cabe


destacar que se han elegido los más empleados en las siguientes categorías.

Periféricos de entrada

• Dos potenciómetros capaces de simular cualquier entrada analógica.

• Cuatro interruptores deslizantes y cuatro pulsadores para soportar las entradas digi-
tales.
124 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

• Un generador lógico capaz de generar ondas simétricas cuadradas de 1 Hz, 10 Hz,


100 Hz y 1 KHz indicado especialmente para aquellas aplicaciones que necesitan contro-
lar tiempos o para aplicaciones en las que se emplean los módulos de captura y compara-
ción (CCP) incluidos en algunos microcontroladores.
• Un teclado matricial de 4 × 4 teclas considerado el dispositivo de entrada por excelencia
en aplicaciones microelectrónicas.

Periféricos de salida

• Ocho diodos led que permiten monitorizar el estado de las líneas a las que se conectan.
• Un driver de cuatro canales capaz de proporcionar salidas de alta corriente permitiendo
la conexión de motores, lámparas incandescentes, relés, etc.
• Una pantalla LCD de 2 × 16 caracteres que permite la representación de mensajes me-
diante letras, números o símbolos especiales.

Periféricos de comunicación

• Interfaz serie RS232, que permite adaptar los niveles lógicos del microcontrolador a
niveles RS232.
• Interfaz CAN, que convierte las señales del microcontrolador según las especificaciones
de este bus tan utilizado en redes sensoriales.
• Conector RJ11, que permite la conexión de dispositivos I2C, iButton, RS485, etc.
• Conector USB, que permite la conexión con cualquier dispositivo estándar existente en
el mercado.

De esta forma, gracias a esta nueva herramienta, se solventan las cuatro grandes
limitaciones existentes en el resto de entrenadores comerciales para microcontro-
ladores:

1.a Es un entrenador válido para todas las gamas de microcontroladores PIC, per-
mitiendo al usuario seleccionar siempre aquel dispositivo que más se ajuste a
las necesidades específicas de cada proyecto. Pudiendo, además, seleccionar la
frecuencia y tipo de reloj más adecuados en cada caso.
2.a Dispone de los periféricos más universales utilizados en la microelectrónica,
permitiendo que la conexión entre éstos y el microcontrolador se realice a
medida de cada experimento. Además, gracias a la board que posee, cualquier
dispositivo adicional se puede incorporar con facilidad. De esta forma, se puede
obtener el primer prototipo funcional de un proyecto en el mínimo tiempo y sin
tener que realizar ni una soldadura.
3.a Con sus tres modos de funcionamiento, el PIC School se adapta a todas las eta-
pas que conlleva el desarrollo de una aplicación microelectrónica, permitiendo
la emulación, prueba y grabación de microcontroladores PIC cambiando sólo la
posición de un conmutador. Así se evita la utilización de varios dispositivos que
realicen cada una de esas tareas.
HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 125

Figura P2.3. Fuente de alimentación.

P2.3. ARQUITECTURA DE PIC SCHOOL


La arquitectura de la tarjeta de entrenamiento universal PIC School se divide en varias
secciones, que se presentan de forma pormenorizada.

P2.3.1. Fuente de alimentación


Encargada de obtener la tensión general de +5 Vcc con la que se alimenta el laboratorio
PIC School, todos los periféricos de la misma y el procesador empleado.
El esquema eléctrico de la fuente se muestra en la Figura P2.4. A través del conector
CN1, se aplica una tensión de 9 a 15 VDC procedente de un alimentador estándar con
el positivo al centro. El interruptor SW3 conecta el sistema. El diodo D1 evita la pola-
rización inversa y con ello los daños que se pudieran ocasionar al equipo. El regulador

Figura P2.4. Esquema eléctrico de la fuente de alimentación.


126 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

U1 estabiliza la tensión a +5 Vcc con 1 A máximo. Dicha tensión, junto con GND, están
disponibles en el conector AP1 y AP2, respectivamente, para alimentar a los circuitos y
prototipos del usuario. En el conector AP3 está disponible también la tensión de entrada
sin estabilizar +Vin para aquellos circuitos que la requieran. El diodo led D3 indica la
presencia de tensión +5 Vcc.

P2.3.2. El oscilador
Se encarga de generar la frecuencia principal de trabajo del microcontrolador. Su esque-
ma se muestra en la Figura P2.5. Está formado por el dispositivo integrado X1 y la red
RC, formada por R20 y C1. Mediante el jumper JP2 se obtiene la señal de reloj CLKIN.
Cerrando los contactos 1-2, dicha señal la proporciona el oscilador X1. Cerrando 2-3, la
señal se obtiene de la red RC. El valor de estos componentes determina la frecuencia de
la misma (consultar parámetros proporcionados por Microchip).

Figura P2.5. Circuito oscilador principal.

El dispositivo X1 contiene en su interior un oscilador preciso controlado por cuarzo


y todo ello en una cápsula metálica en formato DIP8. Este oscilador, también llamado
Canned oscillator, se puede adquirir en diferentes frecuencias según las necesidades.
Basta simplemente cambiar uno por otro para que la aplicación se ejecute a más o menos
velocidad.

P2.3.3. Los microcontroladores

Es la sección más importante del entrenador PIC School y donde se instala el dispositivo
PIC con el que se va a trabajar. Básicamente, consta de cuatro zócalos donde se pueden
insertar los dispositivos de 8, 18, 28 y 40 patillas, tal y como se muestra en la fotografía
de la Figura P2.6.
HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 127

Figura P2.6. Zócalos de inserción de los microcontroladores.

P2.3.4. Entradas analógicas


Están formadas por dos potenciómetros, tal y como se muestra en la fotografía de la
Figura P2.7.

Figura P2.7. Entradas analógicas.

El esquema eléctrico de las entradas analógicas se muestra en la Figura P2.8. Las


líneas de los potenciómetros son directamente accesibles desde el bloque de conexión
AP16 correspondiente y se les puede conectar cualquier tipo de circuito eléctrico ana-
lógico.
128 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P2.8. Esquema eléctrico de las entradas analógicas.

P2.3.5. Entradas digitales

Se muestran en la fotografía de la Figura P2.9 y consta de cuatro interruptores deslizan-


tes y otros tantos pulsadores.

Figura P2.9. Entradas digitales del entrenador PIC School.

La Figura P2.10. muestra el esquema eléctrico de estas ocho entradas cuyas señales
están disponibles en el bloque de conexiones AP18. Las señales E0-E3 proceden de los
cuatro interruptores deslizantes. Cuando éstos están abiertos (hacia arriba), proporcio-
HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 129

nan nivel lógico «1» gracias a las resistencias pull-up de RP2. Cuando cualquiera de
ellos se cierra (hacia abajo), se conecta directamente con la señal GND, proporcionando
nivel «0».
Por otra parte, los cuatro pulsadores en situación de reposo permanecen abiertos,
generando nivel lógico «1» gracias a las resistencias pull-up contenidas en RP3. Cuando
se accionan, se cierra el circuito con GND y se genera nivel «0».

Figura P2.10. Esquema eléctrico de las entradas digitales.

P2.3.6. El generador lógico


Se muestra en la Figura P2.11 y está basado en el dispositivo SYM10AA. Es capaz de
generar ondas cuadradas simétricas a frecuencias de 1 Hz, 10 Hz, 100 Hz y 1 KHz. Está
especialmente indicado para aplicaciones de control de tiempos y también para evaluar y
ensayar con los módulos de captura y comparación (CCP) contenidos en ciertos modelos
de dispositivos PIC.
130 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P2.11. Generador lógico de señales.

El esquema eléctrico de dicho generador es el que proporciona su propio fabricante


y se muestra en la Figura P2.12. Puede servir como base para múltiples aplicaciones.
La señal de salida se obtiene mediante el bloque de conexiones AP8. Por defecto la
frecuencia de salida es siempre de 1 Hz. Mediante el pulsador SW2 se va seleccionando
secuencialmente la frecuencia a 10 Hz, 100 Hz, 1 KHz y vuelta a empezar con 1 Hz. Los
leds D5-D8 monitorizan la frecuencia de salida en todo momento.

Figura P2.12. Esquema del generador lógico.

P2.3.7. El teclado
Como se aprecia en la Figura P2.13, el laboratorio PIC School va provisto de un teclado
matricial de 4 × 4 teclas. Se trata del periférico de entrada por excelencia que va a per-
mitir introducir todo tipo de datos para su posterior procesamiento.
HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 131

Figura P2.13. El teclado.

El control del teclado supone el tener que aprender y utilizar una serie de técnicas
y conceptos que se emplean en las más diversas aplicaciones. Manejar conceptos tales
como barrido del teclado, tecla pulsada, rebotes, interrupción con cada pulsación,
«wake up» con cada pulsación, etc., darán al usuario la posibilidad de acometer ambi-
ciosos proyectos de carácter profesional.
Un dato relevante a tener en cuenta es que a pesar de disponer de dieciséis teclas, tan
sólo son necesarias ocho líneas de E/S del microcontrolador para su control. Ello es debido
a su distribución matricial. La Figura P2.14 muestra el teclado asociado al bloque de co-
nexiones AP21. En dicha figura también se puede apreciar la relación entre fila-columna y
la tecla asociada. Así, pues, la tecla 1 está asociada con la fila 0 (F0) y la columna 0 (C0).
En el laboratorio PIC School, las ocho líneas del teclado se pueden conectar a
cualquier puerta del PIC, pero se sugiere conectarlo a las líneas de la Puerta B (como
se muestra en la Figura P2.14). Esto se debe a que la mencionada puerta tiene, en la ma-
yoría de los dispositivos PIC, un par de características muy interesantes para el control
de un teclado: resistencias pull-up internas para las líneas de entrada y posibilidad de
interrupción cuando cualquiera de esas líneas de entrada cambie de estado.

Figura P2.14. Esquema eléctrico del teclado.


132 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Las cuatro filas F0-F3 de la Figura P2.14 se conectan a RB4-RB7 y las cuatro co-
lumnas C0-C3 se conectan con las líneas RB0-RB3. La intersección fila-columna da
lugar a seleccionar una tecla en concreto. Es decir, si se pulsa por ejemplo la tecla 4,
supone unir eléctricamente la fila F1 con la columna C0, que es tanto como decir que las
líneas RB0 y RB5 del PIC se han unido.
La rutina software encargada de explorar el teclado tiene que determinar qué tecla se
ha pulsado. Para ello, por ejemplo, se configura las líneas RB0-RB3 (columnas) como
salidas y RB4-RB7 (filas) como entradas. Secuencialmente, se van activando cada una
de las columnas al tiempo que se lee el estado de las filas. Cuando se detecta que una
fila está activa es porque se pulsó una tecla. Basta conocer qué columna se activó en
ese momento para sacar la relación fila-columna que define a dicha tecla. Esta tarea,
conocida como barrido de teclado, ha de repetirse de forma constante y periódica. De
esta manera, y a la velocidad de trabajo del PIC, será posible detectar una pulsación en
cualquier momento.
Haciendo uso de algunas de las prestaciones que ofrecen los dispositivos PIC en la
Puerta B, es posible desarrollar rutinas más sofisticadas y eficaces. Efectivamente, pro-
gramando los registros oportunos de un PIC, podemos hacer que las entradas RB4-RB7
(filas) se conecten a las resistencias pull-up internas que hacen que esas líneas, en esta-
do de reposo, estén a nivel 1. Por otra parte, también podemos habilitar la interrupción
por cambio de estado de cualquiera de las entradas de la Puerta B. En este momento, las
salidas RB0-RB3 (columnas) se ponen a nivel 0, y esta situación de reposo se mantiene
mientras no se pulse ninguna tecla. El microcontrolador puede dedicarse a otras tareas
o quedarse en standby, reduciendo el consumo hasta que ocurra un suceso como puede
ser la pulsación de cualquier tecla. Efectivamente, puesto que RB0-RB3 (columnas)
están a 0 y RB4-RB7 (filas) están a 1 gracias a las resistencias pull-up internas, cuando
se pulse cualquier tecla se produce una interrupción por cambio de estado en cualquiera
de las líneas RB4-RB7 (filas). Esa interrupción provoca la inmediata atención del mi-
crocontrolador, que pasa a ejecutar la rutina que se encargará de averiguar qué tecla se
pulsó.

P2.3.8. Salidas digitales


Están formadas por ocho diodos led (S0-S7) que sirven para monitorizar el nivel lógico
de las líneas a las que están conectados.

Figura P2.15. Salidas digitales.


HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 133

Figura P2.16. Esquema eléctrico de las salidas digitales.

En el laboratorio PIC School, los leds son accesibles mediante el conector AP17,
tal y como se muestra en el esquema de la Figura P2.16, y se pueden conectar indivi-
dualmente a cualquiera de las líneas del microcontrolador. Estas líneas son capaces de
suministrar 25 mA, por lo que no es necesario ningún circuito adicional de amplificación
excepto las resistencias de absorción contenidas en el pack RP1.
Un nivel lógico 1 por cualquiera de esas líneas provoca el encendido del led correspon-
diente. Un nivel 0 lo apaga. Es una forma muy simple y económica de reflejar el estado binario
de las líneas de salida, donde cada led simula el estado de la carga que se desea controlar.

Figura P2.17. Salidas digitales de alta corriente.


134 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

P2.3.9. Salidas digitales de alta corriente


El laboratorio PIC School dispone de un driver de cuatro canales formado por el dispo-
sitivo L293D y capaz de proporcionar salidas de alta corriente.
En la Figura P2.18 se puede apreciar el esquema eléctrico. El dispositivo integrado
L293D dispone de cuatro canales amplificadores o drivers capaces de proporcionar sali-
das de hasta 0,6 A a 36 V cada uno a partir de señales TTL de baja corriente.
Mediante el conector AP6, se conectan las señales E1-E4 a amplificar y que proce-
den de sendas salidas del microcontrolador. El conector CN7 está formado por un con-
junto de bornas o clemas donde se obtienen las salidas S1-S4 debidamente amplificadas
y se realizan las conexiones con las cargas a controlar.
Mediante el jumper JP8 se selecciona la tensión de salida para las cargas. En la
posición 1-2 (por defecto) dicha tensión es de +5 Vcc. En la posición 2-3, la tensión que
alimenta a las cargas se aplica externamente a través de la borna +VM.
Mediante estas salidas de alta corriente, el laboratorio PIC School puede controlar
cargas de consumo elevado, como pueden ser lámparas incandescentes, relés, motores
DC, motores paso a paso, etc.
Cabe indicar que el dispositivo L293D integra en su interior sendos diodos para la
absorción de corrientes inversas provocadas por cargas inductivas.

Figura P2.18. Esquema de las salidas digitales de alta corriente.


HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 135

P2.3.10. Interfaz serie RS-232


Su ubicación dentro del laboratorio se muestra en la Figura P2.19. Consiste en el clásico in-
terfaz serie que permite adaptar los niveles lógicos del microcontrolador a niveles RS-232.
Según el esquema eléctrico mostrado en la Figura P2.20, la interfaz está formada por
el popular adaptador de niveles MAX-232. Mediante el conector AP5, se dispone de las
señales de transmisión y recepción (TxD y RxD), así como las de control de flujo CTS y

Figura P2.19. Interfaz serie RS-232.

RTS. Estas señales proceden del microcontrolador. El conector CN5 es un conector DB9
hembra estándar que permite realizar la conexión con el periférico serie. Mediante un led
bicolor (D17/D18) se monitoriza todo tipo de transmisión y/o recepción.
Esta interfaz permite realizar todo tipo de comunicaciones serie entre el labo-
ratorio PIC School y cualquier otro equipo mediante el protocolo estándar RS-232.
La velocidad de transferencia irá en función del tipo de microcontrolador empleado
y su velocidad de trabajo.

Figura P2.20. Esquema eléctrico de la interfaz serie RS-232.


136 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Se recuerda que algunos dispositivos PIC incorporan en su interior una UART com-
pleta que se encarga de realizar la mayor parte de los procedimientos propios de la co-
municación según los protocolos tanto RS-232 como RS-485. En este último caso, basta
con montar el sencillo circuito de adaptación correspondiente sobre el módulo board de
montaje sin soldadura con que cuenta PIC School.

P2.3.11. Interfaz bus CAN


Está compuesta por el dispositivo adaptador MCP2551, que convierte las señales lógicas
según las especificaciones del bus CAN.

Figura P2.21. Interfaz bus CAN.

El bus CAN permite crear una red con una transferencia de datos muy robusta y
fiable entre el microcontrolador principal (host) y todo tipo de dispositivos o nodos CAN
conectados entre sí mediante dos hilos. Este protocolo es muy empleado por la industria
del automóvil, y algunos dispositivos PIC incorporan mediante hardware interno todos
los mecanismos necesarios para su implementación.

Figura P2.22. Esquema del interfaz CAN.


HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 137

En la Figura P2.22 se muestra el esquema eléctrico de esta interfaz incorporada en


el laboratorio PIC School. Por el conector AP10 se proporcionan, procedentes del mi-
crocontrolador, las señales RxCAN y TxCAN, que van a parar al circuito de adaptación
MCP2551. Las señales de salida CANH y CANL se obtienen por el conector CN6 (DB9
macho) y de aquí van a parar a los diferentes nodos de la red. El circuito de adaptación
es capaz de conectar con hasta 112 nodos. Mediante el jumper JP1 se habilita o no la
resistencia terminal R2, según qué lugar ocupe el laboratorio en la red (por defecto ha-
bilitada).

P2.3.12. Pantalla LCD


Se trata de uno de los periféricos más versátiles e interesantes que dispone el laboratorio
PIC School. Se muestra en la Figura P2.23 y es capaz de visualizar dos líneas de dieci-
séis caracteres alfanuméricos cada una.

Figura P2.23. Pantalla LCD.

Este potente periférico de salida va a permitir representar cualquier tipo de mensaje


compuesto de letras, números y símbolos, produciendo, además, diferentes efectos de
visualización, como desplazamientos a izquierda y derecha, parpadeos, scrolls, etc.
La transferencia de información entre la pantalla LCD y el microcontrolador se
realiza en paralelo en grupos de 4 u 8 bits de datos y se conecta con las líneas de E/S
mediante el conector AP20. El esquema eléctrico se muestra en la Figura P2.24.
Existe, además, otro conector, el AP9, donde se conectan las señales que controlan el
flujo y tipo de información que se transfiere. Con la señal RS se determina si la pantalla
recibe el código ASCII del carácter a visualizar (nivel 1) o bien un código de comando
(nivel 0). Mediante la señal RW, el microcontrolador informa a la pantalla LCD si se va a
leer o escribir sobre la misma. Finalmente, con la señal E, se habilita o no a esa pantalla.
Cuando esta señal vale 0, la pantalla queda desconectada, las líneas de datos quedan
en alta impedancia. Cuando vale 1, la pantalla queda habilitada para recibir o mandar
datos.
138 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P2.24. Esquema eléctrico del LCD.

La resistencia R19 permite ajustar el contraste del LCD. Con el valor de 4K7 se
consigue un contraste medio aceptable. Su valor se puede modificar.

P2.3.13. Conectores para las interfaces RJ11 y USB


Son simples conectores de propósito general y que se muestran en la fotografía de la
Figura P2.25.

Figura P2.25. Conectores USB y RJ11.


HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 139

P2.3.14. Sección de grabación


Se muestra en la fotografía de la Figura P2.26 y se encarga, mediante el software opor-
tuno, de realizar los ciclos de lectura/grabación del dispositivo PIC contenido en el
laboratorio.

Figura P2.26. Circuito grabador de la placa PIC School.

El esquema por bloques de la Figura P2.27 trata de sintetizar el funcionamiento del


circuito de grabación que dispone el laboratorio PIC School.
Todos los dispositivos PIC disponen de tres señales para la lectura/grabación de la
memoria de programa, la memoria EEPROM para datos y la memoria de configuración.
La señal PICDATA permite transferir los datos de forma serie y síncrona entre el PIC y el
hardware de grabación, la señal PICCLK transporta la señal de reloj para el sincronismo
de los datos y la señal PICMCLR que inicia los ciclos de lectura/grabación y aplica la
tensión Vpp necesaria. Estas tres señales son, además, compartidas y empleadas como
líneas de E/S de propósito general una vez que el PIC ha sido grabado.
Estas tres señales se conectan con tres fuentes diferentes según el modo de opera-
ción seleccionado mediante el conmutador SW4.
El modo RUN se emplea cuando el dispositivo está grabado. Las tres señales del
PIC anteriormente mencionadas se consideran líneas de E/S de propósito general y están
disponibles a través de los bloques de conexión correspondientes para ser utilizadas por
los periféricos de la aplicación.
En el modo ICSP, el laboratorio queda configurado para que el PIC actual en él in-
sertado se pueda leer/grabar a través de las señales que se aplican mediante el conector
RJ11 (ICSP: In Circuit Serial Programming). Estas señales, a su vez, las debe proporcio-
nar un grabador externo dotado de su correspondiente software de grabación. Se puede
emplear el módulo ICD2 de Microchip junto con el entorno integrado de desarrollo
MPLAB, que se puede obtener de forma gratuita desde www.microchip.com. El módulo
ICD2, además de grabar dispositivos, es capaz de realizar depuración en circuito en
tiempo real con ciertos modelos de dispositivos PIC.
140 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P2.27. Esquema por bloques del circuito de grabación.

En el modo PC, la lectura/grabación del PIC se realiza a través de las señales del canal
serie de un PC dotado del correspondiente software de grabación. Un diodo led, el Vpp
ON, indica transferencia de datos entre el PC y el laboratorio. Entre los múltiples tipos
de software existentes, nosotros hemos elegido el WinPic800 y el IcProg, con los que
hemos obtenido excelentes resultados. Ambos programas se pueden descargar y actuali-
zar de forma gratuita en las direcciones http://perso.wanadoo.es/siscobf/winpic800.htm
y en www.ic-prog.com.
Se reitera una vez más que, aunque un software de grabación determinado grabe
múltiples dispositivos y de diferentes familias, es necesario que también haya compa-
tibilidad a nivel hardware. Esta compatibilidad viene dada fundamentalmente por la
distribución de patillas del dispositivo en cuestión, tal y como se explicó en un apartado
anterior. En el laboratorio PIC School se admiten todos los dispositivos PIC de 8, 18,
28 y 40 patillas distribuidas como se menciona en dicho apartado y que también sean
soportados por el software de grabación empleado.

P2.4. PROGRAMA DE GRABACIÓN WINPIC800


Se trata de un software de libre distribución desarrollado por Sisco Benach que se
puede descargar desde el sitio http://perso.wanadoo.es/siscobf/winpic800.htm. Es con-
veniente hacerlo de forma periódica con objeto de obtener la última versión disponible.
Se descarga un fichero ZIP que contiene el archivo ejecutable, archivos de configura-
ción, lenguajes, etc. Se aconseja descomprimirlo todo sobre una misma carpeta (por
ejemplo, WinPic800) y crear un acceso directo al ejecutable.
El programa WinPic800 es un proyecto abierto sujeto a constantes ampliaciones
y mejoras que se adapta a diferentes tipos de grabadores. En la opción Acerca de... del
menú de Ayuda hay un enlace directo al foro Todo PIC donde gran cantidad de usua-
rios y entusiastas exponen sus dudas tanto de hardware como de software, comentarios,
posibles mejoras, bugs, soluciones, etc. De esta forma, el programa se encuentra en
permanente evolución.
HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 141

Figura P2.28. Pantalla de trabajo del software WinPic800.

P2.4.1. Instalación
WinPic800 se presenta en un único fichero ZIP. Para la instalación debe descomprimirse
sobre una carpeta (por ejemplo, WinPic800) donde se ubicarán todos los archivos y car-
petas. Basta con hacer un acceso directo al fichero ejecutable para acceder con rapidez a
las diferentes funciones del software.
La Figura P2.28 muestra la pantalla de trabajo del software de grabación WinPic800,
en versión 3.56.c, donde se encuentran las diferentes áreas de trabajo, opciones y menús.

1. Opciones del menú principal


— Archivo: Se seleccionan las distintas opciones que permiten abrir, guardar,
cerrar, etc., los archivos de trabajo que contienen el contenido HEX a grabar en
el dispositivo PIC.
— Edición: Se puede editar y llenar las áreas de memoria del PIC o buffers con
diferentes contenidos.
— Dispositivo: Se seleccionan los distintos comandos a ejecutar sobre el PIC: leer,
borrar, grabar, verificar, etc. La mayor parte de estos comandos se puede ejecutar
mediante los botones de la barra de comandos.
— Configuración: Se selecciona el tipo de hardware grabador que el software debe
controlar. También se seleccionan diferentes opciones de control.
142 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

— Idiomas: Se selecciona el lenguaje empleado por el software WinPic800.


— Ayuda: Se obtiene información adicional del software.

2. Selección de dispositivo
Mediante estas dos persianas se puede seleccionar el tipo de dispositivo a grabar, así
como el modelo.

3. Barra de comandos
Mediante el empleo de estos botones se puede ejecutar de una forma rápida y fácil la
mayor parte de los comandos contenidos en los menús Archivo y Dispositivo: Abrir
fichero, Actualizar, Guardar fichero, Leer PIC, Grabar PIC, Verificar PIC, Borrar PIC,
Configurar hardware y software.

4. Selección del buffer o área de memoria


Mediante estas tres pestañas, el usuario puede conmutar entre cualquiera de las tres áreas
de memoria o buffers de que constan los dispositivos PIC.
— Código: Representa a la memoria OTP/EEPROM/FLASH de programa. Sobre
este buffer se visualiza el contenido de la memoria de programa del PIC recién
leído o bien el contenido que se desea grabar sobre ese PIC y que procede de un
archivo *.HEX recién abierto. El contenido se representa en código hexadecimal
y ASCII y puede ser de 12, 14 o 16 bits por cada posición. El tamaño de este
buffer varía en función del modelo de PIC seleccionado.
— Datos: Representa a la memoria EEPROM de datos. Sobre este buffer se visuali-
za el contenido de la memoria EEPROM de datos del PIC recién leído o bien el
contenido que se desea grabar sobre ese PIC y que procede de un archivo *.HEX
recién abierto. El contenido se representa en código hexadecimal y ASCII con
8 bits. El tamaño de este buffer varía en función del modelo de PIC seleccionado
y puede quedar deshabilitado si dicho modelo no dispone internamente de me-
moria EEPROM para datos.
— Configuración: Representa a la memoria de configuración. Sobre este buffer se
almacena y visualiza el contenido de la memoria de configuración del PIC recién
leído o bien la configuración que se desea grabar sobre ese PIC y que procede
de un archivo *.HEX recién abierto. La representación de este buffer se realiza
en modo binario, de forma que se puedan activar/desactivar individualmente los
distintos bits de las distintas palabras de configuración. El número de bits repre-
sentados varía en función del modelo de PIC.

5. Botones de edición
Este conjunto de botones permite de una forma fácil y rápida realizar tareas propias de
edición del área o buffer de memoria seleccionado: Copiar, Pegar, Cortar, Llenar buffer,
Marcar, Buscar y Buscar siguiente.
HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 143

6. Áreas de memoria o buffers


Ésta es la zona de la pantalla de trabajo donde se visualizan y/o modifican los contenidos del
área de memoria seleccionada. En el área de programa o código la visualización se representa
en formato hexadecimal y ASCII con 12, 14 o 16 bits, según el modelo de PIC seleccionado.
El área de datos se representa siempre en formato de 8 bits en hexadecimal y ASCII y sólo es
visible si el modelo de PIC dispone realmente de memoria EEPROM para los datos.
El contenido de cualquier posición de cualquiera de estas dos áreas se puede modificar a
nivel individual. Basta con hacer clic en la posición deseada y teclear el nuevo valor en hexa-
decimal o en ASCII. También se pueden modificar a nivel de bloque mediante las opciones
de llenado de buffer, donde se pide una dirección inicial, otra final y el valor a almacenar.
Por su parte, el área de configuración representa los contenidos a nivel binario, don-
de es posible activar o desactivar individualmente cada uno de los bits de acuerdo a la
configuración deseada.

7. Botones de verificación
Permite leer el valor ID del dispositivo, visualizar una imagen de cómo se debe insertar
el PIC en el zócalo según el tipo de grabador empleado (si la imagen está disponible),
verificar el hardware del grabador e identificar el modelo de PIC.

P2.4.2. Configuración del «hardware»


Una de las características más notables del software WinPic800 es su flexibilidad a la
hora de poder controlar el hardware de casi cualquier tipo de grabador, como el labora-
torio PIC’School. Ello es posible gracias a su flexible sistema de configuración.
Para grabar la mayor parte de dispositivos PIC se emplean básicamente cinco señales:

VDD Alimentación de +5 V.
GND Tierra o 0 V.
MCLR/Vpp Señal de reset por donde además se aplica la tensión Vpp de grabación.
PGD Señal de E/S por donde, de forma síncrona, se transfieren al PIC los distintos
comandos y datos para su lectura (DataOut) y/o grabación (DataIn).
PGC Señal de reloj para sincronizar los comandos y datos que se aplican al PIC
durante la lectura o grabación.

Estas señales las debe generar el propio software de grabación y aplicarlas al circuito
grabador que contiene el PIC a grabar. El WinPic800 puede generar esas señales a través
del canal paralelo del PC, del canal serie o mediante la interfaz apropiada a través de un
puerto USB. Todo ello se puede configurar mediante la opción Configuración/Hardware
del menú principal. Incluso es posible configurar y determinar la asociación y polarización
entre las señales anteriores de grabación y las señales que ofrecen los canales serie/paralelo
del PC, de forma que se pueda adaptar a la mayoría de grabadores disponibles.
La Figura P2.29 muestra la configuración necesaria para controlar el circuito de
grabación del laboratorio PIC’School con el software WinPic800.
144 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P2.29. Configuración de WinPic800 para adaptarlo al PIC’School.

A la vista de la figura, se puede deducir la configuración necesaria. En primer


lugar, se empleará el canal serie COMx como interfase con el PC. La señal de salida
de datos a grabar (PGD = Data) está asociada con el bit DTR del canal serie. La señal
de entrada de datos leídos (PGD = DataIn) se asocia al bit CTS. La señal síncrona de
reloj (PGC = Clock) queda asociada con el bit RTS. Estas tres señales son empleadas
de forma invertida por el hardware de grabación de PIC’School, por lo que el software
WinPic800 también las debe invertir. Para ello, están activadas las casillas correspon-
dientes. Por último, la señal de grabación (MCLR/Vpp) queda asociada con el bit TXD
del canal serie del PC.
Habilitando o no las casillas apropiadas en la columna Test, se pueden activar o des-
activar individualmente las señales asociadas a modo de comprobación. Los indicadores
luminosos de la columna Estado nos indican el estado actual de dichas señales.
Deshabilitando el Bloqueo de configuración, se puede hacer cualquier cambio so-
bre las señales mencionadas y ajustarlas a las necesidades del hardware según el graba-
dor disponible. Una vez configurado el sistema, puede generarse un fichero de configu-
ración para usos posteriores. Para ello, se dispone de tres botones: Guardar, Guardar
como y Eliminar. Se pide el nombre del fichero, que suele coincidir con el nombre del
grabador (PIC’School), y queda registrado en una lista de ficheros con la configuración
de otros tantos grabadores.

P2.4.3. Configuración del «software»


Existen unas opciones de configuración a nivel de software que el usuario puede habili-
tar o no según preferencias. Éstas se muestran en la Figura P2.30.
HERRAMIENTAS PARA LA GRABACIÓN, IMPLEMENTACIÓN Y DEPURACIÓN 145

Figura P2.30. Opciones de configuración software.

• Programar. Permite activar o no las opciones de «Verificar tras la programación»


y «Avisar antes de borrar y programar». En el primer caso, al activarse, se fuerza a
que el software verifique de forma automática el contenido del PIC recién grabado
comparándolo con el contenido actual de los distintos buffers o áreas de memoria.
• Dispositivo. Permite activar o no las opciones de «Usar autoselección del dispo-
sitivo» y «Detectar y autoseleccionar el dispositivo al entrar». En el primer caso,
WinPic800 trata de averiguar el modelo de PIC sobre el que se va a actuar. Esta de-
tección se basa en que los modelos de PIC más recientes integran un código de iden-
tificación. El modelo detectado pasa automáticamente a ser el seleccionado. Activan-
do la segunda opción, se trata de detectar el PIC nada más ejecutar WinPic800.
Hay que indicar que no todos los modelos de PIC integran el código de identifi-
cación. En estos casos, se indicará que se trata de un modelo desconocido y habrá
que seleccionarlo manualmente.
• .HEX. Permite, si se activa, actualizar los archivos *.HEX antes de la grabación
por si se hubiera realizado alguna modificación de los buffers de memoria y ajus-
tar los ficheros *.HEX si se trata de dispositivos de la familia 18FXXX.

2.2.4. Tareas más comunes


Básicamente, se ejecutan mediante los distintos botones disponibles sin necesidad de
navegar entre los distintos menús (Fig. P2.31).

Figura P2.31. Botones de las tareas más comunes.


146 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

1. Abrir: Accede al clásico navegador de Windows que permite seleccionar el


archivo que se desea abrir. Dicho archivo debe tener la extensión *.HEX y se
obtiene como consecuencia de ensamblar/compilar el programa del usuario. Su
contenido se almacena en los distintos buffers de memoria de WinPic800 para la
posterior grabación del PIC. Este botón también permite acceder de forma rápida
a los archivos *.HEX recientemente abiertos.
2. Actualizar archivo: Este comando permite restaurar los distintos buffers de
memoria de WinPic800 después de haber sufrido cualquier tipo de modificación
con el contenido del archivo *.HEX actual.
3. Guardar: Guarda el contenido de los buffers de memoria de WinPic800 sobre el
archivo *.HEX actualmente abierto.
4. Leer todo: Lee el contenido de las tres áreas de memoria que componen un PIC
(código, datos y configuración) y lo deposita sobre los correspondientes buffers
de WinPic800.
5. Programar todo: Graba sobre las tres áreas de memoria que componen un PIC
el contenido de los correspondientes buffers de WinPic800.
6. Verificar todo: Compara el contenido de las tres áreas de memoria del PIC con
el contenido de los tres buffers de memoria de WinPic800 comprobando si hay
igualdad o, en su caso, indicando las diferencias existentes
7. Borrar todo: Borra el contenido de las tres áreas de memoria del PIC dejándolas
en los valores originales de fábrica. Este comando sólo es operativo en los dispo-
sitivos con memoria EEPROM/FLASH. Los dispositivos con memoria OTP no
pueden ser borrados.
8. Test hardware: Realiza una comprobación del hardware del grabador en uso
(PIC’School).
9. Detectar PIC: Trata de averiguar el modelo de PIC que está instalado en el
grabador y lo selecciona como modelo actual si esta opción está activada en
Configuración / Software. No todos los modelos de PIC integran su propia iden-
tificación. En este caso, la detección resulta imposible.
a
Las primeras experiencias 3.
APLICACIÓN

P3.1. FASES DE DESARROLLO DE UN PROYECTO


En las aplicaciones anteriores se han descrito y manejado las herramientas que se uti-
lizarán en la implementación de los proyectos que se irán proponiendo basados en el
PIC12F508. Las tres más importantes son:

1. Entorno de desarrollo integrado MPLAB IDE, que incluye el simulador software MPLAB
SIM de Microchip.
2. Equipo PIC School para grabación, montaje y depuración de prototipos de Ingeniería de
Microsistemas Programados.
2. Software de grabación WinPic800, desarrollado por Sisco Benach
(www.perso.wanadoo.es/siscobf/winpic800.htm).

Con las herramientas mencionadas se puede desarrollar una colección de interesan-


tísimas experiencias basadas en el PIC12F508 y diseñadas por Ingeniería de Microsiste-
mas Programados en el módulo PIC12FXXX para ser montadas sobre PIC School que
contiene los componentes complementarios y que recomendamos al lector disponer de
dicho módulo para facilitar la realización de las experiencias.
Para acostumbrar al lector a seguir lo más cómodamente posible la realización de los
proyectos, se les ha dividido en las siguientes fases:

Primera fase: Enunciado y objetivos


Se describe con claridad la experiencia, sus características y el propósito que persigue.

Segunda fase: Principios teóricos


En esta sección se repasan los datos y el funcionamiento y programación de los elemen-
tos del PIC12F508 que se utilizan en la experiencia, así como de los elementos externos
especiales.

147
148 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Tercera fase: Nuevas instrucciones


Se repasan la funcionalidad y las propiedades de las instrucciones que no se han uti-
lizado en programas anteriores y que se incluyen en el programa de la experiencia en
curso.

Cuarta fase: Materiales necesarios


Se describen los materiales complementarios que se requieren para realizar la experiencia
en la PIC School y que vienen incluidos en el módulo PIC12FXXX que comercializa Inge-
niería de Microsistemas Programados.

Quinta fase: Organigrama y programa fuente en Ensamblador


Se explica el organigrama al que responde la aplicación si es necesario y el programa fuen-
te en Ensamblador aclarando las peculiaridades y aspectos más interesantes del mismo.

Sexta fase: Ensamblado y simulación «software»


Se realiza la conversión del programa fuente (.ASM) a programa ejecutable (.HEX)
mediante el ensamblador integrado en el entorno MPLAB IDE. Posteriormente, se pue-
de simular el programa de aplicación mediante el simulador MPLAB SIM y analizar el
comportamiento de los registros, las posiciones de memoria e incluso las E/S a través
del registro GPIO.

Séptima fase: Conexionado de periféricos


Se detalla el conexionado de los periféricos existentes en la PIC School a las patitas del
microcontrolador, así como el montaje de recursos especiales en la tarjeta de montaje sin
soldadura.

Octava fase: Grabación del programa y verificación de su funcionamiento


Mediante el programa WinPic800 se graba en la PIC School el programa ejecutable en la
memoria del PIC12F508. Luego se procede a la ejecución del mismo para comprobar el
comportamiento de todos los elementos del sistema.

Novena fase: Programación en C


Se propone el programa fuente escrito en lenguaje C. Como compilador, se propone el
PCH de la casa CCS, que comercializa Ingeniería de Microsistemas Programados. Su faci-
lidad de manejo, flexibilidad para PIC y economía lo hacen muy recomendable.

P3.2. PRÁCTICA 1: MANEJANDO LAS LÍNEAS DE E/S DIGITALES

P3.2.1. Enunciado (primera fase)

Con esta práctica se trata de leer el estado lógico que introducen tres interruptores o
pulsadores de la PIC School conectados a las líneas de E/S GP3-GP5 de un PIC12F508
y reflejar visualmente dicho estado sobre tres diodos led conectados a las líneas de E/S
GP0-GP2, respectivamente.
LAS PRIMERAS EXPERIENCIAS 149

P3.2.2. Principios teóricos (segunda fase)


El PIC12F508 dispone de ocho patitas en el encapsulado, de las cuales dos se dedican
a recibir la tensión de alimentación, quedando un máximo de seis para actuar como
líneas de E/S. Como algunas líneas pueden soportar diversas funciones, para que haya
seis destinadas a las E/S es necesario que se utilice el oscilador interno de 4 MHz y que
la patita multifunción GP3/MCLR#/VPP esté configurada como línea de entrada (GP3)
(Fig. P3.1).

Figura P3.1. Para soportar líneas de E/S en un PIC12F508 puede existir un máximo de seis patitas
(GP0-GP5) siempre que se use el oscilador interno y la patita 4 esté configurada como
línea de entrada GP3.

Las líneas de E/S, GP0-GP5, están asociadas a los 6 bits de menos peso del registro
GPIO, que ocupa la dirección 0x06 de la memoria RAM de datos. Los 2 bits de más peso
de GPIO no son válidos (Fig. P3.2).

Figura P3.2. Las líneas de E/S, GP0-GP5, se corresponden con los 6 bits de menos peso del registro GPIO.

Una operación de lectura sobre el registro GPIO supone leer el estado lógico actual
que soportan las líneas de entrada asociadas a él, mientras que una escritura significa
sacar por las líneas de salida el valor lógico correspondiente a los bits cargados en GPIO.
Leyendo y escribiendo GPIO, se transfiere información de forma bidireccional entre el
procesador y el mundo exterior.
Todas las líneas de E/S pueden funcionar como entrada o como salida, con excepción
de GP3, que sólo actúa como entrada. En el procesador existe un registro independiente
interno de 8 bits, llamado TRIS, que tiene la misión de configurar como entrada o salida
las líneas de E/S. Si se carga un 1 en un bit del registro TRIS, la línea de E/S asociada
se configura como entrada de alta impedancia. Si se carga un 0, la línea asociada actúa
como salida (Fig. P3.3).
150 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P3.3. Un 1 en un bit del registro TRIS configura como entrada la línea de E/S asociada, mientras
que un 0 la configura como salida.

Para manejar el registro independiente TRIS se usa la instrucción «TRIS», que carga
en el mismo el contenido del registro de trabajo W (W → TRIS).
En la Figura P3.4 se ofrece el esquema eléctrico del conexionado interno de cada
línea de E/S que tiene asociado un registro latch del registro TRIS y otro del registro
GPIO. Si se carga un 1 en un bit de TRIS, el latch queda anulado y dicha línea traba-
ja como entrada, de manera que una operación de lectura sobre GPIO devuelve al bit
correspondiente del registro W el estado actual de dicha patita. Si se carga un 0 en un
latch de TRIS, queda habilitado el latch de salida de datos y la línea de E/S funciona
como salida soportando el mismo nivel lógico que exista en el latch de salida de datos
correspondiente.
Cuando se efectúa una operación de escritura MOVWF GPIO (W → GPIO), se
«latchean» o se registran las salidas y por las líneas de salida se saca el correspondiente

Figura P3.4. Si un latch del registro TRIS tiene un 1, el latch de salida de datos (GPIO) queda inhabili-
tado y la línea de E/S queda configurada como entrada.
LAS PRIMERAS EXPERIENCIAS 151

valor binario hasta que se cargue un nuevo valor. En una operación de lectura MOVF
GPIO, W, se lee el estado lógico actual de las patitas de entrada.

Algunas instrucciones orientadas a bit (sólo afectan a un bit de un registro) realizan una
lectura seguida de una escritura. Esto sucede con BSF, que pone a 1 un bit de un registro,
o bien con BCF, que pone a 0 un bit concreto de un registro. Al ejecutar una de ellas, se
lee el registro completo, se activa a 1 o 0 el bit especificado y luego se escribe el registro
completo. Si dicho registro es GPIO, hay que tener precaución con estas instrucciones
cuando actúan sobre puertas que se están configurando dinámicamente como entradas o
como salidas. Si, por ejemplo, se ejecuta la instrucción BSF GPIO, 5, se comienza leyendo
todo el registro GPIO, luego se pone a 1 su bit 5 y, finalmente, se escribe el nuevo valor
sobre GPIO. Si en el momento de la lectura GP1 está configurada como entrada y tiene un
0, dicho valor se carga en el latch de salida de datos de GP1. En el instante que GP1 se
reconfigure como salida, la patita se pondrá automáticamente a 0 como consecuencia de
la instrucción BSF GPIO, 5, previamente ejecutada.

P3.2.3. Nuevas instrucciones (tercera fase)

Como éste es el primer programa que se explica en la colección de prácticas, se procede


a describir todas las directivas e instrucciones que se manejan. Posteriormente, sólo se
comentarán las nuevas que aparezcan en programas sucesivos.

COMENTARIOS

Tanto en la cabecera del programa como al comienzo de las rutinas, como detrás de las
instrucciones importantes, conviene que el autor añada aclaraciones que permitan com-
prender a otro usuario la misión de cada cosa. Los comentarios siempre van precedidos
por «punto y coma» ( ; ).

;
; EJEMPLO 1
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;
;Leer el estado de tres interruptores/pulsadores del laboratorio
;conectados a GP3-GP5 y reflejar el nivel
;lógico de los mismos sobre los leds conectados a GP0-GP2

DIRECTIVAS DE ENSAMBLADOR

Son textos indicativos que determinan ciertas características importantes a tener en


cuenta en el programa. Por ejemplo, la directiva List p=12F508 informa al ensamblador
que en la aplicación se va a utilizar un PIC12F508.
152 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

La directiva Include P12F508.INC indica al programa Ensamblador que hay que


acceder al archivo P12F508.INC, proporcionado por Microchip, todos los nombres o
etiquetas en inglés de los registros y bits del modelo de PIC usado. Se trata de etiquetas
que se definen previamente para hacer referencia a ellas en lugar de a las direcciones que
ocupan en la memoria de datos, siendo así mucho más fácil la programación. Por ejem-
plo, la instrucción que pone a 0 el bit 3 del registro de Estado, que ocupa la dirección
0x03 de la memoria de datos, debe escribirse BCF 0x03, 3; sin embargo, si al comienzo
del programa se ha definido la etiqueta STATUS como la que hace referencia a la po-
sición 0x03 de la memoria de datos (STATUS equ 0x03), la escritura de la instrucción
quedaría más comprensible poniendo BCF STATUS, 3. En el fichero P12F508.INC se
incluyen todas las etiquetas de registros y bits del microcontrolador especificado. Con-
viene que este fichero se encuentre en la misma carpeta en la que se guarda el programa
fuente que se edita.

List p=12F508 ; Define el tipo de procesador usado


Include “P12F508.INC” ; Se incluye un archivo con etiquetas de
; registros y bits

PALABRA DE CONFIGURACIÓN

La Palabra de Configuración tiene la misión de seleccionar diferentes posibilidades de


funcionamiento del procesador, como el tipo de oscilador empleado, el uso o no del
WDT y la posible protección ante lecturas del código. Todo esto se puede determinar
indicándolo por software en el propio programa fuente o bien durante la grabación del
mismo. Si se especifica la Palabra de Configuración en el programa fuente cada vez
que se ensamble o compile, se obtiene un fichero ejecutable que contiene también la
configuración. Así, el software de grabación adquiere automáticamente la configuración
preestablecida.
En esta práctica se emplea la directiva

“ config _ CP _ OFF& _ WDT _ OFF& _ MCLRE _ OFF& _ IntRC _ OSC”

que establece que hay protección del código, funciona el Perro Guardián, se usa MCLR
interno y el oscilador es el interno de 4 MHz. Estas etiquetas o definiciones de la confi-
guración también se hallan establecidas en el archivo P12F508.INC.

VARIABLES DE USUARIO Y VECTOR DE ARRANQUE

La mayoría de los programas de aplicación necesitan utilizar posiciones de memoria


de datos RAM para guardar datos y variables de carácter temporal. En el programa
bajo análisis, la directiva Temp equ 0x07 se encarga de definir una variable de 8 bits
denominada Temp que se localiza en la dirección 0x07 de la memoria de datos RAM.
El programa utilizará esta posición para almacenar temporalmente el valor leído en el
registro GPIO de E/S. El número de registros disponibles en la RAM para contener va-
LAS PRIMERAS EXPERIENCIAS 153

riables es el que compone el área GPR, que en el PIC12F508 llegan desde la dirección
0x07 a la 0x1F.
En todos los programas hay que definir la dirección de la memoria de programa en
donde se ubica la primera instrucción que se debe ejecutar al arrancar el sistema. A dicha
posición se la llama Vector de Reset. En el caso del PIC12F508, la dirección de la primera
posición que se ejecuta es la 0x1FF, que es la última del mapa de memoria. En dicha posi-
ción se coloca en fábrica la instrucción MOVLW XX, donde XX es el valor usado para la
calibración del oscilador interno y que se carga en el registro W. Cuando se ejecuta, el PC
se desborda y pasa a valer 0x000, que es, a efectos prácticos, la dirección de inicio del pro-
grama. La directiva org 0x00 informa al ensamblador la dirección de la instrucción inicial.

Temp equ 0x07 ; La variable temporal Temp se ubica en la


; dirección 0x07
org 0x00 ; Dirección del Vector de Reset

INSTRUCCIONES

Se comenta la función de las instrucciones empleadas en el programa:


— movwf OSCCAL: Almacena el valor que hay en W sobre el registro de calibra-
ción del oscilador interno OSCCAL. El valor existente en W es el que se cargó
con la instrucción movlw XX, que el fabricante del chip ha grabado en la posición
0x1FF y que es la que se ejecuta automáticamente al arrancar el sistema.
— clrf GPIO: Borra el contenido existente en los latchs del registro GPIO. Es una
buena táctica para controlar inicialmente el estado de los mismos, pues al co-
nectar la alimentación su valor inicial es aleatorio e impredecible, lo cual puede
provocar accionamientos no deseados en los periféricos conectados en las líneas
de salida.
— movlw b’11011111’: Carga en el registro W el valor binario indicado.
— option: Carga el valor de W en el registro OPTION, con lo que se configura a la
línea multifunción GP2/T0CKI como línea de E/S GP2.
— movlw b’11111000’: Almacena en el registro W el valor adecuado para que
cuando se traspase al registro TRIS se configuren como salidas las líneas GP0,
GP1 y GP2 y las restantes como entradas.
— tris GPIO: Almacena el contenido de W en el registro TRIS.
— movf GPIO, W: Mueve a W el estado de las seis líneas de E/S del registro GPIO, de
las cuales en este caso sólo interesan las de entrada, que son GP3, GP4 y GP5.
— movwf Temp: El anterior valor leído y cargado en W se almacena en la variable
Temp.
— rlf Temp, f: Los 8 bits almacenados en Temp rotan una posición a la izquierda,
introduciendo un 0 por la derecha.
— swap Temp, w: Se intercambian los 4 bits de más peso del valor contenido en Temp
con los 4 bits de menos peso, depositando el resultado obtenido en W. Así, los bits
0, 1 y 2 de W contienen el estado de las patitas de entrada GP3, GP4 y GP5.
154 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

— movwf GPIO: El contenido de W se escribe en los latchs del registro GPIO.


— goto Loop: Se salta a la instrucción que va precedida por la etiqueta Loop y así
se consigue que el ciclo se repita indefinidamente.
— end : Se trata en realidad de una directiva que informa al programa ensamblador
el final del programa.

P3.2.4. Materiales necesarios (cuarta fase)


Se citan los materiales que se precisan para realizar la práctica. En este ejemplo, todos
los elementos necesarios están contenidos en la PIC School.
• PIC School.
• PIC12F508.
• Cables de conexión.

P3.2.5. Organigrama y programa fuente en Ensamblador (quinta fase)


En la Figura P3.5 se ofrece el organigrama que corresponde al programa fuente en Ensam-
blador, que se encarga de leer los tres interruptores colocados en las líneas de entrada GP3-
GP5 visualizando su valor sobre los tres leds conectados a las líneas de salida GP0-GP2.

Figura P3.5. Organigrama correspondiente al programa de lectura de entradas y su visualización sobre


las salidas.
LAS PRIMERAS EXPERIENCIAS 155

Para que el valor de las entradas se coloque adecuadamente en el de las salidas se


realiza una rotación a la izquierda del registro GPIO seguida de un intercambio entre los
4 bits de más peso con los 4 de menos peso (Fig. P3.6).

Figura P3.6. Tras una rotación a la izquierda y un intercambio de nibbles, el valor de las entradas se
sitúa en el de las salidas.

Se presenta el listado del programa fuente en Ensamblador:

;
; EJEMPLO 1
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;
;Leer el estado de 3 interruptores/pulsadores del laboratorio,
;conectados a GP3-GP5 y reflejar el nivel
;lógico de los mismos sobre los leds conectados a GP0-GP2

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Definiciones de registros internos

;Ajusta los valores de la palabra de configuración durante el


;ensamblaje:
;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= interno
;Estas u otras configuraciones se pueden seleccionar según las
;necesidades

__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC

Temp equ 0x07 ;Variable temporal

org 0x00 ;Vector de Reset

Inicio movwf OSCCAL ;Almacena valor de calibración original


clrf GPIO ;Borra salidas
movlw b’11011111’
156 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

option ;Pin GP2/TOCKI = GP2


movlw b’11111000’
tris GPIO ;Configura GP0-GP2 como salidas

Loop movf GPIO,W


movwf Temp ;Lee las entradas GP3-GP5
rlf Temp,f ;Desplaza a la izquierda
swapf Temp,w ;Intercambia nibbles
movwf GPIO ;Visualiza en las salidas GP0-GP2
goto Loop

end

P3.2.6. Ensamblado/compilación (sexta fase)


Como el programa fuente incluido en el proyecto (Práctica1.ASM) se ha escrito en
Ensamblador, se selecciona la opción Build All para obtener el programa ejecutable
(Práctica1.HEX).
Se puede utilizar el simulador software MPLAB SIM para comprobar el compor-
tamiento del programa analizando especialmente las modificaciones que suceden en el
registro GPIO. Téngase en cuenta que el comportamiento obtenido no es en tiempo real.
Habrá que forzar un valor en las entradas para comprobar cómo pasa a las salidas. Por
ejemplo, si inicialmente cargamos en el registro GPIO el valor F0, habrá que confirmar
que al acabar el programa los 3 bits de las líneas de entrada estén situados sobre el de
las líneas de salida.

P3.2.7. Conexión de periféricos (séptima fase)

El conexionado de los periféricos que se usan en este ejercicio se muestra en la Fi-


gura P3.7.
Como las líneas multifunción GP0/ICSPDAT y GP1/ICSPCLK, además de actuar
como E/S, también se emplean en la grabación serie de la memoria de programa, se
recomienda conectar los periféricos correspondientes a las líneas RB7 y RB6, que sólo
realizan la función de líneas de E/S similares a GP0 y GP1, respectivamente.
Para conseguir una fase de grabación del programa sin contratiempos se recomienda
tener en cuenta las siguientes reglas:

1.a Los periféricos correspondientes a las líneas de E/S GP0 y GP1 se conectan a las
líneas RB7 y RB6 para no tener que desconectar los mencionados periféricos durante
la fase de grabación.
2.a El conmutador de tres posiciones de la PIC School se coloca en el PC durante las fases
de edición y grabación. (¡Ojo! Si se usa un adaptador puerto serie-USB para conectar la
herramienta al PC, entonces se coloca el conmutador en la posición ICSP) (Fig. P3.8).
3.a El jumper JP4 se debe colocar en la posición MCL (1-2).
LAS PRIMERAS EXPERIENCIAS 157

Figura P3.7. Conexionado de los periféricos a las seis líneas de E/S del microcontrolador.

Figura P3.8. Cuando se usa un adaptador serie-USB para comunicar el PC a la PIC School, se coloca el
conmutador en la posición ICSP durante las fases de edición y grabación.
158 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

P3.2.8. Grabación del programa y verificación del funcionamiento


(octava fase)

GRABACIÓN

Se trata de grabar en la memoria FLASH el programa ejecutable obtenido tras el ensam-


blado del programa fuente.
Se comienza ejecutando el programa WinPic800, que se incluye en el CD. Se se-
lecciona el microcontrolador PIC12F508 y se abre el fichero ejecutable Ejem_1A.HEX.
Aparecerá la pantalla que se muestra en la Figura P3.9.
En el buffer de memoria que aparece en la pantalla y se destina a contener el código
a partir de la dirección inicial (Vector de Reset) 0x000, se presentan los valores hexade-
cimales que hay en ellos antes de la grabación. También se puede conocer la configura-
ción del dispositivo para comprobar que coincide con la que se programó.
Una vez abierto el fichero ejecutable (Archivo/Abrir / Ejem_1A.HEX), se realizan los
siguientes pasos:

1.o Se pone el conmutador que selecciona el modo de trabajo de la PIC School en la


posición PC (si hay adaptador serie-USB en la ICSP).
2.o Se coloca el jumper JP4 en la posición MCL (1-2).
3.o Se graba el dispositivo seleccionando el icono correspondiente de la pantalla.

Figura P3.9. Ventana similar a la que aparece al abrir el programa WinPic800.


LAS PRIMERAS EXPERIENCIAS 159

Figura P3.10. Fotografía de la PIC School con el experimento propuesto montado y funcionando.

VERIFICACIÓN DEL FUNCIONAMIENTO

Una vez grabado el dispositivo y para comprobar el comportamiento del programa cuan-
do lo ejecuta el PIC12F508, se procede a seguir los siguientes pasos.

1.o Se coloca el jumper JP4 en la posición GP3 (2-3).


2.o Se sitúa el conmutador de modo de trabajo de la PIC School en RUN.
3.o Se comprueba el correcto funcionamiento de la experiencia observando que
el estado de los interruptores de entrada E0-E2 se refleja en los leds S0-S2
(Fig. P3.10).

P3.2.9. Programación en C (novena fase)

En muchas ocasiones es muy frecuente desarrollar el programa fuente en lenguaje C; por


eso, en cada práctica, se ofrece el programa confeccionado en este lenguaje. Para la com-
pilación se ha seleccionado el compilador PCH de CCS, que comercializa Ingeniería de
Microsistemas Programados, por su sencillez, flexibilidad y economía. A continuación,
se ofrece el programa mencionado que se puede encontrar en el CD con el nombre de
Ejem_1B.C:
160 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

// EJEMPLO 1
// Autor: Mikel Etxebarria
// (c) Ingeniería de Microsistemas Programados S.L.
// www.microcontroladores.com
// Bilbao 2006
//
//
// Leer el estado de 3 interruptores/pulsadores del laboratorio,
// conectados a GP3-GP5 y reflejar el nivel
// lógico de los mismos sobre los leds conectados a GP0-GP2

#include <12F508.h>

//Ajusta los valores de la palabra de conf. durante el ensamblaje:


//Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= interno
//Estas u otras configuraciones se seleccionan según necesidades

#fuses NOPROTECT,NOWDT,NOMCLR,INTRC

#use fast_io (B) //Acceso rápido a las E/S

int Temp; //Variable temporal


main()
{
output_b(0x0); // Borra las salidas
SETUP_TIMER_0(RTCC_INTERNAL); // Pin GP2/T0CKI = GP2
set_tris_b(0b11111000); // GP0-GP2 configuran como salidas
while(1)
{
Temp=input_b(); //Lee las entradas GP3-GP5
rotate_left (&Temp,1); //Desplaza a la izquierda
swap(Temp); //Intercambia nibbles
output_b(Temp); //Visualiza en las salidas GP0-GP2
}
}

Listado del programa en lenguaje C.

P3.3. TRABAJO PERSONAL

Ejercicio 1
Con igual conexionado que el empleado en la práctica descrita en este tema, realizar
un programa que visualice sobre los leds de salida conectados a las líneas GP0, GP1
y GP2 el estado complementario o negado de los interruptores de entrada conectados
a las líneas GP3, GP4 y GP5, respectivamente. Comprobar el funcionamiento física-
mente.
LAS PRIMERAS EXPERIENCIAS 161

Ejercicio 2
De las seis líneas de E/S que dispone un PIC12F508, se destinan dos de ellas a entradas
binarias implementadas con dos interruptores de la PIC School (E0-E1) y las cuatro
restantes, a elección del usuario, se destinan a representar cuatro valores binarios sobre
cuatro leds (S0-S3). Se trata de confeccionar un programa en Ensamblador y en C y luego
montar el circuito y comprobar su funcionamiento que visualice en binario sobre los cua-
tro leds de salida el valor binario que representan las dos entradas más 5.

Ejercicio 3
Se dispone en el laboratorio PIC School con un PIC12F508 de dos líneas de entrada
conectadas a los interruptores E0 y E1 y de cuatro salidas conectadas a los leds S0-S3.
El usuario elige las patitas de entrada y salida. Confeccionar un programa y comprobar
su funcionamiento real de forma que se codifiquen las entradas con las salidas según se
muestra en la tabla de la verdad de la Figura P3.11.

Entradas Salidas
E1 E0 S3 S2 S1 S0
0 0 0 1 1 0
0 1 1 0 0 1
1 0 0 1 0 1
1 1 1 0 1 0

Figura P3.11. El programa a confeccionar debe responder a la siguiente tabla de verdad.


a
Manejando el tercer estado
en las E/S
4.
APLICACIÓN

P4.1. ¿QUÉ ES EL TERCER ESTADO?


El tercer estado o estado de «alta impedancia», Z, es un estado lógico diferente al 0
(GND) y al 1 (VCC) que corresponde al de una línea sin conectar a nada, es decir, «al
aire». En la Figura P4.1 se muestra un conmutador de tres posiciones que representa los
tres posibles estados. Una va a tierra, otra a la tensión positiva y la tercera está al aire sin
conectarse a nada.
La línea de salida del conmutador de la Figura P4.1 es capaz de soportar tres estados
en vez de sólo dos como es habitual en algunos sistemas digitales. Con tres estados se
incrementa el número de combinaciones diferentes que pueden representarse. En un
sistema binario, el número de combinaciones, C, que se pueden formar con n líneas
viene dado por C = 2n, mientras que si el sistema admite los tres estados, el número de

Figura P4.1. La línea de salida del conmutador tiene nivel o estado 1 si está conectada a +5 VCC, tiene
nivel 0 si se conecta con tierra y tiene el estado de alta impedancia, Z, cuando no está
conectada a nada, es decir, en la posición central.

163
164 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

combinaciones será C = 3n. Por ejemplo, con dos líneas binarias se pueden representar
cuatro combinaciones diferentes; pero si las líneas fuesen triestado, el número de com-
binaciones posibles se elevaría a nueve.
A los tres estados se denominan 0, 1 y Z.

P4.2. PRÁCTICA 2: DETECTANDO EL TERCER ESTADO


ENUNCIADO

En esta experiencia se analiza el estado en que se encuentra una línea de entrada (GP5)
en el PIC12F508, y según esté en el 0, en el 1 o en el Z, se activa la línea GP0, GP1 o
GP2, respectivamente, y se encenderá el led que controla cada una de ellas.

PRINCIPIOS TEÓRICOS
Para la detección de los 3 estados lógicos posibles en la línea de entrada GP5 del
PIC12F508 se monta el circuito de la Figura P4.2.
Para detectar que la línea GP5 del circuito de la Figura P4.2 soporta el estado de alta
impedancia, Z, se procede a realizar los siguientes cuatro pasos:

— Primer paso: Se configura GP5 como salida y se saca por ella un nivel 1, que
sirve para cargar al condensador de 1 nF del esquema de la Figura P4.2.
— Segundo paso: Inmediatamente después, se reconfigura GP5 como entrada y se
lee su estado actual. Se debe leer el estado 1 como consecuencia de estar cargado
el condensador.
— Tercer paso: De nuevo se configura GP5 como salida y se saca un 0 por ella
para producir la descarga del condensador.
— Cuarto paso: Se reconfigura GP5 como entrada y se lee su estado, que en este
caso debe ser el 0 al haberse descargado el condensador.

Figura P4.2. Esquema eléctrico para la detección de los tres estados que admite la línea de entrada GP5.
MANEJANDO EL TERCER ESTADO EN LAS E/S 165

Los cuatro pasos producen los resultados mencionados siempre que el conmu-
tador de la Figura P4.2 se halle conectado en la posición central y entonces GP5
soporta el estado de alta impedancia. En resumen, la comprobación de que la línea
tiene el estado Z se confirma porque cuando por ella se saca un 1, después se lee por
ella un 1, y cuando se saca un 0, luego se lee un 0. Se debe al comportamiento del
condensador.
Si al sacar un 1 por GP5 luego se lee un 0, significa que el conmutador está conectado
a tierra, o sea, GP5 soporta un nivel 0. Cuando al sacar un 0 por GP5 se lee posterior-
mente un 1, el conmutador está conectado a +5 VCC y GP5 soporta nivel 1 estando el
condensador cargado.
Conviene tener en cuenta que cuando se escribe sobre una línea GPIO configurada
como salida, el valor escrito se almacena en un registro o latch que lo mantiene estable.
Sin embargo, cuando se efectúa una lectura de una línea de entrada lo que se lee es el
nivel lógico actual de la patita correspondiente.

NUEVAS INSTRUCCIONES

El programa de esta experiencia tiene pocas instrucciones nuevas respecto a los comen-
tados anteriormente. La función del programa es configurar a GP5 como salida para
sacar un 1 o un 0 para luego reconfigurar la línea como entrada y leer su valor. Según el
valor leído en GP5, hace que GP2 = 1 cuando GP5 = Z, que GP1 = 1 cuando GP5 = 1 y
que GP0 = 1 en el caso que GP5 = 0.
La instrucción movlw b’11111000’ seguida de option realiza la carga del valor bina-
rio indicado en el registro OPTION, con lo que se consigue configurar la patita multifun-
ción GP2/T0CKI como línea de E/S GP2.
La instrucción btfss GPIO, 5 explora si GP5 soporta el nivel 1, y si es así, se salta
la siguiente instrucción del programa (brinco). Con la instrucción btfsc GPIO, 5 se
chequea si GP5 soporta el nivel 0, y si así sucede, se brinca y se salta la siguiente ins-
trucción del programa. Son dos instrucciones de salto condicional, pero el salto que se
origina cuando se cumple la condición es muy pequeño porque sólo se salta la siguiente
instrucción.

MATERIALES NECESARIOS

• PIC School.
• PIC12F508.
• Resistencia de 330 Ω.
• Condensador de 1 nF.
• Cables de conexión.

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

El organigrama al que responde el programa de la experiencia para la detección de los


tres estados en GP5 se ofrece en la Figura P4.3. Cada estado se visualiza encendiendo
uno de los leds conectados a las líneas de salida GP0, GP1 y GP2.
166 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P4.3. Organigrama para detectar los tres estados posibles en la línea GP5 del esquema de la
Figura P4.2.

A continuación, se proporciona el listado del programa fuente en Ensamblador corres-


pondiente al organigrama de la Figura P4.3. Para su comodidad, dicho programa también está
incluido en el CD que acompaña al libro bajo el nombre 12F508ASM/Ejem_2A.ASM.
MANEJANDO EL TERCER ESTADO EN LAS E/S 167

;
; EJEMPLO 2
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;El programa sirve para los tres estados, incluyendo
;el de alta impedancia (Z), posible en la entrada GP5.
;Si GP5=0, se activa GP0; si GP5=1, se activa GP1, y si GP5=Z, se activa GP2
List p=12F508 ;Tipo de procesador
include “P12F508.INC” ;Def. de registros internos

;Ajusta valores de palabra de config. durante el ensamblaje:


;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= interno
;Otras configuraciones se seleccionan según las necesidades

__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC

Temp equ 0x07 ;Variable temporal

org 0x00 ;Vector de Reset

Inicio movwf OSCCAL ;Almacena valor de calibración original


clrf GPIO ;Borra salidas
movlw b’11011111’
option ;Pin GP2/TOCKI = GP2
movlw b’11111000’
tris GPIO ;Configura GP0-GP2 como salidas

Loop movlw b’11011000’


tris GPIO ;GP5 salida
bsf GPIO, 5 ;GP5=1
movlw b’11111000’
tris GPIO ;GP5 entrada
btfss GPIO, 5 ;GP5 = 1 ??
goto GP5_es_0 ;No
movlw b’11011000’ ;Sí
tris GPIO ;GP5 salida
bcf GPIO, 5 ;GP5=0
movlw b’11111000’
tris GPIO ;GP5 entrada
btfsc GPIO, 5 ;GP5 =0 ??
goto GP5_es_1 ;No
movlw b’00000100’
movwf GPIO ;Sí, GP5=Z --> GP2=1
goto Loop
GP5_es_1 movlw b’00000010’
movwf GPIO ;GP5=1 --> GP1=1
goto Loop
GP5_es_0 movlw b’00000001’
movwf GPIO ;GP5=0 --> GP0=1
goto Loop
end
168 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

ENSAMBLADO

El programa fuente en Ensamblador que se ha editado en el entorno MPLAB IDE con


el nombre de Práctica2.ASM es el que se utiliza para la creación de un nuevo proyecto
para después ensamblarlo con la opción Build All y así obtener, entre otros, el fichero del
programa máquina ejecutable que tiene la extensión .HEX.
Aunque el simulador MPLAB SIM no puede mostrar el comportamiento en tiempo
real de las líneas de E/S, con él se puede comprobar su respuesta en el programa intro-
duciendo el usuario por el teclado el valor que desea sacarse por GP5 y leyendo el valor
que van tomando las líneas de salida GP0, GP1 y GP2.

CONEXIÓN DE PERIFÉRICOS
El conexionado de los periféricos que todos están disponibles en la PIC School es el que
muestra la Figura P4.4.

Figura P4.4. Conexión de las cuatro líneas del PIC12F508 usadas en la experiencia.
MANEJANDO EL TERCER ESTADO EN LAS E/S 169

En la unión de la resistencia de 330 Ω y el condensador de 1 nF se puede colocar


un cable con el que se puede tocar una borna con +5 V para la detección del nivel alto o
bien llevarla a tierra para el nivel bajo o dejarla al aire para representar el estado de alta
impedancia en el que se encenderá el led S2 conectado a GP2.
Se recomienda usar las líneas RB7 y RB6 en lugar de GP0 y GP1 para tener que
desconectarlas cada vez que se proceda a una grabación o verificación de un programa,
ya que por GP0 y GP1 se transfieren los datos en serie y los impulsos de reloj. Dichas
líneas son multifunción: GP0/ICSPDAT y GP1/ICSPCLK.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Para grabar el programa Práctica2.ASM con PIC School en la memoria FLASH del
PIC12F508 se utiliza el programa WinPic800. El jumper JP4 debe estar en la posición
MCL uniendo los puntos 1-2. El conmutador principal de la PIC School debe situarse en
la posición PC si se utiliza la puerta serie para conectarla con el PC. En caso de usar el
adaptador opcional para conectar la PIC School con el PC por el puerto USB, hay que
colocar el conmutador en la posición ICSP durante la grabación/verificación.
Desde WinPic800 se abre el programa Práctica2.HEX y con el icono correspon-
diente se ordena la grabación del mismo sobre la memoria del PIC12F508 previamente
seleccionado. Después, se puede verificar si la grabación ha sido correcta comparando
el contenido de la memoria con el del programa.
Una vez grabado el programa y antes de la verificación de su comportamiento, se
coloca JP4 en la posición GP3 (2-3) y el conmutador principal se pone en RUN.
Cuando el cable libre del montaje de la Figura P4.2, que hace de sonda lógica, toca
los +5 V, se encenderá el led S1 (GP5 = 1); si toca tierra, se enciende S0 (GP5 = 0), y si
no toca nada y queda al aire, se encenderá el led S2 (GP5 = Z).

EL PROGRAMA EN C

A continuación, se proporciona el programa en C a partir del cual se obtiene el programa


ejecutable tras su compilación. En estos ejemplos se ha empleado el compilador de C de
la casa CCS que comercializa Ingeniería de Microsistemas Programados. También en
el CD que acompaña al libro se puede encontrar este programa bajo el título \12F508C\
Ejem_2B.C.

// EJEMPLO 2
// Autor: Mikel Etxebarria
// (c) Ingeniería de Microsistemas Programados S.L.
// www.microcontroladores.com
// Bilbao 2006
//
//El programa demuestra la posibilidad de detectar el tercer estado,
//el de alta impedancia (0-1-Z), posible en cualquier entrada (p.e. GP5).
//Si GP5=0, se activa GP0; si GP5=1, se activa GP1, y si GP5=Z, se activa GP2
170 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

#include <12F508.h>

//Ajusta valores de la palabra de configuración durante el ensamblaje:


//Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= interno
//Estas u otras configuraciones se pueden seleccionar según las
//necesidades

#fuses NOPROTECT,NOWDT,NOMCLR,INTRC

#use fast_io (B) //Acceso rápido a las E/S


#byte GPIO=0x06

main()
{
output_b(0x0); //Borra las salidas
SETUP_TIMER_0(RTCC_INTERNAL); //Pin GP2/T0CKI = GP2
set_tris_b(0b11111000); //GP0-GP2 como salidas

while(1)
{
Loop: set_tris_b(0b11011000); //GP5 salida
bit_set(GPIO,5); //GP5=1
set_tris_b(0b11111000); //GP5 entrada
if (bit_test(GPIO,5)==0) //GP5 = 0???
{output_b(0b00000001); //Si, GP0=1
goto Loop;}
set_tris_b(0b11011000); //GP5 salida
bit_clear(GPIO,5); //GP5=0
set_tris_b(0b11111000); //GP5 entrada
if (bit_test(GPIO,5)==1) //GP5 = 1 ???
{output_b(0b00000010); //Si, GP1=1
goto Loop;}

output_b(0b00000100); //GP5=Z --> GP2=1


}
}

P4.3. EJEMPLO2_2: AMPLIACIÓN DE COMBINACIONES USANDO


ENTRADAS TRIESTADO

ENUNCIADO
Con dos líneas binarias que sólo admiten los estados lógicos 1 y 0 se pueden formar
cuatro combinaciones diferentes (22). Si dichas líneas admiten tres estados (0, 1 y Z), el
número de combinaciones distintas se eleva a 9 (32).
En esta experiencia se utilizarán dos líneas triestado de entrada, GP4 y GP5, con las
que se podrán formar nueve combinaciones diferentes. Con objeto de poder representar
las nueve combinaciones mediante tres líneas de salida (GP0-GP2) binarias es preciso que
una de las nueve posibles combinaciones de entrada repita su representación, ya que las
tres líneas binarias de salida sólo admiten ocho (23) combinaciones posibles (Fig. P4.6).
Recuérdese que la línea GP3 sólo puede configurarse como entrada.
MANEJANDO EL TERCER ESTADO EN LAS E/S 171

Entradas Salidas
GP5 GP4 GP2 GP1 GP0
0 0 0 0 0
0 1 0 0 1
1 0 0 1 0
1 1 0 1 1
Z 0 1 0 0
Z 1 1 0 1
0 Z 1 1 0
1 Z 1 1 1
Z Z 0 0 0

Figura P4.6. Codificación de las nueve combinaciones formadas por las dos entradas triestado mediante tres
líneas binarias de salida. Es necesario que una de las nueve combinaciones de entrada repita
su representación porque las tres líneas binarias de salida sólo admiten ocho combinaciones.

PRINCIPIOS TEÓRICOS
En el esquema de la Figura P4.7 se representa cómo se materializan las dos entradas
triestado correspondientes a las líneas GP4 y GP5. Como en la práctica anterior, se usan
redes RC para la implementación de los tres estados posibles.
Cuando el cable que parte de la unión de la resistencia y el condensador esté al aire,
por la patita correspondiente se introducirá un nivel de alta impedancia Z. Usando el
método de la práctica anterior, en cualquier momento se puede averiguar el estado lógi-
co que introducen GP4 y GP5 configurándolas como salidas, sacando por ellas un nivel
lógico y reconfigurándolas como entradas y leyendo el valor que entra.

Figura P4.7. Esquema para generar los tres estados posibles por las líneas de entrada GP4 y GP5.

NUEVAS INSTRUCCIONES
En el programa fuente en Ensamblador destaca el uso de una variable temporal (Temp)
que ocupa la primera posición libre de la memoria de datos, la 0x07. Las anteriores están
asignadas a registros específicos de control (SFR). El valor de Temp se forma con el
correspondiente a GP4 más el de GP5.
172 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

En el programa se manejan frecuentemente instrucciones de suma addwf, de resta


subwf y de testado de bits en los registros GPIO y STATUS, tales como btfsc GPIO,
5 y btfss STATUS, Z. La primera explora si GP5 = 0 y brinca si es así, mientras que la
segunda explora si Z = 1 para brincar si es cierto.

MATERIALES NECESARIOS
• PIC School.
• PIC12F508.
• Dos resistencias de 330 Ω.
• Dos condensadores de 1 nF.
• Cables de conexión.

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR


En la tabla de la Figura P4.8 se indica el valor decimal que se aplica a cada una de
las nueve combinaciones de las tres líneas de entrada triestado. Obsérvese que hay
dos combinaciones que responden al mismo valor para poder representarlas con tres
salidas digitales (led).
Se explora el valor lógico de las líneas de entrada GP4 y GP5 y según el que so-
porten se añade una constante a la variable Temp, la cual contiene un valor diferente
para cada una de las nueve combinaciones (recuérdese que dos se repiten). Dichas
combinaciones se representan por tres líneas binarias de salida. Las dos combinacio-
nes de las entradas que repiten su representación en las salidas son GP4 = GP5 = 0
y GP4 = GP5 = Z, que ambas se corresponden con el mismo valor de las salidas
GP2 = GP1 = GP0 = 0.

GP5 GP4 Temp (GP5) Temp (GP4) Valor Codificación GP2 GP1 GP0
0 0 +0 +0 0 0 0 0 0
0 1 +0 +1 1 1 0 0 1
1 0 +2 +0 2 2 0 1 0
1 1 +2 +1 3 3 0 1 1
Z 0 +4 +0 4 4 1 0 0
Z 1 +4 +1 5 5 1 0 1
0 Z +0 +6 6 6 1 1 0
1 Z +2 +6 8 7 1 1 1
Z Z +4 +6 10 0 0 0 0

Figura P4.8. Representación de las nueve combinaciones de las dos entradas triestado con las tres líneas
de salida binarias.
MANEJANDO EL TERCER ESTADO EN LAS E/S 173

Figura P4.9. Organigrama correspondiente para la codificación de las dos entradas triestado con las
tres salidas binarias.

A continuación, se presenta el programa fuente en Ensamblador con abundantes co-


mentarios para ser interpretado cómodamente. Encontrará un fichero con este programa
en el CD del libro bajo el título Ejem_2_2A.ASM.

; EJEMPLO 2_2
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
174 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

;El programa analiza las entradas triestado GP4 y GP5, las cuales
;pueden generar 32=9 combinaciones diferentes. Cada combinación se
;visualiza sobre tres salidas digitales (GP2-GP0) codificando un valor
;BCD para cada combinación según la siguiente tabla:

; GP5 GP4 GP2 GP1 GP0 BCD


; --- --- --- --- --- ---
; 0 0 0 0 0 0
; 0 1 0 0 1 1
; 1 0 0 1 0 2
; 1 1 0 1 1 3
; Z 0 1 0 0 4
; Z 1 1 0 1 5
; 0 Z 1 1 0 6
; 1 Z 1 1 1 7
; Z Z 0 0 0 0
;

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Def. de registros internos

;Ajusta valores de la palabra de configuración durante el ensamblaje:


;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= interno
;Otras configuraciones se pueden seleccionar según las necesidades

__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC

Temp equ 0x07 ;Variable temporal

org 0x00 ;Vector de Reset

Inicio movwf OSCCAL ;Almacena valor de calibración original


clrf GPIO ;Borra salidas
movlwb’11011111’
option ;Pin GP2/T0CKI = GP2
movlw b’11011000’
tris GPIO ;Config GP0-GP2 y GP5 como salidas

Loop clrf Temp ;Inicia la variable

;Chequea el estado de GP4 y añade a Temp la constante apropiada

Test_GP4 movlw b’11101000’


tris GPIO ;GP4 salida
bsf GPIO,4 ;GP4=1
movlw b’11111000’
tris GPIO ;GP4 entrada
btfss GPIO,4 ;GP4 = 1 ??
goto Test_GP5 ;No
movlw b’11101000’ ;Sí
tris GPIO ;GP4 salida
bcf GPIO,4 ;GP4=0
movlw b’11111000’
MANEJANDO EL TERCER ESTADO EN LAS E/S 175

tris GPIO ;GP4 entrada


btfsc GPIO,4 ;GP4 =0 ??
goto GP4_es_1 ;No
movlw.6
addwf Temp,F ;Sí, GP4=Z --> Temp = Temp + 6
goto Test_GP5
GP4_es_1 movlw.1
addwf Temp,F ;GP4=1 --> Temp = Temp + 1

;Chequea el estado de GP5 y añade a Temp la constante apropiada

Test_GP5 movlw b’11011000’


tris GPIO ;GP5 salida
bsf GPIO,5 ;GP5=1
movlw b’11111000’
tris GPIO ;GP5 entrada
btfss GPIO,5 ;GP5 = 1 ??
goto Continuar ;No
movlw b’11011000’ ;Sí
tris GPIO ;GP5 salida
bcf GPIO,5 ;GP5=0
movlw b’11111000’
tris GPIO ;GP5 entrada
btfsc GPIO,5 ;GP5 =0 ??
goto GP5_es_1 ;No
movlw.4
addwf Temp,F ;Sí, GP5=Z --> Temp = Temp + 4
goto Continuar
GP5_es_1 movlw.2
addwf Temp,F ;GP5=1 --> Temp = Temp + 2

;Cuando los valores obtenidos en Temp son iguales a 8 o 10, se ajusta


;a 7 y 0, respectivamente, según el enunciado

Continuar movlw.8
subwf Temp,W
btfss STATUS,Z ;Temp = 8 ??
goto Continuar_1 ;No
decf Temp,F ;Sí, Temp = 7 (111)
goto Continuar_2
Continuar_1 movlw.10
subwf Temp,W
btfsc STATUS,Z ;Temp = 10 ??
clrf Temp ;Sí, Temp = 0
Continuar_2 movf Temp,W
movwf GPIO ;Visualiza Temp
goto Loop

end
176 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

ENSAMBLADO

El programa fuente, llamado Ejem2_2.ASM, pasa a formar parte del proyecto que se
construye en el MPLAB IDE, y al ensamblarlo en dicho entorno, se obtiene el programa
ejecutable Ejem2_2.HEX.
Se puede simular el comportamiento del programa usando el simulador MPLAB
SIM introduciendo desde el teclado los valores que se desee que introduzcan GP4 y
GP5. Sólo la implementación física del proyecto con materiales reales, la grabación del
programa ejecutable en la FLASH del PIC12F508 y su posterior ejecución permitirán el
comportamiento real y sus resultados.

CONEXIÓN DE PERIFÉRICOS

Se muestra el conexionado de los periféricos utilizados que se hallan en la PIC School


en la Figura P4.9.

Figura P4.9. Conexionado físico de las dos entradas triestado y las tres salidas binarias.
MANEJANDO EL TERCER ESTADO EN LAS E/S 177

Figura P4.10. Fotografía del montaje de la experiencia sobre la PIC School.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Con el programa WinPic800 se graba el programa Práctica2_2.HEX en la memoria


FLASH del PIC12F508 de acuerdo con las indicaciones explicadas en anteriores expe-
riencias.
Al ejecutar el programa, se debe comprobar que, según los valores lógicos que introducen
GP4 y GP5, se deben encender los leds correspondientes según la tabla de la Figura P4.7.

EL PROGRAMA EN C

A continuación, se proporciona el programa en C que resuelve esta práctica y que está


incluido en el CD que acompaña al libro con el título Ejem2_2B.C.

// EJEMPLO 2_2
// Autor: Mikel Etxebarria
// (c) Ingeniería de Microsistemas Programados S.L.
// www.microcontroladores.com
// Bilbao 2006
//
//El programa trata de demostrar la posibilidad de detectar el tercer
//estado, el de alta impedancia (0-1-Z), posible en cualquier entrada.
//Se analizarán las entradas GP4 y GP5, lo que produce un total de 3^2=9
//combinaciones. Las salidas, GP2-GP0, visualizan, en BCD, el número
//de la combinación.
178 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

//Según la siguiente tabla codificadora:

// GP5 GP4 GP2 GP1 GP0 BCD


// --- --- --- --- --- ---
// 0 0 0 0 0 0
// 0 1 0 0 1 1
// 1 0 0 1 0 2
// 1 1 0 1 1 3
// Z 0 1 0 0 4
// Z 1 1 0 1 5
// 0 Z 1 1 0 6
// 1 Z 1 1 1 7
// Z Z 0 0 0 0

#include <12F508.h>

//Ajusta valores de la palabra de configuración durante el ensamblaje:


//Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= interno
//Otras configuraciones se pueden seleccionar según las necesidades

#fuses NOPROTECT,NOWDT,NOMCLR,INTRC

#use fast_io (B) //Acceso rápido a las E/S


#byte GPIO=0x06

int Temp; //Variable temporal

main()
{
output_b(0x0); // Borra las salidas
SETUP_TIMER_0(RTCC_INTERNAL); // Pin GP2/T0CKI = GP2
set_tris_b(0b11111000); // GP0-GP2 como salidas

while(1)
{
Loop: Temp=0; //Inicia variable temporal

//Chequea el estado de GP4 y añade a Temp la constante apropiada

Test_GP4:
set_tris_b(0b11101000); //GP4 salida
bit_set(GPIO,4); //GP4=1
set_tris_b(0b11111000); //GP4 entrada
if (bit_test(GPIO,4)==0) //GP4 = 0???
goto Test_GP5; //Sí

set_tris_b(0b11101000); //GP4 salida


bit_clear(GPIO,4); //GP4=0
set_tris_b(0b11111000); //GP4 entrada
if (bit_test(GPIO,4)==0) //GP4 = 0 ???
{Temp=Temp+6; //Sí, GP4=Z --> Temp=Temp+6
goto Test_GP5;}
Temp=Temp+1; //GP4=1 --> Temp=Temp+1
//Chequea el estado de GP5 y añade a Temp la constante apropiada
MANEJANDO EL TERCER ESTADO EN LAS E/S 179

Test_GP5:
set_tris_b(0b11011000); //GP5 salida
bit_set(GPIO,5); //GP5=1
set_tris_b(0b11111000); //GP5 entrada
if (bit_test(GPIO,5)==0) //GP5 = 0???
goto Continuar; //Sí

set_tris_b(0b11011000); //GP5 salida


bit_clear(GPIO,5); //GP5=0
set_tris_b(0b11111000); //GP5 entrada
if (bit_test(GPIO,5)==0) //GP5 = 0 ???
{Temp=Temp+4; //Sí, GP5=Z --> Temp=Temp+4
goto continuar;}
Temp=Temp+2; //GP5=1 --> Temp=Temp+2

//Cuando los valores obtenidos en Temp son iguales a 8 o 10, se ajusta


//a 7 y 0, respectivamente, según el enunciado

Continuar:

if (Temp==8)
Temp=7; //Sí Temp=8 --> Temp=7
if (Temp==10)
Temp=0; //Sí Temp=10 --> Temp=0
output_b(Temp); //Visualiza Temp
}
}
a
Controlando el tiempo
con «software»
5.
APLICACIÓN

P5.1. PRÁCTICA 3: UN INTERMITENTE POR PARPADEO


DE UN «LED»
Esta experiencia consiste en simular una luz intermitente controlando el tiempo de en-
cendido y apagado de la misma mediante las instrucciones del programa.

ENUNCIADO

Para simular una luz intermitente se utiliza un diodo led conectado a la línea de salida
GP0 de un PIC12F508 que funciona a 4 MHz con su reloj interno. El ciclo que repite
el programa continuamente consiste en encender el led durante 0,5 segundos y después
apagarlo el mismo tiempo.

PRINCIPIOS TEÓRICOS

En casi todas las aplicaciones hay que controlar períodos de tiempo y para ello existen
dos formas de conseguirlo:

1.a Por «hardware»: Se utiliza un dispositivo físico programable, llamado temporizador o


timer, cuyo circuito se halla integrado en el microcontrolador.
2.a Por «software»: Conociendo la frecuencia de funcionamiento del procesador y el tiem-
po que tarda en ejecutar las instrucciones, se controla el tiempo repitiendo la ejecución
de un conjunto de instrucciones que se suelen agrupar formando bucles que se repiten
incrementando o decrementando algunas variables hasta que alcanzan el valor 0.

El PIC12F508 tarda en ejecutar la mayoría de las instrucciones un ciclo de instrucción


o ciclo máquina (TC) que equivale a cuatro ciclos de reloj (T), de forma que TC = 4 · T.
Recuérdese que las instrucciones de salto tardan el doble. Si en este caso se trabaja con
la frecuencia interna de 4 MHz, T = 250 ns y TC = 1 µs, que es la duración de todas las
instrucciones, excepto las de salto, que tardan el doble.

181
182 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P5.1. Organigrama del bucle A que controla por software un tiempo de 768 µs.

Un ejemplo de un bucle típico para desarrollar una temporización se muestra en


la Figura P5.1. Se trata del bucle A, que consume un tiempo de 768 µs en ejecutarse.
Emplea una variable temporal Temp_0 que se inicia con el valor 0 con la instrucción
clrf Temp_0, que tiene un consumo de 1 µs, y luego se decrementa una unidad con la
instrucción decfsz Temp_0 hasta que Temp_0 vuelve a valer 0.

clrf Temp_0 ; Temp_0 = 0


BucleA decfsz Temp_0, f ; Temp_0 = Temp_0 – 1
goto BucleA ; Se salta a la instrucción con la etiqueta
; BucleA

La instrucción decfsz dura 1 µs cuando no se salta, mientras que la goto siempre dura
2 µs, y ambas se repiten 255 veces hasta que Temp_0 llega a valer 0 y el señalizador Z = 1,
lo que supone un tiempo de 255 · 3 = 765 µs. Al llegar Temp_0 a valer 0, la instrucción
decfsz rompe el bucle al brincar y dura 2 µs, que, unido al otro µs que tarda clrf, hacen
un total de 765 + 2 + 1 = 768 µs.

NUEVAS INSTRUCCIONES

En la construcción de bucles de temporización se suele emplear la instrucción condicio-


nal decfsz, que decrementa el contenido de una variable hasta que vale 0, momento en
el que «brinca» la instrucción siguiente, es decir, salta una sola instrucción. Sólo cuando
la variable toma el valor 0 y entonces Z = 1, se produce el brinco, y únicamente en esa
ocasión dicha instrucción tarda en ejecutarse 2 µs, en los demás casos dura la mitad.
CONTROLANDO EL TIEMPO CON «SOFTWARE» 183

MATERIALES NECESARIOS

Se precisan los siguientes materiales:

• PIC School.
• PIC12F508.
• Cables de conexión.

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

En el organigrama del BucleA mostrado en la Figura P5.1 se conseguía un delay o


temporización de 768 µs, tiempo insuficiente para nuestro propósito de parpadear 0,5 s
el led. Al BucleA se le incluye en otro bucle, llamado BucleB, que utiliza la variable
temporal Temp_1, que se comienza cargando con el valor decimal 130. Entonces, las
instrucciones decfsz Temp_1 y goto consumen 3 µs y se ejecutan 129 veces, lo que su-
pone un tiempo de 387 µs, a los que hay que añadir otros 3 µs cuando rompe el bucle
decfsz, lo que totaliza 390 µs. Como el BucleA está incrustado en el BucleB, se repite
130 veces, lo que significa 130 · 768 = 99840 µs, que sumados a los 390 µs anteriores
alcanzan los 100.231 µs. A continuación, se ofrece el programa del BucleB, en el que los
valores expresados en decimal se representan con un punto previo.

BucleB movlw .130 ; W = 130 (decimal)


movwf Temp_1 ; Temp_1 = 130
Delay_1 clrf Temp_0 ; Temp_0 = 0
Delay_2 decfsz Temp_0, f
goto Delay_2 ; Bucle de 256 • 3 = 768 µs
decfsz Temp_1, f
goto Delay_1, f ; Repite BucleA 130 veces
end

El BucleB tarda en ejecutarse 0,100231 s, y como el tiempo a controlar en el parpa-


deo es de 0,5 s, hay que repetirlo cinco veces, para lo cual se emplea otro bucle con una
variable temporal Temp_2 que se carga con 5 (Fig. P5.2).
Si Temp_2 = 5, las instrucciones decfsz Temp_2 y goto consumen 3 µs y se repiten
cuatro veces, con lo que se obtiene un delay de 12 µs, a los que se añaden otros 2 para
cargar 5 en Temp_2 y otro más que dan un total de 15 µs. Como los bucles A y B se re-
piten cinco veces, la temporización final que se obtiene es de 501.171 µs, que aproxima-
damente son los 0,5 segundos que precisábamos para el parpadeo del led (Fig. P5.3).
A continuación, se presenta el programa fuente \12F508ASM\Ejemp_3A.ASM en
Ensamblador con comentarios aclaratorios. Este programa lo podrá encontrar en el CD
que acompaña al libro.
184 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P5.2. Organigrama del bucle B, que dura aproximadamente 0,1 segundos.

Figura P5.3. Organigrama del bucle C, con el que se alcanzan los 0,5 segundos de temporización.
CONTROLANDO EL TIEMPO CON «SOFTWARE» 185

;EJEMP_3A.ASM
; EJEMPLO 3
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;En esta experiencia se genera una onda cuadrada de 1 Hz sobre
;la salida GP0, conectada a un led. Éste se mantiene encendido 0.5 s y
;apagado otros 0.5 s. Se supone que la frecuencia de trabajo es
;de 4 MHz

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Definiciones de registros internos
;Ajusta los valores de la palabra de configuración durante el
;ensamblaje: Protección de código =OFF, WDT=OFF, MCLR=Interno y
;OSC= RC interno. Estas u otras configuraciones se pueden
;seleccionar según las necesidades

__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC
Temp_0 equ 0x07
Temp_1 equ 0x08
Temp_2 equ 0x09 ;Variables temporales
org 0x00 ;Vector de Reset
Inicio movwf OSCCAL ;Almacena valor calibración original
clrf GPIO ;Borra salidas
movlw b’11011111’
option ;Pin GP2/T0CKI = GP2
movlw b’11111110’
tris GPIO ;Configura GP0 como salida
Loop movlw b’000000001’
xorwf GPIO,F ;GP0 cambia de estado
;Bucle de temporización de 0.5 seg. en base a una frec. de trabajo
;de 4 MHz
movlw.5
movwf Temp_2 ;El bucle externo se repite 5 veces
Delay_0 movlw.130
movwf Temp_1 ;El bucle interno se repite 130 veces
Delay_1 clrf Temp_0 ;El bucle se repite 255 veces
Delay_2 decfsz Temp_0,F
goto Delay_2 ;Este bucle interno tarda en
;ejecutarse 768 uS aprox. (256 x 3uS)
decfsz Temp_1,F ;Este intermedio repite el anterior
goto Delay_1 ;130 veces, haciendo un total de
;0.100234 s
decfsz Temp_2,F
goto Delay_0 ;El externo se repite 5 veces con un
;total de 0.499 s
goto Loop

End
186 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

ENSAMBLADO

Usando el MPLAB IDE, se procede al ensamblado del programa fuente PROYEC-


TO3.MCW para obtener el programa ejecutable PROYECTO3.HEX.

CONEXIÓN DE PERIFÉRICOS
En este proyecto sólo se utiliza un led conectado a la línea GP0, que actúa como salida
(Fig. P5.4). Como GP0 se usa en la fase de grabación y lectura de la memoria FLASH
de programa para soportar los datos que se transfieren (GP0/ICSP DAT), se recomienda
usar la línea RB7 para no tener que desconectar GP0 al led durante la fase de grabación
del programa.

Figura P5.4. Conexionado del led a la línea RB7 (GP0) de PIC School.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Mediante el programa WinPic800 se graba el programa Ejem_3A.HEX en el


PIC12F508, y pasando el conmutador a la posición RUN y colocando el jumper JP4 en
la posición GP3 (2-3), se ejecuta el programa y se verifica el correcto comportamiento
del hardware y software al parpadear cada 0,5 segundos el led.

EL PROGRAMA EN C

A continuación, se ofrece el programa de este ejercicio en lenguaje C. Mediante la fun-


ción Delay_ms( ), resulta muy cómodo, fácil y rápido diseñar cualquier temporización
mediante el lenguaje C.
CONTROLANDO EL TIEMPO CON «SOFTWARE» 187

// EJEMPLO 3
// Autor: Mikel Etxebarria
// (c) Ingeniería de Microsistemas Programados S.L.
// www.microcontroladores.com
// Bilbao 2006
//
//Este ejemplo consiste en producir una onda cuadrada de 1 Hz sobre
//la salida GP0, conectada a un led. Éste se mantiene encendido 0.5 s y
//apagado los otros 0.5 s. Se supone que la frecuencia de trabajo es
//de 4 MHz

#include <12F508.h>

//Ajusta los valores de la palabra de configuración durante


//ensamblaje:
//Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
//Estas u otras configuraciones se pueden seleccionar según necesidades

#fuses NOPROTECT,NOWDT,NOMCLR,INTRC

#use fast_io (B) //Acceso rápido a las E/S


#use delay(clock=4000000) //Activa las temporizaciones en base
//al clock de trabajo
#byte GPIO=0x06

main()
{
output_b(0x0); //Borra las salidas
SETUP_TIMER_0(RTCC_INTERNAL); //Pin GP2/T0CKI = GP2
set_tris_b(0b11111110); //GP0 se configura como salida

while(1)
{
GPIO=(GPIO ^ 0x01); //Cambio de estado en GP0
delay_ms(500); //Temporiza 500 mS=0.5 s
}
}

TRABAJO PERSONAL

Confeccionar un programa que genere sobre el led conectado a la línea de salida GP0
del PIC12F508 una onda asimétrica que durante 0,5 segundos saque nivel alto y durante
1,25 segundos nivel bajo (Fig. P5.5).
188 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P5.5. Onda asimétrica que durante 0,5 segundos tiene el nivel alto y durante 1,25 segundos el
nivel bajo.
a
Controlando el tiempo
con «hardware». 6.
El temporizador TMR0 APLICACIÓN

P6.1. PRÁCTICA 4: GENERACIÓN DE UNA ONDA CUADRADA


ENUNCIADO

Como en la anterior experiencia, en ésta también se trata de hacer parpadear un led co-
nectado en la línea GP0 cada 0,5 s, pero en esta ocasión el control del tiempo lo llevará a
cabo el circuito temporizador TMR0 que se halla integrado en el PIC12F508.

PRINCIPIOS TEÓRICOS

En la aplicación anterior se controló el tiempo mediante la ejecución de un determinado


número de instrucciones. El inconveniente de este procedimiento es que el microcon-
trolador no puede realizar ninguna tarea mientras ejecuta el software destinado a la
temporización.
La temporización hardware consiste en usar un contador digital independiente o timer
de tipo ascendente o descendente que evoluciona automáticamente a una frecuencia co-
nocida hasta que se desborda, momento en el que finaliza el control del tiempo. Dicho
contador puede ser leído o escrito y el microcontrolador puede atender otras tareas y eje-
cutar instrucciones en paralelo con la evolución del timer, aunque de cuando en cuando
debe comprobar el valor del contador.
El PIC12F508 dispone de un contador ascendente interno de 8 bits llamado TMR0
que puede actuar como un temporizador o como un contador de eventos externos (im-
pulsos procedentes del exterior) (Fig. P6.1).
El TMR0 es un registro SFR que ocupa la posición 1 del área de datos. Cuando se
lee TMR0, se obtiene el valor que tiene en ese momento. Cuando se escribe, se carga
TMR0 con un valor que se va incrementando automáticamente al ritmo de los impulsos
de reloj hasta que se desborda.
La fuente de los impulsos de reloj que incrementan TMR0 procede del oscilador prin-
cipal (FOSC/4) o del exterior introducidos por la patita GP2/T0CKI, según el bit T0CS del
registro OPTION valga 1 o 0, respectivamente. El bit T0SE de OPTION (Fig. P6.2) selec-
ciona el flanco ascendente o descendente con el que evoluciona el contador.

189
190 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P6.1. Esquema interno del temporizador TMR0 del PIC12F508.

Los impulsos seleccionados por MPX1 en la Figura P6.1 pueden aplicarse al TMR0
directamente o a través de un predivisor de frecuencia seleccionable con el bit PSA de
OPTION. Los bits PS2:0 de OPTION determinan el valor por el que se dividen los im-
pulsos de reloj en el predivisor en un rango comprendido entre 1:2 a 1:256.
Cuando se trabaja a 4 MHz, el ciclo de instrucción FOSC · 4 = 1 µs, y si se elige el
rango 1:256 en el predivisor, la mínima temporización será de 256 µs cuando el TMR0
se desborde con un impulso, mientras que la máxima será de 256 · 256 = 65.536 µs
cuando se desborde al cabo de 256 impulsos. El valor del tiempo del retardo se calcula
con la siguiente fórmula:

T = (4/FOSC) · (256 – Valor cargado en TMR0) · Rango predivisor

Si el bit T0CS = 1, los impulsos de reloj activos son los aplicados desde el exterior
por la patita GP2/T0CKI, y en esta situación, el TMR0 actúa como contador de aconte-
cimientos exteriores.
Como TMR0 es un contador ascendente, el valor que hay que cargarle en una tem-
porización será el complemento. Por eso, si se quiere que el TMR0 cuente diez impulsos
de reloj, habrá que cargarle con el complemento de 10 a 256, es decir, con 246, para que
al cabo de diez impulsos se desborde y el TMR0 vuelva a contener el valor 0.

NUEVAS INSTRUCCIONES

Mediante la instrucción movlw b’11010111’ seguida de option se carga en el registro


OPTION el valor necesario para configurar al predivisor con el rango 256 asignado al
TMR0, el empleo del oscilador interno del microcontrolador y la selección de la línea
multifunción GP2/T0CKI como línea de E/S (Fig. P6.2).

Figura P6.2. Distribución de los bits de control en el registro OPTION.


CONTROLANDO EL TIEMPO CON «HARDWARE» 191

MATERIALES NECESARIOS

• PIC School.
• PIC12F508.
• Cables de conexión.

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

El organigrama de la Figura P6.3 cambia el estado de la línea de salida GP0 cada 0,5 s,
tiempo que se consigue repitiendo diez veces un delay del timer TMR0 de 50 ms. El TMR0
se inicializa con el complemento del valor 195 para conseguir 195 · 256 = 49,9 ms cuando
se trabaja a una frecuencia de 4 MHz.
Obsérvese en el programa fuente \12F508ASM\Ejem_4A.ASM en Ensamblador
que se proporciona a continuación, y que se puede encontrar en el CD que acompaña

Figura P6.3. Organigrama del programa que genera una onda cuadrada de 1 Hz con el TMR0.
192 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

al libro, que cuando se precisa que el TMR0 cuente 195 impulsos hay que cargarle el
complemento a 256 de dicho valor, lo cual se consigue con la instrucción movlw ~.195
seguida por la instrucción movwf TMR0. El punto previo a un valor significa que éste
está expresado en un decimal.

;
; EJEMPLO 4
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;Este ejemplo consiste en producir una onda cuadrada de 1 Hz sobre
;la salida GP0, conectada a un led. Este se mantiene encendido 0.5 s y
;apagado los otros 0.5 s. Se supone que la frecuencia de trabajo es
;de 4 MHz y que se emplea el TMR0

List p=12F508 ;Tipo de procesador


Incluye «P12F508.INC» ;Definiciones de registros internos

;Ajusta los valores de la palabra de configuración durante el


;ensamblaje:
;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
;Estas u otras configuraciones se pueden seleccionar según las
;necesidades

__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC

Temp_0 equ 0x07 ;Variable temporal

org 0x00 ;Vector de Reset

Inicio movwf OSCCAL ;Almacena valor de calibración original


clrf GPIO ;Borra salidas
movlw b’11010111’ ;Preescaler 1:256 asignado al TMR0 y
option ;oscilador interno. Pin GP2/T0CKI
;actúa como GP2
movlw b’11111110’
tris GPIO ;Configura GP0 como salida

Loop movlw b’000000001’


xorwf GPIO,F ;GP0 cambia de estado

;Bucle de temporización de 0.5 s. A una frecuencia de trabajo de


;4 MHz, con un preescaler de 256, el TMR0 se carga con 195
;(su complemento) por lo que desborda y pasa a 0 al de 50 ms
;(195*256*1=49920 us).

movl w.10
movwf Temp_0 ;El bucle externo se repite 10 veces
Delay_0 movlw ~.195 ;W se carga con 256-195
movwf TMR0 ;El TMR0 se carga con el complemento
;de 195 en decimal.
CONTROLANDO EL TIEMPO CON «HARDWARE» 193

Delay_1 movf TMR0,W ;TMR0 se mueve a W y Z=1 si es 0.


btfss STATUS,Z ;Desborda al de 50 ms
goto Delay_1
decfsz Temp_0,F
goto Delay_0 ;Se esperan 10 desbordamientos para
;conseguir 0.5 s
goto Loop

end

Cuando se ejecuta la instrucción movf TMR0, W (su equivalente en C es while


(get_timer0( )! = 0)), se consigue leer el valor actual del TMR0, y si es 0, se activa el
señalizador Z del registro STATUS.

ENSAMBLADO

Hay que seguir los pasos ya conocidos de otras aplicaciones para traducir el programa
Ejem_4A.ASM al programa ejecutable Ejem_4A.HEX en el entorno MPLAB IDE.

CONEXIÓN DE PERIFÉRICOS

Sólo se precisa un led, como se muestra en la Figura P6.4.

Figura P6.4. Conexionado de un led a la patita RB7 (GP0) de la PIC School.


194 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez grabado el programa ejecutable en la memoria FLASH del microcontrolador, se


procede a su ejecución para comprobar su correcto funcionamiento, que se visualiza en
el parpadeo del led cada 0,5 s.
En este ejemplo no se aprecia bien la importancia del TMR0 porque el micro-
controlador está constantemente dedicado a comprobar si se ha desbordado. Pero
se podía haber dedicado a realizar otras tareas en los 50 ms existentes entre el final
de una temporización y la siguiente. Para que el microcontrolador no tenga que es-
tar permanentemente pendiente de detectar cuándo se desborda el TMR0, existen
modelos de PIC que producen una «interrupción» en ese instante, lo que permite
al procesador dedicarse a otras cosas, mientras que el timer cuenta el tiempo que le
han encomendado. Por su enorme sencillez, el PIC12F508 no genera ningún tipo de
interrupción.

EL PROGRAMA EN C

Se propone a continuación el programa fuente Ejem_4B.C en lenguaje C:

// EJEMPLO 4
// Autor: Mikel Etxebarria
// (c) Ingeniería de Microsistemas Programados S.L.
// www.microcontroladores.com
// Bilbao 2006
//
//Este ejemplo consiste en producir una onda cuadrada de 1 Hz sobre
//la salida GP0, conectada a un led. Este se mantiene encendido 0.5 s y
//apagado los otros 0.5 s. Se supone que la frecuencia de trabajo es
//de 4 MHz y que se emplea el TMR0

#include <12F508.h>

//Ajusta los valores de la palabra de configuración durante el


//ensamblaje:
//Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
//Estas u otras configuraciones se pueden seleccionar según las
//necesidades

#fuses NOPROTECT,NOWDT,NOMCLR,INTRC

#use fast_io (B) //Acceso rápido a las E/S


#byte GPIO=0x06
int Temp_0;
main()
{
output_b(0x0); //Borra las salidas

//Pin GP2/T0CKI = GP2; TMR0 interno con preescaler de 1:256


SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_256);
CONTROLANDO EL TIEMPO CON «HARDWARE» 195

set_tris_b(0b11111110); //GP0 se configura como salida

while(1)
{
GPIO=(GPIO ^ 0x01); //Cambio de estado en GP0

for (Temp_0=1;Temp_0<11;++Temp_0) //El bucle se repite 10 veces


{
set_timer0(~195); //TMR0 con 195 (195*256=49,9 ms)
while (get_timer0()!=0); //Esperar 50 ms
}
}
}

P6.2. CONTADOR DE EVENTOS EXTERNOS

ENUNCIADO

En esta experiencia se van a aplicar los impulsos que produce el generador lógico exis-
tente en la PIC School al TMR0 y cuando se detectan diez flancos ascendentes en la línea
de entrada GP2/T0CKI se produce un cambio en el estado lógico de la línea GP0 que
está configurada como salida y tiene conectado un led.
Para poder contar a simple vista los impulsos del generador se recomienda utilizar
una frecuencia reducida de 1 Hz.

PRINCIPIOS TEÓRICOS

Ahora el TMR0 se emplea para contar impulsos externos que se aplican sobre la línea
multifunción GP2/T0CKI, que funciona en modo T0CKI, es decir, como entrada de
impulsos externos.
Los impulsos que hay que contar proceden del generador lógico de la PIC School
con frecuencias de salida de 1 Hz, 10 Hz, etc.
Cada vez que se apliquen diez impulsos en la patita T0CKI, la línea GP0 configura-
da como salida y conectada a un led cambia su estado lógico, produciendo el parpadeo.

MATERIALES NECESARIOS

• PIC School.
• PIC12F508.
• Cable de conexiones.

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

En la Figura P6.5 se muestra el organigrama al que responde la presente aplicación.


196 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P6.5. Organigrama correspondiente al programa destinado a contar diez impulsos externos
aplicados a la patita T0CKI.

A continuación, se presenta el programa fuente Ejem_4-2.ASM en lenguaje En-


samblador.

;
; EJEMPLO 4_2
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;Este ejemplo consiste en contar, mediante el TMR0, el número de pulsos
;que se aplican por GP2/T0CKI. Cuando se detecten 10 flancos ascendentes
;se produce un cambio de estado en GP0, haciendo parpadear el led que
;tiene conectado

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Definiciones de registros internos

;Ajusta los valores de la palabra de configuración durante el ensamblaje:


CONTROLANDO EL TIEMPO CON «HARDWARE» 197

;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno


;Estas u otras configuraciones se pueden seleccionar según las
;necesidades
__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC
org 0x00 ;Vector de Reset
Inicio movwf OSCCAL ;Almacena valor de calibración original
clrf GPIO ;Borra salidas
movlw b’11101111’ ;Preescaler 1:1 asignado al TMR0 modo contador
option ;flanco ascend. Pin GP2/T0CKI=T0CKI
movlw b’11111110’
tris GPIO ;Configura GP0 como salida
Loop movlw b’000000001’
xorwf GPIO,F ;GP0 cambia de estado
movlw ~.9
movwf TMR0 ;El TMR0 se carga con 10-1
Cont_1 movf TMR0,W
btfss STATUS,Z ;Desborda al llegar 10 pulsos
goto Cont_1
goto Loop
end

CONEXIÓN DE PERIFÉRICOS

Además del diodo del parpadeo S0 conectado a GP0 (RB7), existe otro (S7) que se conecta
a la salida del generador lógico para visualizar los impulsos que genera (Fig. P6.6).

Figura P6.6. Conexión de los periféricos que están incluidos en la PIC School.
198 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

La línea RB7 se conecta al diodo led S0, que cambiará de estado cada diez impulsos
que se apliquen en la línea T0CKI desde el generador lógico de la PIC School. Los im-
pulsos del generador lógico se visualizan mediante el led S0.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DE SU FUNCIONAMIENTO

Una vez editado el programa fuente, ensamblado y grabado en la FLASH del microcon-
trolador, el programa ejecutable, para verificar el correcto comportamiento del hardware
y el software, se procede a su ejecución seleccionando la frecuencia de 1 Hz en el gene-
rador lógico de la PIC School. Mediante el led S7 se aprecia que cada diez flancos as-
cendentes cambia el estado lógico de la línea de salida RB7 (GP0), en donde se obtiene
un impulso completo 0-1-0 cada veinte impulsos del generador. El programa funciona
como un divisor de frecuencia de 1:20.
Si se selecciona en el generador lógico la frecuencia de 1 KHz, se puede comprobar
con un osciloscopio que en la línea RB7 (GP0) se obtiene una frecuencia de 50 Hz.

P6.3. DOBLADOR DE TENSIÓN O BOMBA DE CARGA


ENUNCIADO

Con esta experiencia se implementa un doblador de tensión, también llamado «bomba


de carga», que proporciona una tensión de salida de casi el doble valor que la de entrada,
que en este caso consistirá en una onda cuadrada de 10 KHz procedentes del TMR0.

PRINCIPIOS TEÓRICOS

El esquema eléctrico del doblador de tensión se presenta en la Figura P6.7. Por su


entrada, que corresponde con la patita GP0 (RB7) del PIC12F508, se aplica una onda
cuadrada de 10 KHz que es generada por el TMR0.

Figura P6.7. Esquema eléctrico de la bomba de carga o doblador de tensión.


CONTROLANDO EL TIEMPO CON «HARDWARE» 199

Cuando la señal de entrada Vin vale 0, el diodo D1 queda polarizado directamente y el


condensador de 1 nF se carga con la tensión VCC – Vd, siendo Vd la tensión directa que ab-
sorbe D1. Cuando la señal de entrada Vin tiene nivel lógico alto, D1 queda polarizado inver-
samente y D2 directamente, cargándose el condensador de 1 µF con VCC – Vd más el valor
que se había acumulado en el ciclo anterior en el otro condensador, obteniendo un total de
Vout = 2 · VCC – 2 · Vd
La tensión de polarización directa del diodo Vd es muy pequeña, con lo que Vout
toma un valor aproximadamente del doble del de la alimentación.

MATERIALES NECESARIOS

• PIC School.
• PIC12F508.
• Dos diodos 1N4148.
• Un condensador de 1 nF.
• Un condensador electrolítico de 1 µF.
• Cables de conexión.

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

El programa que implementa la bomba de carga simplemente tiene la misión de sacar


por la patita GP0 (RB7) una onda cuadrada de 10 KHz. Para ello, el TMR0 pasa a GP0
de un nivel lógico al inverso cada 50 µs. Se supone que el PIC12F508 trabaja a 4 MHz y
el predivisor de frecuencia se selecciona para el rango 1:4, cargándose en TMR0 con el
complemento de 8 para que se desborde al cabo de 8 · 4 · 1 = 32 µs, que sumados a los
tiempos requeridos por las otras instrucciones hacen un total de 50 µs, lo que conforma
un período de 100 µs equivalente a una frecuencia de 10 KHz.
A continuación, se presenta el programa fuente Ejem_4_3A.ASM, que genera una
onda cuadrada de 10 KHz por la patita GP0. Dicho programa está contenido en el CD
que acompaña al libro.

;
; EJEMPLO 4_3
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;Con este programa se genera una onda cuadrada de 10 KHz sobre la
;salida GP0. Ésta se conecta a una bomba de carga o doblador de tensión
;capaz de duplicar la tensión de alimentación. Se supone que la
;frecuencia de trabajo es de 4 MHz y que se emplea el TMR0

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Definiciones de registros internos
200 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

;Ajusta los valores de la palabra de configuración durante el


;ensamblaje:
;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
;Estas u otras configuraciones se pueden seleccionar según las
;necesidades

__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC

org 0x00 ;Vector de Reset

Inicio movwf OSCCAL ;Almacena valor de calibración original


clrf GPIO ;Borra salidas
movlw b’11010001’ ;Preescaler 1:4 asignado al TMR0 y
option ;oscilador interno. GP2/T0CKI = GP2
movlw b’11111110’
tris GPIO ;Configura GP0 como salida

Loop movlw b’000000001’


xorwf GPIO,F ;GP0 cambia de estado

;Bucle de temporización de 50 us. A una frecuencia de trabajo de 4 MHz,


;con un preescaler de 1:4, el TMR0 se carga con 8 (su complemento), por
;lo que desborda y pasa a 0 al de 32 us (8*4*1=32 us). Hay que añadir
;el tiempo consumido por las instrucciones de carga, salto, etc.
;En total, se obtiene la salida GP0 un período aprox. de 100 us
;correspondiente a una frecuencia de 10 KHz.

movlw ~.8
movwf TMR0 ;El TMR0 se carga con 25
Delay_1 movf TMR0,W
btfss STATUS,Z ;Desborda al de 50 us
goto Delay_1

goto Loop

end

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez conexionados en la PIC School los componentes que configuran la bomba de
carga, editado el programa fuente, ensamblado y obtenido el programa ejecutable, se
graba en la FLASH del PIC12F508 y luego se coloca el conmutador principal de la PIC
School en la posición RUN y con la ayuda de un polímetro se mide el voltaje de salida
del doblador de tensión entre los bornes del condensador electrolítico de 1 µF, que de-
berá ser algo inferior a 10 V (Fig. P6.8). En un osciloscopio se puede visualizar la onda
cuadrada de 10 KHz que sale por la patita RB7 (GP0).
CONTROLANDO EL TIEMPO CON «HARDWARE» 201

Figura P6.8. Fotografía del montaje de la bomba de carga en la PIC School con el valor aproximado de
la tensión que se obtiene en su salida.

EL PROGRAMA EN C

Se presenta a continuación y está recogido en el CD que acompaña esta obra con el


nombre de Ejem_4_3B.c:

// EJEMPLO 4_3
// Autor: Mikel Etxebarria
// (c) Ingeniería de Microsistemas Programados S.L.
// www.microcontroladores.com
// Bilbao 2006
//
//Con este programa se genera una onda cuadrada de 10 KHz sobre la
//salida GP0. Ésta se conecta a una bomba de carga o doblador de tensión
//capaz de duplicar la tensión de alimentación. Se supone que la
//frecuencia de trabajo es de 4 MHz y que se emplea el TMR0

#include <12F508.h>

//Ajusta los valores de la palabra de configuración durante el


//ensamblaje:
//Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
//Estas u otras configuraciones se pueden seleccionar según necesidades

#fuses NOPROTECT,NOWDT,NOMCLR,INTRC
202 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

#use fast_io (B) //Acceso rápido a las E/S


#byte GPIO=0x06
int Temp_0;
main()
{
output_b(0x0); //Borra las salidas

//Pin GP2/T0CKI = GP2; TMR0 interno con preescaler de 1:4


SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_4);

set_tris_b(0b11111110); //GP0 se configura como salida

while(1)
{
GPIO=(GPIO ^ 0x01); //Cambio de estado en GP0
set_timer0(~8); //TMR0 se carga con 8 (8*4=32us)
while (get_timer0()!=0); //Esperar 32 us
}
}

P6.4. TRABAJO PERSONAL

TMR0 COMO TEMPORIZADOR

a) Generador de pulsos. Por la línea GP0 configurada como salida se desea obtener una
señal periódica y asimétrica, como se muestra en la Figura P6.9. La duración del pulso
con nivel alto es de 0,25 s y la del período de 1,75 s. Para visualizar el resultado, se co-
necta el diodo led S0 a la patita GP0.
Una vez comprobado su correcto funcionamiento, se pide realizar las modificaciones
necesarias para que la anchura del pulso positivo sea de 60 µs y la del período de 200 µs.
Intente verificar las señales en GP0 con un osciloscopio.

Figura P6.9. Señal asimétrica de 1,75 s de período y 0,25 s de pulso positivo.

b) Generador de onda cuadrada. Se trata de obtener por la línea GP0 una onda cua-
drada de frecuencia variable. El valor máximo de dicha frecuencia será de unos 20 KHz.
Los interruptores E2-E0 conectados a las líneas de entrada GP5, GP4 y GP3, respectiva-
CONTROLANDO EL TIEMPO CON «HARDWARE» 203

mente, permitirán modificar la frecuencia de salida según la combinación binaria de los


interruptores. De esta forma, el generador proporcionará ocho frecuencias diferentes.

TMR0 EN MODO CONTADOR

Mediante los interruptores E3-E0 conectados a las líneas GP5, GP4, GP3 y GP1, res-
pectivamente, se introduce un valor que suponga el número de pulsos a contar. Dichos
pulsos se aplican a GP2 desde el generador lógico de la PIC School. La línea de salida
GP0 se halla conectada al led S0 y su estado cambia cuando finaliza la cuenta de los
impulsos.
a
Manejando el Perro Guardián,
el modo de bajo consumo 7.
y el «reset» APLICACIÓN

P7.1. EDUCANDO AL PERRO GUARDIÁN


ENUNCIADO

El Perro Guardián o Watch Dog Timer (WDT) tiene una estructura similar al TMR0, pero
cuando se desborda produce un reset del sistema. También se produce un reset cuando se
conecta la alimentación al microcontrolador (Power Up), que recibe el nombre de POR
(Power On Reset).
En esta experiencia se consigue que el WDT se desborde cada 1,1 s. El led S1 de PIC
School se conecta a la línea GP1 (RB6) y se enciende en cuanto se conecta la alimenta-
ción. Cuando se desborda el WDT, el led S1 se apaga y cambia el estado del led S0 que
se halla conectado a la línea GP0 (RB7) (Fig. P7.1).

PRINCIPIOS TEÓRICOS

El WDT es un temporizador independiente cuya frecuencia de trabajo la establece un


oscilador propio. Su funcionamiento se puede habilitar o deshabilitar desde la Palabra de
Configuración durante el proceso de grabación del programa.

Figura P7.1. El led S1 se enciende al conectarse la alimentación al sistema (Power Up) y se apaga al
desbordarse el WDT. El led S0 cambia de estado cada vez que se desborda el WDT.

205
206 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P7.2. Estructura interna del Perro Guardián.

Cuando WDT está habilitado, se produce reset cada vez que se desborda. Si se desea
evitar el desbordamiento hay que ejecutar la instrucción clrwdt, que «refresca» o inicia-
liza al WDT, aunque sigue funcionando.
¿Para qué sirve el WDT? Para sacar al procesador de situaciones de bloqueo o
bucles infinitos o esperas interminables de acontecimientos que nunca se producen. En
estas ocasiones conviene provocar un reset manual o apagar y encender el procesador
(Power On Reset), aunque cuando se producen estas situaciones anómalas es muy pro-
bable que el usuario no se halle presente o que el equipo esté situado en un lugar remoto
e inaccesible. Si funciona el WDT y la instrucción clrwdt está situada estratégicamente
en el programa de forma que se ejecuta periódicamente, se evita el desbordamiento del
WDT. Entonces, si se bloquea el programa y no se ejecutan normalmente las instruc-
ciones y tampoco la clrwdt, el WDT se desborda, provocando el reset y reiniciando el
sistema automáticamente sin intervención humana.
En la Figura P7.2 se muestra la estructura interna del Perro Guardián.
El WDT dispone de su propio oscilador interno, y si el bit PSA del registro OPTION
vale 0, la señal de salida de WDT provoca directamente el reset del sistema. Si PSA = 1,
la salida del WDT se aplica al posdivisor de frecuencia o «posescaler», que es el mismo
que actúa como predivisor del TMR0. El rango del posdivisor está comprendido desde
1:1 a 1:128 de acuerdo con los bits PS2-PS0 de OPTION.
Tanto si funciona el posdivisor del WDT como si lo hace de predivisor del TMR0, la
función es dividir por el rango seleccionado la frecuencia de trabajo. El bit PSA asigna
el divisor de frecuencia al TMR0 o al WDT.
El oscilador propio del WDT sigue funcionando cuando se detiene el sistema; por
ejemplo, cuando se entra en el modo de bajo consumo o standby.
La temporización normal, por defecto, del WDT, o sea, el tiempo en el que se des-
borda es de 18 ms, y dependiendo del rango que se seleccione para el posdivisor, se
puede alcanzar los 2,3 s cuando el rango es de 1:128.
La instrucción clrwdt reinicia o refresca el temporizador WDT y al posdivisor. La instruc-
ción sleep introduce al procesador en el modo de bajo consumo al mismo tiempo que se refres-
MANEJANDO EL PERRO GUARDIÁN, EL MODO DE BAJO CONSUMO Y EL «RESET» 207

ca el WDT y al posdivisor, pero el Perro Guardián sigue funcionando hasta que se desborde o
hasta que el procesador se despierte del modo de bajo consumo al generarse un reset.
Cada vez que se desborda el WDT, el bit TO# del registro STATUS se pone a 0. Será
este señalizador el que se use en la práctica para detectar el desbordamiento del WDT.

NUEVAS INSTRUCCIONES

Para configurar el posdivisor de WDT con el rango 1:64 y asignar a la línea multifunción
GP2/T0CKI la función de línea de E/S GP2 hay que utilizar las dos siguientes instruc-
ciones:

movlw b’11101110’
option

En esta situación, el WDT se desborda en 1,1 s (64 · 18 ms).


Con la instrucción btfsc STATUS, NOT_TO se examina si el bit TO# vale 0 y se
utiliza para detectar si se ha desbordado el WDT. La instrucción clrwdt reinicia el valor
del WDT, la del posdivisor y pone TO# a 1.

MATERIALES NECESARIOS

• PIC School.
• PIC12F508.
• Cables de conexión.

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

En el organigrama de la Figura P7.3, cuando se genera el reset por conexión de la alimenta-


ción (POR), al valer TO# = 1, se activa GP1 y se desactiva GP0, entrando en un bucle infi-
nito. Al desbordarse WDT, TO# pasa a valer 0 y cambia el estado de GP0, se refresca WDT
y se entra en un bucle infinito del que no se sale hasta que se vuelve a desbordar WDT.
A continuación, se presenta el programa Ejem_5A.ASM con abundantes comenta-
rios y que puede encontrarse en el CD que acompaña al libro.

ENSAMBLADO

Al ensamblar en el entorno MPLAB IDE el programa \12F508\Ejem_5A. ASM se ob-


tiene el ejecutable con extensión .HEX.

CONEXIÓN DE PERIFÉRICOS

Los dos leds que actúan como periféricos en esta experiencia se conectan como se indica
en el esquema de la Figura P7.4.
208 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P7.3. Organigrama para la detección del desbordamiento del WDT.

;
; EJEMPLO 5
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;Demostrar el funcionamiento del WDT. El programa activa GP1 y queda
;en un bucle infinito, lo que provoca el desbordamiento del WDI, momento
;en que la salida GP0 cambia de estado. Esto ocurre cada 1.1 s al
;emplear posescaler 1:64

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Definiciones de registros internos
;Ajusta los valores de la palabra de configuración durante el
;ensamblaje:
;Protección de código =OFF, WDT=ON, MCLR=Interno y OSC= RC interno
;Estas u otras configuraciones se pueden seleccionar según las ne-
cesidades

__config _CP_OFF&_WDT_ON&_MCLRE_OFF&_IntRC_OSC

org 0x00 ;Vector de Reset

Inicio movwf OSCCAL ;Almacena valor de calibración original


movlw b’11101110’ ;Preescaler 1:64 asignado al WDT
option ;Pin GP2/T0CKI=GP2
movlw b’11111100’
tris GPIO ;Configura GP0 y GP1 salidas
MANEJANDO EL PERRO GUARDIÁN, EL MODO DE BAJO CONSUMO Y EL «RESET» 209

;Analiza la causa del RESET, si ha sido por el WDT o por Power Up

btfsc STATUS,NOT_TO ;Desbordamiento del WDT


goto Power_Up ;No, ha sido Power On Reset

;Tareas a ejecutar si se produce desbordamiento del WDT

WDT_Out bcf GPIO,1


movlw b’000000001’ ;Sí, desbordamiento del WDT
xorwf GPIO,F ;GP0 cambia de estado
clrwdt ;Reinicia el WDT y bit /TO=1
WDT_Out_1 gotoWDT_Out_1 ;Bucle infinito

;Tareas a ejecutar si se produce un Power On Reset

Power_Up movlw b’00000010’


movwf GPIO ;Activa GP1 y desactiva GP0
Power_Up_1 goto Power_Up_1 ;Bucle infinito

end

Figura P7.4. A las patitas RB6 y RB7 se conectan los leds S1 y S0 de la PIC School, respectivamente.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez grabado el programa ejecutable en la memoria FLASH del PIC12F508 con ayu-
da del programa WinPic800, se comprueba su correcto funcionamiento si al conectar la
alimentación se enciende S1 y S0 queda apagado. Después, cada 1,1 s, cambia el estado
de S0 por el desbordamiento del WDT.
210 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

P7.2. ENTRANDO Y SALIENDO DEL MODO DE BAJO CONSUMO.


DIVERSOS TIPOS DE «RESET»
ENUNCIADO

En esta experiencia se visualiza sobre diversos leds el tipo de reset que se ha producido.
El procesador simplemente realiza una tarea: entrar en el modo de bajo consumo. De
dicho modo, se sale con un reset.

PRINCIPIOS TEÓRICOS

El modo de bajo consumo, también llamado de reposo o standby, se inicia al ejecutarse


la instrucción sleep, momento en el que se detiene el oscilador principal del sistema y se
detiene la ejecución de instrucciones, todo lo cual conlleva una bajada muy importante
del consumo del microcontrolador a unos pocos µA. Parece como si se hubiese «dormi-
do» el procesador y para «despertarle» o sacarle de ese modo hay que generar un reset.
Hay cuatro procedimientos de generar el reset en el PIC12F508:

— Reset por conexión de la alimentación (POR).


— Reset manual pasando a nivel bajo la línea MCLR#.
— Reset por cambio de estado en alguna de las patitas de entrada GP0, GP1 y/o
GP3.
— Reset por desbordamiento del WDT.

Al entrar en modo de bajo consumo, el WDT se refresca, pero continúa funcionan-


do con su oscilador independiente. La temporización normal del WDT cuando el rango
del posdivisor es 1:1 alcanza los 18 ms, tiempo que hay que multiplicar por el rango del
posdivisor cuando se selecciona otro valor que el 1:1.
Para indicar la causa que ha producido el reset existen 3 bits señalizadores en
el registro STATUS que proporcionan la información de acuerdo con la tabla de la
Figura P7.5.

GPWUF /TO /PD Causa del reset


0 0 0 Desbordamiento del WDT en el modo SLEEP
0 0 U Desbordamiento del WDT en el modo ejecución normal
0 1 0 Activación de la patilla MCLR en el modo SLEEP
0 1 1 Conexión de la alimentación Power Up
0 U U Activación de la patilla MCLR en el modo de ejecución normal
1 1 0 Cambio de estado en las patitas GP0, GP1 y/o GP3 en el modo
SLEEP.

Figura P7.5. Los 3 bits señalizadores del registro STATUS informan de la causa que ha generado el
reset.
MANEJANDO EL PERRO GUARDIÁN, EL MODO DE BAJO CONSUMO Y EL «RESET» 211

NUEVAS INSTRUCCIONES
En esta práctica se van a destinar cuatro leds para visualizar la causa del reset. El led S0,
conectado a la línea GP1, se enciende cuando el reset ha sido provocado por el cambio de
estado de la patita de entrada GP0, que se halla unida al interruptor E0. El led S1, conec-
tado a la línea GP2, se enciende cuando se pasa a nivel bajo la patita MCLR#. El led S2,
conectado a GP4, se enciende cuando se desborda WDT, que al estar configurado con el
rango 1:64 para el posdivisor lo hace cada 1,1 s. Finalmente, el led S3, conectado a la línea
GP5, se enciende cuando se aplica alimentación al sistema (Power On Reset) (Fig. P7.6).

Figura P7.6. Conexionado de los cuatro leds y el interruptor destinados a la visualización de la causa del
reset.

CONEXIONADO DE PERIFÉRICOS
Los cinco periféricos usados en esta práctica, que los soporta la PIC School, se conectan
como se refleja en la Figura P7.7.

Figura P7.7. Conexionado de los periféricos de la PIC School.


212 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

El organigrama al que responde el programa de esta aplicación se muestra en la Fi-


gura P7.8.
Obsérvese en el programa en lenguaje en Ensamblador que se presenta que en
la Palabra de Configuración se activa el WDT y se selecciona MCLR externo. El
registro OPTION se configura para producir reset cuando estando en modo de bajo
consumo cambie el estado de alguna de las siguientes líneas de entrada: GP0, GP1
y/o GP3.

Figura P7.8. Organigrama correspondiente al programa que explora y visualiza la causa del reset.
MANEJANDO EL PERRO GUARDIÁN, EL MODO DE BAJO CONSUMO Y EL «RESET» 213

;
; EJEMPLO 5_3
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;Detectar y monitorizar las distintas causas que pueden provocar el
;reinicio del sistema o RESET

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Definiciones de registros internos

;Ajusta los valores de la palabra de configuración durante el en-


samblaje:
;Protección de código =OFF, WDT=ON, MCLR=Externo y OSC= RC interno
;Estas u otras configuraciones se pueden seleccionar según las
;necesidades

__config _CP_OFF&_WDT_ON&_MCLRE_ON&_IntRC_OSC

org 0x00 ;Vector de Reset

Inicio movwf OSCCAL ;Almacena valor de calibración original


movlw b’01001110’ ;Preescaler 1:64 asignado al WDT
option ;Pin GP2/T0CKI=GP2 y GPWU = On
movlwb’11001001’
tris GPIO ;Configura GP0 y GP3 entradas

;Analizar la causa del RESET

btfss STATUS,NOT_TO ;Desbordamiento del WDT ??


goto WDT_Out ;Sí, desbordamiento del WDT
btfsc STATUS,NOT_PD ;Power Up ??
goto Power_Up ;Sí, conexión de alimentación
btfsc STATUS,GPWUF ;Cambio de estado en GP0?
goto GP0 ;Sí, cambio de estado en GP0
;No, activación de MCLR en modo SLEEP

;Tareas a ejecutar si se pulsa MCLR


MCLR bsf GPIO,2 ;Activa GP2 (MCLR)
bcf GPIO,1 ;Desactiva GP1 (cambio de estado)
bcf GPIO,5 ;Desactiva GP5 (Power UP)
sleep

;Tareas a ejecutar si se produce desbordamiento del WDT


WDT_Out movlw b’00010000’ ;Sí, desbordamiento del WDT
xorwf GPIO,F ;GP4 cambia de estado
clrwdt ;Reinicia el WDT y bit /TO=1
sleep

;Tareas a ejecutar si se produce un Power Up Reset


Power_Up bsf GPIO,5 ;Activa GP5 (Power Up)
bcf GPIO,2 ;Desactiva GP2 (MCLR)
214 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

bcf GPIO,1 ;Desactiva GP1 (cambio de estado)


sleep
;Tareas a ejecutar si se produce cambio de estado en GP0
GP0 bsf GPIO,1 ;Activa GP1 (cambio en GP0)
bcf GPIO,2 ;Desactiva GP2 (MCLR)
bcf GPIO,5 ;Desactiva GP5 (Power Up)
bcf STATUS,GPWUF ;Repone flag por cambio de estado
sleep
end

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez ensamblado el programa fuente Ejem_5_3A.ASM y grabado el programa eje-


cutable en la FLASH del PIC12F508, se mantiene el jumper JP4 en la posición MCL
(1-2) porque se usa esta línea multifunción (MCLR#/GP3/VPP) como entrada manual del
reset (MCLR#).
Se debe comenzar la verificación del funcionamiento desconectando y conectando
la alimentación del equipo, con lo que se genera un reset por conexión de la alimentación
y se encenderá el led S3 conectado a GP5.
El led S4 conectado a GP4 cambia de estado cada vez que se desborda WDT, es
decir, cada 1,1 s.
Al activar el pulsador de reset de la PIC School (MCLR#), se enciende el led S2
conectado a GP2.
Finalmente, cuando se cambia de posición el interruptor E0 conectado a GP0 se
produce un reset y se activa el led S0 conectado a la línea de salida GP1.

EL PROGRAMA EN C

El programa de esta experiencia en lenguaje C se halla contenido en el CD que acompa-


ña al libro bajo el nombre de Ejem_5_2B.C y se ofrece a continuación.

// EJEMPLO 5_2
// Autor: Mikel Etxebarria
// (c) Ingeniería de Microsistemas Programados S.L.
// www.microcontroladores.com
// Bilbao 2006
//
//Demostrar el funcionamiento del WDT. El programa activa GP1 y queda
//en un bucle infinito, lo que provoca el desbordamiento, momento en que
//la salida GP0 cambia de estado.Esto ocurre cada 1.1 s al emplear
//posescaler 1:64. La mayor parte del tiempo transcurre en el modo
//SLEEP

#include <12F508.h>
MANEJANDO EL PERRO GUARDIÁN, EL MODO DE BAJO CONSUMO Y EL «RESET» 215

//Ajusta los valores de la palabra de configuración durante el


//ensamblaje:
//Protección de código =OFF, WDT=ON, MCLR=Interno y OSC= RC interno
//Estas configuraciones se pueden seleccionar según las necesidades

#fuses NOPROTECT,WDT,NOMCLR,INTRC

#use fast_io (B) //Acceso rápido a las E/S


#byte GPIO=0x06
main()
{
//Analiza la causa del RESET, si ha sido por el WDT o por Power Up
if (RESTART_CAUSE()== WDT_FROM_SLEEP)
{
//Reset provocado por el WDT
setup_counters
(RTCC_INTERNAL,
WDT_1152MS); //Posescaler de 1:64 asignado al WDT
set_tris_b(0b11111100); //GP0 y GP1 son salidas
bit_clear(GPIO,1); //Desactiva GP1
GPIO=(GPIO ^ 0x01); //Cambio de estado en GP0
sleep(); //Modo standby
}
else
{
//Reset provocado por el Power Up
setup_counters
(RTCC_INTERNAL,
WDT_1152MS); //Posescaler de 1:64 asignado al WDT
set_tris_b(0b11111100); //GP0 y GP1 son salidas
bit_clear(GPIO,0); //Desconecta GP0
bit_set(GPIO,1); //Activa GP1
sleep(); //Modo standby
}
}

P7.3. TRABAJO PERSONAL


Tras las experiencias realizadas, se puede valorar las diferentes formas que los
PIC12FXXX tienen para reinicializarse y ejecutar desde el principio la tarea asignada al
procesador. Para profundizar en este tema se proponen tres trabajos.

P7.3.1. Control del desbordamiento del WDT


La reinicialización del sistema sólo debe producirse ante situaciones anómalas muy es-
peciales. Se sugiere modificar el programa Ejem_5 para evitar que el WDT se desborde
periódicamente y sólo lo haga cuando cambie el estado lógico que soporta la línea de
entrada GP0.
216 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

P7.3.2. El WDT como temporizador


El WDT actúa de forma similar al TMR0, pero con dos diferencias fundamentales:

— El valor nominal de la temporización para un rango del posdivisor de 1:1 es fijo


y alcanza los 18 ms, independientemente de la frecuencia del oscilador princi-
pal, dado que posee su propio oscilador.
— Cada vez que se desborda el WDT, se genera un reset, pero se distingue de cual-
quier otro porque el señalizador TO# del registro STATUS pasa a valer 0. Así, el
programa de aplicación puede desentenderse de la temporización cuando la haga
el WDT y actuar sólo al final de la misma.

Se propone montar el esquema de la Figura P7.9 empleando los interruptores E1 y


E0 conectados a las líneas GP5 y GP4, respectivamente, y tres leds S7, S1 y S0 conec-
tados en GP2, GP1 y GP0.

Figura P7.9. Esquema de montaje del trabajo propuesto.

Confeccionar un programa en Ensamblador y en C en el que se reflejen sobre los leds


S0 y S1 de forma constante e inmediata cualquier cambio de estado en las entradas E0 y E1.
Al mismo tiempo, el led S7, conectado a CP2, debe cambiar de estado cada 1,1 s.

P7.3.3. Un temporizador programable


Se supone que se desea controlar el tiempo que se halla activada una carga, como lo pue-
de ser el conjunto de lámparas de una escalera vecinal, para lo cual se monta el circuito
de la Figura P7.10.
La carga a controlar se simula mediante el led S0 que se halla conectado a la línea
de salida GP5. Los interruptores E0-E3 se conectan con las líneas de entrada GP0-GP3
que se emplean como selectores del tiempo de la temporización, que estará comprendida
entre 1 y 16 s.
La carga S0 se activa cada vez que se accione el pulsador E7 conectado a la línea
de entrada GP4. Se inicia el período de temporización según el valor preseleccionado
con los interruptores E0-E3 y al final del mismo se apaga S0. El ciclo se repite con cada
accionamiento de E7.
MANEJANDO EL PERRO GUARDIÁN, EL MODO DE BAJO CONSUMO Y EL «RESET» 217

Figura P7.10. Esquema de montaje de un temporizador programable.

En esta experiencia es obligatorio utilizar el WDT y refrescarlo convenientemente


para que si se bloqueara el sistema se genere una reinicialización automática sin inter-
vención humana. El TMR0 y su predivisor se emplearán para soportar las temporizacio-
nes que se crean oportunas.
a
Comunicación serie RS232 8.
APLICACIÓN

P8.1. TRANSMISIÓN DE UN CARÁCTER EN SERIE


INTRODUCCIÓN

Los dispositivos de la familia PIC12FXXX sólo disponen de ocho patitas y en el mejor


de los casos dejan un máximo de seis para E/S que manejan periféricos externos. El
número de periféricos a controlar es muy pequeño con tan pocas patitas. Para mitigar
esta restricción, se pueden usar controladores de periféricos especializados en teclados,
LCD, etc. Otra opción interesante se basa en comunicar en serie al microcontrolador con
un PC a través de dos líneas, una para la transmisión y otra para la recepción. Con esta
solución se podría acceder a todos los periféricos del PC fácilmente.
La comunicación tiene la ventaja de utilizar un número mínimo de líneas, por lo que
han surgido muchas variantes, como la RS232, RS485, I2C, 1-Wire, USB, etc.
El protocolo de comunicación serie más simple, popular y documentado es el
RS232, para el cual muchos modelos de PIC contienen el hardware necesario para su
implementación. Pero eso no sucede con el PIC12F508, y para remediarlo hay que crear
el software necesario para que dos de sus patitas soporten este tipo de comunicación.

ENUNCIADO

Transmitir el código ASCII correspondiente al código de la letra A periódicamente a


intervalos de 0,5 s desde el PIC12F508 a un PC en cuya pantalla se irán visualizando los
caracteres transmitidos a medida que se reciban.

PRINCIPIOS TEÓRICOS

La comunicación serie RS232 tiene carácter de asíncrona y el nivel lógico que corres-
ponde a cada bit que se transfiere se debe mantener estable un determinado tiempo, que
debe ser igual para el transmisor y para el receptor del mismo. En este protocolo no
existe señal de reloj que sincronice los bits que se transfieren.

219
220 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P8.1. Conexión serie RS232 bidireccional.

La transferencia recibe el nombre de Full Duplex cuando es bidireccional y simul-


tánea, es decir, se transmite y se recibe al mismo tiempo. Se llama Half Duplex cuando
es bidireccional, pero no simultánea, es decir, mientras se transmite no se puede recibir
información serie.
En la Figura P8.1 se muestra el esquema fundamental de conexionado de dos dispo-
sitivos A y B que intercambian información en serie. Emplean dos líneas, una de salida
por la que se transmiten al exterior los bits en serie, TxD, y otra de entrada por la que se
reciben los bits en serie, RxD. La línea de transmisión de un dispositivo se conecta con
la de recepción del otro.
En ocasiones, y para asegurar la comunicación, se pueden emplear otras señales auxi-
liares que controlan el flujo de información, evitando, por ejemplo, que un dispositivo
transmita cuando el receptor está ocupado. Teniendo en cuenta el escaso número de patitas
que hay disponibles en el PIC12F508, se prescindirá en esta práctica de dichas señales.
Para implementar la comunicación serie RS232 en el humilde PIC12F508 se van a utili-
zar dos rutinas software, una que se encargue de transmitir un carácter y otra de recibirlo.
Un «carácter» es el conjunto de bits que se transfieren seguidos y que codifican una
información, como lo puede ser un código ASCII correspondiente a una letra o un núme-
ro. En RS232, el carácter puede tener 7 u 8 bits de longitud y siempre va precedido por
un bit de inicio (START) de nivel 0. Al final del carácter es obligatorio que exista un bit
de parada (STOP) de nivel 1. Delante del bit STOP, opcionalmente, se puede incluir un
bit de paridad que es muy interesante para asegurar la comunicación y que puede sevir
para formar la paridad impar o la par. Así, por ejemplo, si el bit es de «paridad par», su
valor es tal que el número total de bits 1 sumando los del carácter más el de paridad es
«par» (Fig. P8.2).

Figura P8.2. Estructura de un carácter en la comunicación serie RS232. Comienza con el bit START, al
que siguen los 8 bits de información, después hay un bit de paridad par (P) y, por último,
el bit de STOP.
COMUNICACIÓN SERIE RS232 221

El nivel lógico correspondiente a los bits que se transfieren por las líneas de comu-
nicación debe permanecer estable durante un determinado tiempo t, común a todos ellos.
Dicho tiempo establece la velocidad de la transferencia, que se mide en baudios, que
equivalen a «bits/segundo».

EJEMPLO
Si se trabaja con la velocidad de transferencia estándar de 9.600 baudios, eso significa
que en cada segundo se transfieren 9.600 bits.
El tiempo que el nivel lógico de cada bit debe mantenerse estable durante un tiempo:

Tiempo de estabilidad del bit = 1 s / 9.600 = 104 µs

Esto significa que tanto el receptor como el transmisor han de estar de acuerdo en
mantener estable el nivel de cada bit 104 µs. Luego cada bit que se transmite debe estar
estable durante 104 µs en la línea TxD, tiempo que tiene el receptor para recogerlo y
leerlo en su patita RxD.

Todo carácter comienza con el bit START, que vale 0; luego, se transmite el ca-
rácter de información, que se supone que es el 0x26 (00100110), empezando por el
bit de menos peso LSB. Después, puede venir opcionalmente un bit de paridad, que
en esta experiencia no vamos a utilizar. Finalmente, viene el bit de STOP, que vale 1.
En ciertos protocolos puede haber más de 1 bit de STOP. Como el último bit transmi-
tido es un 1, la línea queda con ese nivel hasta que se envíe el siguiente carácter, que
por empezar por el bit de START, que vale 0, pasa a nivel bajo y se considera que
comienza otro carácter.
La rutina de transmisión RS232 simplemente implementa en software la cadencia
de bits que se transmiten por la línea TxD. Cuando va a enviar un carácter, comienza
poniendo la línea TxD a 0 durante un tiempo determinado, que en el caso de trabajar a
9.600 baudios es de 104 µs. Se trata del bit START. A continuación, se van sacando al
desplazar los bits de un registro los ocho de información. Cada uno de estos bits se debe
mantener estable 104 µs sobre la línea TxD. Por último, la línea se pone a nivel 1, gene-
rando el bit STOP, que se debe mantener en ese estado un mínimo de 104 µs.
La rutina para la línea RxD de recepción serie RS232 a 9.600 baudios comienza
detectando el momento en que la misma pasa a nivel 0, que se considera la llegada del
bit START. A partir de ese momento, se va leyendo RxD cada 104 µs y el nivel lógico
recogido se va almacenando y desplazando en un registro hasta conformar el octeto.

MATERIALES NECESARIOS

• PIC School.
• PIC12F508.
• Cables de conexión.
222 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

PROGRAMA FUENTE EN ENSAMBLADOR


Las prácticas que se proponen en este tema se dirigen a comunicar el PIC12F508 con
un PC a través del puerto serie RS232. Las rutinas que se han elaborado transmiten y
reciben caracteres entre dichos dispositivos. Se han obtenido excelentes resultados usan-
do el programa HyperTerminal, que se halla incluido en el propio sistema operativo
Windows del PC, al cual hay que configurarlo de la siguiente manera:

• Canal de comunicación = COMx (siendo x el que se tenga disponible).


• Bits por segundo = 9.600.
• Bits de datos = 8.
• Bit de paridad = No se usa.
• Bit de STOP = 1.
• Líneas para el control del flujo = Ninguna.

El camino para iniciar el programa HyperTerminal es PROGRAMAS / ACCESO-


RIOS / COMUNICACIONES / HYPERTERMINAL.
En las prácticas que se emplea la comunicación serie RS232 hay que realizar siem-
pre las siguientes conexiones:
1. Unir el conector RS232 de la PIC School con el puerto serie del PC mediante un
cable serie DB9 macho a DB9 hembra.
2. Conectar la línea GP4 del microcontrolador con la línea TxD del conector RS232
de la PIC School.
3. Conectar la línea GP5 del PIC12F508 con la línea RxD del conector RS232 de
la PIC School.
Para llevar a cabo las siguientes experiencias de forma ideal sería muy cómodo
disponer de dos PC: uno de trabajo en el que se edita, ensambla, graba y ejecuta los pro-
gramas de aplicación y otro dedicado exclusivamente a actuar como un terminal remoto
para la transferencia de información. En caso de disponer sólo de un PC, tampoco pasa
nada. Una vez que con el PC hemos editado, ensamblado, grabado y ejecutado el progra-
ma de aplicación y el programa HyperTerminal, se retira el cable de comunicaciones
del conector de grabación y se inserta en el conector RS232 de la PIC School.
Como se ha indicado en el enunciado, esta experiencia se trata simplemente de
transmitir el carácter A a intervalos de 0,5 s. El carácter que transmite el PIC12F508 se
visualizará en la pantalla HyperTerminal del PC según se van recibiendo.
Los archivos Ejem_6A.ASM y Ejem_6B.C contienen los programas fuente en
Ensamblador y en C.
Se analizan algunos fragmentos interesantes del programa en Ensamblador, comen-
zando por el siguiente:

;Las siguientes variables determinan el tipo y velocidad de la


;comunicación

CLKIN equ .4000000 ;Frecuencia del oscilador expresada en


;ciclos/segundo
BAUDIOS equ .9600 ;Velocidad de transferencia
T_MODO equ 1 ;Transmite 1.o el bit LSB (a 0 transmite 1.o el
;bit MSB)
COMUNICACIÓN SERIE RS232 223

R_MODO equ 1 ;Recibe 1.o el bit LSB (a 0 recibe 1.o el bit


;MSB)
T_Nbit equ .8 ;N.o de bits a transmitir (7 u 8)
R_Nbit equ .8 ;N.o de bits a recibir (7 u 8)
Sbit equ .1 ;N.o de bits de stop (1 o 2)

#define Txd_pin GPIO,4 ;Línea de transmisión


#define Rxd_pin GPIO,5 ;Línea de recepción

RS232VAR equ 0x07 ;Inicio de las variables (5) empleadas


;por las rutinas de Transmisión/Recepción

En el fragmento del programa anterior se define una serie de constantes que se uti-
lizan en la configuración de la comunicación: velocidad de trabajo (CLKIN), velocidad
de comunicación (baudios), número de bits a transmitir/recibir, número de bits de STOP, etc.
Estos valores se usan posteriormente para calcular las temporizaciones necesarias y deter-
minar el modo de trabajo. También se definen a las líneas GP4 y GP5 como las de trans-
misión y recepción, respectivamente (Txd_pin y Rxd_pin).
Las rutinas de transmisión y recepción utilizan cinco variables temporales durante
su ejecución. La directiva RS232VAR equ 0x07 indica la dirección de inicio (0x07), a
partir de la cual se reserva espacio para dichas variables.
La directiva include RS232LOW.INC incluye el fichero RS232LOW.INC en el pro-
grama fuente para no reescribir en el mismo las rutinas de transmisión y de recepción,
quedando así más despejado y limpio. Estas rutinas se han confeccionado con el reperto-
rio de instrucciones de 12 bits correspondiente a los PIC de la gama básica.
Se proporciona otro fragmento interesante del programa fuente:

CLKOUT equ CLKIN/4 ;Calcula duración del ciclo máquina


DELAY equ ((CLKOUT/BAUDIOS)/3)-.5 ;Calcula la duración del bit
DELAY_L equ low DELAY ;Calcula la parte baja de DELAY
DELAY_H equ high DELAY+1 ;Calcula la parte alta de DELAY
DELAY_START equ (DELAY/2)+DELAY ;Calcula duración del bit de inicio
DELAY_START_L equ low DELAY_START ;Calcula parte baja de DELAY_START
DELAY_START_H equ high DELAY_START+1 ;Calcula parte alta de DELAY_START

CBLOCK RS232VAR ;Reserva de memoria a partir de la posición RS232VAR


Rxdreg ;Registro de recepción
Txdreg ;Registro de transmisión
Cont ;Contador de bits transmitidos
Dlycnt_l ;Contador de delay parte baja
Dlycnt_h ;Contador de delay parte alta
ENDC

A partir de las constantes definidas en la cabecera del programa fuente principal, se


calculan los valores adecuados de las temporizaciones que hay que realizar para trans-
mitir cada bit.
La directiva CBLOCK RS232VAR reserva un total de cinco posiciones del área de
datos para almacenar las distintas variables y registros empleados por las rutinas de
transferencia. El inicio de esta reserva se estableció con la directiva RS232VAR equ 0x07.
224 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

El núcleo principal del programa de esta sencilla aplicación consiste en cargar el


carácter A sobre el registro de transmisión Txdreg y llamar a la rutina TxD de transmi-
sión. Luego se realiza una temporización de 0,5 s, para lo que se emplea el TMR0 con el
predivisor de frecuencias en el rango 1:256.
El programa en C para esta práctica está contenido en el fichero Ejem_6B.C y es
mucho más sencillo. La directiva

#use rs232(baud = 9600,bits = 8,parity = n.xmit = PIN_B4,rcv = PIN_B5)

permite incluir las librerías con los mecanismos adecuados para configurar la transferen-
cia en serie, determinando la velocidad, el número de bits, las patitas empleadas para la
transmisión y recepción, etc. El cuerpo principal del programa está formado por la fun-
ción putc(‘A’), que transmite el carácter A, y por la función delay_ms(500) que realiza
la temporización de 0,5 s.
A continuación, se presenta el programa Ejem_6A.ASM con abundantes comen-
tarios para su correcta comprensión.

;
; EJEMPLO 6
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;Este programa se encarga de transmitir el carácter ‘A’ a intervalos de
;.5 s

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Definiciones de registros internos

;Ajusta los valores de la palabra de configuración durante el


;ensamblaje:
;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
;Estas u otras configuraciones se pueden seleccionar según las
;necesidades

__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC

;Las siguientes variables determinan el tipo y velocidad de la


;comunicación

CLKIN equ .4000000 ;Frecuencia del oscilador expresada


;en ciclos/segundo
BAUDIOS equ .9600 ;Velocidad de transferencia
T_MODO equ 1 ;Transmite 1.o el bit LSB (a 0
;transmite 1.o el bit MSB)
R_MODO equ 1 ;Recibe 1.o el bit LSB (a 0 recibe 1.o
;el bit MSB)
T_Nbit equ .8 ;N.o de bits a transmitir (7 u 8)
R_Nbit equ .8 ;N.o de bits a recibir (7 u 8)
Sbit equ .1 ;N.o de bits de stop (1 o 2)
COMUNICACIÓN SERIE RS232 225

#define Txd_pin GPIO,4 ;Línea de transmisión


#define Rxd_pin GPIO,5 ;Línea de recepción

RS232VAR equ 0x07 ;Inicio de las variables (5) empleadas


;por rutinas de Transmisión/Recepción
Temp_0 equ 0x0c ;Variable temporal

org 0x00 ;Vector de Reset


goto Inicio

include “RS232LOW.INC” ;Incluir rutinas Transmisión/Recepción

Inicio movwf OSCCAL ;Almacena valor de calibración original


movlw b’11000111’ ;Preescaler 1:256 asignado al TMR0
option ;Pin GP2/T0CKI=GP2
movlw b’11101111’ ;Configura GP4 salida TxD
tris GPIO ;y GP5 como entrada RxD

Loop movlw ’A’


movwf Txdreg ;Byte a transmitir
call TxD ;Rutina de transmisión

;Bucle de temporización de 0.5 s. A una frecuencia de trabajo de 4 MHz,


;con un preescaler de 256, el TMR0 se carga con 195 (su complemento), por
;lo que desborda y pasa a 0 al de 50 ms (195*256*1=49920 us).

movlw .10
movwf Temp_0 ;El bucle externo se repite 10 veces
Delay_0 movlw~ .195
movwf TMR0 ;El TMR0 se carga con 195
Delay_1 movf TMR0,W
btfss STATUS,Z ;Desborda al de 50 ms
goto Delay_1
decfsz Temp_0,F
goto Delay_0 ;Se esperan 10 desbordamientos para
;conseguir 0.5”
goto Loop
end

CONEXIONADO DE PERIFÉRICOS

Una vez grabado el programa ejecutable sobre la memoria FLASH del PIC12F508, se
puede utilizar el cable serie DB9 para unir el conector RS232 de la PIC School con el
puerto serie del PC (Fig. P8.3).

VERIFICACIÓN DEL PROGRAMA

Grabado el programa y realizadas las conexiones de la Figura P8.3, se coloca el jumper


JP4 en la posición GP3 y el conmutador principal de la PIC School en RUN. También
226 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P8.3. Conexionado del cable DB9 entre el puerto serie del PC y el conector RS232 de la PIC
School que une la patita GP5 con RxD y al GP4 con la TxD.

hay que ejecutar el software de comunicaciones HyperTerminal con la configuración


expuesta anteriormente.
Si sólo se dispone de un PC, hay que cerrar la ejecución del programa WinPIC800
para que no se produzcan conflictos con el software de comunicaciones HyperTerminal,
sobre todo si se emplea el mismo canal.
En el momento de conectar la alimentación a la PIC School, en la pantalla del PC se
visualizará el carácter A que se está transmitiendo.

P8.2. TRANSMISIÓN DE MENSAJES


ENUNCIADO

En esta experiencia, en lugar de transmitir un carácter, se trata de transmitir cadenas de


caracteres o stings a manera de mensajes. El conexionado es el mismo que en la práctica
anterior.

PROGRAMAS FUENTE

En los archivos Ejem_6_2A.ASM y Ejem_2_6B.C se dispone de las versiones del pro-


grama fuente en Ensamblador y en C.
Lo más destacable de la versión en Ensamblador consiste en la definición de las
cadenas. Se emplea la directiva dt, que genera tantas instrucciones rtlw como caracteres
o bytes contenga. Luego, el programa se limita a leer secuencialmente cada uno de los
caracteres al tiempo que se van transmitiendo. Es frecuente que al final de la cadena se
COMUNICACIÓN SERIE RS232 227

coloque un último byte de control que informe del final de la cadena y que en este ejem-
plo es el valor 0x00.
En la versión en lenguaje C destaca lo fácil que es transmitir una o varias cadenas de
caracteres mediante la función prinft().

P8.3. TRANSMISIÓN Y RECEPCIÓN DE UN CARÁCTER

ENUNCIADO

En esta experiencia se trata de recibir un carácter procedente del exterior para luego
volverlo a retransmitirlo a modo de eco. Las conexiones son las mismas que en los ejer-
cicios anteriores. Para evaluar el funcionamiento, se comprobará que en la pantalla del
PC, que actúa como terminal, se visualiza la misma letra que se acaba de pulsar.

PROGRAMAS FUENTE

Están contenidos en los ficheros Ejem_6_3A.ASM y Ejem_6_3B.C. Se limitan a trans-


mitir lo que previamente han recibido.

P8.4. VISUALIZACIÓN REMOTA DE SEÑALES

ENUNCIADO

Esta experiencia es un caso práctico y real de gran utilidad. Se trata de leer el estado
de las líneas de entrada GP3-GP0 y transmitirlo para su visualización en un terminal
remoto, o sea, la pantalla del PC.

PROGRAMAS FUENTE

Se hallan disponibles en los archivos Ejem_6_4A.ASM y Ejem_6_4B.C. Primero se


transmite una información inicial que actúa como cabecera. Luego se lee el estado lógico
de las líneas GP3-GP0 que están conectadas a unos interruptores y los posibles niveles
lógicos 1 y 0 se convierten en sus correspondientes códigos ASCII para ser transmitidos.

CONEXIONADO DE PERIFÉRICOS

Además de las conexiones de las prácticas anteriores, hay que unir las patitas GP3-GP0
con los interruptores E3-E0 de la PIC School, como se muestra en la Figura P8.4.
Grabado el programa, se coloca el jumper JP4 en la posición GP3, pues a esta patita
hay que conectar el interruptor E3. Si todo va bien, en la pantalla del PC se visualizará
el estado de los interruptores.
228 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P8.4. Conexionado de las patitas GP3-GP0 con los interruptores E3-E0 cuyo estado se visualiza
en la pantalla del PC.

P8.5. CONTROL REMOTO DE SALIDAS


ENUNCIADO

En esta práctica, las pulsaciones de las teclas 2, 1 y 0 del terminal, o sea, del PC, van a
conseguir que las líneas de salidas GP2-GP0 cambien su estado lógico, lo cual se visua-
lizará al estar conectadas a los leds S2-S0.

PROGRAMAS FUENTE

El programa consiste en esperar a recibir un carácter y analizarlo. En el caso que co-


rresponda con las teclas 2, 1 o 0 provoca que la línea de salida correspondiente cambie
su nivel lógico. Los programas fuente en Ensamblador y en C están contenidos en los
archivos Ejem_6_5A.ASM y Ejem_6_5B.C, respectivamente.

Figura P8.5. Esquema de conexionado de las líneas de salida con led de visualización.
COMUNICACIÓN SERIE RS232 229

CONEXIONADO DE PERIFÉRICOS

Además de las conexiones empleadas en anteriores prácticas para implementar la comu-


nicación serie, hay que unir las líneas de salida GP2-GP0 con los leds S2-S0, en donde
se monitorizarán las pulsaciones realizadas sobre el teclado del PC y que se muestran en
el esquema de la Figura P8.5.
Una vez grabado el programa y realizado el conexionado de los periféricos, el
correcto funcionamiento del programa se comprueba al pulsar cualquiera de las teclas 2,
1 o 0 del terminal y observando cómo los leds S2-S0 conectados a las líneas de salida
GP2-GP0 cambian de estado.
a
Controlando una pantalla LCD 9.
APLICACIÓN

P9.1. VISUALIZACIÓN EN UNA PANTALLA LCD


DEL JUEGO DE CARACTERES REPRESENTABLES
ENUNCIADO
En esta experiencia se propone explicar cómo se controla una pantalla LCD de dos líneas
con dieciséis caracteres cada una desde un PIC12F508 mediante el controlador de LCD
SYM20AA, que no es más que otro microcontrolador PIC que tiene grabado en su me-
moria el programa de control del LCD.
En la primera aplicación, se van a visualizar en la pantalla del LCD los noventa y seis
caracteres del juego completo que es posible visualizar. Como cada pantalla sólo presenta
dos líneas de dieciséis caracteres cada una, o sea, treinta y dos caracteres, será preciso
presentar tres pantallas completas para mostrar los noventa y seis caracteres del juego. El
juego de caracteres se ofrece en la Figura P9.6.

PRINCIPIOS TEÓRICOS
Para la gestión de un LCD se precisan siete líneas y el PIC12F508 sólo dispone de seis
como máximo. Hay que usar un hardware externo que simplifique el conexionado entre
el PIC y el LCD, que se materializa en un circuito integrado llamado SYM20AA que
permite la comunicación serie entre los dos dispositivos usando sólo una línea.
Otro tema muy interesante que se desarrolla en esta práctica es la implementación de
un stack o pila gestionada por software que permite anidar un buen número de subrutinas
de los programas de aplicación.
El controlador de LCD SYM20AA es el encargado de gestionar todas las tareas de la
pantalla LCD, entre las que destaca la comunicación con el microcontrolador principal a
través de una o dos líneas, lo que resulta especialmente eficaz en las aplicaciones en las
que el número de líneas de E/S es crítico. De esta forma, el microcontrolador sólo trans-
mite en serie los caracteres que desea visualizar junto a unos comandos muy sencillos
que producen diversos efectos de visualización en la pantalla LCD. Dicho controlador
no sólo se encarga de la gestión con la pantalla, sino que simplifica enormemente el
desarrollo de la aplicación final con el consiguiente ahorro de memoria.

231
232 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

En el CD se incluye un archivo en formato PDF que contiene el manual completo


del SYM20AA y todas sus características y diagrama de conexiones, que también se
muestran en la Figura P9.1 y la tabla que la acompaña.

N.o PIN Nombre Descripción


2 D7 Línea de interfaz con LCD
1 D6 Línea de interfaz con LCD
18 D5 Línea de interfaz con LCD
17 D4 Línea de interfaz con LCD
9 E Señal para la habilitación del LCD
16 R/W Señal para la lectura/escritura del LCD
15 RS Señal de comandos y datos del LCD
14 VCC Tensión de alimentación de +5 Vcc
5 GND Tensión de alimentación de GND
8 TxD Transmisión de datos al Host
7 RxD Recepción de datos desde el Host
3 BAUD Selección de baudios. «0»=9600, «1»=19200
6 BLIGHT Salida para el control de la luz de fondo (si está disponible en
el LCD)
4 Vpp No conectar
13 DATA No conectar
12 CLK No conectar

Figura P9.1. Diagrama de conexionado del controlador de LCD SYM20AA junto a la tabla que describe
la función de cada patita.

En la Figura P9.2 se presenta el esquema de conexionado entre el SYM20AA y el


PIC12F508. La pantalla LCD es el periférico visualizador por excelencia.
Para desarrollar estas prácticas se empleará la pantalla LCD de la PIC School, que
utilizará las líneas D4-D7 para conectarse con el SYM20AA por las que se transfieren
CONTROLANDO UNA PANTALLA LCD 233

Figura P9.2. Esquema de conexionado del controlador SYM20AA entre la pantalla LCD y las patitas
del PIC12F508.

los datos y los comandos. También se conectan las señales de control del flujo de la in-
formación E, R/W y RS del LCD con las líneas correspondientes del controlador.
El SYM20AA se conecta con el PIC12F508 a través de la pata GP4, que actúa como
TxD, y de la pata GP5, que hace las veces de RxD. Por GP4 el microcontrolador trans-
mite al controlador los datos y los comandos que se desean visualizar en serie. Cada vez
que el controlador finaliza la ejecución de un comando, transmite el código de «recono-
cimiento» ACK (0x06) que se recibe en el PIC12F508 por la línea GP5, que actúa como
línea de recepción RxD. El uso de la señal ACK no es imprescindible y puede evitarse si
el software de la aplicación espera el tiempo necesario para que se complete la ejecución
de cada comando. En los ejemplos que se proponen se utiliza esta técnica y así sólo se
usa una línea del microcontrolador (GP4) para comunicarse con el SYM20AA.
La Tabla P9.1 muestra los códigos de los datos y de los comandos que admite el contro-
lador de la LCD, SYM20AA, junto al tiempo máximo que tarda la ejecución de cada uno.

Hex. Dec. Descripción T. Máx.


0x00 0 Visualiza el carácter gráfico número 0 previamente definido 0,5 ms
mediante Set_Char
0x01 1 Visualiza el carácter gráfico número 1 previamente definido 0,5 ms
mediante Set_Char
0x02 2 Visualiza el carácter gráfico número 2 previamente definido 0,5 ms
mediante Set_Char
0x03 3 Visualiza el carácter gráfico número 3 previamente definido 0,5 ms
mediante Set_Char
0x04 4 Visualiza el carácter gráfico número 4 previamente definido 0,5 ms
mediante Set_Char
234 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Hex. Dec. Descripción T. Máx.


0x05 5 Visualiza el carácter gráfico número 5 previamente definido 0,5 ms
mediante Set_Char
0x06 6 Visualiza el carácter gráfico número 6 previamente definido 0,5 ms
mediante Set_Char
0x07 7 Visualiza el carácter gráfico número 7 previamente definido 0,5 ms
mediante Set_Char
0x08 8 BackSpace: Mueve el cursor una posición a la izquierda y borra 0,5 ms
el carácter actual que hubiera
0x0A 10 Line_Feed: El cursor se mueve a la siguiente línea. Si se encuen- 0,5 ms
tra en la última, se pasa a la primera. Se conserva la posición
dentro de la línea
0x0C 12 Form_Feed: Salto de página. El cursor se coloca en la primera 6 ms
posición de la primera línea. La pantalla se borra.
0x0D 3 Return: El cursor se mueve a la primera posición de la siguiente 0,5 ms
línea. Si ésta fuera la última, se pasará a la primera
0x20 32 Visualiza el carácter correspondiente al código ASCII. Véase 0,5 ms
— — tabla de caracteres disponibles
0x7F 127
0x80 128 Display_ON: Activa el LCD y visualiza el contenido actual. Valor 0,5 ms
por defecto
0x81 129 Display_OFF: Desactiva el LCD. La pantalla queda en blanco, 0,5 ms
pero el contenido actual permanece intacto
0x82 130 Cursor_ON: Visualiza el cursor en la posición actual. Valor por 0,5 ms
defecto
0x83 131 Cursor_OFF: Desactiva la visualización del cursor 0,5 ms
0x84 132 Blink_ON: Activa intermitencia del cursor 0,5 ms
0x85 133 Blink_OFF: Desactiva la intermitencia del cursor. Valor por de- 0,5 ms
fecto
0x86 134 Backlight_ON: Activa la luz de fondo. Sólo es válido en panta- 0,5 ms
llas LCD que dispongan de dicha luz.
0x87 135 Backlight_OFF: Desactiva la luz de fondo. Valor por defecto 0.5ms
0x88 136 Shift_Right: Desplaza el cursor una posición a la derecha sin 0,5 ms
borrar el carácter actual
0x89 137 Shift_Left: Desplaza el cursor una posición a la izquierda sin 0,5 ms
borrar el carácter actual
0x8A 138 Set_Cursor: Coloca el cursor en las coordenadas indicadas sin 0,5 ms
borrar el carácter actual.
Formato: 0x8A ff cc
ff = filas (entre 1 y 4)
cc = columnas (entre 1 y 40)
Se verifica si las coordenadas indicadas están fuera del rango
establecido por el tipo de LCD (Set_LCD), en cuyo caso se esta-
blecen las coordenadas por defecto (0-0)
CONTROLANDO UNA PANTALLA LCD 235

Hex. Dec. Descripción T. Máx.


0x8B 139 Set_Char: Genera uno de los posibles caracteres gráficos y los 0,5 ms
almacena en la memoria interna del LCD
Formato: 0x8B nn B0 B1 B2 B3 B4 B5 B6 B7
nn = número de identificación del carácter
B0-B7 = Son los bytes que definen la matriz
Si el sistema queda sin alimentación, los caracteres que haya
definido se borran, con lo que habrá que volver a repetir el
proceso.
0x8C 140 Sel_LCD: Ajusta el modelo de LCD disponible 6 ms
Formato: 0x8C ff cc
ff = Número de filas (entre 1 y 4)
cc = Número de columnas (entre 1 y 40)
Si un parámetro excede de los límites, se toma el modelo por
defecto (2x16). La nueva configuración sólo se mantiene mien-
tras el sistema esté alimentado. La ejecución de este comando
implica un borrado total de la pantalla y el posicionamiento del
cursor en la primera posición de la primera fila.

Tabla P9.1. Códigos correspondientes a los datos y comandos que admite el controlador SYM20AA.

MATERIALES NECESARIOS

• PIC School.
• PIC12F508.
• Controlador de LCD SYM20AA.
• Cables de conexión.

PROGRAMAS FUENTE
Los ficheros Ejem_7A.ASM y Ejem_7B.C contienen los programas fuente escritos en
Ensamblador y en C, respectivamente. Los programas tienen una estructura básicamen-
te similar a los anteriores y se incluyen las rutinas de transmisión y recepción en serie
RS232LOW.INC.
Al inicio del programa principal, tras el arranque, se debe realizar una temporización
de 100 ms, porque al conectar la alimentación, la pantalla LCD desarrolla un proceso
de inicialización durante el que no se aceptan datos ni comandos. Cuando finaliza dicho
proceso, se envía al PIC12F508 un comando de reconocimiento ACK por la línea GP5
cuando se emplea. Como en la práctica no se usa GP5, habrá que realizar una tempori-
zación «a ojo» para esperar el fin del proceso de inicialización de la LCD. Esta conside-
ración también hay que tenerla en cuenta durante la ejecución de ciertos comandos, para
lo que se debe consultar la Tabla P9.1 para conocer la duración de cada uno.
Se comienza visualizando el primer carácter ASCII, que se corresponde con el de
«espacio» (0x20). Entre un carácter y el siguiente se aplica una temporización de 0,3 s
empleando una rutina de Delay similar a la aplicada en ejemplos anteriores.
Cuando se completa una línea con dieciséis caracteres, el controlador continúa auto-
máticamente en la siguiente. Al completarse la pantalla con dos líneas (2 × 16 caracteres)
236 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

se produce una temporización de 1 s, se borra el LCD y se procede a visualizar los treinta


y dos caracteres siguientes. Al terminar de visualizar las tres páginas con noventa y seis
caracteres, se reanuda el proceso.
A continuación, se presenta el programa fuente en Ensamblador (Ejem_7A.ASM)
con abundantes comentarios aclaratorios.

;
; EJEMPLO 7
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;Control de una pantalla LCD. Visualiza el juego de caracteres ASCII
;capaz de representarse en la pantalla

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Definición registros internos

;Ajusta los valores de la palabra de configuración durante el


;ensamblaje:
;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
;Otras configuraciones se pueden seleccionar según las necesidades

__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC

;Las siguientes variables determinan tipo y velocidad de


;la comunicación

CLKIN equ .4000000 ;Frecuencia del oscilador expresada


;en ciclos/segundo
BAUDIOS equ .9600 ;Velocidad de transferencia
T_MODO equ 1 ;Transmite 1.o el bit LSB (a 0
;transmite 1.o el bit MSB)
R_MODO equ 1 ;Recibe 1.o el bit LSB (a 0 recibe 1.o
;el bit MSB)
T_Nbit equ .8 ;N.o de bits a transmitir (7 u 8)
R_Nbit equ .8 ;N.o de bits a recibir (7 u 8)
Sbit equ .1 ;N.o de bits de stop (1 o 2)

#define Txd_pin GPIO,4 ;Línea de transmisión


#define Rxd_pin GPIO,5 ;Línea de recepción

RS232VAR equ 0x07 ;Inicio de la variables (5) empleadas


;por rutinas Transmisión/Recepción
Temp_0 equ 0x0c
Temp_1 equ 0x0d
Temp_2 equ 0x0e ;Variables temporales

org 0x00 ;Vector de reset


goto Inicio

include “RS232LOW.INC” ;Incluir rutinas Transmisión/


;Recepción
CONTROLANDO UNA PANTALLA LCD 237

;A una frecuencia de trabajo de 4 MHz, con un preescaler de 256, el


;TMR0 se carga con 195 (su complemento), por lo que desborda y pasa a 0
;al de 50 ms (195*256*1=49920 us). Esto se
;repite tantas veces como se indique en la variable Temp_0

Delay movwf Temp_0 ;El bucle externo se repite 10 veces


Delay_0 movlw~ .195
movwf TMR0 ;El TMR0 se carga con 195
Delay_1 movf TMR0,W
btfss STATUS,Z ;Desborda al de 50 ms
goto Delay_1
decfsz Temp_0,F
goto Delay_0 ;Se esperan 10 desbordamientos para
;conseguir 0.5”
return

;Programa principal

Inicio movwf OSCCAL ;Almacena valor de calibración original


movlw b’11000111’ ;Preescaler 1:256 asignado al TMR0
option ;Pin GP2/T0CKI=GP2
movlw b’11101111’ ;Configura GP4 salida TxD
tris GPIO ;y GP5 como entrada RxD
movlw .2
call Delay ;Temporiza 100 ms para el Power Up
;del LCD

Loop movlw 0x0c


movwf Txdreg
call TxD ;Comando «Form_Feed», borra pantalla
movlw .1 ;Temporiza 50 ms para que termine
call Delay ;el comando anterior
movlw 0x83
movwf Txdreg ;Comando “Cursor_OFF”
call TxD

movlw ‘ ’
movwf Temp_1 ;Primer carácter de la lista (0x20)

Loop_1 movlw .32


movwf Temp_2 ;N.o de caracteres por pantalla
Loop_2 movf Temp_1,W ;Carácter a visualizar
movwf Txdreg
call TxD ;Visualiza el carácter
movlw .6
call Delay ;Temporiza 0.3”
incf Temp_1,F ;Siguiente carácter a visualizar
decfsz Temp_2,F ;Pantalla completa ??
goto Loop_2 ;No, sigue visualizando

movlw .20 ;Sí


call Delay ;Temporiza 1”
movlw 0x0c
movwf Txdreg
238 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

call TxD ;Comando “Form_Feed”, borra pantalla


movlw .1 ;Temporiza 50 ms para que termine
call Delay ;el comando anterior
btfss Temp_1,7 ;Último carácter ASCII (0x7F)
goto Loop_1 ;No, siguiente pantalla
movlw .20 ;Sí
call Delay ;Temporiza 1”
goto Loop
end

CONEXIONADO DE PERIFÉRICOS

Las conexiones son las que se muestran en el esquema de la Figura P9.2 y no hace falta
conectar la línea GP5. En la fotografía de la Figura P9.3 se muestra el montaje realizado
sobre la placa borrad de la PIC School. Conviene asegurarse del buen contacto de los
cables, porque este montaje se seguirá usando en prácticas posteriores.

Figura P9.3. Montaje práctico sobre el laboratorio.

EVALUACIÓN DEL PROGRAMA

Tras el ensamblado del programa y su grabación en la memoria del PIC12F508 con el


jumper JP4 en la posición MCL y el conmutador en la posición PC, se pasa el jumper
JP4 a la posición GP3, aunque no se usará en esta experiencia, y el conmutador a la
posición RUN.
CONTROLANDO UNA PANTALLA LCD 239

Se recomienda apagar y encender la PIC School para proceder correctamente a la


secuencia de inicio de la pantalla LCD. Irán apareciendo los distintos caracteres ASCII
de forma secuencial y organizados en páginas de treinta y dos caracteres. El proceso se
repite de forma indefinida.

P9.2. IMPLEMENTACIÓN DE UN «STACK» POR «SOFTWARE»


Un inconveniente de los modelos de PIC de la gama básica y del PIC12F508 en particu-
lar es su limitado stack o pila, con sólo dos niveles, lo que únicamente permite guardar
dos direcciones de retorno. Cada vez que en el programa se ejecuta un salto a subrutina
mediante la instrucción CALL, se salva en el stack automáticamente el valor actual del
PC que corresponde a la dirección de retorno. Cuando al final de la subrutina se ejecuta
RETLW, se recupera del stack la dirección guardada y se retorna al programa principal.
Como el stack o pila sólo tiene dos niveles, hay que tener mucho cuidado al confec-
cionar el programa para no emplear más de dos rutinas anidadas porque de lo contrario
se pierden las direcciones de retorno.
En esta práctica se desea construir un programa capaz de visualizar diversos mensa-
jes en la pantalla LCD, para lo cual será necesario emplear tres subrutinas anidadas, tal
como se muestra en la Figura P9.4.
Desde el programa principal se llama a la subrutina Mensaje, encargada de ir selec-
cionando cada uno de los diversos caracteres. Desde esta subrutina, se llama a la subru-
tina TxD, encargada de transmitir la información al LCD, y desde esta última, se llama
a la subrutina Delay_bit, encargada de la temporización entre un bit y el siguiente. En
el PIC12F508 sólo estarán almacenadas en la pila las dos últimas direcciones de retorno
correspondientes a las subrutinas Delay_bit y TxD y se habrá machacado el primer re-
torno correspondiente a la subrutina Mensaje.
Para subsanar el reducido tamaño de la pila se propone crear otra mediante software,
para lo cual se comienza definiendo la dirección de inicio de la misma:

Stack equ 0x0e ;Posición inicial para el stack por software

Figura P9.4. Anidamiento de tres subrutinas.


240 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Cada salto a una subrutina consumirá una posición de la memoria de datos RAM,
lo que determina el número de anidamientos que se pueden realizar según la memoria
disponible.
Para salvar la dirección de retorno se usa el direccionamiento indirecto, que guarda
el valor actual del PCL a partir de la posición inicial de la pila.

;Esta macro implementa un stack por soft. Cada vez que se usa
;el valor actual del PC se salva mediante el reg. INDF en
;una posición RAM

NCALL macro Destino


movf PCL,W
movwf INDF ;Salva el valor actual del PC
incf FSR,F ;Siguiente posición del stack
goto Destino ;Salto al inicio de la rutina
end

El valor actual del PCL se carga en el registro W con la instrucción movf PCL, W y
luego este registro se almacena sobre la posición de la memoria de datos destinada a la
pila con la instrucción movwf INDF. A continuación, se incrementa el puntero con incf
FSR, F y, finalmente, se salta a la dirección de destino con goto Destino. Estas cuatro
instrucciones sustituyen a la clásica instrucción CALL. Como es posible que haya que
usarlas en varias ocasiones, se agrupan en torno a una macro llamada NCALL Destino y
así no habrá que teclearlas en cada ocasión.
Para recuperar la dirección de retorno se ejecuta la siguiente secuencia de instruc-
ciones:

;El retorno se produce recuperando de RAM a través del reg. INDF el


;valor del PC al que se le añade +3 para apuntar a la siguiente
;instrucción justo después de la última NCALL ejecutada.

Retorno decf FSR,F ;Posición previa del stack


movlw 3
addwf INDF,W ;Ajusta desplazamiento para el PC
movwf PCL ;PC apunta a la siguiente instrucción

Se decrementa el puntero para recoger el valor de la posición previa de la pila (decf


FSR, F), se ajusta un desplazamiento de +3 que hay que aplicarlo sobre el PCL (movlw
3 y addwf INDF, W) y, finalmente, el resultado se aplica a PCL, lo que provoca el retor-
no inmediato a la dirección de partida. Estas instrucciones se agrupan en la macro goto
Retorno.
Mediante las macros NCALL Destino y goto Retorno se puede saltar y retornar a
cualquier subrutina. En la Figura P9.5 se muestra el esquema de trabajo utilizado.
El programa fuente de esta práctica en Ensamblador se halla contenido en el archivo
Ejem_7_2A.ASM. Cada vez que se emplea la macro NCALL Destino se consume una
posición de la RAM reservada para la pila, pero no un nivel de la pila implementada en
hardware en el procesador. Se pueden anidar tantas subrutinas como posiciones existan
disponibles. Sólo se guarda el valor de los 8 bits correspondientes al PCL, por lo que
CONTROLANDO UNA PANTALLA LCD 241

Figura P9.5. Estructura empleada en la creación de la pila por software.

todas las subrutinas deben estar situadas dentro de las 256 primeras posiciones de la
memoria de programa.
El fichero Ejem_7_2B.C contiene el programa en lenguaje C en el cual es el propio
compilador el que se encarga de gestionarlo de forma transparente para el usuario.
Una vez editado el programa, ensamblado y grabado en la FLASH del PIC12F508,
la ejecución del programa simplemente visualiza dos mensajes compuestos por varios
caracteres y durante cierto tiempo. También se emplean algunos comandos del controla-
dor SYM20AA para producir diferentes efectos de visualización: ubicación, parpadeo,
borrado, etc.

P9.3. GENERANDO CARACTERES GRÁFICOS


En la Figura P9.6 se muestra el juego completo de noventa y seis caracteres que soporta
el controlador SYM20AA y la pantalla LCD. Se corresponden con los caracteres ASCII
estándar y hay que tener en cuenta que el primero de todos es el «espacio», que no tiene
visualización, y que corresponde con la cuadrícula de la columna 2 (MSB = 0010) y la
fila 0 (LSB = 0000). A partir del «espacio» se encuentran todos los símbolos alfanumé-
ricos conocidos cuyos códigos están comprendidos entre el valor 0x20 y el 0x7F.
Otra interesante posibilidad del controlador SYM20AA consiste en crear nuevos
caracteres gráficos personalizados. Se pueden definir hasta ocho caracteres gráficos
mediante el comando Set_Char (0x8A). Dicho comando va acompañado del número
del carácter gráfico que está comprendido entre el 0 y el 7 y de 8 bytes que definen el
carácter.
242 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P9.6. Juego completo de los noventa y seis caracteres que admite el controlador SYM20AA y la
LCD. El «espacio» (columna 2, fila 0) no tiene representación.

Cada carácter se confecciona a partir de una matriz de píxeles formada por cinco
columnas y ocho filas, como se muestra en la Figura P9.7. Las ocho filas se correspon-
den con los 8 bytes (B0-B7) que definen al carácter y de los que sólo se emplean los
cinco bits de menos peso. Cualquier bit de la matriz que valga 1 produce la activación o
encendido del píxel correspondiente. Un nivel 0 lo apaga o desactiva.
En la Figura P9.8 se muestra la matriz de píxeles correspondiente a la letra ñ. En ella
también se muestra el valor de los 8 bytes que acompañan al comando Set_Char. Por eso,
para definir el carácter ñ, hay que enviar al controlador la secuencia

0x8B, 0x01, 0x00, 0x1F, 0x00, 0x17, 0x19, 0x11, 0x11, 0x11
CONTROLANDO UNA PANTALLA LCD 243

Figura P9.7. Estructura de la matriz de píxeles (8x5) que representan los caracteres.

en la que el primer valor 0x8B es el código del comando Set_Char, el valor 0x01 es el
correspondiente al número del carácter entre 0 y 7 y los restantes 8 bytes son los que
definen la matriz que conforma el carácter de la letra ñ.
Una vez que se ha definido un carácter, para visualizarlo basta simplemente con
enviar su número (0-7) como si se tratara de cualquier otro código ASCII.
Los archivos titulados Ejem_7_3A.ASM y Ejem_7_3B.C contienen los programas
fuente en Ensamblador y en C y comienzan definiendo los caracteres ñ y € para des-
pués visualizarlos. Analizando dichos programas, se puede deducir que para definir un
carácter basta con enviar una secuencia de bytes similar a cuando se visualizaban men-
sajes. Una vez definidos los caracteres, se pueden visualizar igual que los restantes. Los
caracteres hay que definirlos en tiempo de ejecución y se mantienen mientras la pantalla
LCD se halle alimentada.
Al ejecutar los programas máquina, se visualizan los caracteres ñ y € sobre la pan-
talla durante cierto tiempo con efectos de intermitencia.

Figura P9.8. Matriz de píxeles usada para representar la letra ñ.


244 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

P9.5. TRABAJO PERSONAL


Se proporciona una serie de experiencias a desarrollar que sirven para demostrar lo sen-
cillo que es manejar una pantalla LCD a través del controlador SYM20AA empleando
una sola línea del PIC12F508.

P9.5.1. Monitorización de señales de entrada


Se propone desarrollar un programa que visualice sobre una pantalla LCD el estado lógi-
co que está aplicándose por cinco líneas de entrada del PIC12F508. En la Figura P9.9 se
muestra el conexionado de las cuatro líneas de entrada (GP0-GP1-GP2-GP3-GP5) con
los interruptores E0-E4, respectivamente.

Figura P9.9. Esquema de conexionado de cinco interruptores a cinco líneas de entrada del microcontro-
lador. Se trata de visualizar en una pantalla LCD el estado lógico de las cinco entradas.

P9.5.2. Visualización de mensajes


En esta experiencia se propone confeccionar un programa que visualice secuencialmente
las siguientes palabras: Hola, voy a hacer un buen programa.
a
Manejando el bus I2C 10.
APLICACIÓN

P10.1. CONTROL DE OCHO SALIDAS CON EL BUS I2C


ENUNCIADO Y OBJETIVOS

Además del protocolo de comunicación serie RS232 ya estudiado en una práctica an-
terior, existen otros con diversas características. Entre los más populares, cabe citar al
RS485, USB, SPI, 1-Wire, CAN, etc. Cada uno de estos protocolos dispone de un grado
de desarrollo diferente, así como de una familia de dispositivos o circuitos integrados
que trabajan con cada uno. Entre los miembros típicos de estas familias, destacan:
• Conversores ADC y DAC.
• Controladores de displays, de teclados, de pantallas LCD, etc.
• Expansores o ampliadores de líneas de E/S, relojes y calendarios en tiempo real,
termómetros, etc.
• Dispositivos de todo tipo de memorias para aumentar su capacidad.
Esta práctica tiene como finalidad manejar el bus I2C, que a veces también se suele
escribir «por comodidad» como I2C. Se trata de un bus de comunicación serie que sólo
emplea dos líneas para transferir información. Se utilizará un circuito integrado especí-
fico para trabajar con dicho bus y que dispone de ocho líneas digitales de salida sobre
las que se va depositando la información que recibe por dicho bus. De esta forma, si se
implementa sobre dos líneas del PIC12F508, el bus I2C se podría conectar a ellas el dis-
positivo PCF8574A, que dispone de ocho líneas configurables de entrada/salida sobre
las que se depositaría la información serie que llega por el bus si actúan como salidas
o bien el estado de las ocho líneas si funcionan como entrada se envía en serie al micro
(maestro) por las dos líneas de este bus (Fig. P10.1). Se puede decir que las dos líneas de
E/S del micro que se han usado para soportar el bus I2C se han convertido en ocho.

PRINCIPIOS TEÓRICOS

El protocolo de comunicación serie I2C (Inter Integrated Circuit) fue diseñado por Philips
para facilitar y simplificar la comunicación entre circuitos integrados, tan habituales

245
246 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P10.1. Sistema basado en el bus I2C. El maestro es el micro porque genera los impulsos de reloj
por la línea SCL, mientras que la línea SDA soporta la transferencia bidireccional del
esclavo seleccionado con el maestro.

y numerosos en sus aparatos electrodomésticos y similares. Es uno de los protocolos


con mayor grado de desarrollo y dispone de una numerosa familia de dispositivos que
trabajan con él y que proporcionan CAD, CDA, ampliadores de E/S, controladores de
displays, ampliadores de memoria, etc.
Sólo se pretende presentar un resumen de las principales características del funcio-
namiento del bus I2C, recomendando a los lectores interesados amplíen esta información
con la enorme literartura que existe al respecto.
El protocolo I2C está concebido para comunicar al «maestro», que suele ser un mi-
crocontrolador con distintos dispositivos específicos («esclavos), a través de sólo dos
señales o líneas: la línea SDA, que es por la que se transfieren bidireccionalmente los
bits de información en serie, y la línea SCL, por las que el maestro envía los impulsos
de reloj para la sincronización. De esta forma, el maestro se comunica con cualquiera
de los dispositivos conectados a las dos líneas del bus. En la Figura P10.1 se muestra
un sistema basado en el bus I2C, en el cual el microcontrolador que actúa como maestro
(genera las señales de reloj por la línea SCL) se conecta con tres dispositivos esclavos:
uno es un CAD, otro un CDA y el tercero un expansor de ocho líneas de E/S, como el
modelo PCF8574A. Las líneas SDA y SCL se deben conectar a la alimentación +Vdd a
través de resistencias de push-pull (Rpu).
En la Figura P10.2 se presenta el diagrama de tiempos que muestra la sincronización
de los bits de datos presentes en la línea SDA con la señal de reloj de la línea SCL. Re-
cibe el nombre de «sincronismo de bit».
El bit que se transfiere por la línea SDA, sea un 1 o un 0, debe permanecer estable
durante el tiempo que la señal de reloj de la línea SCL se mantiene a nivel 1. Cuando la
señal de reloj pasa a 0, es cuando puede cambiar el bit de datos en SDA. Toda transfe-
rencia de información la inicia y la finaliza siempre el maestro. Así, da comienzo con
la «condición de inicio» S y termina con la «condición de stop» P. Como se aprecia en
la Figura P10.3, la condición de inicio S se produce cuando el maestro genera un flan-
co descendente en la línea de datos SDA al tiempo que mantiene a 1 la línea SCL. La
MANEJANDO EL BUS 12C 247

Figura P10.2. Sincronización de los bits de información que circulan por la línea SDA con los impulsos
de reloj de la línea SCL que genera el maestro.

condición de stop se origina con un flanco ascendente en SDA al mismo tiempo que se
mantiene a 1 la línea SCL (Fig. P10.3).

Figura P10.3. Forma en que se producen las condiciones de inicio y de stop cuando se comienza y se
termina una transferencia de datos.

Las transferencias siempre se realizan a nivel de byte. Cuando un dispositivo del


sistema, sea el maestro o un esclavo, recibe un byte está obligado a transmitir un noveno
bit llamado de «reconocimiento». Dicho bit es de nivel 0 si el byte previo ha sido recibi-
do, reconocido y admitido y entonces se llama ACK. En caso contrario, si el bit es un 1
(NACK) indica que el bit previo no ha sido reconocido. En la Figura P10.4 se muestra un
transmisor que está enviando un dato de un byte. Tras el octavo bit, el receptor devuelve el
bit ACK a modo de acuse de recibo y reconocimiento de recepción correcta del byte. Inde-
pendientemente de que sea el maestro el que transmita o reciba, siempre es él el encargado
de generar las señales de reloj por SCL y las condiciones de inicio y stop (Fig. P10.4).

Figura P10.4. Diagrama de tiempos que muestra el envío de un byte de información y el empleo del noveno
bit para soportar el bit de reconocimiento ACK generado por el receptor como reconoci-
miento de la información recibida correctamente.
248 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P10.5. Tres posibles secuencias de transferencias con el bus I2C.

En la Figura P10.5 se muestran tres tipos de posibles transferencias realizadas entre


el maestro y cualquier esclavo.
En la transferencia A de la Figura P10.5, tras el bit de inicio S, el maestro envía un
primer byte que contiene la dirección del esclavo que soporta los siete bits de más peso,
dejando al último para indicar que se procede a una operación de escritura si es un 1 o
bien de lectura si es un 0. En esta secuencia se trata de una escritura. El esclavo manda
al maestro un bit ACK por cada byte recibido. El maestro finaliza la transmisión con la
condición de stop P.
En la secuencia B, el maestro lee datos del esclavo. Por cada byte leído el maestro
genera un ACK y al finalizar la transmisión el maestro genera el bit de stop P. En la
última secuencia de la Figura P10.5, referenciada como C, el maestro primero se dirige
a un esclavo y luego a otro.
El circuito específico para I2C PCF8574A gestiona ocho líneas de E/S de propósito
general. Así, si el PIC12F508 funciona como maestro y utiliza dos líneas para el bus I2C
a cambio dispone de ocho líneas más de E/S. La Figura P10.6 muestra la dirección a la
que responde el PCF8574A. El byte de la dirección destina los siete primeros bits para
definir la dirección a la que responde en el bus I2C y el bit restante indica que se trata de
una operación de escritura o lectura. De los siete bits de la dirección, los cuatro de más
peso son fijos y vienen programados de fábrica (0111) y los otros tres son variables y su
valor lo determinan las patitas con su nombre (A2, A1 y A0). La dirección final responde
a 0111XXX. Con tres bits variables se pueden efectuar ocho combinaciones diferentes,
lo que significa que se podrían usar hasta ocho PCF8574A y llegar a expansionar el nú-
mero de líneas de E/S hasta 8 × 8 = 64.

Figura P10.6. El primer byte que manda el maestro al PCF8574A contiene la dirección y la orden de
escritura/lectura en el último bit. Delante está el bit de inicio y al final se añade el bit de stop.
MANEJANDO EL BUS 12C 249

El PCF8574A es muy sencillo de manejar, pues basta realizar sobre él operaciones


de lectura o escritura para conocer el estado de las líneas de entrada o fijar el valor de las
de salida, respectivamente. En la Figura P10.7 se muestra el diagrama de conexionado
de dicho circuito y la descripción de sus patitas.

PIN N.o Descripción


A0 1 Dirección variable A0
A1 2 Dirección variable A1
A2 3 Dirección variable A2
P0 4 Línea P0 de E/S
P1 5 Línea P1 de E/S
P2 6 Línea P2 de E/S
P3 7 Línea P3 de E/S
Vss 8 Alimentación GND
P4 9 Línea P4 de E/S
P5 10 Línea P5 de E/S
P6 11 Línea P6 de E/S
P7 12 Línea P7 de E/S
INT 13 Salida de interrupción
SCL 14 Línea de reloj I2C
SDA 15 Línea de datos I2C
Vdd 16 Alimentación +5 V

Figura P10.7. Diagrama de conexionado y descripción de las patitas del PCF854A.

MATERIALES NECESARIOS
• PIC School.
• PIC12F508.
• PCF8574A.
• Dos resistencias de 2K2.
• Cables de conexión.

NUEVAS INSTRUCCIONES

El PIC 12F508 no implementa en su silicio el hardware para soportar el protocolo del


bus I2C en dos de sus patitas, aunque otros PIC un poco superiores sí. Para poder usar di-
cho bus habrá que implementarlo mediante rutinas de software. El fichero I2CLOW.INC
proporcionado en el CD contiene una serie de rutinas para gestionar el protocolo del bus
I2C y que se muestran en la Tabla P10.1.
250 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Rutina Descripción
Inicia_Bus Configura las líneas SDA y SCL como entradas en alta impedancia, dejando
el bus libre.
Txt_Start_Bit Genera la condición de inicio S. Se produce un flanco descendente por la
línea SDA al tiempo que SCL se mantiene a nivel «1».
Txt_Stop_Bit Genera la condición de stop P. Se produce un flanco ascendente por la
línea SDA al tiempo que SCL se mantiene a nivel «1».
Txt_Byte Transmite el byte almacenado previamente en la variable DataByte y espera
a recibir el bit de reconocimiento ACK.
RcvByte Cada vez que se llama a esta rutina, se espera a recibir un byte que se alma-
cena en la variable DataByte. Por cada byte recibido, se genera y transmite
el bit de reconocimiento ACK. Caso de ser el último a recibir, se genera el
bit NACK. El bit _Ultimo_Byte del registro interno Bus_Status debe poner-
se a «0» o a «1» para indicar si es o no el último byte a recibir.

Tabla P10.1. Rutinas para gestionar el protocolo del bus I2C contenidas en el fichero I2CLOW.INC.

El programa fuente en Ensamblador debe contener una serie de definiciones previas.


El usuario es el encargado de determinar la frecuencia del oscilador principal, las patitas
del PIC que se usan para soportar las líneas SDA y SCL, la dirección inicial donde se
almacenan las siete variables que emplean las propias rutinas, etc.

CLKIN equ.4000000 ;Frecuencia del oscilador expresada en


;ciclos/segundo
;Definición de las líneas de E/S empleadas
;por el del bus I2C
#define _SCL GPIO,1 ;Línea de reloj
#define _SDA GPIO,0 ;Línea de datos
#define _SCL_TRIS TRIS_REG,1 ;Bit configuración línea de reloj
#define _SDA_TRIS TRIS_REG,0 ;Bit de configuración línea de datos
#define mascara b’11111100’ ;A “0” las líneas que se vayan a emplear
;como SCl y SDA
#define Puerto GPIO ;Puerto de E/S a emplear
I2CVAR equ 0x07 ;Inicio de las variables (7) empleadas
;por rutinas de Transmisión/Recepción I2C

Luego hay que incluir (include) el fichero I2CLOW.INC

org 0x00 ;Vector de Reset


goto Inicio

include “I2CLOW.INC” ;Incluir rutinas de Transmisión/Recepción I2C


MANEJANDO EL BUS 12C 251

CONEXIONADO DE PERIFÉRICOS

En esta experiencia se emplea el PCF8574A para controlar ocho diodos led que actúan
como salidas y que visualizan diferentes intermitencias. Como se muestra en la Figu-
ra P10.8, las líneas SDA y SCL se implementan en las líneas GP0 y GP1 del PIC12F508
que disponen de resistencias de 2K2 como push-pull.

Figura P10.8. Conexionado del PCF8574A, por un lado, al PIC12F508, y por otro, a los ocho diodos
led de salida.

Las patitas de direccionamiento A0-A2 se conectan a nivel 0 para formar la direc-


ción 0111000, a la que responde el dispositivo I2C PCF8574A.
Las salidas P0-P7 del PCF8574A se conectan con los diodos led S0-S7, que se en-
cienden cuando se les aplica nivel 1. Como la corriente que proporciona el PCF8574A
es muy pequeña, los diodos se iluminan muy poco. Hubiera sido preferible conectar las
salidas P0-P7 a los cátodos de los diodos, en cuyo caso se activarían por nivel 0 suminis-
trando 25 mA en cada salida, pero en la PIC School están disponibles los ánodos.

LOS PROGRAMAS FUENTE

Están contenidos en los archivos Ejem_8A.ASM y Ejem_8B.C en Ensamblador y en


C, respectivamente. La estructura del programa en Ensamblador es muy simple, pues
tras definir las variables y las constantes, el resto es muy secuencial y mecánico gracias
a las rutinas del fichero I2CLOW.INC. Se selecciona el dispositivo PCF8574A y se
elige el modo de escritura con el byte 01110000 y luego se transmite un valor de salida
(10101010), se temporiza, se transmite otro valor de salida (01010101) y se finaliza
enviando la secuencia de stop seguida de una temporización.
Puede observarse la gran simplicidad del mismo programa en lenguaje C. La direc-
tiva del preprocesador #use I2C(MASTER,SDA=PIN_B0,SCL=PIN_B1,SLOW) permite
el uso posterior de las funciones relacionadas con el protocolo. Establece que se trabaja-
rá en modo maestro las líneas que se usarán para soportar SDA y SCL. Esta directiva es
equivalente a include I2CLOW.INC que se emplea en la versión en Ensamblador.
252 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

;
; EJEMPLO 8
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;Para manejar la comunicación serie con el bus I2C, los leds de
;salida S0-S7 se conectan con las salidas P0-P7 del expansor
;I2C de E/S PCF8574A. Se realiza una alternancia en el encendido
;de los mismos

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Definiciones de registros internos

;Ajusta los valores de la palabra de configuración durante ensamblaje:


;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
;Estas u otras configuraciones se pueden seleccionar según necesidades

__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC

CLKIN equ .4000000 ;Frecuencia del oscilador expresada


;en ciclos/segundo

;Definición de las líneas de E/S empleadas por el del bus I2C

#define _SCL GPIO,1 ;Línea de reloj


#define _SDA GPIO,0 ;Línea de datos
#define _SCL_TRIS TRIS_REG,1 ;Bit de configuración línea de reloj
#define _SDA_TRIS TRIS_REG,0 ;Bit de configuración línea de datos
#define mascara b’11111100’ ;A “0” las líneas que se vaya a emplear
;como SCl y SDA
#define Puerto GPIO ;Puerto de E/S a emplear

I2CVAR equ 0x07 ;Inicio de variables (7) empleadas


;por rutinas Transmisión/Recepción
;I2C
Temp_0 equ 0x0e ;Variable temporal

org 0x00 ;Vector de Reset


goto Inicio

include «I2CLOW.INC» ;Rutinas Transmisión/Recepción


;I2C

;Bucle de temporización de 0.5 s. A una frecuencia de trabajo de


;4 MHz con un preescaler de 256, el TMR0 se carga con 195 (su
;complemento), por lo que desborda y pasa a 0 al de 50 ms
;(195*256*1=49920us).Se repite tantas veces como indique el reg. W

Delay movwf Temp_0 ;El bucle interno se repite n veces


Delay_0 movlw ~.195
movwf TMR0 ;El TMR0 se carga con 195
Delay_1 movf TMR0,W
MANEJANDO EL BUS 12C 253

btfss STATUS,Z ;Desborda al de 50 ms


goto Delay_1
decfsz Temp_0,F
goto Delay_0 ;Se esperan n desbordamientos
return
;Programa principal
Inicio movwf OSCCAL
movlw b’11000111’
option ;Preescaler 1:256 asignado al TMR0
Loop call Inicia_Bus ;Inicia líneas del bus I2C
call Txt_Start_Bit ;Envía condición de inicio
movlw b’01110000’
movwf DataByte ;Transmite dirección del dispositivo
;(01110000)
call Txt_Byte ;en el modo escritura
movlw b’10101010’
movwf DataByte
call Txt_Byte ;Transmite el byte de salida.
movlw .10
call Delay ;Temporiza 0.5”
movlw b’01010101’
movwf DataByte
call Txt_Byte ;Transmite byte de salida.
call Txt_Stop_Bit ;Transmite secuencia de STOP
movlw .10
call Delay ;Temporiza 0.5”
goto Loop
end

Código en C

// EJEMPLO 8
// Autor: Mikel Etxebarria
// (c) Ingeniería de Microsistemas Programados S.L.
// www.microcontroladores.com
// Bilbao 2006
//
//Comunicaciones serie I2C. Los leds de salida S0-S7 se conectan con las
//salidas P0-P7 del expansor de E/S PCF8574A. Se realiza una
//alternancia en el encendido de los mismos

#include <12F508.h>
//Ajusta los valores de la palabra de configuración durante el
//ensamblaje:
//Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
254 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

//Estas u otras configuraciones se pueden seleccionar según las


//necesidades
#fuses NOPROTECT,NOWDT,NOMCLR,INTRC
#use delay(clock=4000000) //Velocidad de trabajo
//Establece modo I2C Master
#use I2C(MASTER,SDA=PIN_B0,SCL=PIN_B1,SLOW)
main()
{
while(1)
{
i2c_start(); //Condición de inicio en el bus I2C
i2c_write(0b01110000); //Dirección (modo escritura) del
//dispositivo PCF8574A
i2c_write(0b10101010); //Se envía el dato al PCF8574A
delay_ms(500); //Temporiza 0.5”
i2c_write(0b01010101); //Se envía el dato al PCF8574A
i2c_stop(); //Condición de stop
delay_ms(500); //Temporiza 0.5”
}
}

EVALUACIÓN DEL FUNCIONAMIENTO


Realizadas las conexiones indicadas en el esquema de la Figura P10.8, ensamblado o
compilado el programa y grabado en la memoria del microcontrolador, se pone el con-
mutador en la posición RUN, recomendándose apagar y volver a encender el equipo, ya
que durante la grabación el dispositivo PCF8574A puede quedar bloqueado.
En la Figura P10.9 se muestra la fotografía del montaje de esta experiencia en la PIC
School. Los diodos led se iluminan muy poco, como ya se ha explicado.

Figura P10.9. Fotografía del montaje con el PCF8574A montado sobre la placa protoboard.
MANEJANDO EL BUS 12C 255

P10.2. CONTROL DE E/S CON EL BUS I2C


En esta experiencia se usan las líneas GP3-GP2 del PIC12F508 como líneas de entrada y
en función de sus valores se activan las salidas controladas por el PCF8574A de acuerdo
con la tabla mostrada en la Figura P10.10.

Entradas Salidas
GP3 GP2 P7 P6 P5 P4 P3 P2 P1 P0
0 0 1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1 0 1
1 0 0 0 0 0 1 1 1 1
1 1 1 1 1 1 0 0 0 0

Figura P10.10. Tabla a la que deben responder los ocho diodos led de salida en función del valor de las
dos líneas de entrada.

Se aprovechan algunas líneas del PIC12F508 para actuar como entradas, mientras
que con otras se implementa el bus I2C para controlar ocho salidas con un PCF8574A. El
esquema de conexionado de estos elementos se muestra en la Figura P10.11.

Figura P10.11. Esquema de conexionado de la experiencia con dos entradas y ocho salidas.

Los interruptores E0 y E1 se conectan a las líneas GP2 y GP3. Las líneas SDA y
SCL son implementadas por GP0 y GP1. «Es decir, con 4 líneas del microcontrolador se
están manejando diez periféricos digitales».
Los ficheros Ejem_8_2A.ASM y Ejem_8_2B.C contienen una posible solución a
la práctica planteada en ensamblador y en C y se descomponen en tres partes:

1.a Se analiza el estado de las entradas GP2 y GP3.


2.a Se calcula el valor de las salidas en función de la tabla de la Figura P10.10.
3.a Se transmite el valor calculado por el bus I2C.
256 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P10.12. Esquema de conexionado de la experiencia.

P10.3. CONTROLANDO ENTRADAS CON EL BUS I2C


En esta experiencia, las tres líneas P0-P2 del PCF8574A se configuran como entradas
que se conectan a tres interruptores y su valor se visualiza sobre tres diodos led (S0, S1
y S2) conectados a las líneas GP5, GP4 y GP2 del PIC12F508, tal y como se muestra en
el esquema de conexionado de la Figura P10.12.
El programa fuente en Ensamblador y C están contenidos en el CD bajo el título de
Ejem_8_3A.ASM y Ejem_8_3B.C, respectivamente. El programa realiza tres tareas:
lee el estado de las entradas, calcula el valor de salida en función de las entradas y depo-
sita dicho valor en las salidas.

P10.4. VISUALIZACIÓN DE DATOS EN LCD USANDO EL BUS I2C


Mediante el protocolo I2C y el dispositivo PCF8574A se lee el valor de ocho entradas
digitales conectados al mismo. Después, se trata de visualizar sobre una pantalla LCD
dicho valor. La pantalla LCD se gestiona con el controlador SYM20AA, que se gobierna
con el protocolo serie RS232.
El esquema de montaje de la experiencia se muestra en la Figura P10.13.

Figura P10.13. Esquema eléctrico del conexionado de la experiencia que maneja los protocolos I2C y RS232.
MANEJANDO EL BUS 12C 257

Figura P10.14. Montaje práctico.

GP0 y GP1 implementan las líneas SDA y SCL. Las líneas P0-P7 del PCF8574A
actúan como entradas y se conectan a los interruptores E0-E3 y a los pulsadores E4-E7.
La línea GP4 se usa para la transmisión RS232 y se emplea para comunicarse con el
controlador SYM20AA que gestiona la pantalla LCD. La fotografía de la Figura P10.14
muestra una zona del montaje de la experiencia sobre la PIC School y en ella se aprecia
la visualización de la pantalla LCD.
El programa fuente en Ensamblador y en C está contenido en el CD bajo los títulos
Ejem_8_4A.ASM y Ejem_8_4B.C. En ellos se incluyen los ficheros I2CLOW.INC y
RS232LOW.INC. Los programas leen las entradas y las visualizan en la pantalla LCD
sin efectuar ningún procesamiento.
Se recomienda apagar y volver a encender la PIC School al verificar esta experiencia
para que tanto la pantalla LCD como el bus I2C se inicialicen correctamente, pues tras la
grabación del PIC pueden haber quedado bloqueados.

P10.5. TRABAJO PERSONAL


Se propone el diseño de un automatismo que gestione un mínimo de tres entradas y otras
tantas salidas. Asimismo, se empleará una pantalla LCD en la que se informará sobre la
tarea que el automatismo está realizando en cada momento. Los mensajes de la pantalla
pueden ser: Temporizando, Activando la salida x, Alarma, Pulse entrada x, etc.
a
Aproximación
a la conversión A/D
11.
APLICACIÓN

P11.1. MIDIENDO EL TIEMPO DE CARGA DE UNA CÉLULA RC


ENUNCIADO Y OBJETIVOS

En esta experiencia se trata de medir el tiempo que tarda en cargarse un condensador


de cierto valor a través de una resistencia variable. Dicho tiempo permite averiguar el
valor de la resistencia cuando se conoce la «constante de tiempo» y el valor del con-
densador.
En el mundo real existe gran cantidad de dispositivos analógicos, como la mayoría
de los sensores que miden las condiciones ambientales; por ejemplo, las células LDR
que miden la luz, las resistencias PTC y NTC que miden la temperatura, las galgas para
medir peso, los sensores de velocidad, etc. Todos estos elementos varían su resistencia
interna en función de la magnitud que miden, y dicha variación es de tipo analógico
porque oscila entre dos límites pasando por cualquier valor intermedio. Como los micro-
controladores son procesadores digitales, deben recibir el valor analógico convertido a
digital. Como el PIC12F508 no dispone internamente de un conversor A/D, se propone
una técnica con la que se calcula la constante de carga de una célula RC externa y luego
el valor de la resistencia si se conoce el del condensador. Dicho valor es proporcional al
de la magnitud que se mide.

PRINCIPIOS TEÓRICOS

El esquema de la Figura P11.1 nos muestra la conexión de una célula RC a la patita de


entrada GP5 del PIC12F508.
En un primer momento, la línea GP5 actúa como salida a nivel 0. Esto provocará
que el condensador C1 se descargue transcurrido un breve espacio de tiempo. La resis-
tencia R1 evita picos de intensidad durante esta descarga. Acto seguido, la línea GP5
se configura como entrada en alta impedancia. En ese momento comienza la carga del
condensador a través de la resistencia RX hacia +5 Vcc. Llegará el momento en que C1
adquiera la carga o tensión suficiente como para que la entrada GP5 pase del nivel lógico
0 inicial a nivel 1.

259
260 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P11.1. Célula RC básica conectada a la patita GP5.

Podemos utilizar un timer o contador que nos permita conocer el número de impul-
sos o incrementos transcurridos desde que el condensador se descargó hasta que se carga
y la entrada GP5 pasa a nivel 1. Conocido el período de cada impulso, se multiplica por
el número de éstos, calculando el tiempo transcurrido.
El diagrama de la Figura P11.2 resume el funcionamiento. En el instante reset, la
línea GP5 se configura como salida a 0. El condensador se descarga y Vc pasa a 0V
transcurrido un cierto tiempo. En el instante start, GP5 se configura como entrada en alta
impedancia y el contador se pone a 0. Comienza la carga y el contador va incrementán-
dose a eventos regulares de tiempo. El instante stop representa que la tensión Vc en el
condensador ha alcanzado el valor de 1,25 V, con el que la entrada GP5 pasa de 0 a 1. Es la
tensión de umbral con la que cambia de estado una línea de entrada. Para otros dispositi-
vos, consultar las especificaciones. En este momento se detiene la cuenta. Se multiplica
el valor del contador por el tiempo que dura cada incremento y se obtiene el valor t, que
representa la constante de carga.

Figura P11.2. Diagrama de tiempos.


APROXIMACIÓN A LA CONVERSIÓN A/D 261

La fórmula siguiente permite calcular teóricamente el tiempo de carga de un con-


densador en función de los valores de R y C:
 Vth 
t = − R · C · ln  1 − 
 Vdd 

donde
t= Tiempo transcurrido en segundos.
R= Valor de la resistencia en ohmios.
C= Valor del condensador en faradios.
Vth = Tensión con la que se carga el condensador y con la que se produce el cambio
de estado en el pin de entrada (1,25 V en el caso del PIC12F508).
Vdd = Tensión de alimentación (+5 Vcc).

De esta ecuación se puede despejar a R y/o a C, según interese.

−t −t
R= C=
 Vth   Vth 
C · ln  1 −  R · ln  1 − 
 Vdd   Vdd 

Las tres ecuaciones anteriores se pueden simplificar en el caso particular que nos
ocupa. Efectivamente, si tenemos en cuenta que Vth = 1,25 V y Vdd = 5 V, la función
 Vth 
ln  1 −
  se puede sustituir por la constante – 0,287682072, con lo que queda:
Vdd 

−t −t
t = − R · C (− 0, 287682072) R= C=
C (− 0, 287682072) R (− 0, 287682072)

MATERIALES NECESARIOS
• Laboratorio PIC School.
• PIC12F508.
• Controlador de LCD SYM20AA.
• Una resistencia de 220 Ω; dos de 1 K; una de 2K2; una de 3K3; una de 4K7;
cinco de 10 K; una de 22 K; una de 47 K; una de 100K, y una de 1 M.
• Una resistencia NTC de 10 KΩ
• Una resistencia LDR.
• Un condensador de 1µF.
• Cables de conexión.

ESQUEMA DE CONEXIONADO

A lo largo de esta práctica se irán proponiendo diferentes ejercicios relacionados con la


medida de la constante de tiempo RC, así como algunas de sus aplicaciones, que pueden
ser numerosas y muy interesantes. En todos estos ejercicios vamos a emplear la pantalla
262 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

LCD junto con su correspondiente controlador SYM20 para visualizar las medidas rea-
lizadas de una forma rápida y cómoda.

P11.2. MIDIENDO LA CONSTANTE DE TIEMPO RC


Este ejercicio se puede considerar como un «banco de pruebas». Básicamente,
se trata de hacer una aplicación que nos permita medir la constante de tiempo de
una célula RC sean cuales sean los valores de sus componentes y que nos servirá
para tomar diferentes medidas y referencias que podremos emplear en posteriores
aplicaciones.
Montar el esquema mostrado en la Figura P11.3. La línea GP4 actúa como salida
serie para el controlador SYM20AA, que, a su vez, gobierna la pantalla LCD, sobre la
que se visualizarán los resultados obtenidos en las diferentes medidas.
El pulsador E4 del laboratorio PIC School se conecta con la entrada GP3. Cada vez
que se produzca un pulso 1-0-1 en esta entrada se realiza una nueva medida.
Finalmente, la célula RC se conecta con la línea GP5. En estos ejemplos, el conden-
sador empleado es fijo de 1 uF y la resistencia Rx será variable.

P11.2.1. Programa fuente


Los ficheros Ejem_9A.ASM y Ejem_9B.C contienen las versiones en Ensamblador
y en C, respectivamente. Estos programas los emplearemos a lo largo de los ejercicios
propuestos. Si echamos un vistazo al programa principal de la versión en Ensamblador,
se pueden distinguir claramente las diferentes secciones. Una vez realizada las configu-
raciones pertinentes, el programa empieza testeando la entrada GP3 para comprobar si
se ha accionado o no el pulsador E4 al que está conectada. Seguidamente, se coloca el

Figura P11.3. Esquema de montaje del «banco de pruebas».


APROXIMACIÓN A LA CONVERSIÓN A/D 263

cursor de la pantalla LCD en la sexta columna de la primera fila y se procede a realizar


la medida del tiempo de carga del condensador.
La medida se realiza básicamente como ya se ha explicado. La línea GP5 se
configura como salida a nivel 0 para descargar el condensador. Se realiza una es-
pera de unos 5 ms para esperar la descarga total y se pone el contador a 0. Inme-
diatamente, GP5 se configura como entrada y se testea el momento en que pasa a
nivel 1. Un contador de 16 bits se va incrementando en una unidad cada vez que la
entrada GP5 se mantenga en 0. Cuando ésta pasa a 1, la cuenta se detiene y se da
por finalizada la medida. Si se analiza con cuidado las instrucciones de incremento
del contador, se puede apreciar claramente que éste lo hace cada 5 µs aproximada-
mente trabajando a 4 MHz. Es el tiempo que tardan en ejecutarse las instrucciones
de testeo de GP5.
Finalmente, el valor del contador se visualiza en hexadecimal sobre la pantalla LCD.
Para ello, cada dígito de ese contador hay que convertirlo al carácter ASCII correspon-
diente. El bucle se repite con una nueva transición en la entrada GP3. Para obtener el
tiempo de carga t habrá que multiplicar el valor visualizado por 5.
Si se analiza el programa fuente en la versión C, se puede apreciar que la secuen-
cia es muy similar. Se ha creado una función llamada Medir() cuyo funcionamiento es
idéntico a lo explicado anteriormente. Hay que indicar que las funciones de chequeo
de GP5 e incremento del contador en una unidad (while(bit_test(Puerto,Input)==0) y
++tiempo) consumen 7 us en lugar de 5. Sin embargo, una de las ventajas de emplear
el lenguaje C es su facilidad a la hora de hacer cálculos. Es por ello que se visualiza el
valor del contador al que directamente se le multiplica por 7. En la pantalla LCD aparece
el resultado definitivo en hexadecimal.

PROGRAMA FUENTE EN ENSAMBLADOR

;
; EJEMPLO 9
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;Medida de la constante de tiempo RC. Este ejemplo sirve para medir
;el tiempo de carga de un condensador a través de una resistencia.
;En la pantalla LCD se visualiza en hex. el valor medido, al que habrá
;que multiplicar por 5 (debido a que cada incremento se ejecuta
;cada 5 us trabajando a 4 MHz) para obtener el tiempo total en us
;(en hex.). El programa se puede considerar como un banco de pruebas
;para medir el tiempo en función de diferentes valores de R y/o de C.
;Cada transición 1-0-1 en GP3 origina una nueva medida

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Definiciones de registros internos

;Ajusta los valores de la palabra de configuración durante el ensamblaje:


;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
264 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

;Estas u otras configuraciones se pueden seleccionar según las


;necesidades

__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC

;Las siguientes variables determinan el tipo y velocidad de la


;comunicación

CLKIN equ .4000000 ;Frecuencia del oscilador expresada en


;ciclos/segundo
BAUDIOS equ .9600 ;Velocidad de transferencia
T_MODO equ 1 ;Transmite 1.o el bit LSB (a 0 transmite
;1.o el bit MSB)
R_MODO equ 1 ;Recibe 1.o el bit LSB (a 0 recibe 1.o el
;bit MSB)
T_Nbit equ .8 ;N.o de bits a transmitir (7 u 8)
R_Nbit equ .8 ;N.o de bits a recibir (7 u 8)
Sbit equ .1 ;N.o de bits de stop (1 o 2)

#define Txd_pin GPIO,4 ;Línea de transmisión GP4


#define Rxd_pin GPIO,5 ;Línea de recepción GP5

#define Input 5 ;Línea de entrada analógica GP5


#define Pulsador 3 ;Línea de entrada del pulsador GP3
#define Puerto GPIO ;Puerto de entrada empleado

RS232VAR equ 0x07 ;Inicio de las variables (5) empleadas


;por las rutinas de Transmisión/Recepción
Trisreg equ 0x0c
Cont_H equ 0x0d
Cont_L equ 0x0e
Temp_0 equ 0x0f ;Variables temporales

org 0x00 ;Vector de Reset


goto Inicio

include “RS232LOW.INC” ;Incluir rutinas de Transmisión/Recepción

;Rutina de conversión de hex. a ASCII. Convierte el dígito hex.


;contenido en W en el correspondiente caracter ASCII que retorna en la
;variable Temp_0

ASCII movwf Temp_0 ;Salva dígito hex. original


movlw 0x0a
subwf Temp_0,W
btfsc STATUS,C ;Mayor de 9 ??
goto ASCII_1 ;Sí
movlw 0x30 ;No, añade offset 0x30 (0-9)
addwf Temp_0,F
retlw 0
ASCII_1 movlw 0x37 ;Añade offset 0x37 (A-F)
addwf Temp_0,F
retlw 0
APROXIMACIÓN A LA CONVERSIÓN A/D 265

;Temporización de propósito general. Trabajando a 4 MHz y con un


;preescaler de 256, el TMR0 evoluciona cada 256 us. Si se carga con
;20 rebasa al de 5120 us (5 ms).Esto se repite tantas veces indique W

Delay movwf Temp_0


Delay_1 movlw ~.20
movwf TMR0
Delay_2 movf TMR0,W
btfss STATUS,Z
goto Delay_2
decfsz Temp_0
goto Delay_1
retlw 0

;Rutina encargada de medir el tiempo que tarda en cargarse el


;condensador de C entrada. Un contador de 16 bits se va incrementando,
;mientras que la entrada esté a “0”. Al tiempo medido hay que
;multiplicarle por 5, que son los us que tarda cada incremento
;trabajando a 4 MHz. El resultado es un valor hexadecimal

Medir bcf Trisreg,Input


movf Trisreg,W
tris Puerto ;La línea de entrada se configura como
;salida

bcf Puerto,Input ;La salida =”0”. Se descarga el


;condensador
movlw .1
call Delay ;Temporiza 5 ms para descargar el
;condensador

clrf Cont_H
clrf Cont_L ;Inicio del contador

bsf Trisreg,Input
movf Trisreg,W
tris Puerto ;La línea se configura como entrada,
;comienza la cuenta...

Medir_1 btfsc Puerto,Input ;Lee el estado de la entrada analógica


retlw 0 ;Si está a «1» fin de la medida,
;condensador cargado.

incfsz Cont_L,F ;Incrementa parte baja


goto Medir_1
incfsz Cont_H,F ;Incrementa parte alta
goto Medir_1
comf Cont_L
comf Cont_H ;Sobrepasamiento, Contador=0xFFFF
retlw 0

;Programa principal

Inicio movwf OSCCAL


movlw b’11000111’ ;Preescaler 1:256 asignado al TMR0
266 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

option ;GP2 línea de E/S


movlw b’11101111’
movwf Trisreg
tris Puerto ;GP5 entrada analógica y GP4 salida al LCD
movlw .20
call Delay ;Temporiza 100ms para Power Up de LCD

;Espera una transición 1-0-1 en GP3 para realizar una nueva medida

Loop btfsc Puerto,Pulsador


goto Loop
movlw .4
call Delay
Loop_1 btfss Puerto,Pulsador
goto Loop_1
movlw .4
call Delay

;Coloca el cursor del LCD en la 6.a posición de la 1.a línea

movlw 0x8a
movwf Txdreg
call TxD ;Comando «Set Cursor»
movlw .1
movwf Txdreg
call TxD ;Fila 1
movlw .6
movwf Txdreg
call TxD ;Columna 6

;Realiza la medida del tiempo de carga del condensador

call Medir

;Visualiza sobre el LCD

;1.o el byte de más peso (Cont_H)

swapf Cont_H,W
andlw 0x0f ;Nibble alto de Cont_H
call ASCII ;Convierte a ASCII
movf Temp_0,W ;Lee el carácter ASCII
movwf Txdreg
call TxD ;Lo visualiza
movf Cont_H,W
andlw 0x0f ;Nibble bajo de Cont_H
call ASCII ;Convierte a ASCII
movf Temp_0,W ;Lee el carácter ASCII
movwf Txdreg
call TxD ;Lo visualiza

;2.o el byte de menos peso (Cont_L)

swapf Cont_L,W
andlw 0x0f ;Nibble alto de Cont_L
APROXIMACIÓN A LA CONVERSIÓN A/D 267

call ASCII ;Convierte a ASCII


movf Temp_0,W ;Lee el carácter ASCII
movwf Txdreg
call TxD ;Lo visualiza
movf Cont_L,W
andlw 0x0f ;Nibble bajo de Cont_L
call ASCII ;Convierte a ASCII
movf Temp_0,W ;Lee el carácter ASCII
movwf Txdreg
call TxD ;Lo visualiza

goto Loop

end

PROGRAMA FUENTE EN C

// EJEMPLO 9
// Autor: Mikel Etxebarria
// (c) Ingeniería de Microsistemas Programados S.L.
// www.microcontroladores.com
// Bilbao 2006
//
//Medida de la constante RC. Este ejemplo sirve para medir el tiempo
//de carga de un condensador a través de una resistencia.
//En la pantalla LCD se visualiza en hex. el valor medido, al que
//habrá que multiplicar por 7 (debido a que cada incremento se
//ejecuta cada 7 us trabajando a 4 MHz) para obtener el tiempo total
//en us (en hex.). El programa se puede considerar como un banco de
//pruebas para medir el tiempo en función de diferentes valores de
//R y/o de C. Cada transición 1-0-1 en GP3 origina una nueva medida

#include <12F508.h>

//Ajusta los valores de la palabra de configuración durante el


//ensamblaje:
//Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
//Estas u otras configuraciones se pueden seleccionar según las
//necesidades

#fuses NOPROTECT,NOWDT,NOMCLR,INTRC

#use delay(clock=4000000) //Velocidad de trabajo

//Establece modo de comunicación: 9600 baudios, 8 bits sin paridad


#use RS232(baud=9600, bits=8, parity=n, xmit=PIN_B4, rcv=PIN_B5)

#define Input 5 //Línea de entrada analógica GP5


#define Pulsador 3 //Entrada del pulsador GP3
268 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

#byte Puerto=0x06 //Puerto de entrada

int16 tiempo;
int Trisreg;

//Función que realiza la medida del tiempo en que tarda en cargarse el


//condensador

medir()
{
bit_clear(Trisreg,Input);
set_tris_b(Trisreg); //La línea se configura como salida

bit_clear(Puerto,Input); //Salida =“0”.Se descarga condensador


delay_ms(5); //Temporiza 5 ms para descargar C

tiempo=0; //Inicio del contador

bit_set(Trisreg,Input);
set_tris_B(Trisreg); //La línea se configura como entrada

while(bit_test(Puerto,Input)==0)//Condensador cargado
++tiempo; //No, el contador se incrementa

//Cada incremento se ejecuta en unos 7 us. Por ello al valor medido


//hay que multiplicarlo por 7 para obtener el tiempo total
//(en hexadecimal)
}

main()
{
set_tris_b(0b11101111); //GP4 salida Txd resto entradas
Trisreg=0b11101111; //Salva valor del TRIS
delay_ms(100); //Espera 100 ms para el Power Up del LCD

while(1)
{
//Esperar una transición 1-0-1 en la entrada GP3
while(bit_test(Puerto,Pulsador)==1){}
delay_ms(20);
while(bit_test(Puerto,Pulsador)==0) {}
delay_ms(20);

//Realizar la medida
putc(0x8a); //Comando «Set_Cursor»
putc(0x01); //fila 1
putc(0x06); //columna 6
medir(); //Función para realizar la medida de tiempo
printf(«%lX\n\r»,tiempo*7);//Visualiza la medida con el ajuste (*7)
}
}
APROXIMACIÓN A LA CONVERSIÓN A/D 269

Figura P11.4. Montaje práctico del «banco de pruebas».

P11.2.2. Evaluación del programa


Suponemos realizadas las conexiones eléctricas indicadas en el esquema anterior y que
el programa fuente ha sido debidamente ensamblado y/o compilado. Procedemos a gra-
bar el programa ejecutable *.HEX sobre el dispositivo. Se recuerda que en el momento
de la grabación el puente JP4 debe estar en la posición MCLR y el conmutador en la
posición PC. En ejecución, el jumper se pasa a la posición GP3 (donde queda conectado
con el pulsador E4) y el conmutador en la posición RUN.
Se recomienda apagar el laboratorio y volverlo a encender. De esta forma, se garan-
tiza una correcta secuencia de inicio de la pantalla LCD. La Figura P11.4 muestra una
fotografía con el montaje práctico.

a) Midiendo constantes de tiempo con resistencias fijas

Vamos a completar la siguiente tabla con las diferentes medidas obtenidas en función
de las diferentes resistencias fijas empleadas. En la columna Teórico se anota el valor
teórico que debe calcularse para cada caso según la ecuación simplificada:

t = – R · C ( – 0,287682072)

En la columna Práctico se debe indicar el valor obtenido en la pantalla LCD. Se


recuerda que todas las lecturas son en hexadecimal (se sugiere convertirlas a decimal).
Si se ejecuta la versión en Ensamblador, a dicha lectura hay que multiplicarla por 5. Si
empleamos la versión en C, la pantalla nos muestra directamente el valor del tiempo (ya
está multiplicado por 7). La lectura siempre expresa microsegundos.
La forma de proceder es muy sencilla. Colocamos la resistencia indicada y pulsamos E4.
Tomamos nota del valor indicado en el LCD.
270 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Resistencia Teórico Práctico


1 KΩ
2 K2Ω
3 K3Ω
4 K7Ω
10 KΩ
22 KΩ
47 KΩ
100 KΩ
1 MΩ

Con los datos a la vista se pueden sacar diferentes conclusiones. En primer lugar, hay
que indicar que los valores teóricos y prácticos no son iguales, pero sí parecidos. Esto es
debido fundamentalmente a la tolerancia de los componentes. Por el mismo motivo, dos
o más lecturas realizadas con la misma resistencia no tienen por qué ser iguales.
Con la resistencia de 1 MΩ, la lectura es totalmente incorrecta. Teóricamente, el
tiempo de carga es del orden de 280.000 µs. Sin embargo, como estamos empleando un
contador de 16 bits, esta magnitud no se puede representar y se produce un desborda-
miento del mismo. Para medir de constantes de tiempo con valores de R muy grandes
bien aumentamos el tamaño del contador o bien disminuimos el valor de C.

¡Atención! No estamos midiendo el valor en ohmios de las resistencias. Estamos mi-


diendo la constante de tiempo o tiempo de carga de un condensador a través de ellas.

b) Midiendo la constante de tiempo con una resistencia variable

Empleamos el mismo programa que antes que nos sirve como banco de pruebas. Monta-
remos el circuito de la Figura P11.5. La célula RC está formada por el condensador C1 y
una resistencia de 1 KΩ en serie con un potenciómetro de 10 KΩ. Se trata de uno de los
dos potenciómetros que dispone el laboratorio PIC School.

Figura P11.5. Célula RC utilizando un potenciómetro.


APROXIMACIÓN A LA CONVERSIÓN A/D 271

Con el eje desde un extremo al otro se obtiene una resistencia mínima de 1 KΩ y una
máxima de 11 KΩ respecto al otro extremo, que origina una constante de tiempo mínima
y otra máxima. Mediante la siguiente tabla, podemos obtener unos valores de referencia
para distintas posiciones en el recorrido del eje del potenciómetro. Recordar que para
realizar una nueva medida es necesario aplicar un pulso mediante el pulsador E4.

1⁄4 del 1⁄2 del 3⁄4 del


Posición Tope izdo. Tope dcho.
recorrido recorrido recorrido
Valor en µs

Obviamente, los valores obtenidos no se corresponden con los valores resistivos del
potenciómetro, pero son orientativos y representan una magnitud numérica que varía en
función de la posición en que se encuentra su eje. Esta magnitud puede ser empleada
para cualquier tipo de cálculo o proceso posterior.

c) Midiendo la constante de tiempo con una célula LDR

La célula LDR es un dispositivo cuya resistencia varía en función de la luz visible que
incide sobre ella. Al aumentar la luz, disminuye la resistencia y, por tanto, disminuye tam-
bién la constante de tiempo de carga, y viceversa. El circuito responde al esquema de la
Figura P11.6. Se sustituye la resistencia fija y/o el potenciómetro por el dispositivo LDR.
Se sugiere emplear una fuente de luz (por ejemplo, una linterna) justo encima de la
LDR a una distancia de unos 30 cm. Entre la fuente de luz y la LDR interpondremos un
cuerpo opaco (por ejemplo, un trozo de cartón) a diferentes distancias respecto a la LDR
y tomaremos así diferentes medidas de la constante de tiempo. Completar la siguiente
tabla.

Figura P11.6. Célula RC mediante LDR.


272 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Distancia 0 cm 5 cm 10 cm 15 cm 20 cm
Valor en µs

Los valores obtenidos no representan el valor en ohmios de la LDR, representan los


microsegundos de la constante de tiempo de carga. Sin embargo, esta constante de carga
es inversamente proporcional a la luz que incide sobre la célula LDR. Los valores obte-
nidos suponen una referencia numérica que permiten cualquier tipo de cálculo o proceso
posterior en función de la luz ambiente.

d) Midiendo la constante de tiempo con una NTC

La NTC pertenece al grupo de resistencias variables no lineales. Su resistencia es inver-


samente proporcional a la temperatura: a más temperatura, menos resistencia y, por tan-
to, menor será el tiempo de la constante de carga. A menor temperatura, más resistencia
y mayor constante de carga.
La resistencia que presenta la NTC en función de la temperatura viene dada según
la siguiente ecuación:
  1  1 
 β   −   
R = Ro · e  T To 

donde
R = Resistencia total en ohmios.
Ro = Valor nominal de la NTC a temperatura ambiente de 25 °C. La empleada en
el ejemplo es de 10 KΩ.
β = Constante proporcionada por el fabricante. Para una NTC de 10 K esta cons-
tante es de 3.977 aproximadamente.
T = Temperatura en °K (0 °C = 273 °K).
To = Temperatura ambiente en °K (25 + 273 = 298 °K).

A partir de esta ecuación, podremos conocer la temperatura a la que está sometida la


NTC a partir de su resistencia. Despejamos T y nos queda la siguiente ecuación:

β · To
T=
 R
To  ln +β
 Ro 

Así, pues, podemos medir la constante de tiempo t en una célula RC que emplea una
NTC. A continuación, podemos deducir cuál será la R que presenta la NTC en ese mo-
mento. Conocido el valor de R y empleando la ecuación anterior, podremos calcular fi-
nalmente la temperatura a la que está sometida esa NTC. Debemos tener siempre presente
que las tolerancias de los componentes pueden provocar variaciones en los cálculos.
Móntese el circuito de la Figura P11.7. La resistencia empleada ahora en la célula RC
es una resistencia NTC. En el comercio se pueden conseguir de diferentes valores, que
siempre están relacionadas con la temperatura ambiente. Es decir, si compramos una NTC
APROXIMACIÓN A LA CONVERSIÓN A/D 273

Figura P11.7. Célula RC mediante NTC.

de 1 KΩ estamos comprando una resistencia que a 25 °C tiene un valor de 1.000 Ω. En los


ejemplos se emplea una NTC de 10 KΩ a 25 °C y con una constante β de 3.977.
Para completar la siguiente tabla de la verdad vamos a emplear una fuente de calor,
como una vela encendida, que la iremos acercando a la resistencia NTC al tiempo que
vamos haciendo la correspondiente medida.

0 mm
Distancia 10 mm 8 mm 5 mm 3 mm
(en contacto)
Valor en µs

Al igual que en los experimentos anteriores, el valor leído en el LCD indica el tiem-
po de carga expresado en microsegundos y nunca la temperatura. En cualquier caso, se
puede apreciar que cuanto más calor se aplique a la NTC, menor es su resistencia y, por
tanto, también es menor la constante de tiempo. Los valores obtenidos se pueden em-
plear como valores de referencia en posteriores aplicaciones.

P11.3. DETECTANDO LA ACTIVACIÓN DE DISPOSITIVOS


ELECTROMECÁNICOS

Como consecuencia de todo lo expuesto hasta el momento, una aplicación inmediata


es la posibilidad de detectar el accionamiento de pulsadores, interruptores, finales de
carrera y, en general, cualquier mecanismo capaz de abrir o cerrar un circuito eléctrico.
Echemos un vistazo al circuito de la Figura P11.8.
La célula RC, cuya constante de tiempo de carga vamos a medir, está formada
por el condensador C1 y las resistencias R2-R6, que están en serie. Cuatro pulsadores
cortocircuitan y anulan ciertas resistencias haciendo que la resistencia total varíe y
con ello la constante de tiempo. Si no se pulsa ninguno, la resistencia total es la suma
de R2 + R3 + R4 + R5 + R6 = 50 KΩ. Cuando se pulsa el pulsador 4, se anulan las
resistencias R3 a R6 siendo la total de 10 KΩ. Si se acciona el pulsador 3, se anulan de
R4 a R6, siendo la total de 20 KΩ. Al accionar el 3, se anulan R5 y R6, quedando una
resistencia total de 30 KΩ. Finalmente, si se acciona el pulsador 4, se anula R6, siendo
la resistencia total de 40 KΩ.
274 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P11.8. Detectando varios pulsadores.

La Figura P11.9 muestra el esquema práctico del montaje que vamos a realizar. Se van
a emplear cuatro de las dieciséis teclas que contiene el teclado del laboratorio PIC School.
Las teclas están organizadas en cuatro columnas (C0-C3) y cuatro filas (F0-F3). Utiliza-
remos los cuatro pulsadores de las columnas C0-C3 asociados a la fila F0. En contra de lo

Figura P11.9. Conexión de las teclas de PIC School.


APROXIMACIÓN A LA CONVERSIÓN A/D 275

Figura P11.10. Fotografía del montaje práctico.

que pueda parecer, el montaje es muy sencillo. La línea C0 está asociada a la tecla 1 y se
conecta entre R6 y R5. La línea C1 está asociada a la tecla 2 y simplemente se conecta entre
R5 y R4. La línea C2 corresponde con la tecla 3 y se conecta entre R4 y R3. La línea C3 está
asociada con la tecla A y se conecta entre R3 y R2. Por último, la línea F0 se corresponde
con las cuatro teclas anteriores y simplemente se conecta con R6 y +5 Vcc. La Figura P11.10
muestra una fotografía con el montaje realizado sobre el laboratorio PIC School.
Se sigue empleando el mismo programa Ejem_9A.ASM o Ejem_9B.C que hemos
utilizado hasta ahora y que simplemente realiza y visualiza una medida de la constante
de tiempo. En esta ocasión, mantenemos pulsada cualquiera de las cuatro teclas a la vez
que accionamos el pulsador E4 para iniciar la medida. Completar la siguiente tabla con
los valores de tiempo en microsegundos obtenidos según la tecla accionada.

Pulsar 1 2 3 A Ninguna
Valor

Como vemos, por cada medida se obtiene un valor numérico (no resistivo) que nos
indica qué tecla se ha accionado. Este valor se puede emplear para realizar los procesos
apropiados dentro de la aplicación final.
Naturalmente, variando el valor de las resistencias podremos detectar la pulsación o
activación de un gran número de mecanismos.

P11.4. CONTROLANDO UN TECLADO MATRICIAL


Podemos seguir rizando el rizo. Basándonos en lo anterior, podremos gobernar un tecla-
do matricial como el que dispone el laboratorio PIC School o mayor.
276 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P11.11. Esquema para el control de un teclado matricial.

La Figura P11.11 muestra el esquema de conexiones que emplearemos para el con-


trol del teclado del laboratorio PIC School y determinar la tecla pulsada.
Cada vez que se pulsa una tecla, se cierra el circuito entre una fila y una columna.
Por ejemplo, si se pulsa la tecla 1, se conecta la fila F0 con la columna C0. Esto es, la
resistencia R2 queda en serie con R6 con una resistencia total próxima a los 2 KΩ, lo que
produce una constante de tiempo determinada. Si se pulsa la tecla 9, se cierra el circuito
entre la fila F2 y la columna C2 y se conectan las resistencias R4 con R8, formando una
equivalente próxima a los 25 KΩ que genera la constante de tiempo correspondiente. Si
no se pulsa ninguna tecla, la constante RC queda formada por C1 y R10 de 100 KΩ, lo
que genera otra constante de tiempo distinta de todas las demás.
Se utiliza el mismo programa que nos ha servido como banco de pruebas para tes-
tear y medir las constantes de carga en función de los valores de R. Completaremos la
siguiente tabla anotando los valores generados para cada tecla que se pulse. Debemos
recordar que para realizar una nueva medida hay que accionar E4.

--
Tecla -- 1 2 3 A 4 5 6 B 7 8 9 C * 0 # D
-
Valor

Se insiste en que debido a las tolerancias propias de las resistencias (mayor cuanto
mayor sea el valor de éstas) y del condensador se pueden obtener medidas distintas a pe-
APROXIMACIÓN A LA CONVERSIÓN A/D 277

sar de haber pulsado una misma tecla, pero nunca dos teclas distintas tendrán un mismo
valor. Todo es mejorable y sirvan los presentes ejercicios para adquirir ideas y utilidades
que se puedan emplear en posteriores proyectos y aplicaciones reales.

¡No está nada mal el resultado obtenido si tenemos en cuenta que sólo se emplea
un línea de entrada del PIC12F508!
a
Transmisión y recepción
por RF
12.
APLICACIÓN

P12.1. TRANSMISOR DE CUATRO CANALES DE RF


ENUNCIADO Y OBJETIVOS

La presente experiencia consiste en construir un emisor de RF que codifica cuatro canales


o señales de entrada. El PIC12F508 se va a encargar de leer el estado de las entradas, co-
dificarlas y enviarlas al transmisor de RF. Se va a emplear un transmisor de 4.333 MHz,
modelo TX-SAW/433 s-z, de la firma Aurel, cuyas especificaciones técnicas se incluyen
en el CD.

PRINCIPIOS TEÓRICOS

En la transferencia de datos se pueden emplear diferentes medios por donde hacer cir-
cular la información: el aire, cable, luz láser, infrarrojos, etc. En el caso que nos ocupa,
vamos a emplear el aire a través de señales de radiofrecuencia (RF). Para ello, es nece-
sario producir una señal portadora que sea modulada con la información digital que se
desea transmitir. Básicamente, existen tres modos de modulación y que se muestran en
la Figura P12.1:

— Modulación ASK. La señal portadora es modulada en amplitud por la


información digital. Así, cuando se transmite un nivel lógico 1, la señal
portadora aparece con la máxima amplitud. Al transmitir un nivel lógico 0,
la señal portadora es mínima o incluso inexistente.
— Modulación FSK. Emplea dos frecuencias distintas para modular la señal por-
tadora: una frecuencia más alta representa un nivel lógico 1 y otra más baja
representa un nivel lógico 0.
— Modulación PSK. También conocida como modulación por conmutación de
fase. A una misma frecuencia portadora, se obtienen dos fases de salida des-
plazadas un ángulo de 180 grados entre sí, una fase representa un nivel 1 y la
otra un nivel 0. Conforme la señal digital cambia de estado, también lo hacen
las fases.

279
280 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura P12.1. Tipos de modulación.

En nuestro caso, vamos a emplear un transmisor con modulación ASK y una fre-
cuencia portadora de 433 MHz.
La transferencia de información por radiofrecuencia (RF) es del tipo asíncrona y no
se emplea ninguna señal adicional (reloj) para sincronizar los bits transferidos. Siendo
así, debemos buscar la forma de garantizar, en la medida de lo posible, que todos los bits

Figura P12.2. Sincronismo de bit.


TRANSMISIÓN Y RECEPCIÓN POR RF 281

lleguen a su destino y no se «pierdan» por el camino. A esto se le conoce como sincro-


nismo de bit y existen varias formas de codificarlos (Fig. P12.2).
— Codificación NRZ, la más simple de todas. Cuando se desea transferir un 1, la
línea de datos se pone a nivel 1, y viceversa. El sincronismo queda garantizado
en función del tiempo t, que debe mantenerse estable cada bit y que debe ser
idéntico en el transmisor y en el receptor. Este tipo de codificación es muy em-
pleado en las comunicaciones serie por cable (RS232).
— Codificación NRZL, similar a la anterior, pero la información se transfiere
invertida.
— Codificación NRZI. Cuando se transfiere un nivel lógico 1 se produce un cam-
bio de estado en la línea de datos. Un nivel lógico 0 no produce cambio alguno.
— Codificación Manchester, la más complicada, pero la más fiable, sobre todo si la
transferencia se realiza por RF. El tiempo t de duración de un bit se divide a su vez en
dos mitades (t/2). Cuando se desea transmitir un nivel 1, la línea de datos se mantiene
a 0 en la primera mitad y a 1 en la segunda. Cuando se transmite un 0, la línea se
mantiene a 1 en la primera mitad y a 0 en la segunda (también se puede hacer a la in-
versa). De esta forma, cualquier bit que se transfiera siempre implicará una transición
en la línea de datos. Esto facilita el sincronismo midiendo simplemente el tiempo que
dura cada pulso. Este modo de codificación lo emplearemos en nuestros ejemplos.
Se conoce como sincronismo de carácter al método empleado para delimitar dónde
empieza y dónde acaba cada byte de datos transferido. Efectivamente, cada byte puede ir
(o no) empaquetado dentro de una serie de bits de inicio y/o bits de stop. Por ejemplo, en
la norma RS232 cada byte va precedido de un bit de inicio, que es siempre de nivel 0, y
finaliza con uno o dos bits de stop, que son siempre de nivel 1. En nuestro caso, el sin-
cronismo de carácter implica que cada byte de datos finaliza con dos bits de stop: un bit 1
seguido de un bit 0; en total, se transfieren 10 bits (Fig. P12.3).

Figura P12.3. Sincronismo de carácter.


Un mensaje, a su vez, puede constar de varios bytes. Con el sincronismo de mensaje
se determina el protocolo y significado de cada uno de los bytes de que consta el men-
saje o Trama. Normalmente, esto lo determina el diseñador de la aplicación según sus
propias necesidades. En nuestro caso, las tramas que vamos a transmitir constan de un
preámbulo y de tres bytes, tal y como se muestra en la Figura P12.4.

Figura P12.4. Sincronismo de mensaje o trama transferida.


282 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

— Preámbulo. Consiste en una secuencia de bits que permiten sincronizar al re-


ceptor del mensaje. En nuestros ejemplos se va a transmitir una secuencia de
veinte niveles 1 seguidos de un nivel 0.
— Byte ID. Es una información de cabecera que consta de uno o varios bytes de
control. Se puede emplear como identificación del producto para indicar quién
es el que transmite la información, a qué receptor va dirigida, etc. En el caso que
nos ocupa, va a ser un único byte de identificación cuyo valor es 0x55.
— Byte de datos. Puede estar compuesto de uno o varios bytes que contienen la in-
formación a transferir propiamente dicha. En nuestro ejemplo, este byte indicará
qué canal se ha activado (C0-C3).
— Byte CRC. Es un último byte de control que de alguna forma permite determinar
si el mensaje en su totalidad llega íntegramente o bien está corrupto. En nuestro
caso, vamos a emplear un byte de CRC o checksum muy sencillo. El byte CRC
que vamos a transmitir, sumado a todos los demás, dará como resultado 0x00.
Este resultado también se deberá obtener en el receptor.

MATERIALES NECESARIOS

• Laboratorio PIC School.


• PIC12F508.
• Módulo transmisor Aurel Tx-Saw/433 s-z.
• Cables de conexión.

ESQUEMA DE CONEXIONADO

Sobre el laboratorio PIC School vamos a montar el esquema mostrado en la Figu-


ra P12.5. Las líneas GP0-GP3 del microcontrolador se conectan con los pulsadores E4-E7,
respectivamente. Estos pulsadores simulan los canales de entrada C0-C3. Por la línea
GP4 el PIC envía al módulo RF la trama correspondiente según sea el canal activado y
con la codificación Manchester ya explicada.

Figura P12.5. Esquema del transmisor de cuatro canales por RF.


TRANSMISIÓN Y RECEPCIÓN POR RF 283

PROGRAMA FUENTE

La versión en Ensamblador se encuentra en el fichero Ejem_10_1A.ASM, en el que


también se incluye el fichero MANCHESTER.INC. Este fichero contiene la rutina
TxD, que se encarga de transmitir los bits del preámbulo y la trama de tres bytes según
la codificación Manchester explicada anteriormente. La rutina es muy fácil de usar en
esta o en cualquier otra aplicación. Basta con ajustar las constantes correspondientes
en el programa principal: velocidad, baudios, inicio del buffer, número de bytes a
transmitir, etc.
En el programa principal se realizan las definiciones correspondientes y se esta-
blecen los parámetros de la transmisión. El bucle principal consiste en ir testeando
el estado de los cuatro canales asociados a las entradas GP0-GP3. Cada vez que se
detecte la activación de cualquiera de ellos, el buffer de transmisión se llena con el
valor 0x55 como valor ID, el número de canal activado (0-3) y se calcula el CRC co-
rrespondiente. Una vez completado el buffer, se procede a la transmisión de todo su
contenido. El proceso se repite constantemente a un intervalo de tiempo determinado
por la constante Rep_N.
La rutina CRC se encarga de calcular el byte correspondiente. En este caso, se trata
de un proceso muy sencillo, ya que únicamente calculamos un valor de 8 bits. Este valor
se calcula de forma que, sumado con los otros bytes que forman la trama, se obtenga el
resultado 0x00.

PROGRAMA FUENTE EN ENSAMBLADOR

;
; Ejem_10_1A
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
; www.microcontroladores.com
; Bilbao 2006
;
;Transmisor de 4 canales. El programa transmite en formato Manchester
;una trama de tres bytes. El primer byte es un código de identificación
;(ID). El segundo codifica uno de los cuatro canales activado,
;canal_0 - canal_3 y representan las entradas GP0-GP3 respectivamente.
;El tercer byte representa el CRC o checksum de 8 bits

List p=12F508 ;Tipo de procesador


include “P12F508.INC” ;Definiciones de registros internos

;Ajusta los valores de la palabra de configuración durante el


;ensamblaje:
;Protección de código =OFF, WDT=OFF, MCLR=Interno y OSC= RC interno
;Estas u otras configuraciones se pueden seleccionar según las
;necesidades
__config _CP_OFF&_WDT_OFF&_MCLRE_OFF&_IntRC_OSC
;Las siguientes variables y constantes determinan el tipo y velocidad
;de la comunicación
284 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

#define Txd_pin GPIO,4 ;Línea de transmisión


#define Rxd_pin GPIO,5 ;Línea de recepción
#define TRANSMISION ;Incluir sólo la rutina de transmisión

CLKIN equ .4000000 ;Frecuencia del oscilador expresada en


;ciclos/segundo
BAUDIOS equ .2000 ;Velocidad de transferencia
Cabecera equ .20 ;N.o de bits de cabecera a transmitir
N_bytes equ .3 ;N.o de bytes a transmitir en la trama
Rep_N equ .4 ;Valor de repetición de exploración de
;las entradas donde
;N representa eventos de 50 ms cada uno

ID equ 0x55 ;Valor de identificación (ID)


Canal_0 equ ‘0’ ;Código del canal 0
Canal_1 equ ‘1’ ;Código del canal 1
Canal_2 equ ‘2’ ;Código del canal 2
Canal_3 equ ‘3’ ;Código del canal 3

RFVAR equ 0x07 ;Inicio de variables (5) para las


;rutinas de transmisión

Temp equ 0x0c ;Variable para temporización


CRC equ 0x0d ;Variable para el cálculo del CRC
Buffer equ 0x10 ;Inicio del buffer de transmisión

org 0x00 ;Vector de Reset


goto Inicio

include «MANCHESTER.INC» ;Incluir rutinas de


;Transmisión/Recepción por RF

;******************************************************************
;CRCGEN Calcula el byte de CRC o checksum del contenido del buffer.
;La suma de todos los bytes de ese buffer, incluido el propio CRC,
;debe dar 0x00 como resultado
;******************************************************************

CRCGEN clrf CRC


movlw N_bytes-1
movwf Cont2 ;N.o de bytes a chequear
movlw Buffer
movwf FSR ;Inicio del buffer
movlw 0x00
CRCGEN_1 addwf INDF,W ;Suma byte
incf FSR,F ;Siguiente byte
decfsz Cont2,F ;Ultimo byte
goto CRCGEN_1 ;No
subwf CRC,W
movwf INDF
retlw 0
;******************************************************************
;Bucle de temporización variable. A una frecuencia de trabajo de 4 MHz,
;con un preescaler de 256, el TMR0 se carga con 195 (su complemento)
TRANSMISIÓN Y RECEPCIÓN POR RF 285

;por lo que desborda y pasa a 0 al de 50 ms (195*256*1=20000 us). Esto


;se repite tantas veces como se indique en la variable Temp
;******************************************************************

Delay_v movwf Temp


Delay_0 movlw ~.195
movwf TMR0 ;El TMR0 se carga con 195
Delay_1 movf TMR0,W
btfss STATUS,Z ;Desborda al de 50 ms
goto Delay_1
decfsz Temp,F ;Se repite n veces
goto Delay_0
retlw 0

;Secuencia de inicio

Inicio movwf OSCCAL ;Almacena valor de calibración original


movlw b’11000111’ ;Preescaler 1:256 asignado al TMR0
option ;Pin GP2/T0CKI=GP2
movlw b’11101111’ ;Configura GP4 salida TxD
tris GPIO ;GP0-GP3 entradas
movlw ID
movwf Buffer ;Almacena ID en el buffer
movlw 0x0d
movwf Buffer+2 ;Fin de trama

;Bucle principal. Se trata de determinar si se ha recibido una


;transición 1-0 en cualquiera de las entradas GP0-GP3 que representan
;a los cuatro canales.

Loop btfss GPIO,0 ;Transición 1-0 en GP0


goto GP0_0 ;Sí
btfss GPIO,1 ;Transición 1-0 en GP1
goto GP1_0 ;Sí
btfss GPIO,2 ;Transición 1-0 en GP2
goto GP2_0 ;Sí
btfss GPIO,3 ;Transición 1-0 en GP3
goto GP3_0 ;Sí
goto Loop ;No se ha accionado ninguna entrada,
;seguir explorando

;Pulso 1-0 en GP0 (canal 0). Se transmite la trama 0x55, Canal_0, CRC

GP0_0 movlw Canal_0


movwf Buffer+1
call CRCGEN ;Calcula CRC
call TxD ;Transmite trama
movlw Rep_N
call Delay_v ;Temporización previa a una nueva
;exploración
goto Loop

;Pulso 1-0 en GP1 (canal 1). Se transmite la trama 0x55, Canal_1, CRC
286 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

GP1_0 movlw Canal_1


movwf Buffer+1
call CRCGEN ;Calcula CRC
call TxD ;Transmite trama
movlw Rep_N
call Delay_v ;Temporización previa a una nueva
;exploración

goto Loop

;Pulso 1-0 en GP2 (canal 2). Se transmite la trama 0x55, Canal_2, CRC

GP2_0 movlw Canal_2


movwf Buffer+1
call CRCGEN ;Calcula CRC
call TxD ;Transmite trama
movlw Rep_N
call Delay_v ;Temporización previa a una nueva
;exploración
goto Loop

;Pulso 1-0 en GP3 (canal 3). Se transmite la trama 0x55, Canal_3, CRC

GP3_0 movlw Canal_3


movwf Buffer+1
call CRCGEN ;Calcula CRC
call TxD ;Transmite trama
movlw Rep_N
call Delay_v ;Temporización previa a una nueva
;exploración
goto Loop

end

EVALUACIÓN DEL PROGRAMA

En principio, la evaluación del ejemplo es un poco frustrante. ¡No tenemos ningún re-
ceptor que sea capaz de recoger y decodificar la información transmitida!
De momento, nos debemos conformar con ensamblar el programa, grabarlo sobre
el dispositivo y montar el circuito del esquema tal y como se muestra en la fotografía de
la Figura P12.6
Debemos creernos que cada vez que se pulse uno de los cuatro pulsadores, por RF
se transmite una trama que codifica qué canal se ha activado.
Por cierto, para hacer de antena basta emplear un trozo de cable de unos 15 cm de
longitud.
TRANSMISIÓN Y RECEPCIÓN POR RF 287

Figura P12.6. Montaje práctico del transmisor de cuatro canales.

P12.2. RECEPTOR RF DE CUATRO CANALES


Es la hora de diseñar un receptor RF que sea compatible con el transmisor expuesto en
la práctica anterior. El programa de aplicación debe ser capaz de decodificar la infor-
mación recibida y actuar en consecuencia. Como módulo receptor se va a emplear el
modelo BC-NBK, de la firma Aurel. Se trata de un receptor de modulación ASK a una
frecuencia de 433 MHz.

PRINCIPIOS TEÓRICOS

Para que el presente receptor sea compatible con el transmisor anterior es necesario que
se cumpla una serie de condiciones idénticas a las explicadas en el ejemplo anterior y
que son:

• Modulación ASK.
• Frecuencia de portadora de 433 MHz.
• Codificación de bits tipo Manchester.
• Idéntica velocidad en la transferencia de los bits. Éstos deben durar el mismo
intervalo t de tiempo.
• Sincronismo de carácter idéntico, 2 bits de stop: uno a 1 y otro a 0.
• Idéntico sincronismo de mensaje. La trama está compuesta de un preámbulo con
20 bits a 1 y un bit a 0, un byte ID de identificación (0x55), un byte de informa-
ción (que define el canal activado) y un último byte de CRC para el control de la
integridad del mensaje.

En este ejemplo se pretende hacer bascular y cambiar de estado cuatro salidas en


función del canal activo recibido. La aplicación es lo más parecido a un mando a dis-
tancia.
288 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

MATERIALES NECESARIOS

• Laboratorio PIC School.


• PIC12F508.
• Módulo receptor Aurel BC-NBK.
• Cables de conexión.

ESQUEMA DE CONEXIONADO

El montaje lo vamos a realizar sobre el laboratorio PIC School según el esquema eléctri-
co mostrado en la Figura P12.7.
Las líneas GP0, GP1, GP2 y GP4 actúan como salidas. Se conectan a los leds S4-S7
del laboratorio y simulan el canal recibido cambiando su estado lógico.
El receptor envía los datos recibidos al PIC a través de la línea GP5 para su deco-
dificación.

Figura P12.7. Esquema del receptor.

PROGRAMA FUENTE

La versión en Ensamblador se encuentra en el fichero Ejem_10_2A.ASM, en el que


también se incluye el fichero MANCHESTER.INC. Este fichero contiene la rutina RxD,
que se encarga de recibir los bits del preámbulo y la trama de tres bytes según la codi-
ficación Manchester explicada anteriormente. La rutina es muy fácil de usar en esta o
en cualquier otra aplicación, almacena la trama en el buffer y devuelve el código 0x00
en el registro W si la recepción es correcta. Basta con ajustar las constantes correspon-
dientes en el programa principal: velocidad, baudios, inicio del buffer, número de bytes
a transmitir, etc.
En el programa principal se realizan las definiciones correspondientes y se estable-
cen los parámetros de la transmisión. El bucle principal se encarga de llamar a la rutina
de recepción. Una vez recibida la trama, realiza un análisis de la misma.
En primer lugar, analiza si ha habido una correcta recepción de la trama según la
codificación Manchester. A continuación, y una vez que la trama está almacenada en el
TRANSMISIÓN Y RECEPCIÓN POR RF 289

buffer, comprueba el byte CRC. La comprobación es muy sencilla. Se suma dicho byte
con todos los demás debiéndose obtener 0x00 como resultado. En caso contrario, se
considera que el contenido del buffer no es válido y la trama es corrupta.
La siguiente comprobación consiste en verificar el byte ID que identifica a nuestra
aplicación. Debe ser 0x55 o de lo contrario también se considera una recepción inválida.
Por último, se analiza el byte de información, que, en nuestro caso, determina qué
canal se activó en el transmisor (entre 0 y 3). En función de dicho canal, se actúa sobre
las líneas de salida GP0, GP1, GP2 y GP4 haciéndolas cambiar de estado lógico.

EVALUACIÓN DEL PROGRAMA

La fotografía de la Figura P12.8 muestra el montaje práctico del receptor sobre el labo-
ratorio PIC School. Como de costumbre, debemos editar, ensamblar y grabar sobre el
PIC el programa de aplicación.
Lo ideal es disponer de dos laboratorios PIC School. En uno de ellos se monta el
circuito de transmisión del ejemplo anterior con el PIC debidamente grabado. En el otro,
se monta el receptor.
Probamos a accionar cualquiera de los pulsadores del transmisor que simulan los cua-
tro canales para observar que en el receptor se activa el led de salida correspondiente.

P12.3. TRABAJO PERSONAL


Dado lo difícil que puede resultar disponer de dos PIC School, se sugiere montar el
transmisor aparte en una placa de montaje universal o en un módulo board para el mon-
taje sin soldaduras. Se alimenta con 5 Vcc y obtenemos así un transmisor autónomo e
independiente. El receptor lo mantenemos tal y como está actualmente montado sobre el
laboratorio. Podemos basarnos en el esquema que se muestra en la Figura P12.8.

Figura P12.8. Esquema del transmisor autónomo de cuatro canales.


290 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Se puede apreciar que no se necesita gran cantidad de componentes. Por un lado, tene-
mos un PIC12F508 grabado con el programa transmisor del fichero Ejem_10_1A.ASM.
Le alimentamos con +5 Vcc y le conectamos los pulsadores correspondientes a los
canales 0-3. Por otro lado, el módulo transmisor recibe la señal codificada del PIC y la
transmite vía RF.
En la fotografía de la Figura P12.9 se muestra el montaje práctico. Se ha realizado
sobre un módulo board para el montaje sin soldadura. La alimentación de todo el con-
junto es de +5 Vcc. Hemos probado con éxito la experiencia superando distancias de
10m en entornos cerrados.

Figura P12.9. Montaje práctico del transmisor.


SEGUNDA PARTE
La gama media: el fabuloso PIC16F84A

TEORÍA
CAPÍTULO
El primer contacto
con el PIC16F84A
8

8.1. PEQUEÑO, POBRE, PERO RESULTÓN

Nuestro «maravilloso» PIC pertenece a la familia de la gama media, y dentro de ella, es


uno de los más pequeños, sólo tiene dieciocho patitas. Además, es el que dispone de me-
nos recursos. El resto de sus parientes tiene conversores AD y DA, comparadores analó-
gicos, tensión interna de referencia, más líneas de E/S, más capacidad en sus memorias,
varios temporizadores y un largo etcétera de dispositivos de los que el PIC16F84A
carece. Es «pobre» de nacimiento.
Pero nosotros hemos elegido a este PIC porque cumple con los requisitos
esenciales para enseñar a manejar los microcontroladores y comenzar a diseñar
proyectos. Es práctico, es sencillo y es económico, pudiendo considerarle como
el paradigma para su empleo en todos los pequeños proyectos que realizan los
aficionados, los estudiantes y quienes prefieren progresar en sus conocimientos de
lo fácil a lo difícil. Creemos que sabiendo manejar un PIC, el hacerlo con todos los
demás es muy fácil.

La filosofía que hemos seguido en este libro es enseñar «bien» modelos sencillos del PIC,
porque si lo conseguimos sabremos que va a ser inmediato manejar los restantes. Se trata
del mismo perro con el mismo collar, pero con distintas pulgas.

Una razón fundamental de su interés se debe al tipo de memoria de programa que


posee. El PIC16F84A tiene una memoria de programa tipo FLASH de 1 K palabras de
14 bits cada una y de 64 bytes de EEPROM como memoria de datos auxilar.
La memoria EEPROM y la FLASH son eléctricamente grabables y borrables, lo que
permite escribir y borrar el programa bajo prueba manteniendo el microcontrolador en el
mismo zócalo y usando el mismo dispositivo para grabar y borrar.
Microchip ha utilizado la memoria FLASH porque tiene mejores posibilidades de
aumentar su capacidad con relación a la EEPROM. También por su mayor velocidad y
menor consumo. No obstante, la EEPROM es capaz de soportar 10.000.000 de ciclos de
escritura/borrado frente a los 10.000 de la FLASH.

293
294 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Otra ventaja del PIC16F84A en cuanto a simplificar el proceso de escritura, borrado


y reescritura de programas, tan necesario en la fase de diseño, es su sistema de grabación
de datos, que se realiza en serie. Para escribir un programa en la memoria se manda la
información en serie usando sólo dos patitas: la RB6 para la señal de reloj y la RB7 para
los bits de datos serie.
Mostramos a continuación la tarjeta de presentación del PIC16F84A con sus datos
personales más significativos.

TARJETA DE PRESENTACIÓN DEL PIC16F84A

MEMORIA DE PROGRAMA: 1 K × 14 palabras de FLASH.


MEMORIA DE DATOS RAM: 68 bytes.
MEMORIA DE DATOS EEPROM: 64 bytes, con más de cuarenta años de retención de datos.
PILA (stack): De ocho niveles.
INTERRUPCIONES: Cuatro tipos diferentes.
JUEGO DE INSTRUCCIONES: Treinta y cinco.
ENCAPSULADO: Plástico DIP de dieciocho patitas.
FRECUENCIA DE TRABAJO: 10 MHz máxima.
TEMPORIZADORES: Sólo uno, el TMR0. También tiene Perro Guardián (WDT).
LÍNEAS DE E/S DIGITALES: Trece (cinco Puerta A y ocho Puerta B).
Corriente máxima absorbida: 80 mA Puerta A y 150 mA Puerta B.
Corriente máxima suministrada: 50 mA Puerta A y 100 mA Puerta B.
Corriente máxima absorbida por línea: 25 mA.
Corriente máxima suministrada por línea: 25 mA.
VOLTAJE DE ALIMENTACIÓN (VDD): De 2 a 5,5 V DC.
VOLTAJE DE GRABACIÓN (vPP): De 12 a 14 V DC.

8.2. EL ASPECTO EXTERNO


Nuestro fabuloso PIC está fabricado con tecnología CMOS de altas prestaciones y en-
capsulado en plástico con dieciocho patitas (Fig. 8.1). También en encapsulado SSOP
de veinte patitas.
Se comenta brevemente la misión de cada una de las patitas.

— VDD. Patita por la que se aplica la tensión positiva de la alimentación.


— VSS. Patita conectada a tierra o negativo de la alimentación.
— OSC1/CLKIN. Patita por la que se aplica la entrada del circuito oscilador
externo que proporciona la frecuencia de trabajo del microprocesador.
— OSC2/CLKOUT. Patita auxiliar del circuito oscilador.
— MCLR#. Esta patita es activa con nivel lógico bajo, lo que se representa con el
símbolo #. Su activación origina la reinicialización o reset del PIC. También se
usa esta patita durante la grabación de la memoria de programa para introducir
por ella la tensión Vpp, que está comprendida entre 12 y 14 V DC.
— RA0-RA4. Son las cinco líneas de E/S digitales correspondientes a la Puerta A.
La línea RA4 multiplexa otra función expresada por T0CKI. En este segundo
EL PRIMER CONTACTO CON EL PIC16F84A 295

Figura 8.1. Diagrama del conexionado de las patitas del PIC16F84A con encapsulado PDIP. También se
comercializa en encapsulado SSOP de veinte patitas en el que hallan duplicadas las patitas
VDD y VSS.

caso sirve para recibir una frecuencia externa para alimentar al temporizador
interno TMR0.
— RB0-RB7. Estas ocho patitas corresponden a las ocho líneas de E/S digitales de la
Puerta B. La línea RB0 multiplexa otra función, que es la de servir como entrada
a una petición externa de una interrupción; por eso, se la denomina RB0/INT.

Los PIC16X8X que tienen un encapsulado de dieciocho patitas, dos de ellas soportan la
tensión de alimentación, otras dos reciben la señal del oscilador externo y otra se utiliza
para generar un reset. Las trece patitas restantes funcionan como líneas de E/S para con-
trolar las aplicaciones.

8.3. LA FRECUENCIA DE FUNCIONAMIENTO. EL RELOJ


La frecuencia de trabajo del microcontrolador es un parámetro fundamental a la hora de
establecer la velocidad en la ejecución de instrucciones y el consumo de energía.
Cuando un PIC16X8X funciona a 10 MHz, le corresponde un ciclo de instrucción de
400 ns, puesto que cada instrucción tarda en ejecutarse cuatro períodos de reloj, o
sea, 4 × 100 ns = 400 ns. Todas las instrucciones del PIC se realizan en un ciclo de
instrucción menos las de salto, que tardan el doble.
Los impulsos de reloj entran por la patita OSC1/CLKIN y se dividen por cuatro
internamente, dando lugar a las señales Q1, Q2, Q3 y Q4, mostradas en la Figura 8.2.
Durante un ciclo de instrucción, que comprende las cuatro señales mencionadas, se
desarrollan las siguientes operaciones:
— Q1. Durante este impulso se incrementa el Contador de Programa.
— Q4. Durante este impulso se busca el código de la instrucción en la memoria del
programa y se carga en el Registro de Instrucciones.
— Q2-Q3. Durante la actividad de estas dos señales se produce la decodificación y
la ejecución de la instrucción.
Para conseguir ejecutar cada instrucción en un ciclo de instrucción (excepto las de
salto, que tardan dos) se aplica la técnica de la segmentación o pipe-line, que consiste en
realizar en paralelo las dos fases que comprende cada instrucción.
296 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 8.2. Los impulsos del reloj externo (OSC1) se dividen por cuatro formando las señales Q1, Q2,
Q3 y Q4, que configuran un ciclo de instrucción.

En realidad, cada instrucción se ejecuta en dos ciclos: en el primero se lleva a cabo


la fase de búsqueda del código de la instrucción en la memoria del programa, y en el
segundo, se decodifica y se ejecuta (fase de ejecución). La estructura segmentada del
procesador permite realizar al mismo tiempo la fase de ejecución de una instrucción y
la de búsqueda de la siguiente. Cuando la instrucción ejecutada corresponde a un salto,
no se conoce cuál será la siguiente hasta que se completa; por eso, en esta situación, se
sustituye la fase de búsqueda de la siguiente instrucción por un ciclo «vacío», originando
que las instrucciones de salto tarden en realizarse dos ciclos de instrucción (Fig. 8.3).

Figura 8.3. La segmentación permite solapar en el mismo ciclo la fase de una instrucción y la de búsque-
da de la siguiente, excepto en las instrucciones de salto.
EL PRIMER CONTACTO CON EL PIC16F84A 297

La frecuencia de funcionamiento de un microcontrolador es un parámetro fundamental


del que depende la velocidad de ejecución del programa y el consumo de energía. Cada
modelo de PIC dispone de diversas versiones para distintas frecuencias.

La técnica de la segmentación unida a la arquitectura Harvard del procesador,


permite al PIC16F84A superar la velocidad de sus competidores directos. Así, por
ejemplo, es 1,54 veces más rápido que el microcontrolador de Motorola 68HC05 cuando
ambos funcionan a la misma frecuencia de 4 MHz.
El PIC16F84A puede funcionar a una frecuencia de 20 MHz con un ciclo de
instrucción de 200 ns.

EJEMPLO
Un PIC16F84A que funciona a 4 MHz ejecuta un programa de mil instrucciones, de las
cuales el 25 por 100 son de salto. Calcular el tiempo que tarda en ejecutarlo.

SOLUCIÓN
TCICLO INSTRUCCIÓN = 4 · TRELOJ = 4 · 250 ns = 1.000 ns = 1 µs
TPROGRAMA = 750 · 1 + 250 · 2 = 1.250 µs

8.3.1. Tipos de osciladores


Los PIC admiten cuatro tipos de osciladores externos para aplicarles la frecuencia de
funcionamiento. El tipo empleado debe especificarse en dos bits (FOSC1 y FOSC0) de
la Palabra de Configuración, como se comenta más adelante.

Oscilador tipo RC
Se trata de un oscilador de bajo coste formado por una simple resistencia y un conden-
sador. Proporciona una estabilidad mediocre de la frecuencia cuyo valor depende de los
valores de los dos elementos de la red R-C (Fig. 8.4).

Figura 8.4. Esquema del oscilador tipo RC formado por un condensador y una resistencia externos. Se
indican los valores que deben tener estos dos componentes para obtener algunas frecuencias
de oscilación.
298 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

EJEMPLO
Un PIC16F84A funcionando con una red R-C de 10 K y 220 pF, respectivamente, está
ejecutando un programa de quinientas instrucciones, de las cuales el 20 por 100 son de
salto. ¿Cuánto tarda en ejecutar el programa?

SOLUCIÓN
Según la Figura 8.4, con una red R-C de 10 K y 220 pF se trabaja a 80 KHz, de donde:
TOSC = (1s / 80) · 103 = 12,5 µs
TCICLO INSTRUCCIÓN = 4 · TOSC = 50 µs
TPROGRAMA = 400 · 50 + 100 · 100 = 30.000 µs = 30 ms

Oscilador tipo HS
Se trata de un oscilador que alcanza una alta velocidad comprendida entre 8 y 10 MHz
y está basado en un cristal de cuarzo o un resonador cerámico. Los condensadores C1 y
C2 de la Figura 8.5 tienen un valor comprendido entre 15 y 33 pF.

Oscilador tipo XT

Es un oscilador de cristal o resonador para frecuencias estándar comprendidas entre


100 KHz y 4 MHz. Para 2 MHz y 4 MHz C1 y C2 de la Figura 8.5 tienen un valor
comprendido entre 15 y 33 pF.

Oscilador tipo LP
Oscilador de bajo consumo con cristal o resonador diseñado para trabajar en un rango de
frecuencias de 35 a 200 KHz.

Figura 8.5. Según el tipo de oscilador y la frecuencia de trabajo, se emplean diferentes valores en los
condensadores C1 y C2 que acompañan al cristal de cuarzo. Para frecuencias comprendidas
entre 4 y 10 MHz, los condensadores tienen una capacidad de 15 a 33 pF. La resistencia RS
sólo es necesaria en algunas versiones tipo HS.
EL PRIMER CONTACTO CON EL PIC16F84A 299

El cristal de cuarzo o el resonador cerámico se coloca entre las patitas OSC1 y OSC2
(Fig. 8.5).

EJEMPLO
Para una aplicación en la que el coste es un factor preponderante y no le afecta la
precisión del tiempo, ¿cuál sería el oscilador más adecuado?

SOLUCIÓN
El oscilador R-C. El coste de una resistencia y un condensador es mínimo, aunque dejan
bastante que desear la precisión y la estabilidad de la frecuencia de trabajo.

8.4. REINICIALIZACIÓN O «RESET»


Cuando se aplica un nivel lógico bajo en la patita MCLR#, el microcontrolador reinicia-
liza su estado. Dos acciones importantes se producen en la reinicialización o reset:

1.a El Contador de Programa se carga con la dirección 0, apuntando la primera


dirección de la memoria de programa en donde deberá estar situada la primera
instrucción del programa de aplicación.
2.a La mayoría de los registros de estado y control del procesador toman un estado
conocido y determinado.

Se puede ocasionar el reset de varias maneras, que estudiaremos más adelante.


El circuito más simple para provocar un reset manualmente al presionar un pulsador
se muestra en la Figura 8.6.

Figura 8.6. Sencillo circuito que permite producir un reset al presionar un pulsador externo.
300 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

8.5. EL PRIMER CIRCUITO PRÁCTICO


Con lo poco que sabemos, ya se puede poner en marcha el PIC16F84A. Conocemos la
función de todas las patitas, trece de las cuales se emplean para adaptarse con los pe-
riféricos externos. De las cinco patitas restantes, dos (VDD y VSS) aplican la tensión de
alimentación, otras dos (OSC1 y OSC2) soportan el cristal de cuarzo del reloj externo y
la que queda (MCLR#) ya se ha expuesto cómo hay que conectarla para generar el reset.
En los circuitos donde se usa un PIC16F84A es muy habitual utilizar como tensión
de alimentación la de 5 V normalizada y como circuito de reloj externo uno de tipo XT
a una frecuencia de 4 MHz. Con esta configuración, el conexionado fijo para cualquier
aplicación del PIC es el mostrado en la Figura 8.7.

Figura 8.7. Conexionado fijo del PIC16F84A para cualquier aplicación.

Las patitas que no se hallan conectadas en la Figura 8.7 son las dedicadas a transferir
información con los periféricos que utilice la aplicación. Para hacer operativo dicho esquema
vamos a conectar algunos periféricos sencillos, que no por eso son los menos usados.
Como periférico de entrada utilizaremos un interruptor (I1) que se conecta a la línea RA1
de la Puerta A. Como periférico de salida, se colocará un diodo led (L3) en la línea RB3 de
la Puerta B. Según el interruptor se abra o se cierre, introducirá un nivel lógico alto o bajo.
Cuando está abierto, aplica a la patita RA1 un nivel lógico alto a través de la resistencia de
pull-up de 10 K. Si se cierra, al conectarse con tierra, introduce un nivel bajo (Fig. 8.8).

Figura 8.8. Circuito de conexionado de un PIC16F84A en disposición de controlar un periférico de


entrada, el interruptor I1 y un periférico de salida, el diodo led L3.
EL PRIMER CONTACTO CON EL PIC16F84A 301

Aprovechando la corriente de salida de las líneas de la Puerta B, en torno a los


25 mA, conectaremos directamente el diodo led L3 a la patita RB3 a través de una
resistencia de absorción de 330 Ω.

8.6. UNA SOLUCIÓN AL DISEÑO DE PROYECTOS:


LA TARJETA DE PROTOTIPOS
El PIC precisa una circuitería auxiliar común para cualquier aplicación cambiando úni-
camente el conexionado de las líneas de E/S a los periféricos. Existe una forma muy
eficaz de desarrollar el prototipo de un diseño mediante una tarjeta de circuito impreso
premontada y con una zona libre para instalar y cablear los periféricos.
Una tarjeta de prototipos consta de dos zonas. En una se ubica el zócalo que
alojará al microcontrolador con el programa ya grabado junto a la circuitería común
(alimentación, reloj y reset). En la otra zona sólo existe un área de agujeros perforados y
estañados sobre los que se conectarán los periféricos y se unen fácilmente con las líneas
de E/S que quedan accesibles. En la Figura 8.9 se muestra una tarjeta de prototipos para
PIC de dieciocho patitas diseñada por Ingeniería de Microsistemas Programados, S. L.
Una ventaja adicional de esta tarjeta es que, además del zócalo donde se ubica el PIC,
existe otro de dieciocho patitas donde quedan disponibles las del microcontrolador, que
puede conectarse por cable plano con un sistema de desarrollo o un grabador para que el
PIC16X8X resida en el propio grabador y se pueda escribir y borrar el programa hasta
que quede definitivamente a punto. Llegado ese momento, se quita el cable plano del
grabador y se coloca el PIC grabado en el zócalo de la tarjeta de prototipos.

Figura 8.9. Fotografía de la tarjeta de prototipos para los PIC de la gama media de dieciocho patitas
diseñada por Ingeniería de Microsistemas Programados, S. L.
302 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 8.10. Esquema eléctrico de la circuitería auxiliar del PIC que viene montada en la tarjeta de
prototipos.
EL PRIMER CONTACTO CON EL PIC16F84A 303

En la Figura 8.10 se muestra el esquema eléctrico de la circuitería que viene montada


en la tarjeta de prototipos PIC18-ME y que es la imprescindible para el funcionamiento
del microcontrolador. La alimentación es de 12 VAC procedente de un transformador
externo y aplicada a través del conector J2. El diodo D1 rectifica la corriente alterna y el
condensador C1 actúa como filtro. El regulador de tensión U2, modelo mA7805, junto
con C2, proporciona la tensión de trabajo estabilizada de +5 V. También es posible
alimentar al circuito con una pila de 9 V.
Las patitas de las Puertas A y B del PIC colocado en el zócalo de la tarjeta quedan
accesibles desde el «conector de aplicación» por el que se unen con los periféricos
alojados en la zona libre. Dichas patitas también están disponibles, junto a la línea
de reset MCLR#, en el conector J1 PIC-BUS, capaz de conectarse con el sistema de
desarrollo Micro’PIC Trainer con un cable plano de veintiséis hilos.
Además de las patitas de las líneas de E/S de las Puertas, en el conector de aplicación
existen dos contactos para la señal de reset, MCLR#, y para la señal de salida del
oscilador interno, CLKOUT.
La tarjeta de prototipos PIC18-ME es una herramienta rápida, compacta y segura
para construir el prototipo de cualquier diseño que utiliza un PIC de dieciocho patitas.
Existen modelos para alojar microcontroladores de veintiocho y cuarenta patitas.
CAPÍTULO

En el interior del procesador


9

9.1. UNA ARQUITECTURA MODERNA Y REVOLUCIONARIA


Para lograr una compactación óptima del código y una velocidad superior a la de sus
competidores, los microcontroladores PIC incorporan en su procesador tres de las carac-
terísticas más avanzadas en los grandes computadores:

• Procesador tipo RISC.


• Procesador segmentado.
• Arquitectura Harvard.

Con la incorporación de estos recursos, los PIC son capaces de ejecutar en un ciclo
de instrucción todas las instrucciones, excepto las de salto, que tardan el doble. Una con-
dición imprescindible es la simetría y ortogonalidad en el formato de las instrucciones,
que en el caso de los PIC de la gama media tienen una longitud de 14 bits. De esta forma,
se consigue una compactación en el código del programa para un PIC16F84A 2,24 veces
superior al de un 68HC05 funcionando a la misma frecuencia.
El juego de instrucciones se reduce a treinta y cinco y sus modos de direccionado se
han simplificado al máximo.
Con la estructura segmentada, se pueden realizar simultáneamente las dos fases en
que se descompone cada instrucción. Al mismo tiempo que se está desarrollando la fase
de ejecución de una instrucción, se realiza la fase de búsqueda de la siguiente.

La arquitectura Harvard es uno de los pilares en los que se sustenta la organización de los
PIC. Gracias a ella, se puede acceder de forma simultánea e independiente a la memoria de
datos y a la memoria de instrucciones.

El aislamiento y diferenciación de los dos tipos de memoria (instrucciones y datos)


permite que cada uno tenga la longitud y el tamaño más adecuados. De esta forma, en el
PIC16F84A, la longitud de los datos es de un byte, mientras que la de las instrucciones
es de 14 bits (véase Figura 9.1).

305
306 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 9.1. La arquitectura Harvard aísla la memoria de datos y la de instrucciones, permitiendo que la
longitud de las palabras de cada una sea la más adecuada.

Otra característica relevante de los PIC es el manejo intensivo del Banco de Regis-
tros, los cuales participan de una manera muy activa en la ejecución de las instrucciones.
Como se muestra en la Figura 9.2, la ALU efectúa sus operaciones lógico-aritméticas
con dos operandos, uno que recibe desde el registro W (Work), que hace las veces de
«Acumulador» en los microprocesadores convencionales, y otro que puede provenir
de cualquier registro o del propio código de instrucción. El resultado de la operación
puede almacenarse en cualquier registro o en W. Esta funcionalidad da un carácter com-
pletamente ortogonal a las instrucciones que pueden utilizar cualquier registro como
operando fuente y destino. La memoria de datos RAM implementa en sus posiciones los
registros específicos y los de propósito general.
La arquitectura interna del PIC16F84A se presenta en la Figura 9.3 y consta de siete
bloques fundamentales.

Figura 9.2. En el esquema se muestra los diferentes elementos que proporcionan los operandos a la ALU.
El resultado se puede cargar en cualquier registro o en W.
EN EL INTERIOR DEL PROCESADOR 307

Figura 9.3. Arquitectura interna del PIC16F84A.

1.o Memoria de programa FLASH de 1 Kx14 bits.


2.o Memoria de datos formada por dos áreas: una RAM donde se alojan veintidós registros
de propósito específico (SFR) y sesenta y ocho de propósito general (GPR) y otra del
tipo EEPROM de 64 bytes.
3.o Camino de datos con una ALU de 8 bits y un registro de trabajo W del que normalmente
recibe un operando y envía el resultado. El otro operando puede provenir del bus de
datos o del propio código de la instrucción (literal).
4.o Diversos recursos conectados al bus de datos, tales como Puertas de Entrada/Salida,
Temporizador TMR0, etc.
5.o Base de tiempos y circuitos auxiliares.
6.o Direccionamiento de la memoria de programa en base al Contador de Programa ligado
a una Pila de ocho niveles de profundidad.
7.o Direccionado directo e indirecto de la memoria RAM.

Para analizar de forma global el funcionamiento del procesador nos vamos a centrar
en la ejecución de una instrucción. Todo comienza con la fase de búsqueda, que la inicia
el Contador de Programa, facilitando la dirección de la memoria de instrucciones donde
308 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

se ubica. Su código binario de 14 bits se lee y se carga en el Registro de Instrucciones,


desde donde se transfiere al Decodificador y a la Unidad de Control. A veces, dentro
del código de la instrucción, existe el valor de un operando (literal) que se introduce
como operando a la ALU o bien una dirección de la memoria de datos donde reside otro
operando.
La ALU es la encargada de realizar la operación lógico-aritmética que implica la
instrucción decodificada. Uno de los operandos lo recibe desde el registro W y el otro
desde un registro o de la propia instrucción.
Tanto el banco de registros específicos, en el que cada uno tiene una misión concre-
ta, como el de registros de propósito general residen en la RAM. La EEPROM de datos
puede contener datos que no se desee perder al desconectar la alimentación, pero su
acceso está controlado con unos registros especiales.

El PIC16F84A tiene una zona de memoria de datos tipo RAM y otra tipo EEPROM. La primera
tiene una capacidad de veintidós registros de propósito especial (SFR) y sesenta y ocho de
propósito general (GPR), todos ellos de tamaño byte. La segunda dispone de una capacidad
de 64 bytes.

Las operaciones de E/S con los periféricos las soportan las Puertas A y B. Existe un
Temporizador TMR0 para encargarse de las funciones de control de tiempos. Finalmen-
te, hay unos circuitos auxiliares que dotan al procesador de unas interesantes posibilida-
des de seguridad, reducción del consumo y reinicialización.

9.2. MEMORIA DE PROGRAMA


La arquitectura de los PIC de la gama media admite un mapa de memoria de pro-
grama capaz de contener 8.192 instrucciones de 14 bits cada una. Este mapa se
divide en páginas de 2.048 posiciones. Para direccionar 8 K posiciones se necesi-
tan 13 bits, que es la longitud que tiene el Contador de Programa. Sin embargo, el
PIC16F84A sólo tiene implementadas 1 K posiciones, por lo que ignora los 3 bits
de más peso del PC.
En la gama media, la verdadera aportación del PIC16F84A es la utilización de una
memoria de programa del tipo FLASH, capaz de ser escrita y borrada eléctricamente.

9.2.1. El Contador de Programa y la Pila


Tal como se presenta en la Figura 9.4, el rango de direcciones que cubre el PIC16F84A
en su memoria de programa llega desde la 0000 H a la 03FF H, o sea, un total de 1.024
posiciones.
En el PC se ignoran los 3 bits de más peso, de forma que apuntar a la dirección 33 H
es lo mismo que hacerlo a la 433 H, 833 H, C33 H, 1033 H, 1433 H o a la 1C33 H.

El PIC16F84A tiene 1 K palabras de 14 bits en la memoria de programa, y aunque el PC


dispone de 13 bits, en el direccionamiento de la misma sólo emplea los 10 de menos
peso.
EN EL INTERIOR DEL PROCESADOR 309

Figura 9.4. Al tener implementado sólo 1 K posiciones la memoria de programa del PIC16F84A, se
ignoran los 3 bits de más peso del PC. La dirección 0000 H está reservada para el vector de
reset, y la 0004 H, para el vector de interrupción.

Al igual que todos los registros específicos que controlan la actividad del proce-
sador, el Contador de Programa está implementado sobre un par de posiciones de la
memoria RAM. Cuando se escribe el Contador de Programa como resultado de una
operación de la ALU, los 8 bits de menos peso del PC residen en el registro PCL, que
ocupa, repetido, la posición 2 de los dos bancos de la memoria de datos. Los bits de
más peso, PC < 12:8>, residen en los 5 bits de menos peso del registro PCLATH, que
ocupa la posición 0A H de los dos bancos de la memoria RAM.
En las instrucciones GOTO y CALL de la gama media, los 11 bits de menos peso del
PC provienen del código de la instrucción y los otros dos de los bits PCLATH <4:3> (véase
Figura 9.5).
Con los 11 bits que se cargan en el PC desde el código de las instrucciones GOTO
y CALL se puede direccionar una página de 2 K de la memoria. Los bits restantes
PC < 12:11 > tienen la misión de apuntar una de las cuatro páginas del mapa de me-
moria, y en los modelos de PIC que alcanzan ese tamaño, dichos bits proceden de
PCLATH < 4:3 >.
La Pila es una zona aislada de las memorias de instrucciones y datos. Tiene una
estructura LIFO en la que el último valor guardado es el primero que sale. Tiene ocho ni-
veles de profundidad, cada uno con 13 bits. Funciona como un buffer circular, de manera
310 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 9.5. En la figura superior se muestra cómo se carga el PC cuando una instrucción deposita en él
el resultado que se obtiene de la ALU. Abajo, se indica la carga del PC en las instrucciones
GOTO y CALL.

que el valor que se obtiene al realizar el noveno «desempilado» (pop) es igual al que se
obtuvo en el primero.
La instrucción CALL y las interrupciones originan la carga del contenido del PC en
el nivel superior o «cima» de la Pila. El contenido del nivel superior se saca de la Pila
al ejecutar las instrucciones RETURN, RETLW y RETFIE. El contenido del registro
PCLATH no es afectado por la entrada o salida de información de la Pila.

Los PIC no disponen de instrucciones específicas (push y pop) para manejar directamente
la Pila. Tampoco se dispone de ningún señalizador que indique cuándo se produce el rebo-
samiento de los ocho niveles de la Pila.
EN EL INTERIOR DEL PROCESADOR 311

Figura 9.6. Organización interna de la memoria de datos RAM en el PIC16F84A.


312 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

9.3. MEMORIA DE DATOS RAM


La memoria de datos del PIC16F84A dispone de dos zonas diferentes:
— Área de RAM estática o SRAM, donde reside el Banco de Registros Espe-
cíficos (SFR) y el Banco de Registros de Propósito General (GPR). El primer
banco tiene veinticuatro posiciones de tamaño byte, aunque dos de ellas no son
operativas, y el segundo, sesenta y ocho.
— Área EEPROM de 64 bytes, donde opcionalmente se pueden almacenar datos
que no se pierden al desconectar la alimentación.
La zona de memoria RAM se halla dividida en dos bancos (banco 0 y banco 1)
de 128 bytes cada uno. En el PIC16F84A sólo se hallan implementadas físicamente
las ochenta primeras posiciones de cada banco, de las cuales las doce primeras están
reservadas a los Registros de Propósito Específico (SFR), que son los encargados del
control del procesador y sus recursos. Algunos de dichos registros se hallan repetidos en

Figura 9.7. Especificaciones de los registros SFR de los bancos de la memoria de datos RAM. La abre-
viatura x significa desconocido; u: no cambia; -: no implementado, se lee como 0, y q: valor
que depende de la condición.
EN EL INTERIOR DEL PROCESADOR 313

la misma dirección de los dos bancos para simplificar su acceso (INDF, ESTADO, FSR,
PCLATH e INTCON). La posición apuntada por la dirección 7 H y la apuntada por la
87 H no son operativas. Los sesenta y ocho registros restantes de cada banco se destinan
a Registros de Propósito General y, en realidad, sólo son operativos los sesenta y ocho
del banco 0 porque los del banco 1 se mapean sobre el banco 0, es decir, cuando se apun-
ta a un registro general del banco 1, se accede al mismo del banco 0 (véase Figura 9.6).
Para seleccionar el banco a acceder hay que manipular el bit 5 (RP0) del registro
ESTADO. Si RP0 = 1, se accede al banco 1, y si RP0 = 0, se accede al banco 0. Tras un
reset, se accede automáticamente al banco 0. Para seleccionar un registro de propósito
general no hay que tener en cuenta el estado del bit RP0, porque al estar mapeado el ban-
co 1 sobre el banco 0, cualquier direccionamiento de un registro del banco 1 corresponde
al homólogo del banco 0. En el direccionamiento directo a los registros GPR se ignora
el bit de más peso, que identifica el banco, y sus direcciones están comprendidas entre el
valor 0x0c y 0x4f en hexadecimal.
Los registros SFR se clasifican en dos grupos: en uno se incluyen aquellos que con-
trolan el núcleo del microcontrolador (ESTADO, OPTION, INTCON, etc.), y en el otro,
los que determinan la operatividad de los recursos auxiliares y periféricos. La Figura 9.7
presenta la estructura de estos registros y los valores que toman después de un reset.

9.3.1. Direccionamiento de la memoria de datos


En los PIC de la gama media, la memoria de datos está organizada para alojar un máxi-
mo de cuatro bancos de 128 bytes cada uno. El PIC16F84A sólo tiene implementados
los 80 primeros bytes de los bancos 0 y 1. En los PIC de esta familia se destinan dos bits
del registro ESTADO (RP0 y RP1) para determinar el banco y otros siete para elegir una
de las 128 posiciones del banco seleccionado (Fig. 9.8).

Figura 9.8. Los PIC de la gama media tienen organizada la memoria de datos en cuatro bancos de 128 posi-
ciones cada uno. La zona sombreada no se halla implementada en el PIC16F84A.
314 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Direccionamiento directo

El operando que utiliza la instrucción en curso se referencia mediante su dirección, que


viene incluida en el código OP de la misma, concretamente en los 7 bits de menos peso.
El banco a acceder lo determinan los bits RP0 y RP1 del registro ESTADO. En el caso
del PIC16F84A, sólo se usa el bit RP0 al tener implementado únicamente dos bancos
(véase Figura 9.9).

Figura 9.9. Direccionamiento directo en el PIC16F84A.

Direccionamiento indirecto

Este modo de direccionado se usa cuando en una instrucción se utiliza como operando
el registro INDF, que ocupa la dirección 0 de ambos bancos. En realidad, el registro
INDF no está implementado físicamente, y cuando se le hace referencia, se accede a la
dirección de un banco especificada con los 7 bits de menos peso del registro FSR. El bit
de más peso de FSR, junto al bit IRP del registro ESTADO, se encargan de seleccionar
el banco a acceder, mientras que los 7 bits de menos peso del FSR apuntan a la posición.
Como sólo hay dos bancos en el PIC16F84A en este modo de direccionamiento, el bit
IRP = 0 siempre (véase Figura 9.10).

EJEMPLO
Usando el modo de direccionado indirecto poner a 0 las posiciones de la memoria de
datos comprendidas entre la dirección 0x0c y 0x27 del banco 0 en un PIC16F84A.
EN EL INTERIOR DEL PROCESADOR 315

SOLUCIÓN
En el modo de direccionado indirecto, actúa como puntero el contenido del registro
FSR, que en este ejercicio se irá incrementando desde 0x0c hasta el valor 0x28 H, en el
que su bit 3 pasa a valer 1.

Figura 9.10. Selección del banco y la posición en el modo de direccionamiento indirecto. Como el
PIC16F84A sólo tiene dos bancos, IRP = 0 siempre.

movlw 0x0c
; W toma el valor inicial del puntero
movwf FSR
; FSR se carga con el valor de W
; Se borra la dirección que apunta FSR
bucle incf FSR ; Se incrementa FSR una unidad
btfss FSR, 3 ; Si el bit 3 de FSR vale 1 se “brinca” la
; siguiente instrucción (“skip”)
goto bucle ; Se salta a “bucle” porque vale 0 el
; bit 3 de FSR
.....continúa el programa.....

9.4. EL REGISTRO DE ESTADO


El registro de Estado es el más usado y es el momento de describirle en su totalidad.
Ocupa la dirección 3 tanto del banco 0 como del banco 1 de la memoria de datos RAM.
Sus bits tienen tres misiones distintas:

1.a Se encargan de avisar las incidencias del resultado de la ALU (C, DC y Z).
2.a Indican el estado de reset (TO# y PD#).
3.a Seleccionan el banco a acceder en la memoria de datos (IRP, RP0 y RP1).

En la Figura 9.11 se muestra el diagrama de distribución de los bits del registro


ESTADO.
316 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 9.11. Estructura interna del registro ESTADO. Los bits 3 y 4 sólo se pueden leer, mientras los
demás también se pueden escribir.

Los bits TO# y PD# indican el estado del procesador en algunas condiciones y no se
pueden escribir. Por este motivo, la instrucción clrf ESTADO deja el contenido de dicho
registro con el valor 000u u1uu, siendo u el símbolo de «no cambia». Sólo se ponen a 0
los tres bits de más peso, el bit Z (cero) se pone a 1 y los restantes no alteran su valor.
A continuación, se describe la misión de los bits del registro ESTADO:

— C: Acarreo/llevada en el bit de más peso


1: Cuando este señalizador vale 1, indica que se ha producido acarreo en el bit
de más peso del resultado al ejecutar las instrucciones addwf y addlw.
0: No se ha producido acarreo.
C también actúa como señalizador de «llevada» en el caso de la instrucción de
resta, como subwf y sublw. En este caso, la correspondencia es inversa (si vale 1,
no hay llevada, y si vale 0, sí).

— DC: Acarreo/llevada en el cuarto bit


Igual significado que C, pero refiriéndose al cuarto bit. De interés en operacio-
nes en BCD.
— Z: Cero
1: El resultado de una instrucción lógico-aritmética ha sido 0.
0: El resultado de una instrucción lógico-aritmética no ha sido 0.

— PD#: «Power Down»


1: Se pone automáticamente a 1 después de la conexión de la alimentación al
microcontrolador o al ejecutar la instrucción clrwdt.
0: Se pone automáticamente a 0 mediante la ejecución de la instrucción sleep.

— TO#: «Time Out»


1: Se pone a 1 después de la conexión de la alimentación o al ejecutarse las
instrucciones clrwdt y sleep.
0: Se pone a 0 cuando se produce el desbordamiento del Perro Guardián
(Watchdog).

— RP1-RP0: Selección de banco en direccionamiento directo


Como el PIC16F84A sólo tiene dos bancos, únicamente emplea el bit RP0, de
forma que cuando vale 1 se accede al banco 1 y cuando vale 0 se accede al
banco 0 después de un reset RP0 = 0.
EN EL INTERIOR DEL PROCESADOR 317

— IRP: Selección del banco en direccionamiento indirecto


Este bit, junto con el de más peso del registro FSR, sirven para determinar el
banco de la memoria de datos seleccionado en el modo de direccionamiento
indirecto. En el PIC16F84A, al disponer de dos bancos, no se usa este bit y debe
programarse como 0. Los bits IRP y RP1 no están implementados y siempre
valen 0.
Los recursos fundamentales: CAPÍTULO

temporizadores, puertas de E/S


y EEPROM de datos 10

10.1. EL PAPEL DE LOS TEMPORIZADORES


Los PIC disponen de un procesador rápido y potente. En él se incluye la memoria de
programa, la de datos, la ALU, la Unidad de Control y algunos registros especiales.
Si dentro de un microcontrolador únicamente existiese un procesador, sólo se podrían
ejecutar instrucciones lógico-aritméticas y de transferencia. Pero un microcontrolador
es mucho más que un procesador, es un «computador integral» en el que, además del
procesador, hay puertas de E/S para conectarse con periféricos, canales de comuni-
cación, temporizadores para controlar tiempos, sistema de interrupciones capaz de
detectar anomalías o sucesos especiales, sistemas de seguridad, modo de funciona-
miento con bajo consumo y un largo etcétera de recursos que configuran la potencia
integral de un computador.

Los PIC contienen todos los recursos posibles, aunque su fabricante no les incluye en todos
los modelos, sino que los alterna para poderse ajustar óptimamente a las necesidades de
cada diseño.

El PIC16F84A contiene pocos recursos en comparación a otros familiares, pero


posee los suficientes para resolver gran parte de las aplicaciones típicas de los microcon-
troladores. Sobre todo disponen de una memoria de programa FLASH (PIC16F8X) que
le posibilita regrabar el programa las veces necesarias hasta su total puesta a punto.
En este capítulo se describen los recursos más importantes del PIC16F84A, que
son:

— Temporizador/contador TMR0.
— Perro Guardián (Watchdog).
— Puertas de E/S.
— Memoria EEPROM de datos.

319
320 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

10.2. TEMPORIZADOR/CONTADOR TMR0


Una de las labores más habituales en los programas de control de dispositivos suele ser
determinar intervalos concretos de tiempo, recibiendo el nombre de temporizador (ti-
mer) el elemento encargado de realizar esta función. También suele ser frecuente contar
los impulsos que se producen en el exterior del sistema, denominándose contador el
elemento destinado a este fin.
Si las labores del temporizador o contador las asignamos al programa principal,
robarían mucho tiempo al procesador en detrimento de actividades más importantes. Por
este motivo se diseñan recursos específicamente orientados a estas misiones.
Los PIC16X8X poseen un temporizador/contador de 8 bits, llamado TMR0, que
actúa de dos maneras diferentes:

1.a Como contador de sucesos, que están representados por los impulsos que se
aplican a la patita RA4/T0CKI. Al llegar al valor FF H, se desborda el contador
y con el siguiente impulso pasa a 00 H, y advierte esta circunstancia activando
un señalizador y/o provocando una interrupción. Estos dos avisos no lo tenía el
PIC12F508.
2.a Como temporizador, cuando se carga en el registro que implementa al recurso
un valor inicial se incrementa con cada ciclo de instrucción (Fosc/4) hasta que se
desborda, o sea, pasa de FF a 00 H, y avisa poniendo a 1 un bit señalizador y/o
provocando una interrupción (Fig. 10.1).

Para que el TMR0 funcione como contador de impulsos aplicados a la patita


T0CKI, hay que poner a 1 el bit T0CS, que es el que ocupa la posición 5 del registro
OPTION. En esta situación, el registro TMR0, que es el ubicado en la dirección 1 del
banco 0 de la memoria de datos, se incrementa con cada flanco activo aplicado en la
patita T0CKI. El tipo de flanco activo se elige programando el bit T0SE, que es el que
ocupa la posición 4 del registro OPTION. Si T0SE = 1, el flanco activo es el descen-
dente, y si T0SE = 0, es el ascendente. Cuando se desea que TMR0 funcione como
temporizador, el bit T0CS = 0.
En realidad, los PIC16X8X y los de la gama baja disponen de dos temporizadores, el
TMR0 y el Perro Guardián (Watchdog). El primero actúa como principal y sobre él recae
el control de tiempos y el contaje de impulsos. El otro vigila que el programa no se

Figura 10.1. Esquema simplificado de un temporizador/contador. Como temporizador, se carga con un


valor inicial que se va incrementando hasta el desbordamiento. Como contador, va incre-
mentando su valor con cada impulso que se le aplica. Al alcanzar el máximo valor binario,
se «desborda» y pasa a cero, circunstancia que indica un señalizador.
LOS RECURSOS FUNDAMENTALES 321

«cuelgue» y para ello cada cierto tiempo comprueba si el programa se está ejecutando
normalmente. En caso contrario, si el control está detenido en un bucle infinito a la es-
pera de algún acontecimiento que no se produce, el Perro Guardián «ladra», lo que se
traduce en un reset que reinicializa todo el sistema.
A menudo, el TMR0 y el Perro Guardián precisan controlar largos intervalos de
tiempo y necesitan aumentar la duración de los impulsos de reloj que les incrementa.
Para cubrir este requisito se dispone de un circuito programable denominado Divisor de
frecuencia, que divide la frecuencia utilizada entre diversos rangos.
Para programar el comportamiento del TMR0, el Perro Guardián (WDT) y el Divi-
sor de frecuencia utilizan algunos bits del registro OPTION y de la Palabra de Configu-
ración, que se explicará más adelante. En la Figura 10.2 se proporciona un esquema sim-
plificado de la arquitectura del circuito de control de tiempos usado en los PIC16X8X.
El Divisor de frecuencia puede usarse con el TMR0 o con el WDT. Con el TMR0
actúa como predivisor, es decir, los impulsos pasan primero por el Divisor y luego se
aplican al TMR0 una vez aumentada su duración. Con el Perro Guardián actúa después,
realizando la función de posdivisor. Los impulsos, que divide por un rango el Divisor de
frecuencia, pueden provenir de la señal de reloj interna (Fosc/4) o de los que se aplican
a la patita T0CKI.

Figura 10.2. Esquema simplificado de la sección dedicada al control de tiempos en la arquitectura de


los PIC16X8X.
322 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 10.3. Esquema general del funcionamiento de TMR0. Cuando se desborda, se pone a 1 el seña-
lizador T0IF.

El TMR0 se comporta como un registro de propósito especial (SFR) ubicado en la


dirección 1 del banco 0 de la memoria de datos. En igual dirección, pero en el banco 1,
se halla el registro OPTION.
TMR0 puede ser leído y escrito en cualquier momento al estar conectado al bus
de datos. Funciona como un contador ascendente de 8 bits. Cuando funciona como
temporizador, conviene cargarle con el valor de los impulsos que se quiere temporizar,
pero expresados en complemento a 2. De esta manera, al llegar el número de impulsos
deseado, se desborda, y al pasar por 00 H, se activa el señalizador T0IF y/o se produce
una interrupción.
Para calcular los tiempos a controlar con TMR0 se utiliza la siguiente fórmula prác-
tica:

Temporización = 4 · Tosc · (256 – Valor cargado en TMR0) · (Rango del divisor)

En cualquier momento se puede leer el valor que contiene TMR0 sin detener su
contaje. La instrucción adecuada al caso es movf tmr0,w.
En la Figura 10.3 se ofrece el esquema de funcionamiento del TMR0. Obsérvese
que hay un bloque que retrasa dos ciclos el contaje para sincronizar el momento del
incremento producido por la señal aplicada en T0CKI con el que producen los impulsos
internos de reloj. Cuando se escribe TMR0, se retrasan dos ciclos su reincremento y se
pone a 0 el Divisor de frecuencia.

10.2.1. El registro OPTION


La misión principal de este registro es gobernar el TMR0 y el Divisor de frecuencia.
Ocupa la posición 81 H de la memoria de datos, que equivale a la dirección 1 del banco 1.
El bit T0CS (Timer 0 Clock Edge Select) selecciona en el multiplexor MPX1 la proce-
dencia de los impulsos de reloj, que pueden ser los del oscilador interno (Fosc/4) o los
que se aplican desde el exterior por la patita T0CKI. El bit T0SE (Timer 0 Clock Source
Select) elige el tipo de flanco activo en los impulsos externos. Si T0SE = 1, el flanco
activo es el descendente, y si T0SE = 0, el ascendente.
LOS RECURSOS FUNDAMENTALES 323

Figura 10.4. Distribución y asignación de funciones de los bits del registro OPTION.

El bit PSA del registro OPTION asigna el Divisor de frecuencia al TMR0 (PSA=0)
o al WDT (PSA = 1).
Los 3 bits de menos peso de OPTION seleccionan el rango por el que divide el Di-
visor de frecuencia los impulsos que se le aplican en su entrada. La Figura 10.4 muestra
la distribución y función de los bits de OPTION.
324 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

El bit 6 INTEDG (Interrupt Edge) sirve para determinar el flanco activo, que pro-
vocará una interrupción externa al aplicarse a la patita RB0/INT. Un 1 es ascendente y
un 0 descendente.
El bit 7 RBPU# (RB Pull-Up) activa (si vale 0) o desactiva (cuando vale 1) las resis-
tencias pull-up, que pueden conectarse opcionalmente en las líneas de la Puerta B.

10.3. EL PERRO GUARDIÁN (WDT)


Se trata de un contador interno de 8 bits que origina un reset cuando se desborda. Su
control de tiempos es independiente del TMR0 y está basado en una simple red R-C.
Su actuación es opcional y puede bloquearse para que no funcione programando el bit
WDTE de la Palabra de Configuración.

La temporización nominal con la que se halla programado el Perro Guardián es de 18 ms, pero
utilizando el Divisor de frecuencia puede aumentarse hasta alcanzar los 2,3 segundos.

Para evitar que se desborde el Perro Guardián hay que refrescarle previamente. En
realidad, este refresco consiste en ponerle a cero mediante las instrucciones clrwdt y
sleep. El programador debe analizar las instrucciones de la tarea y situar alguna de esas
dos en sitios estratégicos por los que pase el flujo de control antes de que transcurra el
tiempo asignado al WDT. De esta manera, si el programa se «cuelga», no se refresca el
Perro Guardián y se produce la reinicialización del sistema.

Figura 10.5. Cuando PSA = 1, los impulsos producidos por el Perro Guardián pasan al Divisor (posdi-
visor). Si PSA = 0, los impulsos pasan primero por el Divisor y luego se aplican al TMR0
(predivisor).
LOS RECURSOS FUNDAMENTALES 325

La instrucción clrwdt borra al WDT y reinicia su cuenta. Sin embargo, la instrucción sleep,
además de borrar WDT, detiene al sistema y lo mete en un estado de «reposo» o «de bajo consu-
mo». Si no se desactiva el Perro Guardián al entrar en el modo de reposo, al completar su contaje
provocará un reset y sacará al microcontrolador del modo de bajo consumo. Para desactivar al
Perro Guardián hay que escribir un 0 en el bit 2 (WDTE) de la Palabra de Configuración.
En el registro ESTADO existe un bit denominado TO# que pasa a valer 0 después
del desbordamiento del WDT.

EJEMPLO
Confeccionar un programa para cambiar la asignación del Divisor de frecuencia del
TMR0 al Perro Guardián.

SOLUCIÓN
Como el TMR0 ocupa la dirección 1 del banco 0 y el registro OPTION la misma direc-
ción, pero el banco 1, hay que hacer una conmutación de bancos que se controla con el
bit «rp0», que es el bit 5 del registro ESTADO.
bcf estado,rp0 ; Banco 0
clr tmr0 ; Borra TMR0 y el Divisor
bsf estado,rp0 : Banco 1
clrwdt ; Borra al Perro Guardián
movlw valor ; Carga en W el valor del WDT
movwf option ; Se asignan funciones en OPTION
bcf estado,rp0 ; Banco 0

En la Figura 10.6 se aprecia el comportamiento del Divisor de frecuencia como


«predivisor» para el TMR0 y como «posdivisor» para el WDT.

Figura 10.6. Esquema que resalta la actuación del Divisor de frecuencia con el TMR0 y con el WDT. El
bit PSA selecciona la asignación del Divisor al TMR0 o al WDT.
326 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

10.4. LAS PUERTAS DE E/S


El PIC16F84A sólo dispone de dos puertas de E/S. La Puerta A posee cinco líneas, RA0-RA4,
y una de ellas soporta dos funciones multiplexadas. Se trata de la RA4/T0CKI, que pue-
de actuar como línea de E/S o como patita por la que se reciben los impulsos que debe
contar TMR0. La Puerta B tiene ocho líneas, RB0-RB7, y también tiene una con funcio-
nes multiplexadas, la RB0/INT, que, además de línea típica de E/S, también sirve como
patita por la que se reciben los impulsos externos que provocan una interrupción.
Cada línea de E/S puede configurarse independientemente como entrada o como sa-
lida, según se ponga a 1 o a 0, respectivamente, el bit asociado del registro de configura-
ción de cada puerta (TRISA y TRISB). Se llaman PUERTAA y PUERTAB los registros
que guardan la información que entra o sale por la puerta y ocupan las direcciones 5 y
6 del banco 0 de la memoria de datos. Los registros de configuración TRISA y TRISB
ocupan las mismas direcciones, pero en el banco 1 (Fig. 10.7).

Figura 10.7. La información que entra o sale por las puertas reside en las posiciones 5 y 6 del banco 0,
mientras que TRISA y TRISB, que son los registros de configuración, ocupan las direcciones
5 y 6 del banco 1.

10.4.1. La Puerta A
Las líneas RA3-RA0 admiten niveles de entrada TTL y de salida CMOS. La línea RA4/
T0CKI dispone de un circuito Schmitt Trigger que proporciona una buena inmunidad
al ruido y la salida tiene drenador abierto. RA4 multiplexa su función de E/S con la de
entrada de impulsos externos para el TMR0.

Los bits del registro TRISA configuran a las líneas de la Puerta A como entradas si están a
1 y como salidas si están a 0.

En el circuito de la Figura 10.8 se muestra la adaptación de las patitas RA3-RA0 a


las señales internas del procesador.
Cuando se lee una línea de la puerta A (instrucción movfw puertaa), se recoge el nivel
lógico que tiene en ese momento. Las líneas, cuando actúan como salidas, están «latcheadas»,
lo que significa que sus patitas sacan el nivel lógico que se haya cargado por última vez en el
registro PUERTAA. La escritura de una puerta implica la operación «lectura/modificación/
LOS RECURSOS FUNDAMENTALES 327

Figura 10.8. Conexión electrónica de las patitas RA3-RA0 con las líneas de control y del bus de datos
del procesador.

escritura». Primero se lee la puerta, luego se modifica el valor y finalmente se escribe en el


latch de salida.
De la Figura 10.8 se desprende que cuando se saca un nivel lógico por una línea
de la Puerta A, primero se deposita en la línea correspondiente del bus de datos y se
activa la señal WRITE, lo que origina el almacenamiento de dicho nivel en la báscula
de datos. En esta situación, la báscula de configuración debería contener un 0 para
que actuase como salida. Con estos valores, la puerta OR tendría un 0 en su salida y la
AND también. Estos valores producen la conducción del transistor PMOS superior y
el bloqueo del NMOS. Así, la patita de E/S queda conectada a la VDD y tiene nivel alto.
Como la línea de salida está «latcheada», conserva su valor hasta que no se reescriba
en la báscula D.
Si una línea actúa como entrada, el nivel lógico depositado en ella desde el
exterior pasa a la línea correspondiente del bus interno de datos cuando se activa
la señal READ y se hace conductor el dispositivo triestado que les une. Al progra-
marse como entrada, los dos transistores MOS de salida quedan bloqueados y la
línea en alta impedancia. Téngase en cuenta que cuando se lee una línea de entra-
da se obtiene el estado actual que tiene su patita correspondiente y no el valor que
haya almacenado en la báscula de datos. La información presente en una línea de
entrada se muestrea al iniciarse el ciclo de instrucción y debe mantenerse estable
durante su desarrollo.
328 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

EJEMPLO
Configurar las dos líneas de menos peso de la Puerta A como entradas y las otras tres
como salidas.

SOLUCIÓN
bsf estado,rp0 ; Banco 1
movlw 0x03 ; Valor configuración Puerta A
movwf trisa ; RA4:RA2 salidas y RA0:RA1
; entradas

Al reinicializarse el PIC, todos los bits de los registros TRIS quedan a 1, con lo que
las líneas de las puertas quedan configuradas como entradas.
Cada línea de salida puede suministrar una corriente máxima de 25 mA, y si es en-
trada, puede absorber hasta 25 mA. Al existir una limitación en la disipación máxima
de la potencia del chip, se restringe la corriente máxima de absorción de la Puerta A a
80 mA y la de suministro a 50 mA. La Puerta B puede absorber un máximo de 150 mA
y suministrar un total de 100 mA.
Con movf puerta,w se lee una puerta y con la instrucción movwf puerta se escribe.
También existen instrucciones para modificar el valor de un bit particular correspondien-
te a una línea de una puerta con las instrucciones bsf puerta,bit (pone a 1 el bit indicado
de la puerta) y bcf puerta,bit. Existen instrucciones de salto condicionales que chequean
el valor de un bit de una puerta y brincan si vale 1 (btfss) o si vale 0 (btfsc).

10.4.2. La Puerta B
Consta de ocho líneas bidireccionales de E/S, RB7:RB0, cuya información se almacena
en el registro PUERTAB, que ocupa la dirección 6 del banco 0. El registro de configura-
ción TRISB ocupa la misma dirección en el banco 1.
La línea RB0/INT tiene dos funciones multiplexadas. Además de patita de E/S,
actúa como patita para la petición de una interrupción externa cuando se autoriza esta
función mediante la adecuada programación del registro INTCON, del que se hablará
más adelante.
A todas las líneas de esta puerta se las permite conectar una resistencia pull-up, de
elevado valor, con el positivo de la alimentación. Para este fin hay que programar en
el registro OPTION el bit RBPU# = 0, lo que provoca la conexión de una resistencia a
todas las líneas. Con el reset todas las líneas quedan configuradas como entradas y se
desactivan las resistencias pull-up.
Las cuatro líneas de más peso, RB7:RB4, pueden programarse para soportar una mi-
sión especial. Cuando las cuatro líneas actúan como entradas, se las puede programar para
generar una interrupción si alguna de ellas cambia su estado lógico. Esta posibilidad es muy
práctica en el control de teclados. En la Figura 10.9 se muestra el esquema de conexionado
entre las patitas RB7:RB4 y las líneas correspondientes del bus de datos interno.
LOS RECURSOS FUNDAMENTALES 329

Figura 10.9. Conexionado de las patitas RB7:RB4 y las líneas correspondientes al bus interno de datos
y las señales de control.

El estado de las patitas RB7:RB4 en modo entrada se compara con el valor antiguo
que tenían y que se había «latcheado» durante la última lectura de la Puerta B. El cambio de
estado en algunas de esas líneas origina una interrupción y la activación del señaliza-
dor RBIF.
La línea RB6 también se utiliza para la grabación serie de la memoria de programa
y sirve para soportar la señal de reloj. La línea RB7 constituye la entrada de los datos en
serie cuando se graba un programa en la memoria de código.
330 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

10.5. LA PALABRA DE CONFIGURACIÓN


Se trata de una posición reservada de la memoria de programa situada en la dirección
2007 H y accesible únicamente durante el proceso de grabación. Al escribirse el progra-
ma de la aplicación, es necesario grabar el contenido de esta posición de acuerdo con las
características del sistema.

Figura 10.10. Distribución de los bits de la Palabra de Configuración del PIC16F84A que ocupa la
dirección 2007 H de la memoria de programa.

En la Figura 10.10 se muestra la distribución y asignación de los 14 bits de la Pala-


bra de Configuración del PIC16F84A, que tienen las siguientes funciones:

— CP: Bits de protección de la memoria de código

1: No protegida.
0: Protegida. El programa no se puede leer, evitando copias. Tampoco se puede
sobrescribir. Además, evita que pueda ser accedida la EEPROM de datos;
y, finalmente, si se modifica el bit CP de 0 a 1, se borra completamente la
EEPROM.

— PWRTE: Activación del temporizador power-up

El temporizador power-up retrasa 72 ms la puesta en marcha o reset que se


produce al conectar la alimentación al PIC para garantizar la estabilidad de la
tensión aplicada.

1: Desactivado.
0: Activado.

— WDTE: Activación del Perro Guardián

1: Activado el WDT.
0: Desactivado.

— FOSC1-FOSC0: Selección del oscilador utilizado

1-1: Oscilador RC.


1-0: Oscilador HS.
0-1: Oscilador XT.
0-0: Oscilador LP.
LOS RECURSOS FUNDAMENTALES 331

10.5.1. Palabras de Identificación (ID)


Son cuatro posiciones reservadas de la memoria de programa ubicadas en las direcciones
2000 H-2003 H que no son accesibles en el funcionamiento normal del microcontrolador
y sólo pueden ser leídas y escritas durante el proceso de grabación.
Sólo se utilizan los 4 bits de menos de cada palabra de identificación (ID), en donde
se almacena un valor que puede consistir en un número de serie, códigos de identifica-
ción, numeraciones secuenciales o aleatorias, etc.

10.6. LA MEMORIA EEPROM DE DATOS


El PIC16F84A tiene 64 bytes de memoria EEPROM de datos, donde se pueden alma-
cenar datos y variables que interesa que no se pierdan cuando se desconecta la alimen-
tación al sistema. Soporta diez millones de ciclos de escritura/borrado y es capaz de
guardar la información sin alterarla más de cuarenta años.
La memoria EEPROM no está mapeada en la zona de memoria de datos donde se
ubican los registros SFR y GPR. Para poder leerla y escribirla durante el funcionamiento
normal del microcontrolador hay que utilizar cuatro registros del banco SFR:

— EEDATA.
— EEADR.
— EECON1.
— EECON2.

En el registro EEADR, ubicado en la dirección 9 del banco 0, se carga la dirección a


acceder de la EEPROM de datos. Las sesenta y cuatro posiciones de un byte ocupan las
direcciones de un mapa que comienza en 00 H y termina en 3F H; por eso, los 2 bits de
más peso del registro EEADR siempre valen 0.
En el registro EEDATA, ubicado en la dirección 8 del banco 0, se depositan los datos
que se leen o se escriben.

Figura 10.11. Distribución de los bits del registro EECON1 de los PIC16X8X.

El registro EECON1, que ocupa la dirección 88 H de la memoria de datos o la dirección


8 H del banco 1, tiene misiones de control en las operaciones de la EEPROM y la distri-
bución de sus bits se presenta en la Figura 10.11, mientras que la misión de cada uno se
explica a continuación:
332 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

— RD: Lectura

1: Se pone a 1 cuando se va a realizar un ciclo de lectura de la EEPROM. Luego


pasa a 0 automáticamente.

— WR: Escritura

1: Se pone a 1 cuando se inicia un ciclo de escritura de la EEPROM. Cuando se


completa el ciclo, pasa a 0 automáticamente.

— WREN: Permiso de escritura

1: Permite la escritura de la EEPROM.


0: Prohíbe la escritura.

— WRERR: Señalizador de error en escritura

1: Se pone a 1 cuando una operación de escritura ha terminado prematura-


mente.
0: La operación de escritura se ha completado correctamente.

— EEIF: Señalizador de final de operación de escritura

1: Cuando este señalizador se pone a 1, indica que la operación de escritura se


ha completado con éxito. Se pone a 0 por programa.
0: La operación de escritura no se ha completado.

Un ciclo de escritura de una posición de la EEPROM de datos tiene una duración típica de
10 ms, que resulta muy larga para la velocidad del procesador. Por este motivo existen varios
bits en el registro EECON1 para supervisar la completa y correcta terminación del mismo.

El registro EECON2, en realidad, no está implementado físicamente. Al leerlo, todos


sus bits son 0. Sólo se emplea como un dispositivo de seguridad durante el proceso de
escritura de la EEPROM para evitar las interferencias en el largo intervalo de tiempo que
precisa su desarrollo.

10.6.1. Proceso de lectura


Se inicia un ciclo de lectura colocando la dirección a acceder en el registro EEADR y po-
niendo el bit RD = 1 en el registro EECON1. El dato leído estará disponible en el registro
EEDATA en el siguiente ciclo y permanecerá en él hasta que se realice una nueva lectura
o escritura en la EEPROM.
LOS RECURSOS FUNDAMENTALES 333

EJEMPLO
Confeccionar un programa para realizar la lectura de una posición lect de la EEPROM de
datos.

SOLUCIÓN
bcf estado,rp0 ; Banco 0
movlw lect ; Dirección a leer
movwf eeadr ;
bsf estado,rp0 ; Banco 1
bsf eecon1,rd ; Lectura
bcf estado,rp0 ; Banco 0
movf eedata,w ; W se carga con valor leído en EEPROM

10.6.2. Proceso de escritura


Para escribir una posición de la EEPROM de datos, el usuario debe seguir una determi-
nada secuencia de instrucciones en las que participa el registro EECON2. Este registro,
que en realidad no se halla implementado físicamente, sólo asume funciones de segu-
ridad en el proceso, cargándose en él dos valores concretos: 55 H y aa H. La duración
típica de un ciclo de escritura es de 10 ms, que es notablemente larga en comparación
con la velocidad del PIC.
El ciclo de escritura comienza cargando en EEADR la dirección de la posición a
escribir y en el registro EEDATA el valor a grabar.

EJEMPLO
Escribir en la dirección escr de la EEPROM de datos el valor dato.
SOLUCIÓN
bcf estado,rp0 ; Banco 0
movlw escr ;
movwf eeadr ; Se escribe la dirección en eeadr
movlw dato ;
movwf eedata ; Se escribe el dato en eedata
bsf estado,rp0 ; Banco 1
bsf eecon1,wren ; Permiso escritura
; Inicio secuencia escritura
movlw 0x55 h ;
movwf eecon2 ; Se escribe 55 h en eecon2
movlw 0xaa h ;
movwf eecon2 ; Se escribe aa h en eecon2
bsf eecon1,wr ; Comienza la escritura
334 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Al acabar el proceso de escritura, el bit WR pasa a valer 0 automáticamente, mien-


tras que el señalizador EEIF se pone a 1. Este último bit hay que ponerlo a 0 posterior-
mente mediante software.
Una buena precaución es verificar si la escritura de la EEPROM ha sido correcta,
para lo cual se suele restar el dato escrito con el que existe en el registro EEDATA. Si no
se ha producido error, el señalizador Z pasa a valer 1.
Dada la importancia de conocer el fin de la escritura de una posición de la EEPROM, no
sólo se informa activando el señalizador EEIF, sino que además, si se desea, se puede
provocar una interrupción.
CAPÍTULO
Interrupciones,
reset y recursos auxiliares
11

11.1. IMPORTANCIA DE LAS INTERRUPCIONES


Las llamadas a subrutinas mediante la instrucción CALL son desviaciones del flujo de
control del programa originadas por instrucciones, por lo que se consideran síncronas.
Se producen cada vez que se ejecuta dicha instrucción.
Las interrupciones son desviaciones del flujo de control del programa originadas
asíncronamente por diversos sucesos que no se hallan bajo la supervisión de las instruc-
ciones. Dichos sucesos pueden ser externos al sistema, como la generación de un flanco
o nivel activo en una patita del microcontrolador, o bien internos, como el desborda-
miento de un contador.
El comportamiento del microcontrolador ante la interrupción es similar al de la
instrucción CALL de llamada a subrutina. En ambos casos se detiene la ejecución del
programa en curso, se salva la dirección actual del PC en la Pila y se carga el PC con una
dirección, que en el caso de CALL viene acompañando a la propia instrucción, y en el
caso de una interrupción, es una dirección «reservada» de la memoria de código, llamada
Vector de Interrupción.

En el PIC16F84A, el Vector de Interrupción se halla situado en la dirección 0004 H, en donde


comienza la Rutina de Servicio a la Interrupción (RSI). En general, en dicho Vector se suele
colocar una instrucción de salto incondicional (GOTO) que traslada el flujo de control a la
zona de la memoria de código destinada a contener la rutina de atención a la interrupción.

La RSI suele comenzar guardando en la memoria de datos algunos registros especí-


ficos del procesador. Concretamente, aquellos que la RSI va a emplear y va a alterar su
contenido. Antes del retorno al programa principal, se recuperan los valores guardados y
se restaura completamente el estado del procesador. Algunos procesadores salvan estos
registros en la Pila, pero los PIC no disponen de instrucciones para meter (push) y sacar
(pop) información de la Pila, utilizando para este fin registros de propósito general de la
memoria de datos.
El PIC16F84A puede ser interrumpido por cuatro causas diferentes, pero todas des-
vían el flujo de control a la dirección 0004 H, por lo que otra de las operaciones iniciales

335
336 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 11.1. Organigrama de las operaciones principales de una interrupción en el PIC16F84A. El


señalizador de la fuente de interrupción hay que borrarlo antes del retorno para que no se
repita la misma interrupción.
INTERRUPCIONES, «RESET» Y RECURSOS AUXILIARES 337

de la RSI es averiguar cuál de las posibles causas ha sido la responsable de la interrup-


ción en curso. Para ello, se exploran los señalizadores de las fuentes de interrupción.
Otro detalle importante en la RSI de los PIC16X8X es que estos microcontrolado-
res poseen un bit GIE (Global Interrupt Enable) que cuando vale 0 prohíbe todas las
interrupciones. Pues bien, al comenzar la RSI dicho bit GIE, se pone automáticamente
a 0 con objeto de no atender nuevas interrupciones hasta que se termine la que ha co-
menzado. En el retorno final de la interrupción, GIE pasa a valer automáticamente 1
para volver a tener en cuenta las interrupciones. Dicho retorno de interrupción se realiza
mediante la instrucción RETFIE.
Antes del retorno conviene borrar el señalizador de la causa de interrupción que se
ha atendido, porque si bien los señalizadores se ponen a 1 automáticamente en cuanto
se produce la causa que indican, la puesta a 0 se hace por programa. En la Figura 11.1
se muestra un organigrama de las fases más importantes que se desarrollan durante el
proceso de ejecución de una interrupción.

11.2. CAUSAS DE INTERRUPCIÓN


El PIC16F84A tiene cuatro causas o fuentes posibles de interrupción:

1.a Activación de la patita RB0/INT.


2.a Desbordamiento del temporizador TMR0.
3.a Cambio de estado en una de las cuatro patitas de más peso (RB7:RB4) de la Puerta B.
4.a Finalización de la escritura en la EEPROM de datos.

Cuando ocurre cualquiera de los cuatro sucesos indicados, se origina una petición de
interrupción que si se acepta y se atiende comienza depositando el valor del PC actual en
la Pila, poniendo el bit GIE = 0 y cargando en el PC el valor 0004 H, que es el Vector de
Interrupción donde se desvía el flujo de control.
Cada fuente de interrupción dispone de un señalizador o flag, que es un bit que
se pone automáticamente a 1 cuando se produce. Además, cada fuente de interrupción
tiene otro bit de permiso que, según su valor, permite o prohíbe la realización de una
interrupción.

11.2.1. El Registro de Control de Interrupciones INTCON


La mayor parte de los señalizadores y bits de permiso de las fuentes de interrupción en el
PIC16F84A está implementada sobre los bits del registro INTCON, que ocupa la direc-
ción 0B H del banco 0, hallándose duplicado en el banco 1 (véase Figura 11.2).

Figura 11.2. Distribución de los bits del Registro de Control de Interrupciones en el PIC16F84A.
338 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

— GIE: Permiso global de interrupciones


1: Permite la ejecución de todas las interrupciones cuyos bits de permiso indivi-
duales también las permitan.
0: Prohíbe todas las interrupciones.

— EEIE: Permiso de interrupción por fin de la escritura en la EEPROM


1: Permite que se origine una interrupción cuando termina la escritura de la
EEPROM de datos.
0: Prohíbe que se produzca esta interrupción.

— T0IE: Permiso de interrupción por sobrepasamiento del TMR0


1: Permite una interrupción al desbordarse el TMR0.
0: Prohíbe esta interrupción.

— INTE: Permiso de interrupción por activación de la patita RB0/INT


1: Permite la interrupción al activarse RB0/INT.
0: Prohíbe esta interrupción.

— RBIE: Permiso de interrupción por cambio de estado en RB7:RB4


1: Permite esta interrupción.
0: Prohíbe esta interrupción.

— T0IF: Señalizador de sobrepasamiento del TMR0


1: Se pone a 1 cuando ha ocurrido el sobrepasamiento.
0: Indica que el TMR0 no se ha desbordado.

— INTF: Señalizador de activación de la patita RB0/INT


1: Se pone a 1 al activarse RB0/INT al recibir un flanco activo desde el exterior.
0: Indica que RB0/INT no ha recibido un flanco activo.

— RBIF: Señalizador de cambio de estado en las patitas RB7:RB4


1: Pasa a 1 cuando cambia el estado de alguna de estas cuatro líneas.
0: No ha cambiado el estado de RB7:RB4.

Cuando GIE = 0, no se acepta ninguna de las interrupciones. Si GIE = 1, sólo se aceptan


aquellas fuentes de interrupción cuyo bit de permiso se lo consienta.

Siempre que se produzca una interrupción por cualquier causa, GIE = 0 y el PC se


carga con el valor 0004 H, que es el Vector de Interrupción. Para conocer qué causa ha
provocado la interrupción se exploran los señalizadores, tres de los cuales se ubican en
el registro INTCON y el cuarto, EEIF, que se pone a 1 cuando finaliza la escritura de la
EEPROM, se halla en el bit 4 del registro EECON1.
Los señalizadores deben ponerse a 0 por programa antes del retorno de la interrupción
y son operativos aunque la interrupción esté prohibida por su bit de permiso corres-
INTERRUPCIONES, «RESET» Y RECURSOS AUXILIARES 339

Figura 11.3. Lógica de control para la generación de una interrupción en el PIC16F84A.

pondiente. En la Figura 11.3 se ofrece el esquema de la lógica de control que origina la


interrupción.

EJEMPLO

Confeccionar un programa que explore de forma continua las cuatro fuentes de in-
terrupción para averiguar cuál se ha activado.

SOLUCIÓN
Se usa la instrucción btfss registro,n, que explora el bit n de «registro», y si vale 1, se
salta una instrucción, o sea, el PC se incrementa en dos unidades. A esta operación se
la denomina brinco.

* inicio del servicio de interrupción por activación de RB0/INT

int btfss intcon, intf ; Explora el bit intf de


; intcon y si vale 1 hay brinco
goto puertab ; Salta a puertab

* inicio del servicio de interrupción por cambio en RB7 : RB4

puertab btfss intcon, rbif ; Explora el bit «rbif» de


; intcon y si vale 1 se produce brinco
goto tmr0
340 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

* inicio del servicio de interrupción por desbordamiento de TMR0

tmr0 btfss intcon, t0if ; Explora el bit toif y si


; vale 1 brinco
goto eeprom

* inicia el servicio de interrupción por fin de la escritura en la EEPROM

eeprom btfss eecon1, eeif ; Explora el bit eeif del


; registro eecon1 y si
; vale 1 hay brinco
goto int ; Vuelve al principio

EJEMPLO
Confeccionar un programa que asegure que todas las interrupciones se hallan prohibidas.

SOLUCIÓN
Se comprueba que el bit GIE = 0. Se utiliza la instrucción que examina un bit, y si vale 0,
produce un brinco o un salto de la instrucción siguiente:
bucle bcf intcon,gie ; GIE = 0
btfsc intcon,gie ; Si GIE =0, entonces hay brinco
goto bucle
(continúa)

11.2.2. Interrupción externa INT


Esta fuente de interrupción es sumamente importante para atender acontecimientos ex-
ternos en tiempo real. Cuando ocurre alguno de ellos, se activa la patita RB0/INT y se
hace una petición de interrupción. Entonces, de forma automática, el bit INTF = 1, y si el
bit de permiso INTE = 1, se autoriza el desarrollo de la interrupción.
Mediante el bit 6, llamado INTDEG, del registro OPTION, se puede seleccionar
cuál será el flanco activo en RB0/INT. Si se desea que sea el ascendente, se escribe un 1
en dicho bit, y si se desea que sea el descendente, se escribe un 0.
El procesador explora el señalizador INTF al final del primer ciclo de reloj de cada
ciclo de instrucción. Recuérdese que cada ciclo de instrucción constaba de cuatro ciclos
de reloj: Q1, Q2, Q3 y Q4. Al terminar Q1, se exploran los señalizadores, produciéndose
un período de latencia de tres o cuatro ciclos de instrucción desde el momento que hay
un señalizador activado hasta que se inicializa la interrupción.
En la Figura 11.4 se muestra un esquema práctico para generar una interrupción por
activación en la patita RB0/INT. Los dos inversores del 74LS04 realimentados consti-
tuyen un filtro antirrebotes para pulsador, y la red R-C y el último inversor controlan la
duración del impulso.
INTERRUPCIONES, «RESET» Y RECURSOS AUXILIARES 341

Figura 11.4. Circuito para generar impulsos de duración determinada. En el esquema, Tiempo =
470 · 0,05 = 23,5 ms.

Si INTE = 1 y se aplica un flanco activo en RB0/INT, el señalizador INTF se pone a 1 automá-


ticamente y se solicita una interrupción, que es aceptada cuando GIE = 1. Antes de regresar
al programa principal hay que borrar INTF, puesto que en caso contrario, al ejecutar la ins-
trucción de retorno RETFIE, se volvería a desarrollar el mismo proceso de interrupción.

EJEMPLO
Confeccionar un programa para permitir que se acepte la interrupción por activación
de la patita RB0/INT al aplicarla un flanco descendente.

SOLUCIÓN
El programa deberá encargarse de que los bits del registro INTCON tomen los siguien-
tes valores: INTE=GIE=1 y T0IE =RBIE=EEIE= 0. También deberá asegurarse de que
inicialmente, antes de producirse la interrupción, el señalizador INTF valga 0.
bsf estado,rp0 ; Selección del banco 1
bcf option,intdeg ; INTDEG =0 para flanco descendente
bcf estado,rp0 ; Selección banco 0
bsf intcon,gie ; GIE=1
bsf intcon,inte ; INTE=1
bcf intcon,rbie ; RBIE=0
bcf intcon,eeie ; EEIE=0
bcf intcon,intf ; INTF=0
Se podía haber cargado todos los bits del registro INTCON con una instrucción.

11.2.3. Interrupción por desbordamiento del TMR0


Cuando TMR0 se desborda y pasa del valor FF H al 00 H, el señalizador T0IF se pone
automáticamente a 1. Si, además, el bit de permiso de la interrupción del TMR0, T0IE=1,
y el bit de Permiso Global de Interrupciones GIE=1, se produce una interrupción.
342 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Si no se recarga el TMR0 cuando se desborda, sigue contando desde 00 H a FF H.


En cualquier momento se puede leer y escribir este registro, pero cada vez que se escribe
se pierden dos ciclos de reloj para la sincronización.
Cuando se carga inicialmente TMR0 con el valor N10, cuenta 256 – N impulsos,
siendo el tiempo que tarda en hacerlo el que expresa la siguiente fórmula:

Temporización = 4 · Tosc · (256 – N10) · Rango del Divisor de frecuencia

EJEMPLO
¿Cada cuánto tiempo producirá TMR0 una interrupción si se le carga continuamente
con el valor 4010 , el Divisor de frecuencia está programado en el rango 1:8 y el micro-
controlador dispone de un cristal de 1 MHz?

SOLUCIÓN
Para averiguar el tiempo de retardo se aplica la fórmula:
Temporización = 4 · Tosc · (256 – N10) · Rango del Divisor de frecuencia
Temporización = 4 · 1 µs · (256 – 40) · 8 = 6.192 ms

11.2.4. Interrupción por cambio de estado en las líneas RB7:RB4


de la Puerta B
Esta interrupción está diseñada específicamente para detectar la pulsación de una tecla
correspondiente a un teclado matricial que se explora con cuatro líneas de E/S. Para
esta función se destinan las líneas RB7:RB4 de la Puerta B, que cada vez que cambia el
estado lógico de una de ellas se fuerza al señalizador RBIF a ponerse a 1, y si los bits de
permiso RBIE = GIE = 1, se autoriza la interrupción.

11.2.5. Interrupción por finalización de la escritura en la EEPROM


de datos
El tiempo típico que tarda en desarrollarse una operación de escritura en la EEPROM
de datos del PIC16F84A es de 10 ms, que es considerable comparado con la velocidad
a la que el procesador ejecuta instrucciones. Para asegurarse de que se ha completado la
escritura y puede continuarse con el flujo de control del programa, es aconsejable mane-
jar la interrupción que se origina al finalizar la escritura, que pone automáticamente el
señalizador EEIF a 1 y se autoriza siempre que los bits de permiso EEIE = GIE = 1.
Cuando se describió el proceso de escritura de la EEPROM de datos se indicó que
se usaba un registro no real para asegurar la misma. Se trataba del EECON2, en el que se
grababan dos valores, el 55 H y el AA H. Durante la escritura de este registro debe pro-
INTERRUPCIONES, «RESET» Y RECURSOS AUXILIARES 343

hibirse la aceptación de interrupciones para salvaguardar la operación de escritura; por


eso, en ese módulo se pone GIE=0, tal como se indica en el siguiente trozo de programa
orientado a escribir la memoria EEPROM. Se supone que la dirección a acceder ya se ha
cargado en el registro EEADR y el dato a escribir en EEDATA:

bsf estado,rp0 ; Selecciona el banco 1


bcf intcon,gie ; GIE=0. Prohíbe interrupciones
bsf intcon,eeie ; Permite la interrupción de la EEPROM
bsf eecon1,wren ; Permiso de escritura de la EEPROM
movlw 0x55
movwf eecon2 ; Se escribe en eecon2 el dato 55 h
movlw 0xaa
movwf eecon2 ; Se escribe aa h en eecon2
bsf eecon1,wr ; Comienza el proceso de escritura
bsf intcon,gie ; Permiso de interrupciones. GIE = 1

En el PIC16F84A se puede leer y escribir la EEPROM de datos aunque se haya pro-


tegido el código. En los PIC16CR8X, que disponen de memoria ROM para el código,
existen dos bits para el código de protección: uno dedicado a la ROM de código y el otro
a la EEPROM de datos.

11.3. REINICIALIZACIÓN O «RESET»

El PIC16F84A tiene cinco causas que provocan la reinicialización del sistema, consis-
tente en cargar al PC con el valor 000 H (Vector de Reset) y poner el estado de los bits
de los registros específicos (SFR) con un valor conocido.

1.a Conexión de la alimentación, POR («Power on Reset»).


2.a Activación de la patita MCLR# («Master Clear Reset») en funcionamiento normal.
3.a Activación de la patita MCLR# en estado de reposo.
4.a Desbordamiento del Perro Guardián en funcionamiento normal.
5.a Desbordamiento del Perro Guardián en estado de reposo.

En la Tabla 11.1 se presenta el estado lógico que adquieren los bits de los registros SFR
de la memoria de datos cuando se provoca un reset por una de las cinco causas posibles.
En la Figura 11.5 se muestra el esquema electrónico del PIC16F84A para la genera-
ción del reset. La patita MCLR# dispone de un filtro interno para eliminar los ruidos y
los impulsos muy pequeños.
El temporizador PWRT (Power-up-Timer) activa una salida al cabo de un cierto
tiempo tras la conexión de la alimentación, que se aplica a una entrada de la AND4,
encargada de controlar el reset del flip-flop que gobierna la generación interna del reset
del sistema. Sólo es válida la salida de PWRT si el bit de permiso del PWRT está activo
a nivel bajo (PWRT# = 0), dado que también se aplica a la OR7 de la Figura 11.5. El bit
PWRT reside en la Palabra de Configuración.
344 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

CONEXIÓN DESBORDAMIENTO DESBORDAMIENTO


MCLR# MCLR#
REGISTRO DIRECCIÓN DE LA PERRO GUARDIÁN PERRO GUARDIÁN
MODO NORMAL MODO REPOSO
ALIMENTACIÓN MODO NORMAL MODO REPOSO
W ----- xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
INDIR 00 h ----- ----- ----- ----- -----
RTCC 01 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
PC 02 h 0000 h 0000 h PC + 1 0000 h 0000 h
STATUS 03 h 0001 1xxx 0000 1uuu uuu0 0uuu 000u uuuu 0001 0uuu
FSR 04 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
PORT A 05 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
PORT B 06 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
TRIS A 85 h ---1 1111 ---1 1111 ---u uuuu ---1 1111 ---1 1111
TRIS B 86 h 1111 1111 1111 1111 uuuu uuuu 1111 1111 1111 1111
OPTION 81 h 1111 1111 1111 1111 uuuu uuuu 1111 1111 1111 1111
EEDATA 08 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
EEADR 09 h xxxx xxxx uuuu uuuu uuuu uuuu uuuu uuuu uuuu uuuu
EECON 1 88 h ---0 ?000 ---0 0000 ---u uuuu ---0 ?000 ---0 ?000
EECON 2 89 h ----- ----- ----- ----- -----
PCLATH 0A h ---0 0000 ---0 0000 ---u uuuu ---0 0000 ---0 0000
INTCON 0B h 0000 000x 0000 000u uuuu uuuu 0000 000u 0000 0000

u = No cambia x = Indeterminado ---- = No implementado ? = Depende de otras condiciones

Tabla 11.1. Valor que adquieren los bits de los registros SFR y el W después de producirse un reset por
una de las cinco causas posibles.

El reset del flip-flop final se produce cuando la AND4 saca nivel alto, lo que requiere
que sus tres entradas tengan dicho nivel, y eso supone:

Figura 11.5. Esquema electrónico para la generación interna del reset.


INTERRUPCIONES, «RESET» Y RECURSOS AUXILIARES 345

a) Que no haya peticiones de reset y la puerta OR2 tenga su salida a nivel bajo.
b) Que si está activo PWRT, finalice su retardo de 72 ms.
c) Que también finalice la temporización del oscilador OST, que retarda 1.024 · Tosc
tras completarse el retardo de PWRT.

El temporizador PWRT proporciona un retardo fijo de 72 ms y sus impulsos de reloj los gene-
ra un oscilador R-C propio. Este tiempo garantiza la estabilización del voltaje de alimentación
VDD.

El temporizador OST (Oscillator Start-up Timer) proporciona un retardo de 1.024 · Tosc


(período de los impulsos aplicados en la patita OSC1/CLKIN). Sirve para asegurar que
el cristal de cuarzo o resonador cerámico empleado en los osciladores tipo XT, LP o HS
esté estable y en marcha. OST comienza a funcionar cuando termina el retardo de PWRT
debido a la conexión de la salida de la OR7 con la AND5.
La activación de la entrada set del flip-flop se consigue cuando se activa la patita
MCLR#, cuando se desborda el Perro Guardián o cuando se detecta un flanco ascenden-
te en la patita VDD (POR).
En la Figura 11.6 se ofrece un cronograma de las principales señales que participan
en la generación del reset y en el que se aprecia la secuencia de los retardos TPWRT y
TOST.
En el registro ESTADO hay dos bits que indican las condiciones en las que se ha
originado el reset. Se trata de TO# (Timer Out) y PD# (Power Down) (Fig. 11.7).

Figura 11.6. Cronograma de las principales señales que intervienen en el reset para uno de los posibles
casos en que MCLR# no cambia de estado con VDD.
346 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 11.7. Condiciones de reset reflejadas por el estado de los bits TO# y PD# del registro ESTADO.

11.3.1. «Reset» por fallo en la alimentación («Brown Out»)


Se produce un fallo en la alimentación cuando el voltaje de alimentación VDD desciende
por debajo del valor mínimo sin llegar a cero y luego se recupera. En esta situación es
preciso provocar un reset.
Para generar un reset en un PIC16F84A cuando existe un fallo en la alimentación,
hay que colocar un circuito externo de protección, como los dos que se muestran en las
Figuras 11.8 y 11.9.
La patita MCLR# puede conectarse directamente con VDD, pero debe colocarse una
resistencia de valor superior a 100 W cuando se conecta con tierra para evitar los proble-
mas que pueda originar la corriente que circula.

Figura 11.8. Cuando VDD desciende por debajo del valor Vz + 0,7 V, se produce un reset por la activación
de la patita MCLR#.
INTERRUPCIONES, «RESET» Y RECURSOS AUXILIARES 347

Figura 11.9. El transistor Q1 se bloquea y activa el reset al pasar a nivel bajo la patita MCLR# cuando
el valor VDD desciende por debajo de VDD · R1/(R1 + R2) = 0,7 V.

11.4. EL MODO DE REPOSO O DE BAJO CONSUMO


Este modo de funcionamiento de los PIC está caracterizado por el reducido consumo de
energía que requiere y está muy recomendado en aquellas aplicaciones en las que hay
largos períodos de espera hasta que se produzca algún suceso asíncrono, como la pulsa-
ción de una tecla. En dichos períodos, el procesador está inactivo.

El consumo típico del PIC es menor de 2 mA a 5 V y 4 MHz, aproximadamente, reducién-


dose a menos de 10 µA en el modo reposo, lo que permite alimentarle con una pequeña
pila durante casi dos años.

Para entrar en el modo de reposo hay que ejecutar la instrucción SLEEP, produ-
ciéndose una situación muy especial de funcionamiento que parece como si el sistema
se hubiera «congelado», requiriendo el mínimo suministro de energía para mantener el
estado del procesador sin ninguna actividad.
En reposo, la patita T0CKI se conecta a VDD o a tierra para eliminar la entrada de im-
pulsos externos al TMR0. Por otra parte, como se detiene el oscilador principal que genera
los impulsos Tosc, también se para TMR0. Las patitas de E/S mantienen el estado anterior
al modo de reposo y las que no se hallan conectadas a periféricos y actúan como entradas
de alta impedancia se aconseja conectarlas a VDD o a tierra para evitar posibles fugas de
corriente. La patita MCLR# debe conectarse a nivel alto. Sin impulsos de reloj, el procesa-
dor se congela y deja de ejecutar instrucciones hasta que «despierte» y salga de ese estado.
Si el Perro Guardián continúa activo en el modo de reposo, al entrar en él se borra,
pero sigue funcionando. Los bits del registro de ESTADO PD# y TO# toman los valores
0 y 1, respectivamente.
348 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Para salir del estado de reposo (despertar) existen tres alternativas:


1.a Activación externa de MCLR# para provocar un reset.
2.a Desbordamiento del Perro Guardián si quedó operativo en el modo de reposo.
3.a Generación de una interrupción. En este caso, como TMR0 está parado, sólo
pueden producirse los otros tres tipos de interrupción.

Cuando se despierta, el PIC desarrolla la secuencia del oscilador OST, que retarda 1.024 Tosc
para estabilizar la frecuencia de trabajo y luego se pasa a ejecutar la siguiente instrucción a
sleep (PC + 1).

Los bits TO# y PD# se emplean para conocer la causa del reset que despierta al sistema.
PD# = 0 cuando se ejecuta la instrucción SLEEP. TO# = 0 cuando se desborda el Perro
Guardián.

11.5. PROGRAMACIÓN EN SERIE DE LOS PIC16X8X


Los PIC que estamos estudiando permiten que se grabe en su memoria de código el
programa sobre el mismo circuito de la aplicación. Esto permite a los fabricantes de
productos finales construir la tarjeta electrónica con el microcontrolador sin grabar y
realizar la escritura del programa justo cuando se realiza la venta. Así, se puede aportar
el firmware más reciente que se disponga.
La programación en serie de los PIC16X8X requiere cinco líneas, dos de las cuales
se destinan a soportar los impulsos de reloj de la transmisión (RB6) y los bits de infor-
mación (RB7), mientras que las otras tres soportan VDD, tierra y la tensión especial de
programación Vpp, que oscila entre 12 y 14 V (Fig. 11.10).

Figura 11.10. Típico esquema de conexionado de un PIC16X8X para la grabación del programa en serie.
INTERRUPCIONES, «RESET» Y RECURSOS AUXILIARES 349

El microcontrolador pasa al modo de programación/verificación colocando a ni-


vel bajo las líneas RB6 y RB7 y aplicando la tensión de programación Vpp a la patita
MCLR#/Vpp. A partir de ese momento, por RB6 se transmiten los impulsos de reloj y por
RB7 se transfieren los bits de datos en serie.
CAPÍTULO
Manejando el repertorio
de instrucciones
12

12.1. REPERTORIO RISC


Todos los modelos de microcontroladores PIC responden a la arquitectura RISC, que
significa «computador de juego de instrucciones reducido». No sólo implica que el nú-
mero de instrucciones máquina que es capaz de interpretar y ejecutar el procesador es
pequeño, como sucede en el PIC16F84A, que consta de treinta y cinco, sino también que
posee las siguientes características:

— Las instrucciones son simples y rápidas. La falta de complejidad en la opera-


ción que realizan las instrucciones de los procesadores RISC permite que sean
ejecutadas mayoritariamente en un solo ciclo de instrucción. Los PIC tardan
en ejecutar todas las instrucciones un ciclo, excepto las de salto, que tardan el
doble.
— Las instrucciones son ortogonales. Apenas tienen restricciones en el uso de
operandos. Cualquier instrucción puede usar cualquier operando.
— La longitud de las instrucciones y los datos es constante. Todas las instrucciones
tienen la misma longitud, 14 bits en los PIC16X8X, y todos los datos también, un
byte. La arquitectura Harvard del procesador aísla la memoria de instrucciones de
la de datos, pudiendo tener sus palabras diferente tamaño.

EJEMPLO
Un PIC16F84A funcionando con un cristal de cuarzo de 10 MHz tarda 600 µs en
ejecutar un programa que tiene el 50 por 100 de las instrucciones de salto.
a) ¿De cuántas instrucciones consta el programa?
b) ¿Cuántas posiciones de la memoria de código ocupa?

351
352 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

SOLUCIÓN
Todas las instrucciones tardan en ejecutarse un ciclo de instrucción, equivalente a
cuatro ciclos de reloj, excepto las de salto, que tardan el doble.
CLK = TOSC = 1/10 · 106 s = 100 ns
Ciclo instrucción = 4 · Tosc = 400 ns
TPROGRAMA = 600 µs = X · 400 ns + 2 · X · 400 ns
X = 500
Luego hay quinientas instrucciones normales y quinientas de salto; en total, mil
instrucciones.
a) Mil instrucciones tiene el programa.
b) El programa ocupa mil posiciones de la memoria de código.

12.2. TIPOS DE FORMATO


Las instrucciones de los PIC de la gama media, entre los que se encuentran los modelos
PIC16X8X, tienen 14 bits de longitud. Dicho formato se divide en diferentes campos de
bits, cada uno de los cuales referencia a operandos o elementos que maneja la instruc-
ción en la operación que realiza en el procesador. Se describen dichos campos:
a) Campo del código OP. Los bits de este campo sirven para definir la operación que
realiza la instrucción.
b) Campo de los operandos fuente (f) y destino (d). Estos campos de bits definen
los registros que actúan como operandos en la instrucción. Suelen referenciar la
dirección que ocupan en la memoria de datos.
c) Campo de operando inmediato o literal (k). Es un campo de bits que contiene el
valor de un operando inmediato.
d) Campo de referencia a un bit (b). Suele ser un campo de 3 bits que indica la
posición de un bit concreto dentro de un re-gistro de 8 bits.
e) Campo de la dirección del salto. En las instrucciones de salto CALL y GOTO
hay un campo de bits que contiene la dirección de la siguiente instrucción que
hay que ejecutar. Dicho campo de bits se carga en el PC en las instrucciones de
salto incondicional.

Para estudiar los diversos formatos que admiten las instrucciones del repertorio de
los PIC de la gama media, se clasifican en cinco grandes grupos atendiendo al tipo de
operación que desarrollan.

1.o Operaciones orientadas a manejar registros de tamaño byte.


2.o Operaciones orientadas a manejar bits.
3.o Operaciones que manejan valores inmediatos.
4.o Operaciones incondicionales de control del flujo del programa.
5.o Operaciones de salto condicional.
MANEJANDO EL REPERTORIO DE INSTRUCCIONES 353

12.2.1. Operaciones orientadas a manejar registros de tamaño «byte»

El formato de las instrucciones que corresponden a este grupo se divide en tres campos:
1. Campo del código OP, de 6 bits.
2. Campo de la dirección del operando fuente (f ), de 7 bits.
3. Campo que define el operando destino (d ), de 1 bit.

Las instrucciones de este grupo tienen como sintaxis nemónico f,d. Cuando d = 1,
el registro destino coincide con el registro fuente. Por ejemplo, si se desea incrementar
el contenido de un registro, reg1, y guardar el nuevo valor en el mismo, se usa la
instrucción inc reg1,1.

EJEMPLO
¿Qué utilidad puede tener una instrucción que mueve el contenido de un registro a él
mismo (coincide el registro fuente con el registro destino): movf reg1,1?

SOLUCIÓN
La instrucción movf f,d pone a 1 el señalizador Z cuando lo transferido es 0. Por eso,
dicha instrucción puede servir para saber si el contenido es 0 o no lo es.

EJEMPLO
Hallar el formato de la instrucción incf f,d que utiliza como operando fuente el registro
que ocupa la dirección 0x07 de la memoria de datos y como registro destino él mismo
(d = 1). Se sabe que los 6 bits del código OP valen 001010.

Figura 12.1. Formato de las instrucciones orientadas a manejar operandos que son registros de 1 byte.
El operando fuente (f) se representa con los 7 bits de la dirección que ocupa el registro en
la memoria de datos. El destino puede ser el mismo operando fuente (d = 1) o el registro
W (d = 0).
354 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

SOLUCIÓN
Campo del código OP (6 bits) : 001010
Campo del destino (1 bit) :1
Campo operando fuente (7 bits) : 0000111

Formato de la instrucción incf 0x07,1 : 001010 1 0000111

12.2.2. Operaciones orientadas a manejar bits

El formato al que responden las instrucciones de este grupo tiene tres campos y se mues-
tra en la Figura 12.2.
1. Campo del código OP, de 4 bits.
2. Campo de la dirección del registro fuente, de 7 bits.
3. Campo de la posición del bit en el registro, de 3 bits.

EJEMPLO
Al hacer un reset, el procesador coloca el bit 5 (rp0) del registro ESTADO a 0, con lo
que comienza referenciando al banco 0 de la memoria de datos de un PIC16X8X. Para
referenciar al banco 1 hay que poner a 1 dicho bit.
a) Indicar la instrucción que permite dicha conmutación de bancos.
b) Si el código OP de la instrucción bsf es 0101 y el registro ESTADO ocupa la
dirección 0x03 del banco 0 y 1 de la memoria de datos, hallar el formato de la
instrucción del apartado anterior.

SOLUCIÓN
a) bsf ESTADO,5
b) Campo del código OP : 0101
Campo de la posición del bit : 101
Campo dirección registro : 0000011
Formato de la instrucción bsf ESTADO,5 : 0101 101 0000011

Figura 12.2. Formato de las instrucciones que realizan operaciones que manipulan 1 bit. Los 3 bits del
campo b indican la posición que ocupa el bit afectado dentro del registro fuente cuya direc-
ción la expresa el campo f.
MANEJANDO EL REPERTORIO DE INSTRUCCIONES 355

12.2.3. Operaciones que manejan un valor inmediato o literal

El formato correspondiente a este grupo de instrucciones sólo tiene dos campos:


1. Campo del código OP, con 6 bits.
2. Campo del valor inmediato (k), con 8 bits.

EJEMPLO
Se desea cargar en el registro W el valor inmediato 0x33.

a) ¿Qué instrucción se puede emplear?


b) Formato de la instrucción, sabiendo que el código OP de la instrucción movlw
es 1100xx (x: indiferente).

SOLUCIÓN
a) movlw 0x33
b) Campo del Código OP : 1100xx
Campo del inmediato : 00110011

Formato de la instrucción movlw 0x33 : 1100xx 00110011

12.2.4. Operaciones incondicionales de control de flujo del programa


Este tipo de instrucciones afectan al contenido del Contador de Programa (PC) y sirven
para romper la secuencia ordenada de las instrucciones del programa. Las instrucciones
de este grupo tienen un formato con sólo dos campos:
— Campo del código OP, de 3 bits.
— Campo de la dirección del salto que se carga en el PC, de 11 bits.

12.2.5. Operaciones de salto condicional


Los PIC disponen de unas pocas instrucciones «muy efectivas» que cuando se cumple una
condición dan un brinco (skip). Llamamos brinco a un saltito muy pequeño, concretamente
sólo se salta una instrucción, la que hay detrás de la condicional. La condición es el estado
de un bit de un registro o la puesta a 0 de un registro tras un decremento o un incremento.

Figura 12.3. Formato de las instrucciones de salto incondicional tipo CALL y GOTO. El literal (k) es el
valor de la nueva dirección que se carga en el PC.
356 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

La instrucción decfsz f,d responde al grupo de instrucciones que manejan registros


de 1 byte. En este caso, si d = 1, el destino es el propio registro fuente y lo que hace la
instrucción es decrementar el contenido de f y dejar el resultado en f. Pero, además, si el
nuevo valor de f es 0, se produce un brinco. Si no es 0, el flujo de control continúa con
la siguiente instrucción:

El formato de las instrucciones de «brinco» es el mismo que el de las operaciones que


manipulan registros de 1 byte, y se muestra en la Figura 12.4.

EJEMPLO
Indicar el formato de la instrucción condicional que decrementa el registro que ocupa
la dirección 0x04 de la RAM de datos de un PIC16F84A, deposita el resultado en W y
brinca en el caso que dicho resultado valga 0. El campo del código OP correspondiente
a la instrucción decfsz es 001011.

SOLUCIÓN

La instrucción que hay que utilizar es decfsz 0x04,0.

Formato de la instrucción decfsz 0x04,0 : 001011 0 0000100

Figura 12.4. Formato de las instrucciones de brinco condicional que coincide con el de las instrucciones
que manejan registros de 1 byte.

12.3. PRECISIONES SOBRE NOMENCLATURA Y SÍMBOLOS


Hemos tomado la decisión de utilizar la nomenclatura y los símbolos que emplea
Microchip para su lenguaje Ensamblador MPASM. Recordamos los más especí-
ficos:
MANEJANDO EL REPERTORIO DE INSTRUCCIONES 357

SÍMBOLO SIGNIFICADO

0xhh Es la forma que se usa en el lenguaje MPASM para referenciar los números
hexadecimales de dos dígitos (hh).
f Representa la dirección en la memoria RAM de datos del registro fuente.
Tiene un tamaño de 7 bits, con un direccionamiento de 128 posiciones com-
prendidas entre la dirección 0x00 y la 0x7f.
d Es un bit que conforma el campo del formato de una instrucción que indica
el registro destino. Si d = 0, es W, y si d = 1, es f.
k Campo que contiene un valor inmediato que puede ser un operando
(8 bits) o una dirección para el PC (11 bits).
x Valor indeterminado de 1 bit. Puede ser 1 o 0.
() Contenido.
<> Campo de 1 bit de un registro. Por ejemplo: ESTADO <5>.
∈ En el conjunto de ejemplo: d ∈ [0,1].
[] Opciones.

EJEMPLO
Utilizar los símbolos y las abreviaturas usadas en el programa Ensamblador MPASM
para expresar las características de la instrucción que realiza la operación lógica AND
entre el contenido del registro W y el de otro registro f.

SOLUCIÓN
Sintaxis andwf f,d (Si d = 0, el destino es W)
Operandos 0  f  127
d ∈ [0, 1]
Operación (W) and (f) → dest
Si d = 0, dest = W
Si d =1, dest = f
Formato 000101 d fffffff

Palabras que ocupa en la memoria de código :1


Ciclos de instrucción para la ejecución :1

EJEMPLO
Si el contenido del registro W es 0xf0 y el del registro ESTADO es 0x0f, ¿con qué valores
quedan cargados ambos registros tras ejecutar la instrucción andwf ESTADO,1?
358 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

SOLUCIÓN
Como el operando destino es ESTADO (d = 1), quedan:
W = 0xf0
ESTADO = 0x00

12.4. INSTRUCCIONES QUE MANEJAN REGISTROS


Responden a la sintaxis nemónico f,d, siendo f y d los dos operandos fuente y destino que
se hallan implementados por registros de 8 bits de la memoria de datos.
El registro f viene referenciado por la dirección de 7 bits que ocupa, mientras que
el destino sólo por uno, que si vale 0 es el W y si vale 1 es el fuente. En la Tabla 12.1 se
muestran las instrucciones de este grupo con sus características más interesantes.

EJEMPLO
Si se supone que inicialmente valen 0 los registros W y los que ocupan las direcciones
0x01 y 0x02 de la memoria de datos, ¿qué valor contendrán después de ejecutar el
siguiente programa?
incf 0x01,0
incf 0x01,1
comf 0x02,1
iorwf 0x02,0
xorwf 0x01,1

SOLUCIÓN
(W) = 0xff
(0x01) = 0xfe
(0x02) = oxff

EJEMPLO
Existe una instrucción con la que se rota a la derecha, a través del señalizador de
acarreo C, el registro que ocupa la dirección 0x04 de la memoria de datos y deposita el
resultado en W. Se pide:
a) Nemónico.
b) Formato de la instrucción.
c) Si inicialmente C = 1 y (0x04) = 0x00, ¿qué valor se cargará en W?
MANEJANDO EL REPERTORIO DE INSTRUCCIONES 359

SOLUCIÓN
a) rrf 0x04,0.
b) 001100 0 0000100.
c) W = b’10000000’.

INSTRUCCIONES QUE MANEJAN REGISTROS


Sintaxis Operación Ciclos Formato 14 bits Señalizaciones
ADDWF f,d Suma W y f 1 00 0101 dfff ffff C, DC, Z
ANDWF f,d AND W con f 1 00 0111 dfff ffff Z
CLRF f Borra f (pone todos los bits a 0) 1 00 0001 1fff ffff Z
CLRW — Borra W 1 00 0001 0xxx xxxx Z
COMF f,d Complementa f (invierte) 1 00 1001 dfff ffff Z
DECF f,d Decrementa f 1 00 0011 dfff ffff Z
INCF f,d Incrementa f 1 00 1010 dfff ffff Z
IORWF f,d Or entre W y f 1 00 0100 dfff ffff Z
MOVF f,d Mueve f 1 00 1000 dfff ffff Z
MOVWF f Incrementa W y f 1 00 0000 1fff ffff —
NOP — No opera 1 00 0000 0xx0 0000 —
RLF f,d Rota f a la izqda. a través del acarreo 1 00 1101 dfff ffff C
RRF f,d Rota f a la dcha. a través del acarreo 1 00 1100 dfff ffff C
SUBWF f,d Resta W a f 1 00 0010 dfff ffff C, DC, Z
SWAPF f,d Intercambia nibbles 1 00 1110 dfff ffff —
XORWF f,d XOR de W con f 1 00 0110 dfff ffff Z

Tabla 12.1. Principales características de las instrucciones de los PIC16X8X que manejan como ope-
randos registros de 8 bits. Se han excluido las de salto condicional, que tienen el mismo
formato.

EJEMPLO
Si el registro ESTADO contiene el valor 0xf5 y se ejecuta la instrucción swap ESTADO,0,
¿qué valor contendrán ESTADO y W?

SOLUCIÓN
La instrucción swap intercambia los nibbles entre sí. En un registro de 8 bits, un nibble
corresponde a los 4 bits de más peso y el otro a los de menos peso.
(f < 3:0>) → (dest<7:4>)
(f < 7:4>) → (dest<3:0>)
360 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Como el registro es el W, quedarán cargados:


ESTADO : 0xf5
W :0x5f

12.5. INSTRUCCIONES QUE MANEJAN BITS


Sólo hay dos instrucciones en este grupo, pero son muy flexibles. Una de ellas pone a 1
(bsf) cualquier bit de un registro, mientras que la otra lo pone a 0 (bcf) (véase Tabla 12.2).

En el formato de las instrucciones que manejan bits se representa con 3 bits la posición
que ocupa en el registro el bit b. El registro se especifica mediante su dirección de 7 bits.

INSTRUCCIONES QUE MANEJAN BITS


Sintaxis Operación Ciclos Formato 14 bits Señalizaciones
BCF f,b Borra bit de f 1 00 00bb bfff ffff —
BSF f,b Pone a 1 el bit f 1 01 01bb bfff ffff —

Tabla 12.2. Características más importantes de las dos instrucciones que manejan un bit determinado
de un registro.

EJEMPLO
Si inicialmente el registro W = 0xff y el registro OPTION = 0x00, ¿con qué valores
quedarán cargados tras ejecutar el siguiente programa?
bsf OPTION,2
comf OPTION,0
swap OPTION,1

SOLUCIÓN

W = b’1111 1011’
OPTION = b’0100 0000’

EJEMPLO
Hallar el formato de la instrucción bsf 0x08,3.
MANEJANDO EL REPERTORIO DE INSTRUCCIONES 361

SOLUCIÓN
Formato de la instrucción bsf 0x08,3 : 0101 011 0001000

12.6. INSTRUCCIONES DE BRINCO («SKIP»)


Sólo hay cuatro instrucciones de salto condicional en los PIC de la gama media. Dos
de ellas testan un bit de un registro y según valga 1 o 0, brincan o no. Recuérdese
que un brinco es un «saltito» pequeño, sólo se salta la instrucción siguiente a la
condicional. Las otras dos instrucciones incrementan o decrementan un registro y la
posibilidad del brinco se efectúa si con esa operación el valor del registro ha llegado
a 0. Cuando estas instrucciones no brincan porque no se cumple la condición, tardan
un ciclo de instrucción en ejecutarse. En caso de que brinquen, tardan el doble (véase
Tabla 12.3).

INSTRUCCIONES DE «BRINCO»
Sintaxis Operación Ciclos Formato 14 bits Señalizaciones
BTFSC f,d Explora un bit de f y brinca si vale 0 1 (2) 01 10bb bfff ffff —
BTFSS f,d Explora un bit de f y brinca si vale 1 1 (2) 01 11bb bfff ffff —
DECFSZ f,d Decrementa f, y si es 0, brinca 1 (2) 00 1011 bfff ffff —
INCFSZ f,d Decrementa f, y si es 1, brinca 1 (2) 00 1111 bffff ffff —

Tabla 12.3. Características más relevantes de las cuatro instrucciones condicionales de brinco.

EJEMPLO
Se trata de averiguar el valor del bit 4 del registro ESTADO. Si vale 1, se borra o se pone
a 0 el registro W, y si dicho bit vale 0, se pone a 1 ese bit.

SOLUCIÓN
btfss ESTADO,4 ; Si ESTADO<4> = 1, hay brinco
bsf ESTADO,4 ; Como ESTADO<4> = 0, se pone a 1
clrw ; Como ESTADO<4> = 1, se borra W

EJEMPLO
Decrementar el contenido del registro FSR hasta que valga 0 y entonces borrar W.
362 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

SOLUCIÓN
bucle decfsz FSR,1
goto bucle
clrw

12.7. INSTRUCCIONES QUE MANEJAN OPERANDOS INMEDIATOS


Se trata de media docena de instrucciones que realizan una operación con un valor
inmediato de 8 bits que se proporciona dentro del formato de la instrucción, el cual
sólo tiene dos campos: el del código OP (6 bits) y el del operando inmediato (8 bits)
(Tabla 12.4).

EJEMPLO
Indicar el valor del registro W después de ejecutar el siguiente programa:

clrw
movwf OPTION
bsf OPTION,5
comf OPTION,1
btfsc OPTION,1
swap OPTION,0

SOLUCIÓN

(W) = b’1111 1101’

INSTRUCCIONES QUE MANEJAN OPERANDOS INMEDIATOS

Sintaxis Operación Ciclos Formato 14 bits Señalizaciones

ADDLW k Suma inmediata con W 1 11 111x kkkk kkkk C, DC, Z

ANDLW k AND inmediato con W 1 11 1001 kkkk kkkk Z

IORLW k OR inmediato con W 1 11 1000 kkkk kkkk Z

MOVLW k Mueve a W un valor inmediato 1 11 00xx kkkk kkkk —

SUBLW k Resta inmediata con W 1 11 110x kkkk kkkk C, DC, Z

XORLW k OR exclusiva con W 1 11 1010 kkkk kkkk Z

Tabla 12.4. Características más importantes de las instrucciones que manejan operandos inmediatos (k).
MANEJANDO EL REPERTORIO DE INSTRUCCIONES 363

EJEMPLO

Averiguar el contenido de W después de ejecutar el siguiente programa:


clrw
addlw 0x55
andlw 0xff
iorlw 0x0f
xorlw 0xaf

SOLUCIÓN
(W) = 0xf0

12.8. INSTRUCCIONES DE CONTROL Y ESPECIALES


En este grupo se incluyen las instrucciones que rompen la secuencia normal del progra-
ma porque alteran el contenido del PC y también las instrucciones especiales.
La instrucción de salto incondicional goto carga en el PC la dirección de la nueva
instrucción. La instrucción call de llamada a subrutina, antes de cargar el PC con la
dirección de la instrucción a saltar, salva la dirección de partida guardando en la cima de
la Pila el valor actual del PC. De esta manera, al retornar de la subrutina, se saca de la
Pila la dirección de regreso en el programa principal.
Para realizar un retorno de una subrutina se pueden emplear dos instrucciones. La
más habitual es return, que se limita a extraer de la cima de la Pila el valor que carga
en el PC. Otra más compleja es retlw k, que, además de hacer lo mismo que return,
carga en W el valor inmediato k que contiene. Es decir, devuelve un parámetro desde la
subrutina.
Para el final de las interrupciones hay otra instrucción cuyo nemónico es retfie.
La operatividad de esta instrucción consiste en cargar en el PC el contenido de la cima
de la Pila y poner el bit GIE = 1, pues al comenzar la interrupción este bit se pone
automáticamente a 0 para evitar que cuando se atiende una interrupción se produzca
otra. GIE es el bit de permiso de todas las interrupciones.
En cuanto a las instrucciones especiales, se han incluido dos en este grupo: clrwdt
y sleep. La primera pone a 0 el contenido del Perro Guardián, es decir, lo refresca o lo
reinicializa. El Perro Guardián si se desborda (pasa de 0xff a 0x00) provoca un reset. La
instrucción clrwdt hay que colocarla estratégicamente en ciertos puntos del programa
para evitar la reinicialización.
La instrucción sleep introduce al procesador en un modo de funcionamiento que
se llama de reposo o de bajo consumo. Detiene el oscilador y el procesador queda
congelado, no ejecutando instrucciones y manteniendo el mismo valor las Puertas de
E/S. También pone los bits PD# = 0 y TO# = 1 y borra al Perro Guardián y al Divisor de
frecuencia (Tabla 12.5).
364 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

INSTRUCCIONES DE CONTROL Y ESPECIALES


Sintaxis Operación Ciclos Formato 14 bits Señalizaciones
CALL k Llamada a subrutina 2 10 0kkk kkkk kkkk TO#, PD#
CLRWDT Borra o refresca el Perro Guardián 1 00 0000 0110 0100 —
GOTO k Salto incondicional 2 10 1kkk kkkk kkkk —
RETFIE Retorno de interrupción (GIE = 1) 2 00 0000 0000 (00) —
RETLW k Retorno de subrutina y carga W = k 2 11 01xx kkkk kkkk —
RETURN Retorno de subrutina 2 00 0000 0000 1000 —
SLEEP Pasa al modo de reposo 1 00 0000 0110 0011 TOP#, PD#

Tabla 12.5. Principales características de las instrucciones de control del flujo del programa y de las
especiales.

EJEMPLO
Si un PIC16F84A funciona con un cristal de 4 MHz y el Perro Guardián está programado
para que se desborde cada 18 ms, calcular cada cuántas instrucciones como máximo
deberá refrescarse el Perro con la instrucción clrwdt.

SOLUCIÓN
TOSC = 1/4 · 106 = 250 ns
Ciclo instrucción = 4 · TOSC = 1.000 ns = 1 µs
18 ms = 18.000 µs
Luego habrá que incluir una instrucción clrwdt cada 18.000 normales como
máximo. Las instrucciones de salto cuentan el doble.

EJEMPLO

Explicar las diferencias entre las tres instrucciones de «retorno».

SOLUCIÓN
— return: Retorna de una subrutina al programa principal. Carga al PC con el
contenido de la cima de la Pila.
— retlw k: Hace lo mismo que return y, además, carga en W el literal k.
— retfie: Carga al PC con el contenido de la cima de la Pila y pone GIE = 1.
MANEJANDO EL REPERTORIO DE INSTRUCCIONES 365

En la Tabla 12.6 se presentan las principales características de las 35 instrucciones


de los PIC de la gama media, agrupadas por funciones, tal como se han descrito.

INSTRUCCIONES QUE MANEJAN REGISTROS

Sintaxis Operación Ciclos Formato 14 bits Señalizaciones

ADDWF f,d Suma W y f 1 100 0111 dfff ffff C, DC, Z


ANDWF f,d AND W con f 1 00 0101 dffff ffff Z
CLRF f Borra f (Pone todos los bits a 0) 1 00 0001 1fff ffff Z
CLRW — Borra W 1 00 0001 0xxx xxxx Z
COMF f,d Complementa f (Invierte) 1 00 1001 dfff ffff Z
DECF f,d Decrementa f 1 00 0011 dfff ffff Z
INCF f,d Incrementa f 1 00 1010 dfff ffff Z
IORWF f,d OR entre W y f 1 00 0100 dfff ffff Z
MOVF f,d Mueve f 1 00 1000 dfff ffff Z
MOVWF f Mueve W y f 1 00 0000 1fff ffff —
NOP — No opera 1 00 0000 0xx0 0000 —
RLF f,d Rota f a la izqda. a través del acarreo 1 00 1101 dfff ffff C
RRF f,d Rota f a la dcha. a través del acarreo 1 00 1100 dfff ffff C
SUBWF f,d Resta W a f 1 00 0010 dfff ffff C, DC, Z
SWAPF f,d Intercambia nibbles 1 00 1110 dfff ffff —
XORWF f,d XOR de W con f 1 00 0110 dfff ffff Z

INSTRUCCIONES QUE MANEJAN BITS

BCF f,b Borra bit de f 1 01 00bb bfff ffff —


BSF f,b Pone a 1 el bit f 1 01 01bb bffff ffff —

INSTRUCCIONES DE «BRINCO»

BTFSC f,d Explora un bit de f y brinca si vale 0 1(2) 01 10bb bfff ffff —
BTFSS f,d Explora un bit de f y brinca si vale 1 1(2) 01 11bb bfff ffff —
DECFZF f,d Decrementa f, y si es 0, brinca 1(2) 00 1011 dfff ffff —
INCFSZ f,d Incrementa f, y si es 1, brinca 1(2) 00 1111 dfff ffff —

INSTRUCCIONES QUE MANEJAN OPERANDOS INMEDIATOS

ADDLW k Suma inmediata con W 1 11 111x kkkk kkkk C, DC, Z


ANDLW k AND inmediato con W 1 11 1001 kkkk kkkk Z
IORLW k OR inmediato con W 1 11 1000 kkkk kkkk Z
MOVLW k Mueve a W un valor inmediato 1 11 00xx kkkk kkkk —
SUBLW k Resta W de un inmediato 1 11 110x kkkk kkkk C, DC, Z
XORLW K OR exclusiva con W 1 11 1010 kkkk kkkk Z
366 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

INSTRUCCIONES DE CONTROL Y ESPECIALES

Sintaxis Operación Ciclos Formato 14 bits Señalizaciones

CALL k Llamada a subrutina 2 10 0kkk kkkk kkkk TO#, PD#


CLRWDT Borra o refresca el Perro Guardián 1 00 0000 0110 0100 —
GOTO k Salto incondicional 2 10 1kkk kkkk kkkk —
RETFIE Retorno de Interrupción (GIE = 1) 2 00 0000 0000 (00) —
RETLW k Retorno subrutina y carga W = k 2 11 01xx kkkk kkkk —
RETURN Retorno de subrutina 2 00 0000 0000 01000 —
SLEEP Pasa al modo de reposo 1 00 0000 0110 0011 TOP#, PD#

Tabla 12.6. Principales características de las 35 instrucciones de los PIC de la gama media, agrupadas
según su función y en orden alfabético.
CAPÍTULO
Herramientas
y diseño de proyectos
13

13.1. FASES DE DISEÑO

En el despertar del siglo XXI asistimos a una impresionante carrera mundial por incorpo-
rar microcontroladores a los productos de mayor consumo para mejorar la imagen, las
prestaciones, el tamaño, el consumo y el precio.
Cada nuevo diseño nace con una idea y termina con el prototipo que la implementa.
Durante ese proceso suceden ordenadamente una serie de etapas que hay que cubrir para
llegar a un final feliz. En el desarrollo de cada fase se utiliza un conjunto de herramientas
hardware y software que, según su potencia, reducen más o menos el tiempo que se consume
en completarla. Pero aunque sean muy valiosas dichas herramientas, no hay que olvidar que, al
igual que pasa con la mayoría de las cosas en nuestro mundo, hay dos pilares fundamentales:

— La idea. Sólo la imaginación del diseñador pone límites a un proyecto.


— El tiempo. La voracidad del mercado es tan agobiante que cuando nos piden hoy un
proyecto nos exigen que lo hayamos entregado ayer.

Con este panorama de trabajo se deben manejar excelentes herramientas que sean
capaces de mejorar la idea inicial en el mínimo tiempo. Hasta hace poco, únicamente
las grandes empresas podían soportar los grandes desembolsos económicos que
exigía la adquisición de esas herramientas. Actualmente, los fabricantes de chips se
van dando cuenta que para venderlos por cientos de millones de unidades tienen que
facilitar y popularizar su empleo y poner a disposición de los usuarios los medios
que necesitan.
Microchip se ha esforzado siempre en considerar las posibilidades de los
profesionales particulares y puede ser que ésta haya sido la razón de haber escalado
puestos en el ranking mundial de venta de microcontroladores durante la década de
los noventa y ocupar uno de los puestos de cabeza. La disponibilidad de herramientas
eficaces y económicas justifica la espectacular aceptación de los PIC. Cualquier
aficionado, estudiante, diseñador particular o pequeña empresa puede adquirir
el instrumental requerido para el desarrollo de proyectos con PIC y cientos de

367
368 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

empresas de todo el mundo compiten por mejorar, ampliar y abaratar todo tipo de
herramientas.
Para analizar las prestaciones y funciones que deben soportar las herramientas de
desarrollo, se presentan las fases típicas de un proyecto basado en un microcontrolador
y que se muestran gráficamente en el organigrama de la Figura 13.1. Se ha supuesto que

Figura 13.1. Organigrama que representa las sucesivas fases del diseño de un proyecto basado en micro-
controlador en el caso de no disponer de «emulador en circuito».
HERRAMIENTAS Y DISEÑO DE PROYECTOS 369

Función Trabajo a realizar Herramienta necesaria


1. a
LA IDEA PENSAR LA CABEZA
2.a EDICIÓN PROGRAMA FUENTE EDITAR EL PROGRAMA EDITOR
3.a ENSAMBLAR O COMPILAR Traducir el programa en lenguaje ENSAMBLADOR O
fuente a código binario ejecutable COMPILADOR
4.a SIMULACIÓN DEL SOFTWARE Simular comportamiento del pro- SIMULADOR SOFTWARE
grama
5.a DEPURACIÓN Corregir los defectos del programa TODAS LAS ANTERIORES
6. a
GRABACIÓN DEL MICROCON- Grabar el programa depurado en GRABADOR
TROLADOR la memoria de instrucciones del
microcontrolador
7.a SIMULAR EL HARDWARE Y EL Conectar al microcontrolador gra- SISTEMA DE DESARROLLO
SOFTWARE EN TIEMPO REAL bado los periféricos fundamenta-
les y analizar su comportamiento
8.a DEPURACIÓN Corregir errores en el programa y LAS ANTERIORES
el hardware
9.a MONTAJE DEL PROTOTIPO Construir un prototipo completo PLACA DE PROTOTIPOS
con el microcontrolador grabado
y todos sus periféricos
10.a DEPURACIÓN Corregir errores hardware y soft- TODAS LAS ANTERIORES
ware en el prototipo
11.a PRODUCTO FINAL MONTAJE DEFINITIVO EL SOLDADOR

Figura 13.2. Tabla que muestra algunas características de cada fase de un proyecto y las herramientas
que se utilizan.

no se dispone de una herramienta muy potente y cara llamada «emulador en circuito» y


que se comenta más adelante.
Tanto el organigrama de la Figura 13.1 como la tabla de la Figura 13.2 se han hecho
pensando en aficionados y profesionales particulares que no dispongan de la herramienta
de trabajo por excelencia, el «emulador en circuito», cuyo coste suele ser superior a los
mil dólares. No obstante, con las herramientas que se proponen se pueden alcanzar las
mismas metas de manera más artesanal y con igual precisión y eficacia.
La Figura 13.2 contiene una tabla que describe las características fundamentales de cada
fase de un diseño con microcontrolador cuando no se dispone de un «emulador en circuito».

13.2. HERRAMIENTAS ACCESIBLES


Se describen modelos comerciales de las herramientas hardware y software empleadas
en los diseños «humildes» que pueden adquirir muchas personas a nivel particular.

13.2.1. La cabeza
Es una herramienta que tenemos todos, pero es la más importante. Con ella se puede obtener la
clave del éxito, que es la idea, y también puede suplir carencias y dificultades que se presentan
en todos los diseños. Se usa en todas las fases y de su rendimiento depende todo el trabajo.
370 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Cuide bien su cabeza, porque con sólo una buena idea que le proporcione puede ser
suficiente.

13.2.2. Editor de textos


Concebida la estructura básica de la aplicación, se puede atacar el desarrollo del soft-
ware y del hardware. Con un equipo de especialistas, estas dos partes se atacarían en
paralelo; pero si el equipo es usted, como pasa a menudo, no se preocupe. No tendrá que
compartir éxitos y fracasos.
Le recomendamos que si está solo comience confeccionando el software. Tendrá
que escribir el programa de control de la tarea, para lo cual precisará de un editor de
textos que trabaje con caracteres ASCII. Le recomendamos usar el entorno MPLAB de
Microchip, que contiene todas las herramientas software y lo puede recoger libremente
en Internet o en el CD de este libro.

13.2.3. Ensamblador o compilador


En el editor tiene que ir tecleando el programa usando las instrucciones del lenguaje que
elija. Así creará el programa fuente. Dicho programa hay que traducirlo a código binario
o código máquina para cargarlo en la memoria de instrucciones del microcontrolador y
así poder ejecutarlo el procesador. A este programa ejecutable por el microcontrolador
se le llama programa objeto.
En los diversos ejercicios que vamos presentando en todos los capítulos del libro
hemos tratado de resolverlos con lenguaje Ensamblador y con C para comparar los
resultados. También hay lenguajes muy fáciles, como el BASIC, que podría utilizar si
no es un experto en informática. El lenguaje que le recomendamos es el Ensamblador;
con él obtendrá el mínimo código y así necesitará menos capacidad de memoria y menos
tiempo para su ejecución. Pero usted es libre.

Microchip ha creado un lenguaje y el correspondiente programa traductor MPASM, que es


el que hemos utilizado en este libro y que está integrado en el entorno MPLAB.

También para los PIC la empresa Microchip dispone del programa Ensamblador
MPASM, cuyos nemónicos son similares a los utilizados por Intel.
Si trabaja con un lenguaje de alto nivel, como el C, tiene varias opciones de adquirir un
compilador que lo traduzca a código máquina. Un compilador más barato y muy eficaz es el de
la empresa CCS, que distribuye en España Ingeniería de Microsistemas Programados, S. L.
En Estados Unidos hay bastantes empresas que ofrecen compiladores e intérpretes del
lenguaje BASIC, entre las que se distinguen Parallax, microEngineering Labs y Versa Tech.

13.2.4. Simulador «software»


Es un programa que reproduce por software el comportamiento del microcontrolador en
la ejecución de un programa, presentando en la pantalla del PC el estado de todos los
registros y recursos. No funciona en tiempo real al estar implementada la simulación con
software. Tampoco puede adaptarse con periféricos externos.
HERRAMIENTAS Y DISEÑO DE PROYECTOS 371

Figura 13.3. Pantalla principal del simulador SIMUPIC’84. Se trata de un excelente, didáctico y econó-
mico simulador software para los PIC16X84.

Su empleo no exige ningún hardware y es muy práctico en la primera fase


de depuración del programa. Elimina muchos errores que agilizan el desarrollo
posterior.
Los simuladores software no están recomendados en aplicaciones en las que el
tiempo sea un parámetro estricto y determinante, así como en aquellos que tengan mucha
dependencia con el mundo exterior.
Microchip tiene el simulador MPSIM para los PIC y en el CD de este libro está
incluido dentro del entorno MPLAB. En la Figura 13.3 se muestra una pantalla del
simulador SIMUPIC’84, en la que puede apreciarse que el menú principal dispone de
todas las fases para la confección del software.

13.2.5. El grabador
El programa objeto, o sea, en código máquina ejecutable, hay que escribirlo en la me-
moria de instrucciones del microcontrolador. Para realizar esta operación se necesita un
«grabador».
Un grabador consiste en una tarjeta electrónica que soporta varios zócalos con
diferente número de patitas en los que se introducen diversos tipos de microcontroladores.
Dispone de circuitos auxiliares y de estabilización de la alimentación. La grabación se
controla mediante un programa de comunicación desde un PC que se adapta al grabador
por el puerto paralelo.
El grabador Micro’PIC Programmer es un buen exponente de este tipo de
herramientas y es capaz de grabar todos los PIC de la gama media de dieciocho,
veintiocho y cuarenta patitas (Fig. 13.4).
372 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 13.4. Fotografía del grabador Micro’PIC Programmer, diseñado por Ingeniería de Microsistemas
Programados, S. L.

13.2.6. Sistema de desarrollo


Es una herramienta completa muy práctica y económica que sustituye de alguna forma la
carencia del emulador en circuito. Consiste en una tarjeta de circuito impreso controlada
por el puerto paralelo de un PC y que aloja un grabador de microcontroladores, circuito
estabilizador de tensiones de alimentación y gran parte de los periféricos más usados en

Figura 13.5. Fotografía del sistema de desarrollo Micro’PIC Trainer.


HERRAMIENTAS Y DISEÑO DE PROYECTOS 373

las aplicaciones con microcontroladores. Su idea de aplicación es grabar inicialmente


el programa en la memoria del microcontrolador y después conectarle los periféricos
disponibles para ejecutar el programa en tiempo real y con total exactitud. Los errores
hardware y software pueden resolverse sobre la misma tarjeta y volver a ejecutar el pro-
grama hasta su correcto funcionamiento.
Con un precio muy atractivo, el Micro’PIC Trainer contiene todo lo necesario para
desarrollar un proyecto con un PIC de la gama media de dieciocho o veintiocho patitas.
Posee un grabador de PIC que, en caso de ser tipo PIC14X84, también es borrador,
un circuito de estabilización de las tensiones utilizadas y un conjunto de periféricos
(interruptores, pulsadores, potenciómetros, leds, display de siete segmentos y pantalla
LCD) con los que se puede editar, depurar, ensamblar, grabar, comprobar el funcionamiento
real, borrar y repetir el proceso hasta tener a punto el proyecto (véase Figura 13.5). En este
libro se utiliza preferentemente el sistema de desarrollo PIC School, que es el más potente
y flexible del mercado.

13.2.7. Tarjeta de prototipos


Consiste en una placa de circuito impreso donde viene montado el zócalo del microcon-
trolador, la circuitería auxiliar y la estabilización de la alimentación. Además, dispone de
una zona agujereada para soportar y conectar los periféricos específicos de la aplicación.
Insertando el microcontrolador con el programa grabado en su zócalo queda completado
el prototipo definitivo.

Figura 13.6. Fotografía de la tarjeta de prototipos PIC18-ME sobre un pupitre de metacrilato que sopor-
ta al Micro’PIC Trainer y un transformador de alimentación.
374 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Confeccionado y depurado el programa, grabado el microcontrolador y comprobado


el comportamiento real de gran parte del software mediante los periféricos del sistema
de desarrollo, se pasa al montaje del prototipo. Una parte de la circuitería del prototipo
siempre es igual, porque es la que corresponde a la alimentación y la auxiliar que acompaña
al microcontrolador (cristal y reset). Lo que cambian son los periféricos a controlar y que
se conectan con las patitas de E/S. Para ellos se destina el área agujereada.
En la Figura 13.6 se muestra una fotografía de la tarjeta de prototipos PIC18-ME,
de Ingeniería de Microsistemas Programados, S. L., que es la que hemos usado en
la implementación de los ejercicios presentados en el Apéndice F de este libro. Está
montada sobre un pupitre de metacrilato que también contiene el Micro’PIC Trainer y un
transformador de alimentación, configurando una utilísima herramienta de laboratorio.

13.3. EMULADOR EN CIRCUITO


Es una herramienta cara, pero muy potente, que permite realizar un seguimiento com-
pleto y rápido de todas las fases de un proyecto. Con ella se reproduce el comporta-
miento del microcontrolador, pero ahora al emplearse hardware y software se consigue
una similitud total de las funciones. Se trabaja en tiempo real y se pueden conectar los
periféricos externos a controlar para analizar los resultados de forma idéntica a la que
se produciría si fuese el microcontrolador emulado el que estuviese ejecutando el pro-
grama de la aplicación.

El emulador en circuito es un equipo electrónico controlado mediante un programa desde un


PC y del que sale una sonda que reemplaza al microcontrolador en la tarjeta de prototipos. Las
ayudas que ofrece al diseñador son excelentes al integrar todos los programas que se preci-
san, permitiendo una depuración potente del hardware y del software asociados al proyecto.

En la Figura 13.7 se muestra la fotografía del emulador en tiempo real ICEPIC-


Jnr-5X, de la empresa R. F. Solutions, que es capaz de emular a los PIC12C5XX y
PIC16C5X hasta una frecuencia de 20 MHz. La Figura 13.8 presenta una pantalla de
trabajo de dicho emulador en la que se recoge una amplia y valiosa información para la
depuración del proyecto.

13.4. INTRODUCCIÓN AL DISEÑO DE PROYECTOS:


PUESTA EN HORA
Presentamos algunos proyectos que hemos considerado suficientes para abrir la mente y
estimular la voluntad para que cualquier persona se decida a construir el primero.
Para poner de relieve algunas características de los diseños, comenzamos poniendo
en hora un reloj digital.
Aplicaciones derivadas del control del tiempo hay muchísimas y en la Figura 13.9
se muestra la fotografía de un interesante kit comercial de la empresa CEBEK que es
un temporizador digital para monederos de máquinas que funcionan por tiempo. Cada
moneda que se introduce añade cierto tiempo de funcionamiento de la máquina. Seguro
que conoce y ha manejado muchos de estos «sacacuartos».
Las entradas del monedero de la Figura 13.9 son dos pulsadores. Uno simula las mo-
nedas que se introducen y el otro es la puesta en marcha. Cada nueva moneda supone un
HERRAMIENTAS Y DISEÑO DE PROYECTOS 375

Figura 13.7. Fotografía del hardware, software y documentación que componen el emulador en circuito
ICEPIC-Jnr-5X, de R. F. Solutions.

Figura 13.8. Pantalla de trabajo del emulador ICEPIC-Jnr.


376 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 13.9. Fotografía de un temporizador digital para máquinas que funcionan con monedas, construi-
do con un PIC16C55 y comercializado por CEBEK.

incremento del tiempo de funcionamiento cuyo valor se selecciona con cuatro microinte-
rruptores. Hay dos periféricos de salida: uno consiste en un visualizador de tres dígitos que
puede presentar hasta un tiempo máximo de 999 minutos y el otro es un relé que se activa
cuando se presiona el pulsador de puesta en marcha y se desactiva cuando el tiempo llega
a cero. Regula el funcionamiento y la parada de la máquina. Existe una EEPROM externa
de datos para guardar el tiempo que queda útil si se desconecta la alimentación.
En la Figura 13.10 se ofrece el esquema de un reloj digital gobernado por un
PIC16C55. Las cuatro líneas de la Puerta A regulan los transistores de activación de
los displays de siete segmentos. Las líneas RB0, RB1 y RB2 se hallan conectadas a tres
pulsadores para el ajuste de horas, minutos y segundos. También RB1 y RB2, junto con
las cinco líneas de más peso de la Puerta B, excitan a los segmentos de los displays.
Para que aprecie las ventajas de usar una tarjeta de prototipos, hemos montado el
reloj digital sobre una placa de propósito general, que se muestra en la Figura 13.11.
El enorme tiempo que se malgasta en situar y conectar los componentes, los posibles
errores de montaje, el coste similar de ambas tarjetas y la mediocre presentación del
prototipo no hacen recomendable utilizar este procedimiento.
Usando la tarjeta de prototipos PIC18-ME se reducen al mínimo el tiempo y los
fallos del montaje. Las patitas de E/S del PIC están perfectamente señalizadas y accesi-
bles, haciendo inmediata la conexión de los periféricos. El coste de la tarjeta PIC18-ME
es similar a la de una de propósito general del mismo acabado. Finalmente, la presenta-
ción tiene una imagen más profesional y el riesgo de averías es nulo (Fig. 13.12).
HERRAMIENTAS Y DISEÑO DE PROYECTOS 377

Figura 13.10. Esquema electrónico de un reloj digital basado en un PIC16C54.

Otra ventaja de las tarjetas de prototipo es que pueden usarse para muchos diseños,
ya que finalizado uno de ellos pueden desoldarse los componentes. Con este fin es reco-
mendable montar los periféricos con rapinado.
En este proyecto, el módulo principal consiste en conseguir un tiempo patrón de un segun-
do que vaya incrementando el contador de segundos. Al alcanzar el valor de sesenta, se pondrá
a cero el contador de segundos y se incrementará el de minutos. El de minutos pasará a cero al
llegar a sesenta e incrementará las horas, y éstas pasarán a cero al llegar a veinticuatro.

Figura 13.11. Montaje del reloj digital sobre una tarjeta de circuito impreso de propósito general. Tiem-
po, coste, fallos y presentación hacen que este procedimiento sea poco interesante.
378 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 13.12. Fotografía del reloj digital montado sobre una tarjeta de prototipos PIC18-ME.

13.5. UN DADO ELECTRÓNICO


Se describe la construcción de un dado electrónico que simula las seis caras de los reales y
que también puede «tirarse» para sacar un número aleatorio del 0 al 6. Para la interpretación
electrónica usaremos un display de siete segmentos sobre el que se visualizará el número de
cada tirada y también un pulsador que indique el momento de la tirada. En la Figura 13.13 se
muestra la fotografía de un kit comercial basado en el PIC16C54 que implementa esta apli-
cación sobre una cajita de baquelita que contiene la pila de 9 V que precisa su alimentación.

Figura 13.13. Fotografía del dado electrónico comercializado en kit (DIY KIT69). El display de siete
segmentos y el pulsador de tirada se controlan con un PIC16C54.
HERRAMIENTAS Y DISEÑO DE PROYECTOS 379

Figura 13.14. Conexión del PIC a los periféricos que configuran el dado.

La Puerta B del PIC, que en la fase de diseño y en la comprobación en el Micro’PIC


Trainer puede ser un PIC16X84, se configura como salida y sus líneas se aplican a los
segmentos del display, como se refleja en la Figura 13.14. La línea de menos peso de la
Puerta A recibe el nivel lógico del pulsador de tirada.
En la Figura 13.15 se presenta el organigrama resumido para el programa del dado.

Figura 13.15. Organigrama general para el programa del dado electrónico. Cuando el pulsador no está
activado (RA0 = 1), se van iluminando sucesivamente los segmentos del display para dar
cierta vistosidad al juego.
380 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 13.16. Fotografía del dado electrónico montado sobre una tarjeta de prototipos PIC18-ME.

En la Figura 13.16 se ofrece una fotografía de la implementación especial del dato


sobre una tarjeta de prototipos PIC18-ME. Lo más llamativo es la sustitución del display
de siete segmentos por un presentador que simula al display a base de numerosos leds.
El programa lo encontrará en el CD.
En los juegos de azar hay jugadores de ventaja que hacen trampas. Una podría con-
sistir en modificar el programa para que cada cierto número de veces salga un número
dado o incluso para generar una secuencia de números preestablecida. Usted no debe
emplear sus conocimientos para lucrarse de forma poco honesta.
Hay infinidad de juegos que están esperando su aportación para que se jueguen más,
sean más atractivos y hagan disfrutar más a la gente. Las quinielas, la lotería primitiva,
la bonoloto, las damas, la oca, el mus y el ajedrez le necesitan. Ayúdelos; además de
entretenerse, puede entretener a los demás y de paso ganar algún premio por su trabajo.

13.6. SEMÁFORO REGULABLE


Este sencillo proyecto nos va a permitir manejar tiempo y usar la memoria de datos
EEPROM. Se trata de un semáforo corriente con tres luces (roja, verde y ámbar) que
están simuladas por tres diodos led de dichos colores. La luz ámbar se enciende duran-
te un segundo en la transición de las otras dos (véase Figura 13.17).
Mediante tres pulsadores, conectados a las tres líneas de menos peso de la Puerta A,
se regula el tiempo que estarán encendidas las luces roja y verde.
HERRAMIENTAS Y DISEÑO DE PROYECTOS 381

Figura 13.17. Fotografía de una tarjeta PIC18-ME sobre la que se han montado todos los periféricos
que conlleva el semáforo.

— Interruptor RA0: Cuando introduce un nivel lógico alto, el sistema funciona en


modo AJUSTE y se pueden modificar los tiempos de las luces. Si introduce un
nivel bajo, funciona en modo NORMAL.
— Interruptor RA1: Con nivel alto regula el tiempo de la luz roja y con nivel bajo
el de la verde.
— Interruptor RA2: Con nivel alto incrementa el tiempo de la luz seleccionada y
con nivel bajo se decrementa.

Las ocho líneas de la Puerta B se conectan a ocho diodos led integrados en una barra
que tienen la misión de visualizar el número de segundos, de 1 a 8, que está encendida
la luz bajo prueba (Fig. 13.18).
La duración establecida para el encendido de las luces roja y verde se registra en
posiciones de la memoria de datos EEPROM para no realizar una nueva reprogramación
cuando se desconecta la alimentación.

13.7. PRESENTADOR DE MENSAJES


Es un buen ejercicio para experimentar el manejo de pantallas LCD, que en este proyec-
to se usan para visualizar diversos mensajes previamente grabados. Concretamente, se
pueden visualizar hasta ocho mensajes diferentes de acuerdo con el código binario que
introduzcan tres interruptores, conectados a las tres líneas de menos peso de la Puerta A.
La Figura 13.19 muestra el aspecto de esta aplicación montada sobre una tarjeta de pro-
totipos PIC18-ME y la Figura 13.20 el esquema de conexionado.
El programa de esta aplicación, debidamente comentado, se halla en el CD, donde
también podrá encontrar el programa HOLA, que contiene las principales rutinas básicas
que se necesitan para manejar la pantalla LCD.
382 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 13.18. Esquema de un conexionado de un PIC16C84 con los periféricos que implementa el semáforo.

Figura 13.19. Fotografía del presentador de mensajes implementado sobre una tarjeta PIC18-ME.
HERRAMIENTAS Y DISEÑO DE PROYECTOS 383

Figura 13.20. Esquema de conexionado del presentador de mensajes.


384 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

13.8. CLAVE DE ACCESO


Como último proyecto se describe una aplicación que emplea a los dos periféricos más
clásicos en el control de los microcontroladores: teclado y pantalla LCD.
Para controlar el acceso a un recinto se debe pulsar sobre el teclado la tecla A segui-
da de otras cuatro con diferentes dígitos, que constituyen la clave. Si la clave es correcta,
se activa durante un segundo un relé, conectado a la línea RA4, que abre la puerta.
Se dan tres oportunidades para introducir la clave correcta. Además, se utiliza un
zumbador piezoeléctrico que genera un sonido beep tras la pulsación de cada tecla.
Con la tecla C se puede cambiar la clave y la pantalla LCD genera una serie de men-
sajes durante la operación. La clave queda registrada en la memoria EEPROM de datos
de forma permanente.
La Figura 13.21 muestra la disposición de los periféricos sobre la tarjeta PIC18-ME
y la Figura 13.22 ofrece el esquema de conexionado de los mismos con el PIC.
El programa de la clave se ha incluido en el CD.

Figura 13.21. Fotografía del sistema de control de acceso montado sobre una tarjeta PIC18-ME.
HERRAMIENTAS Y DISEÑO DE PROYECTOS 385

Figura 13.22. Esquema de conexionado del sistema de control de acceso mediante una clave secreta.
APLICACIONES PRÁCTICAS
er
Simulando el primer taller 1.
TALLER

T1.1. CREACIÓN DEL PRIMER PROYECTO PARA EL PIC16F84A


Las fases o etapas que hay que realizar para implementar un proyecto basado en microcon-
trolador ya se analizaron al estudiar el 12F508 y se encuentran resumidas en la Figura T1.1.
Para el trabajo con el PIC16F84A también se utilizarán las mismas herramientas que
las utilizadas con el PIC12F508, que son las siguientes:

a) MPLAB IDE, para el desarrollo y compilación de los programas.


b) MPLAB SIM, para la simulación de los programas en el ordenador.
c) WinPic800, para la grabación del programa en el microcontrolador.
d) PIC School, para implementar físicamente los proyectos de programación.

A continuación, se describen los pasos necesarios para crear un primer proyec-


to para el PIC16F84A y su simulación en el entorno de desarrollo MPLAB IDE y
MPLAB SIM.
Para iniciar la gestión y desarrollo de este proyecto se elige la opción Project →
Project Wizard en el menú principal, tal como se presenta en la Figura T1.2.
Una vez seleccionado el gestor de proyectos, éste va guiando al usuario en las dife-
rentes fases precisas para crear un nuevo proyecto. Tras una ventana de bienvenida, se
elige la pestaña Siguiente para ir recorriendo por todos los pasos:

— Primer paso: Selección del microcontrolador. Aparece una lista desplegable


con todos los modelos de PIC que admite la versión del MPLAB utilizada. Se-
leccionamos el PIC16F84A (Fig. T1.3).
— Segundo paso: Se selecciona la herramienta del MPLAB IDE que se va a usar
para ensamblar o compilar el programa fuente. Se supone que el programa fuen-
te está escrito en lenguaje Ensamblador (.ASM) y se elige en la persiana Active
Toolsuite la herramienta Microchip MPASM Toolsuite, que incluye el entorno inte-
grado. Dicha herramienta consta del ensamblador (mpasmwin.exe) y el enlazador
o linkador (mplink.exe). Con el botón Browse se puede seleccionar la ruta donde
se encuentran esos tres ficheros, que por defecto es la mostrada en la Figura T1.4.
— Tercer paso: Se introduce el nombre que se asigna al proyecto y se indica en
la carpeta en que se guardará (Fig. T1.5). Se recomienda crear una carpeta para
guardar los ejercicios con el PIC16F84A (G:\16F84A).

389
390 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

— Cuarto paso: En este cuarto paso no se añade ningún fichero y se avanza sim-
plemente pulsando sobre el botón Siguiente. Al pulsar la fase Siguiente, aparece
un resumen del proyecto construido; y para acabar, basta presionar la opción
Finalizar.

Figura T1.1. Organigrama que recoge las etapas que se cubren en el desarrollo de un proyecto con
microcontrolador.
SIMULANDO EL PRIMER TALLER 391

Figura T1.2. La iniciación del proyecto se produce con la opción Project Wizard en la ventana desple-
gable de Project en el entorno MPLAB IDE.

Figura T1.3. Selección del microcontrolador usado en el proyecto.

En la pantalla principal del MPLAB IDE hay una ventana que recoge los ficheros
del proyecto creado. Mediante la opción File → New se genera un nuevo fichero para
escribir el código fuente de nuestro programa, que será el siguiente:

LIST P=16F84A ;Selección del PIC


INCLUDE “P16F84a.inc” ;Definición de registros
ORG 0x00 ;Vector de reset
GOTO INICIO ;Inicio del programa
ORG 0x05
392 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

INICIO:
CLRW ;Borra el contenido de W
ADDLW 0x08 ;Suma a W 8
ADDLW 0x09 ;Suma a W 9
NOP ;No operar
end

Figura T1.4. En el segundo paso se seleccionan las herramientas para ensamblar o compilar el pro-
grama fuente.

Figura T1.5. Se asigna nombre al proyecto (EJEMPLO_0) y se indica en la carpeta que se guardará
(G:\16f84A\EJEMPLO_0).
SIMULANDO EL PRIMER TALLER 393

Una vez copiado el código fuente, se procede a guardarlo con el nombre Ejem_0.ASM,
y mediante la opción Project → Add Files to Project se deberá añadir este fichero al proyec-
to creado de forma que en la ventana del proyecto se observe el fichero Ejem_0.ASM tal
dentro del apartado Source Files (Fig. T1.6).

Figura T1-6. Ventana que muestra los ficheros del proyecto creado.

T1.1.1. Análisis del programa fuente


En la primera línea se usa la directiva de Ensamblador List, que indica el modelo de
microcontrolador utilizado y que en este caso es el PIC16F84A. En la segunda línea,
la directiva include permite incluir en el programa el fichero P16F84A, que contiene la
declaración de los nombres de los registros, sus bits y las etiquetas que se usan para el
modelo de PIC empleado. Con org 0x00, la primera instrucción del programa se coloca
en la dirección hexadecimal 00, destinada al Vector de Reset. En dicha posición, escribi-
remos goto INICIO para que el programa, siempre que se inicie o resetee, salte a dicha
etiqueta, que se suele colocar en la posición 5 gracias a la instrucción org 0x05.
La instrucción clrw carga en el registro W el valor 0. Las dos siguientes instruccio-
nes, addlw 0x08 y addlw 0x09, suman los valores indicados al contenido del registro W.
Por último, la instrucción NOP no hace nada, sólo ocupa una posición de la memoria y
tarda en ejecutarse un ciclo de instrucción. La directiva final end indica la terminación
del programa fuente.
En resumen, este programa comienza poniendo a 0 el contenido del registro W y
luego le añade 8 y 9. Es un programa muy sencillo y con sólo fines didácticos.

T1.1.2. Desarrollando el proyecto


Para que el microcontrolador pueda ejecutar el programa fuente (.ASM) es necesario
traducir o «ensamblar» el mismo para convertirlo en programa en código máquina
(*.HEX). Tras el ensamblado, además del fichero ejecutable .hex, hay otro con los errores
(*.ERR), otro con el listado (*.LIST), etc.
394 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Para realizar el ensamblado se recurre en el MPLAB IDE, dentro del menú Project,
a la opción Build All. A continuación, se proporciona información sobre cómo se está
desarrollando la traducción y al final se genera una ventana con el resultado de la misma.
En dicha ventana se informa del desarrollo de la operación de ensamblaje, y si todo ha
ido bien, finaliza con la frase BUILD SUCCEEDED. Si ha ocurrido algún fallo en la
traducción, la frase final será BUILD FAILED. En este caso, hay que eliminar los errores
en el programa fuente, que se indican en la ventana, y repetir la operación de ensamblaje
(Fig. T1.7).

Figura T1.7. Al final de la operación de ensamblado producida por la opción Project/Build All aparece
la frase BUILD SUCCEEDED si todo ha ido bien.

T1.2. EL SIMULADOR MPLAB SIM


El taller Ejem_0.ASM es de carácter didáctico y no interesa grabarlo en la memoria
del PIC para comprobar su comportamiento. En estas condiciones, basta con simular
la ejecución del programa y analizar los resultados que produce. Para ello, se utiliza el
simulador software MPSIM que se halla integrado en el entorno MPLAB IDE.
Se elige la opción Debugger → Select Tool → 3 MPLAB SIM (Fig. T1.8).

Figura T1.8. Selección del simulador MPLAB SIM integrado en el MPLAB.

Al seleccionar el MPLAB SIM, aparece en la ventana principal un recuadro con siete


iconos que proporcionan mucha flexibilidad en la simulación del programa (Fig. T1.9).
SIMULANDO EL PRIMER TALLER 395

Figura T1.9. Opciones del simulador MPLAB SIM.

La opción Run ejecuta el programa, que no se detendrá hasta que bien se acabe el
programa, el simulador llegue a un punto de ruptura o bien se utilice la opción Halt, que
detiene la ejecución del programa.
La opción Animate también ejecuta el programa, pero de forma animada. Es decir,
ejecuta más lentamente el programa y resaltando en pantalla cada instrucción que está
ejecutándose para seguir visualmente dicha ejecución.
La opción Step Into ejecuta una sola instrucción (STEP INTO); la opción Step Over
ejecuta hasta la siguiente instrucción de mismo nivel sin introducirse en subrutinas, etc.
(STEP OVER), y la opción Step Our ejecuta el programa hasta salir de la rutina en
ejecución (STEP OUR).
Por último, la opción Reset reinicia la ejecución del programa.
Para comprobar el contenido de los registros del procesador y las posiciones de la
memoria, usando la pestaña View se eligen los elementos que intervienen en el programa
y les afectan las instrucciones. Así, en Ejem_0.ASM, el elemento más interesante y
usado es el registro W. También variará su valor el PCL cuando se vayan ejecutando las
instrucciones.

T1.3. COMPORTAMIENTO DEL PROGRAMA


CON EL SIMULADOR

A continuación, se describe cómo observar el comportamiento del programa a través del


simulador. Una vez seleccionada la herramienta MPLAB SIM a través de la opción De-
bugger → Select Tool → 3 MPLAB SIM, se procede a ejecutar paso a paso el programa
y observar su funcionamiento.
Mediante la opción Debugger → Step Into o bien, mediante la tecla de función F7
equivalente, el simulador ejecuta una instrucción del programa.
Así, la primera instrucción ejecutada es GOTO INICIO, ya que el resto de líneas
de código fuente son directivas para el compilador, pero no instrucciones del PIC. Esta
instrucción realiza un salto incondicional hasta la etiqueta INICIO, donde comienza el
programa.
Tras esta etiqueta, la primera instrucción es CLRW, que hace que el registro W tome
el valor 0. Si se observa, el valor del registro W en la ventana Watch del menú View Watch
se puede añadir este registro para monitorizar sus valores.
Con la primera suma ADDLW 0x08, el valor que toma W es 8, fruto de la suma de 8 + 0.
Con la siguiente suma ADDLW 0x09, el valor que toma W es 11, que en hexadecimal
es 17, fruto de sumar 9 al contenido de W, que es 8.
396 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura T1.10. La figura muestra el programa en ejecución mediante el simulador MPLAB SIM.

Y, por último, la instrucción NOP no hace nada ni altera el valor del registro W.
En la Figura T1.10 puede apreciarse cómo el simulador marca con una flecha la
próxima instrucción a ejecutar y con una B roja un punto de ruptura. Para establecer o
eliminar un punto de ruptura basta con hacer doble clic con el ratón en la posición donde
ahora se encuentra esa B correspondiente a la línea que se desea depurar.

Figura T1.11. La ventana Watch muestra el valor de WREG.


o
Trabajando
con entradas y salidas. 2.
Concurso de televisión TALLER

T2.1. INTRODUCCIÓN
Tras recordar en el taller anterior el manejo del simulador MPLAB SIM con el PIC16F84A,
en el presente taller se aborda un ejemplo práctico del uso de las entradas y salidas haciendo
uso de este PIC y de la herramienta de trabajo PIC School.
La descripción de esta herramienta, sus características y modo de empleo se encuentra
analizada en la aplicación 2 del PIC12F508. Dicha descripción resulta de especial interés
para poder abordar el desarrollo de los talleres que se presentan en esta parte de la obra.

T2.2. TALLER 2: TRABAJANDO CON ENTRADAS Y SALIDAS.


CONCURSO DE TELEVISIÓN
ENUNCIADO
Este taller desarrolla una plataforma para su uso en concursos de preguntas y respuestas
donde el primer concursante que sepa la respuesta a una pregunta deberá accionar un
pulsador y entonces se ilumina el led correspondiente a dicho concursante haciendo caso
omiso al resto de pulsaciones de los distintos participantes.

MATERIALES NECESARIOS

• PIC School.
• PIC16F84A.
• Cables de conexión.

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR


El taller utiliza dos interruptores de la PIC School para que los concursantes los accionen
cuando deseen responder a una pregunta y dos leds que indicarán cuando se enciendan
qué concursante contesta en primer lugar. Los periféricos se conectan a las Puertas A y B

397
398 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura T2.1. Organigrama del Taller 2.

del PIC16F84A, para lo cual primero se inicializan y luego se testean sus valores para
actuar según se muestra en el organigrama de la Figura T2.1.
Mientras ningún concursante accione su pulsador, el programa estará a la espera. En cuan-
to uno de los dos concursantes accione su pulsador, el programa iluminará el led correspon-
diente a ese concursante y entrará en un bucle infinito del que no saldrá nunca y así no prestará
atención a pulsaciones posteriores. Para pasar a la siguiente pregunta, el presentador accionará
el reset, que hará que el programa vuelva a comenzar desde la primera instrucción.
El código fuente correspondiente a dicho programa es el siguiente:

LIST P=16F84A ;Tipo de PIC


include “P16F84A.inc” ;Fichero de def. de registros
org 0 ;Vector de Reset
goto INICIO ;Salto a inicio
ORG 5 ;del programa
INICIO:
BSF STATUS,5 ;Cambio al banco 1
MOVLW b’11111100’ ;RA0 y RA1 Salida
MOVWF TRISA
MOVLW b’00000011’ ;RB0 y RB1 Entrada
MOVWF TRISB
BCF STATUS,5 ;Cambio al banco 0
CLRW ;Borrado de W
MOVLW PORTA ;Borrado de Puerta A
BUCLE:
MOVFW PORTB ;Contenido de PORTB a W
MOVWF PORTA ;Contenido de W a PORTA
TRABAJANDO CON ENTRADAS Y SALIDAS. CONCURSO DE TELEVISIÓN 399

BTFSC PORTB,0 ;Si RB0 es 1


GOTO ENCIENDE0 ;Enciende el led RA0
BTFSS PORTB,1 ;Si RB1 es 0
GOTO BUCLE ;Vuelve a leer PORTB
ENCIENDE1: ;En caso contrario
BSF PORTA,1 ;Enciende RB1
CLRWDT ;Refresca el perro guardián
GOTO ENCIENDE1 ;Entra en bucle infinito
ENCIENDE0: ;Enciende RB0
BSF PORTA,0 ;
CLRWDT ;Refresca el perro guardián
GOTO ENCIENDE0 ;Bucle infinito
END

Nótese cuál es el procedimiento para configurar la Puerta A y Puerta B como salidas


y entradas, respectivamente. Para ello, se debe acceder al registro TRISA y TRISB situa-
dos en el banco 1 de memoria, por lo que la primera instrucción es la que permite llevar
a cabo dicha operación: BSF STATUS,5. A continuación, y a través del registro W, se
mueve el valor binario 11111100 a TRISA, haciendo que todas las patitas sean de entra-
da menos RA1 y RA0, que, al estar configuradas con un 0, se configuran como salidas.
De igual forma, se configuran RB1 y RB0 como entradas moviendo el valor
00000011 al registro TRISB.
A continuación, se testean los bits RB0 y RB1 para comprobar si alguno de ellos
tiene el valor 1. Para ello, la instrucción BTFSS y BTFSC testean el valor de un bit
concreto de PORTB, y si es 1 o 0, respectivamente, salta la siguiente instrucción, que
en este caso siempre son instrucciones de salto para que el programa derive la acción
a un bucle infinito en el que se encenderá el led correspondiente y no se saldrá de él
hasta que se pulse reset o bien se siga esperando a que algún concursante pulse su
interruptor.

ENSAMBLADO

Mediante la opción Project → Build All se compila el taller y se obtiene, entre otros, el
fichero del programa máquina ejecutable, que tiene la extensión .HEX.
Aunque el simulador MPLAB SIM no puede mostrar el comportamiento en tiempo
real de las líneas de E/S, con él se puede comprobar su respuesta en el programa introdu-
ciendo mediante la opción Debugger → Stimulus Controller → New Scenario cambios en
los valores de RA0 y RA1 y así observar los cambios en RB0 y RB1, respectivamente.

CONEXIÓN DE PERIFÉRICOS

El conexionado de los periféricos que están disponibles en la PIC School es el que


muestra la Figura T2.2. Una vez colocado el PIC16F84A sobre su zócalo, tan sólo co-
nectaremos RA0 y RA1 como salidas y RB0 y RB1 como entradas en los interruptores
de la placa PIC School.
400 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura T2.2. Conexión de las cuatro líneas del PIC16F84A usadas en la experiencia.

Figura T2.3. Fotografía del montaje de la experiencia en la PIC School.


TRABAJANDO CON ENTRADAS Y SALIDAS. CONCURSO DE TELEVISIÓN 401

Figura T2.4. Pantalla principal del programa WinPic800 que muestra el programa en hexadecimal.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Para grabar el programa TALLER2.ASM con PIC School en la memoria FLASH del
PIC16F84A se utiliza el programa WinPic800. El jumper JP4 debe estar en la posición
MCL uniendo los puntos 1-2. El conmutador principal de la PIC School debe situarse
en la posición PC si se utiliza la puerta serie para conectarla con el PC. En caso de usar
el adaptador opcional para conectar la PIC School con el PC por el puerto USB hay que
colocar el conmutador en la posición ICSP durante la grabación/verificación.
Desde WinPic800 se abre el programa TALLER2.HEX. En la barra de herramientas
se elige el tipo de PIC a emplear. En la pestaña Config. es muy importante configurar
el PIC seleccionando el oscilador XT y desactivar el WDT tal y como se muestra en
la Figura T2.5. Tras realizar esta operación, con el icono correspondiente se ordena la
grabación del mismo sobre la memoria del PIC16F84A, previamente seleccionado. Des-
pués se puede verificar si la grabación ha sido correcta comparando el contenido de la
memoria con el del programa.
Una vez grabado el programa y antes de la verificación de su comportamiento, se
coloca JP4 en la posición GP3 (2-3) y el conmutador principal se pone en Run.
Ahora sólo queda que cada concursante se coloque en posición, el presentador haga
la primera pregunta y ya pueden empezar a accionar los interruptores para contestar.
Recuerde que para pasar de pregunta hay que accionar el botón Reset de la placa PIC
School.
402 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura T2.5. Configuración del PIC previa grabación.

EL PROGRAMA EN C

A continuación, se proporciona el programa en C a partir del cual se obtiene el programa


ejecutable tras su compilación. En estos ejemplos se ha empleado el compilador de C de la
casa CCS, que comercializa Ingeniería de Microsistemas Programados, S. L. También en
el CD que acompaña al libro se puede encontrar este programa bajo el título TALLER_2.C.

#include <16f84.h>

#byte port_a = 5
#byte port_b = 6

main()
{
port_b = 0;
set_tris_a(0b11111100); //RA0 y RA1 Salidas
set_tris_b(0b00000011); //RB0 y RB1 Entradas
while(1)
{
if(input(PIN_A0)) // Leer RA0 y preguntar su valor
{ // RA0 es 1
output_bit(PIN_B0,1); // Poner RB0 a 1
output_bit(PIN_B1,0); // Poner RB1 a 0
while(1)
{
TRABAJANDO CON ENTRADAS Y SALIDAS. CONCURSO DE TELEVISIÓN 403

restart_wdt(); //Entrada en un bucle infinito


}

}
if(input(PIN_A1)) // Leer RA0 y preguntar su valor
{ // RA0 es 1
output_bit(PIN_B0,0); // Poner RB0 a 1
output_bit(PIN_B1,1); // Poner RB1 a 0
while(1)
{
restart_wdt(); //Entrada en un bucle infinito
}
}
}
}
er
Manejo de la instrucción
SLEEP
3.
TALLER

T3.1. INTRODUCCIÓN
El modo de bajo consumo o standby de los PIC, también conocido como sleep, reduce al
orden de microamperios el consumo del mismo. Esto está especialmente indicado para
aquellas aplicaciones en las que el sistema debe alimentarse mediante baterías.
Hay gran cantidad de aplicaciones en las que el microcontrolador debe estar en espera de
algún evento externo para realizar una determinada tarea. Son estas ocasiones en las que dicho
microcontrolador debiera estar en standby, reduciendo el consumo hasta que el evento suceda.
La instrucción SLEEP pone al PIC en estado de standby. Para salir o «despertar» de
dicho estado (wake-up) debe suceder uno de estos tres sucesos: un reset del sistema, una
interrupción o bien un desbordamiento del Perro Guardián.

T2.2. TALLER 3: MANEJO DE LA INSTRUCCIÓN SLEEP


ENUNCIADO

Este taller pretende mostrar el empleo de la instrucción SLEEP para poner al PIC en modo
standby de bajo consumo. El despertar del mismo se producirá cada vez que el Perro Guar-
dián se desborde. En ese momento se producirá un incremento del valor de la Puerta B que
actuará como contador binario y nuevamente se volverá a la situación de standby.
El preescaler se asociará al Perro Guardián y estará comprendido entre 1 y 128,
dependiendo del estado lógico de los interruptores RA0-RA2.
El valor nominal del Perro Guardián es de 18 ms. Es decir, con un preescaler de 1, el mi-
crocontrolador «despertará» cada 18 ms; con un preescaler de 128, lo hará cada 2,3 s.

MATERIALES NECESARIOS

• PIC School.
• PIC16F84A.
• Cables de conexión.

405
406 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

La ejecución del taller, resumida en la Figura T3.1, es muy simple. El microcontrola-


dor entra en modo sleep, y cada vez que sale por desbordamiento del Perro Guardián,
lee el estado de los interruptores conectados a RA0-RA2, y en función del valor de
éstos, cambia el preescaler de dicho Perro Guardián. Además, cada vez que se «des-
pierta» se incrementa un contador cuyo valor se muestra por los ocho leds conectados
a la Puerta B.

Figura T3.1. Organigrama del Taller 3.


MANEJO DE LA INSTRUCCIÓN SLEEP 407

El código fuente correspondiente a dicho programa es el siguiente:

;
; TALLER_3.ASM
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;El modo “sleep” y el “wake-up” (despertar) mediante el watch-dog timer
;
List p=16F84 ;Tipo de procesador
include “P16F84.INC” ;Definiciones de registros internos

org 0x00 ;Vector de Reset


goto Inicio
org 0x05 ;Salva vector de interrupción

Inicio clrf PORTB ;Borra los latch de salida


bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b’00011111’
movwf TRISA ;RA0-RA4 entradas
movlw b’00001000’
movwf OPTION_REG ;Preescaler de 1 para el WDT
bcf STATUS,RP0 ;Selecciona banco 0

Loop sleep ;Modo standby

incf PORTB,F ;PUERTAB = PUERTAB + 1


movf PORTA,W
andlw b’00000111’ ;Lee estado de interruptores RA0-RA2
iorlw b’00001000’
bsf STATUS,RP0 ;Selecciona el banco 1
movwf OPTION_REG ;Ajusta valor del preescaler
bcf STATUS,RP0 ;Selecciona el banco 1
goto Loop ;Volver al modo standby

end ;Fin del programa fuente

El aspecto más reseñable de este programa es la utilización de la instrucción sleep.


Nótese que una vez ejecutada dicha instrucción, el PIC entra en modo reposo y no eje-
cuta ninguna otra instrucción hasta que sale de dicho modo y sólo entonces ejecutará
aquellas instrucciones que se encuentran tras sleep.
Otro aspecto interesante a analizar en el desarrollo del programa es la forma en la
que se filtra de la puerta A los valores de los 3 bits de menos peso correspondientes a
RA0-RA2. Para obtener solamente el valor de estos 3 bits se realiza la operación lógica
AND con el valor binario b’00000111’ mediante la instrucción andlw b’00000111’ que
hace que los 5 bits de más peso valgan siempre 0.
Tras esta operación, como se quiere modificar los 3 bits del registro STATUS con
dicho valor, se realiza un operación lógica OR con el valor binario b’00001000’ para
408 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

conseguir que el cuarto bit esté a 1 lógico y los tres restantes tengan el valor leído en
RA0-RA2. Para ello, se utiliza la instrucción iorlw b’00001000’.

ENSAMBLADO

Mediante la opción Project → Build All se compila el taller y se obtiene, entre otros, el
fichero del programa máquina ejecutable que tiene la extensión .HEX, que se grabará
sobre la PIC School una vez realizadas las conexiones permanentes.
También se puede simular este programa mediante el MPLAB SIM visualizando
el estado de la Puerta B y accediendo mediante la opción Debugger → Stopwatch y la
colocación de un punto de ruptura en la instrucción sleep observar el tiempo que pasa
desde un sleep a otro. La Figura T3.2 muestra el tiempo pasado de la primera entrada en
modo sleep al siguiente: 18 ms.

Figura T3.2. La ventana Stopwatch muestra el tiempo y los ciclos ejecutados al pararse el programa en
el punto de ruptura.

CONEXIÓN DE PERIFÉRICOS

El conexionado de los periféricos que todos están disponibles en la PIC School es el que
muestra la Figura T3.3. Una vez colocado el PIC16F84A sobre su zócalo, tan sólo conec-
taremos RA0, RA1 y RA2 como entradas y la Puerta B se conectará sobre los leds S0-S7.

Figura T3.3. Conexión de líneas del PIC16F84A usadas en la experiencia.


MANEJO DE LA INSTRUCCIÓN SLEEP 409

Figura T3.4. Fotografía del montaje de la experiencia en la PIC School para la demostración del modo
sleep.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez generado el fichero TALLER3.HEX mediante la compilación en el entorno


MPLAB IDE (Project → Build All), a continuación se accede al programa WinPic800
para la grabación del mismo en la placa PIC School.
Desde WinPic800 se abre el programa TALLER3.HEX y con el icono correspon-
diente se ordena la grabación del mismo sobre la memoria del PIC16F84A, previamente
seleccionado. Después, se puede verificar si la grabación ha sido correcta comparando el
contenido de la memoria con el del programa.
Una vez grabado el programa y antes de la verificación de su comportamiento, se
coloca JP4 en la posición GP3 (2-3) y el conmutador principal se pone en RUN.
Si la posición de los interruptores E0-E2 correspondientes a RA0-RA2 transmiten el
valor 0, se observará cómo los leds S0-S7 parpadean muy rápidamente. Cambiando los
valores de estos tres interruptores, la velocidad de parpadeo de los leds variará alcanzan-
do su valor mínimo cuando éstos introducen el valor binario 111.

EL PROGRAMA EN C

A continuación, se proporciona el programa en C a partir del cual se obtiene el programa


ejecutable tras su compilación. En estos ejemplos se ha empleado el compilador de C de la
casa CCS, que comercializa Ingeniería de Microsistemas Programados, S. L. También en
el CD que acompaña al libro se puede encontrar este programa bajo el título TALLER_3.C.
410 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

/*-------------------------------------------*\
| TALLER_3.c |
| Autor: Pedro M.a Jiménez |
| (c) Microsystems Engineering (Bilbao) |
\*-------------------------------------------*/

// El modo “sleep” y el “wake-up” (despertar) mediante el WDT

#include <16f84.h>

#use delay(clock=4000000,RESTART_WDT)
#include <lcd2.c>

#use fast_io(A)
#use fast_io(B)

#byte port_a = 5
#byte port_b = 6

main()
{
port_b = 0;
set_tris_a(0x1F);
set_tris_b(0x00);

setup_counters(RTCC_INTERNAL,WDT_18MS);

while(1)
{
sleep();

port_b++;
setup_counters(RTCC_INTERNAL, 8 + (port_a&0x07)); // Ver Nota.
}
}
// Nota:
// Esto es una copia de parte del fichero 16f84.h:
/*
#define RTCC_DIV_2 0
#define RTCC_DIV_4 1
#define RTCC_DIV_8 2
#define RTCC_DIV_16 3
#define RTCC_DIV_32 4
#define RTCC_DIV_64 5
#define RTCC_DIV_128 6
#define RTCC_DIV_256 7
#define WDT_18MS 8
#define WDT_36MS 9
#define WDT_72MS 10
#define WDT_144MS 11
#define WDT_288MS 12
#define WDT_576MS 13
MANEJO DE LA INSTRUCCIÓN SLEEP 411

#define WDT_1152MS 14
#define WDT_2304MS 15
*/
// Como se puede observar, para seleccionar un WDT de 18 ms es necesario
// pasarle a la función “setup_counters” el parametro WDT_18MS, es decir,
// el número 8.

Nótese que al usar la función setup_counters en el lenguaje C para establecer el


preescaler del WDT, los valores son distintos a los usados en Ensamblador. En C, para
obtener los rangos del preescaler deseados, hay que introducir valores de 8 a 15 en vez
de 0 a 7, como hacíamos en Ensamblador. Es por esto por lo que en la llamada a dicha
función se le añade al valor leído por la Puerta B la constante 8.
o
Uso de temporizadores.
Contador ascendente/descendente
4.
TALLER

T4.1. INTRODUCCIÓN
Este taller maneja el clásico contador ascendente/descendete binario. En los leds conec-
tados a la Puerta B de la PIC School se reflejará el resultado de la cuenta. Se contempla
la eliminación del «efecto rebote» que se produce en la apertura y cierre de los contactos
de los interruptores. Se elimina dicho efecto mediante una temporización software.

T4.2. TALLER 4: CONTADOR ASCENDENTE/DESCENDENTE.


ELIMINANDO EL EFECTO REBOTE
ENUNCIADO

Sobre los ocho leds de salida conectados a la Puerta B se visualizará, en binario, el nú-
mero de pulsos aplicados por la entrada RA0. RA1 determina si la cuenta es ascendente
(a 1) o descendente (a 0).

MATERIALES NECESARIOS

• PIC School.
• PIC16F84A.
• Cables de conexión.

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

El programa comienza creando una subrutina para conseguir un retraso de 20 ms que


será de vital importancia para eliminar el denominado efecto rebote. Tras crear esta ruti-
na, el programa comienza esperando un pulso alto seguido de uno bajo con un intervalo
mínimo de 20 ms. Tras lo cual, si el estado de RA1 = 0, disminuirá un contador, y si es
el contrario, aumentará dicho contador, que se visualiza mediante los leds conectados a
la Puerta B. La Figura T4.1 resume esta aplicación.

413
414 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura T4.1. Organigrama del Taller 4.

El código fuente correspondiente a dicho programa es el siguiente:

;
; TALLER_4.asm
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Contador UP/DOWN binario
;
USO DE TEMPORIZADORES. CONTADOR ASCENDENTE/DESCENDENTE 415

;Sobre los 8 leds de salida conectados a la puerta B se visualizará, en


;binario, el número de pulsos aplicados por la entrada RA0. RA1
;determina si la cuenta es ascendente (a “1”)
;o descendente

List p=16F84 ;Tipo de procesador


include “P16F84.INC” ;Definiciones de registros internos

org 0x00 ;Vector de Reset


goto Inicio

org 0x05 ;Salva el vector de interrupción

;******************************************************************

;Delay_20_ms: Rutina de temporización cuyo objeto es eliminar el


;“efecto rebote” de los periféricos electromecánicos. Realiza un delay
;de 20 ms. Si el PIC trabaja a una frecuencia de 4MHz, el TMR0
;evoluciona cada us.
;Si queremos temporizar 20000 us (20 ms) con un preescaler de 128, el
;TMR0 deberá contar 156 eventos(156 * 128). El valor 156 equivale a 9c
;hex. y como el TMR0 es ascedente habrá que cargar su complemento a 1
;(63 hex.).

Delay_20_ms:
bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw 0x63 ;Complemento hex. de 156
movwf TMR0 ;carga el TMR0
Delay_20_ms_1 clrwdt ;Refrescar el WDT
btfss INTCON,T0IF ;Rebasamiento del TMR0
goto Delay_20_ms_1 ;Todavía no
bcf INTCON,T0IF ;Ahora sí, reponer el flag
return

Inicio clrf PORTB ;Borra los latch de salida


bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b’00011111’
movwf TRISA ;Puerta A se configura como entrada
movlw b’00000110’
movwf OPTION_REG ;Preescaler de 128 para el TMR0
bcf STATUS,RP0 ;Selecciona banco 0
Loop clrwdt ;Refrescar el WDT
btfss PORTA,0 ;Subida de la señal RA0 ?
goto Loop ;No
call Delay_20_ms ;Elimina rebotes

Loop_2 clrwdt ;Refrescar el WDT


btfsc PORTA,0 ;Bajada de RA0 (pulso)
goto Loop_2 ;No
call Delay_20_ms ;Ha habido pulso, eliminar rebotes

btfss PORTA,1 ;RA1 = 1


goto Down ;No, cuenta descendente
416 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Up incf PORTB,F ;Cuenta ascendente


goto Loop

Down decf PORTB,F ;Cuenta descendente


goto Loop

end ;Fin del programa fuente

Cabe destacar el uso de la subrutina Delay_20_ms a la que se accede mediante la


llamada call Delay_20_ms y de la que se retorna mediante la instrucción return.

ENSAMBLADO

Mediante la opción Project → Build All se compila el taller y se obtiene, entre otros, el
fichero del programa máquina ejecutable que tiene la extensión .HEX, que se grabará
sobre la PIC School una vez realizadas las conexiones permanentes.
Para poder simular este taller será necesario crear un nuevo escenario (Debugger →
Stimulus Controller → New Scenario) y crear dos eventos para conseguir un pulso alto
y bajo de RA0, así como para cambiar el estado de RA1.

CONEXIÓN DE PERIFÉRICOS

El conexionado de los periféricos disponibles en la PIC School es el que muestra la


Figura T4.2. Una vez colocado el PIC16F84A sobre su zócalo, se conectan RA0 y
RA1 como entradas y la puerta B sobre los leds S0-S7. Es conveniente situar RA0 en
un pulsador (E7) y no en un interruptor como RA1 (E0) para conseguir el pulso más
fácilmente.

Figura T4.2. Conexión de líneas del PIC16F84A usadas en la experiencia.


USO DE TEMPORIZADORES. CONTADOR ASCENDENTE/DESCENDENTE 417

Figura T4.3. Fotografía del montaje de la experiencia en la PIC School.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez generado el fichero TALLER4.HEX mediante la compilación en el entorno


MPLAB IDE (Project → Build All), a continuación se accede al programa WinPic800
para la grabación del mismo en la placa PIC School.
Al comenzar a pulsar E7, conectado a RA0, se comenzará a visualizar por los leds el
número de pulsaciones producidas. Al cambiar el estado del interruptor E1 conectado a
RA1 conseguiremos que ese conteo sea incremental o decremental.

EL PROGRAMA EN C

A continuación, se proporciona el programa en C a partir del cual se obtiene el programa


ejecutable tras su compilación:

/*-------------------------------------------*\
| Taller_4.c |
| Autor: Pedro M.a Jiménez |
| (c) Microsystems Engineering (Bilbao) |
\*-------------------------------------------*/
418 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

// Contador UP/DOWN binario

// Sobre los 8 leds de salida conectados B se visualizará, en binario,


// el número de pulsos aplicados por RA0. RA1 determina si la cuenta es
// ascendente (a “1”) o descendente.

#include <16f84.h>

#use delay(clock=4000000,RESTART_WDT)

#use fast_io(A)
#use fast_io(B)

#byte port_a = 5
#byte port_b = 6

main()
{
port_b = 0;
set_tris_a(0x1F);
set_tris_b(0x00);

while(1)
{
do {
restart_wdt();
} while(input(PIN_A0)); // Esperar flanco ascendente
delay_ms(20);

do {
restart_wdt();
} while(!input(PIN_A0)); // Esperar flanco descendente
delay_ms(20);

if(input(PIN_A1))
port_b++;
else
port_b--;
}
}
o
Manejo del teclado 5.
TALLER

T5.1. INTRODUCCIÓN
Manejar un teclado de dieciséis teclas puede resultar más complejo de lo que aparente-
mente podría parecer. El PIC16F84A no dispone de dieciséis líneas con las que monito-
rizar cada una de las teclas. Para manejar el teclado utilizará solamente ocho patitas.
Se conectarán las ocho líneas de la Puerta B (RB0-RB7) directamente al teclado
matricial 4 × 4. El software de la aplicación configurará a las líneas RB7-RB4 como sa-
lidas para ir activando secuencialmente cada una de las filas. Al mismo tiempo, las líneas
RB3-RB0 se configuran como entradas desde las columnas del teclado y son leídas para
determinar si hay alguna tecla pulsada.

T5.2. TALLER 5: MANEJO DEL TECLADO


ENUNCIADO

Haciendo uso de las rutinas incluidas en el fichero TECLADO.INC, se trata de leer el


teclado y visualizar sobe los leds de la Puerta B el código binario de la tecla pulsada. La
visualización se mantiene estable durante dos segundos hasta una nueva pulsación.
Se trata de un ejemplo en el que la Puerta B se reconfigura dinámicamente. Inicial-
mente, está configurada como salida para presentación del resultado. Posteriormente,
la rutina de exploración del teclado reconfigura RB0-RB3 como entradas y RB4-RB7
como salidas.

MATERIALES NECESARIOS

• PIC School.
• PIC16F84A.
• Cables de conexión.

419
420 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura T5.1. Organigrama del Taller 5.

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

El organigrama de la Figura T5.1 resume el funcionamiento del programa.


El código fuente en Ensamblador correspondiente a dicho programa es el siguiente:

; Autor: Mikel Etxebarria


; (c) Microsystems Engineering (Bilbao)
;
;
;Introducción al manejo del teclado.
;
;Haciendo uso de las rutinas incluidas en el fichero TECLADO.INC, se
MANEJO DEL TECLADO 421

;trata de leer el teclado y visualizar sobre los leds de la Puerta


;B el código binario de la tecla pulsada. La visualización se
;mantiene estable durante dos segundos hasta una nueva pulsación.
;Se trata de un ejemplo en el que la Puerta B se reconfigura
;dinámicamente. Inicialmente es configurada como salida para
;presentación del resultado. Posteriormente, la rutina de
;exploración del teclado reconfigura RB0-RB3 como entradas y RB4-RB7
;como salidas.

List p=16F84 ;Tipo de procesador


include “P16F84.INC” ;Definiciones de registros internos

Key_var equ 0x0c ;Inicio de las variables de manejo


;del teclado
Delay_Cont equ 0x12 ;Variable para la temporización

org 0x00 ;Vector de Reset


goto Inicio
org 0x05 ;Salva vector de interrupción

include “TECLADO.INC” ;Incluye rutinas de manejo del


;teclado

;******************************************************************
;Delay_var: Rutina que realiza una temporización variable
;entre 50 ms y 12.8”. Se emplea un preescaler de 256 y al TMR0 se le
;carga con 195. La velocidad de trabajo es de 4 Mhz y, por tanto, el TMR0
;se incrementa cada us. De esta forma, el TMR0 debe contar 195
eventos, que con un preescaler de 256 hace una intervalo total de
;50000 uS/50 ms (195 * 256). El valor 195 hay que expresarlo en
;hex. (c3), y como el TMR0 es ascendente, habrá que cargar su
;complemento (3C hex.).
;Dicho intervalo de 50 ms se repite tantes veces como indique la
;variable “Delay_cont”; es por ello que el delay mínimo es de 50 ms
;(“Delay_cont=1) y el máximo de 12.8” (Delay_cont=255).

Delay_var:
bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw 0x3c ;Complemento hex. de 195
movwf TMR0 ;carga el TMR0
Intervalo clrwdt ;Refrescar el WDT
btfss INTCON,T0IF ;Rebosamiento del TMR0 ??
goto Intervalo ;Todavía no
decfsz Delay_cont,F ;Decrementa contador de intervalos
goto Delay_var ;Repite el intervalo de 50 ms
return

Inicio clrf PORTB ;Borra los latch de salida


bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida

movlw b’00000111’
movwf OPTION_REG ;Preescaler de 256 para el TMR0
bcf STATUS,RP0 ;Selecciona banco 0
422 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Loop clrwdt ;Refresco del WDT


call Key_Scan ;Explora el teclado
movlw 0x80
subwf Tecla,W
btfsc STATUS,Z ;Hay alguna pulsada
goto Loop ;No

movf Tecla,W ;Lee el código de la tecla pulsada


movwf PORTB ;Lo visualiza sobre leds Puerta B
movlw .40
movwf Delay_cont
call Delay_var ;Temporiza 2 segundos
clrf PORTB ;Desactiva visualización
goto Loop
end ;Fin del programa fuente

A la hora de cargar este programa desde el CD que acompaña a la obra, deberá crear
un proyecto que incluya el fichero TALLER_5.ASM junto con el fichero TECLADO.INC
que contiene las rutinas necesarias para el manejo del teclado.

ENSAMBLADO

Mediante la opción Project → Build All se compila el taller y se obtiene, entre otros, el
fichero del programa máquina ejecutable que tiene la extensión .HEX que se grabará
sobre la PIC School una vez realizadas las conexiones permanentes.
La simulación de este ejercicio es prácticamente inviable, ya que las características
propias del teclado son difíciles de representar en el simulador.

CONEXIÓN DE PERIFÉRICOS

La conexión de los periféricos puede resultar curiosa, ya que se utiliza la Puerta B tanto
para leer el teclado como para mostrar el resultado por los leds. Así, pues, hay que apro-
vechar la posibilidad que presenta el conector de la Puerta B que dispone de dos posibles
conexiones por cada patita. Una conexión irá hacia el teclado y otra hacia los leds según
se puede observar en la Figura T5.2.

Figura T5.2. Conexión de líneas del PIC16F84A usadas en la experiencia.


MANEJO DEL TECLADO 423

Figura T5.3. Fotografía del montaje de la experiencia en la PIC School.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez generado el fichero TALLER_5.HEX mediante la compilación en el entorno


MPLAB IDE (Project → Build All), a continuación se accede al programa WinPic800
para la grabación del mismo en la placa PIC School.
Desde WinPic800 se abre el programa TALLER5.HEX y con el icono correspon-
diente se ordena la grabación del mismo sobre la memoria del PIC16F84A, previamente
seleccionado. Después, se puede verificar si la grabación ha sido correcta comparando el
contenido de la memoria con el del programa.
Una vez grabado el programa y antes de la verificación de su comportamiento, se
coloca JP4 en la posición GP3 (2-3) y el conmutador principal se pone en RUN.
Al iniciar el programa, observaremos cómo los leds RB0-RB7 están encendidos.
Cada vez que pulsemos una tecla, durante dos segundos dejará de iluminarse en RB7-
RB4 el led correspondiente a la fila de la tecla pulsada y en RB3-RB0 el led correspon-
diente a la columna de la tecla pulsada. Así, al pulsar la tecla 6 dejará de iluminarse RB2
(columna 3) y RB5 (fila 2).

EL PROGRAMA EN C

A continuación, se proporciona el programa en C a partir del cual se obtiene el programa


ejecutable tras su compilación.
424 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

/*-------------------------------------------*\
| Autor: Pedro M.a Jiménez |
| (c) Microsystems Engineering (Bilbao) |
\*-------------------------------------------*/

// Introducción al manejo del teclado.


// Haciendo uso de las rutinas incluidas en el fichero KBD2.C,
// se trata de leer el teclado y visualizar sobre los leds de la
// Puerta B el código binario de la tecla pulsada. La visualización
// se mantiene estable durante dos segundos hasta una nueva pulsación.

// Se trata de un ejemplo en el que la Puerta B se reconfigura


// dinámicamente. Inicialmente, es configurada como salida para
// presentación del resultado. Posteriormente, la rutina de exploración
// del teclado reconfigura RB0-RB3 como entradas y RB4-RB7 como salidas.

#include <16f84.h>

#use delay(clock=4000000,RESTART_WDT)
#use fast_io(B)
#include <kbd2.c>

#byte port_b = 6

main()
{
char k;

while(1)
{
restart_wdt();
k=kbd_getc(); // Comprueba el teclado: si k es 0, no se pulsó
if(k) // ninguna tecla; si no es 0, contiene el código
{ // ASCII de la tecla pulsada.

set_tris_b(0x00); // ATENCIÓN: Necesario puesto que la función


port_b = k; // kbd_getc() reprograma la Puerta B.
delay_ms(2000);
}
}
}
o
Comunicación RS-232 6.
TALLER

T6.1. INTRODUCCIÓN
El presente taller aborda el uso de la interfaz RS-232 de la placa de entrenamiento PIC
School para comunicar, vía serie, el PIC16F84A y un PC.
Las comunicaciones vía serie con un PC proporcionan al microcontrolador de un
amplio abanico de aplicaciones, como monitorización de sensores a través de PC, alar-
mas en el PC con envío de e-mails cuando un sensor del PIC lee cierto valor, manejo
de motores conectados al PIC desde el PC, almacenamiento de grandes volúmenes de
información leída por el PIC dentro del PC…

T6.2. TALLER 6: COMUNICACIÓN RS-232


ENUNCIADO

Haciendo uso de las rutinas incluidas en el fichero RS232LOW.INC, se trata de utilizar


el canal RS-232 de la PIC School para comunicar vía serie con diferentes periféricos. En
los ejemplos aquí propuestos se utilizará un PC para que con el software HyperTermi-
nal de Windows actúe como un simple terminal de comunicaciones. El usuario deberá
preparar los cables de comunicación entre la PIC School y el PC. Una de las aplicaciones
prácticas para el PIC12F508 tenía el mismo propósito.
El taller pretende ser un simple sistema de monitorización. Se lee el estado de los in-
terruptores E4-E0 de la PIC School conectados a RA4-RA0 del PIC16F84A y se envía,
vía serie, a un terminal para monitorizar el estado de los mismos.

MATERIALES NECESARIOS
• PIC School.
• PIC16F84A.
• Cables de conexión.
• Cable de conexión serie con el PC.
• Programa de comunicaciones HyperTerminal (u otro similar).

425
426 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

Aunque el organigrama de la Figura T6.1 parece muy simple, el programa que lo desarrolla
no lo es tanto. El PIC16F84A carece de un módulo RS-232, por lo que realizar una comu-
nicación serie requiere implementar en el programa dicho protocolo mediante un control
estricto de los tiempos empleados.

Figura T6.1. Organigrama del Taller 6.

El programa hace uso de las rutinas almacenadas en el fichero RS232LOW.INC y el


código fuente del programa principal es el siguiente:

; TALLER 6
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
; Comunicación serie gestionada por software.
;
;Haciendo uso de las rutinas incluidas en el fichero RS232LOW.INC, se
;trata de utilizar el canal RS232 de la Trainer PLUS para comunicar vía
;serie con diferentes periféricos. En los ejemplos aquí propuestos se
;utilizará un PC para que, con el software HyperTERMINAL, actúe como un
;simple terminal de comunicaciones.
;Este programa pretende ser un simple sistema de monitorización. Se lee
;el estado de los interruptores RA0-RA4 de la uPIC Trainer y se envía,
;vía serie, a un terminal para monitorizar el estado de los mismos.

List p=16F84 ;Tipo de procesador


include “P16F84.INC” ;Definiciones de registros internos
COMUNICACIÓN RS-232 427

CLKIN equ .4000000 ;Frecuencia de trabajo


BAUDIOS equ .9600 ;Velocidad de comunicación
T_MODO equ 1 ;Transmite primero bit LSB
R_MODO equ 1 ;Recibir primero bit LSB
T_Nbit equ 8 ;Transmite caracteres de 8 bits
R_Nbit equ 8 ;Recibe caracteres de 8 bits
Sbit equ 2 ;Transmite 2 bits de stop

Rs232_var equ 0x0c ;Inicio variables rutinas RS232


Contador equ 0x11 ;Variable contador de bits
Temporal equ 0x12 ;Variable temporal de datos
Blancos equ 0x13 ;Número de blancos a transmitir
Temporal_1 equ 0x14 ;Variable temporal
Temporal_2 equ 0x15 ;Variable temporal

org 0x00 ;Vector de reset


goto Inicio
org 0x05 ;Salvar el vector de interrupción

include “RS232LOW.INC” ;Incluir rutinas de comunicación

Mens_0 equ $ ;Mens_0 apunta al primer carácter


;del mensaje 0
dt “RA4 RA3 RA2 RA1 RA0”,0x0d,0x0a,0x00
Mens_1 equ $ ;Mens_1 apunta al primer carácter
;del mensaje 1
dt “--- --- --- --- ---”,0x0d,0x0a,0x0a,0x00

;******************************************************************
;Según el valor contenido en el registro W, se devuelve el carácter a
;visualizar
Tabla_Mensajes movwf PCL ;Desplazamiento sobre la tabla

;*****************************************************************
;Mensaje: Esta rutina envía vía serie RS232 el mensaje cuyo inicio
;está indicado en el acumulador. El fin de un mensaje se determina
;mediante el código 0x00

Mensaje movwf Temporal_1 ;Salva posición de la tabla


Mensaje_1 movf Temporal_1,W ;Recupera posición de la tabla
call Tabla_Mensajes ;Busca carácter de salida
movwf Temporal_2 ;Guarda el carácter
movf Temporal_2,F
btfss STATUS,Z ;Mira si es el último
goto No_es_último
return
No_es_último movwf Txdreg
call TxD ;Transmite el carácter
incf Temporal_1,F ;Siguiente carácter
goto Mensaje_1

Inicio: bsf STATUS,RP0 ;Selecciona página 1 de datos


movlw b’10001111’ ;Preescaler de 128 para el WDT.
Pull_Up Off
428 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

movwf OPTION_REG
movlw b’11101111’
movwf TRISB ;RB5 entrada y RB4 salida
movlw 0xff
movwf TRISA ;Puerta A entrada
bcf STATUS,RP0 ;Selecciona página 0 de datos

movlw Mens_0
call Mensaje ;Salida de mensaje 0
movlw Mens_1
call Mensaje ;Salida de mensaje 1

Loop clrwdt
movlw .5
movwf Contador ;Inicia contador de bits
movf PORTA,W ;Lee el estado de la puerta A
andlw b’00011111’
movwf Temporal
rlf Temporal,F
rlf Temporal,F
rlf Temporal,F ;Almacena estado de RA4-RA0

Siguiente_bit rlf Temporal,F ;Desplaza el bit MSB a carry


btfsc STATUS,C ;Es “0”
goto Es_1 ;No, es “1”
Es_0 movlw ‘0’ ;Código ASCII del “0”
goto Enviar
Es_1 movlw ‘1’
Enviar movwf Txdreg
call TxD ;Transmite el código del bit

movlw .3
movwf Blancos
Txd_Blancos movlw ‘ ’
movwf Txdreg
call TxD
decfsz Blancos,F
goto Txd_Blancos

decfsz Contador,F ;Transmitido los 5 bits


goto Siguiente_bit ;Todavía no

movlw .13
movwf Txdreg
call TxD ;Transmite código de CR
goto Loop

end ;Fin del programa fuente

A la hora de cargar este programa desde el CD que acompaña a la obra, debe-


rá crear un proyecto que incluya tanto el fichero TALLER_6.ASM como el fichero
RS232LOW.INC que contiene las rutinas necesarias para el manejo del teclado.
COMUNICACIÓN RS-232 429

ENSAMBLADO

Mediante la opción Project → Build All se compila el taller y se obtiene, entre otros, el
fichero del programa máquina ejecutable que tiene la extensión .HEX, que se grabará
sobre la PIC School una vez realizadas las conexiones permantes.
La simulación de este ejercicio no es posible, ya que el MPLAB SIM, aunque para
otros PIC sí dispone de simulación de la comunicación UART, como el PIC16F84A, no
dispone de dicho módulo integrado y no implementa dicha simulación.

CONEXIÓN DE PERIFÉRICOS

La conexión de los periféricos es bastante sencilla. Las líneas RA0-RA4 se conectan a


E0-E4 y RB4 se conecta con TxD del interfaz serie y RB5 con RxD del mismo interfaz.
Puede observarse un esquema de dichas conexiones en la Figura T6.2.

Figura T6.2. Conexión de líneas del PIC16F84A usadas en la experiencia.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez generado el fichero TALLER6.HEX mediante la compilación en el entorno


MPLAB IDE (Project → Build All), a continuación se accede al programa WinPic800
para la grabación del mismo en la placa PIC School.
Una vez grabado el programa y antes de la verificación de su comportamiento, se
coloca JP4 en la posición GP3 (2-3) y el conmutador principal se pone en RUN.
430 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura T6.3. Fotografía del montaje de la experiencia en la PIC School para la comunicación serie.

Al mismo tiempo, se deberá configurar el programa HyperTerminal de Windows,


que se encuentra en Inicio → Todos los programas → Accesorios → Comunicaciones →
HyperTerminal, para conseguir una comunicación serie a 9.600 baudios, 2 bits de stop,
sin control de flujo ni bits de paridad.
Al ejecutar el programa, aparecerá en pantalla el estado de los bits RA0-RA4, según
la Figura T6.3.

Figura T6.4. Recepción del estado de la puerta A en el PC a través del HyperTerminal.


COMUNICACIÓN RS-232 431

EL PROGRAMA EN C

A continuación, se proporciona el programa en C a partir del cual se obtiene el programa


ejecutable tras su compilación. Gracias a las rutinas ya creadas dentro del compilador, el
código es mucho más sencillo que la misma solución en Ensamblador.

#include <16f84.h>

#use delay(clock=4000000)
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_B4,RCV=PIN_B5,RESTART_
WDT)
#use fast_io(B)

#byte port_a = 5

main()
{
signed int i; // Variable con signo, ya que llegerá a valer <0

set_tris_a(0x1F);
set_tris_b(0x20);

while(1)
{
restart_wdt();
printf(“Puerta A:”);
for(i=4; i>=0; i--)
printf(“ RA%1u=%c”,i,bit_test(port_a,i)+‘0’);
putc(‘\n’);
putc(‘\r’);
}
}
o
Manejo del LCD 7.
TALLER

T7.1. INTRODUCCIÓN

A continuación, se presenta el desarrollo de una aplicación para el manejo del LCD de


la tarjeta de entrenamiento PIC School.
Para tratar de facilitar el manejo de este dispositivo, se ha incluido un fichero lla-
mado LCDXXX.INC que contiene varias rutinas con código de inicialización, envío de
datos, etc.

T7.2. TALLER 7: VISUALIZANDO MENSAJES POR EL LCD

ENUNCIADO

Mediante la comunicación serie estudiada en el taller anterior, se pretende recoger las


teclas pulsadas a través del PC, enviarlas a la PIC School, devolverlas a modo de eco al
PC y, por último, mostrarlas en el LCD. Una aplicación similar se resolvió en la sección
dedicada al PIC12F508.

MATERIALES NECESARIOS

• PIC School.
• PIC16F84A.
• Cables de conexión.
• Cable de conexión serie con el PC.
• Programa de comunicaciones HyperTerminal (u otro similar).

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

La Figura T7.1 resume el ciclo de ejecución del programa propuesto.

433
434 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura T7.1. Organigrama del Taller 7.

El programa hace uso de las rutinas almacenadas en el fichero RS232LOW.INC y


LCDXXX.INC. El código fuente del programa principal es el siguiente:

;
; TALLER 7
;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Ejemplo para PIC School. Comunicación serie gestionada por software.
;
List p=16F84 ;Tipo de procesador
include “P16F84.INC” ;Definiciones de registros internos
MANEJO DEL LCD 435

CLKIN equ .4000000 ;Frecuencia de trabajo


BAUDIOS equ .9600 ;Velocidad de comunicación
T_MODO equ 1 ;Transmite primero bit LSB
R_MODO equ 1 ;Recibir primero bit LSB
T_Nbit equ 8 ;Transmite caracteres de 8 bits
R_Nbit equ 8 ;Recibe caracteres de 8 bits
Sbit equ 2 ;Transmite 2 bits de stop
Lcd_var equ 0x0c ;Inicio variables para rutinas LCD
Rs232_var equ 0x0e ;Inicio variables para rutinas RS232
Líneas equ 0x13 ;Contador de líneas
Caracteres equ 0x14 ;Contador de caracteres

org 0x00 ;Vector de reset


goto Inicio
org 0x05 ;Salvar el vector de interrupción

include “RS232LOW.INC” ;Incluir rutinas de comunicación


include “LCD_CXX.INC” ;Incluir rutinas LCD

Inicio: bsf STATUS,RP0 ;Selecciona página 1 de datos


movlw b’10001111’ ;Preescaler de 128 para el WDT.
;Pull_Up Off
movwf OPTION_REG
movlw b’11101111’
movwf TRISB ;RB5 entrada y RB4 salida
bcf STATUS,RP0 ;Selecciona página 0 de datos

call UP_LCD ;Inicia E/S para el módulo LCD


call LCD_INI ;Inicialización del módulo LCD
movlw b’00001111’
call LCD_REG ;LCD on, Cursor On y Blink On

LCD_HOME movlw b’00000001’


call LCD_REG ;Borra LCD y Home
movlw .16
movwf Caracteres ;Inicia contador de caracteres
movlw .2
movwf Líneas ;Inicia contador de líneas

Loop clrwdt
bsf STATUS,RP0 ;Selecciona página 1
movlw b’11101111’
movwf TRISB ;RB5 entrada y RB4 salida
bcf STATUS,RP0

bsf Txd_pin ;Línea de transmisión a “1”


bsf Rxd_pin ;Línea de recepción a “1”

call RxD ;Espera a recibir un carácter


movf Rxdreg,W ;Lee el carácter recibido
movwf Txdreg
call TxD ;Retransmite carácter recibido (ECO)
call UP_LCD ;Reconfigura E/S para el LCD
movlw .13
436 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

subwf Rxdreg,W ;Mira si carácter recibido es CR


btfsc STATUS,Z ;No
goto LCD_HOME ;Sí, borra LCD
movf Rxdreg,W
call LCD_DATO ;Visualiza carácter en el LCD

decfsz Caracteres,F ;Decrementa contador de caracteres


goto Loop

movlw .16
movwf Caracteres ;Inicia contador de caracteres
movlw 0xc0
call LCD_REG ;Selecciona segunda línea del LCD
decfsz Líneas,F ;Se han completado 2 líneas
goto Loop ;No
goto LCD_HOME ;Sí, borrar pantalla

end ;Fin del programa fuente

A la hora de cargar este programa desde el CD que acompaña a la obra, deberá


crear un proyecto que incluya el fichero TALLER_7.ASM junto con los ficheros
RS232LOW.INC y LCDXXX.INC que contienen las rutinas necesarias para el ma-
nejo del LCD y de la interfaz serie.

ENSAMBLADO

Mediante la opción Project → Build All se compila el taller y se obtiene, entre otros, el
fichero del programa máquina ejecutable que tiene la extensión .HEX, que se grabará
sobre la PIC School una vez realizadas las conexiones permanentes.

CONEXIÓN DE PERIFÉRICOS

Para el montaje de este taller se utilizan practicamente todas las líneas disponibles y,
además, dos de ellas se multiplexan de forma que las patitas RB4 y RB5 deben conectar-
se a dos periféricos distintos. Dichas conexiones quedan resumidas en la Figura T7.2.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez generado el fichero TALLER_7.HEX mediante la compilación en el entorno


MPLAB IDE (Project → Build All), a continuación se accede al programa WinPic800
para la grabación del mismo en la placa PIC School.
Al mismo tiempo, se deberá configurar el programa HyperTerminal de Windows,
que se encuentra en Inicio → Todos los programas → Accesorios → Comunicaciones →
HyperTerminal, para conseguir una comunicación serie a 9.600 baudios, 2 bits de stop,
sin control de flujo ni bits de paridad.
MANEJO DEL LCD 437

Figura T7.2. Conexión de líneas del PIC16F84A usadas en la experiencia.

Figura T7.3. Fotografía del montaje de la experiencia en la PIC School el manejo de la pantalla LCD.
438 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Al ejecutar el programa, aparecerán en la pantalla LCD de la PIC School aquellas


teclas que se pulsen en el PC.

EL PROGRAMA EN C

A continuación, se proporciona el programa en C a partir del cual se obtiene el programa


ejecutable tras su compilación. Gracias a las rutinas ya creadas, el código es mucho más
sencillo que la misma solución en Ensamblador.

#include <16f84.h>

#use delay(clock=4000000)
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_B4, RCV=PIN_B5,
RESTART_WDT)

#use fast_io(A)
#use fast_io(B)
#include <lcd2.c>

#byte port_a=5
#byte port_b=6

main()
{
int x=1, y=1;
char c;

lcd_init();
lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK);

while(1)
{
// ATENCIÓN: Las funciones de gestión del LCD reprograman
// --------- las puertas A y B según sea necesario, por lo que
// antes de utilizar las funciones serie RS232 es
// necesario reprogramar las líneas TxD y RxD.

port_b = 0b00010000; // TxD a “1”. Inactiva.


set_tris_b(0b00100000); // PIN_B4 = Salida(TxD), PIN_B5 = Entrada(RxD)
c = getc();
putc(c);

lcd_gotoxy(x,y);
lcd_putc(c);
x++;
if(x>16)
{
x=1; y++;
if(y>2)
y=1;
}
}
}
o
Generación de números
aleatorios
8.
TALLER

T8.1. INTRODUCCIÓN
El azar es un factor importante en muchos aspectos de la vida. Es por eso por lo que a
menudo es necesario tratar de reproducir este hecho.
Este taller trata de generar un número aleatorio para poder utilizarlo en múltiples
aplicaciones:
• Simulación del lanzamiento de un dado.
• Obtener una pregunta de una base de datos al azar.
• Seleccionar un destino al azar.
• Etc.
Una de las técnicas más sencillas que existen para generar un número aleatorio consiste
en capturar el valor del TMR0 en un momento dado. Se debe tener en cuenta que dicho tem-
porizador está constantemente evolucionando en pequeños intervalos del orden de los dos
microsegundos. Es muy difícil, por tanto, predecir qué valor tendrá en un momento dado.

T8.2. TALLER 8: GENERANDO NÚMEROS AL AZAR

ENUNCIADO

Cada vez que se aplique un pulso por RA0, se genera un número binario de 8 bits aleatorio
que será visualizado sobre los ocho leds conectados en la Puerta B durante tres segundos.
Entre las diferentes técnicas, la empleada para obtener el número consiste en capturar el
valor del TMR0 en un momento dado.

MATERIALES NECESARIOS

• PIC School.
• PIC16F84A.
• Cables de conexión.

439
440 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

La Figura T8.1 resume el funcionamiento del programa propuesto. Principalmente, se con-


figuran las puertas como entrada y salida y se activa el TMR0. A continuación, se espera un
pulso en la patita RA0 y cuando se produce se muestra el valor del TMR0 por la Puerta B.

Figura T8.1. Organigrama del Taller 8.


GENERACIÓN DE NÚMEROS ALEATORIOS 441

El código fuente del programa principal es el siguiente:

;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;Generación de números aleatorios
;
;Cada vez que se aplique un pulso por RA0, se genera un número
;binario de 8 bits aleatorio que será visualizado sobre los 8 leds
;conectados en la Puerta B durante 3 segundos.
;Entre las diferentes ténicas, la empleada para obtener el número
;consiste en capturar el valor del TMR0 en un momento dado.

List p=16F84 ;Tipo de procesador


include “P16F84.INC” ;Definiciones de registros internos

Número equ 0x0c ;Número aleatorio


Delay_Cont equ 0x0d ;Contador de intervalos

org 0x00 ;Vector de Reset


goto Inicio
org 0x05 ;Salva vector de interrupción

;*****************************************************************
;Delay_20_ms: Esta rutina de temporización tiene por objeto eliminar
;el “efecto rebote” de los periféricos electromecánicos. Realiza un
;delay de 20 ms. Si el PIC trabaja a una frecuencia de 4 MHz, el TMR0
;evoluciona cada us. Si queremos temporizar 20000 us (20 ms) con un
;preescaler de 256, el TMR0 deberá contar 78 eventos (78 * 256). El valor
;78 equivale a 0x4e hex., y como el TMR0 es ascedente, habrá que cargar
;su complemento a 1 (0xb1 hex.).

Delay_20_ms:
bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw 0xb1 ;Complemento hex. de 78
movwf TMR0 ;Carga el TMR0
Delay_20_ms_1 clrwdt ;Refrescar el WDT
btfss INTCON,T0IF ;Rebosamiento del TMR0
goto Delay_20_ms_1 ;Todavía no
return

;******************************************************************
;Delay_var: Esta rutina de propósito general realiza una temporización
;variable entre 50 ms y 12.8”. Se emplea un preescaler de 256 y al TMR0
;se le carga con 195. La velocidad de trabajo es de 4 MHz y, por tanto, el
;TMR0 se incrementa cada us. De esta forma, el TMR0 debe contar 195
;eventos que con un preescaler de 128 hace una intervalo total de 50000
;us/50 ms (195 * 256). El valor 195 hay que expresarlo en hex. (c3), y
;como el TMR0 es ascendente, habrá que cargar su complemento (3C hex.).
;Dicho intervalo de 50 ms se repite tantas veces como indique la
;variable “Delay_cont”; es por ello que el delay mínimo es de 50 ms
;(“Delay_cont=1) y el máximo de 12.8” (Delay_cont=255).
442 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Delay_var:
bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw 0x3c ;Complemento hex. de 195
movwf TMR0 ;Carga el TMR0
Intervalo clrwdt ;Refrescar el WDT
btfss INTCON,T0IF ;Rebosamiento del TMR0
goto Intervalo ;Todavía no
decfsz Delay_Cont,F ;Decrementa contador de intervalos
goto Delay_var ;Repite el intervalo de 50 ms
return

Inicio clrf PORTB ;Borra los latch de salida


bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b’00011111’
movwf TRISA ;Puerta A se configura como entrada
movlw b’00000111’
movwf OPTION_REG ;Preescaler de 256 para el TMR0
bcf STATUS,RP0 ;Selecciona banco 0

Loop clrwdt ;Refrescar el WDT


btfss PORTA,0 ;Activado RA0
goto Loop ;Todavía no
movf TMR0,W ;Ahora sí.
movwf Número ;Captura valor TMR0 (N.o aleatorio)
call Delay_20_ms ;Elimina rebotes

RA0_1 clrwdt ;Refresca el WDT


btfsc PORTA,0 ;Desactivado RA0
goto RA0_1 ;Todavía no
movf Numero,W ;Se ha producido un impulso en RA0,
;se lee
movwf PORTB ;el valor capturado del TMR0
;(N .o aleatorio) y se saca por los leds
;de la Puerta B

movlw d’60’
movwf Delay_cont ;Inicia variable de temporización
call Delay_var ;Temporiza 3 segundos
clrf PORTB ;Desconecta las salidas
goto Loop

end ;Fin del programa fuente

ENSAMBLADO

Mediante la opción Project → Build All se compila el taller y se obtiene, entre otros, el
fichero del programa máquina ejecutable que tiene la extensión .HEX, que se grabará
sobre la PIC School una vez realizadas las conexiones permanentes.
Se puede simular este ejercicio de forma sencilla mediante el MPLAB SIM, aña-
diendo un escenario para la activación de RA0 y una monitorización de la Puerta B.
GENERACIÓN DE NÚMEROS ALEATORIOS 443

CONEXIÓN DE PERIFÉRICOS

La conexión de los periféricos necesarios es muy sencilla y se presenta en la Figura T8.2.


Es recomendable utilizar el pulsador E7 en vez de los interruptores E0-E3

Figura T8.2. Conexión de líneas del PIC16F84A usadas en la experiencia.

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez generado el fichero TALLER8.HEX mediante la compilación en el entorno


MPLAB IDE (Project → Build All), a continuación se accede al programa WinPic800
para la grabación del mismo en la placa PIC School.
Una vez puesto en marcha el taller, tan sólo será necesario accionar el pulsador E7.

EL PROGRAMA EN C

A continuación, se proporciona el programa en C a partir del cual se obtiene el programa


ejecutable tras su compilación.
444 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura T8.3. Fotografía del montaje de la experiencia en la PIC School.

// Generación de números aleatorios.

// Cada vez que se aplique un pulso por RA0, se genera un número


// binario de 8 bits aleatorio que será visualizado sobre los 8 leds
// conectados en la Puerta B durante 3 segundos.

// Entre las diferentes técnicas, la empleada para obtener el número


// consiste en capturar el valor del TMR0 en un momento dado.

#include <16f84.h>

#use delay(clock=4000000,RESTART_WDT)

#use fast_io(A)
#use fast_io(B)

#byte port_b = 6

main()
{
int número;
GENERACIÓN DE NÚMEROS ALEATORIOS 445

port_b = 0;
set_tris_a(0x1F);
set_tris_b(0x00);

setup_counters(RTCC_INTERNAL,RTCC_DIV_256);

while(1)
{
do {
restart_wdt();
} while(!input(PIN_A0));
delay_ms(20);

número = get_rtcc();

do {
restart_wdt();
} while(input(PIN_A0));
delay_ms(20);

port_b = Número;
delay_ms(3000);
port_b = 0;
}
}
o
Manejo de la memoria
EEPROM de datos
9.
TALLER

T9.1. INTRODUCCIÓN

El uso de la memoria EEPROM de datos puede resultar un recurso muy valioso dentro
de las aplicaciones diseñadas para microcontroladores. La característica principal que
hace interesante el uso de este recurso es su no volatilidad. Así, aplicaciones que nece-
siten parametrizarse, guardar un registro de lecturas realizadas en el tiempo, llevar un
número de serie, etc., podrán hacerlo de forma sencilla gracias a esta memoria.
El presente taller utiliza esta memoria que posee el PIC16F84A para grabar mensa-
jes que más adelante se visualizarán por la pantalla LCD.

T9.2. TALLER 9: GRABACIÓN DE MENSAJES


EN LA MEMORIA EEPROM

ENUNCIADO

Este taller pretende construir un generador de mensajes para el LCD. Con RA4 a 1, el
sistema funciona en el modo de programación; en este modo, el mensaje se graba en la
EEPROM de datos. Con RA4 a 0, se trabaja en el modo de reproducción; el mensaje
grabado en la EEPROM se visualiza sobre el LCD.
Cuando el interruptor RA3 está a nivel 1, en la posición actual del cursor del LCD
van apareciendo secuencialmente los distintos caracteres disponibles. Al ponerlo a 0,
se selecciona el carácter actual y se graba en la EEPROM. Al pasar nuevamente a 1, se
selecciona el siguiente carácter.

MATERIALES NECESARIOS

• PIC School.
• PIC16F84A.
• Cables de conexión.

447
448 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

Figura T9.1. Organigrama del Taller 9.


MANEJO DE LA MEMORIA EEPROM DE DATOS 449

El código fuente del programa principal es el siguiente:

;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;El manejo de la pantalla LCD y EEPROM. Un simple generador de mensajes.
;
;Este ejemplo pretende realizar un generador de mensajes para el LCD y
;manejo de la memoria EEPROM. Con RA4 a 1, el sistema está en el modo
;de programación; en este modo, el mensaje se graba en la EEPROM de
;datos. Con RA4 a 0 entramos en el modo de reproducción; el mensaje
;grabado en la EEPROM se visualiza sobre el LCD.
;Cuando el interruptor RA3 está a nivel 1, en la posición actual del
;cursor van apareciendo secuencialmente los distintos caracteres
;disponibles. Al ponerlo a 0, se selecciona el actual y se graba en la
;EEPROM. Al pasar nuevamente a 1, se selecciona el siguiente carácter.
;
;Debe recordarse que las líneas RA0-RA2 actúan ahora como salida de
;señales de control hacia el LCD. Al estar conectadas con sendos
;interruptores en la MicroPIC Trainer, éstos deben estar a nivel lógico
;1 permanentemente.
List p=16F84 ;Tipo de procesador
include “P16F84.INC” ;Definiciones de registros internos

Lcd_var equ 0x0c ;Variables (2) de las rutinas de


;manejo del LCD
Delay_cont equ 0x0e ;Variable para la temporización
Temporal_1 equ 0x0f ;Variable temporal
Temporal_2 equ 0x10 ;Variable temporal
Cur_pos equ 0x11 ;Posición del cursor
org 0x00 ;Vector de Reset
goto Inicio
org 0x05 ;Salva vector de interrupción

include «LCD_Cxx.inc” ;Incluye rutinas de manejo del LCD

;******************************************************************
;Delay_20_ms: Esta rutina de temporización tiene por objeto eliminar
;el “efecto rebote” de los periféricos electromecánicos. Realiza un
delay de 20 ms. Si el PIC trabaja a una frecuencia de 4 MHz, el TMR0
;evoluciona cada us. Si queremos temporizar 20000 us (20 ms) con un
;preescaler de 128, el TMR0 deberá contar 156 eventos (156 * 128). El
;valor 156 equivale a 9c hex., y como el TMR0 es ascedente, habrá que
;cargar su complemento a 1 (63 hex.).
Delay_20_ms:
bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw 0x63 ;Complemento hex. de 156
movwf TMR0 ;carga el TMR0
Delay_20_ms_1 clrwdt ;Refrescar el WDT
btfss INTCON,T0IF ;Rebosamiento del TMR0
goto Delay_20_ms_1 ;Todavía no
bcf INTCON,T0IF ;Ahora sí, reponer el flag
return
450 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

;******************************************************************
;Delay_var: Esta rutina de propósito general realiza una temporización
;variable entre 50 ms y 12.8”. Se emplea un preescaler de 256 y al TMR0
;se le carga con 195. La velocidad de trabajo es de 4 Mhz y, por tanto,
;el TMR0 se incrementa cada us. De esta forma, el TMR0 debe contar 195
;eventos que con un preescaler de 256 hace una intervalo total de 50000
;us/50 ms (195 * 256). El valor 195 hay que expresarlo en hex. (c3), y
;como el TMR0 es ascendente, habrá que cargar su complemento (3C hex.).
;Dicho intervalo de 50 ms se repite tantes veces como indique la
;variable “Delay_cont”; es por ello que el delay mínimo es de 50 ms
;(Delay_cont=1) y el máximo de 12.8” (Delay_cont=255).

Delay_var:
bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw 0x3c ;Complemento hex. de 195
movwf TMR0 ;Carga el TMR0
Intervalo clrwdt ;Refrescar el WDT
btfss INTCON,T0IF ;Rebosamiento del TMR0
goto Intervalo ;Todavía no
decfsz Delay_Cont,F ;Decrementa contador de intervalos
goto Delay_var ;Repite el intervalo de 50 ms
return
;******************************************************************
;EE_Write: Graba un byte en la EEPROM de datos. La dirección será la
;contenida en EEADR y el dato se le supone previamente metido en EEDATA

EE_Write bsf STATUS,RP0 ;Selecciona banco 1


bsf EECON1,WREN ;Permiso de escritura
movlw b’01010101’
movwf EECON2
movlw b’10101010’
movwf EECON2 ;Secuencia establecida por Microchip
bsf EECON1,WR ;Orden de escritura
bcf EECON1,WREN ;Desconecta permiso de escritura
Wait btfss EECON1,EEIF ;Testear flag de fin de escritura
goto Wait
bcf EECON1,EEIF ;Reponer flag de fin de escritura
bcf STATUS,RP0 ;Selección banco 0
return
;******************************************************************
;EE_Read: Leer un byte de la EEPROM. Se supone al registro EEADR cargado
;con la dirección a leer. En EEDATA aparecerá el dato leído.
EE_Read bsf STATUS,RP0 ;Selección de banco 1
bsf EECON1,RD ;Orden de lectura
bcf STATUS,RP0 ;Selección de banco 0
return
;******************************************************************
;
Inicio clrf PORTB ;Borra los latch de salida
bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b’00011000’
MANEJO DE LA MEMORIA EEPROM DE DATOS 451

movwf TRISA ;RA0-RA2 salidas, RA3-RA4 entradas


movlw b’00000111’
movwf OPTION_REG ;Preescaler de 256 para el TMR0

bcf STATUS,RP0 ;Selecciona banco 0


movlw 0x80
movwf Cur_Pos ;Posición inicial del cursor
call LCD_INI ;Secuencia de inicio del LCD
movlw b’00000001’
call LCD_REG ;Borra LCD y Home
movlw b’00001110’
call LCD_REG ;Envía instrucción: LCD ON, Cursor
;ON y blink OFF
clrf EEADR ;Dirección inicial de la EEPROM

Loop btfss PORTA,4 ;Modo programación


goto Reproducir ;No, modo de reproducción

Programar movlw 0x20


movwf Temporal_1 ;Primer carácter ASCII
Programar_1 btfss PORTA,3 ;Grabar el byte en EEPROM
goto Grabar ;Sí
movf Cur_Pos,W
call LCD_REG ;Coloca el cursor
movf Temporal_1,W
call LCD_DATO ;Visualiza el carácter
movlw .10
movwf Delay_cont
call Delay_var ;Temporiza 0.5 segundos
incf Temporal_1,F ;Siguiente carácter ASCII
btfss Temporal_1,7 ;Es el último carácter ASCII
goto Programar_1 ;No
goto Programar ;Sí, empezar desde el primero

Grabar call Delay_20_ms ;Elimina rebotes


decf Temporal_1,W
movwf EEDATA ;Dato a grabar en la EEPROM
call EE_Write ;Graba el carácter
incf EEADR,F ;Siguiente dirección EEPROM
clrf EEDATA
call EE_Write ;Graba 0x00
incf Cur_pos,F ;Siguiente posición del cursor
Grabar_1 clrwdt ;Refrescar el WDT
btfss PORTA,3 ;Esperar a que RA3 vuelva a 1
goto Grabar_1
call Delay_20_ms ;Eliminar rebotes
goto Loop ;Siguiente carácter del mensaje

Reproducir
movlw b’00000001’
call LCD_REG ;Borra LCD y Home
movlw b’00001100’
call LCD_REG ;LCD = ON, cursor = OFF
clrf EEADR ;Dirección inicial EEPROM
452 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Reproducir_0 clrwdt ;Refresco del WDT


call EE_Read ;Lee carácter de la EEPROM
movf EEDATA,F
btfsc STATUS,Z ;Es el último del mensaje (0x00)
goto Reproducir_1 ;Sí
movf EEDATA,W
call LCD_DATO ;Visualiza el carácter
incf EEADR,F ;Siguiente carácter
goto Reproducir_0

Reproducir_1 movlw .40


movwf Delay_cont
call Delay_var ;Mantiene el mensaje 2 segundos

;********************** SECUENCIA DE PARPADEO *********************


Blink movlw .6
movwf Temporal_2 ;Inicia contador de parpadeos
Blink_1 movlw b’00001100’
call LCD_REG ;LCD en ON
movlw .5
movwf Delay_cont
call Delay_var ;Temporiza 0.25 segundos
movlw b’00001000’
call LCD_REG ;LCD en OFF
movlw .5
movwf Delay_cont
call Delay_var ;Temporiza 0.25 segundos
decfsz Temporal_2,F
goto Blink_1 ;Repite el parpadeo
movlw .20
movwf Delay_cont
call Delay_var ;Temporiza 1 segundo
goto Loop

end ;Fin del programa fuente

Una de las partes del programa más interesante puede estar en las rutinas de gra-
bación de la memoria EEPROM. Dichas instrucciones se encuentran tras la etiqueta
Grabar.

ENSAMBLADO

Mediante la opción Project → Build All se compila el taller y se obtiene, entre otros, el
fichero del programa máquina ejecutable que tiene la extensión .HEX, que se grabará
sobre la PIC School una vez realizadas las conexiones permanentes.
Simular este ejercicio resulta complicado debido a la ausencia de la pantalla LCD
en el simulador.
MANEJO DE LA MEMORIA EEPROM DE DATOS 453

CONEXIÓN DE PERIFÉRICOS

La conexión de los periféricos necesarios es similar a otros talleres donde se ha usado el


LCD. La única salvedad es que en esta ocasión también se hace uso de los interruptores
E0 y E1 conectados a RA3 y RA4 para la selección y grabación de los caracteres. Estas
conexiones quedan resumidas en la Figura T9.2.

Figura T9.2. Conexión de líneas del PIC16F84A usadas en la experiencia.

Figura T9.3. Fotografía del montaje de la experiencia en la PIC School para el manejo de la EEPROM.
454 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez generado el fichero TALLER9.HEX mediante la compilación en el entorno


MPLAB IDE (Project → Build All), a continuación se accede al programa WinPic800
para la grabación del mismo en la placa PIC School.
En primer lugar, se deberá grabar el mensaje que después se mostrará en pantalla.
Para ello, se colocará el interruptor E1 conectado a RA4 a nivel lógico 1 y también RA3
a nivel lógico 1. En pantalla irán apareciendo los distintos caracteres ASCII disponibles.
Cuando se quiera seleccionar uno de ellos, se pasará RA3 a nivel lógico 0. Volviendo a
ponerlo en nivel lógico 1, el programa permitirá capturar el siguiente carácter. Es im-
portante iniciar la ejecución del programa con RA3 y RA4 a nivel lógico 1 para poder
observar adecuadamente el funcionamiento del programa.
Una vez seleccionados todos los caracteres deseados, pasando RA4 a 0 se mostrarán
todos los caracteres anteriores por el LCD.

EL PROGRAMA EN C

A continuación, se proporciona el programa en C a partir del cual se obtiene el programa


ejecutable tras su compilación.

// El manejo de la pantalla LCD y EEPROM.


#include <16f84.h>

#use delay(clock=4000000,RESTART_WDT)
#include <lcd2.c>
#use fast_io(A)
#use fast_io(B)

void Programacion()
{
char c=0x20;
int dir=0;
lcd_enviar(LCD_COMANDO, LCD_CLEAR);
lcd_enviar(LCD_COMANDO, LCD_HOME);
lcd_enviar(LCD_COMANDO, LCD_DISPLAY_ON); // Sin cursor
while(input(PIN_A4) && (dir < 16))
{
restart_wdt();
lcd_gotoxy(1,1);
lcd_putc(c);
delay_ms(500);
if(input(PIN_A3))
{
delay_ms(20);
write_eeprom(dir,c);
dir++;
lcd_gotoxy(dir,2);
lcd_putc(c);
MANEJO DE LA MEMORIA EEPROM DE DATOS 455

c = 0x20;
while(input(PIN_A3))
restart_Wdt();;
}
c++;
if(c>0x80)
c=0x20;
}
write_eeprom(dir,0);
}
void Reproducción(void)
{
char c;
int dir = 0;
int i;
lcd_enviar(LCD_COMANDO, LCD_CLEAR);
lcd_enviar(LCD_COMANDO, LCD_HOME);
lcd_enviar(LCD_COMANDO, LCD_DISPLAY_ON); // Sin cursor
c = read_eeprom(dir);
while(c != 0)
{
restart_wdt();
lcd_putc(c);
dir++;
c = read_eeprom(dir);
}
delay_ms(2000);

for(i=0; i<6; i++)


{
lcd_enviar(LCD_COMANDO, LCD_DISPLAY_ON);
delay_ms(250);

lcd_enviar(LCD_COMANDO, LCD_DISPLAY_OFF);
delay_ms(250);
}
}

main() {

lcd_init(); // Comandos de inicialización del LCD.


lcd_enviar(LCD_COMANDO, LCD_CURSOR_ON);
while(1)
{
restart_wdt();
if(input(PIN_A4))
Programacion();
else
Reproducción();
}

}
o
Un ejercicio completo.
La máquina de «Su Turno»
10.
TALLER

T10.1. INTRODUCCIÓN

Este taller trata de aglutinar el estudio de la mayor parte de periféricos y dispositivos del
PIC16F84A y su combinación para definir un taller completo.
Así, se plantea realizar una aplicación real como puede ser el de la máquina de Su
Turno, en la que se utilizarán gran parte de periféricos y dispositivos como son la memo-
ria EEPROM, la pantalla LCD, entradas y salidas, temporizadores, contadores, etc.

T10.2. TALLER 10: MÁQUINA DE «SU TURNO»

ENUNCIADO

Se trata de crear un taller que funcione como las máquinas tipo «Su Turno», habituales
en multitud de comercios. Sobre el LCD se visualizará el número del turno actual (dos
dígitos) que se incrementa con cada pulso aplicado por RA4. En la memoria EEPROM
del PIC16F84A se almacena el último número visualizado, de forma que ante un fallo
de alimentación se reanude la cuenta en el último número.
Cuando el sistema se emplea por vez primera, se visualiza 00.

MATERIALES NECESARIOS

• PIC School.
• PIC16F84A.
• Cables de conexión.

457
458 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

ORGANIGRAMA Y PROGRAMA FUENTE EN ENSAMBLADOR

Figura T10.1. Organigrama del Taller 10.


UN EJERCICIO COMPLETO. LA MÁQUINA DE «SU TURNO» 459

El código fuente del programa principal es el siguiente:

;
; Autor: Mikel Etxebarria
; (c) Microsystems Engineering (Bilbao)
;
;La memoria EEPROM de datos y el LCD. La máquina “SU TURNO”, versión
;mejorada.Se trata de emular el funcionamiento de las máquinas tipo “SU
;TURNO” habituales en múltiples comercios. Sobre el LCD se visualizará el
;número del turno actual (2 dígitos). Éste se incrementa a cada pulso
;aplicado por RA4. En la memoria EEPROM del PIC16F84 se almacena el
;último número visualizado, de forma que ante un fallo de alimentación,
;por ejemplo, se reanude la cuenta en el último número.
;Si se parte de que el sistema se emplea por vez primera, se visualiza
;el 00. Debe recordarse que las líneas RA0-RA2 actúan como salida de
;señales de control hacia el LCD. Al estar conectadas con sendos
;interruptores en la MicroPic Trainer, éstos deben estar a nivel lógico
;1 permanentemente.

List p=16F84 ;Tipo de procesador


include “P16F84.INC” ;Definiciones de registros internos

Lcd_var equ 0x0c ;Variables (2) para rutinas de


;manejo del LCD
Contador_L equ 0x0e ;Variable para el contador parte
;baja
Contador_H equ 0x0f ;Variable para el contador parte
;alta
Temporal_1 equ 0x10 ;Variable temporal
Temporal_2 equ 0x11 ;Variable temporal

org 0x00 ;Vector de Reset


goto Inicio
org 0x05 ;Salva vector de interrupción

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

;******************************************************************
;EE_Write: Graba un byte en la EEPROM de datos. La dirección será la
;contenida en EEADR y el dato se le supone previamente metido en EEDATA

EE_Write bsf STATUS,RP0 ;Selecciona banco 1


bsf EECON1,WREN ;Permiso de escritura
movlw b’01010101’
movwf EECON2
movlw b’10101010’
movwf EECON2 ;Secuencia establecida por Microchip
bsf EECON1,WR ;Orden de escritura
bcf EECON1,WREN ;Desconecta permiso de escritura
Wait btfss EECON1,EEIF ;Testear flag de fin de escritura
goto Wait
bcf EECON1,EEIF ;Reponer flag de fin de escritura
bcf STATUS,RP0 ;Selección banco 0
return
460 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

;******************************************************************
;EE_Read: Leer un byte de la EEPROM. Se supone al registro EEADR cargado
;con la dirección a leer. En EEDATA aparecerá el dato leído.

EE_Read bsf STATUS,RP0 ;Selección de banco 1


bsf EECON1,RD ;Orden de lectura
bcf STATUS,RP0 ;Selección de banco 0
return

;******************************************************************
;Según el valor contenido en el registro W, se devuelve el carácter
;ASCII a visualizar en el LCD

Tabla_Mensajes: movwf PCL ;Desplazamiento sobre la tabla

;********************************************************
;La directiva dt genera tantas instrucciones retlw como bytes o
;caracteres contenga cerrados entre “ ”

Mens_0 equ $ ;Mens_0 apunta al primer carácter


dt “Su TURNO es: ”, 0x00

;******************************************************************
;Delay_20_ms: Esta rutina de temporización tiene por objeto eliminar el
;“efecto rebote” de los periféricos electromecánicos. Realiza un delay
;de 20 ms. Si el PIC trabaja a una frecuencia de 4 MHz, el TMR0
;evoluciona cada us. Si queremos temporizar 20000 us (20 ms) con un
;preescaler de 128, el TMR0 deberá contar 156 eventos (156 * 128). El
;valor 156 equivale a 9c hex. y como el TMR0 es ascedente habrá que
;cargar su complemento a 1 (63 hex.).

Delay_20_ms:
bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
movlw 0x63 ;Complemento hex. de 156
movwf TMR0 ;carga el TMR0
Delay_20_ms_1 clrwdt ;Refrescar el WDT
btfss INTCON,T0IF ;Rebosamiento del TMR0 ??
goto Delay_20_ms_1 ;Todavía no
bcf INTCON,T0IF ;Ahora sí, reponer el flag
return

;******************************************************************
;Mensaje: Esta rutina visualiza en el LCD el mensaje cuyo inicio está
;indicado en el acumulador. El fin de un mensaje se determina mediante
;el código 0x00
Mensaje movwf Temporal_1 ;Salva posición de la tabla
Mensaje_1 movf Temporal_1,W ;Recupera posición de la tabla
call Tabla_Mensajes ;Busca carácter de salida
movwf Temporal_2 ;Guarda el carácter
movf Temporal_2,F
btfss STATUS,Z ;Mira si es el último
goto No_es_último
return
No_es_último
call LCD_DATO ;Visualiza en el LCD
UN EJERCICIO COMPLETO. LA MÁQUINA DE «SU TURNO» 461

incf Temporal_1,F ;Siguiente carácter


goto Mensaje_1

Inicio clrf PORTB ;Borra los latch de salida


bsf STATUS,RP0 ;Selecciona banco 1
clrf TRISB ;Puerta B se configura como salida
movlw b’00011000’
movwf TRISA ;RA0-RA2, salidas; resto, entradas
movlw b’00000110’
movwf OPTION_REG ;Preescaler de 128 para el TMR0
bcf STATUS,RP0 ;Selecciona banco 0

call LCD_INI ;Secuencia de inicio del LCD


movlw b’00001100’
call LCD_REG ;Envía instrucción LCD ON, Cursor
;OFF y Blink OFF

movlw Mens_0
call Mensaje ;Visualiza Mens_0 (Su TURNO es: )

clrf EEADR ;Selecciona dirección 00 de EEPROM

call EE_Read ;Lee byte de la EEPROM


movlw 0x09
subwf EEDATA,W
btfsc STATUS,C ;Contador_H mayor de 9
goto Ini_0 ;Sí, poner a 0 el contador
goto Ini_1 ;No
Ini_0 clrf Contador_L
clrf Contador_H ;Poner a 0 el contador
goto Loop

Ini_1 movf EEDATA,W


movwf Contador_H ;Actualiza Contador_H
incf EEADR,F ;Siguiente posición de la EEPROM
call EE_Read ;Lee el byte de la EEPROM
movlw 0x09
subwf EEDATA,W
btfsc STATUS,C ;Contador_L mayor de 9 ??
goto Ini_0 ;Sí, poner a 0 el contador
movf EEDATA,W
movwf Contador_L ;Actualiza Contador_L

Loop movlw 0x8d


call LCD_REG ;Posiciona el cursor del LCD
movf Contador_H,W
iorlw 0x30 ;Convierte a ASCII Contador_H
call LCD_DATO ;Visualiza Contador_H
movf Contador_L,W
iorlw 0x30 ;Convierte a ASCII Contador_L
call LCD_DATO ;Visualiza contador_L

Wait_0 clrwdt ;Refresca el WDT


btfss PORTA,4 ;RA4 está a “1”
goto Wait_0 ;No, esperar
call Delay_20_ms ;Eliminar rebotes
462 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Wait_1 clrwdt ;Refrescar el WDT


btfsc PORTA,4 ;RA4 está a “0”
goto Wait_1 ;No, esperar
call Delay_20_ms ;Eliminar rebotes. Ha habido pulso

incf Contador_L,F ;Incrementa contador_L


movlw .10
subwf Contador_L,W
btfss STATUS,Z ;Contador mayor de 9
goto Write ;No, actualizar EEPROM
clrf Contador_L ;Sí, Contador_L pasa a 0
incf Contador_H,F ;Incrementa Contador_H
movlw .10
subwf Contador_H,W
btfss STATUS,Z ;Contador_H mayor de 9
goto Write ;No, actualizar EEPROM
clrf Contador_H ;Sí, Contador_H pasa a 0

Write clrf EEADR ;Selecciona dirección 00 de EEPROM


movf Contador_H,W
movwf EEDATA
call EE_Write ;Graba Contador_H en la EEPROM
incf EEADR,F ;Dirección 01 de la EEPROM
movf Contador_L,W
movwf EEDATA
call EE_Write ;Graba Contador_L en la EEPROM
goto Loop

end ;Fin del programa fuente

ENSAMBLADO

Mediante la opción Project → Build All se compila el taller y se obtiene, entre otros, el
fichero del programa máquina ejecutable que tiene la extensión .HEX, que se grabará
sobre la PIC School una vez realizadas las conexiones permanentes.
Simular este ejercicio resulta complicado debido a la ausencia de la pantalla LCD
en el simulador.

CONEXIÓN DE PERIFÉRICOS

La conexión de los periféricos necesarios es similar a otros talleres donde se ha usado


el LCD. La única salvedad es que en esta ocasión también se hace uso del pulsador E7
(pulsador y no interruptor) conectado a RA4 para pasar de turno, tal como se muestra en
la Figura T10.2.
UN EJERCICIO COMPLETO. LA MÁQUINA DE «SU TURNO» 463

Figura T10.2. Conexión de líneas del PIC16F84A usadas en la experiencia.

Figura T10.3. Fotografía del montaje de la experiencia en la PIC School para máquina de «Su Turno».
464 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

GRABACIÓN DEL PROGRAMA Y VERIFICACIÓN


DEL FUNCIONAMIENTO

Una vez generado el fichero TALLER10.HEX mediante la compilación en el entorno


MPLAB IDE (Project → Build All), a continuación se accede al programa WinPic800
para la grabación del mismo en la placa PIC School.
Al arrancar el programa, pulsaremos el interruptor E7 y observaremos cómo va
cambiando el mensaje en la pantalla LCD visualizando los siguientes turnos. Si apaga-
mos la placa de entrenamiento PIC School, observaremos cómo al volver a encenderla
el programa continúa con el último turno guardado gracias al almacenamiento de dicho
dato en la memoria EEPROM.

EL PROGRAMA EN C

A continuación, se proporciona el programa en C a partir del cual se obtiene el programa


ejecutable tras su compilación.

#include <16f84A.h>

#use delay(clock=4000000,RESTART_WDT)

#use fast_io(A)
#use fast_io(B)

#include <lcd2.c>

int turno;

void Visualizar_Turno()
{
lcd_gotoxy(8,1);
lcd_putc(‘0’+turno/10);
lcd_putc(‘0’+turno%10);
}

main() {

lcd_init(); // Comandos de inicialización del LCD.

lcd_putc(“Turno: ”);
turno = read_eeprom(0);
if(turno<1 || turno>99)
turno = 1;
Visualizar_Turno();

while(1)
{
restart_wdt();
if(input(PIN_A4))
{
UN EJERCICIO COMPLETO. LA MÁQUINA DE «SU TURNO» 465

delay_ms(20);
turno++;
if(turno > 99)
turno = 1;

write_eeprom(0,turno);
Visualizar_Turno();

while(input(PIN_A4))
restart_wdt();
delay_ms(20);
}
}
}
TERCERA PARTE
Los módulos microcontroladores
BASIC Stamp y el lenguaje PBASIC
CAPÍTULO

Los sellos mágicos de Parallax


14

14.1. ACERCANDO LA TECNOLOGÍA


No suele ser habitual coincidir los planteamientos de dos generaciones ni la opinión de
los profesionales que se dedican a aplicar la tecnología y los que se encargan de enseñar-
la. Sin embargo, en este tema los autores coinciden plenamente: «Los módulos BASIC
Stamp de Parallax constituyen el camino más sencillo y asequible para diseñar sistemas
basados en microcontroladores».
En el mundo de la enseñanza es frecuente encontrar a jóvenes que estudian carreras
de ingeniería que no están convencidos de su vocación. La labor del ingeniero es una
de las más apasionantes a las que el ser humano puede dedicarse. Es el encargado de
diseñar e implementar los proyectos que le proponen. Es un gran creador de realidades
que sirven para mejorar la calidad de vida de todos. La vocación por la ingeniería debe
fraguarse en los jóvenes de quince a dieciocho años, y para conseguirlo, sólo hay que de-
mostrarles prácticamente en qué consiste nuestra profesión. Los módulos de Parallax no
precisan tener grandes conocimientos de informática ni de electrónica, basta un poco de
interés para generar en la juventud una inclinación y admiración por la ingeniería. Dotar
a un laboratorio universitario de formación profesional o IES de un equipo para aprender
a programar y diseñar con estos dispositivos exige muy poco presupuesto.
En el campo profesional, existen dos colectivos a los que estas herramientas les in-
teresa de sobremanera: el de los neófitos y el de los experimentados. Para los primeros,
entre los que se encuentran los aficionados que no han tenido oportunidad de conocer
la informática y la microelectrónica en profundidad, ésta es la única oportunidad para
adentrarse en este mundo del diseño programado sin necesidad de realizar un esfuerzo
intelectual ni económico. Para los técnicos experimentados, la filosofía del trabajo con
los módulos BASIC Stamp les proporciona la solución más eficaz para desarrollar sus
proyectos con la máxima rapidez y seguridad.
La necesidad de optimizar los tiempos de desarrollo de los proyectos que realizaban
basados en microcontroladores impulsó a dos ingenieros americanos, en la década de los
ochenta del siglo pasado, a construirse un módulo hardware que simplificase el desarrollo
electrónico y un lenguaje de programación que se adaptara a sus diseños y fuese asequible
para cualquier técnico con escasos conocimientos en electrónica e informática. Mejoraron
la productividad hasta tal punto que tuvieron la idea de comercializar las herramientas que

469
470 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

habían ideado. Y en 1992, Parallax ofertó a nivel mundial los módulos BASIC Stamp,
que adquirieron tal éxito de ventas que pasaron a erigirse como el producto estrella de
la empresa.
La gran aportación de los módulos BASIC Stamp reside en la conjunción de un
hardware seguro, completo y listo para acoplarle los dispositivos a controlar y un soft-
ware accesible a cualquier técnico al estar basado en el lenguaje más fácil del mundo: el
BASIC. El lenguaje PBASIC es una versión sencilla del BASIC, de pocas instrucciones
y adaptadas a las características de las aplicaciones y del microcontrolador. Al mezclarse
estos dos ingredientes con una política comercial de total información y libre disposición
de manuales, tutoriales y software de manejo, una excelente asistencia técnica y una red
de distribuidores profesionales en todo el mundo, estas herramientas se convierten en
el mejor sistema para iniciarse y desarrollar profesionalmente este apasionante trabajo
del diseño de proyectos con microcontrolador que va a precisar en un futuro cercano la
colaboración de muchos proyectistas.
Por estas razones hemos decidido incorporar en esta edición un par de capítulos
que traten del equipo físico y el sistema lógico de los módulos BASIC Stamp que
aporten una idea clara de las posibilidades de los mismos. Quienes se interesen en pro-
fundizar en el tema sólo deben acudir a los magníficos manuales de prácticas que tanto
en inglés como en castellano pueden recogerse de las páginas en Internet de Parallax
(www.parallaxinc.com) y de sus distribuidores, como Ingeniería de Microsistemas
Programados, S. L., para España (www.microcontroladores.com). Esperamos poder de-
mostrar que manejar estos módulos y confeccionar y ejecutar programas en PBASIC se
puede llevar a cabo sin apenas conocimientos, y por eso, estos capítulos se han insertado
antes de explicar la arquitectura del microcontrolador y su repertorio de instrucciones
máquina, temas que acometeremos más adelante para formar al lector sólidamente y así
permitirle desarrollar proyectos completos utilizando el lenguaje Ensamblador.

14.2. EL NACIMIENTO Y DESARROLLO DE UNA EMPRESA


El diseño ideal basado en microcontroladores exige un hardware semiacabado y un len-
guaje de programación sencillo y potente. La guinda al pastel la pondría la posibilidad de
poder grabar un programa, probarlo y volverlo a regrabar con las modificaciones opor-
tunas para poder comprobar su efectividad inmediatamente. Si estas tareas sólo precisan
un PC y se pueden realizar muchos miles de veces con el mismo módulo, dispondríamos
de una codiciada herramienta de trabajo.
Todas esas características las echaba de menos un joven estudiante llamado Chip
Gracey cuando en 1980 se formaba al mismo tiempo que enredaba con el lenguaje
BASIC sobre microcomputadores Apple II. Después, su afición le empujó a analizar
y modificar el código fuente de electrodomésticos y videojuegos para inventar nuevas
aplicaciones. Al acabar sus estudios en 1986, se asoció con su amigo Lance Walley para
abrir desde su casa la empresa Parallax, cuyos primeros catálogos estaban formados por
programadores para el microcontrolador 8051 y digitalizadores de sonido para Apple II.
Luego se fue agrandando la gama de productos construidos con microcontroladores,
especialmente del modelo PIC. Como su labor de ingeniería les exigía optimizar los
tiempos de desarrollo de los proyectos, idearon un hardware que contenía el núcleo del
sistema controlador (microcontrolador, reloj, reset, alimentación, memoria para progra-
ma y adaptación al PC). Dicho hardware se controlaba con un revolucionario lenguaje
de programación derivado del BASIC, pero con instrucciones específicas para aprove-
LOS SELLOS MÁGICOS DE PARALLAX 471

Figura 14.1. El módulo BS1-IC es el primero de la serie y el más sencillo.

char los recursos del microcontrolador. Lo llamaron PBASIC, tiene algo más de una
treintena de instrucciones y se aprende en muy poco tiempo. De esta manera resolvieron
sus problemas de diseño y pensaron que también podía servir para otros colegas, y así,
comercializaron en 1992 los módulos BASIC Stamp.
Los diminutos «sellos» microcontroladores que utilizan el lenguaje PBASIC se co-
mercializan en diversos modelos de diferente velocidad, capacidad de memoria, recursos
y precios (Fig. 14.1).
Parallax dispone de un módulo de poca potencia, que es el BS1-IC, basado en un mi-
crocontrolador PIC16C56 a 4 MHz, lo que permite la ejecución de dos mil instrucciones
PBASIC por segundo. Sólo tiene 16 bytes de RAM y ocho líneas de E/S. La capacidad
de la EEPROM donde se almacenan temporalmente los programas es de 256 bytes, que
admite hasta ochenta instrucciones PBASIC. Sólo soporta treinta y dos comandos de
dicho lenguaje y este módulo puede ser una excelente solución en el control y automati-
zación de productos y sistemas sencillos que exijan prestaciones mínimas.
El siguiente módulo, un poco más avanzado que el anterior, es el BASIC Stamp 2.
Existen dos presentaciones de este módulo. Una se llama BS2-IC, y es un módulo mon-
tado sobre una pequeña PCB con componentes de montaje superficial y la forma de un
circuito integrado DIP (su fotografía se muestra a la izquierda de la Figura 14.2). La otra
versión, OEM BS2-IC, dispone de componentes convencionales y un PCB más grande
con pines para conexión en una tarjeta protoboard, como puede apreciarse a la derecha
de la Figura 14.2. Ambos están basados en el microcontrolador PIC16C57 funcionando

Figura 14.2. El módulo más popular de Parallax en sus dos versiones: BS2-IC y OEM BS2-IC.
472 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

a 20 MHz, lo que permite la ejecución de unas cuatro mil instrucciones PBASIC por
segundo. La capacidad de la EEPROM es de 2 KB con posibilidad de almacenar progra-
mas de hasta quinientas instrucciones. El tamaño de la RAM es de 32 bytes, de los cuales
seis se dedican a E/S y veintiséis para las variables del programa. Soporta un repertorio
de treinta y seis comandos PBASIC y posee dieciséis líneas de E/S. Este módulo se ha
convertido en un estándar de la enseñanza y de la industria y a él, sobre todo en la versión
OEM BS2-IC, nos referiremos principalmente. En esta versión se usan componentes
convencionales sobre una tarjeta de circuito impreso que posibilita la comercialización
en kit y la fácil sustitución de los elementos averiados.

14.2.1. El módulo BS2e-IC


Este módulo utiliza un microcontrolador Scenix SX28AC a 20 MHz del fabricante UBICOM
y proporciona mayor capacidad de memoria RAM para guardar variables y de memoria
EEPROM para almacenar programas de hasta cuatro mil instrucciones. Además del re-
pertorio de comandos PBASIC que ejecutaba el módulo BS2-IC, éste soporta tres más:
GET, PUNT y RUN. En la Figura 14.3 se muestra una fotografía de este módulo.

Figura 14.3. Fotografía del módulo BS2e-IC.

14.2.2. El módulo BS2sx-IC


Con el mismo microcontrolador que el módulo anterior, pero funcionando a una frecuen-
cia de 50 MHz, este modelo puede ejecutar diez mil instrucciones PBASIC por segundo.
Acepta los mismos comandos que el módulo BS2e-IC.

Figura 14.4. Fotografía del módulo BS2sx-IC.


LOS SELLOS MÁGICOS DE PARALLAX 473

14.2.3. Módulos BS2p24-IC y BS2p40-IC


El BS2p24-IC utiliza el microcontrolador Scenix SX48AC a 20 MHz Turbo y está encapsu-
lado con veinticuatro patitas en formato DIP. Hay otro modelo de cuarenta patitas que sólo
se diferencia en que posee treinta y dos líneas de E/S en lugar de las dieciséis que posee el
de veinticuatro patitas. Tienen una elevadísima velocidad de ejecución de instrucciones y
soportan un repertorio de cincuenta y cinco comandos PBASIC, destacando algunos espe-
cíficos para la adaptación en paralelo de pantallas LCD, de adaptación de dispositivos I2C
y de componentes de Dallas Semiconductor conectados por la interfaz One Wire.

Figura 14.5. Fotografía del módulo BS2p24-IC.

Finalmente, se presenta una tabla que recoge las características más importantes de
los diversos módulos microcontroladores de Parallax.

BS2-IC
Característica BS1-IC BS2e-IC BS2sx-IC BS2p-IC
OEM BS2-IC
Encapsulado PCB de 14 patas SIP 24 patas DIP 24 patas DIP 24 patas DIP 24/40 patas DIP
Temperatura trabajo 0°-70 °C 0°-70 °C 0°-70 °C 0°-70 °C 0°-70 °C
Microcontrolador PIC16C56 PIC16C57 Scenix SX28AC Scenix SX28AC Scenix SX48AC
Frecuencia 4 MHz 20 MHz 20 MHz 50 MHz 20 MHz Turbo
Velocidad ejecución 2.000 4.000 4.000 10.000 12.000
instrucciones/s instrucciones/s instrucciones/s instrucciones/s instrucciones/s
RAM 16 bytes 32 bytes 32 bytes 32 bytes 38 bytes
Scratch Pad RAM N/A N/A 64 bytes 64 bytes 128 bytes
EEPROM 256 bytes- 2 KB-500 8 × 2 KB-4.000 8 × 2 KB-4.000 8 × 2 KB-4.000
80 instrucciones instrucciones instrucciones instrucciones instrucciones
Comandos PBASIC 32 36 39 39 55
Líneas E/S 8 16 + 2 serie 16 + 2 serie 16 + 2 serie 16/32 + 2 serie
Alimentación 5-15VDC 5-15VDC 5-12VDC 5-12VDC 5-12VDC

Figura 14.6. Tabla que muestra las características más importantes de los módulos microcontroladores.
474 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

14.3. EL MICROCONTROLADOR ES EL CEREBRO DEL SISTEMA


La estructura física de los módulos BASIC Stamp puede descomponerse en cinco
grandes bloques:
1. Sección del microcontrolador.
2. Sección de la memoria EEPROM.
3. Sección de la E/S de la información serie del PC.
4. Sección del regulador de tensión.
5. Sección de las líneas de E/S de información para el mundo exterior.

Figura 14.7. Desglose en cinco secciones principales del esquema del OEM BS2-IC.
LOS SELLOS MÁGICOS DE PARALLAX 475

Figura 14. 8. El microcontrolador gobierna todo el funcionamiento del módulo OEM BS2-IC: entrada/
salida de información serie del PC, carga y descarga de la memoria EEPROM y traduc-
ción y ejecución de las instrucciones PBASIC.

Ciñéndonos al módulo OEM BS2-IC, todas las operaciones que realiza están go-
bernadas por el microcontrolador PIC16C57. Se trata de un pequeño computador que
maneja datos de 8 bits y que actúa como el cerebro ejecutor de todas las misiones que se
encomienda al módulo. Las funciones que desarrolla el microcontrolador al ejecutar las
instrucciones de los programas son las siguientes:
1.a Entrada y salida de la información serie que proviene y se dirige al PC.
2.a Carga en la memoria EEPROM del programa PBASIC recibido desde el PC.
3.a Descarga de las instrucciones contenidas en la EEPROM sobre el PIC16C57
para su interpretación y ejecución.
4.a Introducción de información desde los periféricos externos y salida de los resultados
del procesamiento de los programas por las patitas del módulo hacia los periféricos.
La filosofía de un módulo BASIC Stamp comienza con la confección del programa en
PBASIC, mediante un editor apropiado, en el PC. Después, se transfiere dicho programa por
el puerto serie del PC al módulo de Parallax y se almacena completamente en una memoria
EEPROM independiente que dispone dicho módulo. A continuación, las instrucciones guar-
dadas en la EEPROM van dirigiéndose al microcontrolador una a una para ser interpretadas
y ejecutadas. El programa intérprete de PBASIC está grabado en la memoria de código del
PIC junto a otros que se encargan de supervisar la comunicación con el PC y la EEPROM.

14.3.1. Características generales del PIC16C57


Se trata de un microcontrolador de 8 bits, es decir, maneja datos de 1 byte de longitud.
Pone a disposición del usuario una memoria RAM para guardar datos de 72 bytes de
capacidad. Para contener el programa de trabajo posee una memoria no volátil de 2K
posiciones de 12 bits cada una, ya que cada instrucción máquina que reconoce el pro-
cesador tiene 12 bits de longitud. Esto significa que el máximo tamaño del programa
de instrucciones máquina (no PBASIC) es de 2.048. En el módulo OEM BS2-IC, el
programa que tiene grabado el PIC, además de contener el intérprete de PBASIC, se
476 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 14.9. Recursos fundamentales que caracterizan al PIC16C57.

encarga de recibir y transmitir la información serie con el PC, la escritura y lectura de la


EEPROM donde se guarda el programa PBASIC y el control de las patitas de entrada y
salida. Apréciese que en la memoria de programa del PIC no reside el programa PBASIC
editado en la pantalla del PC para la aplicación a desarrollar. Dicho programa se graba en
la EEPROM 24LC16B, desde donde el PIC va recibiendo una a una esas instrucciones y
las va traduciendo a instrucciones máquina y ejecutándolas.
Microchip dispone de una versión del PIC16C57 cuya memoria de programa es de
tipo EPROM que puede grabarla el usuario con un grabador y borrarla para volverla a
reescribir. El borrado hay que hacerlo sometiendo el circuito integrado a rayos ultravio-
leta, por lo que dispone de una ventana en su parte frontal. Hay una versión OTP, barata,
que la puede escribir el usuario una vez nada más. El módulo OEM BS2-IC soporta el
modelo PIC16CR57, cuya memoria es de tipo ROM, de sólo lectura. Se escribe en fábri-
ca y sólo se puede leer, si se permite.
Además de las memorias, el PIC16C57 posee un temporizador de 8 bits para con-
trolar el tiempo denominado TMR0. Para medir el tiempo, el TMR0 puede usar los
impulsos de reloj del microcontrolador o bien los que se introducen desde el exterior por
la patita RTCC. Como en el módulo de prácticas OEM BS2-IC no se usa el TMR0 con
impulsos externos, la patita RTCC se envía a tierra.
Finalmente, el PIC16C57 maneja veinte líneas de E/S implementadas físicamente
mediante veinte patitas por las que se envía y se recibe información a y desde el exterior
a lo largo del procesamiento de las instrucciones del programa. Las líneas de E/S se dis-
tribuyen en grupos que se llaman Puertas A, B y C. La Puerta A sólo tiene cuatro líneas
que se implementan físicamente por las patitas RA0-RA3, la Puerta B tiene ocho con las
patitas RB0-RB7 y la Puerta C otras ocho con RC0-RC7.

14.3.2. Diagrama de conexionado


Aunque el PIC16C57 se comercializa con varios encapsulados, en el OEM BS2-IC se
emplea el DIP de veintiocho patitas en doble hilera. Este módulo utiliza componentes
convencionales y cualquier avería la puede resolver el propio usuario sustituyendo el que
LOS SELLOS MÁGICOS DE PARALLAX 477

Figura 14.10. Diagrama de conexionado del PIC16C57 con encapsulado DIP.

se halla averiado; por eso, se ha elegido en esta descripción de carácter docente. Incluso
se puede comprar el módulo en kit y soldar sus componentes para ponerlo en marcha. El
microcontrolador se inserta sobre un zócalo soldado a la PCB y también puede reempla-
zarse rápidamente.
Las líneas de E/S para intercambio de información con el mundo exterior ocupan
veinte patitas. Las cuatro de la Puerta A (RA0-RA3) están destinadas a la recepción
y transmisión de la información serie al PC y a la escritura y lectura de la memoria
EEPROM. Las dieciséis patitas restantes, ocho de la Puerta B y ocho de la Puerta C,
quedan a disposición de los periféricos a gobernar en la aplicación. Dichas líneas están
disponibles en el módulo OEM BS2-IC por las patitas denominadas P0 a P15.
Por las patitas VDD y VSS se recibe la tensión de alimentación, que puede estar com-
prendida entre +2,5 y +5,5 VDC y que en el módulo de prácticas se usa +5 VDC, obte-
nida de la salida del regulador de tensión.
Los terminales de un resonador cerámico que oscila a 20 MHz se aplican a las pati-
tas OSC1 y OSC2 para conseguir que el microcontrolador funcione a dicha frecuencia.
Hay dos patitas que no se conectan (NC). La patita RTCC se usa para controlar los
tiempos del temporizador TMR0 mediante la frecuencia externa introducida por esta pa-
tita; como en el módulo 0EM BS2-IC no se emplea esta posibilidad, se conecta a tierra.
Finalmente, la patita MCLR# (#: señal activa con nivel bajo) sirve para producir un reset
o reinicialización del programa cuando se produce un flanco descendente.

14.4. LA MEMORIA EEPROM. PRESENTACIÓN DEL BUS I2C


En todos los módulos BASIC Stamp existe una memoria EEPROM independiente en la
que se vuelca el programa PBASIC confeccionado en el PC. Después, desde la EEPROM
se van pasando una a una las instrucciones al PIC para que allí se interpreten y se ejecuten.
Esta memoria EEPROM se comunica con el PIC en formato serie y según el protocolo de
comunicación del bus I2C.
478 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 14.11. Pueden existir 128 dispositivos conectados al bus I2C y en todo momento hay uno que
actúa como maestro.

El bus I2C (correctamente debe escribirse I2C) lo desarrolló Philips Corporation


para resolver sus propias necesidades en la interconexión de circuitos integrados. I2C
significa «interconexión de circuitos integrados». Su gran éxito radica en su sencillez, ya
que sólo emplea dos líneas para comunicarse con los dispositivos que intervienen en este
protocolo y que pueden llegar a 128 en un mismo sistema. La línea bidireccional SDA
transfiere los bits de información serie y la SCL los impulsos de reloj para sincronizar la
información entre quien la manda y la recibe. En cada momento hay un dispositivo que
funciona como maestro y que determina las características de la transferencia y genera
los impulsos de reloj por SCL.
Cada uno de los 128 posibles esclavos responde a una dirección formada por 7 bits
(A0-A6) y el maestro, al iniciar una transferencia, es lo primero que envía en su comu-
nicación. Después de especificar el maestro la dirección del esclavo con el que se quiere
comunicar, envía la orden de lectura o escritura y luego otras complementarias. Existen
muchos circuitos integrados con diversas funciones para el bus I2C y los fabricantes
determinan por hardware la dirección a la que responden y sus características técnicas.
Sin embargo, es habitual que la dirección a la que responde un circuito integrado I2C
no esté totalmente definida. Se suelen dejar sin especificar las líneas de menos peso de
LOS SELLOS MÁGICOS DE PARALLAX 479

Figura 14.12. Como en el módulo OEM BS2-IC sólo se emplea un circuito integrado como memoria
EEPROM, las tres líneas de dirección (A0-A2) se conectan a tierra.

la dirección para poder colocar varios circuitos integrados iguales en el sistema, respon-
diendo cada uno a una dirección distinta. En el caso de la memoria 24LC16B, tiene sin
definir las tres líneas de menos peso de la dirección (A0-A2), cuyo valor debe determinar
el usuario por hardware, enviando las patitas correspondientes a tierra o a VDD. En el mó-
dulo OEM BS2-IC, como sólo se utiliza un circuito integrado EEPROM, las tres líneas
de la dirección se mandan a tierra.
La patita WP (protección contra escritura) si se conecta a la tensión positiva VDD
(+5 V) no se puede escribir la EEPROM y funciona como una memoria ROM de sólo
lectura. En el módulo OEM BS2-IC se deben escribir constantemente nuevos programas
y por eso dicha patita se conecta a tierra.

14.4.1. Lectura y escritura de la memoria EEPROM


La EEPROM 24LC16B se carga con el programa «tokenizado» PBASIC generado en el
PC por el editor STAMP BASIC y que llega al conector DB9 del módulo Parallax desde
el puerto serie. La grabación en la EEPROM se producirá mediante la introducción en
serie de la correspondiente información a través de la patita SDA. Una vez cargado el
programa PBASIC en la EEPROM, operación controlada por el PIC, las instrucciones
salen una a una hacia el microcontrolador para que las interprete y las ejecute.
Tanto la entrada y grabación del programa PBASIC en la EEPROM como la poste-
rior lectura de las instrucciones las controla el microcontrolador que actúa como maestro
en el bus I2C, por lo que también es él quien genera los impulsos de reloj por la línea
SCL para sincronizar la transferencia.
La información procedente del PC se introduce al módulo de Parallax por el conector
DB9 y atraviesa un circuito de adaptación de niveles con tres transistores (Q1, Q2 y Q3)
para finalmente cargarse en la EEPROM a través del PIC16C57. El circuito transistori-
zado actúa de forma bidireccional porque existen instrucciones PBASIC, como DEBUG,
que envían información del módulo al PC. La misión de dicho circuito transistorizado
es transformar los niveles con los que trabaja el puerto serie del PC (RS-232-C), que
480 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 14.13. El microcontrolador controla la recepción y transmisión de la información con el PC y la


memoria EEPROM.

implementan los niveles lógicos con +12 y –12 VDC a niveles TTL (+5 y 0 VDC), con
los que trabaja el PIC16C57.
Las patitas RA2 y RA3 del microcontrolador se encargan de manejar la información
serie que entra y sale por el circuito transistorizado desde o hacia el PC. Las instruc-
ciones PBASIC recibidas desde el PC las carga el microcontrolador en la EEPROM
enviándolas por la línea SDA del bus I2C. RA0 y RA1 soportan las dos líneas del bus
I2C en el PIC.
Las cuatro patitas de la Puerta A del PIC16C57, RA0-RA3, se destinan a soportar la
comunicación del módulo con el PC y con la memoria EEPROM.

14.5. SECCIÓN DE LA ENTRADA/SALIDA SERIE DEL PC


En el PC se edita el programa PBASIC y por su puerto serie se envía al módulo de Parallax.
También desde dicho módulo hay ocasiones en las que se envía información al PC, como
sucede con la instrucción DEBUG.
La entrada y salida de esta información serie con el PC se acondiciona mediante un
circuito transistorizado que recoge y entrega el microcontrolador por sus patitas RA2 y
RA3. Las instrucciones PBASIC que llegan desde el PC las recoge el PIC por su patita
RA2 y luego las envía por RA0 a la EEPROM, donde queda almacenado.

14.6. SECCIÓN DEL REGULADOR DE TENSIÓN


Está compuesta por el circuito integrado LM2940-5.0, que es un regulador de tensión a
+ 5 VDC. También existe un condensador electrolítico auxiliar. Por la patita Vin del regu-
lador se recibe una tensión que puede oscilar entre +5,5 y +15 VDC. Por la patita de sali-
LOS SELLOS MÁGICOS DE PARALLAX 481

Figura 14.14. El regulador proporciona una tensión de + 5 VDC por Vdd cuando se aplica por su patita
Vin una tensión comprendida entre + 5,5 y + 15 VDC.

da VOUT se obtiene una tensión Vdd de + 5 VDC regulada que se emplea para alimentar
los circuitos electrónicos del módulo y también se pone a disposición de los periféricos
externos por la patita 20 del módulo.
Cuando se disponga de una fuente de alimentación que proporcione los +5 VDC
precisos se puede eliminar la intervención del regulador LM2940-5.0, evitando el calor
que disipa. De esta manera no se introduce nada por Vin y se aplican los +5 VDC de la
fuente por la patita 20 del módulo (Vdd).

14.7. SECCIÓN DE LAS LÍNEAS DE E/S PARA INFORMACIÓN


CON EL MUNDO EXTERIOR
El módulo OEM BS2-IC dispone de veinte patitas por las que se aplica la alimentación
eléctrica, la señal de reset y las líneas de E/S de las Puertas B y C del microcontrolador
y por las que se recibe y se saca la información que se maneja en el procesamiento de las
instrucciones del programa.
Las patitas Vdd, GND y Vin corresponden a las descritas del regulador de tensión
LM2940-5.0. Cuando por la patita Vin se aplica una tensión comprendida entre +5,5 y
+15 VDC, el citado regulador alimenta al circuito electrónico del módulo con +5 VDC
regulados y presenta dicha tensión en la patita Vdd (20) del módulo para su posible uti-
lización por circuitos o periféricos externos. Cuando se dispone de +5 VDC regulados,

Figura 14.15. Distribución y denominación de las veinte patitas de conexión del módulo OEM BS2-IC.
482 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 14.16. Las dieciséis patitas P0-P15 del módulo OEM BS2-IC se corresponden con las líneas de
E/S de las Puertas B y C del PIC16C57.

se pueden aplicar entre Vdd y GND, dejando sin conectar Vin para alimentar al circuito
electrónico sin funcionar el regulador.
La patita 17 del módulo, denominada MCLR#, se usa para reinicializar el programa
cuando desde el exterior se aplica un nivel bajo.
El módulo OEM BS2-IC dispone de dieciséis patitas para E/S de información que
se denominan P0-P15 y sirven para conectar los periféricos que se desean controlar. En
realidad, el PIC16C57 que soporta el módulo tiene veinte líneas de E/S que se agrupan en
tres grupos, que reciben el nombre de Puertas A, B y C. La Puerta A consta de cuatro lí-
neas (RA0-RA3) que se utilizan para la recepción y transmisión de información serie con
el PC y para realizar la transferencia con la memoria EEPROM que almacena el progra-
ma PBASIC. Cada una de las Puertas B y C posee ocho líneas de E/S (RB0-RB7 y RC0-
RC7) que son las que quedan disponibles para el usuario en el módulo de Parallax.
Las líneas digitales de E/S del microcontrolador son configurables por software y
pueden actuar como entrada o salida. Incluso a lo largo de una aplicación pueden cam-
biar su actuación si lo permiten los periféricos a los que controla.

14.7.1. La importancia del consumo


Cada línea de E/S del microcontrolador puede absorber una corriente máxima de 25 mA
y puede suministrar hasta 20 mA. Además, el conjunto de líneas de una puerta tiene una
corriente máxima admisible tanto si entra como si sale. Las puertas B y C pueden absorber
un máximo de 150 mA entre todas las líneas de cada puerta y pueden suministrar un máximo
de 100 mA. Esta limitación obliga a controlar la máxima corriente que disipa cada puerta.
Según la conexión de los periféricos, la corriente puede ser de entrada o de salida. Así,
si en el interruptor de la figura se conecta el terminal libre a tierra, cuando está abierto por la
patita del microcontrolador se absorbe una corriente que dependerá del valor de la resistencia.
LOS SELLOS MÁGICOS DE PARALLAX 483

Figura 14.17. La máxima corriente absorbida cuando el interruptor está abierto es de 0,5 mA y se puede
llegar a un máximo de 25 mA.

Cuando por una patita del microcontrolador se gobierna el encendido y apagado de


un led, la resistencia de absorción determina la corriente que circula y la luminosidad
del mismo.

Figura 14.18. La corriente máxima suministrada desde la patita del PIC16C57 es en este caso 17 mA.
Cada línea de E/S puede suministrar un máximo de 20 mA.

Si se eleva el valor de la resistencia colocada en serie con el diodo led, la corriente


que lo atraviesa baja. Así, si la resistencia fuese de 270 ohmios, la corriente quedaría
reducida a 11 mA y descendería la luminosidad del led.
Cuando se colocan varios periféricos en las patitas del módulo hay que comprobar
las limitaciones existentes por línea y por puerta para evitar averías y fallos de funciona-
miento. Así, por ejemplo, si interesa colocar ocho leds en las líneas de una puerta, como
el valor máximo de la corriente suministrada es de 100 mA, el consumo de cada led
debería ser inferior a 13 mA.
PBASIC, el lenguaje CAPÍTULO

más fácil del mundo.


Prácticas y programas 15

15.1. BASIC: EL LENGUAJE MÁS FÁCIL DEL MUNDO


Aprender a manejar el lenguaje BASIC para computadoras es una labor muy sencilla, tan
simple como escribir (en inglés). En BASIC, las instrucciones coinciden con el nombre en
inglés de la operación que se debe llevar a cabo. Por ejemplo, escribir o visualizar un valor
en la pantalla utiliza la instrucción PRINT; para introducir por el teclado un valor se em-
plea la instrucción INPUT, y si se desea realizar una suma, basta con poner el signo + de
la misma. Un lenguaje para una computadora es un conjunto de instrucciones y comandos
que la máquina es capaz de interpretar y ejecutar. Fíjese en un programa en BASIC.

10 INPUT a ‘se introduce por teclado a


20 INPUT b ‘se introduce por teclado b
30 PRINT a+b ‘se visualiza el valor a+b
40 END ‘fin del programa

Este programa se entiende sólo. Se introduce por el teclado, en primer lugar, el valor
de la variable a; después, se introduce por el mismo procedimiento el valor de b, y final-
mente, se visualiza el resultado de la operación a + b. Consiste en una sucesión ordenada
de las instrucciones que debe ejecutar el computador para ir procesando los datos hasta
alcanzar el resultado deseado.
El lenguaje BASIC fue desarrollado en 1960 por J. Kemeny y T. Kurtz con la finali-
dad de simplificar la programación.

15.1.1. Ventajas e inconvenientes


Se trata de un lenguaje muy sencillo que está orientado a las personas y por eso sus
instrucciones recuerdan las palabras inglesas con las que se describe la operación que
realizan. Dado su parecido con el álgebra elemental, es muy útil para resolver problemas
técnicos de ingeniería, aunque también es muy cómodo en las aplicaciones que manejan
mucha información literal, típico en los negocios.

485
486 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Las grandes ventajas del lenguaje BASIC desgraciadamente están acompañadas por
algunos defectos que suelen empujar a los programadores profesionales a repudiarlo.
Como mayor defecto, se dice que es un lenguaje «no estructurado» o «no procedural»,
de lo cual la mayor culpa la tiene la instrucción GOTO, que es capaz de desviar el flujo
de la ejecución de instrucciones a cualquier parte del programa impidiendo la posibili-
dad de dividir la tarea en trozos pequeños e independientes.
Las normas puristas de la programación proponen la confección del software en
base a un pequeño «programa principal» que se compone de llamadas a rutinas y pro-
cedimientos autónomos e independientes en los que se descompone la tarea a resolver.
Para implementar esta estructura es necesario poder salir con facilidad del programa
principal a las rutinas traspasando algunos parámetros, así como también poder regre-
sar a dicho programa principal desde la rutina trayendo resultados obtenidos en esta
última. El lenguaje BASIC no soporta completamente estas estructuras en los progra-
mas.

15.1.2. Los lenguajes usados para microcontroladores


«Un microcontrolador es un computador metido dentro de un circuito integrado.»
Son computadores muy pequeños y baratos, por lo que se utilizan para controlar
muchos productos comunes en los que se halla incrustado dentro de los mismos, como
sucede con el teléfono móvil, el teclado y el ratón del computador, etc. Además, al ser
tan pequeños, tienen una potencia limitada y sólo sirven para realizar una tarea.
En el siglo XXI, la realización de proyectos para aplicar los microcontroladores en el
gobierno y automatización de multitud de productos y procesos se presenta como una in-
gente labor que va a requerir la colaboración de multitud de profesionales y va a ofrecer
una oportunidad inigualable para quienes estén preparados adecuadamente.
Los proyectos con microcontroladores exigen un trabajo con hardware consistente
en adaptar las patitas del microcontrolador a los periféricos externos que hay que con-
trolar. Además, también requieren la confección de un programa con las instrucciones
precisas para que su ejecución origine el procesamiento de la información para obtener
los resultados apetecidos. Para construir los programas de los microcontroladores se
usan tres lenguajes:

1. Lenguaje Ensamblador, de bajo nivel


2. Lenguaje C, de alto nivel
3. Lenguaje BASIC, de alto nivel

El lenguaje Ensamblador se dice que es de bajo nivel porque sus instrucciones son
exactamente las que el procesador sabe interpretar y ejecutar. En realidad, el computador
digital sólo acepta instrucciones en código binario y el ensamblador facilita su escritura
al programador permitiendo expresarlas mediante «nemónicos», que son tres o cuatro
letras significativas que referencian, en inglés, la operación que conlleva la instrucción.
Por ejemplo, una instrucción que «mueve» un dato de un sitio (A) a otro (B), en Ensam-
blador, se escribe MOV A,B.
El problema surge en el ensamblador por la poca potencia de las instrucciones que
es capaz de ejecutar el procesador. Normalmente, las correspondientes a los microcon-
troladores de 8 bits que manejamos en este libro consisten en sumar, restar, hacer ope-
raciones lógicas AND, OR, XOR, también rotar un dato de 8 bits, moverlo de un sitio a
PBASIC, EL LENGUAJE MÁS FÁCIL DEL MUNDO 487

otro y muy poquito más. Si deseamos hacer una multiplicación hay que confeccionar un
programa que para conseguirlo repita las sumas las veces necesarias. Es un lenguaje de
«bajo nivel». El programa Ensamblador lo único que hace es traducir los nemónicos con
los que se escriben las instrucciones a código binario para que el procesador sea capaz
de interpretarlas y ejecutarlas.
Los lenguajes de «alto nivel» tienen instrucciones más potentes: saben multiplicar,
sacar la raíz cuadrada y realizar funciones y operaciones mucho más complicadas que las
que pueden hacer las instrucciones de la máquina. Pero como la máquina es la misma,
la realización de esas instrucciones se tiene que hacer con programas de instrucciones
elementales. Cada instrucción de alto nivel se convierte en un programita de instruccio-
nes de bajo nivel. Por eso, para que el procesador pueda ejecutar las instrucciones de un
lenguaje de alto nivel, precisa otro programa que las descomponga en las instrucciones
de bajo nivel, correspondientes. A estos programas se les llama compiladores. Los
compiladores se encargan de traducir un programa confeccionado con instrucciones de
alto nivel a otro equivalente con instrucciones de bajo nivel. Hay una variante de estos
programas, que reciben el nombre de intérpretes, que realizan dicha traducción, pero
instrucción por instrucción, o sea, traducen una instrucción de alto nivel en las corres-
pondientes de bajo nivel que ejecuta el procesador y a continuación pasan a la siguiente.
El microcontrolador de los módulos BASIC Stamp contiene en su memoria de programa
un intérprete de PBASIC.
Desarrollar programas en lenguaje Ensamblador exige un conocimiento profundo
de la arquitectura interna del procesador, lo que requiere una buena base en electrónica,
así como formación en informática. Las instrucciones de bajo nivel realizan operaciones
directamente con los elementos existentes en el interior del procesador.
El lenguaje C es de tipo profesional, muy completo y potente, pero su manejo exige
una buena formación en informática. También es muy conveniente conocer la arquitec-
tura interna del procesador y en muchas ocasiones hay que combinarlo con el lenguaje
Ensamblador.
El lenguaje BASIC tiene potentes instrucciones que se escriben igual que se deno-
minan en inglés y su manejo no requiere conocimientos de arquitectura de procesadores,
de electrónica y tampoco de informática. Es para todos. ¿Entiende este programa dise-
ñado para calcular el área de un círculo introduciendo el radio?

10 INPUT R ‘se introduce el radio


20 LET S=3.14*R*R ‘se calcula el área
30 PRINT S,R ‘se escribe S y R
40 END ‘fin del programa

Como se ha estudiado en el capítulo anterior, el modo de funcionamiento de los


módulos BASIC Stamp está basado en depositar el programa confeccionado en PBASIC
y editado en el PC en una memoria EEPROM que puede leerse y borrarse para volver a
escribirse un millón de veces. Después, en el interior del módulo y de forma automática,
se va pasando el programa ordenadamente, instrucción a instrucción, a un microcontro-
lador PIC en cuya memoria está grabado un programa intérprete que traduce cada ins-
trucción PBASIC en las instrucciones máquina correspondientes y procede a su ejecu-
ción. Los dos elementos principales del módulo BASIC Stamp son el microcontrolador,
grabado con el intérprete PBASIC en fábrica, y la EEPROM, que contiene el programa
editado en el PC.
488 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

El programa para editar (Editor) los programas en PBASIC en el PC y posterior-


mente transferirlos al módulo microcontrolador está disponible libremente en el sitio de
Parallax en Internet. Hay una versión para MS-DOS y otra para Windows, que es la que
recomendamos emplear y que conviene actualizarla de cuando en cuando.

15.2. EL EDITOR STAMP


Al ejecutar cualquiera de los dos programas de edición en el PC disponibles en Internet o
en el CD, para MS-DOS (STAMP2.EXE) o para Windows (STAMPW.EXE), aparece en
la pantalla del PC una ventana para la confección de programas. Con los iconos se pue-
den abrir programas ya guardados, salvar los que se crean, mandar ejecutarlos, depurar
la edición, depurar el programa de diversas maneras y un sinfín de otras funciones que
sólo la práctica permite su dominio (Fig. 15.1).

Figura 15.1. Ventana del editor STAMP en la versión para Windows.

15.2.1. Formato de edición de programas en PBASIC


Etiquetas. Los programas en PBASIC no numeran las líneas y es una de las novedades
más interesantes respecto a los BASIC clásicos. Cuando se desea hacer mención a una
instrucción, como no tiene número, se le antepone una etiqueta identificativa.
El nombre de las etiquetas no puede coincidir con el de las instrucciones o variables
usadas, su primer carácter no puede ser un número y la primera vez que se usan deben
estar seguidas por dos puntos (:).

Constantes. Se pueden declarar en decimal, hexadecimal, binario y ASCII.


Ejemplos:
PBASIC, EL LENGUAJE MÁS FÁCIL DEL MUNDO 489

100 ‘así se expresa en decimal


$64 ‘así se expresa en hexadecimal
%01101100 ‘así se expresa en binario
«HOLA» ‘así se expresa en ASCII

Variables y constantes. Para facilitar la programación se utilizan etiquetas para hacer


referencia a variables y a constantes. Se emplea el comando CON. Ejemplos:

Nombre CON n.° pin


led CON 0
zumbador CON 15

Comentarios. Detrás de cada instrucción se recomienda escribir algún comentario


para facilitar la finalidad de la misma. El procesador ignora los comentarios. Delante del
comentario se puede poner REM o un apóstrofe. Ejemplos:

high 0 REM saca un nivel alto por Pin 0


low 5 ‘saca un nivel bajo por el Pin 5

Operaciones aritméticas y lógicas. En la tabla de la Figura 15.2 se indican los sím-


bolos utilizados para las diversas operaciones posibles en PBASIC.

Símbolo Operación
+ Suma
- Resta
* Multiplicación
** Multiplicación (devuelve más 16 bits)
/ División
// División (devuelve el resto)
MIN Limita el valor más bajo
MAX Limita el valor más alto
DIGIT Retorna el dígito especificado de un número
<< Desplazamiento de bits a la izquierda
>> Desplazamiento de bits hacia la derecha
REV Inverso de los bits del número especificado
& AND
| OR
^ XOR

Figura 15.2. Tabla con los símbolos para expresar las operaciones aritméticas y lógicas del lenguaje
PBASIC.
490 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Nombre Nombre Nombre Nombre


Notas
palabra byte nibbles bits
INS INL INA, INB IN0 - IN7 Pines de entrada
INH INC, IND IN8 - IN15
OUTS OUTL OUTA, OUTB OUT0 - OUT7 Pines de salida
OUTH OUTC, OUTD OUT8 - OUT15
DIRS DIRL DIRA, DIRB DIR0 - DIR7 Control de la dirección
DIRH DIRC, DIRD DIR8 - DIR15 de los pines E/S
W0 B0
B1
W1 B2
B3
W2 B4
B5
W3 B6
B7
W4 B8
B9
W5 B10
B11
W6 B12
B13
W7 B14
B15
W8 B16
B17
W9 B18
B19
W10 B20
B21
W11 B22
B23
W12 B24
B25

Figura 15.3. Tabla con la distribución de las primeras posiciones de la memoria de datos del procesador. Las
tres primeras están reservadas y pueden manejarse con tamaño palabra, byte, nibble y bit.

En la realización de las operaciones, el PBASIC opera siempre de izquierda a dere-


cha; por ejemplo, 5 + 4 * 7 se lleva a cabo como (5 + 4) * 7.

Reserva de posiciones en la memoria de datos. El lenguaje PBASIC reserva las


primeras posiciones de la memoria de datos del procesador. Las tres primeras palabras
se reservan para pines de entrada INS, que es un registro que almacena la información
PBASIC, EL LENGUAJE MÁS FÁCIL DEL MUNDO 491

de los pines de E/S cuando son entrada; pines de salida OUTS, registro que contiene la
información a sacar por los pines que actúan como salida, y bits de direccionamiento
de los pines DIRS. Si a un bit de este último registro se carga con un 0, el pin correspon-
diente queda configurado como entrada, mientras que si se carga con un 1, actúa como
salida. Las trece siguientes palabras (W0-W12) que pueden utilizarse en tamaño byte
(B0-B25) están disponibles para guardar variables y datos del usuario en los programas
(véase la tabla de la Figura 15.3 en la que se expresa esta distribución de la memoria).
El módulo BS2-IC tiene dieciséis pines de entrada y salida disponibles para el usua-
rio en donde se pueden colocar los periféricos a controlar. Para configurar a los dieciséis
pines como salida hay que escribir en el programa: DIRS = %1111111111111111.

15.3. EL REPERTORIO DE INSTRUCCIONES PBASIC


Se ofrece un breve resumen del cometido de las instrucciones del PBASIC para los len-
guajes del Intérprete del módulo BS2-IC. Manejándolas prácticamente se llega a domi-
narlas en muy poco tiempo. Para obtener una completa información de las instrucciones
PBASIC le recomendamos acuda al Manual del PBASIC en Internet y al tutorial «¿Qué
es un microcontrolador?».

Instrucciones de E/S digitales

INPUT
Configura como entrada al pin que se especifica. Ejemplo, INPUT 4.
OUTPUT
Configura como salida al pin que indica la instrucción.
REVERSE
Invierte la configuración del pin especificado. Si era salida, lo hace entrada, y viceversa.
LOW
Configura al pin indicado como salida con nivel bajo. Ejemplo, LOW 4.
HIGH
Configura al pin especificado como salida con nivel alto.
TOGGLE
Invierte el estado del pin que se especifica.
PULSIN
Mide el tiempo de un pulso de entrada con resolución de 2 microsegundos y con un tiempo
máximo de 0,13107 segundos.
PULSOUT
Genera un pulso de salida por el pin especificado en la instrucción con la duración que se
indica en una constante y se expresa en unidades de 2 microsegundos.
BUTTON
Elimina los rebotes que se producen por la apertura y cierre de interruptores.
COUNT
Cuenta el número de ciclos en un pin especificado por un período de milisegundos, guar-
dando dicho valor en una variable resultado.
492 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

XOUT
Genera los códigos de control necesarios para dispositivos que usan la comunicación X-10,
como los dispositivos TW523 y TW513 de Parallax.
SHIFTIN
Los bits en serie que se reciben por un pin los convierte a formato paralelo y los guarda en
una variable resultado.
SHIFTOUT
El valor de una expresión de datos la envía al exterior en serie por el pin que se especifica
en la instrucción.

Instrucciones de salto

IF...THEN
Analiza una condición, y si se cumple, bifurca el programa a la instrucción que se especifica por
una etiqueta. Si no se cumple, se pasa a la siguiente instrucción. Ejemplo, IF A=5 THEN INICIO.
BRANCH
Bifurca el flujo de control a la instrucción que se determina mediante una etiqueta. Puede
manejar varias etiquetas y un indicador que elige la deseada.
GOTO
Salta a la dirección indicada por una etiqueta.
GOSUB
Almacena la dirección de la siguiente instrucción y salta a la instrucción especificada por la
etiqueta que contiene la instrucción, que es el inicio de una subrutina.
RETURN
Retorno de subrutina. Esta instrucción se coloca al final de una subrutina y su ejecución
provoca un salto a la dirección almacenada en el GOSUB más reciente.

Instrucciones para bucles repetitivos

FOR...NEXT
Repite un bucle de instrucciones comprendidas entre FOR y NEXT cambiando cada vez el
valor de una variable hasta que alcanza el valor final.

Instrucciones numéricas

LOOKUP
Busca un dato especificado por un índice y lo guarda en una variable.
LOOKDOWN
Compara un valor con los de una lista, y si lo encuentra, almacena el índice en una variable.
RANDOM
Sirve para generar un número seudoaleatorio imprevisto.
PBASIC, EL LENGUAJE MÁS FÁCIL DEL MUNDO 493

Instrucciones de E/S serie síncrona

I2CIN
Entrada de datos serie en comunicación I2C.
I2COUT
Salida de datos en serie en comunicación I2C.

Instrucciones de E/S serie asíncrona

SERIN
Sirve para recibir datos en serie en formato RS232-C. Para BS1, se permiten frecuencias
de 300, 600, 1.200 y 2.400 baudios, y para BS2, cualquiera hasta 50 K baudios.
SEROUT
Envía datos en serie en formato RS232-C a las mismas frecuencias indicadas para la
instrucción SERIN.

Instrucciones de E/S analógica

PWM
Por un pin se genera impulsos de anchura variable y luego pasa el pin a entrada. También
puede emplearse para generar tensiones analógicas entre 0 y 5 V mediante una resisten-
cia y un condensador.
RCTIME
Mide el tiempo de carga o descarga de un conjunto R-C. Se puede emplear para medir el
valor de potenciómetros.

Instrucciones de control del tiempo

PAUSE
Cuando se ejecuta, produce una pausa de tiempo que puede alcanzar los 65.536 segundos.

Instrucciones de control de sonido

FREQOUT
Genera una o dos ondas senoidales de las frecuencias que se indiquen comprendidas
entre 0 y 32.767 Hz.
DTMFOUT
Sirve para generar pulsos o tonos telefónicos DTFM.
494 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Instrucciones de control de energía

NAP
Sirve para reducir el consumo de energía haciendo descansar al sistema cortos períodos
de tiempo.
SLEEP
Pasa al modo de reposo al microcontrolador durante un período comprendido entre 1 y
65.536 segundos. El consumo se reduce a 50 microsegundos.
END
Se reduce el consumo de energía hasta que se interrumpa o se reinicie la alimentación al PC.

Instrucciones de acceso a la EEPROM

DATA
Almacena datos en la EEPROM antes de la descarga del programa PBASIC.
READ
Lee un byte de la EEPROM y lo deposita en una variable.
WRITE
Escribe un byte de una variable en una posición de la EEPROM.

Instrucciones para la depuración del programa

DEBUG
Sirve para enviar desde el módulo BASIC Stamp el valor de variables y estados del mismo
a la pantalla del PC para visualizarlos y conocerlos. Se utiliza para labores de depuración.

15.4. EL PRIMER PROGRAMA


Vamos a ir describiendo con esquemas y fotos la realización de un primer programa muy
sencillo. Para la implementación física de este y otros ejercicios didácticos hemos escogi-
do al laboratorio de prácticas Universal Trainer, que, junto con el módulo PBASIC, con-
tienen todos los elementos necesarios para desarrollar multitud de proyectos propuestos en
sus manuales, así como diseño reales. En el volumen II de la obra Laboratorio de prácti-
cas de microelectrónica, editada por McGraw-Hill, se describe una colección de ejercicios
con los mencionados recursos que posibilitan formarse en el diseño real de proyectos con
microcontrolador, tanto en PBASIC como en Ensamblador (módulo PIC1) cómoda y rápi-
damente con un coste muy asequible. Todos estos materiales los comercializa Ingeniería
de Microsistemas Programados, S. L. (www.microcontroladores.com).
Con objeto de adaptar el módulo OEM BS2-IC a las características específicas del
entrenador Universal Trainer, se han realizado unas pequeñas modificaciones en el co-
nexionado de sus pines. A esta tarjeta ligeramente transformada la llamaremos OEM BS2-
IC/MSE (Fig. 15.4) y tiene las siguientes peculiaridades:
PBASIC, EL LENGUAJE MÁS FÁCIL DEL MUNDO 495

Figura 15.4. Fotografía de la tarjeta OEM BS2-IC/MSE.

1.a Las líneas P0 a P15 y la línea RES disponen de espadines para conexionado
horizontal que sitúa al módulo paralelo a la protoboard del entrenador en lugar
de vertical. De esta forma, se leen mejor los pines y se puede cerrar la tapa del
maletín con el circuito montado.
2.a Para diferenciar y facilitar la conexión de la alimentación, las patitas Vin, Vss y
VDD disponen espadines verticales sobre la tarjeta PCB.

Figura 15.5. La tensión estabilizada de la fuente del entrenador Universal Trainer se aplica a la salida
del regulador (VDD) evitando el funcionamiento del LM2940.
496 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 15.6. Detalle del conexionado del módulo OEM BS2-IC con el puerto serie del PC.

3.a Se proporciona un conector para los tres espadines de alimentación, que dispone
de dos cables: uno rojo, que va a VDD, y otro negro, que va a Vss. El espadín
Vin queda sin conexión. El cable rojo hay que conectarlo al terminal +5 V de la
fuente de alimentación regulada del entrenador. El cable negro se conecta a la
GND de dicha fuente del Universal Trainer. Cuando se dispone de una fuente
estabilizada de +5 VDC se evita el funcionamiento del regulador LM2940 del
módulo OEM BS2-IC y su calentamiento, ya que al disponer de tensión de +5 V
estabilizada en el entrenador se aplica directamente a VDD, como se aprecia en el
esquema de la Figura 15.5.

La adaptación del módulo OEM BS2-IC con la puerta serie del PC se realiza con un
cable con dos conectores DB9 en sus extremos que tienen cortocircuitados los termina-
les 6 y 7 para la detección automática del puerto usado (véase la Figura 15.6).

Primera parte: ¿Nos reconoce y obedece el módulo?

A) Inserte la tarjeta OEM BS2-IC/MSE en el protoboard del laboratorio Universal


Trainer. Conecte el borne de la alimentación de +5 V de la fuente del entrenador
a la patita VDD del módulo OEM BS2-IC/MSE (cable rojo) y el borne de tierra o
GND del entrenador a la patita Vss del módulo (cable negro). Asegúrese de que
los cables de conexión hagan buenos contactos.
B) Inserte con seguridad a presión el conector que une el puerto serie del PC con
el del módulo. El resultado de estas dos últimas operaciones puede apreciarse
en la foto de la Figura 15.8.
C) Ejecute el programa stampw.exe y en la pantalla que aparece teclee un progra-
ma muy simple que sólo tiene una instrucción:

DEBUG «Soy tu esclavo. Ejecutaré todas tus órdenes en PBASIC»


PBASIC, EL LENGUAJE MÁS FÁCIL DEL MUNDO 497

Figura 15.7. Apariencia del primer programa en la ventana del editor.

Figura 15.8. Fotografía del módulo BS2-IC/MSE insertado en la placa protoboard del laboratorio Uni-
versal Trainer y conectado a la fuente de alimentación del mismo.
498 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

D) Ejecute este mínimo programa activando RUN o con el icono representativo de


PLAY.
E) Si la comunicación se establece entre el sistema y el PC y todo funciona correcta-
mente, aparecerá la pantalla del depurador y en ella se visualizará el mensaje:

Soy tu esclavo. Ejecutaré todas tus órdenes en PBASIC

Segunda parte: Comprobar que el módulo emite sonidos

A) Conectar el zumbador del Universal Trainer con la línea de entrada/salida P4


del módulo OEM BS2-IC/MSE. El zumbador produce un pitido cuando se le
aplica un nivel lógico alto.
B) Sobre la pantalla del editor se va a teclear un programa que haga pitar al zum-
bador. El programa sólo va a utilizar unas pocas instrucciones muy sencillas
con las que se va a aplicar un nivel alto al zumbador a través del pin P4 (HIGH
4) durante 1.000 milisegundos (PAUSE 1000) y luego se le va a silenciar apli-
cando un nivel bajo (LOW 4) durante un tiempo igual. Para repetir este pitido
cada segundo, se vuelve a empezar el programa desde la primera instrucción
(GOTO INICIO).
Tenga en cuenta que el PBASIC no distingue entre minúsculas y mayúsculas,
por lo que puede poner como quiera el nombre de sus instrucciones. Nosotros le
recomendamos que use las mayúsculas para expresar las palabras reservadas
del PBASIC. Detrás de las instrucciones se pueden añadir aclaraciones o co-
mentarios que hagan más comprensible el programa. Dichos comentarios deben
ir precedidos por un apóstrofe «’» y que la máquina los ignora.
C) Al ejecutar el programa, el zumbador debe sonar durante un segundo y estar
en silencio durante el siguiente, repitiendo continuamente esta tarea. Durante
un segundo, el zumbador pita porque por el pin 4 le aplica un nivel alto. En el
siguiente segundo está en silencio porque por el pin 4 sale un nivel bajo. La ins-
trucción DEBUG presenta en la pantalla el nombre de este ejercicio.

DEBUG “Generación de sonidos”


INICIO: HIGH 4 ‘El pin 4 es salida con nivel alto
PAUSE 1000 ‘Temporización de 1.000 ms
LOW 4 ‘El pin 4 es salida con nivel bajo
PAUSE 1000 ‘Temporización de 1.000 ms
GOTO INICIO ‘Salta a la etiqueta INICIO

A continuación, proponemos al lector una serie de prácticas propuestas en el mó-


dulo PBASIC y que vienen recogidas en el volumen II de Laboratorio de prácticas de
microelectrónica, de la editorial McGraw-Hill.
PBASIC, EL LENGUAJE MÁS FÁCIL DEL MUNDO 499

15.5. PRÁCTICA 1: MANEJANDO LUZ Y SONIDO


15.5.1. Objetivos
Comprender, manejar instrucciones, habituarse a trabajar con las herramientas hardware
y software y ejecutar programas en PBASIC para gobernar periféricos digitales simples.

15.5.2. Fundamentos teóricos básicos e instrucciones empleadas


En esta práctica se va a combinar el funcionamiento del zumbador con un diodo led
luminiscente. El Universal Trainer dispone de un zumbador y ocho diodos led. Cada
uno de estos sencillos periféricos digitales dispone de una entrada en la que si se aplica
un nivel lógico alto, el zumbador pita y el led se enciende. Los circuitos eléctricos de
conexionado de dichos periféricos se presentan en la Figura 15.9.

Figura 15.9. Esquemas eléctricos de conexionado del zumbador y el led en el Universal Trainer.

Se describen de forma resumida las instrucciones PBASIC que se van a utilizar:

HIGH pin: Configura como salida al pin especificado y saca un nivel alto por él.
LOW pin: Configura como salida al pin especificado y saca un nivel bajo por él.
PAUSE valor: Retardo o pausa de un tiempo en milisegundos indicado en valor.
DEBUG xxx: Visualiza en la pantalla del depurador el valor indicado en xxx.

15.5.3. Esquema electrónico


En la Figura 15.10 se ofrece el esquema de conexionado del módulo OEM BS2-IC/MSE
con los periféricos y la fuente de alimentación del Universal Trainer.
500 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Figura 15.10. Esquema de conexionado de las patitas del módulo OEM BS2-IcMSE con los terminales
de los periféricos y los de la fuente de alimentación.

15.5.4. Materiales necesarios


• Entrenador Universal Trainer.
• Módulo OEM BS2-IC/MSE.
• Cable serie para conectar el PC.
• Cables de conexión.

15.5.5. Montaje práctico


La fotografía de la Figura 15.11 muestra la disposición del módulo Parallax sobre el
Universal Trainer y los cables que conectan los dos periféricos que se emplean en esta
práctica y la fuente de alimentación.

Figura 15.11. Fotografía de conexionado del módulo Parallax en el Universal Trainer.


PBASIC, EL LENGUAJE MÁS FÁCIL DEL MUNDO 501

15.5.6. Desarrollo de la práctica y ejecución del programa


En esta experiencia se trata de encender durante dos segundos el diodo led conectado en
la patita P0; mientras tanto, durante ese tiempo, el zumbador está en silencio. Luego, du-
rante tres segundos, el zumbador produce un pitido mientras el led permanece apagado.
Además, el programa debe visualizar en la pantalla del depurador el nombre del ejercicio
«LUZ Y SONIDO», así como el mensaje de «ILUMINA» mientras el led está encendido
y el mensaje «PITA» cuando suena el zumbador. El programa propuesto es:

debug “LUZ Y SONIDO” ‘Visualiza el mensaje


‘entre comillas
inicio: debug “ILUMINA” ‘Visualiza mensaje
high 0 ‘Saca 1 por P0 (LED)
low 15 ‘Saca un 0 por P15 (ZUMBADOR)
pause 2000 ‘Retardo de 2 segundos
debug “PITA” ‘Visualiza mensaje
high 15 ‘Saca un 1 por P15 (ZUMBADOR)
low 0 ‘Saca 0 por P0, apaga LED
pause 3000 ‘Retardo de 3 segundos
goto inicio ‘Salta a instrucción de la etiqueta

Una vez editado el programa, conecte el PC al módulo OEM BS2-IC, que ya es-
tará conexionado con los cables a la fuente y a los periféricos, y conecte la energía al
Universal Trainer. Ejecute el programa y si todo sale bien, se enciende dos segundos el
led y luego pita durante 3 segundos el zumbador. Además, en la pantalla del depurador
aparece el mensaje ILUMINA cuando está encendido el led y el mensaje PITA cuando
el zumbador suena. Pero todos estos mensajes y el primero de LUZ Y SONIDO salen
todos seguidos de la siguiente forma:
LUZ Y SONIDOILUMINAPITAILUMINAPITAILUMINAPITAILUMINA...

15.5.7. Trabajo personal


El resultado ofrecido en la pantalla del depurador en el programa anterior no es muy
atractivo y le proponemos que le mejore. Para ello, cada vez que salga un mensaje va a
indicar que se produzca un retorno de carro (cr) para que el siguiente mensaje salga en la
línea siguiente. Además, detrás del mensaje PITA va a colocar dos retornos de carro para
diferenciar cada secuencia de encendido y pitido. Las instrucciones de debug quedarán
modificadas de la siguiente forma:

debug «LUZ Y SONIDO»,cr


debug «ILUMINA»,cr
debug «PITA»,cr,cr

Haga las correcciones sintácticas en el programa y ejecútelo. Deberán quedar pre-


sentados los mensajes uno en cada línea y dejando dos líneas entre cada secuencia de
luz y sonido.
502 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

Si todo le sale bien, cambie los retardos y procure modificar el programa para obte-
ner diferentes resultados. Si tiene problemas, ¡enhorabuena! Va a aprender mucho más y
debe ser capaz de alcanzar los objetivos marcados. Pero recuerde, no está solo: Ingeniería
de Microsistemas Programados, S. L., y Parallax le pueden ayudar (www.microcontrola-
dores.com).

15.6. PRÁCTICA 2: CONTROL DE UN SEMÁFORO SONORO

15.6.1. Objetivos

Manejar periféricos de entrada que gobiernen el funcionamiento de otros de salida.


Emplear instrucciones de salto condicional y de salto a subrutina y aprender a definir
variables.

15.6.2. Fundamentos teóricos básicos y nuevas instrucciones


En esta práctica vamos a regular el comportamiento de dos diodos led que simulan las
luces roja y verde de un semáforo. Además, cuando se encienda la luz verde, un zum-
bador pitará durante cortos períodos. Finalmente, existe un interruptor que permite el
funcionamiento del semáforo cuando introduce un nivel alto por una patita del módulo
microcontrolador. Si introduce un nivel bajo, el semáforo tiene encendida la luz roja y
el zumbador está en silencio. En la Figura 15.12 se muestra un esquema del conexio-
nado del periférico de entrada, o sea, el interruptor utilizado por primera vez en esta
colección de ejemplos.

Figura 15.12. Esquema de conexionado del interruptor en la tarjeta de control en el Universal Trainer.
PBASIC, EL LENGUAJE MÁS FÁCIL DEL MUNDO 503

El programa del semáforo sonoro utiliza las siguientes nuevas instrucciones:

— IN0: La patita o pin 0 del módulo queda asignada como entrada digital.
— IF <condición> THEN <etiqueta>: Si se cumple la condición, se pasa a ejecu-
tar la instrucción de la etiqueta, y si no se cumple, se ejecuta la siguiente.
— GOSUB <etiqueta>: Se salta a una subrutina que comienza en la instrucción
de la etiqueta.
— RETURN: Es una instrucción que se pone al final de una subrutina y que
devuelve el control de la ejecución a la siguiente instrucción después de
GOSUB.
— x VAR bit: No es una instrucción PBASIC, sino un comando del editor para
indicar que la variable x tiene el tamaño de 1 bit.

15.6.3. Esquema electrónico


En la Figura 15.13 se muestra el conexionado de las patitas del módulo OEM BS2-IC/
MSE con los periféricos del diseño y las salidas de la fuente de alimentación del Uni-
versal Trainer.

Figura 15.13. Conexionado de las patitas del módulo microcontrolador con los periféricos residentes en
el entrenador Universal Trainer.

15.6.4. Materiales necesarios


• Entrenador Universal Trainer.
• Módulo OEM BS2-IC/MSE.
• Cable serie para conexión al PC.
• Cables de conexión.
504 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

15.6.5. Montaje práctico


En la fotografía de la Figura 15.14 se presenta la disposición del módulo microcontrola-
dor sobre la tarjeta protoboard del entrenador y el conexionado con los periféricos y la
fuente de alimentación.

Figura 15.14. Fotografía del montaje de la experiencia del semáforo sonoro.

15.6.6. Desarrollo de la práctica y ejecución del programa


Las especificaciones del proyecto son las siguientes: hay que gobernar las luces roja
y verde de un semáforo que están simuladas con diodos led que se conectan a las pa-
titas P15 (roja) y P14 (verde) del módulo. Para avisar a los viandantes de que pueden
atravesar la calle cuando la luz verde está encendida, hay un zumbador que pita en esa
circunstancia a intervalos de 400 milisegundos. Normalmente, el semáforo sólo deja
pasar los coches y tiene encendida la luz roja de peatones y el zumbador en silencio.
Cuando se desea poner en marcha para pasar los viandantes, se desplaza un interruptor
que, al introducir un nivel lógico alto por la patita P0 del módulo, inicia la secuencia de
encendido de la luz verde durante dos segundos, mientras la roja está apagada. Luego se
produce el encendido de la roja y el apagado de la verde durante dos segundos y se repite
continuamente el ciclo hasta que se desplaza el interruptor para introducir un nivel bajo
y el semáforo pasa a su condición habitual de luz roja encendida y verde apagada. Cuando
la luz verde está encendida, el zumbador pita durante 400 ms y se calla durante los 400 ms
siguientes hasta finalizar los dos segundos.
PBASIC, EL LENGUAJE MÁS FÁCIL DEL MUNDO 505

El programa comentado es el siguiente:

x var bit ‘x es una variable de tamaño bit


inte: x=in0 ‘x toma el valor de la entrada P0
if x=1 then ini ‘si x = 1 salta a etiqueta ini
high 15 ‘si x no es 0, enciende luz roja
low 14 ‘Apaga luz verde
goto inte ‘Salta a la instrucción de
‘etiqueta inte
ini: low 15 ‘Apaga luz roja
high 14 ‘Enciende luz verde
gosub pit ‘Salta a subrutina de etiqueta pit
high 15 ‘Enciende luz roja
low 14 ‘Apaga luz verde
pause 2000 ‘Retardo de 2 segundos
goto inte ‘Salto a etiqueta inte
pit: high 1 ‘Activa el zumbador y pita
pause 400 ‘Retardo de 400 ms
low 1 ‘Desactiva el zumbador
pause 400
high 1
pause 400
low 1
pause 400
high 1
pause 400
low 1
return ‘Retorno de la subrutina

15.6.7. Trabajo personal

Una gran parte del programa de este ejercicio lo ocupaban las instrucciones de la subru-
tina «pit», que hacía generar un pitido interminente de 400 ms de duración durante dos
segundos. Todavía esta subrutina sería mucho más larga si la intermitencia del pitido
fuese cada 250 ms. Se pide rehacer la subrutina de pitido para confeccionarla con el
mínimo número de instrucciones y con una intermitencia de 250 ms.

15.7. PRÁCTICA 3: CONTADOR BINARIO DE 8 BITS CON ALARMA

15.7.1. Objetivos

Implementar un contador binario de 8 bits en base a ocho diodos led conectados a las
ocho líneas de salida de menos peso que soportan los pines P0-P7 del módulo OEM
BS2-IC/MSE. Poner en marcha el contador al pulsar brevemente un pulsador y al cabo
del contaje desde 0 a 255 cada 100 ms activar el zumbador de alarma.
Aprender a manejar las variables OUTL y DIRL. Aplicar la instrucción FOR...NEXT
para repetir un bucle de instrucciones un número conocido de veces.
506 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

15.7.2. Fundamentos teóricos básicos e instrucciones empleadas


Se propone manipular a ocho diodos led colocados en las patitas P0-P7 que con-
forman OUTL para direccionarlas como salidas con la asignación de DIRL =
%11111111. Estos ocho diodos luminiscentes van a visualizar el contaje en tiempo
real de un contador binario de 8 bits que va a ir pasando unidad a unidad desde el va-
lor 0 hasta 255, que es el máximo y en el que los ocho leds quedarán encendidos. La
puesta en marcha del contador desde el valor inicial se produce al apretar durante un
breve período de tiempo un pulsador conectado a la patita P14 del módulo BS2-IC.
Finalmente, al llegar al valor final 255 en binario, se activa un zumbador conectado
a la patita P15.
La instrucción fundamental que gobierna esta experiencia es la que se encarga de
repetir un número predeterminado de veces un bucle de instrucciones. Dicha instrucción
ejecuta un bucle desde un valor mínimo a uno final de la variable que se incrementa una
unidad cada vez que pasa por el bucle. Se trata de la instrucción FOR VARIABLE = MIN
TO VARIABLE = MAX..., que ejecuta instrucciones del bucle e incrementa la variable
con NEXT.
El programa del contador binario con alarma utiliza las siguientes nuevas instruc-
ciones:

— LED VAR OUTL: Asigna el nombre LED a los elementos conectados a las
ocho líneas de menos peso de las líneas de salida OUTL.
— DIRL = %11111111: Configura como salidas las ocho líneas de menos peso
(P0-P7) de la puerta de E/S.
— FOR CONTA = 0 TO 255...NEXT: Realiza una serie de instrucciones que for-
man un bucle un número de veces determinado por la transición de la variable
(CONTA) desde el valor 0 hasta el 255. Cada vez que ejecuta el bucle incrementa
una unidad la variable.
— LED = CONTA: Los ocho leds conectados a las patitas P0-P7 toman el valor
binario de la variable CONTA cada vez que se realiza el bucle y visualizando el
número binario correspondiente.

15.7.3. Esquema electrónico


En la Figura 15.15 se muestra el conexionado de las patitas del módulo OEM BS2-IC/
MSE con los periféricos del diseño y las salidas de la fuente de alimentación del Uni-
versal Trainer.

15.7.4. Materiales necesarios


• Entrenador Universal Trainer.
• Módulo OEM BS2-IC/MSE.
• Cable serie para conexión al PC.
• Cables de conexión.
PBASIC, EL LENGUAJE MÁS FÁCIL DEL MUNDO 507

Figura 15.15. Periféricos del Universal Trainer empleados en la práctica.

15.7.5. Montaje práctico


En la fotografía de la Figura 15.16 se presenta la disposición del módulo microcontrola-
dor sobre la tarjeta protoboard del entrenador y el conexionado con los periféricos y la
fuente de alimentación.

Figura 15.16. Conexionado de las patitas del módulo microcontrolador con los periféricos residentes en
el entrenador Universal Trainer.
508 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

15.7.6. Desarrollo de la práctica y ejecución del programa


La práctica pone en marcha el contador CONTA desde el valor inicial 0 cuando se pulsa
brevemente el pulsador conectado a la patita de entrada 14. Desde ese instante, cada algo
más de 100 milisegundos se ejecuta un bucle que visualiza en ocho diodos led conec-
tados a las patitas P0-P7 (OUTL) el valor binario del contador, incrementa el contaje
y hace un retardo de 100 milisegundos. Cuando alcanza el contaje final de 255, que
corresponde a 8 bits 1 en las patitas P0-P7, activa el sonido de un zumbador conectado a
la patita P15 del módulo microcontrolador. El programa se muestra a continuación.

led var outl ‘Se asigna a P0-P7 como variable LED


conta var byte ‘Se asigna a CONTA como variable byte
dirl = %11111111 ‘Las líneas P0-P7 se configuran salidas
int: if in 14 = 1 then alar ‘Si pulsador P14 = 1 salta a ALAR
goto int ‘Si P14 = 0 se vuelve a chequear INT
alar: for conta = 0 TO 255 ‘Para CONTA de 0 a 255
led = conta ‘Se asigna LED al valor de CONTA
pause 100 ‘Retardo de 100 milisegundos
next ‘Se repite bucle e incrementa CONTA
high 15 ‘Se activa zumbador cuando CONTA=255
end
CUARTA PARTE
«Software» de desarrollo, programas fuente,
apéndices y complementos incluidos
en el CD
CONTENIDO DEL CD

ORGANIZACIÓN
E1 contenido del CD se encuentra dividido en cuatro partes principales, cada una de las
cuales consta de varias carpetas, como se expone a continuación.

Primera. «Software» de desarrollo


Esta sección contiene los programas necesarios para el desarrollo de las aplicaciones y
son propiedad de las empresas y autores que los facilitan libremente en sus páginas de
Internet.

• MPLAB IDE. Entorno de programación para microcontroladores PIC de la em-


presa Microchip.
• Stamp Editor. Entorno de programación para los módulos microcontroladores
BASIC Stamp de la empresa Parallax.
• WinPic800. Programa destinado a la grabación de los microcontroladores PIC de
Francisco Benach.

Segunda. Programas fuente de los ejercicios propuestos


12F508ASM

Esta carpeta contiene los ficheros fuente en lenguaje Ensamblador de las doce aplicacio-
nes prácticas desarrolladas en la primera parte del libro dedicada al PIC12F508.

12F508C
Contiene los programas fuente en lenguaje C de las doce aplicaciones para el
PIC12F508.

511
512 MICROCONTROLADORES «PIC». DISEÑO PRÁCTICO DE APLICACIONES

16F84ASM
Contiene el código fuente en lenguaje Ensamblador de los diez talleres prácticos para el
PIC16F84A.

16F84AC
En esta carpeta se hallan guardados los programas fuente en lenguaje correspondientes
a los diez talleres prácticos con el PIC16F84A.

Tercera. Apéndices
A) Guía rápida del PIC12F508.
B) Guía rápida del PIC16F84A.
C) Proyecto de un pastillero, un vídeo de demostración, así como el códec necesario
para la correcta visualización del mismo.
D) La familia PIC al completo. Presentación de los modelos de microcontroladores
de la familia PIC de Microchip.
E) Contenido del CD.
F) Proyectos con el PIC16F84A y su solución, clasificados según el nivel de difi-
cultad.

Cuarta. Documentación
En esta sección se encuentra una interesante documentación técnica sobre algunos
periféricos utilizados en las experiencias de la obra. En concreto, se hace referencia al
adaptador serie a LCD modelo SYM20AA, al módulo transceptor de radiofrecuencia
TX SAW 433 y al receptor inalámbrico BC NBK.
BIBLIOGRAFÍA Y DIRECCIONES
DE INTERÉS RELACIONADAS
CON LOS PIC

LIBROS
MICROCONTROLADORES PIC. Diseño Práctico de Aplicaciones
Segunda parte: PIC16F87X, segunda edición
ANGULO, J. M.; ROMERO, S., y ANGULO, I.
Editorial McGraw-Hill
dsPIC. Diseño Práctico de Aplicaciones
ANGULO, J. M.; ETXEBARRIA, A.; ANGULO, I., y TRUEBA, I.
Editorial McGraw-Hill
LABORATORIO DE PRÁCTICAS DE MICROELECTRÓNICA, vols. I y II
ANGULO, J. M.
Editorial McGraw-Hill

REVISTAS
Revista Española de Electrónica (Ediciones REDE)
Elektor (Edita Larpress, S. A.)
Servo
Electronics
Circuit Cellar
Electronique Practique
Resistor
PC Hardware
Todo Electrónica

513
514 BIBLIOGRAFÍA

EMPRESAS
MICROCHIP TECHNOLOGY, INC.
2355 West Chandler Blv., Chandler, AZ 85224-6199, EE. UU.
Teléfono 602 786 7200
PARALLAX, INC.
599 Menlo Drive #100, Rockun, CA 95678, EE. UU.
Téfono 916/624 8333
INGENIERÍA DE MICROSISTEMAS PROGRAMADOS, S. L.
Alda Mazarredo, 47, 1.o, 48009 Bilbao (Spain)
Teléfono/Fax 94-4230651

INTERNET
MICROCHIP (http://www.microchip.com)
INGENIERÍA DE MICROSISTEMAS PROGRAMADOS, S. L.
(http://www.microcontroladores.com)
PARALLAX, INC. (http://www.parallaxinc.com y www.parallax.com)
ITU TECHNOLOGIES (http://www.itutech.com)
SAGITRON (http://www.sagitron.es)
UNIVERSIDAD DE DEUSTO (http://www.deusto.es)
ÍNDICE ANALÍTICO

(GP3/RB3)/MCLR#Vpp, 76-78 Arquitectura, 306


.ERR, 107 ASCII, 105
.LIST, 107 ASK, 279
12F508ASM, 511 ASM, 105, 110
12F508C, 511 Aurel, 279, 287
\12F508\Ejem_5A.ASM, 207
\12F508ASM\Ejem_4A.ASM, 191 B
\12F508C\Ejem_2B.C, 169
12F508ASM/Ejem_2A.ASM, 166 Bajo consumo, 65
16F84ASM, 512 Banco
16F84AC, 512 0, 315
1-Wire, 219, 245 01, 57
4.333 MHz, 279 1, 315
433 MHz, 287 pruebas, 276
68HC05, 305 Bancos, 57, 313
Barrido de teclado, 132
A BAS, 105
BASIC Stamp, 469
Acceso, 384 BASIC, 485
ACK, 233, 235 BCF f, b, 88, 359, 365
Activación, 338 BC-NBK, 287,512
Active Toolsuite, 389 Bomba de carga, 198
ADDLW k, 362, 365 BOR, 80
ADDWF f, d, 87, 359, 365 BRANCH, 492
Aleatorio, 439 BRINCO, 361
Alta impedancia, 163, 171 Brown Out, 80, 346
ALU, 306 Browse, 112
Amplitud, 279 BS1-IC, 471
ANDLW k, 88, 362, 365 BS2e-IC, 472,
ANDWF f, d, 88, 359 BS2-IC, 471
Angulo, I., 513 BS2p24-IC, 473
Angulo, J. M., 513 BS2p40-IC, 473
Anidamiento, 239 BS2sx-IC, 472
Animate, 117, 395 BSF f, b, 89, 359, 365

515
516 ÍNDICE ANALÍTICO

BTFSC f, b, 89, 361, 365 máquina, 106


BTFSC, 399 op, 352
BTFSS f, b, 90, 361, 365 Comandos, 233
BTFSS, 399 Comentarios, 489
Bucle COMF f, d, 92, 359, 365
B, 184 Compilador de C, 119, 402
C, 184 Compiladores, 107, 487
Buffer, 142, 283, 309 Condensador, 270
Build Conexionado, 408
All, 116 Configure/Configuration, Bits, 117
FAILED, 116 Conmutación de fase, 279
SUCCEEDED, 116 Constante
Bus, 245 de carga, 259
CAN, 136 de tiempo, 70, 259
I2C, 478 Constantes, 488
BUTTON, 491 Consumo, 482
Byte Contador, 413
CRC, 282 binario, 505
de datos, 282 de Programa, 49, 61, 309
ID, 282 de sucesos, 320
Control de flujo,355
C Controlador
de LCD, 231
C, 56, 105, 316 incustrado, 3
C: Carry, 47 Corriente, 328
Calibración, 65 COUNT, 491
CALL, 50, 309, 335 CP#, 77
k, 90, 364, 365, 366 CP, 330
SUBR, 62 Crystal de cuarzo, 63
Cambio de estado, 338, 342
Camino de Datos, 10, 12 D
Campos, 83, 352
CAN, 136, 245 D:\12F508ASM\Ejem_0.ASM, 114
Caracteres, 242 Dado electrónico,378
Ciclo de reloj, 61 Dallas Semiconductor, 473
CCS, 119, 370, 402 DATA, 494
CD, 17, 110, 158, 173, 511, 512 DC, 56, 316
CEBEK, 374 DC: Digit Carry, 47
Célula DEBUG, 494
LDR, 271 xxx, 499
RC, 259 DEBUGM, 479
Ciclo de instrucción, 61, 82 DECF f, d, 93, 359, 365
Clave, 387 DECFSZ f, d, 93, 361, 365
CLKIN, 44 Depurador en circuito, 107
CLRF f, 91, 359, 365 Desborda, 69
CLRW, 91, 359, 365 Desbordamiento, 65, 208, 335
Códec, 512 Despertar, 76, 405
Codificación Despierta, 71
Manchester, 281 Diagrama de conexiones, 42
NRZ, 281 Direccionamiento
NRZI, 281 directo, 52, 314
NRZL, 281 indirecto, 52, 314
Código directiva List p=12F508, 151
fuente, 398, 407 DIRL, 506
ÍNDICE ANALÍTICO 517

DIRS, 491 Ejem_7B.C, 235


Divisor de frecuencia, 321 Ejem_8_2A.ASM, 255
Doblador de tensión, 198 Ejem_8_2B.C, 255
Documentación, 512 Ejem_8_3A.ASM, 256
Dormido, 210 Ejem_8_3B.C, 256
DSC, 34 Ejem_8_4.ASM, 257
DSP, 23 Ejem_8_4.C, 257
dsPIC30F, 35 Ejem_8A.ASM, 251
dsPIC33F, 35 Ejem_8B.C, 251
DTMFOUT, 493 Ejem_9.ASM, 262
DTR, 78, 79 Ejem_9.C, 262
DYM20AA, 256 Ejem_9A.ASM, 275
Ejem_9B.C, 275
E EJEM2_2.HEX, 176
EJEM2_2B.C, 177
Editor, 488 EJEMP_0.ASM, 114
de textos, 370 EJEMPLO_0.ASM, 113
EEADR, 331 EJEMPLO_01, 118
EECON1, 331 Emisor, 279
EECON2, 332, 333, 342 Emulador en circuito, 369, 373
EEDATA, 331 Emuladores, 107
EEIE, 338 END, 494
EEIF, 332, 334, 342 Ensamblador, 105
EEPROM 24LC16B, 476 o compilador, 370
EEPROM, 15, 312, 330, 331, 447, 477 Ensambladores, 107
Efecto rebote, 413 Ensamblar, 393
Ejem_0.ASM, 393, 394 Entradas
Ejem_10_1A.ASM, 290 analógicas, 127
Ejem_10_2A.ASM, 288 digitales, 128
Ejem_1B.C, 159 Entrenador, 124
Ejem_2_2A.ASM, 173 EPROM, 14
Ejem_2_6B.C, 226 Errores, 107
Ejem_3A.HEX, 186 Esclavo, 248
Ejem_4_3A.ASM, 199 Escritura/borrado, 293
Ejem_4_3B.C, 201 Esquema, 302
Ejem_4-2.ASM, 196 ESR, 313
Ejem_4A.ASM, 193 Estabilidad, 330
Ejem_4A.HEX, 193 ESTADO, 313, 347
Ejem_4B.C, 194 Etxebarria, A., 513
Ejem_5_2B.C, 214 EXTRC, 63, 77
Ejem_5_3A.ASM, 214
Ejem_5A.ASM, 207 F
Ejem_6_2A.ASM, 226
Ejem_6_3A.ASM, 227 Familia PIC, 512
Ejem_6_3B.C, 227 Firmware, 348
Ejem_6_5A.ASM, 228 Flag, 337
Ejem_6_5B.C, 228 FLASH, 15, 33, 45, 57, 158
Ejem_6A.ASM, 222, 224 Flip-flop, 343
Ejem_6B.C, 222, 224 FOR…NEXT, 492, 506
Ejem_7_2A.ASM, 240 Formato, 83, 352
Ejem_7_2B.C, 241 Foro, 140
Ejem_7_3A.ASM, 243 FOSC<1:0>, 77
Ejem_7_3B.C, 243 FOSC1-FOSC0, 330
Ejem_7A.ASM, 235, 236 FR, 279
518 ÍNDICE ANALÍTICO

Frecuencias, 279 I
FREQOUT, 493
FSK, 279 I2C, 219, 245
FSR, 52, 55, 57, 314 I2CIN, 493
Fuente de alimentación, 125 I2CLOW.INC, 249
Full Duplex, 220 I2COUT, 493
ICD-2, 108
G ICD2, 27, 139
ICE 400, 108
G:\16f84A\EJEMPLO_0, 392 ICEPIC-Jnr, 375
Gama IcProg, 140
básica, 28, 39, 81 ICSP, 139
media, 31, 305, 365 ICSPDAT, 44
mejorada, 33 ICSPTM, 77
Generador ID, 77, 143, 331
de onda cuadrada, 202 Identificación, 77
de pulsos, 202 IF…THEN, 492, 503
lógico, 129, 195 ILUMINA, 501
GIE, 337, 338 IN0, 503
Global, 338 INCF f, d. 94, 359, 365
GOSUB, 492, 503 INCFSZ f, d, 94, 361, 365
GOTO k, 93, 364, 366 Include P12F508.INC, 152
GOTO, 51, 84, 309, 486, 492 INDE, 313
GP0, 67 INDF, 54, 314
GP0/ICSPDAT, 78 Ingeniería de Microsistemas Programados,
GP0-GP5, 149 109, 119, 121, 147, 301, 373, 470, 494,
GP1, 44 514
GP1, 67 Inicio, 247
GP1/ICSPCLK, 78 Inmediato, 362
GP2/T0CKI. 67 INPUT, 491
GP3, 67 INS, 490
GP5-GP0, 57 Instrucciones, 365, 491
GPIO, 47, 57, 66, 67, 149 INTCON, 313, 328, 337
GPO, 44 INTDEG, 340
GPPU#, 71 INTE, 338, 340
GPR, 47, 52, 53, 312 INTEDG, 323
GPWUF, 55 Inter Integrated Circuit, 245
Grabación, 348 Intermitente, 181
Grabador, 371 Intérpretes, 487
Grabadores, 14 Interrupción, 336
Interrupciones, 335
H INTF, 340
INTRC, 63
Half Duplex, 220 INTRC, 77
Halt, 116 IORLW k, 95, 362, 365
Hardware, 17 IORWF f, d, 95, 359, 365
Harvard, 13, 24, 25, 305 IPCSPCLK, 44
HEX, 107 IRP, 314, 316
HIGH pin, 499
HIGH, 491 J
http://perso.wanadoo.es/siscobf/winpic800.
htm, 140 J. Kemeny, 485
HyperTerminal, 222, 425 Jumper
JP2, 126
ÍNDICE ANALÍTICO 519

JP4, 158 Microcontrolador, 3


JP8, 134 Microcontroladores de 16 bits, 34
Microprocesador, 10
Migrabilidad, 27
L Modo
contador de eventos, 70
L293D, 134 de bajo consumo, 71, 75
Lance Walley, 470 de reposo, 347
latch, 68, 150 PC, 123, 140
LC, 231 RUN, 123
LCD, 137, 256, 381, 433, 447 temporizador, 70
LCDXXX.INC, 433 Modulación, 279
LDR, 259 Módulo
Lectura/grabación, 139 OEM B52-IC/MSE, 503
LED VAR OUTL, 506 PIC12FXXX, 147
LED = CONTA, 506 Módulos de E/S, 11
Lenguaje Motorola, 19
BASIC, 486, 511 MOVWF f, 96, 365
C, 119, 241, 486, 511 MOVF f, d, 95, 359, 365
Ensamblador, 486, 511, 512 MOVLW f, 359, 362
Líneas de E/S, 66, 481 MOVLW K, 96, 365
List, 115 MOVLW XX, 50
Literals, 81 MOVWF GPIO, 68
Llamada a subrutina, 52 MOVWF OSCCAL, 65
LOOKDOWN, 492 MOVWL XX, 65
LOOKUP, 492 mpasmwin.exe, 112
LOW pin, 499 MPLAB
LOW, 491 IDE, 17, 105, 110, 389, 511
LP, 63 SIM, 116, 394
LUZ Y SONIDO, 501 mplink.exe, 112
Luz, 271 MPSIM, 371
MS-DOS, 488
M nanoWatt, 28

Macros, 240 N
Maestro, 248
MANCHESTER.INC, 283 NAP, 494
Matriz, 242 NCALL Destino, 240
MAX-232, 135 NMOS, 327
McGraw-Hill, 494, 498, 513 Nomenclatura, 82, 356
MCLR#, 44, 76, 294, 299, 343, 346, 347 NOP, 96, 359, 365
MCLR#/Vpp, 78 NTC, 259, 272
MCLRE, 77
MCU, 34 O
Memoria, 11
de configuración, 142 OEM
de datos, 15, 52, 57, 311 BS2-IC, 471, 474, 476, 479, 496
de programa, 13, 49, 57, 308 BS2-IC/MSE, 494
Mensaje, 239 One Wire 473
Micro PIC OPCODE, 83
Programmer, 371 Operandos, 352
Trainer, 22, 303, 372, 374 OPTION, 47, 70, 97, 190, 313, 320, 322,
Microchip MPASM Toolsuite, 112, 389 340
Microchip, 6,17, 19, 371, 512, 514 Org 0x00, 115
520 ÍNDICE ANALÍTICO

Organigrama, 154, 191, 368, 390, 398, 406, 426 PIC12F509, 41, 44
OSC1, 44 PIC12F510, 41
OSC1/CLKIN, 294 PIC14000, 32
OSC2, 44 PIC16C, 32
OSC2/CLKOUT, 294 PIC16C54, 378
OSCCAL, 50, 56, 65 PIC16C56, 471
Oscilador, 126 PIC16C57, 471, 475
externo, 64 PIC16C5X, 31, 40
externo RC, 64 PIC16CR57, 476
HS, 330 PIC16F, 32
interno, 64, 65 PIC16F505, 44, 59
LP, 330 PIC16F5X, 31
RC, 330 PIC16F5XX, 40
tipo HS 298 PIC16F83, 10
tipo LP, 298 PIC16F84A, 293, 300, 307, 389, 512
tipo RC, 297 PIC16F87X, 513
tipo XT, 298 PIC16HV540, 40
XT, 330 PIC16X8X, 295
Osciloscopio, 200 PIC18-ME, 303, 384
OTP, 14 PIC24F, 35
OUTPUT, 491 PIC24H, 35
OUTS, 491 Pil, 47
Pila, 50
P PITA, 501
Píxeles, 242
PA0, 55 PLOMO, 28
Página, 55 PMOS, 327
Palabra de Configuración, 67, 76, 152, 324, POR, 80, 343
330, 331 PORTB, 58, 67
Parallax, 370, 469, 470, 473, 514 PORTC, 58
Pastillero, 38, 512 Postdivisor, 321
inteligente, 38 Potenciómetro, 271
PAUSE, 493 Power Down, 316
valor, 499 Power-up, 330
PBASIC, 105, 470, 491 Practica1.ASM, 156
PC, 50, 51, 308, 309, 480 Practica1.HEX, 156
PCF854A, 249 Practica2.ASM, 168
PCF8574A, 245, 246, 251 Practica2.HEX, 169
PCL, 55 Preámbulo, 282
PCLATH, 310, 313 Predivisión, 321
PD#, 56, 316, 345 Predivisor de frecuencia, 69
Pentium, 11 Procesador, 12
Periféricos, 408, 429 Programa 0.ASM, 113
Permiso de interrupción, 338 Programa
Perro Guardián, 47, 65, 71, 72, 152, 205, 316, ejecutable, 107
320, 321, 324, 343, 345, 405 fuente, 106
Philips, 245 Project Wizard, 111
PIC Burner, 109 Protección del código, 77
PIC School, 110, 121, 122, 157, 201, 238, Prototipos, 301
275, 289, 400, 444 Proyecto, 105, 110, 389
PIC, 21, 23, 110 PROYECTO_0.mcp, 114
PIC10F, 29 PROYECTO3.HEX, 186
PIC12F, 29, 30, 32 PROYECTO3.MCW. 186
PIC12F508, 37, 41, 46, 50, 149, 511, 512 PS0, 69, 323
ÍNDICE ANALÍTICO 521

PS1, 69, 323 de Estado, 55, 66, 315, 345


PS2, 69, 323 de trabajo W, 81
PS2:0, 190 W, 306
PSA, 71, 72, 323 Regulador, 480
PSK, 279 Reloj
PTC, 259 digital, 377
Puerta externo, 69
A, 300, 326 interno, 69
B, 300, 326 Reposo, 210
Puertas de E/S, 326 Reset, 47. 65, 66, 80, 117, 299, 313t, 343
Pull-up, 71, 132 Resonador, 63
PULSIN, 491 RETFIE, 337, 364, 366
PULSOUT, 491 RETLW, 97, 239, 364, 366
PWM, 493 RETURN, 364, 366, 492, 503
PWRT, 343, 345 REVERSE, 491
PWRTE, 330 RF, 286
RISC, 24, 25, 305
Q RJ11, 138
RLF f, d, 98, 359, 365
Q1, 61, 295 ROM, 14
Q2-Q3, 295 ROMERO, S., 513
Q2, 61 RP0, 313
Q3, 61 RP0, 314
Q4, 295 RP1, 314
Q4, 61 RP1-RP0, 316
RRF f, d, 98, 359, 365
R RS-232, 135, 425
RS232, 219
RA0 – RA4, 294 RS232LOW.INC, 235, 425, 436
RA0-RA4, 326 RS485, 219, 245
RABDINM 492 RSI, 335, 337
RAM, 15, 312 Run, 116, 395
RB<4:0>, 76 Rutinas, 250
RB0/INT, 326, 340 RxD, 220
RB0-RB7, 295,326
RB3-RB0, 419 S
RB4-RB7, 132
RB6, 329, 348 Salidas digitales, 132
RB7, 329, 348 Salto condicional, 355, 361
RB7:RB4, 328, 338, 342, 419 Scenix SX28AC, 472
RBIE, 338 SCL, 478
RBIF, 329 SCL, 246
RBO/INT, 338 SDA, 246
RBPU#, 323, 328 SDA, 478
RC, 63 Segmentación, 44
RCTIME, 493 Semáforo, 380, 502
RD, 332 Señalizador, 337
READ, 494 Serie, 348, 480
Receptor, 287 USB, 158
Reconocimiento, 247 SERIN, 493
Refresca, 210, 324 SEROUT, 493
Registro SFR, 47, 52, 53, 312
de calibración, 50, 56 SHIFTIN, 492
de datos, 81 SHIFTOUT, 492
522 ÍNDICE ANALÍTICO

Símbolos, 82, 356, 489 TALLER8.HEX, 443


Simulador software, 108, 370 TALLER9.HEX, 454
Simulador, 117 Talleres, 512
Sincronismo de carácter, 281 Tarjeta, 301
Sintaxis, 358 de prototipos, 372, 376
Sisco Benach, 140 protoboard, 504, 507
Sistema de desarrollo, 372 TD232, 256
SKIP, 361 Teclado, 130, 419
SLEEP, 55, 75, 99, 347, 364, 366, 405, 494 matricial, 275
Sobrepasamiento, 338 INC, 419
Software, 17 Temporización, 182, 413
SPI, 245 Temporizador, 69, 320
SR, 47 TMR0, 189
SRAM, 312 Tercer estado, 163
Stack, 239 Tiempo
Stamp BASIC, 479 de carga, 270
Stamp Editor, 511 real, 373
STAMP2.EXE, 488 Time Out, 316
STAMPW.EXE, 488 Tipo
Standby, 75, 206, 210 de oscilador, 77
Star, 260 LP, 77
START, 220 XT, 77
STATUS, 55 TMR0, 55, 69, 320, 322, 338, 341
Step Into, 117, 395 TO#, 72, 316, 325, 345
Step Out, 117, 395 TOGGLE, 491
Step Over, 117 Transmisor, 279
STOP, 220 TRIS GPIO, 100
Stop, 247, 260 TRIS, 47, 67, 149
Su Turno, 457 TRISA, 326
SUBLW k, 362, 365 TRISB, 326
Subrutina, 240 TRUEBA, I., 513
SUBWF f, d, 99, 359, 365 TxD, 220
SWAPF, f, d, 359, 365 TX SAW, 433, 512
SYM20AA, 231, 232, 241, 262, 512 TX-SAW/433 s-z, 279

T U

T. Kurtz, 485 UCP, 10


T0CKI, 44, 320, 322, 347 Ultravioleta, 14
T0CS, 71, 190, 320, 322, 323 Unidad
T0IE, 338 Central de Proceso (UCP), 10
T0IF, 322, 338, 341 de Control, 10, 12
T0SE, 70, 71, 320, 322, 323 Universal Trainer, 494, 500, 507
Taller, 397 Universidad de Deusto, 514
TALLER_2.C, 402 USB, 138, 219, 245
TALLER_3.C, 409
TALLER_5.ASM, 422 V
TALLER_5.HEX, 423
TALLER_6.ASM, 428 VAR bit, 503
TALLER_7.ASM, 436 Variable, 489
TALLER10.HEX, 464 VDD, 294
TALLER2.HEX, 401 VDD, 80
TALLER3.HEX, 409 Vector
TALLER6.HEX, 429 de Interrupción, 335
ÍNDICE ANALÍTICO 523

de Reset, 50 www.parallax.com, 470, 514


Vídeo, 512 www.microchip.com, 514
View, 117 www.sagitron.com, 514
Von Neumann, 13 www.deusto.es, 514

W X

Wake-up, 405 XORLW K, 100


WDT, 55, 71, 72, 76, 77, 79, 206, 321, 330 XORLW k, 362, 365
WDTE, 72, 77, 324, 330 XORWF f, d, 101, 359, 365
WDTm 205 XOUT, 492
Windows, 110, 425, 488 XT, 63
WinPic800, 140,141, 143, 158, 209, 401,
409, 436, 511 Z
WR, 332
WREN, 332 Z, 47, 56, 316
WRERR, 332 Zener, 80
WRITE, 494 Zero, 47
www.ic-prog.com, 140 ZIP, 140
www.microcontroladores.com, 121, 470, Zócalos, 301
494, 514

También podría gustarte